{"version":3,"file":"../../Scripts/combined.js","sources":["Scripts/combined.js"],"sourcesContent":["// http://stackoverflow.com/a/22564291/292787\r\nif (!window.location.origin) {\r\n window.location.origin = window.location.protocol + \"//\" + window.location.hostname + (window.location.port ? ':' + window.location.port : '');\r\n}\r\n\r\n//the work around from https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill\r\nif (!String.prototype.startsWith) {\r\n String.prototype.startsWith = function (searchString, position) {\r\n position = position || 0;\r\n return this.substr(position, searchString.length) === searchString;\r\n };\r\n}\r\n\r\nif (!String.prototype.endsWith) {\r\n String.prototype.endsWith = function (searchString, length) {\r\n length = length || this.length;\r\n return this.substr(length - searchString.length, searchString.length) === searchString;\r\n };\r\n}\r\n\r\n//the work around from https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex#Polyfill\r\nif (!Array.prototype.findIndex) {\r\n Array.prototype.findIndex = function (predicate) {\r\n if (this == null) {\r\n throw new TypeError('Array.prototype.findIndex called on null or undefined');\r\n }\r\n if (typeof predicate !== 'function') {\r\n throw new TypeError('predicate must be a function');\r\n }\r\n var list = Object(this);\r\n var length = list.length >>> 0;\r\n var thisArg = arguments[1];\r\n var value;\r\n\r\n for (var i = 0; i < length; i++) {\r\n value = list[i];\r\n if (predicate.call(thisArg, value, i, list)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\n\r\n//the work around from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\r\nif (typeof Object.assign !== 'function') {\r\n // Must be writable: true, enumerable: false, configurable: true\r\n Object.defineProperty(Object, \"assign\", {\r\n value: function assign(target, varArgs) { // .length of function is 2\r\n 'use strict';\r\n if (target === null || target === undefined) {\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n \r\n var to = Object(target);\r\n \r\n for (var index = 1; index < arguments.length; index++) {\r\n var nextSource = arguments[index];\r\n \r\n if (nextSource !== null && nextSource !== undefined) { \r\n for (var nextKey in nextSource) {\r\n // Avoid bugs when hasOwnProperty is shadowed\r\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\r\n to[nextKey] = nextSource[nextKey];\r\n }\r\n }\r\n }\r\n }\r\n return to;\r\n },\r\n writable: true,\r\n configurable: true\r\n });\r\n}\r\n\r\nDate.prototype.addHours = function (h) {\r\n this.setTime(this.getTime() + (h * 60 * 60 * 1000));\r\n return this;\r\n}\r\n\r\n/**\r\n * Windows Phone 8.1 fakes user agent string to look like Android and iPhone.\r\n *\r\n * @type boolean\r\n */\r\nvar deviceIsWindowsPhone = navigator.userAgent.indexOf(\"Windows Phone\") >= 0;\r\n\r\n// work around for the android virtual keyboard\r\nfunction isAndroid() {\r\n return navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;\r\n}\r\n\r\nfunction iOS() {\r\n return /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;\r\n}\r\n\r\nfunction isMobileOrRipple() {\r\n return window.cordova || (window.parent && window.parent.ripple);\r\n}\r\n\r\nfunction getIosVersion(){\r\n /**\r\n * returns iOS version as array. for example, for iOS 6.1.6 returns [\"6\", \"1\", \"6\"]\r\n */\r\n return ((\r\n //\"Mozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B500 Safari/8536.25\"\r\n navigator.userAgent\r\n .match(/OS ((\\d+_?){2,3})\\s/)||[''])[0]\r\n .match(/((\\d+_?){2,3})\\s/)||[''])[0]\r\n .split('_');\r\n}\r\n\r\nfunction getIosVersionFloat() {\r\n /**\r\n * returns iOS version as float. for example, for iOS 6.1.6 returns 6.1\r\n */\r\n var iOsVersion = getIosVersion();\r\n return iOsVersion.length > 1 ? parseFloat(iOsVersion[0] + '.' + iOsVersion[1]) : -1;\r\n}\r\n\r\nfunction isLandscape() {\r\n if (window.orientation == undefined)\r\n return false;\r\n return window.orientation == 90 || window.orientation == -90;\r\n}\r\n\r\nfunction isPortrait() {\r\n if (window.orientation == undefined)\r\n return true;\r\n return window.orientation == 0 || window.orientation == 180;\r\n}\r\n\r\n// work around, details: http://getbootstrap.com/getting-started/#support-ie10-width\r\n// Copyright 2014-2015 Twitter, Inc.\r\n// Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\r\nfunction getAndroidVersion(ua) {\r\n ua = (ua || navigator.userAgent).toLowerCase();\r\n var match = ua.match(/android\\s([0-9\\.]*)/);\r\n return match ? match[1] : false;\r\n};\r\n\r\nfunction loadCss(url) {\r\n var link = document.createElement('link');\r\n link.setAttribute('rel', 'stylesheet');\r\n link.setAttribute('type', 'text/css');\r\n link.setAttribute('href', url);\r\n document.getElementsByTagName('head')[0].appendChild(link);\r\n}\r\n\r\n// http://stackoverflow.com/a/17907562/292787\r\nfunction getInternetExplorerVersion() {\r\n var rv = -1;\r\n if (navigator.appName == 'Microsoft Internet Explorer') {\r\n var ua = navigator.userAgent;\r\n var re = new RegExp(\"MSIE ([0-9]{1,}[\\.0-9]{0,})\");\r\n if (re.exec(ua) != null)\r\n rv = parseFloat(RegExp.$1);\r\n }\r\n else if (navigator.appName == 'Netscape') {\r\n var ua = navigator.userAgent;\r\n var re = new RegExp(\"Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})\");\r\n if (re.exec(ua) != null)\r\n rv = parseFloat(RegExp.$1);\r\n }\r\n return rv;\r\n}\r\n\r\nvar isIE = getInternetExplorerVersion() > 0;\r\n\r\n// this function is necessary to avoid /../ in url\r\n// the problem with /../ in url is that it can accumulate during navigation in cordova\r\n// and produce urls like 'x-wmapp0:www/Pages/SignUp/../SignUp/../SignUp/../SignUp/../SignUp/../Welcome.html'\r\n// after 10 transitions between SignUp and Welcome it stops to work completely and page can't be displayed\r\nfunction getAbsoluteUrl(base, relative) {\r\n // remove everything after #\r\n var hashPosition = base.indexOf('#');\r\n if (hashPosition > 0) {\r\n base = base.slice(0, hashPosition);\r\n }\r\n\r\n // the rest of the function is taken from http://stackoverflow.com/a/14780463\r\n // http://stackoverflow.com/a/25833886 - this doesn't work in cordova\r\n // http://stackoverflow.com/a/14781678 - this doesn't work in cordova\r\n var stack = base.split(\"/\"),\r\n parts = relative.split(\"/\");\r\n stack.pop(); // remove current file name (or empty string)\r\n // (omit if \"base\" is the current folder without trailing slash)\r\n for (var i = 0; i < parts.length; i++) {\r\n if (parts[i] == \".\")\r\n continue;\r\n if (parts[i] == \"..\")\r\n stack.pop();\r\n else\r\n stack.push(parts[i]);\r\n }\r\n return stack.join(\"/\");\r\n}\r\n\r\nfunction isNumberFormatCorrect(numberStr) {\r\n // '^\\.$' - '.'\r\n // '^(?=.+)(?:\\d*)?(?:\\.)?$' - '12.';\r\n // '^(?=.+)(?:\\d*)?(?:\\.\\d+)?$' - '1' or '1.1' or '.3'\r\n var reg = /^\\.$|^(?=.+)(?:\\d*)?(?:\\.)?$|^(?=.+)(?:\\d*)?(?:\\.\\d+)?$/;\r\n return reg.test(numberStr);\r\n}\r\n\r\nfunction getPositiveAmountString(value){\r\n var amount = parseFloat(value);\r\n if(amount < 0) {\r\n amount = Math.abs(amount);\r\n }\r\n return amount.toFixed(2);\r\n}\r\n\r\nfunction documentWrite(data) {\r\n if (deviceIsWindowsPhone) {\r\n MSApp.execUnsafeLocalFunction(function () {\r\n document.writeln(data);\r\n });\r\n } else {\r\n document.write(data);\r\n }\r\n}\r\n\r\nvar utilli = utilli || {};\r\n\r\nutilli.getMaskedPhoneNumberValue = function (rawValue) {\r\n if (rawValue.length == 10) {\r\n // this fix is needed because there is a bug in input.mask function. see WGLCX-639.\r\n // the bug is that if rawValue length is 10 and the first character is '1' then it results in empty input.val()\r\n var countyCode = utilli.getCountryPhoneNumberCode();\r\n rawValue = countyCode + rawValue;\r\n }\r\n var input = $('').val(rawValue);\r\n input.mask(Config.phoneNumberMask);\r\n var maskedPhoneNumber = input.val();\r\n return maskedPhoneNumber;\r\n};\r\n\r\nutilli.roles = {\r\n Administrator: 'Administrator',\r\n Agent: 'Agent',\r\n Assistant: 'Assistant',\r\n PropertyManager: 'PropertyManager',\r\n CSR: 'CSR',\r\n CSRAdmin: 'CSR-Admin',\r\n FieldServiceEngineer: 'FieldServiceEngineer',\r\n SystemUser: 'SystemUser',\r\n DataExporter: 'DataExporter',\r\n AdminManager: 'AdminManager',\r\n CashReceipt: 'CashReceipt'\r\n}\r\n\r\nutilli.paymentStatuses = {\r\n Successful: 0,\r\n FailedInPaymentGateway: 1,\r\n FailedInBackend: 2,\r\n Submitted: 3,\r\n FailedInBackendAndSubmittedToAch: 4,\r\n CanceledByAdmin: 5,\r\n Refunded: 6,\r\n Voided: 7,\r\n FailedByTimeout: 8,\r\n VoidFailedInBackend: 9,\r\n RefundFailedInBackend: 10,\r\n ChargebackSucceeded: 11,\r\n ChargebackFailed: 12,\r\n Created: 13,\r\n Failed: 14,\r\n NeededToVoid: 15\r\n}\r\n\r\nutilli.paymentMethods = {\r\n Card: 1,\r\n Check: 2,\r\n Btc: 3,\r\n Apple: 4,\r\n Google: 5\r\n}\r\n\r\nutilli.scrollTop = function() {\r\n $('.mainPageScroll').scrollTop(0);\r\n};\r\n\r\nutilli.scrollToFirstError = function() {\r\n var topElementOffset = Math.abs($('.restrict-width ').offset().top);\r\n var targetElementOffset = Math.abs($('.has-error:not(.ng-hide)').offset().top);\r\n var offset = topElementOffset - targetElementOffset;\r\n $('.mainPageScroll').scrollTop(offset);\r\n};\r\n\r\n/* scrolls current page to the bottom\r\n * @param delay - sometimes it's required to postpone scroll till content gets updated (rendered)\r\n */\r\nutilli.scrollBottom = function (delay) {\r\n setTimeout(function() {\r\n $('.mainPageScroll').each(function (index, item) {\r\n //http://stackoverflow.com/a/270628\r\n $(item).scrollTop(item.scrollHeight);\r\n });\r\n }, delay);\r\n};\r\n\r\nutilli.clearLocalStorage = function () {\r\n //localStorage.removeItem('ApiUrl'); - do not remove! I need this for touch id\r\n //localStorage.removeItem('ServiceProviderName'); - do not remove! I need this for touch id\r\n //localStorage.removeItem('CurrentAccountNumber'); - do not remove! I need this for touch id\r\n localStorage.removeItem('BusinessPartner');\r\n //localStorage.removeItem('current_user'); - do not remove! I need this for touch id\r\n localStorage.removeItem('SecurityToken');\r\n localStorage.removeItem('email');\r\n localStorage.removeItem('CurrentUtilityType');\r\n localStorage.removeItem('currentAggregation');\r\n localStorage.removeItem('PropertyManager');\r\n localStorage.removeItem('PropertyManagerTour');\r\n localStorage.removeItem('PropertyManagerFirstTour');\r\n};\r\n\r\nutilli.aggregationTypes = {\r\n property: 'property',\r\n group: 'group'\r\n}\r\n\r\nutilli.addUserName = function (state, params) {\r\n params = params || {};\r\n params.userName = utilli.isAdmin ? state.params.userId :\r\n (params.userName ? params.userName : '');\r\n return params;\r\n};\r\n\r\n//return property or group object (depend on \"Group View\" or \"Property View\" was clicked)\r\nutilli.getCurrentAggregation = function() { \r\n var json = localStorage.getItem('currentAggregation');\r\n if (!json) \r\n return null;\r\n return JSON.parse(json);\r\n}\r\n\r\nutilli.clearCurrentAggregation = function () { \r\n localStorage.removeItem('currentAggregation')\r\n}\r\n\r\nutilli.getCurrentGroupId = function () {\r\n var aggregation = utilli.getCurrentAggregation();\r\n if (aggregation && aggregation.Type === 'group')\r\n return aggregation.Id;\r\n return null;\r\n}\r\n\r\nutilli.getCurrentPropertyId = function () {\r\n var aggregation = utilli.getCurrentAggregation();\r\n if (aggregation && aggregation.Type === 'property')\r\n return aggregation.Id;\r\n return null;\r\n}\r\n\r\nutilli.handleAjaxResponse = function (response, ModalServiceExt, successCallbackFn) {\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n if (successCallbackFn)\r\n successCallbackFn();\r\n }\r\n};\r\n\r\nutilli.downloadFile = function (apiUrl, fileName) {\r\n var link = document.createElement(\"a\");\r\n link.href = apiUrl;\r\n link.style.visibility = false;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n}\r\n\r\n//todo: remove, use utilli.validatePassword instead of this\r\nutilli.isPasswordValid = function (userName, passwd, passwdConf, passwdMinLength) {\r\n if (!passwdMinLength)\r\n passwdMinLength = Config.passwdMinLength;\r\n var result = passwd\r\n && passwd.length >= passwdMinLength\r\n && utilli.hasDigits(passwd)\r\n && utilli.hasLetters(passwd)\r\n && passwd != userName;\r\n return result;\r\n};\r\n\r\nutilli.validatePassword = function (password, userName, passRequirements, paswdMinLength, oldPassword, minUserIdLength) {\r\n if(!minUserIdLength)\r\n minUserIdLength = 1;\r\n var requirement = findRequirementByName(passRequirements, 'PasswordLength');\r\n var passwordErrors = [];\r\n if (requirement && (!password || password.length < paswdMinLength))\r\n passwordErrors.push(requirement.ErrorText);\r\n if ((requirement = findRequirementByName(passRequirements, 'DigitsNumber')) && !utilli.hasDigits(password))\r\n passwordErrors.push(requirement.ErrorText);\r\n if ((requirement = findRequirementByName(passRequirements, 'NotCurrentPassword')) && oldPassword == password)\r\n passwordErrors.push(requirement.ErrorText);\r\n if ((requirement = findRequirementByName(passRequirements, 'Letters'))\r\n && (!utilli.hasLowerCaseLetters(password) || !utilli.hasUpperCaseLetters(password)))\r\n passwordErrors.push(requirement.ErrorText);\r\n if ((requirement = findRequirementByName(passRequirements, 'SpecialSymbols')) && !utilli.hasSpecialSymbols(password))\r\n passwordErrors.push(requirement.ErrorText);\r\n if ((requirement = findRequirementByName(passRequirements, 'NotUserID')) && userName === password)\r\n passwordErrors.push(requirement.ErrorText);\r\n if (password !== userName && (requirement = findRequirementByName(passRequirements, 'NotContainUserID')) \r\n && password && userName && minUserIdLength <= userName.length && password.indexOf(userName) !== -1) {\r\n passwordErrors.push(requirement.ErrorText);\r\n }\r\n return passwordErrors;\r\n}\r\n\r\nfunction findRequirementByName(list, key) {\r\n return _.find(list, function (item) { return item.Key === key; });\r\n}\r\n\r\nutilli.hasDigits = function(password) {\r\n return /\\d/.test(password);\r\n};\r\n\r\nutilli.hasLowerCaseLetters = function (password) {\r\n return /[a-z]/.test(password);\r\n};\r\n\r\nutilli.hasUpperCaseLetters = function (password) {\r\n return /[A-Z]/.test(password);\r\n};\r\n\r\nutilli.hasLetters = function(password) {\r\n return /[a-zA-Z]/.test(password);\r\n};\r\n\r\nutilli.hasSpecialSymbols = function (password) {\r\n var regex = /[-!$%^&#*()_+|~=`{}\\[\\]:\";'<>?,.\\/@]/;\r\n var result = regex.test(password);\r\n return result;\r\n};\r\n\r\nutilli.getFileUrlWithToken = function(token) {\r\n var url = localStorage.getItem('ApiUrl') + 'api/GeneratedFiles/GetFile?token=' + token;\r\n return url;\r\n};\r\n\r\nutilli.emailPattern = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\nutilli.formatDecimal = function (decimal) {\r\n var formatted = Math.round(parseFloat(decimal) * 100) / 100;\r\n formatted = formatted.toString();\r\n if (formatted.indexOf('.') == -1) formatted += '.';\r\n while (formatted.length < formatted.indexOf('.') + 3)\r\n formatted += '0';\r\n return formatted;\r\n}\r\n\r\nutilli.hasAdminOrCsrRole = function (token) {\r\n if (!token) {\r\n token = localStorage.getItem('SecurityToken');\r\n }\r\n var payload = utilli.getPayload(token);\r\n if (!payload)\r\n return false;\r\n\r\n var result = _.some(payload.roles, function (role) {\r\n return role === utilli.roles.Administrator || role === utilli.roles.CSRAdmin || role === utilli.roles.CSR;\r\n });\r\n\r\n return result;\r\n};\r\n\r\n\r\nutilli.isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nutilli.isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nutilli.setWindowLocation = function (url) {\r\n console.log('redirect to new url: ' + url);\r\n if (utilli.isSafari){\r\n //// https://stackoverflow.com/a/31223302/292787 - this fix stopped to work. maybe because of a safari update\r\n //setTimeout(function(){ document.location.href = url; }, 1);\r\n // new fix is based on a global flag disableNoConnectionPage. my understanding of the problem is that when we\r\n // change location.url then safari current ajax requests are terminated. we have an angular response error\r\n // interceptor (see responseInterceptor.responseError in utilliApp.js) that identifies ajax termination as \r\n // absence of the internet connection and makes a redirect to the no connection page. in chrome this \r\n // redirect to NoConnection page doesn't cancel original redirect that we did with location.href change. but\r\n // in safari it does cancel our redirect and lands user on NoConnection page. for example if admin user is \r\n // logged in and opens the root page in a new tab then we redirect him to /admin/index.html but the user gets\r\n // landed on NoConnection page. the flag disableNoConnectionPage is used to cancel redirect to NoConnection \r\n // page.\r\n window.disableNoConnectionPage = true;\r\n }\r\n document.location.href = url;\r\n}\r\n\r\n/**\r\n * Return true ONLY if it is mobile browser AND NOT cordova/ripple.\r\n */\r\nutilli.isMobileBrowserNotCordova = function () {\r\n return utilli.isMobileBrowser() && !isMobileOrRipple();\r\n}\r\n\r\n/**\r\n * Returns true if it's mobile browser.\r\n * based on https://stackoverflow.com/a/11381730\r\n */\r\nutilli.isMobileBrowser = function () {\r\n if (navigator.userAgent.match(/Android/i)\r\n || navigator.userAgent.match(/webOS/i)\r\n || navigator.userAgent.match(/iPhone/i)\r\n || navigator.userAgent.match(/iPad/i)\r\n || navigator.userAgent.match(/iPod/i)\r\n || navigator.userAgent.match(/BlackBerry/i)\r\n || navigator.userAgent.match(/Windows Phone/i)\r\n ) {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * If user is already logged-in then redirect to the default page based on user role.\r\n * @param {} $state \r\n * @returns {} true if redirect should happen\r\n */\r\nutilli.goesToDefaultPage = function($state, setApiUrl) {\r\n var goToAdmin = function() {\r\n var adminUrl = utilli.getAdminUrl();\r\n utilli.setWindowLocation(adminUrl);\r\n }\r\n var token = localStorage.getItem('SecurityToken');\r\n if (token) {\r\n if (utilli.hasAdminOrCsrRole(token) || utilli.hasCashReceiptRole(token)) {\r\n // check if this is the customer view\r\n if (utilli.hasPropertyManagerRole()) {\r\n $state.goMainLayout('PropertyList');\r\n return true;\r\n }\r\n if (setApiUrl){\r\n setApiUrl(goToAdmin);\r\n }\r\n else{\r\n goToAdmin();\r\n }\r\n }\r\n else if (utilli.hasAgentRole())\r\n $state.goMainLayout('Search');\r\n else if (utilli.hasPropertyManagerRole())\r\n $state.goMainLayout('PropertyList');\r\n else if (utilli.hasFieldServiceEngineerRole())\r\n $state.goMainLayout('WorkCenters');\r\n else\r\n $state.goMainLayout('Dashboard');\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nutilli.getAdminUrl = function () {\r\n var adminUrl = window.location.origin + window.location.pathname;\r\n if(isMobileOrRipple()) {\r\n var indexOfIndex = adminUrl.indexOf('index.html');\r\n if (indexOfIndex > 0) {\r\n adminUrl = adminUrl.substr(0, indexOfIndex);\r\n }\r\n adminUrl = adminUrl + 'Admin/index.html/#/';\r\n }\r\n else {\r\n adminUrl = adminUrl.endsWith(\"index.html\") ? adminUrl + '/' : adminUrl;\r\n adminUrl = adminUrl + 'Admin/#/';\r\n }\r\n return adminUrl;\r\n}\r\n\r\nutilli.getRootUrl = function() {\r\n // to make it work on http://localhost/utilli\r\n var pathname = window.location.pathname;\r\n var index = pathname.indexOf(\"Admin\");\r\n pathname = index >= 0 ? pathname.substring(0, index) : pathname;\r\n var rootUrl = window.location.origin + pathname;\r\n return rootUrl;\r\n}\r\n\r\nutilli.hasAgentRole = function (token) {\r\n return utilli.hasRole(utilli.roles.Agent, token);\r\n}\r\n\r\nutilli.hasAssistantRole = function (token) {\r\n return utilli.hasRole(utilli.roles.Assistant, token);\r\n}\r\n\r\nutilli.notAgentOrAssistant = function (token) {\r\n return !utilli.hasAgentRole(token) && !utilli.hasAssistantRole(token);\r\n}\r\n\r\nutilli.hasPropertyManagerRole = function (token) {\r\n if (!token)\r\n token = localStorage.getItem('SecurityToken');\r\n var payload = utilli.getPayload(token);\r\n if (!payload)\r\n return false;\r\n\r\n var result = _.some(payload.roles, function (role) {\r\n return role === utilli.roles.PropertyManager;\r\n });\r\n\r\n if (!result && utilli.isAdmin) {\r\n var value = localStorage.getItem('PropertyManager');\r\n if (value)\r\n result = true;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nutilli.hasDataExporterRole = function (token) {\r\n return utilli.hasRole(utilli.roles.DataExporter, token);\r\n};\r\n\r\nutilli.hasCashReceiptRole = function (token) {\r\n return utilli.hasRole(utilli.roles.CashReceipt, token);\r\n};\r\n\r\nutilli.hasAdminManagerRole = function (token) {\r\n return utilli.hasRole(utilli.roles.AdminManager, token) || utilli.hasRole(utilli.roles.Administrator, token);\r\n};\r\n\r\nutilli.hasAdminRole = function (token) {\r\n if (!token) {\r\n token = localStorage.getItem('SecurityToken');\r\n }\r\n var payload = utilli.getPayload(token);\r\n if (!payload)\r\n return false;\r\n\r\n var result = _.some(payload.roles, function (role) {\r\n return role === utilli.roles.Administrator || role === utilli.roles.CSRAdmin;\r\n });\r\n\r\n return result;\r\n};\r\n\r\nutilli.hasCsrAdminRole = function (token) {\r\n return utilli.hasRole(utilli.roles.CSRAdmin, token);\r\n};\r\n\r\nutilli.hasSuperAdminRole = function (token) {\r\n return utilli.hasRole(utilli.roles.Administrator, token);\r\n};\r\n\r\nutilli.hasFieldServiceEngineerRole = function (token) {\r\n if (!token)\r\n token = localStorage.getItem('SecurityToken');\r\n\r\n return utilli.hasRole(utilli.roles.FieldServiceEngineer, token);\r\n};\r\n\r\nutilli.hasRole = function(role, token){\r\n if (!token)\r\n token = localStorage.getItem(\"SecurityToken\");\r\n var payload = utilli.getPayload(token);\r\n if (!payload)\r\n return false;\r\n var result = _.some(payload.roles, function (r) {\r\n return r === role;\r\n });\r\n return result;\r\n}\r\n\r\nutilli.isDemo = function() {\r\n return DeploymentSettings.deploymentEnvironment === \"Demo\"\r\n || DeploymentSettings.deploymentEnvironment === \"Demo2\"\r\n || DeploymentSettings.deploymentEnvironment === \"Debug\"\r\n || DeploymentSettings.deploymentEnvironment === \"Dev\";\r\n}\r\n\r\nutilli.getCurrentUserName = function () {\r\n var token = localStorage.getItem(\"SecurityToken\");\r\n var payload = utilli.getPayload(token);\r\n if (!payload)\r\n return null;\r\n\r\n return payload.userName;\r\n}\r\n\r\nutilli.getPayload = function(token) {\r\n if (!token)\r\n return null;\r\n\r\n var parts = token.split('.');\r\n var encoded = parts[1];\r\n // I don't know what the next line of code does but it fixes WGLCX-684. I just copy pasted it from :\r\n // https://github.com/auth0/jwt-decode/blob/master/lib/base64_url_decode.js\r\n encoded = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n var json = atob(encoded);\r\n var payload = JSON.parse(json);\r\n return payload;\r\n}\r\n\r\n/* returns cell phone number that starts with 1 and has 11 digits.\r\n* @param maskPhoneNumber - 10 digit cell phone number extracted from ui-mask\r\n*/\r\nutilli.getFullPhoneNumber = function(maskPhoneNumber) {\r\n return Config.phoneNumberMask[1] + maskPhoneNumber;\r\n}\r\n\r\nutilli.registerGoogleAnalytics = function(win, rootScope, location) {\r\n if (!win || !win.ga || !rootScope || !location) return;\r\n win.ga('create', 'UA-91827657-1', 'auto');\r\n var isMobile = isMobileOrRipple();\r\n if (isMobile) {\r\n // http://stackoverflow.com/a/35057298/292787\r\n win.ga('set', 'checkProtocolTask', function () { });\r\n }\r\n win.ga('set', 'dimension1', DeploymentSettings.currentServiceProvider);// ServiceProvider\r\n win.ga('set', 'dimension2', DeploymentSettings.deploymentEnvironment);// DeploymentEnvironment\r\n win.ga('set', 'dimension3', isMobile ? 'mobile' : 'web');// ClientType\r\n rootScope.$on('$stateChangeSuccess', function (event) {\r\n var relativeUrl = utilli.isAdmin ? '/Admin/#' + location.path() : '/#' + location.path();\r\n win.ga('send', 'pageview', relativeUrl);\r\n });\r\n}\r\n\r\n// initialize so that utilli.localizationDictionary[key] will not fail with undefined error\r\nutilli.localizationDictionary = {};\r\n\r\nutilli.isLanguagePackEnabled = function() {\r\n if(window.location.href.indexOf(\"WelcomeAgent\") !== -1)\r\n {\r\n // no languages for Agents Welcome\r\n return false;\r\n }\r\n\r\n if(window.location.href.indexOf(\"/Admin\") !== -1)\r\n {\r\n // no languages for Admins\r\n return false;\r\n }\r\n\r\n if (isMobileOrRipple())\r\n return Config.enableLanguagePack;\r\n\r\n if (DeploymentSettings.currentServiceProvider.length > 0) {\r\n var enableLanguagePack = Config.providers[DeploymentSettings.currentServiceProvider].EnableLanguagePack;\r\n return enableLanguagePack;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getCurrentLanguage() {\r\n\r\n if (utilli.isLanguagePackEnabled()) {\r\n var language = localStorage.getItem('language');\r\n console.log('language: ' + language);\r\n if (utilli.checkDefinedValue(language))\r\n return language;\r\n }\r\n\r\n return 'en';\r\n}\r\n\r\nutilli.registerLocalization = function (rootScope, resource) {\r\n\r\n var language = getCurrentLanguage();\r\n localStorage.setItem('language', language);\r\n utilli.changeLanguage(resource, language);\r\n rootScope._t = utilli._t;\r\n}\r\n\r\nutilli._t = function (key) {\r\n var localized = utilli.localizationDictionary[key];\r\n return localized ? localized : key;\r\n};\r\n\r\n\r\nutilli.maxExcelRows = 1048576;// max number of rows that Excel can have\r\nutilli.maxExcelRowsWithoutHeader = utilli.maxExcelRows - 1;\r\nutilli.maxExcelRowsErrorMessage = utilli._t(\"Excel file cannot have more than %maxExcelRows% rows.\" +\r\n \" Please reduce the number of records for export by applying filters.\")\r\n .replace('%maxExcelRows%', utilli.maxExcelRowsWithoutHeader);\r\n\r\nutilli.checkDefinedValue = function (value) {\r\n if (value === null || value === 'null' || value === 'undefined' || value === undefined || value === '')\r\n return false;\r\n return true;\r\n}\r\n\r\nutilli.changeLanguage = function (resource, language, callback) {\r\n console.log('changeLanguage() language: ' + language);\r\n if (!utilli.isLanguagePackEnabled())\r\n return;\r\n if (!utilli.checkDefinedValue(language))\r\n language = 'en';\r\n var filePath = 'languages/' + language + '.json' + DeploymentSettings.currentVersion;\r\n if (utilli.isAdmin)\r\n filePath = '../' + filePath;\r\n resource(filePath).get(function (data) {\r\n utilli.localizationDictionary = data;\r\n\r\n var _t = utilli._t;\r\n\r\n utilli.errors.serverErrorMessage = _t('Server error. Try again later.');\r\n utilli.errors.validationErorrsMessage = _t('Please correct your information.');\r\n\r\n localStorage.setItem('language', language);\r\n\r\n var urlPrefixKendoLib = '';\r\n if(utilli.isAdmin)\r\n {\r\n urlPrefixKendoLib = '../';\r\n } \r\n if(!utilli.isWglcxPortal()) {\r\n if(language == 'en') {\r\n $.getScript(urlPrefixKendoLib + \"libs/kendo/Languages/kendo.messages.en-US.min.js\", function () {});\r\n kendo.culture('en-US'); \r\n }\r\n else if (language == 'es') { \r\n $.getScript(urlPrefixKendoLib + \"libs/kendo/Languages/kendo.messages.es-US.min.js\", function () {}); \r\n kendo.culture('es-US');\r\n }\r\n else if(language == 'ko') { \r\n $.getScript(urlPrefixKendoLib + \"libs/kendo/Languages/kendo.messages.ko-KR.min.js\", function () {});\r\n kendo.culture('ko-KR'); \r\n }\r\n else if(language == 'zh') { \r\n $.getScript(urlPrefixKendoLib + \"libs/kendo/Languages/kendo.messages.zh-CN.min.js\", function () {});\r\n kendo.culture('zh-CN');\r\n }\r\n }\r\n\r\n if (callback)\r\n callback(language);\r\n });\r\n}\r\n\r\n//English - English\r\n//Espanol - Spanish\r\n//Deutsch - German\r\n//Русский - Russian\r\n//සිංහල - Sinhalese\r\n//中文 - Chinese\r\n//नहीं - Hindi\r\n\r\n//utilli.languages = [\r\n// { name: 'English', abbreviation: 'en' },\r\n// { name: 'Espanol (Spanish)', abbreviation: 'es' },\r\n// { name: 'Français (French)', abbreviation: 'fr' },\r\n// { name: 'Deutsch (German)', abbreviation: 'de' },\r\n// { name: 'සිංහල (Sinhalese)', abbreviation: 'si' },\r\n// { name: '中文 (Chinese)', abbreviation: 'zh' },\r\n// { name: 'Nederlands (Dutch)', abbreviation: 'nl' },\r\n// { name: 'Afrikaans', abbreviation: 'af' },\r\n// { name: 'हिन्दी (Hindi)', abbreviation: 'hi' },\r\n// { name: 'ગુજરાતી (Gujarati)', abbreviation: 'gu' },\r\n// { name: 'ಕನ್ನಡ (Kannada)', abbreviation: 'kn' },\r\n// { name: 'मराठी (Marathi)', abbreviation: 'mr' },\r\n// { name: 'ਪੰਜਾਬੀ (Punjabi)', abbreviation: 'pa' },\r\n// { name: 'தமிழ் (Tamil)', abbreviation: 'ta' },\r\n// { name: 'తెలుగు (Telugu)', abbreviation: 'te' },\r\n// { name: 'العَرَبِيَّة‎‎ (Arabic)', abbreviation: 'ar' },\r\n// { name: 'Русский (Russian)', abbreviation: 'ru' } ];\r\n\r\nutilli.languages = {\r\n \"wgl\": [\r\n { name: 'English', abbreviation: 'en' },\r\n { name: 'Espanol (Spanish)', abbreviation: 'es' }\r\n ],\r\n \"px\": [\r\n { name: 'English', abbreviation: 'en' },\r\n ],\r\n \"gni\": [\r\n { name: 'English', abbreviation: 'en' },\r\n { name: 'Espanol (Spanish)', abbreviation: 'es' },\r\n { name: 'Français (French)', abbreviation: 'fr' },\r\n { name: 'Deutsch (German)', abbreviation: 'de' },\r\n { name: 'සිංහල (Sinhalese)', abbreviation: 'si' },\r\n { name: '中文 (Chinese)', abbreviation: 'zh' },\r\n { name: 'Nederlands (Dutch)', abbreviation: 'nl' },\r\n { name: 'Afrikaans', abbreviation: 'af' },\r\n { name: 'हिन्दी (Hindi)', abbreviation: 'hi' },\r\n { name: 'ગુજરાતી (Gujarati)', abbreviation: 'gu' },\r\n { name: 'ಕನ್ನಡ (Kannada)', abbreviation: 'kn' },\r\n { name: 'मराठी (Marathi)', abbreviation: 'mr' },\r\n { name: 'ਪੰਜਾਬੀ (Punjabi)', abbreviation: 'pa' },\r\n { name: 'தமிழ் (Tamil)', abbreviation: 'ta' },\r\n { name: 'తెలుగు (Telugu)', abbreviation: 'te' },\r\n { name: 'العَرَبِيَّة‎‎ (Arabic)', abbreviation: 'ar' },\r\n { name: '조선말ة‎‎ (Korean)', abbreviation: 'ko' },\r\n { name: 'Беларуская мова (Belarusian)', abbreviation: 'be' },\r\n { name: 'Русский (Russian)', abbreviation: 'ru' }\r\n ],\r\n\r\n \"demo\": [\r\n { name: 'English', abbreviation: 'en' },\r\n { name: 'Espanol (Spanish)', abbreviation: 'es' },\r\n { name: 'Français (French)', abbreviation: 'fr' },\r\n { name: 'Deutsch (German)', abbreviation: 'de' },\r\n { name: 'සිංහල (Sinhalese)', abbreviation: 'si' },\r\n { name: '中文 (Chinese)', abbreviation: 'zh' },\r\n { name: 'Nederlands (Dutch)', abbreviation: 'nl' },\r\n { name: 'Afrikaans', abbreviation: 'af' },\r\n { name: 'हिन्दी (Hindi)', abbreviation: 'hi' },\r\n { name: 'ગુજરાતી (Gujarati)', abbreviation: 'gu' },\r\n { name: 'ಕನ್ನಡ (Kannada)', abbreviation: 'kn' },\r\n { name: 'मराठी (Marathi)', abbreviation: 'mr' },\r\n { name: 'ਪੰਜਾਬੀ (Punjabi)', abbreviation: 'pa' },\r\n { name: 'தமிழ் (Tamil)', abbreviation: 'ta' },\r\n { name: 'తెలుగు (Telugu)', abbreviation: 'te' },\r\n { name: 'العَرَبِيَّة‎‎ (Arabic)', abbreviation: 'ar' },\r\n { name: '조선말ة‎‎ (Korean)', abbreviation: 'ko' },\r\n { name: 'Беларуская мова (Belarusian)', abbreviation: 'be' },\r\n { name: 'Русский (Russian)', abbreviation: 'ru' }\r\n ],\r\n\r\n \"hc\": [\r\n { name: 'English', abbreviation: 'en' },\r\n { name: 'Espanol (Spanish)', abbreviation: 'es' },\r\n { name: '조선말ة‎‎ (Korean)', abbreviation: 'ko' },\r\n { name: '中文 (Chinese)', abbreviation: 'zh' }\r\n ]\r\n};\r\n\r\nutilli.getCountryPhoneNumberCode = function () {\r\n return Config.phoneNumberMask[1]; // +1 999... -> 1 or +7 999 ... -> 7\r\n};\r\n\r\nutilli.datePickerOptions = {\r\n formatYear: 'yyyy',\r\n startingDay: 1,\r\n showWeeks: false\r\n};\r\n\r\nutilli.isAuthorized = function () {\r\n if (localStorage.getItem('SecurityToken'))\r\n return true;\r\n return false;\r\n}\r\n\r\nutilli.errors = {\r\n serverErrorMessage: utilli._t('Server error. Try again later.'),\r\n validationErorrsMessage: utilli._t('Please correct your information.')\r\n};\r\n\r\nutilli.getApplicationService = function (serviceName) {\r\n var elem = angular.element(document.querySelector('[ng-app]'));\r\n var injector = elem.injector();\r\n var result = injector.get(serviceName);\r\n return result;\r\n}\r\n\r\nutilli.mobilePlatforms = {\r\n unknown: 'Unknown',\r\n android: 'Android',\r\n iOs: 'IOs',\r\n windowsPhone: 'WindowsPhone',\r\n}\r\n\r\nutilli.getPlatformName = function () {\r\n var result = utilli.mobilePlatforms.unknown;\r\n if(deviceIsWindowsPhone)\r\n result = utilli.mobilePlatforms.windowsPhone;\r\n else if(isAndroid())\r\n result = utilli.mobilePlatforms.android;\r\n else if(iOS())\r\n result = utilli.mobilePlatforms.iOs;\r\n return result;\r\n}\r\n\r\n/**\r\n * Formats number to be displayed on UI.\r\n * For example, in US we need separate thousands with comma and have 2 fraction digits\r\n * @param {} num a number that needs to be presented as a string\r\n * @returns {} formatted string\r\n */\r\nutilli.formatNumber = function(num) {\r\n return num.toLocaleString(undefined, { maximumFractionDigits: 2 });\r\n}\r\n\r\n/**\r\n * Same as formatNumber but for currency - with leading $ and minimum 2 decimal places\r\n * @param {float} num a number that needs to be presented as currency\r\n */\r\nutilli.formatCurrency = function(num){\r\n if (num == null || num === '')\r\n return 'N/A';\r\n if (typeof(num) === 'string')\r\n num = Number(num);\r\n return '$ ' + num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });\r\n}\r\n\r\n/**\r\n * Removes float numbers after the second number.\r\n * For example, 0.123 -> 0.12\r\n * @param {} num a number that needs to be changed\r\n * @returns {} trimmed value\r\n */\r\nutilli.trimFloat2 = function (num) {\r\n return parseFloat((num).toFixed(2));;\r\n}\r\n\r\nutilli.localStorageItemNotNull = function (name) {\r\n var item = localStorage.getItem(name);\r\n var result = item != null && item != \"null\";\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns positive number or zero.\r\n * Returns zero for NaNs, undefined, etc.\r\n * @param {string} num number\r\n */\r\nutilli.parsePositiveFloat = function (num){\r\n var parsed = parseFloat(num);\r\n return parsed > 0 ? parsed : 0;\r\n}\r\n\r\n/**\r\n * timeout value in ms for refreshing Energy Star status\r\n */\r\nutilli.propertyRefreshTimeout = 5 * 1000; // 5 sec\r\n\r\nutilli.getCurrentProviderConfigValue = function (key, defaultValue) {\r\n if (!DeploymentSettings.currentServiceProvider || DeploymentSettings.currentServiceProvider.length === 0\r\n || !Config.providers[DeploymentSettings.currentServiceProvider][key])\r\n return defaultValue;\r\n return Config.providers[DeploymentSettings.currentServiceProvider][key];\r\n}\r\n\r\nutilli.getHelpEmail = function () {\r\n return utilli.getCurrentProviderConfigValue(\"HelpEmail\", \"help@utilli.com\");\r\n}\r\n\r\nutilli.getSupportPhoneNumber = function () {\r\n return utilli.getCurrentProviderConfigValue(\"SupportPhoneNumber\", \"330-701-8398\");\r\n}\r\n\r\nutilli.isPropertyManagerApp = function () {\r\n return DeploymentSettings.providersGroupShortName && \r\n (DeploymentSettings.providersGroupShortName.toUpperCase() === 'WGL' || DeploymentSettings.providersGroupShortName.toUpperCase() === 'PX');\r\n}\r\n\r\nutilli.isPx = function () {\r\n return DeploymentSettings.providersGroupShortName && DeploymentSettings.providersGroupShortName.toUpperCase() === 'PX';\r\n}\r\n\r\nutilli.isWglcx = function () {\r\n return DeploymentSettings.providersGroupShortName && DeploymentSettings.providersGroupShortName.toUpperCase() \r\n === Config.wglcxProviderName.toUpperCase();\r\n}\r\n\r\nutilli.isWglcxPortal = function () { \r\n var result = utilli.isWglcx && !isMobileOrRipple();\r\n return result;\r\n}\r\n\r\nutilli.getQuickPayName = function (){\r\n var quickPayName = utilli.isWglcx() ? 'SmartPay' : utilli._t('Login Page QuickPay');\r\n return quickPayName;\r\n}\r\n\r\nutilli.isHc = function () {\r\n return DeploymentSettings.providersGroupShortName && DeploymentSettings.providersGroupShortName.toUpperCase() === 'HC';\r\n}\r\n\r\nutilli.isGni = function () {\r\n return DeploymentSettings.providersGroupShortName && DeploymentSettings.providersGroupShortName.toUpperCase() === 'GNI';\r\n}\r\n\r\nutilli.adjustPhoneNumber = function (phoneNumber) {\r\n if (!phoneNumber)\r\n return null;\r\n\r\n if (phoneNumber.length > Config.phoneNumberLengthWithoutCountryCode)\r\n return phoneNumber.substr(Config.countryCodeLength);\r\n\r\n return phoneNumber;\r\n}\r\n\r\nutilli.fixSelectElementForMobile = function () {\r\n // this hack fixes a select element behavior in mobile (changing selected options).\r\n var allSelectElements = document.getElementsByTagName('select');\r\n for (var i = 0; i < allSelectElements.length; i++) {\r\n allSelectElements[i].addEventListener('touchstart', function (e) {\r\n //This is the important line\r\n e.stopPropagation();\r\n }, false);\r\n }\r\n}\r\n\r\nutilli.clientEnum = {\r\n mobileApp: 1,\r\n portal: 2\r\n};\r\n\r\nutilli.pm = {\r\n meterErrorCodes: {\r\n serviceAddressMismatch: 3\r\n }\r\n};\r\n\r\nutilli.getStateNameWithoutLayout = function (fullStateName) {\r\n var index = fullStateName.indexOf('.');\r\n var state = '';\r\n if (index >= 0)\r\n state = fullStateName.substr(index + 1);\r\n else\r\n state = fullStateName;\r\n return state;\r\n}\r\n\r\nutilli.togglePasswordVisibility = function (pswId, iconId) {\r\n var elemPassword = $('#' + pswId);\r\n if (elemPassword.attr('type') === 'password')\r\n elemPassword.attr('type', 'text');\r\n else\r\n elemPassword.attr('type', 'password');\r\n\r\n $('#' + iconId).toggleClass('glyphicon-eye-close').toggleClass('glyphicon-eye-open');\r\n}\r\n\r\nutilli.getStringForComparison = function (source) {\r\n //https://stackoverflow.com/questions/3286874/remove-all-multiple-spaces-in-javascript-and-replace-with-single-space?answertab=votes#tab-top\r\n var result = source.toUpperCase().replace(/ +(?= )/g,'');\r\n return result;\r\n}\r\n\r\nutilli.notificationTypes = {\r\n sms: 1,\r\n email: 2,\r\n smsAndEmail: 3\r\n}\r\n\r\nutilli.paymentTypes = {\r\n card: 1,\r\n check: 2\r\n}\r\n\r\nutilli.hideColumnByTitle = function (grid, fieldName) {\r\n for (var i = 0; i < grid.columns.length; i++){\r\n if (grid.columns[i].title == fieldName){\r\n grid.hideColumn(i);\r\n return;\r\n }\r\n }\r\n}\r\n\r\nutilli.arePhoneNumbersEqual = function (phone1, phone2){\r\n return utilli.adjustPhoneNumber(phone1) == utilli.adjustPhoneNumber(phone2);\r\n}\r\n\r\nutilli.emptyAccountStatus = '--'\r\n\r\nutilli.fillAccountStatuses = function(accountInfo) {\r\n var result = [];\r\n if(accountInfo.Tax && accountInfo.Tax != utilli.emptyAccountStatus)\r\n result.push(accountInfo.Tax);\r\n if(accountInfo.CheckStatus && accountInfo.CheckStatus != utilli.emptyAccountStatus)\r\n result.push(accountInfo.CheckStatus);\r\n if(accountInfo.HardshipIndicator && accountInfo.HardshipIndicator != utilli.emptyAccountStatus)\r\n result.push(accountInfo.HardshipIndicator);\r\n if(accountInfo.MeterStatus && accountInfo.MeterStatus != utilli.emptyAccountStatus \r\n && accountInfo.MeterStatus != '06')// 06 - Active. i think that there is no need to show Active status\r\n result.push(accountInfo.MeterStatusDescription);\r\n if(accountInfo.CashOnlyCustomer && accountInfo.CashOnlyCustomer != utilli.emptyAccountStatus)\r\n result.push(accountInfo.CashOnlyCustomer);\r\n return result;\r\n}\r\n\r\nutilli.getDateWithoutTime = function (dateTime){\r\n dateTime = dateTime || new Date();\r\n return new Date(dateTime.setHours(0,0,0,0));\r\n}\r\n\r\nutilli.hcMeterStatuses = {\r\n notInstalled: \"01\",\r\n installedRelevantToTech: \"02\",\r\n allocatedToInstallation: \"03\",\r\n meterDisconnected: \"04\",\r\n inActive: \"05\",\r\n active: \"06\"\r\n}\r\nutilli.yearMonthToString = function(yearMonth){\r\n return yearMonth.toString().substring(0, 4) + '-' + yearMonth.toString().substring(4, 6);\r\n}\r\n\r\nutilli.getDateWithoutTime = function (dateTime){\r\n dateTime = dateTime || new Date();\r\n return new Date(dateTime.setHours(0,0,0,0));\r\n}\r\n\r\nutilli.templateTypes = {\r\n emailTemplate: 'Email',\r\n smsTemplate: 'Sms'\r\n}\r\n\r\nutilli.getCurrentUserName = function () {\r\n var result = utilli.getPayload(localStorage.getItem('SecurityToken')).userName;\r\n return result;\r\n}\r\n\r\nutilli.savePayUrl = function(token){\r\n if (!token){\r\n return;\r\n }\r\n var tokenPayload = utilli.getPayload(token);\r\n if (tokenPayload.PayUrl) {\r\n localStorage.setItem('PayUrl', tokenPayload.PayUrl);\r\n }\r\n else{\r\n localStorage.removeItem('PayUrl');\r\n }\r\n}\r\n\r\n/**\r\n * The function is used to save current grid parameters into the page URL and later restore page parameters from the URL.\r\n * @param {*} $location AngularJs location service is used to save 'path' param into the URL of the current page.\r\n * @param {*} webapi Kendo webapi object is used to do mapping of grid options to parameters that are compatible with\r\n * dotnet backend.\r\n * @param {*} options Kendo options with current filters/sorts that are passed to the data loading function.\r\n * @param {*} grid Kendo grid.\r\n */\r\nutilli.getGridParameters = function ($location, webapi, options, grid) {\r\n var params = webapi.parameterMap(options.data);\r\n var isFirstLoad = !grid.initialParams;\r\n if (isFirstLoad) {\r\n // save initial grid parameters. Later it will allow to understand that the gird is in initial state\r\n // and remove serialized filter from the URL\r\n grid.initialParams = Object.assign({}, params);\r\n // if we are loading the first page of the grid then we need to check 'path' param in the current URL.\r\n var filterString = $location.search()['path'];\r\n if (filterString) {\r\n // if the 'path' param exists then use this saved filtering for the grid loading\r\n params = JSON.parse(decodeURI(filterString), dateReviver);\r\n if (grid && params.pathFilter) {\r\n // grid.dataSource.filter with params.pathFilter param will trigger another grid reload that will be\r\n // put into a queue by kendo. without this reload the grid will not render saved filters on top of the\r\n // grid\r\n grid.dataSource.query({ \r\n filter: params.pathFilter,\r\n sort: params.pathSort,\r\n page: params.page,\r\n pageSize: params.pageSize \r\n });\r\n // options.success below completes the current grid loading. if options.success is not called\r\n // then grid continues to spin its spinner and doesn't proceed to the next queued reload.\r\n options.success({ PageData: [], Count: 0 });\r\n // return null as a flag to stop data loading because the grid will be reloaded.\r\n return null;\r\n }\r\n }\r\n }\r\n else {\r\n // if the gird is in the initial state then remove the serialized filter from the URL\r\n var initialParams = grid.initialParams;\r\n if (initialParams && initialParams.sort === params.sort && initialParams.page === params.page \r\n && initialParams.pageSize === params.pageSize && initialParams.filter === params.filter \r\n && initialParams.group === params.group) {\r\n $location.search('path', null);\r\n }\r\n else {\r\n // if the grid is not in the initial state and we are loading not the first page then we need to just save \r\n // params to the URL path param.\r\n // the code below saves the current filter object into the pathFilter field so that it will be possible to \r\n // use it later when the page will be reloaded or navigated back/forth.\r\n params.pathFilter = grid.dataSource.filter();\r\n params.pathSort = grid.dataSource.sort();\r\n $location.search('path', encodeURI(JSON.stringify(params)));\r\n }\r\n }\r\n return params;\r\n}\r\n\r\nfunction isString( value ) {\r\n return({}.toString.call(value) === \"[object String]\");\r\n}\r\nfunction isSerializedDate( value ) {\r\n // Dates are serialized in TZ format, example: '1981-12-20T04:00:14.000Z'.\r\n var datePattern = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\r\n return (isString(value) && datePattern.test(value));\r\n}\r\n\r\nfunction dateReviver( key, value ) {\r\n if (isSerializedDate(value)) {\r\n return(new Date(value));\r\n }\r\n // If it's not a date-string, we want to return the value as-is. If we fail to return\r\n // a value, it will be omitted from the resultant data structure.\r\n return (value);\r\n}\r\n\r\nutilli._currentServiceProviderDeffered = jQuery.Deferred();\r\n\r\nutilli.resolveServiceProviderApiDeffered = function (apiUrl) { \r\n utilli._currentServiceProviderDeffered.resolve(apiUrl);\r\n}\r\n\r\nutilli.rejectServiceProviderApiDeffered = function (e) { \r\n utilli._currentServiceProviderDeffered.reject(e);\r\n}\r\n\r\nutilli.getServiceProviderApiDeffered = function () { \r\n return utilli._currentServiceProviderDeffered.promise();\r\n}\r\n\r\nutilli.getUrlParameter = function getUrlParameter(p) {\r\n var pageURL = window.location.hash.substring(1),\r\n urlVariables = pageURL.split('&'),\r\n parameterName,\r\n i;\r\n\r\n for (i = 0; i < urlVariables.length; i++) {\r\n parameterName = urlVariables[i].split('=');\r\n\r\n if (parameterName[0] === p) {\r\n return parameterName[1] === undefined ? true : decodeURIComponent(parameterName[1]);\r\n }\r\n }\r\n};\r\n\r\nutilli.getSafariPushNotificationPermissionData = function () {\r\n var permissionData = utilli.isSafari \r\n ? window.safari.pushNotification.permission('web.com.utilli.mobile')\r\n : null;\r\n return permissionData;\r\n}\r\n\r\nutilli.checkSafariRemotePermission = function ($scope, apiUrl, authToken) {\r\n var pd = utilli.getSafariPushNotificationPermissionData();\r\n var checkFn = function (permissionData) {\r\n if (permissionData.permission === 'default') {\r\n // This is a new web service URL and its validity is unknown.\r\n window.safari.pushNotification.requestPermission(\r\n apiUrl.slice(0, -1), // The web service URL.\r\n 'web.com.utilli.mobile', // The Website Push ID.\r\n {\r\n \"token\": authToken\r\n }, // Data that you choose to send to your server to help you identify the user.\r\n checkFn // The callback function.\r\n );\r\n }\r\n else if (permissionData.permission === 'denied') {\r\n // The user said no.\r\n }\r\n else if (permissionData.permission === 'granted') {\r\n $scope.$apply();\r\n console.log('we have a device token')\r\n }\r\n }\r\n checkFn(pd);\r\n}\r\n\r\nutilli.blankEmailTemplate = {\r\n \"page\": {\r\n \"title\": \"\",\r\n \"description\": \"\",\r\n \"template\": {\r\n \"name\": \"template-base\",\r\n \"type\": \"basic\",\r\n \"version\": \"0.0.1\"\r\n },\r\n \"body\": {\r\n \"type\": \"mailup-bee-page-proprerties\",\r\n \"container\": {\r\n \"style\": {\r\n \"background-color\": \"#FFFFFF\"\r\n }\r\n },\r\n \"content\": {\r\n \"style\": {\r\n \"font-family\": \"Arial, 'Helvetica Neue', Helvetica, sans-serif\",\r\n \"color\": \"#000000\"\r\n },\r\n \"computedStyle\": {\r\n \"linkColor\": \"#0068A5\",\r\n \"messageBackgroundColor\": \"transparent\",\r\n \"messageWidth\": \"500px\"\r\n }\r\n }\r\n },\r\n \"rows\": [\r\n {\r\n \"type\": \"one-column-empty\",\r\n \"container\": {\r\n \"style\": {\r\n \"background-color\": \"transparent\"\r\n }\r\n },\r\n \"content\": {\r\n \"style\": {\r\n \"background-color\": \"transparent\",\r\n \"color\": \"#000000\",\r\n \"width\": \"500px\"\r\n }\r\n },\r\n \"columns\": [\r\n {\r\n \"grid-columns\": 12,\r\n \"modules\": [\r\n {\r\n \"type\": \"mailup-bee-newsletter-modules-empty\",\r\n \"descriptor\": {}\r\n }\r\n ],\r\n \"style\": {\r\n \"background-color\": \"transparent\",\r\n \"padding-top\": \"5px\",\r\n \"padding-right\": \"0px\",\r\n \"padding-bottom\": \"5px\",\r\n \"padding-left\": \"0px\",\r\n \"border-top\": \"0px dotted transparent\",\r\n \"border-right\": \"0px dotted transparent\",\r\n \"border-bottom\": \"0px dotted transparent\",\r\n \"border-left\": \"0px dotted transparent\"\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n};\n$(function() {\r\n var thresholdIosVersion = 6;\r\n var allInputCssSelectors = 'input[type=\"text\"]:not([readonly]),input[type=\"number\"]:not([readonly]),input[type=\"password\"]:not([readonly]),input[type=\"email\"]:not([readonly]),input[type=\"tel\"]:not([readonly]), textarea:not([readonly])';\r\n var allInputAndSelectCssSelectors = allInputCssSelectors + ', select:not([readonly])';\r\n var handleOrientationChange = function(){\r\n window.onorientationchange = function () {\r\n if ($(allInputCssSelectors).is(':focus'))\r\n setTimeout(fixHeight, 900); //Need at least 800 milliseconds\r\n }\r\n }\r\n if (isAndroid()) {\r\n $(document).on('focus', allInputCssSelectors, fixHeight);\r\n $(document).on('focusout', allInputCssSelectors, resetHeightFix);\r\n handleOrientationChange();\r\n }\r\n\r\n if (iOS()) {\r\n // for new iOS we apply the fix only when the keyboard is opened\r\n // but for old iOS we apply the fix permanently\r\n if (getIosVersionFloat() > thresholdIosVersion) {\r\n handleOrientationChange();\r\n $(document).on('focus', allInputAndSelectCssSelectors, function () {\r\n //applyTopMenuFix(); // i think that after the last iOS update this fix doesn't change anything\r\n fixHeight.call(this);\r\n });\r\n $(document).on('focusout', allInputCssSelectors, resetHeightFix);\r\n $(document).on('blur', allInputAndSelectCssSelectors, function () {\r\n var topMenuElement = getTopMenu();\r\n topMenuElement.css({\r\n 'position': '',\r\n 'top': ''\r\n });\r\n var bottomMenuElement = getBottomMenu();\r\n bottomMenuElement.css({\r\n 'position': '',\r\n 'top': ''\r\n });\r\n });\r\n }\r\n else {\r\n applyTopMenuFix();\r\n }\r\n }\r\n\r\n function getTopMenu() {\r\n return $('.navbar.navbar-fixed-top');\r\n }\r\n\r\n function getBottomMenu() {\r\n return $('.navbar.navbar-fixed-bottom');\r\n }\r\n\r\n /**\r\n * changes position CSS of the top menu to absolute to avoid issues on iPhone when keyboard is opened\r\n */\r\n function applyTopMenuFix(){\r\n var topMenuElements = getTopMenu();\r\n topMenuElements.css({\r\n 'position': 'absolute',\r\n 'top': '0'\r\n });\r\n var bottomMenuElement = getBottomMenu();\r\n bottomMenuElement.css({\r\n 'position': 'absolute',\r\n 'top': document.height - getBottomMenu().height() + 'px'\r\n });\r\n }\r\n\r\n function fixHeight() {\r\n var me = this;\r\n if (me.id){\r\n // if there is a label for the input then scroll to the label\r\n var labels = $('label[for^=\"' + me.id + '\"]');\r\n var scrollToElement = labels.length > 0 ? labels[0] : me;\r\n }\r\n // wrap it in a timeout so that if a user goes from one input into another\r\n // then first focus-out is fired with it's own timeout\r\n // later focus is fired with a timeout that is bigger than the one that is set in focus-out.\r\n // this is why here the timeout value is 10, while in resetHeightFix the timeout value is 1,\r\n // it is to ensure that the code in fixHeight will be executed after the code in resetHeightFix\r\n setTimeout(function(){\r\n var element = $('.main-ui-view');\r\n if ($('#virtualKeyboardPlace').length == 0)\r\n element.append('
');\r\n $('#virtualKeyboardPlace').height(getHeightKeyboardPlace());\r\n // scroll current element to the top of the page\r\n if (scrollToElement)\r\n scrollToElement.scrollIntoView(true);\r\n // move scroll so that current element will be below the top menu\r\n var topMenuHeight = getTopMenu().height();\r\n $('body').scrollTop($('body').scrollTop() - topMenuHeight);\r\n }, 10);\r\n }\r\n\r\n function resetHeightFix() {\r\n // wrap it in a timeout so that if a user presses a button then button click will fire first\r\n setTimeout(function(){\r\n $('#virtualKeyboardPlace').height(0);\r\n }, 1);\r\n }\r\n\r\n function getHeightKeyboardPlace() {\r\n var result = 1;\r\n if(iOS() && getIosVersionFloat() > thresholdIosVersion) \r\n return result;\r\n if (isLandscape())\r\n result = $('html').height() * 0.6;\r\n if (isPortrait())\r\n result = $('html').height() * 0.5;\r\n return result;\r\n }\r\n});\nfunction hideSplashScreen(){\r\n if (navigator.splashscreen) {\r\n if (parseFloat(getAndroidVersion()) > 4.3)\r\n {\r\n // for android 4.4+ splashscreen plugin switches app to just full-screen mode while we want immersiveMode.\r\n // immersiveMode avoids the top system bar to appear when keyboard is active\r\n AndroidFullScreen.immersiveMode(function () {\r\n console.log(\"switched to immersiveMode\");\r\n }, function () {\r\n console.log(\"failed to switch to immersiveMode\");\r\n });\r\n }\r\n navigator.splashscreen.hide();\r\n }\r\n}\r\n\nvar utilli = utilli || {};\r\n\r\nutilli.createResendTimer = function ($scope) {\r\n var timer = {};\r\n\r\n timer.isResendTimerVisible = function () {\r\n return timer.canShowTimer && !timer.sendSmsCodeError;\r\n }\r\n\r\n var tickTimer = function () {\r\n if (timer.timeout != 0) {\r\n timer.timeout--;\r\n setTimeout(tickTimer, 1000);\r\n } else {\r\n timer.canRequestVerificationCode = true;\r\n timer.canShowTimer = false;\r\n if($scope != undefined && !$scope.$$phase) //https://stackoverflow.com/a/12859093/6160271\r\n $scope.$apply();\r\n return;\r\n }\r\n\r\n var secInMinute = 60;\r\n timer.canShowTimer = true;\r\n timer.timeoutStr = '' + (timer.timeout % secInMinute); //60 seconds in 1 minute\r\n if (timer.timeoutStr.length < 2) {\r\n timer.timeoutStr = '0' + timer.timeoutStr;\r\n }\r\n timer.timeoutStrMinutes = '' + Math.floor(timer.timeout / secInMinute);\r\n if (timer.timeoutStrMinutes.length < 1) {\r\n timer.timeoutStrMinutes = '0';\r\n }\r\n if($scope != undefined && !$scope.$$phase) //https://stackoverflow.com/a/12859093/6160271\r\n $scope.$apply();\r\n }\r\n\r\n timer.startSmsConfirmationTimer = function startSmsConfirmationTimer (remainedTime) {\r\n if(remainedTime)\r\n timer.timeout = remainedTime;\r\n else\r\n timer.timeout = 31;\r\n\r\n tickTimer();\r\n }\r\n\r\n return timer;\r\n}\n'use strict';\r\n/* Global configuration settings */\r\nif (!window.Config) {\r\n\r\n localStorage.setItem('CurrentUtilityType', 'Electricity'); // this is for demo for PX\r\n\r\n window.Config =\r\n {\r\n version: \"0.4.1\",\r\n Debug: false,\r\n serverErrorMsg: \"Service unavailable, please try again later.\",\r\n consumptionUnits: {\r\n // numbers mean multipliers on which consumption must be multiplied\r\n // to get consumption in that units.\r\n // CCF: 1 means that we get consumption from the backend in CCFs\r\n // and do not need to multiply anything to show consumption in CCFs\r\n // Gallons: 748.05 means that we get consumption from the backend in CCFs\r\n // and need to multiply it by 748.05 to show consumption in Gallons\r\n Water: { CCF: 1, Gallons: 748.05 },\r\n Electricity: { kWh: 1 },\r\n Gas: { MCF: 1, CCF: 10, Therms: 10.28 }\r\n },\r\n /**\r\n * Gets consumption units that are currently configured\r\n */\r\n getCurrentConsumptionUnits: function() {\r\n var utilliType = localStorage.getItem('CurrentUtilityType');\r\n utilliType = !utilliType || utilliType === 'null' || utilliType === 'undefined' ? \"Gas\" : utilliType;\r\n return Config.consumptionUnits[utilliType];\r\n },\r\n /**\r\n * Gets multiplier for the specified consumption unit\r\n */\r\n getConsumptionUnitFraction: function(unitsType) {\r\n return Config.getCurrentConsumptionUnits()[unitsType];\r\n },\r\n /**\r\n * If false, hide the View button and the Understand Your Bill button.\r\n */\r\n enableBillDownload: true,\r\n smallConvenienceFee: 2.95,\r\n largeConvenienceFee: 12.95,\r\n largeConvenienceFeeBorder: 600,\r\n\r\n phoneNumberMask: \"+1 (999) 999-9999\",\r\n contractAccountMask: \"999999999999\",\r\n phoneNumberLengthWithoutCountryCode: 10,\r\n countryCodeLength: 1,\r\n ccNumberMask: \"9999 9999 9999? 9999 999\",\r\n contractAccountMaxLength: 12,\r\n passwdMinLength: 8,\r\n\r\n zipCodeRegexp: /^(\\d{5})?$|^$|^(\\d{5}-\\d{4})?$/,\r\n emailPattern: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\r\n\r\n // value for mobile app\r\n enableLanguagePack: \"calculated below\",\r\n\r\n maxMetersOnStackedDashboard: 15,\r\n wglProviderName: 'Wgl',\r\n wglcxProviderName: 'Wglcx',\r\n hcProviderName: 'Hc',\r\n pxProviderName: 'Px',\r\n\r\n // the below info exists on server and it's not good to duplicate it here,\r\n // but i want welcome page to load fast, so i don't want to pull these data from server\r\n providers: {\r\n \"Neo\": {\r\n \"Name\": \"NEO Natural Gas\",\r\n \"SiteName\": \"Northeast Ohio Natural Gas\",\r\n \"HelpEmail\": \"billpay@neogas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableOutageMap\": false,\r\n \"EnableLanguagePack\": false,\r\n \"providersGroupShortName\": \"gni\"\r\n },\r\n \"Orwell\": {\r\n \"Name\": \"Orwell Natural Gas\",\r\n \"SiteName\": \"Orwell Natural Gas\",\r\n \"HelpEmail\": \"billpay@orwellgas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableOutageMap\": false,\r\n \"EnableLanguagePack\": false,\r\n \"providersGroupShortName\": \"gni\"\r\n },\r\n \"Ewst\": {\r\n \"Name\": \"Ewst Natural Gas\",\r\n \"SiteName\": \"Energy West Montana\",\r\n \"HelpEmail\": \"billpay@ewst.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableOutageMap\": false,\r\n \"EnableLanguagePack\": false,\r\n \"providersGroupShortName\": \"gni\"\r\n },\r\n \"Wgl\": {\r\n \"Name\": \"Washington Gas\",\r\n \"SiteName\": \"Washington Gas\",\r\n \"HelpEmail\": \"aggregateddata@washgas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": false,\r\n \"EnableLanguagePack\": true,\r\n \"EnablePropertyManagerLink\": DeploymentSettings.deploymentEnvironment !== \"Prod\",\r\n \"SupportPhoneNumber\": \"123-123-1234\",\r\n \"providersGroupShortName\": \"wgl\"\r\n },\r\n \"Wglcx\": {\r\n \"Name\": \"Washington Gas\",\r\n \"SiteName\": \"Washington Gas\",\r\n \"HelpEmail\": \"aggregateddata@washgas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": false,\r\n \"EnableLanguagePack\": true,\r\n \"EnablePropertyManagerLink\": DeploymentSettings.deploymentEnvironment !== \"Prod\",\r\n \"SupportPhoneNumber\": \"123-123-1234\",\r\n \"providersGroupShortName\": \"wglcx\"\r\n },\r\n \"Px\": {\r\n \"Name\": \"Property Experience\",\r\n \"SiteName\": \"Utilli PX\",\r\n \"HelpEmail\": \"px@utilli.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": false,\r\n \"EnableLanguagePack\": true,\r\n \"EnablePropertyManagerLink\": DeploymentSettings.deploymentEnvironment !== \"Prod\",\r\n \"SupportPhoneNumber\": \"123-123-1234\",\r\n \"providersGroupShortName\": \"px\"\r\n },\r\n \"Bangor\": {\r\n \"Name\": \"Bangor Natural Gas\",\r\n \"SiteName\": \"Bangor Natural Gas\",\r\n \"HelpEmail\": \"billpay@bangorgas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableOutageMap\": false,\r\n \"EnableLanguagePack\": false,\r\n \"providersGroupShortName\": \"gni\"\r\n },\r\n \"Frontier\": {\r\n \"Name\": \"Frontier Natural Gas\",\r\n \"SiteName\": \"Frontier Natural Gas\",\r\n \"HelpEmail\": \"billpay@frontiernaturalgas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableOutageMap\": false,\r\n \"EnableLanguagePack\": false,\r\n \"providersGroupShortName\": \"gni\"\r\n },\r\n \"Hc\": {\r\n \"Name\": \"Howard County\",\r\n \"SiteName\": \"Howard County\",\r\n \"HelpEmail\": \"billing@howardcountymd.gov\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableLanguagePack\": true,\r\n \"providersGroupShortName\": \"hc\"\r\n },\r\n \"DemoProvider\": {\r\n \"Name\": \"Utilli Demo\",\r\n \"SiteName\": \"Utilli Demo\",\r\n \"HelpEmail\": \"info@utilli.com\",\r\n \"EnableOutageMap\": true,\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableLanguagePack\": true,\r\n },\r\n \"SapDemoProvider\": {\r\n \"Name\": \"Utilli SAP Demo\",\r\n \"SiteName\": \"Utilli SAP Demo\",\r\n \"HelpEmail\": \"info@utilli.com\",\r\n \"EnableOutageMap\": true,\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableLanguagePack\": true,\r\n }\r\n },\r\n appUrls: {\r\n android: \"https://play.google.com/store/apps/details?id=com.utilli.UtilliMobile\",\r\n iOs: \"https://itunes.apple.com/us/app/howard-county-utilli/id905053011\",\r\n winPhone: \"https://www.microsoft.com/en-us/store/apps/utilli-mobile/9nblggh5k7fw\"\r\n }\r\n \r\n };\r\n\r\n Config.wglProvidersGroupShortName = Config.providers[Config.wglProviderName].providersGroupShortName;\r\n Config.hcProvidersGroupShortName = Config.providers[Config.hcProviderName].providersGroupShortName;\r\n Config.pxProvidersGroupShortName = Config.providers[Config.pxProviderName].providersGroupShortName;\r\n Config.ProdDeploymentType = 'Prod';\r\n Config.QaDeploymentType = 'Qa';\r\n Config.StagingDeploymentType = 'Staging';\r\n Config.DevDeploymentType = 'Dev';\r\n}\r\n\nwindow.Config.states = [\r\n{ name: 'ALABAMA', abbreviation: 'AL' },\r\n{ name: 'ALASKA', abbreviation: 'AK' },\r\n{ name: 'AMERICAN SAMOA', abbreviation: 'AS' },\r\n{ name: 'ARIZONA', abbreviation: 'AZ' },\r\n{ name: 'ARKANSAS', abbreviation: 'AR' },\r\n{ name: 'CALIFORNIA', abbreviation: 'CA' },\r\n{ name: 'COLORADO', abbreviation: 'CO' },\r\n{ name: 'CONNECTICUT', abbreviation: 'CT' },\r\n{ name: 'DELAWARE', abbreviation: 'DE' },\r\n{ name: 'DISTRICT OF COLUMBIA', abbreviation: 'DC' },\r\n{ name: 'FEDERATED STATES OF MICRONESIA', abbreviation: 'FM' },\r\n{ name: 'FLORIDA', abbreviation: 'FL' },\r\n{ name: 'GEORGIA', abbreviation: 'GA' },\r\n{ name: 'GUAM', abbreviation: 'GU' },\r\n{ name: 'HAWAII', abbreviation: 'HI' },\r\n{ name: 'IDAHO', abbreviation: 'ID' },\r\n{ name: 'ILLINOIS', abbreviation: 'IL' },\r\n{ name: 'INDIANA', abbreviation: 'IN' },\r\n{ name: 'IOWA', abbreviation: 'IA' },\r\n{ name: 'KANSAS', abbreviation: 'KS' },\r\n{ name: 'KENTUCKY', abbreviation: 'KY' },\r\n{ name: 'LOUISIANA', abbreviation: 'LA' },\r\n{ name: 'MAINE', abbreviation: 'ME' },\r\n{ name: 'MARSHALL ISLANDS', abbreviation: 'MH' },\r\n{ name: 'MARYLAND', abbreviation: 'MD' },\r\n{ name: 'MASSACHUSETTS', abbreviation: 'MA' },\r\n{ name: 'MICHIGAN', abbreviation: 'MI' },\r\n{ name: 'MINNESOTA', abbreviation: 'MN' },\r\n{ name: 'MISSISSIPPI', abbreviation: 'MS' },\r\n{ name: 'MISSOURI', abbreviation: 'MO' },\r\n{ name: 'MONTANA', abbreviation: 'MT' },\r\n{ name: 'NEBRASKA', abbreviation: 'NE' },\r\n{ name: 'NEVADA', abbreviation: 'NV' },\r\n{ name: 'NEW HAMPSHIRE', abbreviation: 'NH' },\r\n{ name: 'NEW JERSEY', abbreviation: 'NJ' },\r\n{ name: 'NEW MEXICO', abbreviation: 'NM' },\r\n{ name: 'NEW YORK', abbreviation: 'NY' },\r\n{ name: 'NORTH CAROLINA', abbreviation: 'NC' },\r\n{ name: 'NORTH DAKOTA', abbreviation: 'ND' },\r\n{ name: 'NORTHERN MARIANA ISLANDS', abbreviation: 'MP' },\r\n{ name: 'OHIO', abbreviation: 'OH' },\r\n{ name: 'OKLAHOMA', abbreviation: 'OK' },\r\n{ name: 'OREGON', abbreviation: 'OR' },\r\n{ name: 'PALAU', abbreviation: 'PW' },\r\n{ name: 'PENNSYLVANIA', abbreviation: 'PA' },\r\n{ name: 'PUERTO RICO', abbreviation: 'PR' },\r\n{ name: 'RHODE ISLAND', abbreviation: 'RI' },\r\n{ name: 'SOUTH CAROLINA', abbreviation: 'SC' },\r\n{ name: 'SOUTH DAKOTA', abbreviation: 'SD' },\r\n{ name: 'TENNESSEE', abbreviation: 'TN' },\r\n{ name: 'TEXAS', abbreviation: 'TX' },\r\n{ name: 'UTAH', abbreviation: 'UT' },\r\n{ name: 'VERMONT', abbreviation: 'VT' },\r\n{ name: 'VIRGIN ISLANDS', abbreviation: 'VI' },\r\n{ name: 'VIRGINIA', abbreviation: 'VA' },\r\n{ name: 'WASHINGTON', abbreviation: 'WA' },\r\n{ name: 'WEST VIRGINIA', abbreviation: 'WV' },\r\n{ name: 'WISCONSIN', abbreviation: 'WI' },\r\n{ name: 'WYOMING', abbreviation: 'WY' }\r\n];\nString.prototype.getTime = function () {\r\n var dateString = this;\r\n var date = dateString.split(\"/\");\r\n // month in JS is index in array of 12 months. Transform the month number to the index.\r\n var month = parseInt(date[0]) - 1;\r\n return (new Date(date[2], month, date[1])).getTime();\r\n};\r\n\r\nString.prototype.getPositiveAmount = function () {\r\n var amountString = this;\r\n var amount = parseFloat(amountString);\r\n if(amount < 0) {\r\n amount = Math.abs(amount);\r\n }\r\n return amount.toString();\r\n};\r\n\r\nif (!String.prototype.repeat) {\r\n String.prototype.repeat = function(count) {\r\n 'use strict';\r\n if (this == null) {\r\n throw new TypeError('can\\'t convert ' + this + ' to object');\r\n }\r\n var str = '' + this;\r\n count = +count;\r\n if (count != count) {\r\n count = 0;\r\n }\r\n if (count < 0) {\r\n throw new RangeError('repeat count must be non-negative');\r\n }\r\n if (count == Infinity) {\r\n throw new RangeError('repeat count must be less than infinity');\r\n }\r\n count = Math.floor(count);\r\n if (str.length == 0 || count == 0) {\r\n return '';\r\n }\r\n // Ensuring count is a 31-bit integer allows us to heavily optimize the\r\n // main part. But anyway, most current (August 2014) browsers can't handle\r\n // strings 1 << 28 chars or longer, so:\r\n if (str.length * count >= 1 << 28) {\r\n throw new RangeError('repeat count must not overflow maximum string size');\r\n }\r\n var maxCount = str.length * count;\r\n count = Math.floor(Math.log(count) / Math.log(2));\r\n while (count) {\r\n str += str;\r\n count--;\r\n }\r\n str += str.substring(0, maxCount - str.length);\r\n return str;\r\n }\r\n}\r\n\r\n// https://github.com/uxitten/polyfill/blob/master/string.polyfill.js\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\r\nif (!String.prototype.padStart) {\r\n String.prototype.padStart = function padStart(targetLength,padString) {\r\n targetLength = targetLength>>0; //truncate if number or convert non-number to 0;\r\n padString = String((typeof padString !== 'undefined' ? padString : ' '));\r\n if (this.length > targetLength) {\r\n return String(this);\r\n }\r\n else {\r\n targetLength = targetLength-this.length;\r\n if (targetLength > padString.length) {\r\n padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed\r\n }\r\n return padString.slice(0,targetLength) + String(this);\r\n }\r\n };\r\n}\n'use strict';\r\nvar provide;\r\nvar dependencies = ['credit-cards', 'infinite-scroll',\r\n 'angularSpinner', 'angularModalService', 'ngSanitize', 'ngIOS9UIWebViewPatch',\r\n 'commonServices', 'ui.router', 'ct.ui.router.extras', 'ui.mask',\r\n 'ui.bootstrap', 'ngResource'];\r\nif(!utilli.isWglcxPortal())\r\n dependencies.push('kendo.directives');\r\nangular.module('utilliApp', dependencies)\r\n .factory('authorizeInterceptor', function () {\r\n return {\r\n request: function (config) {\r\n\r\n // IMPORTANT: for static resources such as maintenance.html don't add params because the template can \r\n // be embedded into index.html and angular will not resolve it when parameters are added and will try\r\n // to download from the server while the server can be down\r\n if (!config.url.startsWith('http://') && !config.url.startsWith('https://'))\r\n return config;\r\n\r\n config.params = config.params || {};\r\n config.params['clientVersion'] = DeploymentSettings.clientVersion;\r\n \r\n var language = localStorage.getItem('language');\r\n if (utilli.checkDefinedValue(language)) {\r\n config.params['lang'] = language;\r\n } else {\r\n config.params['lang'] = 'en';\r\n }\r\n\r\n var token = localStorage.getItem('SecurityToken');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n if (token && !config.withoutAuthentication \r\n // we need to add token only if the user is already logged in (ApiUrl exists in localStorage then)\r\n // and the request is to api (not providers web api)\r\n && apiUrl && config.url.startsWith(apiUrl)) {\r\n config.headers['Authorization'] = token;\r\n }\r\n return config;\r\n }\r\n }\r\n })\r\n .factory('httpInterceptor', ['$q', '$injector', 'RequestService', function ($q, $injector, RequestService) {\r\n function saveEmptyParametersOf(request) {\r\n if (request.params && angular.isObject(request.params)) {\r\n var keys = Object.keys(request.params);\r\n angular.forEach(keys, function (item) {\r\n var value = request.params[item];\r\n if (value === null || angular.isUndefined(value)) {\r\n // assign null or undefined properties with empty string - \r\n // in that case empty params are included into the url.\r\n request.params[item] = '';\r\n }\r\n });\r\n }\r\n }\r\n\r\n function notAuthenticatedRequest(url) {\r\n //if url starts with null it means localStorage.getItem('ApiUrl') is null \r\n //that means it is not authenticated user\r\n var result = url.startsWith('null');\r\n return result;\r\n }\r\n\r\n function isZeroStatusResponse(response) {\r\n var result = response.status <= 0\r\n && (!response.config.timeout || response.config.timeout.status != 499) //499 - client cancelled request, it is initialized in RequestService.abort().\r\n && !notAuthenticatedRequest(response.config.url);\r\n return result;\r\n }\r\n\r\n function pingProvidersApi(fnCallback) {\r\n $.ajax({\r\n url: DeploymentSettings.providersServiceUrl + 'Version/Ping',\r\n method: 'GET'\r\n })\r\n .fail(function (e) {\r\n console.log(e);\r\n if(fnCallback)\r\n fnCallback();\r\n });\r\n }\r\n\r\n var reload = function(state, newUrl) {\r\n newUrl = newUrl ? newUrl : '';\r\n // i use window.location here instead of state.go because i want to force BROWSER \r\n // to reload the whole page and get source code updates from our web server.\r\n // note: state.current.url returns not full relative url, for example, for \r\n // the view \"TopMenuLayout.SignUpPropertyManager.Step2\" it returns \"/SignUpPropertyManagerStep2\"\r\n // instead of \"#/SignUpPropertyManager/SignUpPropertyManagerStep2\"\r\n var indexOfIndex = window.location.href.indexOf('index.html');\r\n var newLocation = window.location.href;\r\n if (indexOfIndex > 0) {\r\n newLocation = newLocation.substr(0, indexOfIndex);\r\n }\r\n else {\r\n var relativeUrl = state.href(state.current.name);\r\n var indexOfRelativeUrl = newLocation.indexOf(relativeUrl);\r\n if (indexOfRelativeUrl > 0) {\r\n newLocation = newLocation.substr(0, indexOfRelativeUrl);\r\n }\r\n }\r\n if (utilli.isAdmin) {\r\n var indexOfAdmin = newLocation.indexOf('Admin/');\r\n if (indexOfAdmin > 0) {\r\n newLocation = newLocation.substr(0, indexOfAdmin);\r\n }\r\n }\r\n utilli.setWindowLocation(newLocation + newUrl);\r\n }\r\n\r\n //find web api url that match with current request url\r\n //for example the current request url is https://apidev.utilli.com/hc/api/System/Check\r\n //we get the https://apidev.utilli.com/hc/api/ as result\r\n var getServiceProviderUrl = function (requestUrl) {\r\n var deferred = $q.defer();\r\n\r\n $.ajax({\r\n url: DeploymentSettings.providersServiceUrl + 'Providers/GetProvidersAvailability',\r\n method: 'GET'\r\n })\r\n .done(function (providers) {\r\n if (!providers || providers.length == 0) {\r\n deferred.reject(\"We cannot get providers list from web api providers.\");\r\n return;\r\n }\r\n var providerInfo = _.find(providers, function(provider){ \r\n return requestUrl.indexOf(provider.ApiUrl) !== -1; \r\n });\r\n\r\n deferred.resolve(providerInfo);\r\n })\r\n .fail(function (e) {\r\n deferred.reject(e);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n var responseInterceptor = {\r\n request: function (request) {\r\n if (notAuthenticatedRequest(request.url)) {\r\n RequestService.forcedAbort(request);\r\n utilli.clearLocalStorage();\r\n var stateService = $injector.get('$state');\r\n stateService.goToSignIn(true);\r\n return request;\r\n }\r\n if (request.url.indexOf(\".html\") != -1 && !$injector.get('$templateCache').get(request.url))\r\n request.url += DeploymentSettings.currentVersion;\r\n RequestService.add(request);\r\n saveEmptyParametersOf(request);\r\n return request;\r\n },\r\n response: function (response) {\r\n\r\n // if generation was not changed on the server the value of 'ValidGeneration' header is 'Valid'.\r\n // Otherwise header is 'NotValid'. If header is null then generation was not checked on the server.\r\n var header = response.headers('ValidGeneration');\r\n if (header != null && header !== 'Valid') {\r\n var modalService = $injector.get('ModalServiceExt');\r\n modalService.showMessage(\r\n utilli._t('Notification'), \r\n utilli._t('Your session has expired. You must login again to continue.'), \r\n function () {\r\n var state = $injector.get('$state');\r\n if (isMobileOrRipple()) {\r\n state.goToSignIn();\r\n return response;\r\n }\r\n console.log('Redirect to login page because security token generation is obsolete.');\r\n RequestService.abort();\r\n utilli.clearLocalStorage();\r\n reload(state);\r\n return response;\r\n }\r\n );\r\n }\r\n\r\n return response;\r\n },\r\n responseError: function (response) {\r\n\r\n var stateService = $injector.get('$state');\r\n\r\n // 401 error code is thrown when user is not authorized (token is wrong or expired).\r\n if (response.status == 401) {\r\n var modalService = $injector.get('ModalServiceExt');\r\n modalService.showMessage(utilli._t('Notification'), utilli._t('You are not logged in or your session has expired. Please login to continue.'), function () {\r\n console.log('Redirect to login page because security token is not valid.');\r\n RequestService.abort();\r\n\r\n //Yuriy Sokha: I want this redirect to always work. It is required for Bot Authorization.\r\n stateService.goToSignIn(true);\r\n\r\n utilli.clearLocalStorage();\r\n return response;\r\n });\r\n }\r\n\r\n if (response.status == 403) {\r\n var header = response.headers('Client-Version');\r\n if (header != null && header === 'not-valid') {\r\n //setTimeout(function(){\r\n var modalService = $injector.get('ModalServiceExt');\r\n modalService.showMessage(\r\n utilli._t('Notification'), \r\n utilli._t(\"Current page is outdated. Please refresh to continue.\"), \r\n function () {\r\n var state = $injector.get('$state');\r\n if (isMobileOrRipple()) {\r\n localStorage.setItem('forcedUpdateMobile', true);\r\n reload(state, 'UpdateMobile.html');\r\n return response;\r\n }\r\n console.log('Refreshing because page is outdated.');\r\n RequestService.abort();\r\n reload(state);\r\n return response;\r\n }\r\n );\r\n //}, 100);\r\n }\r\n }\r\n\r\n // 503 error code is thrown when maintenance is required.\r\n if (response.status == 503) {\r\n console.log('Redirect to maintenance page.');\r\n RequestService.abort();\r\n stateService.goToMaintenance();\r\n return response;\r\n }\r\n\r\n if(isZeroStatusResponse(response))\r\n {\r\n var usSpinnerService = $injector.get('usSpinnerService');\r\n getServiceProviderUrl(response.config.url)\r\n .then(function(providerInfo) {\r\n if (!providerInfo.IsAvailable) {\r\n console.log('Redirect to maintenance page.');\r\n usSpinnerService.stop('spinner-1');\r\n usSpinnerService.stop('spinner-admin');\r\n RequestService.abort();\r\n stateService.goToMaintenance();\r\n }\r\n }, function (e) {\r\n console.log(e);\r\n pingProvidersApi(function () {\r\n usSpinnerService.stop('spinner-1');\r\n usSpinnerService.stop('spinner-admin');\r\n if (!window.disableNoConnectionPage){\r\n stateService.go('NoConnection');\r\n }\r\n });\r\n });\r\n\r\n }\r\n\r\n return $q.reject(response);\r\n }\r\n }\r\n\r\n return responseInterceptor;\r\n }\r\n ])\r\n .config(['$compileProvider', '$stateProvider', '$urlRouterProvider', '$stickyStateProvider', '$httpProvider',\r\n '$locationProvider',\r\n function ($compileProvider, $stateProvider, $urlRouterProvider, $stickyStateProvider, $httpProvider, \r\n $locationProvider) {\r\n //$location.hashPrefix('');\r\n $locationProvider.html5Mode(false).hashPrefix('');\r\n\r\n $stickyStateProvider.enableDebug(true);\r\n // http://stackoverflow.com/a/23110108/292787\r\n // http://stackoverflow.com/questions/24246464/display-images-through-html-img-tag-with-angularjs-and-ionic\r\n // for windows phone also x-wmapp: http://stackoverflow.com/a/29625730/292787\r\n $compileProvider.imgSrcSanitizationWhitelist(/^\\s*(https?|ftp|mailto|chrome-extension|file|ms-appx|x-wmapp.?):/);\r\n\r\n $httpProvider.interceptors.push('httpInterceptor');\r\n $httpProvider.interceptors.push('authorizeInterceptor');\r\n\r\n // routing configuration below uses angular-ui-router, and ui-router-extras\r\n // see examples at :\r\n // http://plnkr.co/edit/bEdJczNwYEfTI7joyh9h?p=preview\r\n // http://plnkr.co/edit/bFMLqLENmPFfCD0XCz8V?p=preview\r\n // http://plnkr.co/edit/rIxTa9DyOB2jsk8lpE1h?p=preview\r\n if (!utilli.isAdmin) {\r\n $urlRouterProvider.otherwise('/');\r\n }\r\n\r\n function isParamsArray(params) {\r\n var result = Object.prototype.toString.call(params) === '[object Array]';\r\n return result;\r\n }\r\n\r\n function getCommonHeaderViewsConfiguration(stateName, parentFolder) {\r\n var pagesPath = utilli.isAdmin ? '../' : '';\r\n parentFolder = parentFolder ? parentFolder += '/' : ''\r\n return {\r\n \"top-menu\": {\r\n templateUrl: pagesPath + 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: pagesPath + 'Pages/' + parentFolder + stateName + '/' + stateName + '.html',\r\n controller: stateName + 'Controller'\r\n }\r\n };\r\n }\r\n\r\n var registerForLayoutStateWithCommonHeader = function (stateName, params, layout, parentFolder) {\r\n var url = utilli.isAdmin ? '/Customer/:userId/:contractAccountNumber/:propertyManager/' + stateName\r\n : '/' + stateName;\r\n if (isParamsArray(params)) {\r\n //we use it for keeping parameters into url\r\n if (params && params.length > 0) {\r\n params.forEach(function (item) {\r\n url += '/:' + item;\r\n });\r\n }\r\n }\r\n $stateProvider.state(layout + '.' + stateName, {\r\n url: url,\r\n views: getCommonHeaderViewsConfiguration(stateName, parentFolder),\r\n params: isParamsArray(params) ? null : params\r\n });\r\n };\r\n\r\n var registerPropertyManagerRoute = function (stateName, params, parentFolder) {\r\n var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n var url = utilli.isAdmin ? '/PropertyManager/:userId/:propertyManager/' + stateName\r\n : '/' + stateName;\r\n if (isParamsArray(params)) {\r\n //we use it for keeping parameters into url\r\n if (params && params.length > 0) {\r\n params.forEach(function (item) {\r\n url += '/:' + item;\r\n });\r\n }\r\n }\r\n $stateProvider.state(layout + '.' + stateName, {\r\n url: url,\r\n views: getCommonHeaderViewsConfiguration(stateName, parentFolder),\r\n params: isParamsArray(params) ? null : params\r\n });\r\n };\r\n\r\n function registerRelative(mainFolder, stateName, params) {\r\n var pagesPath = utilli.isAdmin ? '../' : '';\r\n var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n var url = utilli.isAdmin ? '/Customer/:userId/:contractAccountNumber/:propertyManager/' + stateName\r\n : '/' + stateName;\r\n $stateProvider.state(layout + '.' + stateName, {\r\n url: url,\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: pagesPath + 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: pagesPath + 'Pages/' + mainFolder + '/' + stateName + '.html',\r\n controller: stateName + 'Controller'\r\n }\r\n },\r\n params: params\r\n });\r\n }\r\n\r\n var registerStateWithCommonHeader = function (stateName, params, parentFolder) {\r\n var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n registerForLayoutStateWithCommonHeader(stateName, params, layout, parentFolder);\r\n };\r\n\r\n var registerForTopMenuLayout = function (stateName, params) {\r\n registerForLayoutStateWithCommonHeader(stateName, params, 'TopMenuLayout');\r\n };\r\n\r\n var registerForgotPasswordRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotPassword', {\r\n url: '/ForgotPassword',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotPassword/ForgotPasswordHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotPassword/ForgotPassword.html',\r\n controller: 'ForgotPasswordController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPassword.Step1', {\r\n url: '/ForgotPasswordStep1',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPassword/Step1.html',\r\n controller: 'ForgotPasswordStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPassword.Step2', {\r\n url: '/ForgotPasswordStep2',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPassword/Step2.html',\r\n controller: 'ForgotPasswordStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPassword.Success', {\r\n url: '/ForgotPasswordSuccess',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPassword/Success.html'\r\n }\r\n }\r\n });\r\n }\r\n\r\n var registerForgotPasswordByEmailRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotPasswordByEmail', {\r\n url: '/ForgotPasswordByEmail',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/ForgotPasswordByEmailHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/ForgotPasswordByEmail.html',\r\n controller: 'ForgotPasswordByEmailController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPasswordByEmail.Step1', {\r\n url: '/ForgotPasswordByEmailStep1/?from',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/Step1.html',\r\n controller: 'ForgotPasswordByEmailStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPasswordByEmail.Success', {\r\n url: '/ForgotPasswordByEmailSuccess',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/Success.html',\r\n controller: 'ForgotPasswordByEmailSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n var registerForgotUserIdRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotUserId', {\r\n url: '/ForgotUserId',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotUserId/ForgotUserIdHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotUserId/ForgotUserId.html',\r\n controller: 'ForgotUserIdController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserId.Step1', {\r\n url: '/ForgotUserIdStep1',\r\n views: {\r\n \"ForgotUserIdSteps\": {\r\n templateUrl: 'Pages/ForgotUserId/Step1.html',\r\n controller: 'ForgotUserIdStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserId.Step2', {\r\n url: '/ForgotUserIdStep2',\r\n views: {\r\n \"ForgotUserIdSteps\": {\r\n templateUrl: 'Pages/ForgotUserId/Step2.html',\r\n controller: 'ForgotUserIdStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserId.Success', {\r\n url: '/ForgotUserIdSuccess',\r\n views: {\r\n \"ForgotUserIdSteps\": {\r\n templateUrl: 'Pages/ForgotUserId/Success.html',\r\n controller: 'ForgotUserIdSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n var registerForgotUserIdByEmailRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotUserIdByEmail', {\r\n url: '/ForgotUserIdByEmail',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/ForgotUserIdByEmailHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/ForgotUserIdByEmail.html',\r\n controller: 'ForgotUserIdByEmailController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserIdByEmail.Step1', {\r\n url: '/Step1/?from',\r\n views: {\r\n \"ForgotUserIdByEmailSteps\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/Step1.html',\r\n controller: 'ForgotUserIdByEmailStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserIdByEmail.Success', {\r\n url: '/Success',\r\n views: {\r\n \"ForgotUserIdByEmailSteps\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/Success.html',\r\n controller: 'ForgotUserIdByEmailSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (!utilli.isAdmin) {\r\n $stateProvider.state('TopMenuLayout', {\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/TopMenuLayout.html'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Languages', {\r\n url: '/WelcomeLanguages',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Languages/Languages.html',\r\n controller: 'LanguagesController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('MainLayout', {\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/MainLayout.html',\r\n controller: 'MainLayoutController'\r\n }\r\n }\r\n });\r\n }\r\n registerStateWithCommonHeader('Dashboard');\r\n registerStateWithCommonHeader('PayNow', ['AccountNumber']);//we use this url in TaksRunner\r\n registerStateWithCommonHeader('Usage');\r\n registerStateWithCommonHeader('BillsAndPayments');\r\n registerStateWithCommonHeader('BillDetails', ['billNumber']);\r\n registerStateWithCommonHeader('PaymentOptions');\r\n registerStateWithCommonHeader('AddCard');\r\n registerStateWithCommonHeader('AddBankAccount');\r\n registerStateWithCommonHeader('BankAccount', ['Id']);\r\n registerStateWithCommonHeader('Card', ['Id']);\r\n registerStateWithCommonHeader('PayByCard');\r\n registerStateWithCommonHeader('PayByBtc');\r\n registerStateWithCommonHeader('PayByCheck');\r\n registerStateWithCommonHeader('PayByCheckConfirmation');\r\n registerStateWithCommonHeader('NotificationDetails', ['Id']);\r\n registerStateWithCommonHeader('UserNotifications');\r\n registerStateWithCommonHeader('AccountList', ['redirectIfSingle']);\r\n registerStateWithCommonHeader('MoveService');\r\n registerStateWithCommonHeader('CancelService');\r\n registerStateWithCommonHeader('CancelSuccess');\r\n registerStateWithCommonHeader('ChangePassword');\r\n registerStateWithCommonHeader('DonationHistory');\r\n registerStateWithCommonHeader('BudgetBillingLearnMore');\r\n registerStateWithCommonHeader('BudgetBilling');\r\n registerStateWithCommonHeader('AddAccount');\r\n registerStateWithCommonHeader('EditAccounts');\r\n registerStateWithCommonHeader('Faqs', ['directDebitParam', 'donationParam']);\r\n registerStateWithCommonHeader('EnrollCardMessage', ['Id']);\r\n registerStateWithCommonHeader('EnrollBankAccountMessage', ['Id']);\r\n registerStateWithCommonHeader('UnenrollCardMessage', ['Id']);\r\n registerStateWithCommonHeader('UnenrollBankAccountMessage', ['Id']);\r\n registerStateWithCommonHeader('Profile');\r\n registerStateWithCommonHeader('MobilePhoneConfirmation', ['forProgramEnrollments', 'forProgramEnrollmentsLearnMore', 'phoneNumber']);\r\n registerStateWithCommonHeader('Avatars', ['forAgent', 'forAssistant', 'forPropertyManager']);\r\n registerStateWithCommonHeader('OutageCenter');\r\n registerStateWithCommonHeader('OutageMap');\r\n registerStateWithCommonHeader('TurnOffMap');\r\n registerStateWithCommonHeader('OutageList');\r\n registerStateWithCommonHeader('OutageSafety');\r\n registerStateWithCommonHeader('OutageHistory');\r\n registerStateWithCommonHeader('ReportOutage');\r\n registerStateWithCommonHeader('OpenOutageReport', ['Id', 'mode']);\r\n registerStateWithCommonHeader('MeterData');\r\n registerForTopMenuLayout('TermsAndConditions');//we use this url in TaksRunner\r\n registerForTopMenuLayout('SystemInfo');\r\n registerStateWithCommonHeader('AboutUs');\r\n registerStateWithCommonHeader('EnergyEfficiency');\r\n registerStateWithCommonHeader('Languages');\r\n\r\n registerStateWithCommonHeader('WorkCenters', ['redirectIfSingle']);\r\n registerStateWithCommonHeader('LookUp');\r\n registerStateWithCommonHeader('LookUpLog');\r\n registerStateWithCommonHeader('PaymentHistory');\r\n registerStateWithCommonHeader('WorkOrders');\r\n\r\n $stateProvider.state('MainLayout.TurnOffQuickPay', {\r\n // parent: 'MainLayout',\r\n url: '/QuickPay',\r\n views:\r\n {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/QuickPay/Step2.html',\r\n controller: 'QuickPayStep2Controller'\r\n }\r\n }\r\n });\r\n\r\n registerProgramEnrollmentsRoutes();\r\n\r\n function registerProgramEnrollmentsRoutes() {\r\n\r\n registerStateWithCommonHeader('ProgramEnrolments');\r\n\r\n registerRelative('ProgramEnrolments', 'DonationLearnMore');\r\n registerRelative('ProgramEnrolments', 'SmsNotificationsLearnMore');\r\n registerRelative('ProgramEnrolments', 'EmailNotificationsLearnMore');\r\n registerRelative('ProgramEnrolments', 'EBillingLearnMore');\r\n\r\n createWizard()\r\n .registerWizardRoot('DonationEnrollment','DonationEnrollmentSteps', 'ProgramEnrolments', { program: null })\r\n .registerWizardStep('DonationEnrollment', 'Step1')\r\n .registerWizardStep('RoundUpEnrollment', 'Success')\r\n .registerWizardStep('FixedAmountEnrollment', 'Step2')\r\n .registerWizardStep('FixedAmountEnrollment', 'Success')\r\n .registerWizardStep('PercentageEnrollment', 'Step2')\r\n .registerWizardStep('PercentageEnrollment', 'Success');\r\n }\r\n\r\n function createWizard() {\r\n var Wizard = function() {\r\n this.parentView = '';\r\n this.wizardRootStateName = '';\r\n this.parentDirectory = '';\r\n };\r\n\r\n Wizard.prototype.registerWizardRoot = function(wizardRoot, parentView, parentDirectory, params) {\r\n this.parentView = parentView;\r\n this.wizardRootStateName = wizardRoot;\r\n this.parentDirectory = parentDirectory;\r\n\r\n var pagesPath = utilli.isAdmin ? '../' : '';\r\n $stateProvider.state('MainLayout.' + this.wizardRootStateName, {\r\n url: '/' + this.wizardRootStateName,\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: pagesPath + 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/' + parentDirectory + '/' + this.wizardRootStateName + '/' + this.wizardRootStateName + '.html',\r\n controller: this.wizardRootStateName + 'StepsController'\r\n }\r\n },\r\n params: params || {}\r\n });\r\n return this;\r\n };\r\n\r\n Wizard.prototype.registerWizardStep = function(stateName, stepNumber, params) {\r\n var templateUrl = this.parentDirectory\r\n ? 'Pages/' + this.parentDirectory + '/'\r\n : 'Pages/';\r\n var views = {};\r\n views[this.parentView] = {\r\n templateUrl: templateUrl + this.wizardRootStateName + '/' + stateName + stepNumber + '.html',\r\n controller: stateName + stepNumber + 'Controller'\r\n }\r\n //MainLayout.DonationEnrollment.FixedAmountEnrollmentStep2\r\n $stateProvider.state('MainLayout.' + this.wizardRootStateName + '.' + stateName + stepNumber, {\r\n url: '/' + stateName + stepNumber,\r\n views: views,\r\n params: params || {}\r\n });\r\n return this;\r\n };\r\n\r\n var result = new Wizard();\r\n return result;\r\n }\r\n\r\n $stateProvider.state('TopMenuLayout.BotAuthorize', {\r\n url: '/BotAuthorize/:channelId/:clientId/:conversationId/:logoutRequired/:serviceUrl',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/BotAuthorize/BotAuthorize.html',\r\n controller: 'BotAuthorizeController'\r\n },\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n }\r\n });\r\n\r\n $stateProvider.state('ResetPassword', {\r\n url: '/ResetPassword/:token',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/ResetPassword/ResetPassword.html',\r\n controller: 'ResetPasswordController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('ChallengeEmailSucceed', {\r\n url: '/ChallengeEmailSucceed/:token',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/ChallengeEmailSucceed/ChallengeEmailSucceed.html',\r\n controller: 'ChallengeEmailSucceedController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('NonSupported', {\r\n url: '/NonSupported',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/NonSupported/NonSupported.html',\r\n controller: 'NonSupportedController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('UpdateApp', {\r\n url: '/UpdateApp',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/UpdateApp/Update.html',\r\n controller: 'UpdateAppController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('Subscription', {\r\n url: '/Subscription/:token',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/Subscription/Subscription.html',\r\n controller: 'SubscriptionController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('VerifyEmailOld', {\r\n url: '/VerifyEmail/:token', //VerifyEmail is used in EbapService\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/VerifyEmail/VerifyEmail.html',\r\n controller: 'VerifyEmailController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('VerifyEmail', {\r\n url: '/VerifyEmail?token', //VerifyEmail is used in EbapService\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/VerifyEmail/VerifyEmail.html',\r\n controller: 'VerifyEmailController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('ViewBillAccessOld', { //ViewBillAccess is used in BillUrlService\r\n url: '/ViewBillAccess/:token/:emailId',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/ViewBillAccess/ViewBillAccess.html',\r\n controller: 'ViewBillAccessController'\r\n }\r\n },\r\n params: {\r\n emailId: { squash: true, value: null }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.ViewBillAccess', { //ViewBillAccess is used in BillUrlService\r\n url: '/ViewBillAccess?token&emailId',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/ViewBillAccess/ViewBillAccess.html',\r\n controller: 'ViewBillAccessController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('ViewBill', {\r\n url: '/ViewBill?token&emailId',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/ViewBill/ViewBill.html',\r\n controller: 'ViewBillController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.InstallmentPlan', {\r\n //bbp=true if redirected from budget billing plan enrollment page and need to continue to bbp\r\n url: '/InstallmentPlan?token?bbp?directSrc?src?ct?lang',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/InstallmentPlan/InstallmentPlan.html',\r\n controller: 'InstallmentPlanController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.BudgetBillingWglcx', {\r\n url: '/BudgetBillingWglcx?token?directSrc?src?ct?lang',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/BudgetBillingWglcx/BudgetBillingWglcx.html',\r\n controller: 'BudgetBillingWglcxController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.BudgetBillingWglcxUnenrollment', {\r\n url: '/BudgetBillingWglcxUnenrollment?token?src?ct',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/BudgetBillingWglcxUnenrollment/BudgetBillingWglcxUnenrollment.html',\r\n controller: 'BudgetBillingWglcxUnenrollmentController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.Budget', {\r\n url: '/Budget?src?ct?lang',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/Budget/Budget.html',\r\n controller: 'BudgetController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.AgentPayments', {\r\n url: '/agent-payments?installationId',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/AgentPayments/AgentPayments.html',\r\n controller: 'AgentPaymentsController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.Dpp', {\r\n url: '/dpp?src?ct?lang',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/Dpp/Dpp.html',\r\n controller: 'DppController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('BudgetReport', {\r\n url: '/BudgetReport',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/BudgetReport/BudgetReport.html',\r\n controller: 'BudgetReportController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.CustomerValidation', {\r\n url: '/CustomerValidation?token',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/CustomerValidation/CustomerValidation.html',\r\n controller: 'CustomerValidationController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('NotMeOld', { //NotMe is used in EbapService\r\n url: '/NotMe/:token',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/NotMe/NotMe.html',\r\n controller: 'NotMeController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('NotMe', { //NotMe is used in EbapService\r\n url: '/NotMe?token',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/NotMe/NotMe.html',\r\n controller: 'NotMeController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('EnrollEBill', { // EnrollEBill is used in EbapService\r\n url: '/EnrollEBill/:token/:contractAccountNumber',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/EnrollEBill/EnrollEBill.html',\r\n controller: 'EnrollEBillController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('EnrollEBillAfterNotification', { \r\n url: '/EnrollEBillAfterNotification/:token',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/EnrollEBillAfterNotification/EnrollEBillAfterNotification.html',\r\n controller: 'EnrollEBillAfterNotificationController'\r\n }\r\n }\r\n });\r\n\r\n registerPropertyManagersRoutes();\r\n\r\n function registerPropertyManagersRoutes() {\r\n registerWelcomePropertyManagersRoutes();\r\n registerSignUpPropertyManagersRoutes();\r\n registerPropertyManagerRoute('GroupStackedDashboard', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyStackedDashboard', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyBarDashboard', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyDetailedDashboard', ['selectedPeriodString'], 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyManagerUsage', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyGroupList', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('AddPropertyGroup', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('EditPropertyGroup', ['propertyGroupId'], 'PropertyManagers');\r\n registerPropertyManagerRoute('Property', ['propertyId'], 'PropertyManagers');\r\n registerPropertyManagerRoute('EditProperty', ['id', 'showAuthorizationMetersWarning'], 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyList', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('ReasonsForNoScore', ['propertyId'], 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyManagerProfile', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('Billing', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyManagerBills', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyManagerBillDetails', ['id'], 'PropertyManagers');\r\n registerPropertyManagerRoute('PropertyManagerEnergyEfficiency', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('SendInvitation', ['propertyId'], 'PropertyManagers');\r\n registerPropertyManagerRoute('Authorizations', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('Invitations', ['propertyId'], 'PropertyManagers');\r\n registerPropertyManagerRoute('RecipientInvitationView', ['id', 'meterNumber'], 'PropertyManagers');\r\n registerPropertyManagerRoute('AddProperty', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('SharedAccounts', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('SendSharingAccountRequest', null, 'PropertyManagers');\r\n registerPropertyManagerRoute('SendSharingAccountRequestEmail', ['email'], 'PropertyManagers');\r\n registerPropertyManagerRoute(\r\n 'MeterNeedsApproval',\r\n ['propertyId', 'meterId', 'meterNumber', 'mode', 'stepsCount', 'step', 'from'],\r\n 'PropertyManagers');\r\n\r\n registerAddPropertyRoute('PropertyOverview');\r\n registerAddPropertyRoute('PropertyType');\r\n registerAddPropertyRoute('PropertyDetails', ['type']);\r\n registerAddPropertyRoute('AddMeters', ['topMeter']);\r\n registerAddPropertyRoute('AddGreenButtonMeters');\r\n registerAddPropertyRoute('BulkMetersInput');\r\n registerAddPropertyRoute('FailedMeters', ['topMeter']);\r\n registerAddPropertyRoute('Authorization');\r\n // code and state DataCustodianAuthorization parameters are optional and used when the user\r\n // gets redirected back to Utilli portal from Data Custodian web site.\r\n // code parameter is a secret that allows to get refresh and access tokens. \r\n // state parameter is used to identify user.\r\n registerAddPropertyRoute('DataCustodianAuthorization', ['code', 'state']);\r\n\r\n function registerAddPropertyRoute(stateName, params) {\r\n var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n var url = '/' + stateName + '/:id/:mode/:stepsCount/:step';\r\n\r\n if (isParamsArray(params)) {\r\n //we use it for keeping parameters into url\r\n if (params && params.length > 0) {\r\n params.forEach(function (item) {\r\n url += '/:' + item;\r\n });\r\n }\r\n }\r\n\r\n var pagesPath = utilli.isAdmin ? '../' : '';\r\n\r\n $stateProvider.state(layout + '.AddProperty.' + stateName, {\r\n url: url,\r\n views: {\r\n \"AddPropertySteps\": {\r\n templateUrl: pagesPath + 'Pages/PropertyManagers/AddProperty/' + stateName + '.html',\r\n controller: stateName + 'Controller'\r\n }\r\n },\r\n params: isParamsArray(params) ? null : params\r\n });\r\n }\r\n\r\n function registerAddPropertyErrorsRoute(stateName, params) {\r\n var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n\r\n var url = utilli.isAdmin ? '/PropertyManager/:userId/:propertyManager/' + stateName + '/:propertyId/:meterId/:mode/:stepsCount/:step'\r\n : '/' + stateName + '/:propertyId/:meterId/:mode/:stepsCount/:step/:from';\r\n\r\n if (isParamsArray(params)) {\r\n //we use it for keeping parameters into url\r\n if (params && params.length > 0) {\r\n params.forEach(function (item) {\r\n url += '/:' + item;\r\n });\r\n }\r\n }\r\n\r\n var pagesPath = utilli.isAdmin ? '../' : '';\r\n\r\n $stateProvider.state(layout + '.' + stateName, {\r\n url: url,\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: pagesPath + 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: pagesPath + 'Pages/PropertyManagers/AddProperty/Errors/' + stateName + '.html',\r\n controller: stateName + 'Controller'\r\n }\r\n },\r\n params: isParamsArray(params) ? null : params\r\n });\r\n }\r\n\r\n registerAddPropertyErrorsRoute('MeterDoesNotExist');\r\n registerAddPropertyErrorsRoute('MeterDuplicated');\r\n registerAddPropertyErrorsRoute('MeterIsUsed');\r\n registerAddPropertyErrorsRoute('MultipleTiedMeters');\r\n registerAddPropertyErrorsRoute('ClaimMeter');\r\n registerAddPropertyErrorsRoute('ServiceAddressMismatches');\r\n\r\n function registerImportPropertyRoute(stateName, params, templateName) {\r\n var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n var url = '/' + stateName + '/:id/:stepsCount/:step';\r\n\r\n if (isParamsArray(params)) {\r\n //we use it for keeping parameters into url\r\n if (params && params.length > 0) {\r\n params.forEach(function (item) {\r\n url += '/:' + item;\r\n });\r\n }\r\n }\r\n\r\n var pagesPath = utilli.isAdmin ? '../' : '';\r\n var template = templateName ? templateName : stateName;\r\n\r\n $stateProvider.state(layout + '.AddProperty.' + stateName, {\r\n url: url,\r\n views: {\r\n \"AddPropertySteps\": {\r\n templateUrl: pagesPath + 'Pages/PropertyManagers/AddProperty/' + template + '.html',\r\n controller: stateName + 'Controller'\r\n }\r\n },\r\n params: isParamsArray(params) ? null : params\r\n });\r\n }\r\n\r\n registerImportPropertyRoute('LinkEnergyStarAccount');\r\n registerImportPropertyRoute('LinkEnergyStarAccountInstructions');\r\n registerImportPropertyRoute('LinkEnergyStarAccountForPropertyImport');\r\n registerImportPropertyRoute('LinkEnergyStarAccountForPropertyImportInstructions', null, 'LinkEnergyStarAccountInstructions');\r\n registerImportPropertyRoute('ShareExistingEnergyStarPropertyInstructions');\r\n registerImportPropertyRoute('PropertySharingResults');\r\n\r\n $stateProvider.state('TopMenuLayout.MeterDoesNotExist', {\r\n url: '/MeterDoesNotExist/:meterId/:token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/AddProperty/Errors/MeterDoesNotExist.html',\r\n controller: 'MeterDoesNotExistController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.MeterDuplicated', {\r\n url: '/MeterDuplicated/:meterId/:token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/AddProperty/Errors/MeterDuplicated.html',\r\n controller: 'MeterDuplicatedController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.ServiceAddressMismatches', {\r\n url: '/ServiceAddressMismatches/:propertyId/:meterId/:token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/AddProperty/Errors/ServiceAddressMismatches.html',\r\n controller: 'ServiceAddressMismatchesController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.MultipleTiedMeters', {\r\n url: '/MultipleTiedMeters/:meterId/:token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/AddProperty/Errors/MultipleTiedMeters.html',\r\n controller: 'MultipleTiedMetersController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.ClaimMeter', {\r\n url: '/ClaimMeter/:meterId/:token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/AddProperty/Errors/ClaimMeter.html',\r\n controller: 'ClaimMeterController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.SendDataSharingInvitation', {\r\n url: '/SendDataSharingInvitation/:token/:useCachedMeters',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/SendDataSharingInvitation/SendDataSharingInvitation.html',\r\n controller: 'SendDataSharingInvitationController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.RevokeMeterSharing', {\r\n url: '/RevokeMeterSharing/:token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/RevokeMeterSharing/RevokeMeterSharing.html',\r\n controller: 'RevokeMeterSharingController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.RequestMeterSharingRevoke', {\r\n url: '/RequestMeterSharingRevoke',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/RequestMeterSharingRevoke/RequestMeterSharingRevoke.html',\r\n controller: 'RequestMeterSharingRevokeController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n // below are routes for not logged in users\r\n // in admin on Customer View we show only the part of the app \r\n // that is visible only for logged in users, hence we don't need\r\n // these routes for admin\r\n if (utilli.isAdmin)\r\n return;\r\n // if running in mobile app then use a custom welcome page for mobile\r\n if (isMobileOrRipple()) \r\n registerWelcomeMobileRoutes();\r\n else \r\n registerWelcomeRoutes();\r\n\r\n function getMainRootRoute() {\r\n return utilli.isPropertyManagerApp()\r\n ? '/WelcomeMain/?from' \r\n : '/?from';\r\n }\r\n\r\n function registerWelcomeRoutes() {\r\n if (utilli.isWglcx()) {\r\n $stateProvider.state('WelcomeWglcx', {\r\n url: '/',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/WelcomeWglcx/WelcomeWglcx.html',\r\n controller: 'WelcomeWglcxController'\r\n }\r\n }\r\n });\r\n return;\r\n }\r\n\r\n if(DeploymentSettings.currentServiceProvider === 'Orwell') {\r\n $stateProvider.state('WelcomeOrwellRedirect', {\r\n url: '/',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/WelcomeOrwellRedirect/WelcomeOrwellRedirect.html',\r\n controller: 'WelcomeOrwellRedirectController'\r\n }\r\n }\r\n });\r\n return;\r\n }\r\n\r\n $stateProvider.state('TopMenuLayout.WelcomeAlexa', {\r\n url: '/WelcomeAlexa',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/WelcomeAlexa/WelcomeAlexa.html',\r\n controller: 'WelcomeAlexaController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.Welcome', {\r\n url: getMainRootRoute(),\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Welcome/Welcome.html',\r\n controller: 'WelcomeController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.SignIn.Providers', {\r\n url: '/Providers',\r\n\t\t\t\t// for not mobile sign in we also need login,passwd to use it on common portals (like portalqa.utilli.com)\r\n params: { signInParams: { from: null, login: null, passwd: null } },\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerSignUpPropertyManagersRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager', {\r\n url: '/SignUpPropertyManager',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/SignUpHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/SignUp.html',\r\n controller: 'SignUpPropertyManagerController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Step1', {\r\n url: '/SignUpPropertyManagerStep1/:email',\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Step1.html',\r\n controller: 'SignUpPropertyManagerStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Step2', {\r\n url: '/SignUpPropertyManagerStep2',\r\n params: { email: null },\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Step2.html',\r\n controller: 'SignUpPropertyManagerStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Step3', {\r\n url: '/SignUpPropertyManagerStep3',\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Step3.html',\r\n controller: 'SignUpPropertyManagerStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Success', {\r\n url: '/SignUpPropertyManagerSuccess',\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Success.html',\r\n controller: 'SignUpPropertyManagerSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getPropertyManagerRootRoute () {\r\n return utilli.isPropertyManagerApp() \r\n ? '/?from' \r\n : '/WelcomePropertyManager/?from';\r\n }\r\n\r\n function registerWelcomePropertyManagersRoutes() {\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager', {\r\n url: getPropertyManagerRootRoute(),// we use this url in email sending service\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/Welcome/Welcome.html',\r\n controller: 'WelcomePropertyManagerController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n }\r\n );\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager.SignIn.Providers', {\r\n url: '/Providers?from',\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerAgentsRoutes() {\r\n registerWelcomeAgentsRoutes();\r\n registerSignUpAgentsRoutes();\r\n registerStateWithCommonHeader('Search', null, 'Agents');\r\n registerStateWithCommonHeader('AgentProfile', null, 'Agents');\r\n registerStateWithCommonHeader('SearchHistory', null, 'Agents');\r\n registerStateWithCommonHeader('SettlementProperty', ['AccountNumber', 'Address'], 'Agents');\r\n }\r\n\r\n function registerSignUpAgentsRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignUpAgent', {\r\n url: '/SignUpAgent',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/Agents/SignUp/SignUpHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Agents/SignUp/SignUp.html',\r\n controller: 'SignUpAgentController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Step1', {\r\n url: '/SignUpAgentStep1',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Step1.html',\r\n controller: 'SignUpAgentStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Step2', {\r\n url: '/SignUpAgentStep2',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Step2.html',\r\n controller: 'SignUpAgentStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Step3', {\r\n url: '/SignUpAgentStep3',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Step3.html',\r\n controller: 'SignUpAgentStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Success', {\r\n url: '/SignUpAgentSuccess',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Success.html',\r\n controller: 'SignUpAgentSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerWelcomeAgentsRoutes() {\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent', {\r\n url: '/WelcomeAgent',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Agents/Welcome/Welcome.html',\r\n controller: 'WelcomeAgentController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent.SignIn.Providers', {\r\n url: '/Providers?from',\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n registerAgentsRoutes();\r\n\r\n\r\n function registerAssistantsRoutes() {\r\n registerWelcomeAssistantsRoutes();\r\n registerSignUpAssistantsRoutes();\r\n registerStateWithCommonHeader('AssistantSearch', null, 'Assistants');\r\n registerStateWithCommonHeader('AssistantProfile', null, 'Assistants');\r\n registerStateWithCommonHeader('Delinquents', null, 'Assistants');\r\n registerStateWithCommonHeader('AssistantSearchHistory', null, 'Assistants');\r\n }\r\n\r\n function registerSignUpAssistantsRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant', {\r\n url: '/SignUpAssistant',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/Assistants/SignUp/SignUpHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Assistants/SignUp/SignUp.html',\r\n controller: 'SignUpAssistantController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Step1', {\r\n url: '/SignUpAssistantStep1',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Step1.html',\r\n controller: 'SignUpAssistantStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Step2', {\r\n url: '/SignUpAssistantStep2',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Step2.html',\r\n controller: 'SignUpAssistantStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Step3', {\r\n url: '/SignUpAssistantStep3',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Step3.html',\r\n controller: 'SignUpAssistantStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Success', {\r\n url: '/SignUpAssistantSuccess',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Success.html',\r\n controller: 'SignUpAssistantSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerWelcomeAssistantsRoutes() {\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant', {\r\n url: '/WelcomeAssistant',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Assistants/Welcome/Welcome.html',\r\n controller: 'WelcomeAssistantController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant.SignIn.Providers', {\r\n url: '/Providers?from',\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n registerAssistantsRoutes();\r\n\r\n function registerWelcomeMobileRoutes() {\r\n $stateProvider.state('WelcomeMobile', {\r\n url: '/',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/WelcomeMobile/WelcomeMobile.html',\r\n controller: 'WelcomeMobileController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerSignInRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignIn', {\r\n url: '/SignIn?from',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/SignIn/SignIn.html',\r\n controller: 'SignInPartController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignIn.Providers', {\r\n url: '/Providers',\r\n params: { signInParams: { from: null, login: null, passwd: null } },\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n }); \r\n }\r\n\r\n function registerWglCxSignInRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignIn', {\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/SignIn/SignIn.html',\r\n controller: 'SignInPartController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignIn.Credentials', {\r\n url: '/Login?from',\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n if(utilli.isWglcx()) \r\n registerWglCxSignInRoutes();\r\n else\r\n registerSignInRoutes();\r\n registerForgotPasswordRoutes();\r\n registerForgotPasswordByEmailRoutes();\r\n registerForgotUserIdRoutes();\r\n registerForgotUserIdByEmailRoutes();\r\n registerSignUpRoutes();\r\n \r\n function registerSignUpRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignUp', {\r\n url: '/SignUp?accountnumber&customerfullname&zip&email&token&user&psw&question&answer',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/SignUp/SignUpHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/SignUp/SignUp.html',\r\n controller: 'SignUpController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUp.Step1', {\r\n url: '/SignUpStep1', //we use this url in EmailService templates\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Step1.html',\r\n controller: 'SignUpStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUp.Step2', {\r\n url: '/SignUpStep2',\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Step2.html',\r\n controller: 'SignUpStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUp.Step3', {\r\n url: '/SignUpStep3',\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Step3.html',\r\n controller: 'SignUpStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUp.Success', {\r\n url: '/SignUpSuccess',\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Success.html',\r\n controller: 'SignUpSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n //registerForTopMenuLayout('Maintenance');\r\n\r\n $stateProvider.state('SmartPayLayout.Maintenance', {\r\n url: '/Maintenance',\r\n views: {\r\n 'main-content': {\r\n templateUrl: 'maintenance.html',\r\n controller: 'MaintenanceController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('NoConnection', {\r\n url: '/NoConnection',\r\n views: {\r\n 'body-view': {\r\n templateUrl: 'noconnection.html',\r\n controller: 'NoConnectionController'\r\n }\r\n }\r\n });\r\n\r\n function registerWelcomeQuickPay() {\r\n $stateProvider.state('TopMenuLayout.Welcome.QuickPay', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"QuickPay\": {\r\n templateUrl: 'Pages/QuickPay/QuickPayPart.html',\r\n controller: 'QuickPayController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.QuickPay.Step1', {\r\n views: {\r\n \"QuickPaySteps\": {\r\n templateUrl: 'Pages/QuickPay/Step1.html',\r\n controller: 'QuickPayStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.QuickPay.Step2', {\r\n views: {\r\n \"QuickPaySteps\": {\r\n templateUrl: 'Pages/QuickPay/Step2.html',\r\n controller: 'QuickPayStep2Controller'\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n registerWelcomeQuickPay();\r\n \r\n function registerStandaloneQuickPay () {\r\n $stateProvider.state('TopMenuLayout.QuickPay', {\r\n url: '/QuickPay',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/QuickPay/QuickPayHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/QuickPay/QuickPay.html',\r\n controller: 'QuickPayController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.QuickPay.Step1', {\r\n url: '/QuickPayStep1',\r\n views: {\r\n \"QuickPaySteps\": {\r\n templateUrl: 'Pages/QuickPay/Step1.html',\r\n controller: 'QuickPayStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.QuickPay.Step2', {\r\n url: '/QuickPayStep2?contractAccountNumber?emailId?billAmount?email?invoiceNumber?phoneNumber?token',\r\n views: {\r\n \"QuickPaySteps\": {\r\n templateUrl: 'Pages/QuickPay/Step2.html',\r\n controller: 'QuickPayStep2Controller'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerStandaloneSmartPay() {\r\n $stateProvider.state('SmartPayLayout', {\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/SmartPayLayout.html',\r\n controller: 'SmartPayLayoutController'\r\n }\r\n }\r\n });\r\n function registerSmartPay(urlPageName, stateName) {\r\n $stateProvider.state('SmartPayLayout.' + stateName, {\r\n url: '/' + urlPageName + '?emailId?token?billAmount',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/SmartPay/SmartPay.html',\r\n controller: 'SmartPayController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n registerSmartPay('QuickPay/QuickPayStep2', 'QuickPay');// old url because we have users with the old link\r\n registerSmartPay('SmartPay', 'SmartPay');// new url\r\n\r\n $stateProvider.state('SmartPayLayout.SmartPayResult', {\r\n url: '/SmartPayResult?paymentGuid',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/SmartPayResult/SmartPayResult.html',\r\n controller: 'SmartPayResultController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.SmartPayLeave', {\r\n url: '/SmartPayLeave?notificationLogId?installmentPlanToken',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/SmartPayLeave/SmartPayLeave.html',\r\n controller: 'SmartPayLeaveController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('SmartPayLayout.Preferences', {\r\n url: '/SmartPayPreferences?token',\r\n views: {\r\n \"main-content\": {\r\n templateUrl: 'Pages/SmartPayPreferences/SmartPayPreferences.html',\r\n controller: 'SmartPayPreferencesController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n if(utilli.isWglcx())\r\n registerStandaloneSmartPay();\r\n else \r\n registerStandaloneQuickPay();\r\n\r\n $stateProvider.state('TopMenuLayout.DocuSign', {\r\n url: '/DocuSign?contractAccountNumber?billAmount?email?phoneNumber?event?bcaId?bcaManagerEmail?token?orderNumber',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/DocuSign/DocuSign.html',\r\n controller: 'DocuSignController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.DocuSignStart', {\r\n url: '/DocuSignStart?contractAccountNumber?billAmount?email?phoneNumber?orderNumber?bcaId?bcaManagerEmail?token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/DocuSignStart/DocuSignStart.html',\r\n controller: 'DocuSignStartController'\r\n }\r\n }\r\n });\r\n \r\n $stateProvider.state('TopMenuLayout.AdobeSign', {\r\n url: '/AdobeSign?contractAccountNumber?billAmount?email?phoneNumber?event?bcaId?bcaManagerEmail?token?orderNumber',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/AdobeSign/AdobeSign.html',\r\n controller: 'AdobeSignController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.AdobeSignStart', {\r\n url: '/AdobeSignStart?contractAccountNumber?billAmount?email?phoneNumber?orderNumber?bcaId?bcaManagerEmail?token',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/AdobeSignStart/AdobeSignStart.html',\r\n controller: 'AdobeSignStartController'\r\n }\r\n }\r\n });\r\n\r\n\r\n $stateProvider.state('TopMenuLayout.LinkShortener', {\r\n url: '/s/:key',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/LinkShortener/LinkShortener.html',\r\n controller: 'LinkShortenerController'\r\n }\r\n },\r\n params: {\r\n key: {\r\n value: null,\r\n squash: true\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OutageCenter', {\r\n url: '/Outages?anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OutageCenter/OutageCenter.html',\r\n controller: 'OutageCenterController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.PublicFaqs', {\r\n\t\t\t//we use this url in TaksRunner\r\n url: '/PublicFaqs', \r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Faqs/Faqs.html',\r\n controller: 'FaqsController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OutageMap', {\r\n url: '/OutageMapSignedOut?anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OutageMap/OutageMap.html',\r\n controller: 'OutageMapController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.TurnOffMap', {\r\n url: '/TurnOffMap',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/FieldServiceEngineer/TurnOffMap/TurnOffMap.html',\r\n controller: 'TurnOffMapController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OutageList', {\r\n url: '/OutageListSignedOut?anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OutageList/OutageList.html',\r\n controller: 'OutageListController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OpenOutageReport', {\r\n url: '/OpenOutageSignedOut?Id&mode&anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OpenOutageReport/OpenOutageReport.html',\r\n controller: 'OpenOutageReportController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OutageSafety', {\r\n url: '/OutageSafetySignedOut?anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OutageSafety/OutageSafety.html',\r\n controller: 'OutageSafetyController'\r\n }\r\n }\r\n });\r\n }])\r\n .config(['$provide', function ($provide) {\r\n // add fixedFinally to all $q promises https://stackoverflow.com/a/17889426/292787\r\n $provide.decorator('$q', [\"$delegate\", function ($delegate) {\r\n var promisePatcher = function (promise){\r\n promise.fixedFinally = function (fn) {\r\n return promise['finally'](fn);\r\n };\r\n // then also should return fixed object\r\n var originalThen = promise.then;\r\n promise.then = function () {\r\n var self = this;\r\n var originalThenResult = originalThen.apply(self, arguments);\r\n originalThenResult.fixedFinally = function (fn) {\r\n return originalThenResult['finally'](fn);\r\n };\r\n return originalThenResult;\r\n };\r\n }\r\n\r\n var originalDefer = $delegate.defer;\r\n $delegate.defer = function () {\r\n var deferred = originalDefer();\r\n promisePatcher(deferred.promise);\r\n return deferred;\r\n };\r\n // apply the patch also to $q.resolve()\r\n var originalResolve = $delegate.resolve;\r\n $delegate.resolve = function(){\r\n var self = this;\r\n var resolvedPromise = originalResolve.apply(self, arguments);\r\n promisePatcher(resolvedPromise);\r\n return resolvedPromise;\r\n }\r\n return $delegate;\r\n }]);\r\n \r\n $provide.decorator('$http', [\"$delegate\", function ($delegate) {\r\n var $http = $delegate;\r\n\r\n // status === 0 or -1 - means that request was cancelled.\r\n // requests cancelling happens when we move from one page to another.\r\n // if a request was cancelled then we skip error handling to avoid modal \r\n // pop-ups with messages after user already moved to another page.\r\n var skippingErrorStatusCodeHandling = 0;\r\n\r\n // \"finally\" may not work in old android browsers, because \"finally\" was a reserved keyword in javascript.\r\n // here i add wrapper method 'fixedFinally' to be used instead of 'finally'\r\n function fixFinally(promise){\r\n if (!promise || !promise['then']) // if it's not a promise then just return whatever it is\r\n return promise;\r\n promise.fixedFinally = function (fn) {\r\n return promise['finally'](fn);\r\n };\r\n return promise;\r\n }\r\n\r\n /** adds method apiThen in addition to regular then */\r\n function addApiThen(ajaxPromise){\r\n /** same as regular 'then' but with built-in error handling */\r\n ajaxPromise['apiThen'] = function(successCallback, errorHandler){\r\n // errorHandler can be either ModalServiceExt or $scope.errors\r\n var scopeErrors = $.isArray(errorHandler) ? errorHandler : null;\r\n var ModalServiceExt = errorHandler.showAjaxError ? errorHandler : null;\r\n var errorCallback = typeof errorHandler === \"function\" ? errorHandler : null;\r\n return ajaxPromise.then(function(response){\r\n // if $scope.errors is passed then check ApiResponse for errors and return Data\r\n if (scopeErrors)\r\n scopeErrors.length = 0;\r\n if (!response.data.Errors || !response.data.Errors.length)\r\n return successCallback(response.data.Data);\r\n console.error(response.data.Errors[0]);\r\n if (scopeErrors) {\r\n _.forEach(response.data.Errors, function(item){\r\n scopeErrors.push(item);\r\n });\r\n }\r\n else if (ModalServiceExt) {\r\n ModalServiceExt.showError(response.data.Errors[0]);\r\n }\r\n else if (errorCallback)\r\n errorCallback(response.data.Errors);\r\n }, function(error) {\r\n console.error(error);\r\n if (ModalServiceExt){\r\n ModalServiceExt.showAjaxError(error);\r\n }\r\n else if (scopeErrors) {\r\n scopeErrors.push(error);\r\n }\r\n if (errorCallback)\r\n errorCallback(error);\r\n });\r\n };\r\n }\r\n \r\n // ajaxPromise - a promise returned by $http or a shortcut like $http.get, $http.post etc\r\n var fixHttpPromise = function (ajaxPromise) {\r\n // fix the deprecated method 'error'\r\n var originalErrorMethod = ajaxPromise['error'];\r\n ajaxPromise['error'] = function utilliErrorWrapper() {\r\n if (arguments.length === 0)\r\n return originalErrorMethod.apply(ajaxPromise, arguments);\r\n var originalErrorHandler = arguments[0];\r\n var errorHandlerWrapper = function () {\r\n if (arguments.length > 1 && arguments[1] <= skippingErrorStatusCodeHandling)\r\n return null;\r\n return originalErrorHandler.apply(originalErrorHandler, arguments);\r\n };\r\n return originalErrorMethod.apply(ajaxPromise, [errorHandlerWrapper]);\r\n }\r\n ajaxPromise['success'] = function utilliSuccessShim(successCallback) {\r\n var e = null;\r\n\r\n originalThenMethod.apply(ajaxPromise, [function(data){\r\n if (successCallback)\r\n successCallback(data.data);\r\n }, function(error){\r\n if (e && error.status > skippingErrorStatusCodeHandling)\r\n e(error);\r\n }]);\r\n\r\n return {\r\n error: function(errorCallback){\r\n e = errorCallback;\r\n }\r\n }\r\n }\r\n // fix the method 'then' of the ajax promise\r\n var originalThenMethod = ajaxPromise['then'];\r\n ajaxPromise['then'] = function utilliThenWrapper() {\r\n // if error handler method is not specified in 'then'.\r\n if (arguments.length === 1){\r\n return fixFinally(originalThenMethod.apply(ajaxPromise, arguments));\r\n }\r\n // if both success and error handlers are specified\r\n var thenSuccessHandler = arguments[0];\r\n var originalThenErrorHandler = arguments[1];\r\n var thenErrorHandlerWrapper = function () {\r\n if (arguments.length == 1 && arguments[0].status <= skippingErrorStatusCodeHandling)\r\n return null;\r\n return fixFinally(originalThenErrorHandler.apply(originalThenErrorHandler, arguments));\r\n };\r\n return fixFinally(originalThenMethod.apply(ajaxPromise, [thenSuccessHandler, thenErrorHandlerWrapper]));\r\n };\r\n addApiThen(ajaxPromise);\r\n return ajaxPromise;\r\n }\r\n\r\n // apply the fix to the function $http itself to handle such calls like $http({url: url, method: \"GET\"})...\r\n var wrapper = function () {\r\n var promise = $http.apply($http, arguments);\r\n return fixHttpPromise(promise);\r\n };\r\n\r\n // apply the fix to all shortcuts: $http.get, $http.head, $http.post, $http.put, $http.delete, $http.jsonp, $http.patch\r\n Object.keys($http).filter(function (key) {\r\n return (typeof $http[key] === 'function');\r\n }).forEach(function (key) {\r\n wrapper[key] = function () {\r\n var promise = $http[key].apply($http, arguments);\r\n return fixHttpPromise(promise);\r\n };\r\n });\r\n return wrapper;\r\n }]);\r\n }])\r\n .config([\r\n '$httpProvider', function ($httpProvider) {\r\n // see http://stackoverflow.com/a/20276775\r\n // and also http://www.bennadel.com/blog/2615-posting-form-data-with-http-in-angularjs.htm\r\n // Use x-www-form-urlencoded Content-Type\r\n $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';\r\n\r\n /**\r\n * The workhorse; converts an object to x-www-form-urlencoded serialization.\r\n * @param {Object} obj\r\n * @return {String}\r\n */\r\n var param = function (obj) {\r\n var query = '', name, value, fullSubName, subName, subValue, innerObj, i;\r\n\r\n for (name in obj) {\r\n value = obj[name];\r\n\r\n if (value instanceof Array) {\r\n for (i = 0; i < value.length; ++i) {\r\n subValue = value[i];\r\n fullSubName = name + '[' + i + ']';\r\n innerObj = {};\r\n innerObj[fullSubName] = subValue;\r\n query += param(innerObj) + '&';\r\n }\r\n } else if (value instanceof Object) {\r\n for (subName in value) {\r\n subValue = value[subName];\r\n fullSubName = name + '[' + subName + ']';\r\n innerObj = {};\r\n innerObj[fullSubName] = subValue;\r\n query += param(innerObj) + '&';\r\n }\r\n } else if (value !== undefined && value !== null)\r\n query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';\r\n }\r\n\r\n return query.length ? query.substr(0, query.length - 1) : query;\r\n };\r\n\r\n // Override $http service's default transformRequest\r\n $httpProvider.defaults.transformRequest = [\r\n function (data) {\r\n return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;\r\n }\r\n ];\r\n }\r\n ])\r\n .run(['$rootScope', '$state', '$http', '$window', '$location', '$document', 'RequestService', 'CheckVersionService',\r\n 'ServerCacheService', 'ModalServiceExt', '$resource', 'productTourService',\r\n function ($rootScope, $state, $http, $window, $location, $document, RequestService, CheckVersionService,\r\n ServerCacheService, ModalServiceExt, $resource, productTourService) {\r\n\r\n utilli.registerGoogleAnalytics($window, $rootScope, $location);\r\n\r\n $document.bind('keyup', function(e) {\r\n $rootScope.$broadcast('keyup', e);\r\n });\r\n\r\n //https://stackoverflow.com/a/39621112/292787\r\n function _arrayBufferToBase64(buffer) {\r\n var binary = '';\r\n var bytes = new Uint8Array(buffer);\r\n var len = bytes.byteLength;\r\n for (var i = 0; i < len; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return window.btoa(binary);\r\n }\r\n\r\n //because it couldn't be loaded when we don't have an internet connection.\r\n function preLoadNoConnectionPageLogo() {\r\n var url = 'Images/Utilli-logo.png';\r\n if (utilli.isAdmin) {\r\n if (DeploymentSettings.providersGroupShortName === 'wgl'\r\n || DeploymentSettings.providersGroupShortName === 'wglcx')\r\n url = '../Images/Wgl-logo.png';\r\n else \r\n url = '../Images/Utilli-logo.png';\r\n }\r\n else {\r\n if (DeploymentSettings.providersGroupShortName === 'wgl'\r\n || DeploymentSettings.providersGroupShortName === 'wglcx')\r\n url = 'Images/Wgl-logo.png';\r\n }\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n responseType: 'arraybuffer'\r\n }).then(function (r) {\r\n utilli.logoBase64 = 'data:image/png;base64,' + _arrayBufferToBase64(r.data);\r\n });\r\n }\r\n\t\t\t\r\n\t\t\tpreLoadNoConnectionPageLogo();\r\n\r\n utilli.registerLocalization($rootScope, $resource);\r\n\r\n // if it was refresh (F5 pressed) then send request to refresh server cache.\r\n ServerCacheService.clearServerCache();\r\n\r\n //it is work around of https://issues.apache.org/jira/browse/CB-11751\r\n //we must delete this code after it will be fixed\r\n if (!$window.extendedSplashScreen)\r\n $window.extendedSplashScreen = {};\r\n\r\n if(!utilli.isWglcxPortal())\r\n FastClick.attach(document.body);\r\n\r\n var lastLocationChangeTimestamp;\r\n // this is the mechanism how to detect browser's back/forward button pressed. The feature is: when back button is pressed the \r\n // $locationChangeSuccess event is fired the first, then $watch for $location.path() is called. \r\n // When a user uses links or buttons except 'back button' then $watch is called the first and after that $locationChangeStart is fired.\r\n // see http://stackoverflow.com/questions/15813850/detect-history-back-using-angular\r\n $rootScope.$on('$locationChangeSuccess', function () {\r\n $rootScope.actualLocation = $location.path();\r\n lastLocationChangeTimestamp = new Date();\r\n ModalServiceExt.clear();\r\n });\r\n\r\n $rootScope.$watch(function () { return $location.path(); }, function (newLocation) {\r\n if ($rootScope.actualLocation === newLocation) {\r\n // back button was pressed.\r\n RequestService.abort(lastLocationChangeTimestamp);\r\n }\r\n });\r\n\r\n\r\n $rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState) {\r\n if (!utilli.isAdmin && !utilli.isWglcxPortal() && productTourService.isTourActive())\r\n productTourService.pauseTour();\r\n\r\n var isAccountDataValid = itemNotNull('CurrentAccountNumber') && itemNotNull('CurrentUtilityType');\r\n if (utilli.hasAgentRole() && isProtectedPage(toState) && !isAccountDataValid) {\r\n if(fromState.name)\r\n e.preventDefault();\r\n else {\r\n e.preventDefault();\r\n $state.goMainLayout('Search');\r\n }\r\n }\r\n });\r\n\r\n function hasAgentsAccess() {\r\n var isAccountDataValid = itemNotNull('CurrentAccountNumber') && itemNotNull('CurrentUtilityType'); \r\n utilli.hasAgentRole() && isProtectedPage(toState) && !isAccountDataValid\r\n }\r\n\r\n function itemNotNull(name) {\r\n var result = localStorage.getItem(name) != null && localStorage.getItem(name) != \"null\";\r\n return result;\r\n }\r\n \r\n function isProtectedPage (toState) {\r\n var result = toState.name == 'MainLayout.Dashboard' || toState.name == 'MainLayout.BillsAndPayments' || toState.name == 'MainLayout.MeterData';\r\n return result;\r\n }\r\n\r\n // state extensions\r\n $state.goMainLayout = function (stateName, params, options) {\r\n var fullStateName = $state.getMainLayoutStateName(stateName);\r\n if (utilli.isAdmin) {\r\n params = params || {};\r\n\r\n if (options && options.reload === stateName)\r\n options.reload = fullStateName;\r\n\r\n params.userId = $state.params.userId;\r\n params.propertyManager = $state.params.propertyManager;\r\n params.contractAccountNumber = $state.params.contractAccountNumber;\r\n $state.go(fullStateName, params, options);\r\n } else {\r\n if (options && options.reload === stateName)\r\n options.reload = fullStateName;\r\n $state.go(fullStateName, params, options);\r\n }\r\n //utilli.scrollTop(); // on some pages (Profile for example) scroll top doesn't happen automatically. why?\r\n };\r\n\r\n $state.getMainLayoutStateName = function(stateName) {\r\n if (utilli.isAdmin) {\r\n return 'AdminMainLayout.Customer.CustomerLayout.' + stateName;\r\n } else {\r\n return 'MainLayout.' + stateName;\r\n }\r\n }\r\n\r\n $state.goTopMenuLayout = function (stateName) {\r\n $state.go('TopMenuLayout.' + stateName);\r\n };\r\n\r\n $state.goToWelcome = function (params) {\r\n if (isMobileOrRipple()) {\r\n $state.go('WelcomeMobile', params);\r\n } else {\r\n // if add a reload then it loads child states\r\n // but looses current child states\r\n if (utilli.hasAgentRole())\r\n $state.goToAgentsWelcome(params);\r\n else if (utilli.hasAssistantRole())\r\n $state.goToAssistantsWelcome(params);\r\n else if (utilli.hasPropertyManagerRole() || utilli.isPropertyManagerApp())\r\n $state.goToPropertyManagersWelcome(params);\r\n else\r\n $state.go('TopMenuLayout.Welcome', params, { reload: true });\r\n }\r\n };\r\n\r\n $state.goToMaintenance = function(){\r\n if (utilli.isWglcx() && !utilli.isAdmin){\r\n $state.go('SmartPayLayout.Maintenance');\r\n } else {\r\n $state.go('Maintenance');\r\n }\r\n }\r\n\r\n $state.goToAgentsWelcome = function (params) {\r\n $state.go('TopMenuLayout.WelcomeAgent', params, { reload: true });\r\n }\r\n\r\n $state.goToAssistantsWelcome = function (params) {\r\n $state.go('TopMenuLayout.WelcomeAssistant', params, { reload: true });\r\n }\r\n\r\n $state.goToPropertyManagersWelcome = function (params) {\r\n $state.go('TopMenuLayout.WelcomePropertyManager', params, { reload: true });\r\n }\r\n\r\n /**\r\n * Changes current state to 'SignIn'.\r\n * @param {bool} withRedirect When true then it remembers the current state and \r\n * will redirect to it after login\r\n */\r\n $state.goToSignIn = function (withRedirect) {\r\n if (withRedirect){\r\n console.log('redirect from ' + this.current.name);\r\n }\r\n // note: this.params.from may already exist if we redirected the user explicitly to sign in.\r\n // it may happen for example if the user comes to the PayNow page by a direct link from email.\r\n // in this case if he is not logged in then we redirect him explicitly from PayNow to SignIn\r\n // so that he will land on SignIn.\r\n var redirectedFrom = withRedirect && !this.params.from // if from already exists then don't replace it\r\n ? { from: JSON.stringify({ stateName: this.current.name, stateParams: this.params }) }\r\n : null;\r\n if (isMobileOrRipple()) {\r\n if (utilli.isPropertyManagerApp())\r\n $state.goToPropertyManagersWelcome(redirectedFrom);\r\n else\r\n $state.go('TopMenuLayout.SignIn.Credentials', redirectedFrom);\r\n } else {\r\n // if add a reload then it loads child states\r\n // but looses current child states\r\n if (utilli.isPropertyManagerApp())\r\n $state.goToPropertyManagersWelcome(redirectedFrom);\r\n if (utilli.isWglcx()) {\r\n if (utilli.isAdmin) \r\n $state.goToWelcome(redirectedFrom);\r\n else\r\n $state.go('TopMenuLayout.SignIn.Credentials');\r\n }\r\n \r\n else\r\n $state.go('TopMenuLayout.Welcome', redirectedFrom, { reload: true });\r\n }\r\n };\r\n\r\n $state.goToSignUp = function () {\r\n if (isMobileOrRipple() && utilli.isPropertyManagerApp()) {\r\n $state.go('TopMenuLayout.SignUpPropertyManager.Step1');\r\n } else {\r\n // if add a reload then it loads child states\r\n // but looses current child states\r\n $state.go('TopMenuLayout.SignUp.Step1');\r\n }\r\n }\r\n\r\n $state.goToForgotPassword = function () {\r\n if (isMobileOrRipple() && utilli.isPropertyManagerApp()) {\r\n $state.go('TopMenuLayout.ForgotPasswordByEmail.Step1');\r\n } else {\r\n $state.go('TopMenuLayout.ForgotPassword.Step1');\r\n }\r\n }\r\n\r\n $state.goToForgotUserID = function () {\r\n if (isMobileOrRipple() && utilli.isPropertyManagerApp()) {\r\n $state.go('TopMenuLayout.ForgotUserIdByEmail.Step1');\r\n } else {\r\n $state.go('TopMenuLayout.ForgotUserId.Step1');\r\n }\r\n }\r\n\r\n $state.goToSignInWithRedirectTo = function (to) {\r\n\r\n var redirectTo = to ? { from: JSON.stringify({ stateName: to }) } : null;\r\n\r\n if (isMobileOrRipple()) {\r\n $state.go('TopMenuLayout.SignIn.Credentials', redirectTo);\r\n } else {\r\n // if add a reload then it loads child states\r\n // but looses current child states\r\n $state.go('TopMenuLayout.Welcome', redirectTo, { reload: true });\r\n }\r\n };\r\n\r\n $state.includesChild = function (childStateName) {\r\n return $state.current.name.indexOf(childStateName) >= 0;\r\n }\r\n\r\n $state.goFromWelcomeTo = function (stateName, params) {\r\n if (isMobileOrRipple()) {\r\n return $state.go('TopMenuLayout.' + stateName, params);\r\n } else {\r\n return $state.go('TopMenuLayout.Welcome.' + stateName, params);\r\n }\r\n };\r\n $state.goRelativeTo = function (parentName, childName, params) {\r\n var parentPos = $state.current.name.indexOf(parentName);\r\n if (parentPos < 0)\r\n return $state;\r\n\r\n var topRoute = $state.current.name.slice(0, parentPos);\r\n return $state.go(topRoute + parentName + '.' + childName, params);\r\n };\r\n\r\n // check app version compatibility with deployed back-end system\r\n if (isMobileOrRipple()) {\r\n CheckVersionService\r\n .checkVersion()\r\n .then(function (result) {\r\n if (CheckVersionService.isVersionWrong(result))\r\n $state.go('UpdateApp');\r\n // result should be either correct or wrong,\r\n // otherwise it's unexpected result and most probably\r\n // the internet connection is just missing or\r\n // our server (ProvidersWebApi project) is completely down\r\n else if (!CheckVersionService.isVersionCorrect(result)){\r\n if (!window.disableNoConnectionPage) {\r\n $state.go('NoConnection');\r\n }\r\n }\r\n });\r\n }\r\n }])\r\n .directive('ngBindHtmlDynamic', [\"$compile\", function($compile) {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n link: function (scope, element, attrs) {\r\n scope.$watch(attrs.ngBindHtmlDynamic, function(html) {\r\n element[0].innerHTML = html;\r\n $compile(element.contents())(scope);\r\n });\r\n }\r\n };\r\n }])\r\n .directive('showFocus', [\"$timeout\", function($timeout) {\r\n return function(scope, element, attrs) {\r\n scope.$watch(attrs.showFocus, \r\n function (newValue) { \r\n $timeout(function() {\r\n newValue && element.focus();\r\n });\r\n },true);\r\n }; \r\n }])\r\n // restrict user to enter into an input only digits\r\n .directive('restrictCurrency', function () {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n var fixNumberFormat = function (element) {\r\n if (element.value == '') {\r\n return;\r\n }\r\n if (!isNumberFormatCorrect(element.value)) {\r\n element.value = Number(0).toFixed(2);\r\n return;\r\n }\r\n // format as 0.00\r\n element.value = Number(element.value).toFixed(2);\r\n };\r\n\r\n $(element).keyup(function () {\r\n // NOTE: when input type is 'number' there is an issue:\r\n // https://docs.angularjs.org/api/ng/input/input%5Bnumber%5D\r\n // see 'Issues with HTML5 constraint validation'\r\n // !this.value - this is necessary to allow a user to enter dot first\r\n // because when a user enters dot this.value is empty here\r\n if (!this.value || !this.value.trim() || isNumberFormatCorrect(this.value))\r\n return;\r\n this.value = this.oldValue;// we can't do just slice, because user can be entering in the middle\r\n });\r\n $(element).keydown(function (e) {\r\n if (e.keyCode === 13) {\r\n fixNumberFormat(this);\r\n e.preventDefault();\r\n return;\r\n }\r\n this.oldValue = this.value;// save for future use in key-up\r\n });\r\n $(element).focusout(function () {\r\n fixNumberFormat(this);\r\n });\r\n }\r\n };\r\n })\r\n // restrict user to enter the cell phone number in the +1 (999) 999-9999 format\r\n .directive('phoneTemplate', ['$timeout', '$window', function ($timeout, $window) {\r\n return {\r\n link: function ($scope, element) {\r\n $window.$(element).mask(Config.phoneNumberMask);\r\n }\r\n };\r\n }])\r\n .directive('ccNumberTemplate', ['$timeout', '$window', function ($timeout, $window) {\r\n return {\r\n link: function ($scope, element) {\r\n $window.$(element).mask(Config.ccNumberMask, { placeholder: \"\" });\r\n }\r\n };\r\n }]);\r\n\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('CommonHeaderController', [\r\n '$scope', 'CommonHeaderService',\r\n function ($scope, CommonHeaderService) {\r\n $scope.CommonHeaderService = CommonHeaderService;\r\n }\r\n ]);\n'use strict';\r\nangular.module('utilliApp').factory('CommonHeaderService', [\r\n// ReSharper disable InconsistentNaming\r\n '$window', '$state', 'HeaderServiceFactory', function ($window, $state, HeaderServiceFactory) {\r\n// ReSharper restore InconsistentNaming\r\n var baseService = HeaderServiceFactory.getHeaderSerivce();\r\n return baseService;\r\n }\r\n]);\n'use strict';\r\n/** Service to maintain state between page moves */\r\nangular.module('utilliApp').service('SmartPayStateService', function () {\r\n var _t = utilli._t;\r\n var svc = {};\r\n var model = {};\r\n svc.model = model;\r\n model.paymentMethod = 'card';\r\n model.receipt = {};\r\n model.isPayByCard = function () {\r\n return model.paymentMethod === 'card';\r\n }\r\n model.isPayByCheck = function () {\r\n return model.paymentMethod === 'eCheck';\r\n }\r\n model.isPayByWallet = function () {\r\n return model.paymentMethod === 'wallet';\r\n }\r\n model.isPayAndSaveCardWithConfirmation = function () { \r\n return model.isPayByCard() && model.saveThisCard\r\n && !model.useSavedCard && !isVerifiedPhoneNumber();\r\n }\r\n model.isPayAndSaveCheckWithConfirmation = function () { \r\n return model.isPayByCheck() && model.saveThisBankAccount\r\n && !model.useSavedBankAccount && !isVerifiedPhoneNumber();\r\n }\r\n model.isConfirmationCodeKnown = function () {\r\n var isPayBySaveCardWithCvv = model.isPayByCard() && model.useSavedCard && model.isCvvConfirmationTypeActive;\r\n return model.smsCodeSent || isPayBySaveCardWithCvv;\r\n }\r\n model.isPayBySavedCard = function () { \r\n return model.isPayByCard() && model.useSavedCard;\r\n }\r\n model.isPayBySavedCheck = function () { \r\n return model.isPayByCheck() && model.useSavedBankAccount;\r\n }\r\n model.isResendTimerVisible = function () {\r\n return (model.saveThisCard || model.useSavedCard) && model.canShowTimer && !model.sendSmsCodeError;\r\n }\r\n model.resetResendButton = function () {\r\n model.canShowTimer = false;\r\n model.sendSmsCodeError = null;\r\n model.smsCodeSent = false;\r\n model.timeout = 0;\r\n }\r\n model.needToUseCvvValidation = function () { \r\n return model.isCvvConfirmationTypeActive && model.useSavedCard && model.isPayByCard();\r\n }\r\n model.resetPaymentOptionsAttributes = function () {\r\n model.nameOnCard = '';\r\n model.cardNumber = '';\r\n model.expirationDate = '';\r\n model.saveThisCard = false;\r\n\r\n model.nameOnAccount = '';\r\n model.routingNumber = '';\r\n model.bankAccountNumber = '';\r\n model.reenterBankAccountNumber = '';\r\n model.saveThisBankAccount = false;\r\n\r\n model.useSavedBankAccount = false;\r\n model.useSavedCard = false;\r\n model.verificationCode = '';\r\n model.canRequestVerificationCode = true;\r\n model.isCvvConfirmationTypeActive = false;\r\n model.smsCodeSent = false;\r\n }\r\n function isVerifiedPhoneNumber() { \r\n if (!model.allPhoneNumbers)\r\n return false;\r\n var verified = _.filter(model.allPhoneNumbers, function(p){\r\n return p.PhoneNumber == model.phoneNumber && p.IsVerified;\r\n });\r\n return verified.length > 0;\r\n }\r\n return svc;\r\n});\r\n\r\n\n'use strict';\r\n/** Service to share state between SmartPayLayout and other pages. */\r\nangular.module('utilliApp').service('SmartPayLayoutService', function () {\r\n var svc = {};\r\n return svc;\r\n});\r\n\n'use strict';\r\nangular.module('utilliApp').controller('SmartPayLayoutController', \r\n [\"$rootScope\", \"$scope\", \"SmartPayLayoutService\", \"$state\", \"ServiceProvidersService\", \"ModalServiceExt\", \"$resource\", function ($rootScope, $scope, SmartPayLayoutService, $state,\r\n ServiceProvidersService, ModalServiceExt,$resource) \r\n{\r\n $rootScope.getBodyClass = function () {\r\n return { 'smart-pay': true };\r\n }\r\n $scope.svc = SmartPayLayoutService;\r\n\r\n // $scope.languageT=localStorage.getItem(\"language\");\r\n \r\n $rootScope.$on(\"languageChangedOutside\", function(evt,data){ \r\n $scope.languageT=localStorage.getItem(\"language\");\r\n });\r\n\r\n $scope.languageSwitch=false;\r\n $rootScope.$on(\"enableLanguageSwitch\", function(evt,data){ \r\n $scope.languageSwitch=true;\r\n });\r\n var firebaseWebPushService;\r\n var apiUrl;\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n\r\n if(utilli.isFirefox) {\r\n firebaseWebPushService = createFirebaseWebPushService(apiUrl);\r\n } \r\n })\r\n .catch(function(){\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.isWebPushBellBoxVisible = function () {\r\n var result = (utilli.isFirefox && Notification.permission == \"default\")\r\n || (utilli.isSafari \r\n && 'safari' in window \r\n && 'pushNotification' in window.safari\r\n && utilli.getSafariPushNotificationPermissionData().permission === 'default');\r\n \r\n return result;\r\n };\r\n\r\n $scope.askPermissionsForWebPush = function () { \r\n if(utilli.isFirefox) {\r\n firebaseWebPushService.subscribe($scope);\r\n }\r\n else if ('safari' in window && 'pushNotification' in window.safari) {\r\n utilli.checkSafariRemotePermission($scope, apiUrl, $state.params.token);\r\n }\r\n }\r\n\r\n $scope.changeLanguage = function (data) { \r\n $scope.languageT=data;\r\n localStorage.setItem('language', $scope.languageT);\r\n utilli.registerLocalization($rootScope, $resource);\r\n $rootScope.$broadcast(\"languageChanged\",$scope.languageT);\r\n };\r\n}]);\r\n\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ChallengeEmailSucceedController', ['$scope', '$http', '$stateParams', '$sce', '$state', '$location',\r\n 'ServiceProvidersService', 'usSpinnerService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, $stateParams, $sce, $state, $location, ServiceProvidersService, usSpinnerService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n $scope.validateToken = function ()\r\n {\r\n $scope.status = _t('Email verification...');\r\n if (!$stateParams.token)\r\n {\r\n $scope.errors = [utilli.errors.serverErrorMessage];\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n setWelcomePageLink($stateParams.token);\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProvider(DeploymentSettings.currentServiceProvider)\r\n .then(\r\n function(providerData){\r\n var url = providerData.ApiUrl + 'api/Registration/ChallengeEmail';\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params: { verificationToken: $stateParams.token },\r\n withoutAuthentication: true\r\n }).success(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n if (data.Errors && data.Errors.length > 0) {\r\n $scope.errors = data.Errors;\r\n return;\r\n }\r\n $scope.status = _t('Your Email Has Been Verified');\r\n $scope.html = $sce.trustAsHtml(data.Data.Html);\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors = [utilli.errors.serverErrorMessage];\r\n });\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors = [utilli.errors.serverErrorMessage];\r\n });\r\n };\r\n\r\n function setWelcomePageLink(token) {\r\n\r\n var roles = utilli.getPayload(token).roles;\r\n if (roles) {\r\n var isAgent = _.some(roles, function (role) {\r\n return role === utilli.roles.Agent;\r\n });\r\n var isPropertyManager = _.some(roles, function (role) {\r\n return role === utilli.roles.PropertyManager;\r\n });\r\n if (isAgent)\r\n $scope.welcomePath = 'TopMenuLayout.WelcomeAgent';\r\n else if (isPropertyManager)\r\n $scope.welcomePath = 'TopMenuLayout.WelcomePropertyManager';\r\n else\r\n $scope.welcomePath = 'TopMenuLayout.Welcome';\r\n }\r\n\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('MobilePhoneConfirmationController', ['$scope', '$http', '$state', '$stateParams', '$sce', '$timeout',\r\n '$location', 'ServiceProvidersService', 'ModalServiceExt', 'usSpinnerService', 'NotificationBoxService',\r\n 'CommonHeaderService', 'LeftMenuService',\r\n function ($scope, $http, $state, $stateParams, $sce, $timeout, $location, ServiceProvidersService,\r\n ModalServiceExt, usSpinnerService, NotificationBoxService, CommonHeaderService, LeftMenuService) {\r\n NotificationBoxService.setTemporarilyHide(true);\r\n LeftMenuService.show();\r\n CommonHeaderService.setUpBackButton($scope._t('Confirmation'));\r\n\r\n $scope.forProgramEnrollments = $stateParams.forProgramEnrollments;\r\n $scope.forProgramEnrollmentsLearnMore = $stateParams.forProgramEnrollmentsLearnMore;\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n var countryCode = utilli.getCountryPhoneNumberCode();\r\n $scope.confirmationCodeMask = \"9999\";\r\n $scope.phoneNumber = $stateParams.phoneNumber;\r\n\r\n $scope.verificationCodeRequested = false;\r\n $scope.canRequestVerificationCode = true;\r\n\r\n (function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/StaticData/GetPhoneNumberConfirmationDisclamer',\r\n method: 'GET'\r\n }).success(function (data) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.html = $sce.trustAsHtml(data);\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors = [ $scope._t('Server error. Try again later.') ];\r\n });\r\n })();\r\n\r\n $scope.timeout = 15;\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n\r\n var tickTimer = function () {\r\n if ($scope.timeout != 0) {\r\n $scope.timeout--;\r\n $timeout(tickTimer, 1000);\r\n } else {\r\n $scope.canRequestVerificationCode = true;\r\n }\r\n\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n if ($scope.timeoutStr.length < 2) {\r\n $scope.timeoutStr = '0' + $scope.timeoutStr;\r\n }\r\n }\r\n\r\n $scope.sendVerificationCode = function () {\r\n $scope.errors = [];\r\n if (validatePhoneNumber()) {\r\n $scope.canRequestVerificationCode = false;\r\n\r\n $scope.timeout = 15;\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n\r\n $timeout(tickTimer, 1000);\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/Profile/GenerateNewPhoneConfirmationCode';\r\n var requestData = {\r\n phoneNumber: countryCode + $scope.phoneNumber\r\n };\r\n utilli.addUserName($state, requestData);\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params:requestData\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n $scope.errors = data.Errors;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n $scope.verificationCodeRequested = true;\r\n }).error(function () {\r\n $scope.errors = [$scope._t('Server error. Try again later.')];\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n\r\n $scope.confirmPhone = function () {\r\n $scope.errors = [];\r\n if (validateConfirmationCode()) {\r\n var url = localStorage.getItem('ApiUrl') + 'api/Profile/ConfirmPhoneNumber';\r\n usSpinnerService.spin('spinner-1');\r\n var requestData = {\r\n phoneNumber: countryCode + $scope.phoneNumber,\r\n code: $scope.confirmationCode\r\n }\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params: requestData\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n $scope.errors = data.Errors;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n } else {\r\n NotificationBoxService.setSubscribeSmsVisibilityServerFlag(false);\r\n var maskedPhone = utilli.getMaskedPhoneNumberValue(countryCode + $scope.phoneNumber);\r\n var popupMessage = $scope._t('Your cell phone number') + ' ' + maskedPhone + ' ' + $scope._t('has been successfully verified for Utilli SMS notifications.');\r\n ModalServiceExt.showMessage($scope._t('SMS Notifications'), popupMessage, function() {\r\n if ($scope.forProgramEnrollments)\r\n $state.goMainLayout('ProgramEnrolments');\r\n else if ($scope.forProgramEnrollmentsLearnMore)\r\n $state.goMainLayout('SmsNotificationsLearnMore');\r\n else\r\n $state.goMainLayout('Profile');\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function () {\r\n $scope.errors = [ $scope._t('Server error. Try again later.') ];\r\n usSpinnerService.spin('spinner-1');\r\n });\r\n }\r\n }\r\n\r\n function validatePhoneNumber() {\r\n var valid = true;\r\n $scope.phoneNumberError = false;\r\n\r\n if (!$scope.phoneNumber) {\r\n $scope.phoneNumberError = true;\r\n valid = false;\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n function validateConfirmationCode() {\r\n var valid = true;\r\n $scope.confirmationCodeError = false;\r\n\r\n if (!$scope.confirmationCode) {\r\n $scope.confirmationCodeError = true;\r\n valid = false;\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n $scope.back = function () {\r\n if ($scope.forProgramEnrollments)\r\n $state.goMainLayout('ProgramEnrolments');\r\n else if ($scope.forProgramEnrollmentsLearnMore)\r\n $state.goMainLayout('SmsNotificationsLearnMore');\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n NotificationBoxService.setTemporarilyHide(false);\r\n });\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('TermsAndConditionsController', ['$scope', '$http', '$sce', 'usSpinnerService',\r\n 'ServiceProvidersService', 'CommonHeaderService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, $sce, usSpinnerService, ServiceProvidersService, CommonHeaderService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n CommonHeaderService.setUpBackButton(_t('Terms and Conditions'), true);\r\n $scope.loadContent = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function(providerData) {\r\n var provider = providerData;\r\n var url = provider.ApiUrl + 'api/StaticData/GetTermsAndConditions';\r\n $http({\r\n url: url,\r\n method: 'GET'\r\n }).success(function(data) {\r\n $scope.html = $sce.trustAsHtml(data);\r\n\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors = [{ key: 'Error', Message: utilli.errors.serverErrorMessage }];\r\n });\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors = [{ key: 'Error', Message: utilli.errors.serverErrorMessage }];\r\n }\r\n );\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('SystemInfoController', [\r\n '$scope', '$http', 'usSpinnerService', 'ServiceProvidersService', 'CommonHeaderService', 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, ServiceProvidersService, CommonHeaderService, ModalServiceExt) {\r\n // ReSharper restore InconsistentNaming\r\n CommonHeaderService.setUp();\r\n\r\n usSpinnerService.spin(\"spinner-1\");\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function(providerData) {\r\n var provider = providerData;\r\n\r\n $http({\r\n method: 'GET',\r\n url: provider.ApiUrl + 'api/System/GetDbInfo'\r\n }).success(function(resp) {\r\n usSpinnerService.stop('spinner-1');\r\n if (!resp || !resp.Data) {\r\n ModalServiceExt.showInfo(\"No response.\");\r\n return;\r\n }\r\n\r\n $scope.dbInfo = resp.Data;\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Unexpected error.\");\r\n });\r\n\r\n $scope.applyMigrations = function() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: provider.ApiUrl + 'api/System/UpdateDb'\r\n }).success(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Success.\");\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Unexpected error.\");\r\n });\r\n };\r\n });\r\n }\r\n ]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('WelcomeController', ['$scope', '$state',\r\n 'ServiceProvidersService', '$sce', 'usSpinnerService', '$http', 'CommonHeaderService',\r\nfunction ($scope, $state, ServiceProvidersService, $sce,\r\n usSpinnerService, $http, CommonHeaderService) {\r\n CommonHeaderService.setUp();\r\n\r\n $scope.isMultipleProviders = !DeploymentSettings.currentServiceProvider;\r\n $scope.appUrls = Config.appUrls;\r\n $scope.enableOutageMap = false;\r\n\r\n if (utilli.goesToDefaultPage($state)) \r\n return;\r\n\r\n $state.goFromWelcomeTo('SignIn.Credentials')\r\n .then(function () {\r\n $state.goFromWelcomeTo('QuickPay.Step1');\r\n });\r\n\r\n $scope.goToQuickPay = function (){\r\n $state.go('TopMenuLayout.SmartPay.Step1');\r\n };\r\n\r\n $scope.goToOutages = function () {\r\n $state.go('TopMenuLayout.OutageCenter', { anonymous: true });\r\n };\r\n\r\n if (DeploymentSettings.currentServiceProvider.length > 0) {\r\n $scope.serviceProviderName = Config.providers[DeploymentSettings.currentServiceProvider].SiteName;\r\n $scope.helpEmail = Config.providers[DeploymentSettings.currentServiceProvider].HelpEmail;\r\n $scope.showPhoneNumbers = Config.providers[DeploymentSettings.currentServiceProvider].EnablePhoneNumbersOnLoginPage;\r\n $scope.enableOutageMap = Config.providers[DeploymentSettings.currentServiceProvider].EnableOutageMap;\r\n }\r\n else {\r\n $scope.serviceProviderName = 'Utilli';\r\n $scope.helpEmail = 'help@utilli.com';\r\n }\r\n $scope.phoneNumbers = $scope._t('loading...');\r\n $scope.loadPhoneNumbers = function (){\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(providers) {\r\n if (!providers || providers.length == 0) {\r\n $scope.phoneNumbers = $scope._t(\"Server error. Try again later.\");\r\n return;\r\n }\r\n\r\n var currentServiceProvider = DeploymentSettings.currentServiceProvider;\r\n if (currentServiceProvider.length == 0) {\r\n $scope.phoneNumbers = $scope._t(\"Configuration error: can't get current service provider.\");\r\n return;\r\n }\r\n\r\n var currentProviderName = Config.providers[currentServiceProvider].Name;\r\n\r\n var providersFiltered = $.grep(providers, function(item) {\r\n return item.Name == currentProviderName;\r\n });\r\n\r\n if (!providersFiltered || providersFiltered.length !== 1) {\r\n $scope.phoneNumbers = $scope._t(\"Configuration error: can't get current service provider.\");\r\n return;\r\n }\r\n\r\n $http({\r\n url: providersFiltered[0].ApiUrl + 'api/StaticData/GetInqueriesPhoneNumbers',\r\n method: \"GET\",\r\n }).success(function(data) {\r\n $scope.phoneNumbers = $sce.trustAsHtml(data);\r\n }).error(function() {\r\n $scope.phoneNumbers = $scope._t(\"Server error. Try again later.\");\r\n });\r\n },\r\n function() {\r\n $scope.phoneNumbers = $scope._t(\"Server error. Try again later.\");\r\n });\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.factory('SignInService', ['$http', '$rootScope', '$q', 'usSpinnerService', '$state', 'DueReminderService',\r\n 'CommonDataService',\r\n function ($http, $rootScope, $q, usSpinnerService, $state, DueReminderService, CommonDataService) {\r\n var svc = {};\r\n svc.services = [];\r\n svc.errors = {};\r\n svc.showResentVerificationEmailField = false;\r\n\r\n svc.resetErrors = function() {\r\n svc.errors.errorFromServerReturned = false;\r\n svc.errors.serverErrorInformation = null;\r\n svc.errors.serverErrors = null;\r\n svc.errors.showServerErrors = false;\r\n svc.showResentVerificationEmailField = false;\r\n }\r\n\r\n function getFromPart(fromAddress) {\r\n if (utilli.isDebug)\r\n console.log('redirection from SignInService to Admin portal page ' + fromAddress);\r\n\r\n var redirectedFrom = JSON.parse(fromAddress);\r\n var fromPart = redirectedFrom.stateName\r\n\r\n if (redirectedFrom.stateParams) {\r\n _.each(redirectedFrom.stateParams, function (param) {\r\n fromPart += '/' + param;\r\n });\r\n }\r\n\r\n return fromPart;\r\n }\r\n\r\n function redirect(state, defaulState) {\r\n var redirectTo = JSON.parse(state);\r\n // We need this check for scenario when user tried to enter admin portal by direct url in browser without loging in.\r\n // After this user will be redirected to sign in page with 'from' part in the url. But after being redirected to 'sign in' page \r\n // user desided to log in as regular user (not admin). \r\n // In this case 'from' state does not exist for user portal and we should ignore it.\r\n var checkState = $state.get(redirectTo.stateName);\r\n if (checkState) {\r\n if (utilli.isDebug)\r\n console.log('redirection from SignInService to ' + state);\r\n $state.go(redirectTo.stateName, redirectTo.stateParams);\r\n }\r\n else {\r\n $state.goMainLayout(defaulState);\r\n }\r\n }\r\n\r\n function _getCurrentProviderName () { \r\n var serviceProviderName = localStorage.getItem('ServiceProviderName');\r\n if(!utilli.checkDefinedValue(serviceProviderName))\r\n return null;\r\n for (var providerName in Config.providers){\r\n var provider = Config.providers[providerName];\r\n if (provider.Name && provider.Name == serviceProviderName)\r\n return providerName;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Sets on the scope touchIdAvailable field\r\n * @param {angularJs scope} scope \r\n */\r\n svc.setIsTouchIdAvailable = function(scope){\r\n try {\r\n if (isMobileOrRipple()){\r\n if (isAndroid()) {\r\n FingerprintAuth.isAvailable(isAvailableSuccess, isAvailableError);\r\n } else if (iOS()) {\r\n window.plugins.touchid.isAvailable(isAvailableSuccess, isAvailableError);\r\n }\r\n }\r\n }\r\n catch (e) {\r\n console.error('Failed to check if finger print API is available: ' + JSON.stringify(e));\r\n }\r\n\r\n function isAvailableSuccess(result) {\r\n console.log(\"FingerprintAuth available: \" + JSON.stringify(result));\r\n if (isAndroid()) {\r\n scope.touchIdAvailable = result.isAvailable && result.hasEnrolledFingerprints;\r\n }\r\n else if (iOS()) {\r\n scope.touchIdAvailable = true;\r\n }\r\n }\r\n\r\n function isAvailableError(message) {\r\n console.log(\"isAvailableError(): \" + message);\r\n scope.touchIdAvailable = false;\r\n }\r\n }\r\n\r\n svc.signIn = function (login, passwd, apiUrl, serviceProviderName, fromAddress, \r\n isTouchIdAvailable, touchIdRefreshToken) {\r\n var result = $q.defer();\r\n usSpinnerService.spin('spinner-1');\r\n var parameters = {\r\n userNameOrEmail: $.trim(login),\r\n password: $.trim(passwd),\r\n client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal,\r\n mobilePlatform: isMobileOrRipple() ? utilli.getPlatformName() : '',\r\n rememberMe: false,\r\n mobileDeviceToken: isMobileOrRipple() ? utilli.getDeviceToken() : '',\r\n isTouchIdAvailable: isTouchIdAvailable ? true : false,\r\n touchIdRefreshToken: touchIdRefreshToken\r\n };\r\n $http({\r\n url: apiUrl + 'api/Account/LogOn/',\r\n method: \"POST\",\r\n params: parameters\r\n }).success(function (response) {\r\n if (!response) {\r\n var errorMessage = $rootScope._t(\"Server error. Try again later.\");\r\n result.reject(errorMessage);\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = errorMessage;\r\n }\r\n else if (response.ERROR_LIST.length > 0) {\r\n svc.errors.showServerErrors = true;\r\n svc.errors.serverErrors = response.ERROR_LIST;\r\n if (response.ERROR_LIST[0].key == \"IncompleteRegistrationError\"){\r\n svc.showResentVerificationEmailField = true;\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n $rootScope.contactPhoneNumber = commonData.SupportPhone;\r\n $rootScope.workingHours = commonData.WorkingHours;\r\n $rootScope.billingEmailTo = commonData.BillingEmailTo;\r\n $rootScope.serviceProviderName = commonData.CompanyName;\r\n result.reject(response.ERROR_LIST[0].Message);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return;// return because the spinner must spin until common data is received\r\n }\r\n else {\r\n svc.showResentVerificationEmailField = false;\r\n }\r\n result.reject(response.ERROR_LIST[0].Message);\r\n }\r\n else if (response.Valid != 1) {\r\n var errorMessage = $rootScope._t(\"We cannot check your credentials. Please try again later.\");\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = errorMessage;\r\n result.reject(errorMessage);\r\n }\r\n else {\r\n result.resolve();\r\n svc.errors.errorFromServerReturned = false;\r\n svc.errors.showServerErrors = false;\r\n\r\n if (isTouchIdAvailable){\r\n localStorage.setItem('touchIdData', JSON.stringify({\r\n lastApiUrl: apiUrl,\r\n lastServiceProviderName: serviceProviderName,\r\n refreshToken: response.TouchIdRefreshToken\r\n }));\r\n }\r\n localStorage.setItem('SecurityToken', response.SecurityToken);\r\n localStorage.setItem('ApiUrl', apiUrl);\r\n localStorage.setItem('ServiceProviderName', serviceProviderName);\r\n localStorage.setItem('language', response.Language);\r\n\r\n if (!DeploymentSettings.currentServiceProvider) \r\n DeploymentSettings.currentServiceProvider = _getCurrentProviderName();\r\n\r\n if (!isMobileOrRipple() && response.IsAdmin) {\r\n var basePath = window.location.origin + window.location.pathname;\r\n if (basePath.indexOf('smart-pay.html') > 0){\r\n basePath = basePath.substr(0, basePath.indexOf('smart-pay.html'));\r\n }\r\n var adminUrl = basePath + 'Admin/#/';\r\n if (fromAddress)\r\n adminUrl += getFromPart(fromAddress);\r\n utilli.setWindowLocation(adminUrl);\r\n return;\r\n }\r\n\r\n localStorage.setItem('CurrentAccountNumber', response.CurrentAccountNo);\r\n localStorage.setItem('BusinessPartner', response.BusinessPartner);\r\n localStorage.setItem('current_user', response.UserName);\r\n localStorage.setItem('email', response.Email);\r\n\r\n if (response.CurrentAccountNo) {\r\n DueReminderService.unmarkAsShown();\r\n if (fromAddress) {\r\n redirect(fromAddress, 'Dashboard');\r\n } else\r\n $state.goMainLayout('Dashboard');\r\n }\r\n else if (utilli.hasAgentRole())\r\n $state.goMainLayout('Search');\r\n else if (utilli.hasAssistantRole())\r\n $state.goMainLayout('AssistantSearch');\r\n else if (utilli.hasFieldServiceEngineerRole())\r\n $state.goMainLayout('WorkCenters');\r\n else if (utilli.hasPropertyManagerRole()) {\r\n localStorage.setItem('showEsScoreInfoPopup', 'true');\r\n if (fromAddress) {\r\n redirect(fromAddress, 'PropertyList');\r\n } else {\r\n $state.goMainLayout('PropertyList');\r\n }\r\n }\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (e) {\r\n var errorMessage = $rootScope._t(\"Server error. Try again later.\");\r\n result.reject(errorMessage);\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = errorMessage;\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return result.promise;\r\n };\r\n\r\n svc.resendVerificationEmail = function (login, passwd, apiUrl, serviceProviderName) {\r\n usSpinnerService.spin('spinner-1');\r\n var parameters = {\r\n userNameOrEmail: $.trim(login),\r\n password: $.trim(passwd),\r\n };\r\n $http({\r\n url: apiUrl + 'api/Account/SendChallengeEmail/',\r\n method: \"POST\",\r\n params: parameters\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (e) {\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = $rootScope._t(\"Server error. Try again later.\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n svc.showResendVerificationEmail = function () {\r\n return svc.showResentVerificationEmailField;\r\n }\r\n\r\n return svc;\r\n }]);\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('SignInPartController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.setUp();\r\n $rootScope.errorFromServerReturned = false;\r\n $rootScope.showServerErrors = false;\r\n $rootScope.serverErrorInformation = '';\r\n $rootScope.serverErrors = [];\r\n\r\n $scope.back = function() {\r\n $state.go('Welcome');\r\n };\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('CredentialsController', ['$rootScope', '$scope', '$state', '$http', 'usSpinnerService', 'SignInService', \r\n '$stateParams', 'CommonHeaderService', 'CheckVersionService', '$q',\r\n function ($rootScope, $scope, $state, $http, usSpinnerService, SignInService, $stateParams, CommonHeaderService,\r\n CheckVersionService, $q) {\r\n\r\n $rootScope.getBodyClass = function () {\r\n return { 'smart-pay': false };\r\n }\r\n \r\n if(utilli.isWglcx() && utilli.goesToDefaultPage($state)){\r\n return;\r\n }\r\n var touchIdClientId = \"UtilliTouchIdClientId\";\r\n $scope.touchIdAvailable = false;\r\n SignInService.setIsTouchIdAvailable($scope);\r\n $scope.hasTouchIdData = localStorage.getItem('touchIdData') != null;\r\n\r\n $scope.loginWithTouchId = function () {\r\n if (!isMobileOrRipple())\r\n return;\r\n if (isAndroid()) {\r\n FingerprintAuth.encrypt({ clientId: touchIdClientId }, fingerPrintSuccess, fingerPrintError);\r\n } else if (iOS()) {\r\n window.plugins.touchid.verifyFingerprint(\r\n 'Scan your fingerprint please', // this will be shown in the native scanner popup\r\n fingerPrintSuccess, fingerPrintError\r\n );\r\n }\r\n }\r\n\r\n function fingerPrintSuccess() {\r\n var touchIdDataString = localStorage.getItem('touchIdData');\r\n var touchIdData = touchIdDataString == null ? null : JSON.parse(touchIdDataString);\r\n SignInService.signIn(null, null,\r\n touchIdData.lastApiUrl,\r\n touchIdData.lastServiceProviderName,\r\n $stateParams.from, $scope.touchIdAvailable, touchIdData.refreshToken);\r\n }\r\n\r\n function fingerPrintError(error) {\r\n console.log(\"FingerprintAuth Error: \" + error);\r\n }\r\n\r\n var checkVersionPromise = CheckVersionService.checkVersion();\r\n localStorage.removeItem('ServiceProviderName');\r\n\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.stepName = 'Login';\r\n $scope.errors = SignInService.errors;\r\n $scope.showResentVerificationEmail = function () {\r\n return SignInService.showResendVerificationEmail();\r\n }\r\n $scope.showResentVerificationEmailDone = false;\r\n\r\n var _lastLoginWithRequiredEmail;\r\n\r\n $scope.togglePassword = function (pswId, iconId) {\r\n utilli.togglePasswordVisibility(pswId, iconId);\r\n }\r\n\r\n $scope.$watch('credentials.login', function () {\r\n if ($scope.emailRequired)\r\n $scope.emailRequired = false;\r\n if (_lastLoginWithRequiredEmail != undefined && $scope.credentials.login == _lastLoginWithRequiredEmail)\r\n $scope.emailRequired = true;\r\n });\r\n\r\n if (!$scope.credentials) {\r\n $scope.credentials = {};\r\n if (Config.debug) {\r\n $scope.credentials.login = 'testUser';\r\n $scope.credentials.email = 'max.suhinin+63@gmail.com';\r\n $scope.credentials.password = 'online123';\r\n }\r\n }\r\n\r\n var gotoAfterVersionChecking = function (state, params) {\r\n usSpinnerService.spin('spinner-1');\r\n checkVersionPromise.then(function () {\r\n $state.go(state, params);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.goToForgotPassword = function () {\r\n var state = '';\r\n var params = null;\r\n if (utilli.isWglcx()) {\r\n state = 'TopMenuLayout.ForgotPasswordByEmail.Step1';\r\n }\r\n else if ($state.current.name.indexOf('WelcomeAgent') > 0 || utilli.isPropertyManagerApp()) {\r\n state = 'TopMenuLayout.ForgotPasswordByEmail.Step1';\r\n params = { from: $state.current.name }\r\n } \r\n else {\r\n state = 'TopMenuLayout.ForgotPassword.Step1';\r\n }\r\n gotoAfterVersionChecking(state, params);\r\n }\r\n\r\n $scope.goToForgotUserId = function () {\r\n var state = '';\r\n var params = null;\r\n if (utilli.isWglcx()) {\r\n state = 'TopMenuLayout.ForgotUserIdByEmail.Step1';\r\n }\r\n else if ($state.current.name.indexOf('WelcomeAgent') > 0 || utilli.isPropertyManagerApp()) {\r\n state = 'TopMenuLayout.ForgotUserIdByEmail.Step1';\r\n params = { from: $state.current.name }\r\n } \r\n else {\r\n state = 'TopMenuLayout.ForgotUserId.Step1';\r\n }\r\n gotoAfterVersionChecking(state, params);\r\n }\r\n\r\n $scope.backVisible = isMobileOrRipple();\r\n\r\n $scope.back = function () {\r\n $state.goToWelcome();\r\n };\r\n\r\n $scope.resentVerificationEmail = function () {\r\n var copyServices = SignInService.services.slice();\r\n\r\n SignInService.resendVerificationEmail($scope.credentials.login,\r\n $scope.credentials.password,\r\n copyServices[0].ApiUrl,\r\n copyServices[0].Name);\r\n\r\n $scope.showResentVerificationEmailDone = true;\r\n }\r\n\r\n $scope.next = function () {\r\n SignInService.resetErrors();\r\n $scope.submitted = true;\r\n if (!$scope.loginForm.$valid || $scope.emailRequired && !$scope.credentials.email) {\r\n return;\r\n }\r\n if (SignInService.services.length > 0 && $scope.emailRequired)\r\n {\r\n var copyServices = SignInService.services.slice();\r\n var i = 0;\r\n var isMaintenance = _.any(copyServices, function (item) { return !item.IsAvailable })\r\n while (i < copyServices.length)\r\n {\r\n if (!copyServices[i].UserData && isMaintenance) {\r\n i++;\r\n continue;\r\n }\r\n if ($scope.credentials.email.toUpperCase() != copyServices[i].UserData.Email.toUpperCase())\r\n {\r\n copyServices.splice(i, 1);\r\n continue;\r\n }\r\n i++;\r\n }\r\n\r\n if (copyServices.length == 0)\r\n {\r\n // wrong email\r\n $scope.emailError = 'There is no registered users with such email address.';\r\n }\r\n else if (copyServices.length == 1)\r\n {\r\n SignInService.signIn($scope.credentials.login,\r\n $scope.credentials.password,\r\n copyServices[0].ApiUrl,\r\n copyServices[0].Name,\r\n $stateParams.from, $scope.touchIdAvailable);\r\n }\r\n else\r\n {\r\n SignInService.services = copyServices;\r\n $state.goFromWelcomeTo('SignIn.Providers', {\r\n signInParams: {\r\n from: $stateParams.from,\r\n login: $scope.credentials.login,\r\n passwd: $scope.credentials.password\r\n }\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n var checkProvidersPromise = checkServiceProviders();\r\n $q.all([checkVersionPromise, checkProvidersPromise]).then(function (data) {\r\n var checkVersionResult = data[0];\r\n var checkProvidersSuccess = data[1];\r\n if (CheckVersionService.isVersionCorrect(checkVersionResult)) {\r\n if (checkProvidersSuccess) {\r\n loginByProvider();\r\n }\r\n }\r\n else if (CheckVersionService.isVersionWrong(checkVersionResult)) {\r\n $state.go('UpdateApp');\r\n }\r\n else {\r\n if (!window.disableNoConnectionPage) {\r\n $state.go('NoConnection');\r\n }\r\n }\r\n }, function (err) {\r\n setError(err && err.Message\r\n ? err.Message\r\n : err ? err : utilli.errors.serverErrorMessage);\r\n });\r\n };\r\n\r\n function resetErrors() {\r\n $scope.errors.errorFromServerReturned = false;\r\n $scope.errors.showServerErrors = false;\r\n $scope.errors.serverErrorInformation = '';\r\n $scope.errors.serverErrors = [];\r\n $scope.showResentVerificationEmailDone = false;\r\n }\r\n\r\n function setError(message) {\r\n $scope.errors.errorFromServerReturned = true;\r\n $scope.errors.serverErrorInformation = message;\r\n }\r\n\r\n function setErrors(errors, isVisible) {\r\n $scope.errors.serverErrors = errors;\r\n $scope.errors.showServerErrors = isVisible;\r\n }\r\n\r\n function checkServiceProviders() {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var deferred = $q.defer();\r\n\r\n $scope.submitted = false;\r\n resetErrors();\r\n\r\n var login = { login: $scope.credentials.login };\r\n var providersApiUrl = DeploymentSettings.providersServiceUrl;\r\n\r\n // most devices replace the first letter in login to capital case,\r\n // but login names are case insensitive, so Appreviewer is also correct\r\n if ($scope.credentials.login && $scope.credentials.login.toLowerCase() == 'appreviewer') {\r\n if(DeploymentSettings.providersGroupShortName == Config.wglProvidersGroupShortName )\r\n providersApiUrl = \"https://apistaging.utilli.com/wgl-providers/api/\";\r\n else if (DeploymentSettings.providersGroupShortName == Config.hcProvidersGroupShortName)\r\n providersApiUrl = \"https://apistaging.utilli.com/hc-providers/api/\";\r\n else if (DeploymentSettings.providersGroupShortName == Config.pxProvidersGroupShortName)\r\n providersApiUrl = \"https://apistaging.utilli.com/px-providers/api/\";\r\n else\r\n providersApiUrl = \"https://apiqa.utilli.com/api/\";\r\n }\r\n\r\n var url = providersApiUrl + 'Providers/GetProviders';\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params: login\r\n }).success(function (data) {\r\n if (!data) {\r\n setError(\"Server error. Try again later.\");\r\n deferred.reject();\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n // if there is no items then userid wasn't found\r\n if (data.length == 0) {\r\n setError($scope._t(\"Login name\") + \" '\" + login.login + \"' \" + $scope._t(\"is not registered.\"));\r\n deferred.reject($scope._t(\"Login name\") + \" '\" + login.login + \"' \" + $scope._t(\"is not registered.\"));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n SignInService.services = data;\r\n usSpinnerService.stop('spinner-1');\r\n localStorage.setItem(\"UserName\", $scope.credentials.login);\r\n deferred.resolve(data);\r\n }\r\n ).error(function () {\r\n setError(\"Server error. Try again later.\");\r\n deferred.reject(\"Server error. Try again later.\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function loginByProvider() {\r\n // if it's a regular portal then we should use only the provider that is relevant for the current portal\r\n if (!!DeploymentSettings.currentServiceProvider) {\r\n var currentServiceProvider = DeploymentSettings.currentServiceProvider;\r\n var currentProviderName = Config.providers[currentServiceProvider].Name;\r\n var providersFiltered = $.grep(SignInService.services, function (item) {\r\n return item.Name == currentProviderName;\r\n });\r\n if (!providersFiltered || providersFiltered.length !== 1) {\r\n setError($scope._t(\"Login name\") + \" '\" + $scope.credentials.login + \"' \" + $scope._t(\"is not registered.\"));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n if (SignInService.services && SignInService.services.length == 1 \r\n && !SignInService.services[0].IsAvailable) {\r\n \r\n usSpinnerService.stop('spinner-1');\r\n $state.goToMaintenance();\r\n return;\r\n }\r\n SignInService.signIn($scope.credentials.login,\r\n $scope.credentials.password,\r\n providersFiltered[0].ApiUrl,\r\n providersFiltered[0].Name,\r\n $stateParams.from, $scope.touchIdAvailable);\r\n return;\r\n }\r\n // if we are here then it's not a regular portal. it's either mobile/ripple or common portal (like portal.utilli.com).\r\n // and at least one result is found.\r\n // if it is only one result then just try login, since it's the case when\r\n // on mobile for a given user id we have only one user.\r\n // there is no need to ask into which service provider he wants to login\r\n if (SignInService.services.length == 1) {\r\n\r\n SignInService.signIn($scope.credentials.login,\r\n $scope.credentials.password,\r\n SignInService.services[0].ApiUrl,\r\n SignInService.services[0].Name,\r\n $stateParams.from, $scope.touchIdAvailable);\r\n return;\r\n }\r\n // if we are here then there are more than one users for different companies\r\n // if they all are registered using the same email then just go to the page\r\n // where this user can select company into which he wants to login\r\n if (!isEmailRequired(SignInService.services)) {\r\n usSpinnerService.stop('spinner-1');\r\n $state.goFromWelcomeTo('SignIn.Providers', {\r\n signInParams: {\r\n from: $stateParams.from,\r\n login: $scope.credentials.login,\r\n passwd: $scope.credentials.password\r\n }\r\n });\r\n }\r\n // if we are here then there are at least 2 emails for one userid\r\n // this can be a case when 2 users choosed one userid independently during\r\n // registration on portals where we don't check uniqueness of the userid\r\n // across all portals. hence we need to ask this user to specify his email\r\n // so that we will be able to identify his company.\r\n // idea is that such userid collisions will be very rare all not happen.\r\n // and if they happen then for such users it will be more convenient to login\r\n // using email\r\n $scope.credentials.email = '';\r\n $scope.emailRequired = true;\r\n _lastLoginWithRequiredEmail = $scope.credentials.login;\r\n usSpinnerService.stop('spinner-1');// stop the spinner to allow user to enter email\r\n }\r\n\r\n function isEmailRequired(data) {\r\n if (_.any(data, function (item) { return !item.IsAvailable })) {\r\n return true;\r\n }\r\n //if all email is the same we return false\r\n var email = data[0].UserData.Email;\r\n for (var i = 1; i < data.length; i++) {\r\n if (data[i].UserData.Email.toUpperCase() === email.toUpperCase())\r\n continue;\r\n else \r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n ]).directive('capsLock', function () {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attr) {\r\n\r\n scope.capsLockFlags = [];\r\n scope.resetCapsLockFlags = function() {\r\n scope.capsLockFlags.forEach(function(item) {\r\n scope[item] = false;\r\n });\r\n }\r\n\r\n // If element lost focus - hide warning\r\n element.bind('blur', function(e) {\r\n scope.resetCapsLockFlags();\r\n });\r\n\r\n element.bind('keypress', function(e) {\r\n // If letter is from a to z, set false\r\n if (e.which >= 97 && e.which <= 122) {\r\n scope.resetCapsLockFlags();\r\n scope.$apply();\r\n }\r\n // If letter from A to Z and shift is not on, set true\r\n else if (e.which >= 65 && e.which <= 90 && !e.shiftKey) {\r\n scope[attr.capsLock] = true;\r\n if (!scope.capsLockFlags.includes(attr.capsLock))\r\n scope.capsLockFlags.push(attr.capsLock);\r\n scope.$apply();\r\n }\r\n });\r\n\r\n element.bind('keydown', function(e) {\r\n if (e.which === 20) {\r\n scope.resetCapsLockFlags();\r\n scope.$apply();\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('ProvidersController', ['$scope', 'SignInService', '$state', '$stateParams',\r\n function ($scope, SignInService, $state, $stateParams) {\r\n $scope.stepName = 'Select Service Provider';\r\n $scope.services = SignInService.services;\r\n var selectedService = -1;\r\n $scope.touchIdAvailable = false;\r\n SignInService.setIsTouchIdAvailable($scope);\r\n\r\n $scope.radioClick = function(index)\r\n {\r\n if (selectedService >= 0)\r\n {\r\n $('#service' + selectedService).removeClass('service-active');\r\n $(\"input[name='radio\" + selectedService + \"']\").prop('checked', false);\r\n }\r\n\r\n $('#service' + index).addClass('service-active');\r\n $(\"input[name='radio\" + index + \"']\").prop('checked', true);\r\n selectedService = index;\r\n var provider = SignInService.services[selectedService];\r\n SignInService.signIn($stateParams.signInParams.login,\r\n $stateParams.signInParams.passwd,\r\n provider.ApiUrl,\r\n provider.Name,\r\n $stateParams.signInParams.from, \r\n $scope.touchIdAvailable).\r\n then(function () { }, function (error) {\r\n $scope.error = error;\r\n resetErrors();\r\n });\r\n }\r\n\r\n function resetErrors() {\r\n SignInService.errors.errorFromServerReturned = false;\r\n SignInService.errors.showServerErrors = false;\r\n SignInService.errors.serverErrorInformation = '';\r\n SignInService.errors.serverErrors = [];\r\n }\r\n\r\n $scope.back = function () {\r\n $state.goFromWelcomeTo('SignIn.Credentials');\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('SignUpController', ['$scope', '$state', 'CommonHeaderService', 'RegistrationInfoService', '$stateParams',\r\n function ($scope, $state, CommonHeaderService, RegistrationInfoService, $stateParams) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n\r\n tryToInitRegistrationInfoService();\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n function tryToInitRegistrationInfoService(){\r\n RegistrationInfoService.userInfo.accountnumber = $stateParams.accountnumber;\r\n RegistrationInfoService.userInfo.zip = $stateParams.zip;\r\n RegistrationInfoService.userInfo.token = $stateParams.token;\r\n RegistrationInfoService.userInfo.customerfullname = $stateParams.customerfullname;\r\n }\r\n }])\r\n.controller('SignUpStep1Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'usSpinnerService', 'ServiceProvidersService', '$stateParams', 'CheckVersionService', '$q', 'RegistrationInfoService',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService, ServiceProvidersService,\r\n $stateParams, CheckVersionService, $q, RegistrationInfoService) {\r\n\r\n utilli.fixSelectElementForMobile();\r\n\r\n var checkVersionPromise = CheckVersionService.checkVersion();\r\n $scope.accountMaxLength = Config.contractAccountMaxLength;\r\n $scope.providers = [];\r\n $scope.provider = {};\r\n $scope.errors = [];\r\n $scope.isProviderListVisible = false;\r\n\r\n getProviderInfo();\r\n\r\n $scope.initForm = function () {\r\n var isDataExist = RegistrationInfoService.userInfo.accountnumber != undefined \r\n && RegistrationInfoService.userInfo.zip != undefined\r\n && RegistrationInfoService.userInfo.customerfullname != undefined;\r\n if (isDataExist) {\r\n $scope.AccountNumber = RegistrationInfoService.userInfo.accountnumber;\r\n $scope.ZipCode = RegistrationInfoService.userInfo.zip;\r\n $scope.FullName = RegistrationInfoService.userInfo.customerfullname;\r\n }\r\n };\r\n\r\n $scope.submit = function () {\r\n ServiceProvidersService.setCurrentProvider($scope.provider);\r\n usSpinnerService.spin(\"spinner-1\");\r\n $moduleServices.hideKeyboard();\r\n\r\n if (!$scope.formAccountInfo.$valid) {\r\n $scope.submitted = true;\r\n usSpinnerService.stop(\"spinner-1\");\r\n return;\r\n }\r\n\r\n $rootScope.serviceUrl = $scope.provider.ApiUrl + 'api/Registration/Register/';\r\n $rootScope.webServicesUrl = $scope.provider.ApiUrl;\r\n var checkAccountInfoPromise = checkAccountInfo();\r\n\r\n $q.all([checkVersionPromise, checkAccountInfoPromise]).then(function (data) {\r\n var checkVersionResult = data[0];\r\n var checkAccountInfoResult = data[1];\r\n if (CheckVersionService.isVersionCorrect(checkVersionResult)) {\r\n if (checkAccountInfoResult) {\r\n RegistrationInfoService.userInfo.accountnumber = $.trim($scope.AccountNumber);\r\n RegistrationInfoService.userInfo.zip = $.trim($scope.ZipCode);\r\n RegistrationInfoService.userInfo.customerfullname = $.trim($scope.FullName);\r\n RegistrationInfoService.userInfo.token = $scope.token;\r\n $state.goRelativeTo('SignUp', 'Step2');\r\n }\r\n }\r\n else if (CheckVersionService.isVersionWrong(checkVersionResult)) {\r\n $state.go('UpdateApp');\r\n }\r\n else {\r\n if (!window.disableNoConnectionPage) {\r\n $state.go('NoConnection');\r\n }\r\n }\r\n }, function (err) {\r\n $scope.errors.push(err && err.Message ? err.Message : utilli.errors.serverErrorMessage);\r\n });\r\n };\r\n\r\n function getProviderInfo () { \r\n usSpinnerService.spin(\"spinner-1\");\r\n if (!DeploymentSettings.currentServiceProvider) {\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(allProviders) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.isProviderListVisible = allProviders.length > 1;\r\n $scope.providers = allProviders;\r\n $scope.provider = allProviders[0];\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n else {\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.provider = providerData;\r\n },\r\n function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n }\r\n\r\n function checkAccountInfo() {\r\n var deferred = $q.defer();\r\n var data = {\r\n AccountNumber: $scope.AccountNumber,\r\n ZipCode: $scope.ZipCode,\r\n FullName: $scope.FullName,\r\n Step: 1,\r\n Client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal\r\n }\r\n $http({\r\n url: $rootScope.serviceUrl,\r\n method: \"POST\",\r\n data: data\r\n }).success(function (response) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n if (response) {\r\n if (response.Errors != null && response.Errors.length > 0) {\r\n $scope.errors = response.Errors;\r\n deferred.resolve(false);\r\n }\r\n else {\r\n $scope.token = response.Token;\r\n $scope.AccountNumber = response.NonLegacyAccount;\r\n $scope.serviceProvider = $scope.provider;\r\n deferred.resolve(true);\r\n }\r\n }\r\n else {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n deferred.resolve(false);\r\n }\r\n }).error(function () {\r\n deferred.reject();\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop(\"spinner-1\");\r\n });\r\n return deferred.promise;\r\n }\r\n }])\r\n.controller('SignUpStep2Controller', ['$scope', '$rootScope', '$http', '$state', 'CommonDataService', \r\n 'usSpinnerService', '$stateParams', 'ServiceProvidersService', 'RegistrationInfoService', '$q',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $state, CommonDataService, usSpinnerService, $stateParams,\r\n ServiceProvidersService, RegistrationInfoService,$q) {\r\n \r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n if ($stateParams.email) {\r\n $scope.Email = $stateParams.email;\r\n $scope.Email2 = $stateParams.email;\r\n }\r\n\r\n var loadingText = _t('Loading...');\r\n $scope.errors = [];\r\n $scope.passRequirements = [{ Value: loadingText }];\r\n $scope.SecurityQuestions = [loadingText];\r\n $scope.SecurityQuestion = loadingText;\r\n\r\n init();\r\n initForm();\r\n\r\n utilli.fixSelectElementForMobile();\r\n\r\n $scope.isUserDataCorrect = function () { \r\n var result = !$scope.formAccountInfo.UserID.$error.required && \r\n !$scope.formAccountInfo.Email.$error.required &&\r\n !$scope.formAccountInfo.SecurityAnswer.$error.required &&\r\n $scope.UserID.length >= $scope.minUserIdLength;\r\n return result;\r\n }\r\n\r\n $scope.isPasswdValid = function () { \r\n $scope.passwdErrors = utilli.validatePassword($scope.Password, $scope.UserID, $scope.passRequirements, $scope.paswdMinLength, null, $scope.minUserIdLength);\r\n $scope.passwordsNotMatch = $scope.Password && $scope.Password !== $scope.ConfirmPassword \r\n ? $scope._t('Passwords do not match.')\r\n : null;\r\n var result = $scope.passwdErrors.length == 0 && !$scope.passwordsNotMatch;\r\n return result;\r\n }\r\n\r\n $scope.submit = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $scope.errors = [];\r\n \r\n var isUserDataCorrect = $scope.isUserDataCorrect();\r\n var isPasswdValid = $scope.isPasswdValid();\r\n\r\n if (!$scope.formAccountInfo.$valid || !isUserDataCorrect || !isPasswdValid) {\r\n $scope.errors.push(utilli.errors.validationErorrsMessage);\r\n utilli.scrollTop();\r\n $scope.submitted = true;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n \r\n var data = {\r\n AccountNumber: RegistrationInfoService.userInfo.accountnumber,\r\n ZipCode: RegistrationInfoService.userInfo.zip,\r\n Token: RegistrationInfoService.userInfo.token,\r\n UserName: $.trim($scope.UserID),\r\n Email: $.trim($scope.Email.toLowerCase()),\r\n Password: $scope.Password,\r\n ConfirmPassword: $scope.ConfirmPassword,\r\n SecurityQuestion1: $scope.SecurityQuestion,\r\n SecurityAnswer1: $scope.SecurityAnswer,\r\n Client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal,\r\n Step: 2\r\n }\r\n\r\n $http({\r\n url: $rootScope.serviceUrl,\r\n method: \"POST\",\r\n data: data\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.Errors != null && response.Errors.length > 0) {\r\n $scope.errors = response.Errors;\r\n }\r\n else {\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData($rootScope.webServicesUrl, true)\r\n .then(function () {\r\n RegistrationInfoService.userInfo.token = response.Token;\r\n RegistrationInfoService.userInfo.user = $.trim($scope.UserID);\r\n RegistrationInfoService.userInfo.email = $.trim($scope.Email.toLowerCase());\r\n RegistrationInfoService.userInfo.psw = $scope.Password;\r\n RegistrationInfoService.userInfo.question = $scope.SecurityQuestion;\r\n RegistrationInfoService.userInfo.answer = $scope.SecurityAnswer;\r\n $state.goRelativeTo('SignUp', 'Step3');\r\n usSpinnerService.stop('spinner-1');\r\n }, function () {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n else {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n function initForm() {\r\n $scope.UserID = RegistrationInfoService.userInfo.user;\r\n $scope.Email = RegistrationInfoService.userInfo.email;\r\n $scope.Email2 = RegistrationInfoService.userInfo.email;\r\n $scope.SecurityAnswer = RegistrationInfoService.userInfo.answer;\r\n $scope.SecurityQuestion = RegistrationInfoService.userInfo.question;\r\n };\r\n\r\n function init () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n $rootScope.webServicesUrl = providerData.ApiUrl;\r\n $rootScope.serviceUrl = providerData.ApiUrl + 'api/Registration/Register/';\r\n CommonDataService.getCommonData($rootScope.webServicesUrl)\r\n .then(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.paswdMinLength = data.PasswordLength;\r\n $scope.passRequirements = data.PasswordRequirements;\r\n $scope.minUserIdLength = data.MinUserIdLength;\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n \r\n $http.get(providerData.ApiUrl + 'api/StaticData/GetSecurityQuestions/')\r\n .then(function(resp) {\r\n var sequrityQeuestions = JSON.parse(resp.data);\r\n $scope.SecurityQuestions = sequrityQeuestions;\r\n $scope.SecurityQuestion = RegistrationInfoService.userInfo.question \r\n ? RegistrationInfoService.userInfo.question\r\n : $scope.SecurityQuestions[0];\r\n },\r\n function() {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n }])\r\n.controller('SignUpStep3Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams', 'moduleServices',\r\n 'usSpinnerService', '$sce', 'RegistrationInfoService',\r\n function ($scope, $rootScope, $http, $state, $stateParams, $moduleServices, usSpinnerService, $sce,\r\n RegistrationInfoService) {\r\n \r\n $scope.errors = [];\r\n $scope.emailNotificationsAccepted = true;\r\n\r\n $scope.loadTermsAndConditions = function () {\r\n if($rootScope.webServicesUrl)\r\n getTermsAndConditions($rootScope.webServicesUrl);\r\n else\r\n $state.go('TopMenuLayout.SignUp.Step1');\r\n }\r\n\r\n function getTermsAndConditions(baseUrl) { \r\n usSpinnerService.spin(\"spinner-1\");\r\n $http({\r\n url: baseUrl + 'api/StaticData/GetTermsAndConditions',\r\n method: 'GET'\r\n }).success(function(data) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.html = $sce.trustAsHtml(data);\r\n }).error(function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n\r\n $scope.TermAndConditionsFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n $moduleServices.hideKeyboard();\r\n checkTermAndConditionsFormSubmit();\r\n };\r\n\r\n function checkTermAndConditionsFormSubmit() {\r\n\r\n var language = localStorage.getItem('language');\r\n if (!language)\r\n language = 'en';\r\n\r\n var data = {\r\n AccountNumber: RegistrationInfoService.userInfo.accountnumber,\r\n ZipCode: RegistrationInfoService.userInfo.zip,\r\n Fullname: RegistrationInfoService.userInfo.customerfullname,\r\n UserName: RegistrationInfoService.userInfo.user,\r\n Email: RegistrationInfoService.userInfo.email,\r\n Password: RegistrationInfoService.userInfo.psw,\r\n SecurityQuestion1: RegistrationInfoService.userInfo.question,\r\n SecurityAnswer1: RegistrationInfoService.userInfo.answer,\r\n Token: RegistrationInfoService.userInfo.token,\r\n TermsAndConditions: $scope.termsAccepted,\r\n EmailNotificationsAccepted: $scope.emailNotificationsAccepted,\r\n Language: language,\r\n Client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal,\r\n Step: 3\r\n };\r\n\r\n $http({\r\n url: $rootScope.serviceUrl,\r\n method: \"POST\",\r\n data: data\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.Errors && response.Errors.length > 0) \r\n $scope.errors = response.Errors;\r\n else \r\n $state.goRelativeTo('SignUp', 'Success');\r\n }\r\n else {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n }])\r\n.controller('SignUpSuccessController', ['$scope', '$rootScope', 'CommonDataService', \r\n 'usSpinnerService', '$state',\r\n function ($scope, $rootScope, CommonDataService, usSpinnerService, $state) {\r\n $scope.errors = [];\r\n CommonDataService.getCommonData($rootScope.webServicesUrl)\r\n .then(function (commonData) {\r\n $scope.companyNameLong = commonData.CompanyNameLong;\r\n $scope.companyNameLongWithoutTrailingPeriod = commonData.CompanyNameLongWithoutTrailingPeriod;\r\n $scope.helpEmail = commonData.CompanyHelpEmail;\r\n usSpinnerService.stop('spinner-1');\r\n\r\n $scope.SuccessOk = function () {\r\n $state.goToWelcome();\r\n }\r\n });\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('QuickPayController', ['$scope', '$state', 'CommonHeaderService',\r\n function ($scope, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n if ($state.is('QuickPay')) {\r\n $state.go('.Step1');\r\n }\r\n }]);\r\n\r\n\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('QuickPayStep1Controller', ['$scope', '$state',\r\n function ($scope, $state) {\r\n\r\n $scope.goToStep2 = function (){\r\n $state.goRelativeTo(\"QuickPay\", \"Step2\");\r\n };\r\n\r\n $scope.goToWelcome = function () {\r\n $state.goToWelcome();\r\n };\r\n }]);\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('QuickPayStep2Controller', ['$scope', '$timeout', '$state', '$http', 'usSpinnerService', 'LeftMenuService',\r\n 'CommonDataService', '$q', 'ServiceProvidersService', 'ModalServiceExt', 'PaymentVerificationService',\r\n function ($scope, $timeout, $state, $http, usSpinnerService, LeftMenuService, CommonDataService, $q, \r\n ServiceProvidersService, ModalServiceExt, PaymentVerificationService) {\r\n\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('QuickPay');\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n var apiUrl = '';\r\n \r\n function initPage() {\r\n $scope.imagesPath = utilli.isAdmin\r\n ? \"../Images\"\r\n : \"Images\";\r\n\r\n $scope.btcFee = 0;\r\n\r\n $scope.isWglCx = utilli.isWglcx();\r\n $scope.isAdmin = utilli.isAdmin;\r\n $scope.accountNumber = '';\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.zip = '';\r\n\r\n $scope.address = {};\r\n\r\n $scope.onlyNumbers = /^\\d+$/;\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n $scope.emailPattern = utilli.emailPattern;\r\n\r\n $scope.stepName = 'find';\r\n $(\"#cardCodeCvv\").mask(\"999?9\", { placeholder: \"\" });\r\n $scope.quickPayValidationType = 'InvoiceNumber'; // Can be: InvoiceNumber, BusinessPartnerNumber\r\n $scope.quickPayValidationCaption = $scope._t('Invoice Number');\r\n $scope.validationTypes = [\r\n { name: _t('Invoice Number'), value: \"InvoiceNumber\" },\r\n { name: _t('Customer Number'), value: \"CustomerNumber\" }\r\n ];\r\n $scope.selectedValidationType = $scope.validationTypes[0].value;\r\n $scope.isFeeEnabled = false;\r\n\r\n $scope.isFeeEnabled = false;\r\n \r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n if (!providerData){\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n apiUrl = providerData.ApiUrl;\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n $scope.largeConvenienceFeeBorder = commonData.LargeConvenienceFeeBorder;\r\n $scope.smallConvenienceFee = commonData.SmallConvenienceFee;\r\n $scope.largeConvenienceFee = commonData.LargeConvenienceFee;\r\n $scope.paymentInfoText = commonData.FeeInformation;\r\n $scope.commomData = commonData;\r\n $scope.isBankAccountPaymentsEnabled = commonData.IsBankAccountPaymentsEnabled;\r\n $scope.isCreditCardCvvEnabled = commonData.IsCreditCardCvvEnabled == 'True';\r\n $scope.isCreditCardBillingAddressEnabled = commonData.IsCreditCardBillingAddressEnabled == 'True';\r\n $scope.quickPayValidationType = commonData.QuickPayValidationType;\r\n $scope.isFeeEnabled = commonData.IsFeeEnabled;\r\n if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n $scope.quickPayValidationCaption = $scope._t('Invoice or Customer Number');\r\n }\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\r\n }\r\n );\r\n\r\n if ($state.params.contractAccountNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n if (!providerData) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n apiUrl = providerData.ApiUrl;\r\n var searchRequest = {\r\n accountNumber: $state.params.contractAccountNumber,\r\n isAdmin: $scope.isAdmin,\r\n billAccessToken: $state.params.token\r\n };\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n var url = apiUrl + 'api/Payment/FindAccounts';\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: searchRequest\r\n }).success(function (data) {\r\n if (!data.length){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n return;\r\n }\r\n $scope.selectAccount(data[0]);\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n initPage();\r\n\r\n $scope.back = function () {\r\n $state.goRelativeTo('QuickPay', 'Step1');\r\n };\r\n\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n\r\n function getSavedInvoiceNumber(contractAccountNumber) {\r\n var deviceInfo = getSavedDeviceInfo(contractAccountNumber);\r\n return deviceInfo ? deviceInfo.invoiceNumber : '';\r\n }\r\n\r\n function getSavedDeviceToken(contractAccountNumber) {\r\n var deviceInfo = getSavedDeviceInfo(contractAccountNumber);\r\n return deviceInfo ? deviceInfo.deviceToken : '';\r\n }\r\n\r\n var deviceInfoKey = 'quick-pay-device-infos';\r\n\r\n function getSavedDeviceInfo(contractAccountNumber) {\r\n try {\r\n var deviceInfosJson = localStorage.getItem(deviceInfoKey);\r\n if (!deviceInfosJson)\r\n return null;\r\n var deviceInfos = JSON.parse(deviceInfosJson);\r\n return deviceInfos ? deviceInfos[contractAccountNumber] : null;\r\n }\r\n catch (e) {\r\n console.error('failed to get deviceInfo. ' + e);\r\n return null;\r\n }\r\n }\r\n\r\n function saveDeviceInfo(contractAccountNumber, invoiceNumber, deviceToken) {\r\n var savedInvoiceNumbers = {};\r\n try {\r\n var savedInvoiceNumbersString = localStorage.getItem(deviceInfoKey);\r\n if (savedInvoiceNumbersString)\r\n savedInvoiceNumbers = JSON.parse(savedInvoiceNumbersString);\r\n } catch (e) {\r\n console.error('failed to save device info. ' + e);\r\n }\r\n savedInvoiceNumbers[contractAccountNumber] = { invoiceNumber: invoiceNumber, deviceToken: deviceToken };\r\n localStorage.setItem(deviceInfoKey, JSON.stringify(savedInvoiceNumbers));\r\n }\r\n\r\n $scope.clear = function () {\r\n $scope.findResultVisible = false;\r\n $scope.accountNumber = '';\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.appartment = '';\r\n $scope.state = '';\r\n $scope.zip = '';\r\n $scope.informationMessage = '';\r\n $scope.invoiceNumber = '';\r\n $scope.invoiceNumberError = false;\r\n $scope.isInformationMessageShown = false;\r\n $scope.errorFromServerReturned = false;\r\n $scope.isPaymentInfoAgreeBank = false;\r\n $scope.isPaymentInfoAgreeCard = false;\r\n };\r\n\r\n $scope.find = function () {\r\n $scope.findResultVisible = false;\r\n $scope.amountDue = '';\r\n\r\n if ($scope.accountNumber == '') {\r\n if ($scope.houseNumber == '' || $scope.streetName == '' || $scope.zip == '') {\r\n $scope.informationMessage = $scope._t('Account # or House #, Street Name and Zip must be filled') + '.';\r\n $scope.isInformationMessageShown = true;\r\n return;\r\n }\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.informationMessage = '';\r\n $scope.isInformationMessageShown = false;\r\n $scope.showProceedAnyway = false;\r\n $scope.errorFromServerReturned = false;\r\n\r\n $scope.outputSearchType = 'address';\r\n\r\n if ($scope.accountNumber == '') {\r\n $scope.outputSearchType = 'accountNumber';\r\n }\r\n\r\n var searchRequest = {\r\n accountNumber: $scope.accountNumber,\r\n streetNumber: $scope.houseNumber,\r\n streetName: $scope.streetName,\r\n apartmentNumber: $scope.appartment,\r\n state: $scope.state,\r\n zip: $scope.zip,\r\n isAdmin: $scope.isAdmin\r\n };\r\n \r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n var url = apiUrl + 'api/Payment/FindAccounts'; //commonData.QuickPayAccountSearchUrl;\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: searchRequest\r\n }).success(function (jsondata) {\r\n if (jsondata) {\r\n if (jsondata.message == 'too many results') {\r\n $scope.informationMessage = $scope._t('Too many results. Please add more search criteria') + '.';\r\n $scope.isInformationMessageShown = true;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n else if (jsondata.IsSuccessful == false) {\r\n $scope.informationMessage = jsondata.Message;\r\n $scope.isInformationMessageShown = true;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n else if (jsondata.length == 0) {\r\n $scope.informationMessage = $scope._t('Search returned no results') + '.';\r\n $scope.isInformationMessageShown = true;\r\n }\r\n $scope.findResultList = jsondata;\r\n usSpinnerService.stop('spinner-1');\r\n $scope.findResultVisible = true;\r\n utilli.scrollBottom(500);\r\n } else {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n });\r\n });\r\n };\r\n\r\n $scope.iKnowAccountNumberClick = function () {\r\n clearAddressSearch();\r\n $scope.radioSearchType = 'searchByAccount';\r\n };\r\n\r\n $scope.iKnowServiceAddressClick = function () {\r\n clearAccountSearch();\r\n $scope.radioSearchType = 'searchByAddress';\r\n };\r\n\r\n $scope.selectAccount = function (account) {\r\n clearPaymentSettings();\r\n $scope.isAuthForEBill = account.AuthorizedForEBill;\r\n $scope.currentAccount = account;\r\n $scope.stepName = $scope.isWglcx ? 'payByCard' : 'selectPaymentOption';\r\n\r\n // account.PhoneNumber may be empty if wglcx user is not authorized to view bills.\r\n // phone number is used for bills authorization and we don't disclose the phone number\r\n // to those users who have not passed authorization yet.\r\n $scope.phone = account.PhoneNumber ? account.PhoneNumber : $scope.phone;\r\n $scope.email = account.Email ? account.Email : $scope.email;\r\n\r\n usSpinnerService.spin('spinner-1'); // stop - inside of function getConvFeeInfo\r\n getConvFeeInfo(account);\r\n\r\n $scope.amountDue = $scope.currentAccount.TotalOpenBallance;\r\n updateConvinienceFee();\r\n //$scope.convinienceFee = $scope.currentAccount.ConvenienceFee;\r\n\r\n if ($scope.amountDue < 0) {\r\n $scope.amountDue = 0;\r\n $scope.totalAmount = \"\";\r\n } else {\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee) + parseFloat($scope.btcFee));\r\n }\r\n\r\n $scope.formatTotalAmount();\r\n }\r\n\r\n $scope.onAmountChange = function () {\r\n if ($scope.amountDue == '-') {\r\n return;\r\n }\r\n if ($scope.amountDue == '' || $scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n updateConvinienceFee();\r\n return;\r\n }\r\n\r\n if ($scope.amountDue.slice(-1) == '.') {\r\n return;\r\n }\r\n\r\n if (isNaN($scope.amountDue) || isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n updateConvinienceFee();\r\n return;\r\n }\r\n\r\n updateConvinienceFee();\r\n\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee) + parseFloat($scope.btcFee));\r\n }\r\n\r\n $scope.cancelPaymentOptionSelection = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n }\r\n\r\n $scope.selectPayByCard = function () {\r\n $scope.stepName = 'payByCard';\r\n updateConvinienceFee();\r\n }\r\n\r\n $scope.selectPayByBankAccount = function () {\r\n $scope.stepName = 'payByBankAccount';\r\n updateConvinienceFee();\r\n }\r\n\r\n $scope.selectPayByBtc = function () {\r\n $scope.stepName = 'payByBtc';\r\n updateConvinienceFee();\r\n }\r\n\r\n var onModalWillEnterCallback = function() {\r\n // $scope.clear();\r\n // $scope.stepName = 'find';\r\n }\r\n\r\n var onModalWillLeaveCallback = function() {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n $scope.$apply();\r\n }\r\n\r\n $scope.payNowBtc = function () {\r\n\r\n $scope.btcFormSubmitted = true;\r\n\r\n if (!$scope.payBtc_form.$valid\r\n || $scope.isPaymentInfoAgreeBtc == false && $scope.isFeeEnabled\r\n || utilli.isAdmin && $scope.proceededWithoutSearch && $scope.selectedCompany.companyCode == \"0\") {\r\n return;\r\n }\r\n\r\n $scope.btcFormSubmitted = false;\r\n\r\n\r\n var invoiceId = '';\r\n var url = apiUrl + 'api/Payment/GenerateBtcInvoice';\r\n\r\n var btcInvoiceRequest = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amount: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n companyCode: $scope.proceededWithoutSearch \r\n ? $scope.selectedCompany.companyCode\r\n : $scope.currentAccount.CompanyCode,\r\n PaymentPage: utilli.isAdmin ? 3 : 1\r\n };\r\n\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: btcInvoiceRequest\r\n }).success(function (data) {\r\n invoiceId = data;\r\n window.btcpay.onModalWillEnter(onModalWillEnterCallback);\r\n window.btcpay.onModalWillLeave(onModalWillLeaveCallback);\r\n window.btcpay.showInvoice(invoiceId);\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n });\r\n }\r\n\r\n $scope.formatTotalAmount = function () {\r\n if ($scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n\r\n if (isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n $scope.amountDue = formatDecimal(parseFloat($scope.amountDue));\r\n }\r\n\r\n $scope.cancelPayment = function () {\r\n $scope.bankAccountFormSubmitted = false;\r\n $scope.cardFormSubmitted = false;\r\n $scope.clear();\r\n clearPaymentSettings();\r\n $scope.stepName = $scope.isWglcx ? 'find' : 'selectPaymentOption';\r\n }\r\n\r\n $scope.payNow = function () {\r\n $scope.stepName = 'processingPayment';\r\n usSpinnerService.spin('spinner-1');\r\n $scope.$apply();\r\n $timeout(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.stepName = 'paymentResult';\r\n }, 3000);\r\n }\r\n\r\n function checkPaymentAmountWglcx() {\r\n if(!$scope.isWglcx)\r\n return true;\r\n var maxOverpayment = -500;\r\n\r\n if($scope.currentAccount.TotalOpenBallance - $scope.amountDue < maxOverpayment) {\r\n var exceededLimit = parseFloat($scope.amountDue) + maxOverpayment - $scope.currentAccount.TotalOpenBallance;\r\n ModalServiceExt.showInfo(\r\n $scope._t(\"Maximum overpayment allowed is $500, current payment amount exceeds this limit by $\" \r\n + exceededLimit.toFixed(2)));\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n $scope.isCcTypeNotValid = function () {\r\n var result = $scope.payCardAccount_form.cardNumber.$ccType == 'JCB'\r\n || ($scope.isWglcx && $scope.payCardAccount_form.cardNumber.$ccType == 'American Express')\r\n || $scope.payCardAccount_form.cardNumber.$ccType == 'Diners Club';\r\n return result;\r\n }\r\n\r\n $scope.payNowCard = function () {\r\n $scope.cardFormSubmitted = true;\r\n\r\n if (!$scope.payCardAccount_form.$valid\r\n || $scope.isCcTypeNotValid()\r\n || $scope.isPaymentInfoAgreeCard == false && $scope.isFeeEnabled\r\n || utilli.isAdmin && $scope.proceededWithoutSearch && $scope.selectedCompany.companyCode == \"0\") {\r\n return;\r\n }\r\n\r\n if(!checkPaymentAmountWglcx())\r\n return;\r\n\r\n $scope.cardFormSubmitted = false;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n PaymentVerificationService.verifyPaymentInfoNew(commonData, $scope.amountDue, \r\n checkInvoiceAndPayByCard);\r\n },function (e) { \r\n console.error(e);\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function checkInvoiceAndPayByCard() {\r\n usSpinnerService.spin('spinner-1');\r\n validateInvoiceNumber().then(function (isInvoiceValid) { \r\n $scope.invoiceNumberError = !isInvoiceValid;\r\n if ($scope.invoiceNumberError) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showMessage($scope._t('Error'), \r\n $scope._t('Invalid Invoice Number.'));\r\n return;\r\n }\r\n payByCreditCardInternal()\r\n });\r\n }\r\n\r\n $scope.payNowBankAccount = function () {\r\n if (!$scope.payBankAccount_form.$valid\r\n || $scope.bankCheckingAccountNumber != $scope.bankCheckingAccountNumber2\r\n || $scope.isPaymentInfoAgreeBank == false && $scope.isFeeEnabled\r\n || $scope.payBankAccount_form.bankRoutingNumber == $scope.payBankAccount_form.bankCheckingAccountNumber) {\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n PaymentVerificationService.verifyPaymentInfoNew(commonData, $scope.amountDue, \r\n validateRoutingNumberAndPayByCheck);\r\n },function (e) { \r\n console.error(e);\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function validateRoutingNumberAndPayByCheck () {\r\n usSpinnerService.spin('spinner-1');\r\n validateRoutingNumber().then(function (isRoutingNumberValid) {\r\n $scope.routNumError = !isRoutingNumberValid;\r\n if ($scope.routNumError){\r\n ModalServiceExt.showMessage($scope._t('Error'), \r\n $scope._t('Invalid Routing Number.'));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n bankAccountPay();\r\n });\r\n }\r\n\r\n $scope.paymentOk = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n }\r\n\r\n $scope.printConfirmation = function () {\r\n window.print();\r\n }\r\n\r\n $scope.viewUnderstandYourBill = function () {\r\n var viewurl = apiUrl + 'api/Bills/GetUnderstandMyBill';\r\n window.open(viewurl, '_blank');\r\n }\r\n\r\n $scope.proceedToRegistration = function () {\r\n $state.go('TopMenuLayout.SignUp.Step1', { \r\n accountnumber: $scope.currentAccount.AccountNumber, \r\n customerfullname: $scope.currentAccount.CustomerFullName, \r\n zip: $scope.currentAccount.Zip.substring(0, 5) \r\n });\r\n }\r\n\r\n function clearAccountSearch () {\r\n $scope.findResultVisible = false;\r\n $scope.accountNumber = '';\r\n $scope.informationMessage = '';\r\n $scope.invoiceNumberError = false;\r\n $scope.isInformationMessageShown = false;\r\n $scope.errorFromServerReturned = false;\r\n $scope.isPaymentInfoAgreeBank = false;\r\n $scope.isPaymentInfoAgreeCard = false;\r\n };\r\n\r\n function clearAddressSearch () {\r\n $scope.findResultVisible = false;\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.appartment = '';\r\n $scope.state = '';\r\n $scope.zip = '';\r\n $scope.informationMessage = '';\r\n $scope.invoiceNumberError = false;\r\n $scope.isInformationMessageShown = false;\r\n $scope.errorFromServerReturned = false;\r\n $scope.isPaymentInfoAgreeBank = false;\r\n $scope.isPaymentInfoAgreeCard = false;\r\n };\r\n\r\n function clearPaymentSettings() {\r\n $scope.cardNumber = '';\r\n $scope.nameOnCard = '';\r\n $scope.cardExpiryMonth = '';\r\n $scope.cardExpiryYear = '';\r\n\r\n $scope.billToAddress = '';\r\n $scope.billToCity = '';\r\n $scope.billToState = '';\r\n $scope.billToZip = '';\r\n $scope.cardCode = '';\r\n\r\n $scope.checkNameOnAccount = '';\r\n $scope.bankRoutingNumber = '';\r\n $scope.bankCheckingAccountNumber = '';\r\n $scope.bankCheckingAccountNumber2 = '';\r\n $scope.driversLicenseNumber = '';\r\n $scope.checkPaymentState = '';\r\n \r\n $scope.phone = $state.params.phoneNumber;\r\n $scope.email = $state.params.email ? $state.params.email : '';\r\n $scope.invoiceNumber = $state.params.invoiceNumber ? $state.params.invoiceNumber : '';\r\n }\r\n\r\n function getConvFeeInfo (account) {\r\n if (!$scope.isFeeEnabled){\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n var searchObject = {\r\n accountNumber: account.AccountNumber,\r\n };\r\n $http({\r\n url: apiUrl + 'api/Payment/GetConvFeeInfo/',\r\n method: \"GET\",\r\n params: searchObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.convFeeInfo = jsondata;\r\n updateConvinienceFee();\r\n if ($scope.convFeeInfo.Disconnected == $scope._t('Account Disconnected')) {\r\n ModalServiceExt.showMessage($scope._t('Account is disconnected'), \r\n $scope._t('Your account is currently disconnected. After making the payment please contact Customer Service at')\r\n + ' ' \r\n + $scope.convFeeInfo.SupportPhoneNumber);\r\n }\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (data) {\r\n ModalServiceExt.showMessage($scope._t('Error'), $scope._t('Server error. Please, try again later.'));\r\n $scope.stepName = 'find';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function updateConvinienceFee() {\r\n if ($scope.amountDue == null || isNaN($scope.amountDue) || $scope.amountDue == '') {\r\n $scope.convinienceFee = '';\r\n return;\r\n }\r\n\r\n var info = $scope.convFeeInfo;\r\n\r\n if ($scope.isFeeEnabled) {\r\n if ($scope.stepName == 'payByCard') {\r\n if (info.FeeType == \"percent\") {\r\n $scope.convinienceFee = formatDecimal($scope.amountDue / 100 * info.FeeAmount);\r\n } else if (info.FeeType == \"flat\") {\r\n $scope.convinienceFee = formatDecimal(info.FeeAmount);\r\n }\r\n } else if ($scope.stepName == 'payByBankAccount') {\r\n if (info.FeeTypeAch == \"percent\") {\r\n $scope.convinienceFee = formatDecimal($scope.amountDue / 100 * info.FeeAmountAch);\r\n } else if (info.FeeTypeAch == \"flat\") {\r\n $scope.convinienceFee = formatDecimal(info.FeeAmountAch);\r\n }\r\n } else if ($scope.stepName == 'payByBtc') {\r\n if (info.FeeTypeAch == \"percent\") {\r\n $scope.convinienceFee = formatDecimal($scope.amountDue / 100 * info.FeeAmountAch);\r\n } else if (info.FeeTypeAch == \"flat\") {\r\n $scope.convinienceFee = formatDecimal(info.FeeAmountAch);\r\n }\r\n\r\n $scope.btcFee = formatDecimal((parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee)) * 0.1);\r\n }\r\n }\r\n else {\r\n $scope.convinienceFee = 0;\r\n }\r\n\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee) + parseFloat($scope.btcFee));\r\n\r\n }\r\n\r\n function formatDecimal (decimal) {\r\n\r\n var formated = Math.round(parseFloat(decimal) * 100) / 100;\r\n\r\n formated = formated.toString();\r\n if (formated.indexOf('.') == -1) formated += '.';\r\n while (formated.length < formated.indexOf('.') + 3) formated += '0';\r\n\r\n return formated;\r\n }\r\n\r\n $scope.onAmountChange = function () {\r\n if ($scope.amountDue == '-') {\r\n return;\r\n }\r\n if ($scope.amountDue == '' || $scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n $scope.updateConvinienceFee();\r\n return;\r\n }\r\n\r\n if ($scope.amountDue.slice(-1) == '.') {\r\n return;\r\n }\r\n\r\n if (isNaN($scope.amountDue) || isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n $scope.updateConvinienceFee();\r\n return;\r\n }\r\n\r\n $scope.updateConvinienceFee();\r\n\r\n $scope.totalAmount = $scope.formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n }\r\n\r\n $scope.cancelPaymentOptionSelection = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n }\r\n\r\n\r\n $scope.selectPayByCard = function () {\r\n $scope.stepName = 'payByCard';\r\n $scope.invoiceNumber = getSavedInvoiceNumber($scope.currentAccount.AccountNumber);\r\n $scope.updateConvinienceFee();\r\n }\r\n\r\n $scope.selectPayByBankAccount = function () {\r\n $scope.stepName = 'payByBankAccount';\r\n $scope.updateConvinienceFee();\r\n }\r\n\r\n $scope.formatTotalAmount = function () {\r\n if ($scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n\r\n if (isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n $scope.amountDue = $scope.formatDecimal(parseFloat($scope.amountDue));\r\n }\r\n\r\n $scope.cancelPayment = function () {\r\n $scope.bankAccountFormSubmitted = false;\r\n $scope.cardFormSubmitted = false;\r\n $scope.clear();\r\n $scope.clearPaymentSettings();\r\n $scope.stepName = 'selectPaymentOption';\r\n }\r\n\r\n $scope.payNow = function () {\r\n $scope.stepName = 'processingPayment';\r\n usSpinnerService.spin('spinner-1');\r\n $scope.$apply();\r\n $timeout(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.stepName = 'paymentResult';\r\n }, 3000);\r\n }\r\n\r\n function validateInvoiceNumber() {\r\n var deferred = $q.defer();\r\n\r\n if (utilli.isAdmin) {\r\n deferred.resolve(true);\r\n return deferred.promise;\r\n }\r\n\r\n var requestParams = {\r\n accountNum: $scope.currentAccount.AccountNumber,\r\n invoiceNum: $scope.quickPayValidationType == 'InvoiceNumber' ? $scope.invoiceNumber : null,\r\n businessPartnerNum: $scope.quickPayValidationType == 'InvoiceNumber' ? $scope.invoiceNumber : null\r\n };\r\n var requestUrl = $scope.quickPayValidationType == 'InvoiceNumber'\r\n ? 'api/Payment/IsInvoiceValid'\r\n : 'api/Payment/IsBusinessPartnerValid';\r\n var deviceToken = getSavedDeviceToken($scope.currentAccount.AccountNumber);\r\n\r\n if ($scope.quickPayValidationType == 'InvoiceNumber' || $scope.selectedValidationType == 'InvoiceNumber') {\r\n requestParams = { \r\n accountNum: $scope.currentAccount.AccountNumber, \r\n invoiceNum: $scope.invoiceNumber, \r\n deviceToken: deviceToken \r\n };\r\n requestUrl = 'api/Payment/IsInvoiceValid';\r\n }\r\n else {\r\n requestParams = { \r\n accountNum: $scope.currentAccount.AccountNumber,\r\n businessPartnerNum: $scope.invoiceNumber,\r\n deviceToken: deviceToken\r\n };\r\n requestUrl = 'api/Payment/IsBusinessPartnerValid';\r\n }\r\n\r\n $http({\r\n url: apiUrl + requestUrl,\r\n method: \"GET\",\r\n params: requestParams\r\n }).success(function(response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n console.log(response.Errors[0]);\r\n deferred.reject(false);\r\n } else {\r\n var deviceToken = response.Data;\r\n var isValid = deviceToken != 'invalid';\r\n if (isValid)\r\n saveDeviceInfo($scope.currentAccount.AccountNumber, $scope.invoiceNumber, response.Data);\r\n else\r\n saveDeviceInfo($scope.currentAccount.AccountNumber, '', '');\r\n deferred.resolve(isValid);\r\n }\r\n }).error(function() {\r\n console.log($scope._t('Server error. Try again later.'));\r\n deferred.resolve(false);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function validateRoutingNumber() {\r\n //$scope.stepName = 'processingPayment';\r\n var deferred = $q.defer();\r\n var requestResult = false;\r\n $http({\r\n url: apiUrl + 'api/Payment/RoutingNumberValidate', //$scope.commomData.CheckRoutingNumberUrl, //window.OneTimePayments.checkRoutingNumberUrl,\r\n method: \"GET\",\r\n params: { routingNumber: $scope.bankRoutingNumber }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n alert(response.Errors[0]);\r\n deferred.reject(requestResult);\r\n }\r\n else {\r\n requestResult = response.Data;\r\n deferred.resolve(response.Data);\r\n }\r\n $scope.stepName = 'payByBankAccount';\r\n }).error(function () {\r\n alert(\"Server error. Try again later.\");\r\n deferred.resolve(requestResult);\r\n $scope.stepName = 'payByBankAccount';\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function bankAccountPay() {\r\n $scope.bankAccountFormSubmitted = false;\r\n\r\n var companyCode = $scope.currentAccount.CompanyCode;\r\n if ($scope.proceededWithoutSearch) {\r\n companyCode = $scope.selectedCompany.companyCode;\r\n }\r\n\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n nameOnAccount: $scope.checkNameOnAccount,\r\n bankRoutingNumber: $scope.bankRoutingNumber,\r\n checkingAccountNumber: $scope.bankCheckingAccountNumber,\r\n companyCode: companyCode,\r\n address: {\r\n HouseNumber: $scope.address.HouseNumber,\r\n AddressLine: $scope.address.AddressLine,\r\n City: $scope.address.City,\r\n HouseNoSupplement: $scope.address.HouseNoSupplement,\r\n State: $scope.address.State,\r\n Zip: $scope.address.Zip,\r\n }\r\n };\r\n\r\n if (utilli.isAdmin) {\r\n paymentObject.PaymentPage = 3;\r\n }\r\n else {\r\n paymentObject.PaymentPage = 1;\r\n }\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/QuickPayByBankAccount', //$scope.commomData.BankAccountPayUrl, //window.OneTimePayments.bankAccountPayUrl,\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n usSpinnerService.stop('spinner-1');\r\n } else {\r\n }\r\n }).error(function (data) {\r\n $scope.paymwntResult = data.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function payByCreditCardInternal() {\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n cardNumber: $scope.cardNumber,\r\n nameOnCard: $scope.nameOnCard,\r\n expirationDateYear: $scope.cardExpiryYear,\r\n expirationDateMonth: $scope.cardExpiryMonth,\r\n companyCode: $scope.proceededWithoutSearch \r\n ? $scope.selectedCompany.companyCode\r\n : $scope.currentAccount.CompanyCode,\r\n billToAddress: $scope.billToAddress,\r\n billToCity: $scope.billToCity,\r\n billToState: $scope.billToState,\r\n billToZip: $scope.billToZip,\r\n cardCode: $scope.cardCode,\r\n invoiceNumber: utilli.isAdmin ? '0' : $scope.invoiceNumber,\r\n PaymentPage: utilli.isAdmin ? 3 : 1\r\n };\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/QuickPayUsingCard',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function (data) {\r\n var jsondata = data;\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n}]);\nangular.module('utilliApp')\r\n .service('ApplePayService', [\"usSpinnerService\", \"ModalServiceExt\", \"$http\", \"$q\", function(usSpinnerService, ModalServiceExt, $http, $q) {\r\n var me = this;\r\n var getPaymentData = null;\r\n var processPayResult = null;\r\n\r\n function init(apiUrl, processPayResultFn, getPaymentDataFn) { \r\n me.apiUrl = apiUrl;\r\n getPaymentData = getPaymentDataFn;\r\n processPayResult = processPayResultFn\r\n }\r\n\r\n var isPayButtonSupported = function () { \r\n var result = window.ApplePaySession && ApplePaySession.canMakePayments();\r\n return result;\r\n }\r\n\r\n var onClickEvent = function () {\r\n var paymentData = getPaymentData();\r\n var amount = Number(paymentData.amount);\r\n if (paymentData.hasCollectionFee) {\r\n amount += Number(paymentData.collectionFee);\r\n }\r\n amount = Number(amount).toFixed(2);\r\n var paymentRequest = {\r\n \"countryCode\": \"US\",\r\n \"currencyCode\": \"USD\",\r\n \"merchantCapabilities\": [\r\n \"supports3DS\"\r\n ],\r\n \"supportedNetworks\": [\r\n \"visa\",\r\n \"masterCard\",\r\n \"discover\"\r\n ],\r\n \"total\": {\r\n \"label\": \"Washington Gas Bill Payment\",\r\n \"amount\": amount\r\n }\r\n }\r\n \r\n var appleApiVersion = 1;\r\n var session = new ApplePaySession(appleApiVersion, paymentRequest);\r\n \r\n session.onvalidatemerchant = function (event) {\r\n var promise = performValidation(event.validationURL);\r\n \r\n promise.then(function (merchantSession) {\r\n session.completeMerchantValidation(merchantSession);\r\n }, function () {\r\n session.abort();\r\n }); \r\n }\r\n\r\n session.onpaymentauthorized = function (event) {\r\n let paymentData = getPaymentData();\r\n let amount = Number(paymentData.amount);\r\n if (paymentData.hasCollectionFee) {\r\n amount += Number(paymentData.collectionFee);\r\n }\r\n amount = Number(amount).toFixed(2);\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: me.apiUrl + 'api/SmartPay/CompleteApplePaySession',\r\n method: 'POST',\r\n data: {\r\n amount: amount,\r\n hasCollectionFee: paymentData.hasCollectionFee,\r\n tokenTimestamp: paymentData.tokenTimestamp,\r\n accountNumber: paymentData.accountNumber,\r\n email: paymentData.email,\r\n phoneNumber: paymentData.phoneNumber,\r\n applePaymentTokenData: event.payment.token,\r\n notificationLogId: paymentData.notificationLogId,\r\n wantSmsReceipt: paymentData.wantSmsReceipt,\r\n wantEbill: paymentData.wantEbill\r\n }\r\n }).success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n if (response == undefined || response.HasErrors == undefined) {\r\n session.completePayment(ApplePaySession.STATUS_FAILURE);\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n session.completePayment(ApplePaySession.STATUS_FAILURE);\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n session.completePayment(ApplePaySession.STATUS_SUCCESS);\r\n response.Data.WalletCardInfo = event.payment.token.paymentMethod.displayName;\r\n response.Data.MethodId = utilli.paymentMethods.Apple;\r\n processPayResult(response.Data, true);\r\n }\r\n }).error(function(error) {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n session.completePayment(ApplePaySession.STATUS_FAILURE);\r\n ModalServiceExt.showServerError()\r\n console.error(error);\r\n });\r\n }\r\n \r\n session.begin();\r\n } \r\n\r\n function performValidation(valURL) {\r\n var paymentData = getPaymentData();\r\n \r\n usSpinnerService.spin('spinner-1');\r\n var deferred = $q.defer();\r\n $http({\r\n url: me.apiUrl + 'api/SmartPay/StartApplePaySession',\r\n method: 'GET',\r\n params: { \r\n validationUrl: valURL,\r\n amount: paymentData.amount,\r\n accountNumber: paymentData.accountNumber\r\n }\r\n }).success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n deferred.reject(null);\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n deferred.reject(null);\r\n }\r\n else {\r\n deferred.resolve(JSON.parse(response.Data))\r\n }\r\n }).error(function(error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n deferred.reject(null);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n\r\n return {\r\n init: init,\r\n onClickEvent: onClickEvent,\r\n isPayButtonSupported: isPayButtonSupported\r\n };\r\n}]);\r\n\nangular.module('utilliApp')\r\n .service('GooglePayService', [\"$rootScope\", \"ModalServiceExt\", \"$http\", \"usSpinnerService\", \"$q\", function ($rootScope, ModalServiceExt, $http,\r\n usSpinnerService, $q) {\r\n\r\n var me = this;\r\n me.isGooglePayScriptLoaded = false;\r\n var processPayResult = null;\r\n var getPaymentData = null;\r\n var paymentsClient = null;\r\n var supportButtonPromise = $q.defer();\r\n\r\n function getBaseRequest() {\r\n var result = {\r\n apiVersion: 2,\r\n apiVersionMinor: 0\r\n };\r\n return result;\r\n }\r\n\r\n function getTokenizationSpecification(orderId) {\r\n var result = {\r\n type: 'PAYMENT_GATEWAY',\r\n parameters: {\r\n \"gateway\": \"vantiv\",\r\n \"vantiv:merchantPayPageId\": DeploymentSettings.isProd()\r\n ? 'oxUVH9QQPUXzNs8S'\r\n : 'SLmKwDHurBDvL4kK',\r\n \"vantiv:merchantOrderId\": orderId.toString(),\r\n \"vantiv:merchantTransactionId\": orderId.toString(),\r\n \"vantiv:merchantReportGroup\": \"Default Report Group\"\r\n }\r\n };\r\n return result;\r\n }\r\n\r\n function getBaseCardPaymentMethod() {\r\n var result = {\r\n type: 'CARD',\r\n parameters: {\r\n allowedAuthMethods: [\"PAN_ONLY\", \"CRYPTOGRAM_3DS\"],\r\n allowedCardNetworks: [\"MASTERCARD\", \"VISA\", \"DISCOVER\"]\r\n }\r\n };\r\n return result;\r\n }\r\n\r\n function getCardPaymentMethod(orderId) {\r\n var result = Object.assign(\r\n {},\r\n getBaseCardPaymentMethod(),\r\n {\r\n tokenizationSpecification: getTokenizationSpecification(orderId)\r\n }\r\n );\r\n\r\n return result;\r\n }\r\n\r\n function init(getPaymentDataFn, apiUrl, processPayResultFn) {\r\n\r\n me.apiUrl = apiUrl;\r\n getPaymentData = getPaymentDataFn;\r\n processPayResult = processPayResultFn\r\n\r\n if(!me.isGooglePayScriptLoaded) {\r\n var script = document.createElement('script');\r\n script.onload = onGooglePayLoaded;\r\n script.src = 'https://pay.google.com/gp/p/js/pay.js';\r\n\r\n document.body.appendChild(script);\r\n me.isGooglePayScriptLoaded = true;\r\n }\r\n }\r\n\r\n function getGooglePaymentsClient() {\r\n var environment = DeploymentSettings.isProd()\r\n ? 'PRODUCTION'\r\n : 'TEST';\r\n if (paymentsClient === null) {\r\n paymentsClient = new google.payments.api.PaymentsClient({\r\n environment: environment,\r\n paymentDataCallbacks: {\r\n onPaymentAuthorized: onPaymentAuthorized\r\n }\r\n });\r\n }\r\n return paymentsClient;\r\n }\r\n\r\n function onGooglePayLoaded() {\r\n var paymentsClient = getGooglePaymentsClient();\r\n paymentsClient.isReadyToPay(getGoogleIsReadyToPayRequest())\r\n .then(function (response) {\r\n if (response.result)\r\n supportButtonPromise.resolve(response.Data);\r\n else\r\n supportButtonPromise.reject(response);\r\n })\r\n .catch(function (err) {\r\n supportButtonPromise.reject(err);\r\n console.error(err);\r\n });\r\n }\r\n\r\n function getGoogleIsReadyToPayRequest() {\r\n return Object.assign(\r\n {},\r\n getBaseRequest(),\r\n {\r\n allowedPaymentMethods: [getBaseCardPaymentMethod()]\r\n }\r\n );\r\n }\r\n\r\n function onGooglePaymentButtonClicked(orderId) {\r\n var paymentDataRequest = getGooglePaymentDataRequest(orderId);\r\n var paymentsClient = getGooglePaymentsClient();\r\n paymentsClient.loadPaymentData(paymentDataRequest);\r\n }\r\n\r\n function getGooglePaymentDataRequest(orderId) {\r\n var paymentDataRequest = Object.assign({}, getBaseRequest());\r\n paymentDataRequest.allowedPaymentMethods = [getCardPaymentMethod(orderId)];\r\n paymentDataRequest.transactionInfo = getGoogleTransactionInfo();\r\n paymentDataRequest.merchantInfo = {\r\n merchantId: DeploymentSettings.isProd() \r\n ? 'BCR2DN6T3PZNLYTJ'\r\n : undefined,\r\n merchantName: 'Washington Gas'\r\n };\r\n paymentDataRequest.callbackIntents = [\"PAYMENT_AUTHORIZATION\"];\r\n\r\n return paymentDataRequest;\r\n }\r\n\r\n function onPaymentAuthorized(paymentData) {\r\n return new Promise(function (resolve, reject) {\r\n processPayment(paymentData)\r\n .then(function (data) {\r\n processPayResult(data, true);\r\n resolve({ transactionState: 'SUCCESS' });\r\n })\r\n .catch(function (e) {\r\n console.error(e);\r\n resolve({\r\n transactionState: 'ERROR',\r\n error: {\r\n intent: 'PAYMENT_AUTHORIZATION',\r\n message: e,\r\n reason: 'PAYMENT_DATA_INVALID'\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n function processPayment(googlePaymentData) {\r\n var deferred = $q.defer();\r\n var paymentData = getPaymentData();\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: me.apiUrl + 'api/SmartPay/ProcessGooglePayPayment',\r\n method: 'POST',\r\n data: {\r\n amount: paymentData.amount,\r\n accountNumber: paymentData.accountNumber,\r\n collectionFee: paymentData.collectionFee,\r\n hasCollectionFee: paymentData.hasCollectionFee,\r\n tokenTimestamp: paymentData.tokenTimestamp,\r\n email: paymentData.email,\r\n phoneNumber: paymentData.phoneNumber,\r\n paymentData: googlePaymentData,\r\n notificationLogId: paymentData.notificationLogId,\r\n orderId: paymentData.orderId,\r\n wantSmsReceipt: paymentData.wantSmsReceipt,\r\n wantEbill: paymentData.wantEbill\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n deferred.reject($rootScope._t(\"Unexpected error.\"));\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n deferred.reject(response.Errors[0]);\r\n }\r\n else {\r\n response.Data.WalletCardInfo = googlePaymentData.paymentMethodData.description;\r\n response.Data.MethodId = utilli.paymentMethods.Google;\r\n deferred.resolve(response.Data)\r\n }\r\n }).error(function (error) {\r\n deferred.reject(error);\r\n usSpinnerService.stop('spinner-1');\r\n console.error(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function isPayButtonSupported() {\r\n return supportButtonPromise.promise;\r\n }\r\n\r\n function getGoogleTransactionInfo() {\r\n if (!getPaymentData) {\r\n console.error('getPaymentData not specified.')\r\n ModalServiceExt.showError($rootScope._t('Unexpected error. See dev console for the details.'));\r\n }\r\n let paymentData = getPaymentData();\r\n let amount = Number(paymentData.amount);\r\n if (paymentData.hasCollectionFee) {\r\n amount += Number(paymentData.collectionFee);\r\n }\r\n amount = Number(amount).toFixed(2);\r\n return {\r\n countryCode: 'US',\r\n currencyCode: 'USD',\r\n totalPriceStatus: 'FINAL',\r\n totalPrice: amount\r\n };\r\n }\r\n\r\n return {\r\n init: init,\r\n isPayButtonSupported: isPayButtonSupported,\r\n onGooglePaymentButtonClicked: onGooglePaymentButtonClicked\r\n };\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('SmartPayController', [\"$scope\", \"$window\", \"$state\", \"$http\", \"usSpinnerService\", \"$timeout\", \"ServiceProvidersService\", \"ModalServiceExt\", \"SmartPayStateService\", \"SmartPayLayoutService\", \"GooglePayService\", \"ApplePayService\", \"$q\", function ($scope, $window, $state, $http, usSpinnerService,\r\n $timeout, ServiceProvidersService, ModalServiceExt, SmartPayStateService, SmartPayLayoutService,\r\n GooglePayService, ApplePayService, $q) {\r\n \r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n SmartPayLayoutService.hideNoAdditionalCharge = true;\r\n //utilli.savePayUrl($state.params.token);// commented out because of WGLCX-697\r\n \r\n var model = SmartPayStateService.model;\r\n $scope.model = model;\r\n model.resetPaymentOptionsAttributes();\r\n model.isCvvConfirmationTypeActive = true;\r\n model.enrollInEbillVisible = false;\r\n model.wantEbill = false; // will be set to default true in case if we show the checbox\r\n model.nonEbillEmailsCount = 0;\r\n model.isEligibleForIp = false;\r\n model.isEligibleForBbp = false;\r\n model.dunningVariant = 0;\r\n $scope.currentDate = new Date();\r\n\r\n $scope.savedBankAccounts = [];\r\n $scope.savedCards = [];\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n $scope.total = 0;\r\n model.nudgeMessage = '';\r\n model.hideUi = true;\r\n\r\n $scope.pin = null;\r\n fixDropDownFromClickToHover();\r\n\r\n function initWallets(apiUrl) { \r\n var getPaymentInfoForApple = function () {\r\n model.amount = Number(model.amount).toFixed(2);\r\n return {\r\n amount: model.amount,\r\n hasCollectionFee: $scope.fee,\r\n tokenTimestamp: $scope.tokenTimestamp,\r\n collectionFee: $scope.feeAmount,\r\n accountNumber: model.contractAccountNumber,\r\n email: model.email,\r\n phoneNumber: model.phoneNumber,\r\n notificationLogId: $state.params.emailId,\r\n wantSmsReceipt: model.wantSmsReceipt,\r\n wantEbill: model.wantEbill\r\n }\r\n };\r\n ApplePayService.init(apiUrl, processPayResult, getPaymentInfoForApple);\r\n\r\n var getPaymentInfoForGoogle = function () {\r\n model.amount = Number(model.amount).toFixed(2);\r\n return {\r\n amount: model.amount,\r\n hasCollectionFee: $scope.fee,\r\n tokenTimestamp: $scope.tokenTimestamp,\r\n collectionFee: $scope.feeAmount,\r\n accountNumber: model.contractAccountNumber,\r\n email: model.email,\r\n phoneNumber: model.phoneNumber,\r\n notificationLogId: $state.params.emailId,\r\n orderId: model.orderId,\r\n wantSmsReceipt: model.wantSmsReceipt,\r\n wantEbill: model.wantEbill\r\n };\r\n }\r\n\r\n GooglePayService.init(getPaymentInfoForGoogle, apiUrl, processPayResult);\r\n \r\n $scope.startApplePaySession = function () { \r\n if(!ApplePayService.isPayButtonSupported())\r\n {\r\n ModalServiceExt.showInfo($scope._t(\"Your browser doesn't support Apple Pay\"));\r\n return;\r\n }\r\n $scope.payForm.$setSubmitted();\r\n if(!$scope.payForm.$valid)\r\n return;\r\n ApplePayService.onClickEvent();\r\n }\r\n\r\n $scope.startGooglePaySession = function () {\r\n $scope.payForm.$setSubmitted();\r\n \r\n if(!$scope.payForm.$valid)\r\n return;\r\n \r\n usSpinnerService.spin('spinner-1');\r\n GooglePayService.isPayButtonSupported()\r\n .then(function () { \r\n usSpinnerService.stop('spinner-1');\r\n GooglePayService.onGooglePaymentButtonClicked(model.orderId);\r\n }, function () { \r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo($scope._t(\"Your browser doesn't support Google Pay\"));\r\n })\r\n }\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var apiUrl;\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n utilli.resolveServiceProviderApiDeffered(providerData.ApiUrl);\r\n initWallets(apiUrl);\r\n init();\r\n })\r\n .catch(function(){\r\n ModalServiceExt.showServerError();\r\n utilli.rejectServiceProviderApiDeffered();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n $scope.validateAmount = function() {\r\n // !model.amount because I don't want invalidAmount fire together with required\r\n var validAmount = !model.amount || Number(model.amount).toFixed(2) > 0 ? true : false;\r\n $scope.payForm.amount.$setValidity('invalidAmount', validAmount);\r\n };\r\n\r\n $scope.onPhoneNumberChange = function () {\r\n model.hasPhoneNumberConsent = hasPhoneNumberConsent(model.phoneNumber);\r\n }\r\n\r\n $scope.validateBankAccount = function(){\r\n var bankAccountPattern = /^[0-9]{1,20}$/;\r\n if (model.bankAccountNumber)\r\n $scope.payForm.bankAccountNumber.$setValidity('pattern',\r\n !!model.bankAccountNumber.match(bankAccountPattern));\r\n if (model.reenterBankAccountNumber)\r\n $scope.payForm.reenterBankAccountNumber.$setValidity('pattern',\r\n !!model.reenterBankAccountNumber.match(bankAccountPattern));\r\n $scope.payForm.reenterBankAccountNumber.$setValidity('match',\r\n model.reenterBankAccountNumber == model.bankAccountNumber);\r\n }\r\n\r\n $scope.validateExpirationDate = function(){\r\n var value = $scope.payForm.expirationDate.$viewValue;\r\n if ($scope.payForm.expirationDate.$error.required){\r\n // show only Required\r\n $scope.payForm.expirationDate.$setValidity('invalidDate', true);\r\n $scope.payForm.expirationDate.$setValidity('expired', true);\r\n return;\r\n }\r\n if ($scope.payForm.expirationDate.$error.mask || value.split('/')[0] > 12 || value.split('/')[0] == 0){\r\n // show only Invalid date\r\n $scope.payForm.expirationDate.$setValidity('invalidDate', false);\r\n $scope.payForm.expirationDate.$setValidity('expired', true);\r\n return;\r\n }\r\n $scope.payForm.expirationDate.$setValidity('invalidDate', true);\r\n var mm = value.split('/')[0];\r\n var yy = value.split('/')[1];\r\n var date = new Date('20'+yy, mm);\r\n $scope.payForm.expirationDate.$setValidity('expired', date > new Date());\r\n }\r\n\r\n $scope.emailPattern = utilli.emailPattern;\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n $scope.expirationDateMask = \"99/99\";\r\n $scope.smsCodeMask = \"9999\";\r\n $scope.fee = false;\r\n $scope.amountBlocked = false;\r\n $scope.feeAmount = 0.0;\r\n $scope.feeAmountString = ($scope.feeAmount).toFixed(2);\r\n $scope.dunningAmount = 0.0;\r\n $scope.isUsedLink = false;\r\n $scope.tokenTimestamp = null;\r\n\r\n function init(){\r\n model.nudgeMessage = \"Please click on the links that you recently received via SMS or email. If you need any help, please contact support.\";\r\n ModalServiceExt.showError($scope._t(\"Please click on the links that you recently received via SMS or email. If you need any help, please contact support.\"));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n\r\n var payload = utilli.getPayload($state.params.token);\r\n model.email = payload.Email;\r\n $http({\r\n url: apiUrl + 'api/SmartPay/GetSmartPayInfo',\r\n method: \"GET\",\r\n params: { smartPayToken: $state.params.token }\r\n })\r\n .apiThen(function (smartPayInfo){\r\n if (smartPayInfo.NudgePaymentLink) {\r\n $window.location.href = smartPayInfo.NudgePaymentLink;\r\n model.nudgeMessage = smartPayInfo.NudgePaymentLinkMessage;\r\n } else {\r\n model.nudgeMessage = \"Cannot complete redirection. Please, refresh the page\";\r\n return;\r\n }\r\n if (smartPayInfo.FailedInBackend) {\r\n model.failedInBackend = true;\r\n model.enrollInEbillVisible = false;\r\n model.wantEbill = false;\r\n } else {\r\n model.allPhoneNumbers = smartPayInfo.AllPhoneNumbers;\r\n model.allPhoneNumbers.forEach(function (ph) {\r\n ph.HasConsent = !ph.IsVerified || ph.HasConsent\r\n });\r\n\r\n if (smartPayInfo.ShowEnrollInEbillCheckbox) {\r\n model.enrollInEbillVisible = true;\r\n model.wantEbill = true;\r\n }\r\n model.installmentPlanToken = smartPayInfo.InstallmentPlanToken;\r\n model.budgetBillingPlanToken = smartPayInfo.BudgetBillingPlanToken;\r\n model.isEligibleForIp = !!smartPayInfo.InstallmentPlanToken;\r\n model.isEligibleForBbp = !!smartPayInfo.BudgetBillingPlanToken;\r\n }\r\n model.amount = smartPayInfo.DueAmount;\r\n if (payload.HasCollectionFee === true) {\r\n $scope.fee = payload.HasCollectionFee;\r\n $scope.feeAmount = smartPayInfo.CollectionFee;\r\n $scope.feeAmountString = Number($scope.feeAmount).toFixed(2);\r\n $scope.dunningAmount = smartPayInfo.DunningAmount;\r\n $scope.amountBlocked = smartPayInfo.CollectionFee;\r\n model.amount = $scope.dunningAmount;\r\n $scope.isUsedLink = smartPayInfo.IsUsedLink;\r\n if ($scope.isUsedLink) {\r\n ModalServiceExt.showError($scope._t(\"Sorry, You already made the payment using this link\"));\r\n }\r\n $scope.tokenTimestamp = smartPayInfo.TokenTimestamp;\r\n }\r\n model.contractAccountNumber = smartPayInfo.ContractAccountNumber;\r\n // save the CA# into local storage so that we do Account/ClearCache on a page refresh\r\n localStorage.setItem(\"CurrentAccountNumber\", smartPayInfo.ContractAccountNumber);\r\n // if the phone number is not verified then we assume that it's preferred.\r\n // that is the check box on UI should be checked by default\r\n setPhoneNumber(smartPayInfo.PhoneNumber);\r\n $scope.formatAmount();\r\n setSavedPaymentOptions(smartPayInfo);\r\n\r\n model.nonEbillEmailsCount = smartPayInfo.NonEbillEmailsCount;\r\n }, ModalServiceExt)\r\n .fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function setPhoneNumber(phoneNumber) {\r\n model.phoneNumber = phoneNumber;\r\n model.hasPhoneNumberConsent = hasPhoneNumberConsent(phoneNumber);\r\n }\r\n\r\n function hasPhoneNumberConsent(phoneNumber) {\r\n var phone = _.filter(model.allPhoneNumbers, function (p) {\r\n return p.PhoneNumber == phoneNumber;\r\n });\r\n if (phone.length == 0) {\r\n // by default new phone numbers are preferred\r\n return true;\r\n }\r\n else {\r\n return phone[0].HasConsent;\r\n }\r\n }\r\n\r\n function updateBankIcon() {\r\n $scope.showBankLogo = false;\r\n if(model.routingNumber == undefined || model.routingNumber.length != 9)\r\n {\r\n return;\r\n }\r\n var requestResult = false;\r\n $http({\r\n url: apiUrl + 'api/SmartPay/GetBankLogo',\r\n method: \"GET\",\r\n params: { routingNumber: model.routingNumber }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n $scope.showBankLogo = false;\r\n }\r\n else {\r\n requestResult = response.Data;\r\n if(response.Data.Logo != ''){\r\n $scope.currentBankLogoImage = response.Data.Logo;\r\n $scope.showBankLogo = true;\r\n $scope.plaidBankName = response.Data.Name;\r\n $scope.plaidBankUrl = response.Data.Url;\r\n } else {\r\n $scope.showBankLogo = false;\r\n }\r\n }\r\n }).error(function () {\r\n console.log(\"UpdateBankIcon error. GetBankLogo.\");\r\n });\r\n }\r\n\r\n $scope.updateBankIconLogo = function() {\r\n updateBankIcon();\r\n }\r\n\r\n\r\n var getSavedBankAccountLogos = function () {\r\n $scope.savedBankAccounts.forEach(setSavedBankAccountLogo);\r\n }\r\n\r\n function setSavedBankAccountLogo(item, index) {\r\n getBankLogo(item);\r\n }\r\n\r\n function getBankLogo(item) {\r\n $http({\r\n url: apiUrl + 'api/SmartPay/GetBankLogo',\r\n method: \"GET\",\r\n params: { routingNumber: item.RoutingNumber }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n var result = {};\r\n result.hasLogo = false;\r\n item.bankLogoInfo = result;\r\n return result;\r\n }\r\n else {\r\n if(response.Data.Logo != ''){\r\n var result = {};\r\n result.plaidBankName = response.Data.Name;\r\n result.plaidBankUrl = response.Data.Url;\r\n result.logo = response.Data.Logo;\r\n result.hasLogo = true;\r\n item.bankLogoInfo = result;\r\n\r\n return result;\r\n } else {\r\n var result = {};\r\n result.hasLogo = false;\r\n item.bankLogoInfo = result;\r\n return result;\r\n }\r\n }\r\n }).error(function () {\r\n console.log(\"UpdateBankIcon error. GetBankLogo.\");\r\n });\r\n }\r\n\r\n function setSavedPaymentOptions(smartPayInfo) {\r\n setSavedBankAccounts(smartPayInfo.UserBankAccounts);\r\n setSavedCards(smartPayInfo.UserCards);\r\n \r\n if (model.useSavedCard) {\r\n setPhoneNumber(model.currentSavedCard.PhoneNumber);\r\n }\r\n\r\n // if the user doesn't have saved cards but has saved checks then automatically select pay by check option\r\n if (!model.useSavedCard && model.useSavedBankAccount){\r\n model.paymentMethod = 'eCheck';\r\n setPhoneNumber(model.currentSavedBankAccount.PhoneNumber);\r\n }\r\n }\r\n\r\n function setSavedCards(data) {\r\n if (data == null || data.length == 0) {\r\n model.useSavedCard = false;\r\n return;\r\n }\r\n model.useSavedCard = true;\r\n var now = new Date();\r\n for (var i = 0; i < data.length; i++){\r\n var card = data[i];\r\n // month param starts from 0 so it is equivalent to +1 that is correct for expiration date-time\r\n var expDate = new Date(\"20\" + card.ExpYear, card.ExpMonth, 1);\r\n card.isExpired = expDate < now;\r\n $scope.savedCards.push(card);\r\n }\r\n model.currentSavedCard = $scope.savedCards[0];\r\n };\r\n\r\n function setSavedBankAccounts(data) {\r\n if (data == null || data.length == 0) {\r\n model.useSavedBankAccount = false;\r\n return;\r\n }\r\n model.useSavedBankAccount = true;\r\n $scope.savedBankAccounts = data;\r\n model.currentSavedBankAccount = $scope.savedBankAccounts[0];\r\n\r\n getSavedBankAccountLogos();\r\n }\r\n\r\n \r\n $scope.formatAmount = function () {\r\n if (model.amount == undefined || isNaN(parseFloat(model.amount))) {\r\n model.amount = '';\r\n $scope.validateAmount();\r\n return;\r\n }\r\n model.amount = utilli.formatDecimal(parseFloat(model.amount));\r\n $scope.validateAmount();\r\n }\r\n\r\n $scope.getSelectedPaymentMethodClass = function(methodName){\r\n return { 'selected-payment-method': methodName == model.paymentMethod };\r\n }\r\n\r\n $scope.selectPaymentMethod = function(methodName){\r\n model.paymentMethod = methodName;\r\n\r\n if(model.isPayByCard() && model.useSavedCard)\r\n setPhoneNumber(model.currentSavedCard.PhoneNumber);\r\n if(model.isPayByCheck() && model.useSavedBankAccount)\r\n setPhoneNumber(model.currentSavedBankAccount.PhoneNumber);\r\n \r\n model.resetResendButton();\r\n model.verificationCode = '';\r\n \r\n }\r\n\r\n $scope.prepareWalletPayment = function () {\r\n if(model.orderId)\r\n return;\r\n \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/SmartPay/PrepareWalletPayment',\r\n method: \"POST\",\r\n data: {\r\n token: $state.params.token\r\n }\r\n })\r\n .apiThen(function (orderId) {\r\n model.orderId = orderId;\r\n }, ModalServiceExt)\r\n .fixedFinally(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.needPhoneNumberVerification = function(){\r\n return model.isPayBySavedCard() || model.isPayAndSaveCardWithConfirmation()\r\n || model.isPayAndSaveCheckWithConfirmation() || model.isPayBySavedCheck();\r\n }\r\n\r\n $scope.isPhoneNumberRequired = function () {\r\n return model.wantSmsReceipt || model.isPayBySavedCard() || model.isPayBySavedCheck()\r\n || (model.isPayByCard() && model.saveThisCard)\r\n || (model.isPayByCheck() && model.saveThisBankAccount);\r\n }\r\n\r\n $scope.isIosMobile = isMobileOrRipple() && iOS();\r\n\r\n $scope.pay = function(){\r\n if (usSpinnerService.isSpinning()) {\r\n ModalServiceExt.showError(\"Unexpected error. Your request is in progress...\");\r\n return;\r\n }\r\n $scope.payForm.$setSubmitted();\r\n if (!$scope.payForm.$valid){\r\n // if (model.isCvvConfirmationTypeActive && model.currentSavedCard && model.amount > 0)\r\n // {\r\n // ModalServiceExt.showError('Please provide pin to proceed.');\r\n // return;\r\n // }\r\n ModalServiceExt.showError('Please enter required fields to proceed.');\r\n return;\r\n }\r\n if (!$scope.isSupportedCardType()){\r\n ModalServiceExt.showError('We support only Visa, Mastercard and Discover cards.');\r\n return;\r\n }\r\n if (model.isPayByCard())\r\n payByCard();\r\n else\r\n payByCheck();\r\n }\r\n\r\n $scope.payByEmail = function(){\r\n if (usSpinnerService.isSpinning()) {\r\n ModalServiceExt.showError(\"Unexpected error. Your request is in progress...\");\r\n return;\r\n }\r\n if (model.email == '') {\r\n ModalServiceExt.showError(\"Please add your email address to receive OTP...\");\r\n return;\r\n }\r\n if (!$scope.isSupportedCardType()){\r\n ModalServiceExt.showError('We support only Visa, Mastercard and Discover cards.');\r\n return;\r\n }\r\n // model.verificationCode = \"\";\r\n if (model.isPayByCard())\r\n {\r\n $scope.payForm.$setSubmitted();\r\n if (!$scope.payForm.email.$valid || !$scope.payForm.phoneNumber.$valid || !$scope.payForm.cardNumber.$valid\r\n || !$scope.payForm.nameOnCard.$valid || !$scope.payForm.expirationDate.$valid){\r\n ModalServiceExt.showError('Please enter required fields to proceed.');\r\n return;\r\n }\r\n payByCardEmail();\r\n }\r\n else\r\n {\r\n $scope.payForm.$setSubmitted();\r\n if (!$scope.payForm.email.$valid || !$scope.payForm.phoneNumber.$valid || !$scope.payForm.nameOnAccount.$valid\r\n || !$scope.payForm.routingNumber.$valid || !$scope.payForm.bankAccountNumber.$valid){\r\n ModalServiceExt.showError('Please enter required fields to proceed.');\r\n return;\r\n }\r\n payByCheckEmail();\r\n }\r\n }\r\n\r\n $scope.isSupportedCardType = function (){\r\n var ccType = $scope.payForm.cardNumber.$ccType;\r\n return ccType === undefined || ['MasterCard', 'Visa', 'Discover'].indexOf(ccType) >= 0;\r\n }\r\n\r\n $scope.removeBankAccount = function (bankAccount) { \r\n ModalServiceExt.showYesNoMessage($scope._t(\"Delete Bank Account\"), \r\n $scope._t(\"Are you sure you want to delete this bank account?\"), function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/SmartPay/DeleteBankAccount',\r\n method: \"POST\",\r\n data: {\r\n token: $state.params.token,\r\n bankAccountId: bankAccount.Id,\r\n }\r\n })\r\n .apiThen(function (result) {\r\n $scope.savedBankAccounts = _.filter($scope.savedBankAccounts, function(item){\r\n return item.Id != bankAccount.Id;\r\n });\r\n if (!$scope.savedBankAccounts.length){\r\n model.useSavedBankAccount = false;\r\n }\r\n else {\r\n if (model.currentSavedBankAccount.Id == bankAccount.Id)\r\n model.currentSavedBankAccount = $scope.savedBankAccounts[0];\r\n }\r\n }, ModalServiceExt)\r\n .fixedFinally(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n });\r\n }\r\n\r\n $scope.isSavedBankAccountActive = function (bankAccount) {\r\n var result = bankAccount.Id == model.currentSavedBankAccount.Id;\r\n return result;\r\n }\r\n \r\n $scope.removeCard = function (card) {\r\n ModalServiceExt.showYesNoMessage($scope._t(\"Delete Card\"), \r\n $scope._t(\"Are you sure you want to delete this card?\"), function () {\r\n sendRemoveCardRequest(card);\r\n return;\r\n });\r\n }\r\n\r\n var sendRemoveCardRequest = function (card) { \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + '/api/SmartPay/RemoveSavedCard',\r\n data: {\r\n PaymentOptionId: card.Id,\r\n Token: $state.params.token,\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n ModalServiceExt.showInfo($scope._t(\"Card successfully removed.\"));\r\n $scope.savedCards = _.reject($scope.savedCards, function(c) { \r\n return c.Id == card.Id;\r\n });\r\n if($scope.savedCards.length > 0) {\r\n if (model.currentSavedCard.Id == card.Id)\r\n model.currentSavedCard = $scope.savedCards[0];\r\n }\r\n else {\r\n model.useSavedCard = false;\r\n model.currentSavedCard = null;\r\n }\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.useSavedCardClicked = function(){\r\n setPhoneNumber(model.currentSavedCard.PhoneNumber);\r\n }\r\n\r\n $scope.setDunning = function(dunningVariant) {\r\n switch (dunningVariant) {\r\n case 0:\r\n model.amount = ($scope.dunningAmount);\r\n $scope.amountBlocked = true;\r\n break;\r\n case 1:\r\n model.amount = ($scope.dunningAmount / 100 * 75);\r\n $scope.amountBlocked = true;\r\n break;\r\n case 2:\r\n model.amount = ($scope.dunningAmount);\r\n $scope.amountBlocked = false;\r\n break;\r\n }\r\n model.amount = (model.amount).toFixed(2);\r\n }\r\n\r\n $scope.getTotal = function () {\r\n let amount = Number(model.amount) + Number($scope.feeAmount);\r\n if (isNaN(amount))\r\n amount = 0;\r\n return Number(amount).toFixed(2);\r\n }\r\n\r\n $scope.savedCardChanged = function (card) {\r\n model.useSavedCard = true;\r\n model.currentSavedCard = card;\r\n setPhoneNumber(model.currentSavedCard.PhoneNumber);\r\n }\r\n\r\n $scope.isSavedCardActive = function (card) {\r\n var result = card.Id == model.currentSavedCard.Id;\r\n return result;\r\n }\r\n\r\n $scope.useSavedBankAccountClicked = function(){\r\n setPhoneNumber(model.currentSavedBankAccount.PhoneNumber);\r\n }\r\n\r\n $scope.savedBankAccountChanged = function (bankAccount) {\r\n model.useSavedBankAccount = true;\r\n model.currentSavedBankAccount = bankAccount;\r\n setPhoneNumber(model.currentSavedBankAccount.PhoneNumber);\r\n }\r\n\r\n $scope.areBankDetailsRequired = function () {\r\n return model.isPayByCheck() && !model.useSavedBankAccount;\r\n }\r\n\r\n $scope.areCardDetailsRequired = function () {\r\n return model.isPayByCard() && !model.useSavedCard;\r\n }\r\n\r\n function payByCheckEmail() {\r\n if(!model.isConfirmationCodeKnown() && $scope.needPhoneNumberVerification()) {\r\n sendBankAccountPaymentEmailCode();\r\n return;\r\n }\r\n // if (model.useSavedBankAccount){\r\n // payBySavedCheck();\r\n // return;\r\n // }\r\n sendBankAccountPaymentEmailCode();\r\n }\r\n\r\n function payByCheck() {\r\n if(!model.isConfirmationCodeKnown() && $scope.needPhoneNumberVerification()) {\r\n sendBankAccountPaymentSmsCode();\r\n return;\r\n }\r\n if (model.useSavedBankAccount){\r\n payBySavedCheck();\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n model.amount = Number(model.amount).toFixed(2);\r\n var paymentObject = {\r\n accountNumber: model.contractAccountNumber,\r\n userId: -1,\r\n amountToPay: model.amount,\r\n hasCollectionFee: $scope.fee,\r\n tokenTimestamp: $scope.tokenTimestamp,\r\n phone: model.phoneNumber,\r\n email: model.email,\r\n nameOnAccount: model.nameOnAccount,\r\n bankRoutingNumber: model.routingNumber,\r\n checkingAccountNumber: model.bankAccountNumber,\r\n companyCode: 0,\r\n notificationLogId: $state.params.emailId,\r\n eBillToken: $state.params.token,\r\n needToSave: model.saveThisBankAccount,\r\n paymentPage: 1,\r\n ConfirmationCode: model.verificationCode,\r\n hasPhoneNumberConsent: model.hasPhoneNumberConsent,\r\n wantSmsReceipt: model.wantSmsReceipt,\r\n wantEbill: model.wantEbill\r\n };\r\n $http({\r\n url: apiUrl + 'api/SmartPay/PayByNewCheck',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (payResult) {\r\n usSpinnerService.stop('spinner-1');\r\n processPayResult(payResult);\r\n }).error(function (data) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function payBySavedCheck() {\r\n usSpinnerService.spin('spinner-1');\r\n model.amount = Number(model.amount).toFixed(2);\r\n var paymentObject = {\r\n token: $state.params.token,\r\n bankAccountId: model.currentSavedBankAccount.Id,\r\n amount: model.amount,\r\n hasCollectionFee: $scope.fee,\r\n tokenTimestamp: $scope.tokenTimestamp,\r\n phone: model.phoneNumber,\r\n email: model.email,\r\n notificationLogId: $state.params.emailId,\r\n confirmationCode: model.verificationCode,\r\n hasPhoneNumberConsent: model.hasPhoneNumberConsent,\r\n wantSmsReceipt: model.wantSmsReceipt,\r\n wantEbill: model.wantEbill\r\n };\r\n $http({\r\n url: apiUrl + 'api/SmartPay/PayBySavedCheck',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (payResult) {\r\n usSpinnerService.stop('spinner-1');\r\n processPayResult(payResult);\r\n }).error(function (data) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function processPayResult(payResult, isWalletPayment) {\r\n if (!payResult) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (!payResult.IsSuccessful || payResult.IsBankAccountExistsError || payResult.IsPaymentOptionExistsError) {\r\n if(payResult.ConfirmationRemainedTime) {\r\n model.currentSavedCard.cvvAttemptsError = true;\r\n model.currentSavedCard.cvvTimeout = payResult.ConfirmationRemainedTime;\r\n cvvTickTimer();\r\n }\r\n\r\n if (payResult.Message && payResult.Message.includes('Errors: Payment failed. ')) {\r\n console.log(payResult.Message)\r\n payResult.Message = payResult.Message.replace('Errors: Payment failed. ', '');\r\n }\r\n if (payResult.WellsFargoResult === \"Unverified\")\r\n ModalServiceExt.showOkMessage($scope._t(\"Just a moment\") + \"!\", payResult.Message);\r\n else\r\n ModalServiceExt.showErrorRed(payResult.Message);\r\n return;\r\n }\r\n \r\n model.receipt = {};\r\n model.receipt.paymentGuid = payResult.UtilliGuid;\r\n let amount = Number(model.amount) + Number($scope.feeAmount);\r\n model.receipt.amountString = utilli.formatCurrency(amount);\r\n model.receipt.contractAccountNumber = model.contractAccountNumber;\r\n model.receipt.contractAccountNumber = model.contractAccountNumber;\r\n model.receipt.remittanceId = payResult.RemittanceId;\r\n model.receipt.paymentTime = payResult.PaymentDateTimeString;\r\n model.receipt.paymentMethod = model.paymentMethod;\r\n model.receipt.enrollmentInEbillDone = payResult.EnrollmentInEbillDone; \r\n if (model.isPayByCard()) {\r\n if (model.useSavedCard) {\r\n model.receipt.cardNumberStarred = \"**** **** **** \" + model.currentSavedCard.LastPart;\r\n model.receipt.nameOnCard = model.currentSavedCard.HolderName;\r\n }\r\n else {\r\n model.receipt.nameOnCard = model.nameOnCard;\r\n var last4 = model.cardNumber.substr(model.cardNumber.length - 4, 4);\r\n model.receipt.cardNumberStarred = ''.padStart((model.cardNumber.length - 4) * 5 / 4, '**** ') + last4;\r\n }\r\n }\r\n else {\r\n if (model.useSavedBankAccount){\r\n model.receipt.nameOnAccount = model.currentSavedBankAccount.NameOnAccount;\r\n model.receipt.bankAccountNumberStarred = 'XXXXXX' + model.currentSavedBankAccount.BankAccountNumber;\r\n }\r\n else {\r\n model.receipt.nameOnAccount = model.nameOnAccount;\r\n var last4 = model.bankAccountNumber.substr(model.bankAccountNumber.length - 4, 4);\r\n model.receipt.bankAccountNumberStarred = 'XXXXXX' + last4;\r\n }\r\n }\r\n model.receipt.warning = payResult.Warning;\r\n if(isWalletPayment) {\r\n model.receipt.walletCardInfo = payResult.WalletCardInfo;\r\n }\r\n \r\n $state.go('SmartPayLayout.SmartPayResult', { paymentGuid: payResult.UtilliGuid });\r\n }\r\n\r\n $scope.goToPreferences = function () {\r\n $state.go('SmartPayLayout.Preferences', { token: $state.params.token });\r\n }\r\n\r\n function payByCard() {\r\n if(!model.isConfirmationCodeKnown() && $scope.needPhoneNumberVerification()) {\r\n sendCardPaymentSmsCode();\r\n return;\r\n }\r\n\r\n if(model.useSavedCard && model.currentSavedCard.cvvAttemptsError) {\r\n return;\r\n }\r\n\r\n if(model.useSavedCard)\r\n payBySavedCard();\r\n else \r\n payByNewCard();\r\n };\r\n\r\n function payByCardEmail() {\r\n if(!model.isConfirmationCodeKnown() && $scope.needPhoneNumberVerification()) {\r\n sendCardPaymentEmailCode();\r\n return;\r\n }\r\n\r\n if(model.useSavedCard && model.currentSavedCard.cvvAttemptsError) {\r\n return;\r\n }\r\n\r\n sendCardPaymentEmailCode();\r\n // if(model.useSavedCard)\r\n // payBySavedCard();\r\n // else \r\n // payByNewCard();\r\n };\r\n\r\n function payBySavedCard() {\r\n usSpinnerService.spin('spinner-1');\r\n model.amount = Number(model.amount).toFixed(2);\r\n var paymentObject = {\r\n accountNumber: model.contractAccountNumber,\r\n amountToPay: model.amount,\r\n hasCollectionFee: $scope.fee,\r\n tokenTimestamp: $scope.tokenTimestamp,\r\n phone: model.phoneNumber,\r\n email: model.email,\r\n paymentPage: 1,\r\n needToSave: model.saveThisCard && !model.useSavedCard,\r\n eBillToken: $state.params.token,\r\n notificationLogId: $state.params.emailId,\r\n companyCode: 0,\r\n invoiceNumber: -1,\r\n confirmationCode: !model.isCvvConfirmationTypeActive \r\n ? model.verificationCode\r\n : null,\r\n cardId: model.currentSavedCard.Id,\r\n // cvv: model.isCvvConfirmationTypeActive \r\n // ? model.verificationCode\r\n // : null,\r\n pin: model.isCvvConfirmationTypeActive \r\n ? model.verificationCode\r\n : null,\r\n hasPhoneNumberConsent: model.hasPhoneNumberConsent,\r\n wantSmsReceipt: model.wantSmsReceipt,\r\n wantEbill: model.wantEbill\r\n };\r\n \r\n $http({\r\n url: apiUrl + 'api/SmartPay/PayBySavedCard',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (payResult) {\r\n usSpinnerService.stop('spinner-1');\r\n processPayResult(payResult);\r\n }).error(function (data) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function payByNewCard () {\r\n usSpinnerService.spin('spinner-1');\r\n model.amount = Number(model.amount).toFixed(2);\r\n var paymentObject = {\r\n accountNumber: model.contractAccountNumber,\r\n amountToPay: model.amount,\r\n hasCollectionFee: $scope.fee,\r\n tokenTimestamp: $scope.tokenTimestamp,\r\n phone: model.phoneNumber,\r\n email: model.email,\r\n paymentPage: 1,\r\n needToSave: model.saveThisCard && !model.useSavedCard,\r\n eBillToken: $state.params.token,\r\n notificationLogId: $state.params.emailId,\r\n companyCode: 0,\r\n invoiceNumber: -1,\r\n confirmationCode: model.verificationCode,\r\n hasPhoneNumberConsent: model.hasPhoneNumberConsent,\r\n wantSmsReceipt: model.wantSmsReceipt,\r\n wantEbill: model.wantEbill\r\n };\r\n \r\n var expirationYear = '20' + model.expirationDate.substr(2, 2);\r\n var expirationMonth = model.expirationDate.substr(0, 2);\r\n \r\n paymentObject.cardNumber = model.cardNumber;\r\n paymentObject.nameOnCard = model.nameOnCard;\r\n paymentObject.expirationDateYear = expirationYear;\r\n paymentObject.expirationDateMonth = expirationMonth;\r\n \r\n $http({\r\n url: apiUrl + 'api/SmartPay/PayByNewCard',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (payResult) {\r\n usSpinnerService.stop('spinner-1');\r\n processPayResult(payResult);\r\n }).error(function (data) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function startSmsConfirmationTimer(remainedTime) {\r\n if(remainedTime)\r\n model.timeout = remainedTime;\r\n else\r\n model.timeout = 31;\r\n\r\n tickTimer();\r\n }\r\n\r\n var tickTimer = function () {\r\n if (model.timeout != 0) {\r\n model.timeout--;\r\n $timeout(tickTimer, 1000);\r\n } else {\r\n model.canRequestVerificationCode = true;\r\n model.canShowTimer = false;\r\n return;\r\n }\r\n\r\n var secInMinute = 60;\r\n model.canShowTimer = true;\r\n model.timeoutStr = '' + (model.timeout % secInMinute); //60 seconds in 1 minute\r\n if (model.timeoutStr.length < 2) {\r\n model.timeoutStr = '0' + model.timeoutStr;\r\n }\r\n model.timeoutStrMinutes = '' + Math.floor(model.timeout / secInMinute);\r\n if (model.timeoutStrMinutes.length < 1) {\r\n model.timeoutStrMinutes = '0';\r\n }\r\n }\r\n\r\n var cvvTickTimer = function () {\r\n if($scope.savedCards.length == 0)\r\n return;\r\n\r\n var useTimeoutFlag = false;\r\n $scope.savedCards.forEach(function (item) {\r\n if (item.cvvTimeout != 0) {\r\n item.cvvTimeout--;\r\n useTimeoutFlag = true;\r\n } else {\r\n item.cvvAttemptsError = false;\r\n return;\r\n }\r\n \r\n var secInMinute = 60;\r\n item.cvvTimeoutStr = '' + (item.cvvTimeout % secInMinute); //60 seconds in 1 minute\r\n if (item.cvvTimeoutStr.length < 2) {\r\n item.cvvTimeoutStr = '0' + item.cvvTimeoutStr;\r\n }\r\n item.cvvTimeoutStrMinutes = '' + Math.floor(item.cvvTimeout / secInMinute);\r\n if (item.cvvTimeoutStrMinutes.length < 1) {\r\n item.cvvTimeoutStrMinutes = '0';\r\n }\r\n })\r\n if(useTimeoutFlag)\r\n $timeout(cvvTickTimer, 1000);\r\n }\r\n\r\n $scope.isSmsCodeErrorVisible = function () {\r\n var regex = model.needToUseCvvValidation()\r\n ? /^(\\d{4})?$|^$/ \r\n : /^(\\d{4})?$|^$/;\r\n \r\n return model.isConfirmationCodeKnown() && $scope.needPhoneNumberVerification() \r\n && ($scope.payForm.verificationCode.$invalid || !regex.test(model.verificationCode)) \r\n && $scope.payForm.$submitted;\r\n }\r\n\r\n function sendBankAccountPaymentSmsCode () {\r\n if (!model.canRequestVerificationCode)\r\n return;\r\n\r\n model.smsCodeSubmitted = true;\r\n model.sendSmsCodeError = null;\r\n model.canShowTimer = false;\r\n \r\n model.smsCodeSubmitted = false;\r\n model.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n \r\n var url = model.useSavedBankAccount \r\n ? apiUrl + '/api/SmartPay/SendPaymentConfirmationSmsForCheck'\r\n : apiUrl + '/api/SmartPay/SendNewPhoneConfirmationSmsForCheck'\r\n var requestData = {\r\n PhoneNumber: model.phoneNumber,\r\n Token: $state.params.token\r\n };\r\n if (model.useSavedBankAccount) {\r\n requestData.BankAccountId = model.currentSavedBankAccount.Id;\r\n }\r\n else {\r\n requestData.nameOnAccount = model.nameOnAccount;\r\n requestData.bankRoutingNumber = model.routingNumber;\r\n requestData.bankAccountNumber = model.bankAccountNumber;\r\n }\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: requestData\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.IsPaymentOptionExistsError) {\r\n model.canRequestVerificationCode = true;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n if(response.Data && response.Data.RemainedTime) {\r\n model.smsCodeSent = true;\r\n startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n model.sendSmsCodeError = response.Errors[0];\r\n model.canRequestVerificationCode = true;\r\n }\r\n else {\r\n startSmsConfirmationTimer();\r\n\r\n $scope.payForm.$setPristine();//reset submitted flag\r\n\r\n var successMessage = model.useSavedBankAccount\r\n ? $scope._t(\"One-time SMS confirmation code has been sent to your mobile number %phoneNumber% that\" \r\n + \" was used to register this bank account. Use the confirmation code to proceed with your\" \r\n + \" bank account payment\").replace('%phoneNumber%', \r\n utilli.getMaskedPhoneNumberValue(model.currentSavedBankAccount.PhoneNumber))\r\n : $scope._t(\"SMS code successfully sent.\")\r\n\r\n ModalServiceExt.showInfo(successMessage);\r\n model.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n model.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n function sendBankAccountPaymentEmailCode () {\r\n if (!model.canRequestVerificationCode)\r\n return;\r\n\r\n model.smsCodeSubmitted = true;\r\n model.sendSmsCodeError = null;\r\n model.canShowTimer = false;\r\n \r\n model.smsCodeSubmitted = false;\r\n model.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n \r\n var url = model.useSavedBankAccount \r\n ? apiUrl + '/api/SmartPay/SendPaymentConfirmationEmailForCheck'\r\n : apiUrl + '/api/SmartPay/SendNewPhoneConfirmationEmailForCheck'\r\n var requestData = {\r\n PhoneNumber: model.phoneNumber,\r\n Token: $state.params.token,\r\n Email: model.email,\r\n };\r\n if (model.useSavedBankAccount) {\r\n requestData.BankAccountId = model.currentSavedBankAccount.Id;\r\n }\r\n else {\r\n requestData.nameOnAccount = model.nameOnAccount;\r\n requestData.bankRoutingNumber = model.routingNumber;\r\n requestData.bankAccountNumber = model.bankAccountNumber;\r\n }\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: requestData\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.IsPaymentOptionExistsError) {\r\n model.canRequestVerificationCode = true;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n if(response.Data && response.Data.RemainedTime) {\r\n model.smsCodeSent = true;\r\n startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n model.sendSmsCodeError = response.Errors[0];\r\n model.canRequestVerificationCode = true;\r\n }\r\n else {\r\n startSmsConfirmationTimer();\r\n\r\n $scope.payForm.$setPristine();//reset submitted flag\r\n\r\n var successMessage = model.useSavedBankAccount\r\n ? $scope._t(\"One-time Email confirmation code has been sent to your email address %email%.\" \r\n + \" Use the confirmation code to proceed with your\" \r\n + \" bank account payment\").replace('%email%', model.email)\r\n : $scope._t(\"Email code successfully sent.\")\r\n\r\n ModalServiceExt.showInfo(successMessage);\r\n model.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n model.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n function sendCardPaymentSmsCode () {\r\n if (!model.canRequestVerificationCode)\r\n return;\r\n\r\n model.smsCodeSubmitted = true;\r\n model.sendSmsCodeError = null;\r\n model.canShowTimer = false;\r\n \r\n model.smsCodeSubmitted = false;\r\n model.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n \r\n var url = model.useSavedCard \r\n ? apiUrl + '/api/SmartPay/SendPaymentConfirmationSms'\r\n : apiUrl + '/api/SmartPay/SendNewPhoneConfirmationSms'\r\n var requestData = {\r\n PhoneNumber: model.phoneNumber,\r\n Token: $state.params.token\r\n };\r\n if (model.useSavedCard) {\r\n requestData.CardId = model.currentSavedCard.Id;\r\n }\r\n else {\r\n var expirationYear = model.expirationDate.substr(2,2);\r\n var expirationMonth = model.expirationDate.substr(0, 2);\r\n\r\n requestData.CardNumber = model.cardNumber;\r\n requestData.ExpirationDateYear = expirationYear;\r\n requestData.ExpirationDateMonth = expirationMonth;\r\n }\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: requestData\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.IsPaymentOptionExistsError) {\r\n model.canRequestVerificationCode = true;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n if(response.Data && response.Data.RemainedTime) {\r\n model.smsCodeSent = true;\r\n $scope.payForm.$setPristine();//reset submitted flag\r\n startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n model.sendSmsCodeError = response.Errors[0];\r\n model.canRequestVerificationCode = true;\r\n }\r\n else {\r\n startSmsConfirmationTimer();\r\n\r\n $scope.payForm.$setPristine();//reset submitted flag\r\n\r\n var successMessage = model.useSavedCard \r\n ? $scope._t(\"One-time SMS confirmation code has been sent to your mobile number %phoneNumber% that\"\r\n + \" was used to register this card. Use the confirmation code to proceed with your card payment.\")\r\n .replace('%phoneNumber%', utilli.getMaskedPhoneNumberValue(model.currentSavedCard.PhoneNumber))\r\n : $scope._t(\"SMS code successfully sent.\")\r\n ModalServiceExt.showInfo(successMessage);\r\n model.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n model.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n function sendCardPaymentEmailCode () {\r\n if (!model.canRequestVerificationCode)\r\n return;\r\n\r\n model.smsCodeSubmitted = true;\r\n model.sendSmsCodeError = null;\r\n model.canShowTimer = false;\r\n \r\n model.smsCodeSubmitted = false;\r\n model.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n \r\n var url = model.useSavedCard \r\n ? apiUrl + '/api/SmartPay/SendPaymentConfirmationEmail'\r\n : apiUrl + '/api/SmartPay/SendEmailConfirmationEmail'\r\n var requestData = {\r\n PhoneNumber: model.phoneNumber,\r\n EmailAddress: model.email,\r\n Token: $state.params.token\r\n };\r\n if (model.useSavedCard) {\r\n requestData.CardId = model.currentSavedCard.Id;\r\n }\r\n else {\r\n var expirationYear = model.expirationDate.substr(2,2);\r\n var expirationMonth = model.expirationDate.substr(0, 2);\r\n\r\n requestData.CardNumber = model.cardNumber;\r\n requestData.ExpirationDateYear = expirationYear;\r\n requestData.ExpirationDateMonth = expirationMonth;\r\n }\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: requestData\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.IsPaymentOptionExistsError) {\r\n model.canRequestVerificationCode = true;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n if(response.Data && response.Data.RemainedTime) {\r\n model.smsCodeSent = true;\r\n $scope.payForm.$setPristine();//reset submitted flag\r\n startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n model.sendSmsCodeError = response.Errors[0];\r\n model.canRequestVerificationCode = true;\r\n }\r\n else {\r\n startSmsConfirmationTimer();\r\n\r\n $scope.payForm.$setPristine();//reset submitted flag\r\n\r\n var successMessage = model.useSavedCard \r\n ? $scope._t(\"One-time Email confirmation code has been sent to your email address %email%.\"\r\n + \" Use the confirmation code to proceed with your card payment.\")\r\n .replace('%email%', model.email)\r\n : $scope._t(\"Email code successfully sent.\")\r\n ModalServiceExt.showInfo(successMessage);\r\n model.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n model.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n function sendPinSmsCode (pin) {\r\n // if (!model.canRequestVerificationCode)\r\n // return;\r\n\r\n // model.smsCodeSubmitted = true;\r\n // model.sendSmsCodeError = null;\r\n // model.canShowTimer = false;\r\n \r\n // model.smsCodeSubmitted = false;\r\n // model.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n \r\n var url = apiUrl + '/api/SmartPay/SendPinVerificationSms';\r\n var requestData = {\r\n PhoneNumber: model.phoneNumber,\r\n Token: $state.params.token,\r\n Pin: pin,\r\n CardId: model.currentSavedCard.Id\r\n };\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: requestData\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.IsPaymentOptionExistsError) {\r\n // model.canRequestVerificationCode = true;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n if(response.Data && response.Data.RemainedTime) {\r\n // model.smsCodeSent = true;\r\n // $scope.payForm.$setPristine();//reset submitted flag\r\n // startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n model.sendSmsCodeError = response.Errors[0];\r\n // model.canRequestVerificationCode = true;\r\n }\r\n else {\r\n // startSmsConfirmationTimer();\r\n // $scope.payForm.$setPristine();//reset submitted flag\r\n var successMessage = model.useSavedCard \r\n ? $scope._t(\"One-time SMS confirmation code has been sent to your mobile number %phoneNumber% that\"\r\n + \" was used to register this card. Use the confirmation code to proceed with your card payment.\")\r\n .replace('%phoneNumber%', utilli.getMaskedPhoneNumberValue(model.currentSavedCard.PhoneNumber))\r\n : $scope._t(\"SMS code successfully sent.\")\r\n // ModalServiceExt.showInfo(successMessage);\r\n // model.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n model.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n function sendPinEmailCode (pin) {\r\n // if (!model.canRequestVerificationCode)\r\n // return;\r\n\r\n // model.smsCodeSubmitted = true;\r\n // model.sendSmsCodeError = null;\r\n // model.canShowTimer = false;\r\n \r\n // model.smsCodeSubmitted = false;\r\n // model.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n \r\n var url = apiUrl + '/api/SmartPay/SendPinVerificationEmail';\r\n var requestData = {\r\n PhoneNumber: model.phoneNumber,\r\n Token: $state.params.token,\r\n Pin: pin,\r\n CardId: model.currentSavedCard.Id,\r\n Email: model.email,\r\n };\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: requestData\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.IsPaymentOptionExistsError) {\r\n // model.canRequestVerificationCode = true;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n if(response.Data && response.Data.RemainedTime) {\r\n // model.smsCodeSent = true;\r\n // $scope.payForm.$setPristine();//reset submitted flag\r\n // startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n model.sendSmsCodeError = response.Errors[0];\r\n // model.canRequestVerificationCode = true;\r\n }\r\n else {\r\n // startSmsConfirmationTimer();\r\n // $scope.payForm.$setPristine();//reset submitted flag\r\n var successMessage = model.useSavedCard \r\n ? $scope._t(\"One-time Email confirmation code has been sent to your email address %email%.\"\r\n + \" Use the confirmation code to proceed with your card payment.\")\r\n .replace('%email%', model.email)\r\n : $scope._t(\"Email code successfully sent.\")\r\n // ModalServiceExt.showInfo(successMessage);\r\n // model.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n model.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n function savePinSmsCode (otp) {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n \r\n var url = apiUrl + '/api/SmartPay/SaveCardPin';\r\n var requestData = {\r\n PhoneNumber: model.phoneNumber,\r\n Token: $state.params.token,\r\n Pin: $scope.pin,\r\n CardId: model.currentSavedCard.Id,\r\n Otp: otp,\r\n Email: model.email,\r\n };\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: requestData\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n \r\n ModalServiceExt.showPinError(response.Errors[0]);\r\n return;\r\n // model.sendSmsCodeError = response.Errors[0];\r\n // model.canRequestVerificationCode = true;\r\n }\r\n else {\r\n // startSmsConfirmationTimer();\r\n // $scope.payForm.$setPristine();//reset submitted flag\r\n var successMessage = model.useSavedCard \r\n ? $scope._t(\"Your PIN has been successfully saved.\")\r\n : $scope._t(\"Your PIN has been successfully saved.\");\r\n ModalServiceExt.close();\r\n ModalServiceExt.showInfo(successMessage);\r\n $state.reload();\r\n // model.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n model.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n // model.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n $scope.cancelPayment = function(){\r\n $state.go('SmartPayLayout.SmartPayLeave', { notificationLogId: $state.params.emailId, \r\n installmentPlanToken: $scope.model.installmentPlanToken });\r\n }\r\n\r\n $scope.getPayButtonText = function () {\r\n var isSendSmsAction = (model.isPayAndSaveCardWithConfirmation() \r\n || model.isPayBySavedCard() \r\n || model.isPayAndSaveCheckWithConfirmation() \r\n || model.isPayBySavedCheck()) && !model.isConfirmationCodeKnown();\r\n let amount = $scope.getTotal();\r\n if (amount === '0.00')\r\n amount = '';\r\n else\r\n amount = \" $\" + amount;\r\n if(isSendSmsAction)\r\n return $scope._t('Send SMS');\r\n else \r\n return $scope._t('Pay' + amount);\r\n }\r\n\r\n $scope.getCardTypeClass = function(card){\r\n var ngClass = {};\r\n var cardTypeName = card && card.CardType ? card.CardType.toLowerCase() : 'visa';\r\n ngClass[cardTypeName] = true;\r\n return ngClass;\r\n }\r\n\r\n $scope.useOtp = function () {\r\n model.timeout = 0;\r\n model.isCvvConfirmationTypeActive = false;\r\n model.verificationCode = '';\r\n }\r\n\r\n $scope.setPin = function (title) { \r\n // ModalServiceExt.showInfo($scope._t(\"Your browser doesn't support Apple Pay\"));\r\n ModalServiceExt.showCreatePin(\r\n $scope._t(title),\r\n $scope._t(\"PIN\"),\r\n function (res, type) { createPinSendOtp(res, type); },\r\n function (res) { saveOtp(res); });\r\n\r\n return;\r\n }\r\n\r\n $scope.useCvv = function () {\r\n model.isCvvConfirmationTypeActive = true;\r\n model.verificationCode = '';\r\n }\r\n\r\n $scope.resendSms = function () {\r\n if(model.isResendTimerVisible())\r\n return;\r\n if (model.isPayByCard())\r\n sendCardPaymentSmsCode();\r\n else\r\n sendBankAccountPaymentSmsCode();\r\n }\r\n\r\n $scope.goToIpPage = function () {\r\n $state.go('SmartPayLayout.InstallmentPlan', { token: model.installmentPlanToken });\r\n }\r\n \r\n $scope.goToBbpPage = function () {\r\n $state.go('SmartPayLayout.BudgetBillingWglcx', { \r\n token: model.budgetBillingPlanToken,\r\n directSrc: 'SmartPay'\r\n });\r\n }\r\n\r\n function fixDropDownFromClickToHover() { \r\n $(\".dropdown-menu\" ).css('margin-top',0);\r\n\r\n $(\".customer-preferences-btn.dropdown\")\r\n .on('mouseover', function() {\r\n $( this ).addClass('show').attr('aria-expanded',\"true\");\r\n $( this ).find('.dropdown-menu').addClass('show');\r\n })\r\n .on('mouseout', function() {\r\n $( this ).removeClass('show').attr('aria-expanded',\"false\");\r\n $( this ).find('.dropdown-menu').removeClass('show');\r\n });\r\n }\r\n\r\n function createPinSendOtp(pin, type) {\r\n $scope.pin = pin;\r\n if (type == 'email') {\r\n sendPinEmailCode(pin);\r\n }\r\n else {\r\n sendPinSmsCode(pin);\r\n }\r\n }\r\n\r\n function saveOtp(otp) { \r\n savePinSmsCode(otp);\r\n }\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('SmartPayLeaveController', [\"$scope\", \"$window\", \"usSpinnerService\", \"$state\", \"$http\", \"ServiceProvidersService\", \"ModalServiceExt\", function ($scope, $window, usSpinnerService, $state,\r\n $http, ServiceProvidersService, ModalServiceExt) {\r\n var _t = $scope._t;\r\n\r\n $scope.installmentPlanToken = $state.params.installmentPlanToken;\r\n $scope.goToInstallmentPlan = function(){\r\n $state.go(\"SmartPayLayout.InstallmentPlan\", {\r\n token: $scope.installmentPlanToken\r\n });\r\n }\r\n\r\n // scroll to the top of the page so that if there is a Payment Arrangement button then the user will see it\r\n $window.scrollTo(0,0);\r\n\r\n $scope.reasons = [\r\n {\r\n id: 'anotherTime',\r\n text: _t('I’ll pay my bill another time'),\r\n checked: false\r\n },\r\n {\r\n id: 'securityConcern',\r\n text: _t('I have a security concern'),\r\n checked: false\r\n },\r\n {\r\n id: 'otherChannels',\r\n text: _t('I prefer other payment channels'),\r\n checked: false\r\n },\r\n {\r\n id: 'otherMethods',\r\n text: _t('I prefer other payment methods'),\r\n checked: false\r\n },\r\n {\r\n id: 'technicalIssues',\r\n text: _t('I am having technical issues'),\r\n checked: false\r\n },\r\n {\r\n id: 'other',\r\n text: _t('Other:'),\r\n checked: false\r\n },\r\n ];\r\n\r\n $scope.back = function () {\r\n $window.history.back();\r\n }\r\n\r\n $scope.submit = function() {\r\n var checked = _.filter($scope.reasons, function(r) { return r.checked; });\r\n if (!checked.length){\r\n ModalServiceExt.showError(_t('Please select at least one reason.'));\r\n return;\r\n }\r\n var ids = _.map(checked, function(r) { return r.id; });\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n var apiUrl = providerData.ApiUrl;\r\n $http({\r\n url: apiUrl + 'api/SmartPay/Leave',\r\n method: \"POST\",\r\n data: { \r\n notificationLogId: $state.params.notificationLogId,\r\n reasons: ids,\r\n otherReasonText: $scope.otherReasonText\r\n }\r\n }).success(function (payResult) {\r\n $scope.showThankYou = true;\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n })\r\n .catch(function (e) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n}]);\r\n\r\n\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('SmartPayPreferencesController', [\"$scope\", \"$window\", \"usSpinnerService\", \"$state\", \"$http\", \"ServiceProvidersService\", \"ModalServiceExt\", function ($scope, $window, usSpinnerService, $state,\r\n $http, ServiceProvidersService, ModalServiceExt) {\r\n \r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n $scope.applyToAllAccounts = false;\r\n\r\n $scope.emailTimer = utilli.createResendTimer($scope);\r\n $scope.smsTimer = utilli.createResendTimer($scope);\r\n \r\n usSpinnerService.spin('spinner-1');\r\n var apiUrl;\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n utilli.resolveServiceProviderApiDeffered(providerData.ApiUrl);\r\n loadCustomerInfo();\r\n })\r\n .catch(function(){\r\n ModalServiceExt.showServerError();\r\n utilli.rejectServiceProviderApiDeffered();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n $scope.goBack = function () { \r\n $window.history.back();\r\n }\r\n\r\n $scope.save = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var permissions = _.reject($scope.permissions, function(p){ return p.isGroupHeader; });\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/UpdateCustomerPreferences',\r\n data: {\r\n authToken: $state.params.token,\r\n permission: permissions,\r\n applyToAllAccounts: $scope.applyToAllAccounts\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n ModalServiceExt.showInfo($scope._t(\"Changes successfully saved.\"));\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function setEmailsAndPhoneNumbers(response) { \r\n var clientUtilliIdCounter = 0;\r\n if(response.Data.MobileNumbers) {\r\n $scope.mobilePhones = response.Data.MobileNumbers;\r\n $scope.mobilePhones.forEach(function(mobilePhone) {\r\n mobilePhone.clientUtilliId = clientUtilliIdCounter;\r\n clientUtilliIdCounter++;\r\n });\r\n }\r\n else {\r\n $scope.mobilePhones = [];\r\n }\r\n\r\n if(response.Data.Emails) {\r\n clientUtilliIdCounter = 0;\r\n $scope.emails = response.Data.Emails;\r\n $scope.emails.forEach(function(email) {\r\n email.clientUtilliId = clientUtilliIdCounter;\r\n clientUtilliIdCounter++;\r\n });\r\n }\r\n else {\r\n $scope.emails = [];\r\n }\r\n }\r\n\r\n $scope.verifyEmail = function (emailInfo) {\r\n if(emailInfo.NotSaved) {\r\n emailInfo.isSubmitted = true;\r\n if(!$scope.emailForm[\"email\" + emailInfo.clientUtilliId].$valid)\r\n return;\r\n }\r\n\r\n $scope.isEmailConfirmationBoxVisible = true;\r\n $scope.emailForVerification = emailInfo.Email;\r\n $scope.sendEmailVerificationCode();\r\n }\r\n\r\n $scope.closeEmailConfirmationBox = function () { \r\n $scope.isEmailConfirmationBoxVisible = false;\r\n }\r\n\r\n $scope.sendEmailVerificationCode = function () {\r\n if($scope.emailTimer.isResendTimerVisible())\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/SendEmailVerificationConfirmationCode',\r\n data: {\r\n authToken: $state.params.token,\r\n email: $scope.emailForVerification\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n $scope.isEmailConfirmationBoxVisible = false;\r\n $scope.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.RemainedTime) {\r\n $scope.emailTimer.isCodeSent = true;\r\n $scope.emailTimer.startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showError(response.Errors[0]);\r\n $scope.sendSmsCodeError = response.Errors[0];\r\n }\r\n else {\r\n $scope.hasEmailVerificationCodeSent = true;\r\n $scope.emailTimer.startSmsConfirmationTimer();\r\n $scope.emailTimer.isCodeSent = true;\r\n // ModalServiceExt.showInfo($scope._t(\"The confirmation code was successfully sent on your email.\"));\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.checkEmailVerificationCode = function () {\r\n $scope.emailVerificationForm.$submitted = true;\r\n if(!$scope.emailVerificationForm.$valid) \r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/CheckEmailVerificationCode',\r\n data: {\r\n authToken: $state.params.token,\r\n email: $scope.emailForVerification,\r\n verificationCode: $scope.emailVerificationCode\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n ModalServiceExt.showInfo($scope._t(\"The email was successfully verified.\"));\r\n $scope.isEmailConfirmationBoxVisible = false;\r\n $scope.emailVerificationCode = '';\r\n for (var i = 0; i < $scope.emails.length; i++) {\r\n if($scope.emails[i].Email == $scope.emailForVerification) {\r\n $scope.emails[i].IsVerified = true;\r\n $scope.emails[i].NotSaved = false;\r\n $scope.emails[i].Id = response.Data;\r\n $scope.emails[i].Preferred = $scope.emails.length == 1;\r\n break;\r\n }\r\n }\r\n }\r\n })\r\n .error(function(error) {\r\n ModalServiceExt.showError(error);\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.verifyMobilePhone = function (mobilePhone) {\r\n if(mobilePhone.NotSaved) {\r\n mobilePhone.isSubmitted = true;\r\n if(!$scope.phoneForm[\"mobilePhone\" + mobilePhone.clientUtilliId].$valid)\r\n return;\r\n }\r\n\r\n $scope.isMobilePhoneConfirmationBoxVisible = true;\r\n $scope.mobilePhoneForVerification = utilli.getMaskedPhoneNumberValue(mobilePhone.PhoneNumber);\r\n $scope.mobilePhoneInfoForVerification = mobilePhone;\r\n $scope.sendPhoneNumberVerificationCode(mobilePhone.PhoneNumber);\r\n }\r\n\r\n $scope.closeMobilePhoneConfirmationBox = function () {\r\n $scope.isMobilePhoneConfirmationBoxVisible = false;\r\n }\r\n\r\n $scope.sendPhoneNumberVerificationCode = function () {\r\n if($scope.smsTimer.isResendTimerVisible())\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/SendPhoneNumberVerificationConfirmationCode',\r\n data: {\r\n authToken: $state.params.token,\r\n phoneNumber: $scope.mobilePhoneInfoForVerification.PhoneNumber\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n $scope.isMobilePhoneConfirmationBoxVisible = false;\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.RemainedTime) {\r\n $scope.smsTimer.isCodeSent = true;\r\n $scope.smsTimer.startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n\r\n $scope.isMobilePhoneConfirmationBoxVisible = false;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $scope.smsTimer.startSmsConfirmationTimer();\r\n $scope.smsTimer.isCodeSent = true;\r\n $scope.hasMobilePhoneVerificationCodeSent = true;\r\n // ModalServiceExt.showInfo($scope._t(\"The confirmation code was successfully sent on phone number.\"));\r\n }\r\n })\r\n .error(function(error) {\r\n ModalServiceExt.showError(error);\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.checkPhoneNumberVerificationCode = function () {\r\n $scope.pnVerificationForm.$submitted = true;\r\n if(!$scope.pnVerificationForm.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/CheckPhoneNumberVerificationCode',\r\n data: {\r\n authToken: $state.params.token,\r\n phoneNumber: $scope.mobilePhoneInfoForVerification.PhoneNumber,\r\n verificationCode: $scope.mobilePhoneVerificationCode\r\n }\r\n })\r\n .success(function(response) {\r\n $scope.pnVerificationForm.$submitted = false;\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.RemainedTime) {\r\n $scope.smsTimer.isCodeSent = true;\r\n $scope.smsTimer.startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $scope.smsTimer.isCodeSent = true;\r\n $scope.smsTimer.startSmsConfirmationTimer();\r\n ModalServiceExt.showInfo($scope._t(\"The phone number was successfully verified.\"));\r\n $scope.isMobilePhoneConfirmationBoxVisible = false;\r\n $scope.mobilePhoneVerificationCode = '';\r\n for (var i = 0; i < $scope.mobilePhones.length; i++) {\r\n if($scope.mobilePhones[i].PhoneNumber == $scope.mobilePhoneInfoForVerification.PhoneNumber) {\r\n $scope.mobilePhones[i].IsVerified = true;\r\n $scope.mobilePhones[i].NotSaved = false;\r\n $scope.mobilePhones[i].Id = response.Data;\r\n $scope.mobilePhones[i].Preferred = $scope.mobilePhones.length == 1;\r\n break;\r\n }\r\n }\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.addMobilePhoneNumber = function () {\r\n if ($scope.mobilePhones.length >= 5){\r\n ModalServiceExt.showError(\"We can't add more than 5 numbers.\");\r\n return;\r\n }\r\n var maxId = 0;\r\n $scope.mobilePhones.forEach(function (mobilePhone) {\r\n if (mobilePhone.clientUtilliId >= maxId)\r\n {\r\n maxId = mobilePhone.clientUtilliId + 1;\r\n }\r\n });\r\n\r\n $scope.mobilePhones.push({ \r\n PhoneNumber: '', \r\n clientUtilliId: maxId,\r\n NotSaved: true,\r\n Verified: false });\r\n }\r\n\r\n $scope.removeMobilePhone = function (mobilePhone) {\r\n if(mobilePhone.NotSaved) {\r\n var remainMobilePhones = _.reject($scope.mobilePhones, \r\n function(p){ return p.clientUtilliId == mobilePhone.clientUtilliId; });\r\n $scope.mobilePhones = remainMobilePhones;\r\n return;\r\n }\r\n\r\n if ($scope.mobilePhones.length == 1) {\r\n ModalServiceExt.showError(\"You cannot remove last phone number.\");\r\n }\r\n else {\r\n ModalServiceExt.showYesNoMessage(\r\n $scope._t('Attention'),\r\n $scope._t(\"Are you sure you want to delete phone number \" + utilli.getMaskedPhoneNumberValue(mobilePhone.PhoneNumber) + \"?\"),\r\n function () { \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/RemovePhoneNumber/',\r\n data: {\r\n authToken: $state.params.token,\r\n phoneNumber: mobilePhone.PhoneNumber\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function() {\r\n ModalServiceExt.showInfo($scope._t(\"Phone number successfully deleted.\"), function () {\r\n var remainMobilePhones = _.reject($scope.mobilePhones, \r\n function(mp){ return mp.PhoneNumber == mobilePhone.PhoneNumber; });\r\n $scope.mobilePhones = remainMobilePhones;\r\n });\r\n });\r\n })\r\n .error(function(error) {\r\n console.error(error);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n );\r\n }\r\n }\r\n\r\n $scope.addEmail = function () {\r\n if ($scope.emails.length >= 5) {\r\n ModalServiceExt.showError(\"We can't add more than 5 emails.\");\r\n return;\r\n }\r\n var maxId = 0;\r\n $scope.emails.forEach(function (email) {\r\n if (email.clientUtilliId >= maxId)\r\n {\r\n maxId = email.clientUtilliId + 1;\r\n }\r\n });\r\n\r\n $scope.emails.push({ \r\n Email: '', \r\n clientUtilliId: maxId,\r\n NotSaved: true,\r\n Verified: false \r\n });\r\n }\r\n\r\n $scope.removeEmail = function (emailInfo) {\r\n if(emailInfo.NotSaved) {\r\n var remainEmails = _.reject($scope.emails, \r\n function(e){ return e.clientUtilliId == emailInfo.clientUtilliId; });\r\n $scope.emails = remainEmails;\r\n return;\r\n }\r\n\r\n if ($scope.emails.length == 1) {\r\n ModalServiceExt.showError(\"You cannot remove last email.\")\r\n }\r\n else {\r\n ModalServiceExt.showYesNoMessage(\r\n $scope._t('Attention'),\r\n $scope._t(\"Are you sure you want to delete email \" + emailInfo.Email + \"?\"),\r\n function () { \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/RemoveEmail/',\r\n data: {\r\n authToken: $state.params.token,\r\n Email: emailInfo.Email\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function() {\r\n ModalServiceExt.showInfo($scope._t(\"Email successfully deleted.\"), function () {\r\n var remainEmails = _.reject($scope.emails, \r\n function(e){ return e.Email == emailInfo.Email; });\r\n $scope.emails = remainEmails;\r\n });\r\n });\r\n })\r\n .error(function(error) {\r\n console.error(error);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n );\r\n }\r\n }\r\n\r\n function loadCustomerInfo () { \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/SmartPayPreferences/GetCustomerPreferences/',\r\n method: \"GET\",\r\n params: { \r\n authToken: $state.params.token\r\n }\r\n }).success(function (response) {\r\n if (response == undefined || response.HasErrors == undefined || !response.Data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo($scope._t(\"Service is unavailable now. Try again later.\"));\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(response.Errors[0]);\r\n }\r\n else {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.accountNumber = response.Data.AccountNumber;\r\n $scope.zipCode = response.Data.ZipCode;\r\n $scope.fullOrCompanyName = response.Data.FullOrCompanyName;\r\n\r\n $scope.permissions = response.Data.Permission;\r\n\r\n var permissionsUi = [];\r\n\r\n for (var i = 0; i < $scope.permissions.length; i++) {\r\n var p = $scope.permissions[i];\r\n if(needShowGroupHeader(p, i))\r\n permissionsUi.push({\r\n isGroupHeader: true,\r\n groupName: p.GroupName\r\n });\r\n \r\n if(needShowGroupHeader(p, i) || needShowOffsetForGroupHeader(p, i))\r\n p.isGroupItem = true;\r\n permissionsUi.push(p);\r\n }\r\n\r\n $scope.permissions = permissionsUi;\r\n setEmailsAndPhoneNumbers(response);\r\n }\r\n \r\n }).error(function () {\r\n ModalServiceExt.showError($scope._t(\"Service is unavailable now. Try again later.\"));\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function needShowGroupHeader(permission, $index) {\r\n if(!permission.GroupName)\r\n return false;\r\n\r\n if($index == null && permission.GroupName != null)\r\n return true;\r\n\r\n if($index > 0 && permission.GroupName != $scope.permissions[$index - 1].GroupName)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n function needShowOffsetForGroupHeader(permission, $index) {\r\n if(!permission.GroupName)\r\n return false;\r\n\r\n if($index > 0 && permission.GroupName != null\r\n && permission.GroupName == $scope.permissions[$index - 1].GroupName) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n $scope.toggleEmailPreference = function (p) {\r\n if (!p.IsEmailEditable)\r\n return;\r\n\r\n p.EmailAllowed = !p.EmailAllowed;\r\n }\r\n\r\n $scope.toggleSmsPreference = function (p) {\r\n if(_.where($scope.mobilePhones, { IsVerified: true }).length == 0) {\r\n ModalServiceExt.showInfo($scope._t('You have to add at least one verified mobile phone number.'));\r\n return;\r\n }\r\n \r\n p.SmsAllowed = !p.SmsAllowed;\r\n }\r\n\r\n $scope.toggleVoicePreference = function (p) {\r\n p.VoiceAllowed = !p.VoiceAllowed;\r\n }\r\n\r\n $scope.setEmailPreferred = function (emailInfo) {\r\n if (!emailInfo.IsVerified)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/MakeEmailPreferred',\r\n data: {\r\n authToken: $state.params.token,\r\n email: emailInfo.Email\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $scope.emails.forEach(function(email) {\r\n email.Preferred = email.Email == emailInfo.Email;\r\n });\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.setPhoneNumberPreferred = function (phoneNumberInfo) {\r\n if (!phoneNumberInfo.IsVerified)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/SmartPayPreferences/MakePhoneNumberPreferred',\r\n data: {\r\n authToken: $state.params.token,\r\n phoneNumber: phoneNumberInfo.PhoneNumber\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $scope.mobilePhones.forEach(function(pni) {\r\n pni.Preferred = pni.PhoneNumber == phoneNumberInfo.PhoneNumber;\r\n });\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('SmartPayResultController', [\"$scope\", \"SmartPayStateService\", \"$window\", \"$state\", \"usSpinnerService\", \"$http\", \"ServiceProvidersService\", \"ModalServiceExt\", function ($scope, SmartPayStateService, $window, $state, usSpinnerService,\r\n $http, ServiceProvidersService, ModalServiceExt) {\r\n var model = SmartPayStateService.model.receipt;\r\n $scope.model = model;\r\n var apiUrl;\r\n // if we got here not by navigation from the payment page (entered URL into the address bar)\r\n if (!model.contractAccountNumber || model.paymentGuid != $state.params.paymentGuid){\r\n model.paymentGuid = $state.params.paymentGuid;\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n init();\r\n })\r\n .catch(function (e) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function getPaymentMethod(methodId){\r\n if (methodId == utilli.paymentMethods.Card) {\r\n return 'card';\r\n }\r\n if (methodId == utilli.paymentMethods.Check) {\r\n return 'eCheck';\r\n }\r\n return 'wallet';\r\n }\r\n\r\n function init(){\r\n $http({\r\n url: apiUrl + 'api/SmartPay/GetPaymentResult',\r\n method: \"GET\",\r\n params: { paymentGuid: $state.params.paymentGuid }\r\n })\r\n .apiThen(function (payResult) {\r\n model.amountString = utilli.formatCurrency(payResult.Amount);\r\n model.contractAccountNumber = payResult.ContractAccountNumber;\r\n model.remittanceId = payResult.RemittanceId;\r\n model.paymentTime = payResult.PaymentDateTimeString;\r\n model.paymentMethod = getPaymentMethod(payResult.MethodId);\r\n model.nameOnCard = payResult.NameOnCard;\r\n model.cardNumberStarred = \"**** **** **** \" + payResult.CardNumber;\r\n model.nameOnAccount = payResult.NameOnAccount;\r\n model.bankAccountNumberStarred = payResult.BankAccountNumber;\r\n model.warning = payResult.Warning;\r\n if (payResult.MethodId == utilli.paymentMethods.Apple ||\r\n payResult.MethodId == utilli.paymentMethods.Google){\r\n model.walletCardInfo = payResult.CardType + \" **** \" + payResult.CardNumber;\r\n }\r\n }, ModalServiceExt)\r\n .fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.getReceiptSentMessage = function(){\r\n return model.warning \r\n ? $scope._t('Payment Confirmation will be also sent to email address on file once the payment is posted on your' \r\n + ' account.')\r\n : $scope._t('Payment Confirmation was also sent to email address on file.');\r\n }\r\n\r\n $scope.print = function () {\r\n $window.print();\r\n }\r\n\r\n $scope.isPayByCard = function () {\r\n return model.paymentMethod === 'card';\r\n }\r\n\r\n $scope.isPayByCheck = function () {\r\n return model.paymentMethod === 'eCheck';\r\n }\r\n \r\n $scope.isPayByWallet = function () {\r\n return model.paymentMethod === 'wallet';\r\n }\r\n\r\n $scope.hideEbillWarning = function () {\r\n model.enrollmentInEbillDone = false;\r\n $scope.model.enrollmentInEbillDone = false;\r\n }\r\n}]);\r\n\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('DocuSignController', ['$scope', '$timeout', '$state', '$http', 'usSpinnerService', 'LeftMenuService',\r\n 'CommonDataService', '$q', 'ServiceProvidersService', 'ModalServiceExt', 'PaymentVerificationService', '$window',\r\n function ($scope, $timeout, $state, $http, usSpinnerService, LeftMenuService, CommonDataService, $q, \r\n ServiceProvidersService, ModalServiceExt, PaymentVerificationService, $window) {\r\n\r\n LeftMenuService.setCurrentTab('DocuSign');\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n var apiUrl = '';\r\n $scope.savedCards = [];\r\n\r\n $scope.isDocumentSigned = (($state.params.event == \"signing_complete\") || ($state.params.event == \"viewing_complete\"));\r\n\r\n $scope.docusingAmountToPay = 1 * $state.params.billAmount;\r\n\r\n $scope.bcaId = $state.params.bcaId;\r\n $scope.bcaManagerEmail = $state.params.bcaManagerEmail;\r\n\r\n $scope.email = $state.params.email ? $state.params.email : '';\r\n\r\n $scope.showDocuSignError = false;\r\n $scope.docuSignErrorText = '';\r\n\r\n $scope.orderNumber = $state.params.orderNumber ? $state.params.orderNumber : localStorage.getItem(\"last_order_number\");\r\n\r\n\r\n $scope.docuSignExplainOnlyCheckPaymentAvailable = false;\r\n\r\n $scope.showBankLogo = false;\r\n\r\n function setCurrentSavedCardAttributes() {\r\n $scope.nameOnCard = $scope.currentSavedCard.card.HolderName;\r\n $scope.cardExpiryMonth = $scope.currentSavedCard.card.ExpMonth;\r\n $scope.cardExpiryYear = \"20\" + $scope.currentSavedCard.card.ExpYear;\r\n }\r\n\r\n $scope.savedCardChanged = function () {\r\n setCurrentSavedCardAttributes();\r\n }\r\n\r\n $scope.useSavedCardChanged = function () {\r\n if ($scope.useSavedCard) {\r\n $scope.currentSavedCard = $scope.savedCards[0];\r\n for (var i = 0; i < $scope.savedCards.length; i++) {\r\n var cardInfo = $scope.savedCards[i];\r\n if (cardInfo.card.IsPrimary) {\r\n $scope.currentSavedCard = cardInfo;\r\n break;\r\n }\r\n }\r\n\r\n setCurrentSavedCardAttributes();\r\n } else {\r\n clearSaveCardData();\r\n }\r\n };\r\n\r\n function clearSaveCardData () {\r\n $scope.cardNumber = '';\r\n $scope.nameOnCard = '';\r\n $scope.cardExpiryMonth = '';\r\n $scope.cardExpiryYear = '';\r\n }\r\n\r\n function initPage() {\r\n $scope.imagesPath = utilli.isAdmin\r\n ? \"../Images\"\r\n : \"Images\";\r\n\r\n $scope.isWglcx = utilli.isWglcx();\r\n $scope.isAdmin = utilli.isAdmin;\r\n $scope.accountNumber = '';\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.zip = '';\r\n\r\n $scope.address = {};\r\n\r\n $scope.onlyNumbers = /^\\d+$/;\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n $scope.emailPattern = utilli.emailPattern;\r\n\r\n $scope.stepName = 'selectPaymentOption';\r\n $(\"#cardCodeCvv\").mask(\"999?9\", { placeholder: \"\" });\r\n\r\n $scope.isFeeEnabled = false;\r\n \r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n\r\n apiUrl = providerData.ApiUrl;\r\n \r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n $scope.largeConvenienceFeeBorder = commonData.LargeConvenienceFeeBorder;\r\n $scope.smallConvenienceFee = commonData.SmallConvenienceFee;\r\n $scope.largeConvenienceFee = commonData.LargeConvenienceFee;\r\n $scope.paymentInfoText = commonData.FeeInformation;\r\n $scope.commomData = commonData;\r\n\r\n if ($scope.docusingAmountToPay > commonData.MaxPaymentAmount) {\r\n $scope.stepName = 'payByBankAccount';\r\n $scope.isBackButtonDisabled = true;\r\n $scope.docuSignExplainOnlyCheckPaymentAvailable = true;\r\n }\r\n\r\n $scope.isBankAccountPaymentsEnabled = commonData.IsBankAccountPaymentsEnabled;\r\n $scope.isCreditCardCvvEnabled = commonData.IsCreditCardCvvEnabled == 'True';\r\n $scope.isCreditCardBillingAddressEnabled = commonData.IsCreditCardBillingAddressEnabled == 'True';\r\n $scope.quickPayValidationType = commonData.QuickPayValidationType;\r\n $scope.isFeeEnabled = commonData.IsFeeEnabled;\r\n\r\n if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n $scope.quickPayValidationCaption = _t('Customer Number');\r\n }\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n\r\n // cancel - the recipient decides to finish later\r\n // decline - the recipient declines signing\r\n // exception - a processing error occurs during the signing session\r\n // fax_pending - if the recipient choses to print, sign and fax back\r\n // id_check_failed - if authentication was added to the document, this is when the recipient fails\r\n // session_timeout - the signing session times out when recipient goes idle\r\n // signing_complete - the recipient completed signing\r\n // ttl_expired - the token was not used within the timeout period or the token was already accessed\r\n // viewing_complete - a recipient that does not need to sign completes the viewing ceremony\r\n\r\n if($state.params.event == \"cancel\" ||\r\n $state.params.event == \"exception\" || \r\n $state.params.event == \"fax_pending\" ||\r\n $state.params.event == \"id_check_failed\" ||\r\n $state.params.event == \"session_timeout\" ||\r\n $state.params.event == \"ttl_expired\" ) {\r\n\r\n $scope.docuSignExplainOnlyCheckPaymentAvailable = false;\r\n $scope.showDocuSignError = true;\r\n $scope.docuSignErrorText = '';\r\n\r\n if($state.params.event == \"cancel\") {\r\n $scope.docuSignErrorText = 'You have selected the option to sign document later. Thank you.';\r\n } else if ($state.params.event == \"exception\") {\r\n $scope.docuSignErrorText = 'Please try again later. Sorry for the Inconvenience. Error: Processing error occurs during the signing session.';\r\n } else if ($state.params.event == \"fax_pending\") {\r\n $scope.docuSignErrorText = 'Error: The recipient choses to print, sign and fax back.';\r\n } else if ($state.params.event == \"id_check_failed\") {\r\n $scope.docuSignErrorText = 'Please try again later. Sorry for the Inconvenience. Error: Authentication was added to the document, this is when the recipient fails.';\r\n } else if ($state.params.event == \"session_timeout\") {\r\n $scope.docuSignErrorText = 'Please try again later. Sorry for the Inconvenience. Error: The signing session times out when recipient goes idle.';\r\n } else if ($state.params.event == \"ttl_expired\") {\r\n $scope.docuSignErrorText = 'Please try again later. Sorry for the Inconvenience. Error: the token was not used within the timeout period or the token was already accessed.';\r\n } \r\n return;\r\n }\r\n\r\n // if user paid and refreshes the page - he must not be able to pay again WGLCX-338\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/DocuSign/IsOrderAlreadyPaid',\r\n params: { orderNumber: $scope.orderNumber }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n if(response.Data != 'Payment required')\r\n {\r\n $scope.docusingAmountToPay = 0 // No payments for this. Don't show controls. \r\n return;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n return;// codereview@Yuriy: why do you use these returns if they do nothing?\r\n });\r\n\r\n\r\n // if user declined to sign\r\n if(!$scope.isDocumentSigned) { \r\n if($state.params.event == \"decline\") {\r\n $scope.docuSignExplainOnlyCheckPaymentAvailable = false;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/DocuSign/DocusignSetDeclined',\r\n params: { orderNumber: $scope.orderNumber }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n $scope.showDocuSignError = true;\r\n $scope.docuSignErrorText = 'Document had been voided and Sales Order has been cancelled.';\r\n\r\n return;\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n });\r\n }\r\n }\r\n \r\n // if user signed but no need to pay\r\n if($scope.isDocumentSigned && $scope.docusingAmountToPay == 0) {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + '/api/DocuSign/DocusignUploadSignedPdf',\r\n params: {\r\n orderNumber: $scope.orderNumber,\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n return;\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n });\r\n }\r\n },\r\n function() {\r\n // todo: implement error handling\r\n //$moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n\r\n if ($state.params.contractAccountNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n var searchRequest = {\r\n accountNumber: $state.params.contractAccountNumber,\r\n isAdmin: $scope.isAdmin,\r\n billAccessToken: $state.params.token,\r\n isNonCommodity: true\r\n };\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n usSpinnerService.spin('spinner-1');\r\n var url = apiUrl + 'api/Payment/FindAccounts';\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: searchRequest\r\n }).success(function (data) {\r\n if (!data.length){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n return;\r\n }\r\n $scope.selectAccount(data[0]);\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n initPage();\r\n\r\n $scope.back = function () {\r\n $state.goRelativeTo('QuickPay', 'Step1');\r\n };\r\n\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n\r\n $scope.clear = function () {\r\n $scope.findResultVisible = false;\r\n $scope.accountNumber = '';\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.appartment = '';\r\n $scope.state = '';\r\n $scope.zip = '';\r\n $scope.informationMessage = '';\r\n $scope.isInformationMessageShown = false;\r\n $scope.errorFromServerReturned = false;\r\n $scope.isPaymentInfoAgreeBank = false;\r\n $scope.isPaymentInfoAgreeCard = false;\r\n $scope.showBankLogo = false;\r\n };\r\n\r\n $scope.selectAccount = function (account) {\r\n clearPaymentSettings();\r\n $scope.isAuthForEBill = account.AuthorizedForEBill;\r\n $scope.currentAccount = account;\r\n if ($scope.stepName != 'payByBankAccount')\r\n $scope.stepName = 'selectPaymentOption';\r\n\r\n // account.PhoneNumber may be empty if wglcx user is not authorized to view bills.\r\n // phone number is used for bills authorization and we don't disclose the phone number\r\n // to those users who have not passed authorization yet.\r\n $scope.phone = account.PhoneNumber ? account.PhoneNumber : $scope.phone;\r\n\r\n // Do not fill email here. email filled with billToEmail from params for docusign\r\n //$scope.email = account.Email ? account.Email : $scope.email;\r\n\r\n initAddress(account);\r\n\r\n usSpinnerService.spin('spinner-1'); // stop - inside of function getConvFeeInfo\r\n getConvFeeInfo(account);\r\n\r\n $scope.amountDue = $state.params.billAmount;\r\n updateConvinienceFee();\r\n\r\n if ($scope.amountDue < 0) {\r\n $scope.amountDue = 0;\r\n $scope.totalAmount = \"\";\r\n } else {\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n }\r\n\r\n $scope.formatTotalAmount();\r\n }\r\n \r\n function initAddress (account) { \r\n $scope.address.HouseNumber = account.MailHouseNumber,\r\n $scope.address.Street = account.MailStreet,\r\n $scope.address.City = account.MailCity,\r\n $scope.address.HouseNoSupplement = account.MailHouseNoSupplement,\r\n $scope.address.State = account.MailRegion,\r\n $scope.address.Zip = account.MailCityPostalCode\r\n }\r\n\r\n $scope.onAmountChange = function () {\r\n if ($scope.amountDue == '-') {\r\n return;\r\n }\r\n if ($scope.amountDue == '' || $scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n updateConvinienceFee();\r\n return;\r\n }\r\n\r\n if ($scope.amountDue.slice(-1) == '.') {\r\n return;\r\n }\r\n\r\n if (isNaN($scope.amountDue) || isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n updateConvinienceFee();\r\n return;\r\n }\r\n\r\n updateConvinienceFee();\r\n\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n }\r\n\r\n $scope.cancelPaymentOptionSelection = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n }\r\n\r\n $scope.selectPayByCard = function () {\r\n $scope.stepName = 'payByCard';\r\n updateConvinienceFee();\r\n }\r\n\r\n $scope.selectPayByBankAccount = function () {\r\n $scope.stepName = 'payByBankAccount';\r\n updateConvinienceFee();\r\n }\r\n\r\n $scope.formatTotalAmount = function () {\r\n if ($scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n\r\n if (isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n $scope.amountDue = formatDecimal(parseFloat($scope.amountDue));\r\n }\r\n\r\n $scope.cancelPayment = function () {\r\n $scope.bankAccountFormSubmitted = false;\r\n $scope.cardFormSubmitted = false;\r\n $scope.clear();\r\n clearPaymentSettings();\r\n $scope.stepName = 'selectPaymentOption';\r\n }\r\n\r\n $scope.payNow = function () {\r\n $scope.stepName = 'processingPayment';\r\n usSpinnerService.spin('spinner-1');\r\n $scope.$apply();\r\n $timeout(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.stepName = 'paymentResult';\r\n }, 3000);\r\n }\r\n\r\n function checkPaymentAmountWglcx() {\r\n //not on docusign, please\r\n return true;\r\n }\r\n \r\n var tickTimer = function () {\r\n if ($scope.timeout != 0) {\r\n $scope.timeout--;\r\n $timeout(tickTimer, 1000);\r\n } else {\r\n $scope.canRequestVerificationCode = true;\r\n $scope.canShowTimer = false;\r\n return;\r\n }\r\n\r\n $scope.canShowTimer = true;\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n if ($scope.timeoutStr.length < 2) {\r\n $scope.timeoutStr = '0' + $scope.timeoutStr;\r\n }\r\n }\r\n\r\n function startSmsConfirmationTimer(remainedTime) {\r\n if(remainedTime)\r\n $scope.timeout = remainedTime;\r\n else\r\n $scope.timeout = 31;\r\n\r\n tickTimer();\r\n }\r\n\r\n $scope.canRequestVerificationCode = true;\r\n\r\n $scope.removeCard = function () { \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + '/api/Payment/RemoveQuickPaySavedCard',\r\n data: {\r\n CardId: $scope.currentSavedCard.card.Id,\r\n Token: $state.params.token\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function () {\r\n ModalServiceExt.showInfo($scope._t(\"Card successfully removed.\"));\r\n $scope.savedCards = _.reject($scope.savedCards, function(cardInfo) { \r\n return cardInfo.card.Id == $scope.currentSavedCard.card.Id \r\n });\r\n $scope.savedCardsVisible = $scope.savedCards.length > 0;\r\n if($scope.savedCards.length > 0) {\r\n $scope.currentSavedCard = $scope.savedCards[0];\r\n $scope.savedCardsVisible = true; \r\n }\r\n else {\r\n $scope.savedCardsVisible = false;\r\n $scope.currentSavedCard = null;\r\n $scope.useSavedCard = false;\r\n clearSaveCardData();\r\n }\r\n });\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.sendSmsCode = function () {\r\n if (!$scope.canRequestVerificationCode)\r\n return;\r\n $scope.smsCodeSubmitted = true;\r\n $scope.sendSmsCodeError = null;\r\n $scope.canShowTimer = false;\r\n if(isFormNotValid()) {\r\n $timeout(function ( ){\r\n utilli.scrollToFirstError();\r\n },0);\r\n return;\r\n }\r\n $scope.smsCodeSubmitted = false;\r\n $scope.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + '/api/Payment/SendPaymentConfirmationSms',\r\n data: {\r\n PhoneNumber: $state.params.id,\r\n CardNumber: 1,\r\n PaymentAmount: 11, \r\n Token: $state.params.token\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n $scope.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.RemainedTime) {\r\n startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n $scope.sendSmsCodeError = response.Errors[0];\r\n $scope.canRequestVerificationCode = true;\r\n }\r\n else {\r\n startSmsConfirmationTimer();\r\n\r\n ModalServiceExt.showInfo($scope._t(\"SMS code successfully sent.\"));\r\n $scope.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n $scope.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n $scope.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n $scope.isCreditCardTypeNotValid = function () {\r\n var result = $scope.payCardAccount_form.cardNumber.$ccType == 'JCB'\r\n || ($scope.isWglcx && $scope.payCardAccount_form.cardNumber.$ccType == 'American Express')\r\n || $scope.payCardAccount_form.cardNumber.$ccType == 'Diners Club';\r\n return result;\r\n }\r\n\r\n function isFormNotValid () { \r\n if($scope.useSavedCard) {\r\n var result = !$scope.payCardAccount_form.email.$valid\r\n || !$scope.payCardAccount_form.phone.$valid\r\n || !$scope.payCardAccount_form.amountDue.$valid\r\n || $scope.isCreditCardTypeNotValid()\r\n || $scope.isPaymentInfoAgreeCard == false && $scope.isFeeEnabled\r\n || $scope.smsCodeSent && !$scope.smsCodeSubmitted && !$scope.payCardAccount_form.confirmationCode.$valid;\r\n return result;\r\n }\r\n var result = !$scope.payCardAccount_form.$valid\r\n || $scope.isCreditCardTypeNotValid()\r\n || $scope.isPaymentInfoAgreeCard == false && $scope.isFeeEnabled\r\n || utilli.isAdmin && $scope.proceededWithoutSearch && $scope.selectedCompany.companyCode == \"0\";\r\n return result;\r\n }\r\n\r\n $scope.payNowCard = function () {\r\n $scope.cardFormSubmitted = true;\r\n\r\n if (isFormNotValid())\r\n return;\r\n\r\n if(!checkPaymentAmountWglcx())\r\n return;\r\n\r\n $scope.cardFormSubmitted = false;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n PaymentVerificationService.verifyPaymentInfoNew(commonData, $scope.amountDue, \r\n function(){\r\n if ($scope.useSavedCard)\r\n payBySavedCard();\r\n else\r\n payByCreditCardInternal();\r\n });\r\n },function (e) { \r\n console.error(e);\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.payNowBankAccount = function () {\r\n if (!$scope.payBankAccount_form.$valid\r\n || $scope.bankCheckingAccountNumber != $scope.bankCheckingAccountNumber2\r\n || $scope.isPaymentInfoAgreeBank == false && $scope.isFeeEnabled\r\n || $scope.payBankAccount_form.bankRoutingNumber == $scope.payBankAccount_form.bankCheckingAccountNumber) {\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n //Please, please, please no max amount validation for eChecks.\r\n\r\n validateRoutingNumberAndPayByCheck();\r\n },function (e) { \r\n console.error(e);\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function validateRoutingNumberAndPayByCheck () {\r\n usSpinnerService.spin('spinner-1');\r\n validateRoutingNumber().then(function (isRoutingNumberValid) {\r\n $scope.routNumError = !isRoutingNumberValid;\r\n if ($scope.routNumError){\r\n ModalServiceExt.showMessage($scope._t('Error'), \r\n $scope._t('Invalid Routing Number.'));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n bankAccountPay();\r\n });\r\n }\r\n\r\n $scope.paymentOk = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n }\r\n\r\n $scope.printConfirmation = function () {\r\n window.print();\r\n }\r\n\r\n $scope.viewUnderstandYourBill = function () {\r\n var viewurl = apiUrl + 'api/Bills/GetUnderstandMyBill';\r\n window.open(viewurl, '_blank');\r\n }\r\n\r\n $scope.proceedToRegistration = function () {\r\n $state.go('TopMenuLayout.SignUp.Step1', { \r\n accountnumber: $scope.currentAccount.AccountNumber, \r\n customerfullname: $scope.currentAccount.CustomerFullName, \r\n zip: $scope.currentAccount.Zip.substring(0, 5) \r\n });\r\n }\r\n\r\n function clearPaymentSettings() {\r\n $scope.cardNumber = '';\r\n $scope.nameOnCard = '';\r\n $scope.cardExpiryMonth = '';\r\n $scope.cardExpiryYear = '';\r\n\r\n $scope.billToAddress = '';\r\n $scope.billToCity = '';\r\n $scope.billToState = '';\r\n $scope.billToZip = '';\r\n $scope.cardCode = '';\r\n\r\n $scope.checkNameOnAccount = '';\r\n $scope.bankRoutingNumber = '';\r\n $scope.bankCheckingAccountNumber = '';\r\n $scope.bankCheckingAccountNumber2 = '';\r\n $scope.driversLicenseNumber = '';\r\n $scope.checkPaymentState = '';\r\n \r\n $scope.phone = $state.params.phoneNumber;\r\n $scope.email = $state.params.email ? $state.params.email : '';\r\n }\r\n\r\n function getConvFeeInfo (account) {\r\n if (!$scope.isFeeEnabled){\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n var searchObject = {\r\n accountNumber: account.AccountNumber,\r\n };\r\n $http({\r\n url: apiUrl + 'api/Payment/GetConvFeeInfo/',\r\n method: \"GET\",\r\n params: searchObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.convFeeInfo = jsondata;\r\n updateConvinienceFee();\r\n if ($scope.convFeeInfo.Disconnected == $scope._t('Account Disconnected')) {\r\n ModalServiceExt.showMessage($scope._t('Account is disconnected'), \r\n $scope._t('Your account is currently disconnected. After making the payment please contact Customer Service at')\r\n + ' ' \r\n + $scope.convFeeInfo.SupportPhoneNumber);\r\n }\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (data) {\r\n ModalServiceExt.showMessage($scope._t('Error'), $scope._t('Server error. Please, try again later.'));\r\n $scope.stepName = 'find';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function updateConvinienceFee() {\r\n if ($scope.amountDue == null || isNaN($scope.amountDue) || $scope.amountDue == '') {\r\n $scope.convinienceFee = '';\r\n return;\r\n }\r\n\r\n var info = $scope.convFeeInfo;\r\n\r\n if ($scope.isFeeEnabled) {\r\n if ($scope.stepName == 'payByCard') {\r\n if (info.FeeType == \"percent\") {\r\n $scope.convinienceFee = formatDecimal($scope.amountDue / 100 * info.FeeAmount);\r\n } else if (info.FeeType == \"flat\") {\r\n $scope.convinienceFee = formatDecimal(info.FeeAmount);\r\n }\r\n } else if ($scope.stepName == 'payByBankAccount') {\r\n if (info.FeeTypeAch == \"percent\") {\r\n $scope.convinienceFee = formatDecimal($scope.amountDue / 100 * info.FeeAmountAch);\r\n } else if (info.FeeTypeAch == \"flat\") {\r\n $scope.convinienceFee = formatDecimal(info.FeeAmountAch);\r\n }\r\n }\r\n }\r\n else {\r\n $scope.convinienceFee = 0;\r\n }\r\n\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n\r\n }\r\n\r\n function formatDecimal (decimal) {\r\n\r\n var formated = Math.round(parseFloat(decimal) * 100) / 100;\r\n\r\n formated = formated.toString();\r\n if (formated.indexOf('.') == -1) formated += '.';\r\n while (formated.length < formated.indexOf('.') + 3) formated += '0';\r\n\r\n return formated;\r\n }\r\n\r\n function validateRoutingNumber() {\r\n var deferred = $q.defer();\r\n var requestResult = false;\r\n $http({\r\n url: apiUrl + 'api/Payment/RoutingNumberValidate',\r\n method: \"GET\",\r\n params: { routingNumber: $scope.bankRoutingNumber }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n alert(response.Errors[0]);\r\n deferred.reject(requestResult);\r\n }\r\n else {\r\n requestResult = response.Data;\r\n deferred.resolve(response.Data);\r\n }\r\n $scope.stepName = 'payByBankAccount';\r\n }).error(function () {\r\n alert(\"Server error. Try again later.\");\r\n deferred.resolve(requestResult);\r\n $scope.stepName = 'payByBankAccount';\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function updateBankIcon() {\r\n $scope.showBankLogo = false;\r\n if($scope.bankRoutingNumber == undefined || $scope.bankRoutingNumber.length != 9)\r\n {\r\n return;\r\n }\r\n var requestResult = false;\r\n $http({\r\n url: apiUrl + 'api/Payment/GetBankLogo',\r\n method: \"GET\",\r\n params: { routingNumber: $scope.bankRoutingNumber }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n $scope.showBankLogo = false;\r\n }\r\n else {\r\n requestResult = response.Data;\r\n if(response.Data.Logo != ''){\r\n $('#bank-logo-icon').css('background-image', response.Data.Logo);\r\n $scope.showBankLogo = true;\r\n $scope.plaidBankName = response.Data.Name;\r\n $scope.plaidBankUrl = response.Data.Url;\r\n } else {\r\n $scope.showBankLogo = false;\r\n }\r\n }\r\n }).error(function () {\r\n console.log(\"UpdateBankIcon error. GetBankLogo.\");\r\n });\r\n }\r\n\r\n $scope.updateBankIconLogo = function() {\r\n updateBankIcon();\r\n }\r\n\r\n function bankAccountPay() {\r\n $scope.bankAccountFormSubmitted = false;\r\n\r\n var companyCode = $scope.currentAccount.CompanyCode;\r\n if ($scope.proceededWithoutSearch) {\r\n companyCode = $scope.selectedCompany.companyCode;\r\n }\r\n\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n nameOnAccount: $scope.checkNameOnAccount,\r\n bankRoutingNumber: $scope.bankRoutingNumber,\r\n checkingAccountNumber: $scope.bankCheckingAccountNumber,\r\n companyCode: companyCode,\r\n\r\n bcaId: $scope.bcaId,\r\n OrderNumber: $scope.orderNumber\r\n };\r\n\r\n if (utilli.isAdmin) {\r\n paymentObject.PaymentPage = 3;\r\n }\r\n else {\r\n paymentObject.PaymentPage = 1;\r\n }\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/DocuSignQuickPayByBankAccount',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function (data) {\r\n $scope.paymentResult = data.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n \r\n function payByCreditCardInternal() {\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n cardNumber: $scope.cardNumber,\r\n nameOnCard: $scope.nameOnCard,\r\n expirationDateYear: $scope.cardExpiryYear,\r\n expirationDateMonth: $scope.cardExpiryMonth,\r\n companyCode: $scope.proceededWithoutSearch \r\n ? $scope.selectedCompany.companyCode\r\n : $scope.currentAccount.CompanyCode,\r\n billToAddress: $scope.billToAddress,\r\n billToCity: $scope.billToCity,\r\n billToState: $scope.billToState,\r\n billToZip: $scope.billToZip,\r\n cardCode: $scope.cardCode,\r\n invoiceNumber: '0',\r\n PaymentPage: utilli.isAdmin ? 3 : 1,\r\n NeedToSave: $scope.saveThisCard,\r\n EBillToken: $state.params.token,\r\n bcaId: $scope.bcaId,\r\n OrderNumber: $scope.orderNumber\r\n };\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/DocusignPayUsingCard',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function (data) {\r\n var jsondata = data;\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n function payBySavedCard() {\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n cardId: $scope.currentSavedCard.card.Id,\r\n companyCode: $scope.proceededWithoutSearch \r\n ? $scope.selectedCompany.companyCode\r\n : $scope.currentAccount.CompanyCode,\r\n billToAddress: $scope.billToAddress,\r\n billToCity: $scope.billToCity,\r\n billToState: $scope.billToState,\r\n billToZip: $scope.billToZip,\r\n cardCode: $scope.cardCode,\r\n invoiceNumber: '0',\r\n PaymentPage: utilli.isAdmin ? 3 : 1,\r\n EBillToken: $state.params.token,\r\n ConfirmationCode: $scope.confirmationCode\r\n };\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/DocusignPayUsingCard',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (jsondata) {\r\n usSpinnerService.stop('spinner-1');\r\n if(jsondata.IsSmsCodeNotValid) {\r\n $scope.sendSmsCodeError = jsondata.Message;\r\n $scope.canRequestVerificationCode = true;\r\n return;\r\n }\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n }\r\n }).error(function (data) {\r\n var jsondata = data;\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('DocuSignStartController', ['$scope', '$state', '$http', 'usSpinnerService', \r\n 'CommonDataService', 'ServiceProvidersService', 'ModalServiceExt', '$window',\r\n function ($scope, $state, $http, usSpinnerService, CommonDataService, \r\n ServiceProvidersService, ModalServiceExt, $window) {\r\n \r\n \r\n var apiUrl = '';\r\n\r\n function initPage() {\r\n $scope.imagesPath = utilli.isAdmin\r\n ? \"../Images\"\r\n : \"Images\";\r\n\r\n $scope.isWglcx = utilli.isWglcx();\r\n $scope.isAdmin = utilli.isAdmin;\r\n $scope.accountNumber = '';\r\n\r\n $scope.showInfo = false;\r\n $scope.info = '';\r\n\r\n $scope.onlyNumbers = /^\\d+$/;\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n $scope.emailPattern = utilli.emailPattern;\r\n\r\n $scope.stepName = 'find';\r\n $(\"#cardCodeCvv\").mask(\"999?9\", { placeholder: \"\" });\r\n $scope.quickPayValidationType = 'InvoiceNumber'; // Can be: InvoiceNumber, BusinessPartnerNumber\r\n $scope.quickPayValidationCaption = $scope._t('Invoice Number');\r\n\r\n $scope.isFeeEnabled = false;\r\n \r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n\r\n apiUrl = providerData.ApiUrl;\r\n \r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n $scope.largeConvenienceFeeBorder = commonData.LargeConvenienceFeeBorder;\r\n $scope.smallConvenienceFee = commonData.SmallConvenienceFee;\r\n $scope.largeConvenienceFee = commonData.LargeConvenienceFee;\r\n $scope.paymentInfoText = commonData.FeeInformation;\r\n $scope.commomData = commonData;\r\n\r\n $scope.isBankAccountPaymentsEnabled = commonData.IsBankAccountPaymentsEnabled;\r\n $scope.isCreditCardCvvEnabled = commonData.IsCreditCardCvvEnabled == 'True';\r\n $scope.isCreditCardBillingAddressEnabled = commonData.IsCreditCardBillingAddressEnabled == 'True';\r\n $scope.quickPayValidationType = commonData.QuickPayValidationType;\r\n $scope.isFeeEnabled = commonData.IsFeeEnabled;\r\n\r\n if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n $scope.quickPayValidationCaption = _t('Customer Number');\r\n }\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n },\r\n function() {\r\n // codereview@Yuriy: implement error handling\r\n //$moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n\r\n if ($state.params.contractAccountNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n var searchRequest = {// codereview@Yuriy: variable seems to be not used\r\n accountNumber: $state.params.contractAccountNumber,\r\n isAdmin: $scope.isAdmin,\r\n billAccessToken: $state.params.token\r\n };\r\n\r\n localStorage.setItem(\"last_order_number\", $state.params.orderNumber);\r\n\r\n var docusignObject = {\r\n contractAccountNumber: $state.params.contractAccountNumber,\r\n billAmount: $state.params.billAmount,\r\n email: $state.params.email,\r\n phoneNumber: $state.params.phoneNumber,\r\n bcaId: $state.params.bcaId,\r\n bcaManagerEmail: $state.params.bcaManagerEmail,\r\n orderNumber: $state.params.orderNumber,\r\n pageType: 'DocuSign'\r\n };\r\n // codereview@Yuriy: the next line results in that there 2 ajax requests to get common data\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n var url = apiUrl + 'api/DocuSign/DocuSignStart';\r\n $http({\r\n url: url,\r\n method: \"POST\",\r\n data: docusignObject\r\n }).success(function (data) {\r\n // codereview@Yuriy: don't leave commented code\r\n //$window.location.href = data.Data;\r\n \r\n if(data.HasErrors) {\r\n usSpinnerService.stop('spinner-1');\r\n // ModalServiceExt.showInfo(data.Errors[0]);\r\n $scope.showInfo = true;\r\n $scope.info = data.Errors[0];\r\n } else {\r\n $window.location.href = data.Data.RedirectUrl;\r\n }\r\n\r\n }).error(function (e) {\r\n usSpinnerService.stop('spinner-1');\r\n var message = e.data.ExceptionMessage ? e.data.ExceptionMessage : e.data.Message;\r\n if (message)\r\n ModalServiceExt.showError(\"Error: \" + message);\r\n else \r\n ModalServiceExt.showServerError();\r\n });\r\n });\r\n });\r\n }\r\n }\r\n // codereview@Yuriy: no need for initPage function\r\n initPage();\r\n\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('AdobeSignController', ['$scope', '$timeout', '$state', '$http', 'usSpinnerService', 'LeftMenuService',\r\n 'CommonDataService', '$q', 'ServiceProvidersService', 'ModalServiceExt', 'PaymentVerificationService', '$window',\r\n function ($scope, $timeout, $state, $http, usSpinnerService, LeftMenuService, CommonDataService, $q, \r\n ServiceProvidersService, ModalServiceExt, PaymentVerificationService, $window) {\r\n\r\n LeftMenuService.setCurrentTab('AdobeSign');\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n var apiUrl = '';\r\n $scope.savedCards = [];\r\n\r\n $scope.isDocumentSigned = true;\r\n\r\n $scope.docusingAmountToPay = 1 * $state.params.billAmount;\r\n\r\n $scope.bcaId = $state.params.bcaId;\r\n $scope.bcaManagerEmail = $state.params.bcaManagerEmail;\r\n\r\n $scope.email = $state.params.email ? $state.params.email : '';\r\n\r\n $scope.showDocuSignError = false;\r\n $scope.docuSignErrorText = '';\r\n\r\n $scope.orderNumber = $state.params.orderNumber ? $state.params.orderNumber : localStorage.getItem(\"last_order_number\");\r\n\r\n\r\n $scope.docuSignExplainOnlyCheckPaymentAvailable = false;\r\n\r\n $scope.showBankLogo = false;\r\n\r\n function setCurrentSavedCardAttributes() {\r\n $scope.nameOnCard = $scope.currentSavedCard.card.HolderName;\r\n $scope.cardExpiryMonth = $scope.currentSavedCard.card.ExpMonth;\r\n $scope.cardExpiryYear = \"20\" + $scope.currentSavedCard.card.ExpYear;\r\n }\r\n\r\n $scope.savedCardChanged = function () {\r\n setCurrentSavedCardAttributes();\r\n }\r\n\r\n $scope.useSavedCardChanged = function () {\r\n if ($scope.useSavedCard) {\r\n $scope.currentSavedCard = $scope.savedCards[0];\r\n for (var i = 0; i < $scope.savedCards.length; i++) {\r\n var cardInfo = $scope.savedCards[i];\r\n if (cardInfo.card.IsPrimary) {\r\n $scope.currentSavedCard = cardInfo;\r\n break;\r\n }\r\n }\r\n\r\n setCurrentSavedCardAttributes();\r\n } else {\r\n clearSaveCardData();\r\n }\r\n };\r\n\r\n function clearSaveCardData () {\r\n $scope.cardNumber = '';\r\n $scope.nameOnCard = '';\r\n $scope.cardExpiryMonth = '';\r\n $scope.cardExpiryYear = '';\r\n }\r\n\r\n function initPage() {\r\n $scope.imagesPath = utilli.isAdmin\r\n ? \"../Images\"\r\n : \"Images\";\r\n\r\n $scope.isWglcx = utilli.isWglcx();\r\n $scope.isAdmin = utilli.isAdmin;\r\n $scope.accountNumber = '';\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.zip = '';\r\n\r\n $scope.address = {};\r\n\r\n $scope.onlyNumbers = /^\\d+$/;\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n $scope.emailPattern = utilli.emailPattern;\r\n\r\n $scope.stepName = 'selectPaymentOption';\r\n $(\"#cardCodeCvv\").mask(\"999?9\", { placeholder: \"\" });\r\n\r\n $scope.isFeeEnabled = false;\r\n \r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n\r\n apiUrl = providerData.ApiUrl;\r\n \r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n $scope.largeConvenienceFeeBorder = commonData.LargeConvenienceFeeBorder;\r\n $scope.smallConvenienceFee = commonData.SmallConvenienceFee;\r\n $scope.largeConvenienceFee = commonData.LargeConvenienceFee;\r\n $scope.paymentInfoText = commonData.FeeInformation;\r\n $scope.commomData = commonData;\r\n\r\n if ($scope.docusingAmountToPay > commonData.MaxPaymentAmount) {\r\n $scope.stepName = 'payByBankAccount';\r\n $scope.isBackButtonDisabled = true;\r\n $scope.docuSignExplainOnlyCheckPaymentAvailable = true;\r\n }\r\n\r\n $scope.isBankAccountPaymentsEnabled = commonData.IsBankAccountPaymentsEnabled;\r\n $scope.isCreditCardCvvEnabled = commonData.IsCreditCardCvvEnabled == 'True';\r\n $scope.isCreditCardBillingAddressEnabled = commonData.IsCreditCardBillingAddressEnabled == 'True';\r\n $scope.quickPayValidationType = commonData.QuickPayValidationType;\r\n $scope.isFeeEnabled = commonData.IsFeeEnabled;\r\n\r\n if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n $scope.quickPayValidationCaption = _t('Customer Number');\r\n }\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n // if user paid and refreshes the page - he must not be able to pay again WGLCX-338\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/DocuSign/IsOrderAlreadyPaid',\r\n params: { orderNumber: $scope.orderNumber }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n if(response.Data != 'Payment required')\r\n {\r\n $scope.docusingAmountToPay = 0 // No payments for this. Don't show controls. \r\n return;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n return;// codereview@Yuriy: why do you use these returns if they do nothing?\r\n });\r\n\r\n\r\n // if user signed but no need to pay\r\n if($scope.isDocumentSigned && $scope.docusingAmountToPay == 0) {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + '/api/DocuSign/AdobesignUploadSignedPdf',\r\n params: {\r\n orderNumber: $scope.orderNumber,\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n return;\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n });\r\n }\r\n },\r\n function() {\r\n // todo: implement error handling\r\n //$moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n\r\n if ($state.params.contractAccountNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n var searchRequest = {\r\n accountNumber: $state.params.contractAccountNumber,\r\n isAdmin: $scope.isAdmin,\r\n billAccessToken: $state.params.token,\r\n isNonCommodity: true\r\n };\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n usSpinnerService.spin('spinner-1');\r\n var url = apiUrl + 'api/Payment/FindAccounts';\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: searchRequest\r\n }).success(function (data) {\r\n if (!data.length){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n return;\r\n }\r\n $scope.selectAccount(data[0]);\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errorFromServerReturned = true;\r\n $scope.serverErrorInformation = $scope._t('Server error. Try again later.');\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n initPage();\r\n\r\n $scope.back = function () {\r\n $state.goRelativeTo('QuickPay', 'Step1');\r\n };\r\n\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n\r\n $scope.clear = function () {\r\n $scope.findResultVisible = false;\r\n $scope.accountNumber = '';\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.appartment = '';\r\n $scope.state = '';\r\n $scope.zip = '';\r\n $scope.informationMessage = '';\r\n $scope.isInformationMessageShown = false;\r\n $scope.errorFromServerReturned = false;\r\n $scope.isPaymentInfoAgreeBank = false;\r\n $scope.isPaymentInfoAgreeCard = false;\r\n $scope.showBankLogo = false;\r\n };\r\n\r\n $scope.selectAccount = function (account) {\r\n clearPaymentSettings();\r\n $scope.isAuthForEBill = account.AuthorizedForEBill;\r\n $scope.currentAccount = account;\r\n if ($scope.stepName != 'payByBankAccount')\r\n $scope.stepName = 'selectPaymentOption';\r\n\r\n // account.PhoneNumber may be empty if wglcx user is not authorized to view bills.\r\n // phone number is used for bills authorization and we don't disclose the phone number\r\n // to those users who have not passed authorization yet.\r\n $scope.phone = account.PhoneNumber ? account.PhoneNumber : $scope.phone;\r\n\r\n // Do not fill email here. email filled with billToEmail from params for docusign\r\n //$scope.email = account.Email ? account.Email : $scope.email;\r\n\r\n initAddress(account);\r\n\r\n usSpinnerService.spin('spinner-1'); // stop - inside of function getConvFeeInfo\r\n getConvFeeInfo(account);\r\n\r\n $scope.amountDue = $state.params.billAmount;\r\n updateConvinienceFee();\r\n\r\n if ($scope.amountDue < 0) {\r\n $scope.amountDue = 0;\r\n $scope.totalAmount = \"\";\r\n } else {\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n }\r\n\r\n $scope.formatTotalAmount();\r\n }\r\n \r\n function initAddress (account) { \r\n $scope.address.HouseNumber = account.MailHouseNumber,\r\n $scope.address.Street = account.MailStreet,\r\n $scope.address.City = account.MailCity,\r\n $scope.address.HouseNoSupplement = account.MailHouseNoSupplement,\r\n $scope.address.State = account.MailRegion,\r\n $scope.address.Zip = account.MailCityPostalCode\r\n }\r\n\r\n $scope.onAmountChange = function () {\r\n if ($scope.amountDue == '-') {\r\n return;\r\n }\r\n if ($scope.amountDue == '' || $scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n updateConvinienceFee();\r\n return;\r\n }\r\n\r\n if ($scope.amountDue.slice(-1) == '.') {\r\n return;\r\n }\r\n\r\n if (isNaN($scope.amountDue) || isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n updateConvinienceFee();\r\n return;\r\n }\r\n\r\n updateConvinienceFee();\r\n\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n }\r\n\r\n $scope.cancelPaymentOptionSelection = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n }\r\n\r\n $scope.selectPayByCard = function () {\r\n $scope.stepName = 'payByCard';\r\n updateConvinienceFee();\r\n }\r\n\r\n $scope.selectPayByBankAccount = function () {\r\n $scope.stepName = 'payByBankAccount';\r\n updateConvinienceFee();\r\n }\r\n\r\n $scope.formatTotalAmount = function () {\r\n if ($scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n\r\n if (isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n $scope.amountDue = formatDecimal(parseFloat($scope.amountDue));\r\n }\r\n\r\n $scope.cancelPayment = function () {\r\n $scope.bankAccountFormSubmitted = false;\r\n $scope.cardFormSubmitted = false;\r\n $scope.clear();\r\n clearPaymentSettings();\r\n $scope.stepName = 'selectPaymentOption';\r\n }\r\n\r\n $scope.payNow = function () {\r\n $scope.stepName = 'processingPayment';\r\n usSpinnerService.spin('spinner-1');\r\n $scope.$apply();\r\n $timeout(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.stepName = 'paymentResult';\r\n }, 3000);\r\n }\r\n\r\n function checkPaymentAmountWglcx() {\r\n //not on docusign, please\r\n return true;\r\n }\r\n \r\n var tickTimer = function () {\r\n if ($scope.timeout != 0) {\r\n $scope.timeout--;\r\n $timeout(tickTimer, 1000);\r\n } else {\r\n $scope.canRequestVerificationCode = true;\r\n $scope.canShowTimer = false;\r\n return;\r\n }\r\n\r\n $scope.canShowTimer = true;\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n if ($scope.timeoutStr.length < 2) {\r\n $scope.timeoutStr = '0' + $scope.timeoutStr;\r\n }\r\n }\r\n\r\n function startSmsConfirmationTimer(remainedTime) {\r\n if(remainedTime)\r\n $scope.timeout = remainedTime;\r\n else\r\n $scope.timeout = 31;\r\n\r\n tickTimer();\r\n }\r\n\r\n $scope.canRequestVerificationCode = true;\r\n\r\n $scope.removeCard = function () { \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + '/api/Payment/RemoveQuickPaySavedCard',\r\n data: {\r\n CardId: $scope.currentSavedCard.card.Id,\r\n Token: $state.params.token\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function () {\r\n ModalServiceExt.showInfo($scope._t(\"Card successfully removed.\"));\r\n $scope.savedCards = _.reject($scope.savedCards, function(cardInfo) { \r\n return cardInfo.card.Id == $scope.currentSavedCard.card.Id \r\n });\r\n $scope.savedCardsVisible = $scope.savedCards.length > 0;\r\n if($scope.savedCards.length > 0) {\r\n $scope.currentSavedCard = $scope.savedCards[0];\r\n $scope.savedCardsVisible = true; \r\n }\r\n else {\r\n $scope.savedCardsVisible = false;\r\n $scope.currentSavedCard = null;\r\n $scope.useSavedCard = false;\r\n clearSaveCardData();\r\n }\r\n });\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.sendSmsCode = function () {\r\n if (!$scope.canRequestVerificationCode)\r\n return;\r\n $scope.smsCodeSubmitted = true;\r\n $scope.sendSmsCodeError = null;\r\n $scope.canShowTimer = false;\r\n if(isFormNotValid()) {\r\n $timeout(function ( ){\r\n utilli.scrollToFirstError();\r\n },0);\r\n return;\r\n }\r\n $scope.smsCodeSubmitted = false;\r\n $scope.canRequestVerificationCode = false;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + '/api/Payment/SendPaymentConfirmationSms',\r\n data: {\r\n PhoneNumber: $state.params.id,\r\n CardNumber: 1,\r\n PaymentAmount: 11, \r\n Token: $state.params.token\r\n }\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n $scope.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n if(response.Data && response.Data.RemainedTime) {\r\n startSmsConfirmationTimer(response.Data.RemainedTime);\r\n return;\r\n }\r\n $scope.sendSmsCodeError = response.Errors[0];\r\n $scope.canRequestVerificationCode = true;\r\n }\r\n else {\r\n startSmsConfirmationTimer();\r\n\r\n ModalServiceExt.showInfo($scope._t(\"SMS code successfully sent.\"));\r\n $scope.smsCodeSent = true;\r\n }\r\n })\r\n .error(function(error) {\r\n console.log(error);\r\n usSpinnerService.stop('spinner-1');\r\n $scope.sendSmsCodeError = utilli.errors.serverErrorMessage;\r\n $scope.canRequestVerificationCode = true;\r\n });\r\n }\r\n\r\n $scope.isCreditCardTypeNotValid = function () {\r\n var result = $scope.payCardAccount_form.cardNumber.$ccType == 'JCB'\r\n || ($scope.isWglcx && $scope.payCardAccount_form.cardNumber.$ccType == 'American Express')\r\n || $scope.payCardAccount_form.cardNumber.$ccType == 'Diners Club';\r\n return result;\r\n }\r\n\r\n function isFormNotValid () { \r\n if($scope.useSavedCard) {\r\n var result = !$scope.payCardAccount_form.email.$valid\r\n || !$scope.payCardAccount_form.phone.$valid\r\n || !$scope.payCardAccount_form.amountDue.$valid\r\n || $scope.isCreditCardTypeNotValid()\r\n || $scope.isPaymentInfoAgreeCard == false && $scope.isFeeEnabled\r\n || $scope.smsCodeSent && !$scope.smsCodeSubmitted && !$scope.payCardAccount_form.confirmationCode.$valid;\r\n return result;\r\n }\r\n var result = !$scope.payCardAccount_form.$valid\r\n || $scope.isCreditCardTypeNotValid()\r\n || $scope.isPaymentInfoAgreeCard == false && $scope.isFeeEnabled\r\n || utilli.isAdmin && $scope.proceededWithoutSearch && $scope.selectedCompany.companyCode == \"0\";\r\n return result;\r\n }\r\n\r\n $scope.payNowCard = function () {\r\n $scope.cardFormSubmitted = true;\r\n\r\n if (isFormNotValid())\r\n return;\r\n\r\n if(!checkPaymentAmountWglcx())\r\n return;\r\n\r\n $scope.cardFormSubmitted = false;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n PaymentVerificationService.verifyPaymentInfoNew(commonData, $scope.amountDue, \r\n function(){\r\n if ($scope.useSavedCard)\r\n payBySavedCard();\r\n else\r\n payByCreditCardInternal();\r\n });\r\n },function (e) { \r\n console.error(e);\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.payNowBankAccount = function () {\r\n if (!$scope.payBankAccount_form.$valid\r\n || $scope.bankCheckingAccountNumber != $scope.bankCheckingAccountNumber2\r\n || $scope.isPaymentInfoAgreeBank == false && $scope.isFeeEnabled\r\n || $scope.payBankAccount_form.bankRoutingNumber == $scope.payBankAccount_form.bankCheckingAccountNumber) {\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n //Please, please, please no max amount validation for eChecks.\r\n\r\n validateRoutingNumberAndPayByCheck();\r\n },function (e) { \r\n console.error(e);\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function validateRoutingNumberAndPayByCheck () {\r\n usSpinnerService.spin('spinner-1');\r\n validateRoutingNumber().then(function (isRoutingNumberValid) {\r\n $scope.routNumError = !isRoutingNumberValid;\r\n if ($scope.routNumError){\r\n ModalServiceExt.showMessage($scope._t('Error'), \r\n $scope._t('Invalid Routing Number.'));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n bankAccountPay();\r\n });\r\n }\r\n\r\n $scope.paymentOk = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\r\n }\r\n\r\n $scope.printConfirmation = function () {\r\n window.print();\r\n }\r\n\r\n $scope.viewUnderstandYourBill = function () {\r\n var viewurl = apiUrl + 'api/Bills/GetUnderstandMyBill';\r\n window.open(viewurl, '_blank');\r\n }\r\n\r\n $scope.viewSignedDocument = function () {\r\n var viewurl = apiUrl + 'api/DocuSign/ViewSignedDocument?orderNumber=' + $scope.orderNumber;\r\n window.open(viewurl, '_blank');\r\n }\r\n\r\n $scope.proceedToRegistration = function () {\r\n $state.go('TopMenuLayout.SignUp.Step1', { \r\n accountnumber: $scope.currentAccount.AccountNumber, \r\n customerfullname: $scope.currentAccount.CustomerFullName, \r\n zip: $scope.currentAccount.Zip.substring(0, 5) \r\n });\r\n }\r\n\r\n function clearPaymentSettings() {\r\n $scope.cardNumber = '';\r\n $scope.nameOnCard = '';\r\n $scope.cardExpiryMonth = '';\r\n $scope.cardExpiryYear = '';\r\n\r\n $scope.billToAddress = '';\r\n $scope.billToCity = '';\r\n $scope.billToState = '';\r\n $scope.billToZip = '';\r\n $scope.cardCode = '';\r\n\r\n $scope.checkNameOnAccount = '';\r\n $scope.bankRoutingNumber = '';\r\n $scope.bankCheckingAccountNumber = '';\r\n $scope.bankCheckingAccountNumber2 = '';\r\n $scope.driversLicenseNumber = '';\r\n $scope.checkPaymentState = '';\r\n \r\n $scope.phone = $state.params.phoneNumber;\r\n $scope.email = $state.params.email ? $state.params.email : '';\r\n }\r\n\r\n function getConvFeeInfo (account) {\r\n if (!$scope.isFeeEnabled){\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n var searchObject = {\r\n accountNumber: account.AccountNumber,\r\n };\r\n $http({\r\n url: apiUrl + 'api/Payment/GetConvFeeInfo/',\r\n method: \"GET\",\r\n params: searchObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.convFeeInfo = jsondata;\r\n updateConvinienceFee();\r\n if ($scope.convFeeInfo.Disconnected == $scope._t('Account Disconnected')) {\r\n ModalServiceExt.showMessage($scope._t('Account is disconnected'), \r\n $scope._t('Your account is currently disconnected. After making the payment please contact Customer Service at')\r\n + ' ' \r\n + $scope.convFeeInfo.SupportPhoneNumber);\r\n }\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (data) {\r\n ModalServiceExt.showMessage($scope._t('Error'), $scope._t('Server error. Please, try again later.'));\r\n $scope.stepName = 'find';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function updateConvinienceFee() {\r\n if ($scope.amountDue == null || isNaN($scope.amountDue) || $scope.amountDue == '') {\r\n $scope.convinienceFee = '';\r\n return;\r\n }\r\n\r\n var info = $scope.convFeeInfo;\r\n\r\n if ($scope.isFeeEnabled) {\r\n if ($scope.stepName == 'payByCard') {\r\n if (info.FeeType == \"percent\") {\r\n $scope.convinienceFee = formatDecimal($scope.amountDue / 100 * info.FeeAmount);\r\n } else if (info.FeeType == \"flat\") {\r\n $scope.convinienceFee = formatDecimal(info.FeeAmount);\r\n }\r\n } else if ($scope.stepName == 'payByBankAccount') {\r\n if (info.FeeTypeAch == \"percent\") {\r\n $scope.convinienceFee = formatDecimal($scope.amountDue / 100 * info.FeeAmountAch);\r\n } else if (info.FeeTypeAch == \"flat\") {\r\n $scope.convinienceFee = formatDecimal(info.FeeAmountAch);\r\n }\r\n }\r\n }\r\n else {\r\n $scope.convinienceFee = 0;\r\n }\r\n\r\n $scope.totalAmount = formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n\r\n }\r\n\r\n function formatDecimal (decimal) {\r\n\r\n var formated = Math.round(parseFloat(decimal) * 100) / 100;\r\n\r\n formated = formated.toString();\r\n if (formated.indexOf('.') == -1) formated += '.';\r\n while (formated.length < formated.indexOf('.') + 3) formated += '0';\r\n\r\n return formated;\r\n }\r\n\r\n function validateRoutingNumber() {\r\n var deferred = $q.defer();\r\n var requestResult = false;\r\n $http({\r\n url: apiUrl + 'api/Payment/RoutingNumberValidate',\r\n method: \"GET\",\r\n params: { routingNumber: $scope.bankRoutingNumber }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n alert(response.Errors[0]);\r\n deferred.reject(requestResult);\r\n }\r\n else {\r\n requestResult = response.Data;\r\n deferred.resolve(response.Data);\r\n }\r\n $scope.stepName = 'payByBankAccount';\r\n }).error(function () {\r\n alert(\"Server error. Try again later.\");\r\n deferred.resolve(requestResult);\r\n $scope.stepName = 'payByBankAccount';\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function updateBankIcon() {\r\n $scope.showBankLogo = false;\r\n if($scope.bankRoutingNumber == undefined || $scope.bankRoutingNumber.length != 9)\r\n {\r\n return;\r\n }\r\n var requestResult = false;\r\n $http({\r\n url: apiUrl + 'api/Payment/GetBankLogo',\r\n method: \"GET\",\r\n params: { routingNumber: $scope.bankRoutingNumber }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n $scope.showBankLogo = false;\r\n }\r\n else {\r\n requestResult = response.Data;\r\n if(response.Data.Logo != ''){\r\n $('#bank-logo-icon').css('background-image', response.Data.Logo);\r\n $scope.showBankLogo = true;\r\n $scope.plaidBankName = response.Data.Name;\r\n $scope.plaidBankUrl = response.Data.Url;\r\n } else {\r\n $scope.showBankLogo = false;\r\n }\r\n }\r\n }).error(function () {\r\n console.log(\"UpdateBankIcon error. GetBankLogo.\");\r\n });\r\n }\r\n\r\n $scope.updateBankIconLogo = function() {\r\n updateBankIcon();\r\n }\r\n\r\n function bankAccountPay() {\r\n $scope.bankAccountFormSubmitted = false;\r\n\r\n var companyCode = $scope.currentAccount.CompanyCode;\r\n if ($scope.proceededWithoutSearch) {\r\n companyCode = $scope.selectedCompany.companyCode;\r\n }\r\n\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n nameOnAccount: $scope.checkNameOnAccount,\r\n bankRoutingNumber: $scope.bankRoutingNumber,\r\n checkingAccountNumber: $scope.bankCheckingAccountNumber,\r\n companyCode: companyCode,\r\n\r\n bcaId: $scope.bcaId,\r\n OrderNumber: $scope.orderNumber\r\n };\r\n\r\n if (utilli.isAdmin) {\r\n paymentObject.PaymentPage = 3;\r\n }\r\n else {\r\n paymentObject.PaymentPage = 1;\r\n }\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/AdobeSignQuickPayByBankAccount',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function (data) {\r\n $scope.paymentResult = data.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n \r\n function payByCreditCardInternal() {\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n cardNumber: $scope.cardNumber,\r\n nameOnCard: $scope.nameOnCard,\r\n expirationDateYear: $scope.cardExpiryYear,\r\n expirationDateMonth: $scope.cardExpiryMonth,\r\n companyCode: $scope.proceededWithoutSearch \r\n ? $scope.selectedCompany.companyCode\r\n : $scope.currentAccount.CompanyCode,\r\n billToAddress: $scope.billToAddress,\r\n billToCity: $scope.billToCity,\r\n billToState: $scope.billToState,\r\n billToZip: $scope.billToZip,\r\n cardCode: $scope.cardCode,\r\n invoiceNumber: '0',\r\n PaymentPage: utilli.isAdmin ? 3 : 1,\r\n NeedToSave: $scope.saveThisCard,\r\n EBillToken: $state.params.token,\r\n bcaId: $scope.bcaId,\r\n OrderNumber: $scope.orderNumber\r\n };\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/AdobesignPayUsingCard',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function (data) {\r\n var jsondata = data;\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n function payBySavedCard() {\r\n var paymentObject = {\r\n accountNumber: $scope.currentAccount.AccountNumber,\r\n userId: -1,\r\n amountToPay: $scope.amountDue,\r\n phone: $scope.phone,\r\n email: $scope.email,\r\n cardId: $scope.currentSavedCard.card.Id,\r\n companyCode: $scope.proceededWithoutSearch \r\n ? $scope.selectedCompany.companyCode\r\n : $scope.currentAccount.CompanyCode,\r\n billToAddress: $scope.billToAddress,\r\n billToCity: $scope.billToCity,\r\n billToState: $scope.billToState,\r\n billToZip: $scope.billToZip,\r\n cardCode: $scope.cardCode,\r\n invoiceNumber: '0',\r\n PaymentPage: utilli.isAdmin ? 3 : 1,\r\n EBillToken: $state.params.token,\r\n ConfirmationCode: $scope.confirmationCode\r\n };\r\n\r\n $http({\r\n url: apiUrl + 'api/Payment/DocusignPayUsingCard',\r\n method: \"POST\",\r\n data: paymentObject\r\n }).success(function (jsondata) {\r\n usSpinnerService.stop('spinner-1');\r\n if(jsondata.IsSmsCodeNotValid) {\r\n $scope.sendSmsCodeError = jsondata.Message;\r\n $scope.canRequestVerificationCode = true;\r\n return;\r\n }\r\n if (jsondata) {\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n document.title = $scope._t('Utilli Transaction Record');\r\n }\r\n }).error(function (data) {\r\n var jsondata = data;\r\n $scope.paymentResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('AdobeSignStartController', ['$scope', '$state', '$http', 'usSpinnerService', \r\n 'CommonDataService', 'ServiceProvidersService', 'ModalServiceExt', '$window',\r\n function ($scope, $state, $http, usSpinnerService, CommonDataService, \r\n ServiceProvidersService, ModalServiceExt, $window) {\r\n \r\n \r\n var apiUrl = '';\r\n\r\n function initPage() {\r\n $scope.imagesPath = utilli.isAdmin\r\n ? \"../Images\"\r\n : \"Images\";\r\n\r\n $scope.isWglcx = utilli.isWglcx();\r\n $scope.isAdmin = utilli.isAdmin;\r\n $scope.accountNumber = '';\r\n\r\n $scope.showInfo = false;\r\n $scope.info = '';\r\n\r\n $scope.onlyNumbers = /^\\d+$/;\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n $scope.emailPattern = utilli.emailPattern;\r\n\r\n $scope.stepName = 'find';\r\n $(\"#cardCodeCvv\").mask(\"999?9\", { placeholder: \"\" });\r\n $scope.quickPayValidationType = 'InvoiceNumber'; // Can be: InvoiceNumber, BusinessPartnerNumber\r\n $scope.quickPayValidationCaption = $scope._t('Invoice Number');\r\n\r\n $scope.isFeeEnabled = false;\r\n \r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n\r\n apiUrl = providerData.ApiUrl;\r\n \r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n $scope.largeConvenienceFeeBorder = commonData.LargeConvenienceFeeBorder;\r\n $scope.smallConvenienceFee = commonData.SmallConvenienceFee;\r\n $scope.largeConvenienceFee = commonData.LargeConvenienceFee;\r\n $scope.paymentInfoText = commonData.FeeInformation;\r\n $scope.commomData = commonData;\r\n\r\n $scope.isBankAccountPaymentsEnabled = commonData.IsBankAccountPaymentsEnabled;\r\n $scope.isCreditCardCvvEnabled = commonData.IsCreditCardCvvEnabled == 'True';\r\n $scope.isCreditCardBillingAddressEnabled = commonData.IsCreditCardBillingAddressEnabled == 'True';\r\n $scope.quickPayValidationType = commonData.QuickPayValidationType;\r\n $scope.isFeeEnabled = commonData.IsFeeEnabled;\r\n\r\n if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n $scope.quickPayValidationCaption = _t('Customer Number');\r\n }\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n },\r\n function() {\r\n // codereview@Yuriy: implement error handling\r\n //$moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n\r\n if ($state.params.contractAccountNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n var searchRequest = {// codereview@Yuriy: variable seems to be not used\r\n accountNumber: $state.params.contractAccountNumber,\r\n isAdmin: $scope.isAdmin,\r\n billAccessToken: $state.params.token\r\n };\r\n\r\n localStorage.setItem(\"last_order_number\", $state.params.orderNumber);\r\n\r\n var docusignObject = {\r\n contractAccountNumber: $state.params.contractAccountNumber,\r\n billAmount: $state.params.billAmount,\r\n email: $state.params.email,\r\n phoneNumber: $state.params.phoneNumber,\r\n bcaId: $state.params.bcaId,\r\n bcaManagerEmail: $state.params.bcaManagerEmail,\r\n orderNumber: $state.params.orderNumber,\r\n pageType: 'AdobeSign'\r\n };\r\n // codereview@Yuriy: the next line results in that there 2 ajax requests to get common data\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n var url = 'https://staging.nudge.net/api/v2/Test/RedirectUrlNonCom';\r\n if (DeploymentSettings.deploymentEnvironment == \"Prod\")\r\n {\r\n url = 'https://app.nudge.net/api/v2/Test/RedirectUrlNonCom';\r\n }\r\n else\r\n {\r\n url = 'https://staging.nudge.net/api/v2/Test/RedirectUrlNonCom';\r\n } \r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: { \r\n recipientId: $state.params.contractAccountNumber,\r\n billAmount: $state.params.billAmount,\r\n email: $state.params.email,\r\n orderNumber: $state.params.orderNumber,\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n console.log(response)\r\n $window.location.href = response;\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n // var url = apiUrl + 'api/DocuSign/DocuSignStart'; // this is ok. DocuSign method for both AdobeSign and DocuSign\r\n // $http({\r\n // url: url,\r\n // method: \"POST\",\r\n // data: docusignObject\r\n // }).success(function (data) {\r\n // // codereview@Yuriy: don't leave commented code\r\n // //$window.location.href = data.Data;\r\n \r\n // if(data.HasErrors) {\r\n // usSpinnerService.stop('spinner-1');\r\n // // ModalServiceExt.showInfo(data.Errors[0]);\r\n // $scope.showInfo = true;\r\n // $scope.info = data.Errors[0];\r\n // } else {\r\n // $window.location.href = data.Data.RedirectUrl;\r\n // }\r\n\r\n // }).error(function (e) {\r\n // usSpinnerService.stop('spinner-1');\r\n // var message = e.data.ExceptionMessage ? e.data.ExceptionMessage : e.data.Message;\r\n // if (message)\r\n // ModalServiceExt.showError(\"Error: \" + message);\r\n // else \r\n // ModalServiceExt.showServerError();\r\n // });\r\n });\r\n });\r\n }\r\n }\r\n // codereview@Yuriy: no need for initPage function\r\n initPage();\r\n\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('LinkShortenerController', ['$state', '$http', 'usSpinnerService', 'ServiceProvidersService', \r\n 'ModalServiceExt', '$window',\r\n function ($state, $http, usSpinnerService, ServiceProvidersService, ModalServiceExt, $window) {\r\n\r\n if (!$state.params.key){\r\n ModalServiceExt.showError('Redirection link is missing.');\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n $http({\r\n url: providerData.ApiUrl + 'api/LinkShortener/GetLongLink',\r\n method: \"GET\",\r\n params: { key: $state.params.key }\r\n }).apiThen(function (longLink) {\r\n $window.location.href = longLink;\r\n }, ModalServiceExt)\r\n .fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n });\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.factory('moduleServices',\r\n [\"$rootScope\", function ($rootScope) {\r\n return {\r\n hideKeyboard: function () {\r\n //hide keyboard\r\n document.activeElement.blur();\r\n //$(\"input\").blur(); Yuriy Sokha: with operation leads to error in brouser console; todo\r\n },\r\n\r\n setError: function (message) {\r\n $rootScope.errors = [{ Message: message }];\r\n },\r\n\r\n setErrors: function (errors) {\r\n $rootScope.errors = errors;\r\n }\r\n };\r\n }]);\r\n\r\napp.controller('ForgotUserIdController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n $rootScope.SecureData = {\r\n userNameOrEmail: ''\r\n };\r\n $rootScope.serviceUrl = '';\r\n }]);\r\n\r\napp.controller('ForgotUserIdStep1Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'ServiceProvidersService', 'usSpinnerService',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, ServiceProvidersService, usSpinnerService) {\r\n\r\n // this hack fixes a select element behavior in mobile (changing selected options).\r\n var allSelectElements = document.getElementsByTagName('select');\r\n for (var i = 0; i < allSelectElements.length; i++) {\r\n allSelectElements[i].addEventListener('touchstart', function (e) {\r\n //This is the important line\r\n e.stopPropagation();\r\n }, false);\r\n }\r\n\r\n $scope.showCsrLink = DeploymentSettings.currentServiceProvider != Config.hcProviderName;\r\n $scope.providers = [];\r\n $scope.provider = {};\r\n $rootScope.errors = [];\r\n\r\n $scope.isProviderListVisible = !DeploymentSettings.currentServiceProvider;\r\n if ($scope.isProviderListVisible) {\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(allProviders) {\r\n $scope.providers = allProviders;\r\n $scope.provider = allProviders[0];\r\n },\r\n function() {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n else{\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(\r\n function(providerData){\r\n $scope.provider = providerData;\r\n },\r\n function(){\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n\r\n $scope.CheckUserInfoFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmCheckUserInfo.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $rootScope.serviceUrl = $scope.provider.ApiUrl;\r\n $rootScope.appUrl = $scope.provider.ApiUrl;\r\n $rootScope.SecureData.userNameOrEmail = $.trim($scope.Email);\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $http({\r\n url: $rootScope.serviceUrl + 'api/Account/CheckForgotUserIdStep1/',\r\n method: \"GET\",\r\n params: {\r\n email: $.trim($scope.Email),\r\n zip: $.trim($scope.ZipCode)\r\n }\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.ERROR_LIST && response.ERROR_LIST.length > 0) {\r\n $moduleServices.setErrors(response.ERROR_LIST);\r\n } else {\r\n $rootScope.SecurityQuestion = response.SecurityQuestions[0].Message;\r\n $state.go('^.Step2');\r\n }\r\n } else {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\r\n\r\napp.controller('ForgotUserIdStep2Controller', ['$scope', '$rootScope', '$http', '$state',\r\n 'moduleServices', 'usSpinnerService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService, ModalServiceExt) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n $rootScope.errors = [];\r\n\r\n $scope.SecurityQuestion = $rootScope.SecurityQuestion;\r\n $scope.CheckSecurityAnswerFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmSecurityAnswer.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $rootScope.errors = [];\r\n $http({\r\n url: $rootScope.serviceUrl + 'api/Account/CheckForgotUserIdStep2/',\r\n method: \"GET\",\r\n params: {\r\n email: $rootScope.SecureData.userNameOrEmail,\r\n securityAnswer: $.trim($scope.SecurityAnswer)\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.HasErrors) {\r\n $rootScope.errors = [{Message: response.Errors[0]}];\r\n return;\r\n }\r\n\r\n $state.go('^.Success');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\r\n\r\napp.controller('ForgotUserIdSuccessController', ['$scope', '$rootScope', 'CommonDataService', 'usSpinnerService',\r\n '$http', 'moduleServices',\r\n function ($scope, $rootScope, CommonDataService, usSpinnerService, $http, $moduleServices) {\r\n $rootScope.errors = [];\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData($rootScope.appUrl, true)\r\n .then(function (commonData) {\r\n $scope.contactPhoneNumber = commonData.SupportPhone;\r\n $scope.workingHours = commonData.WorkingHours;\r\n $scope.billingEmailTo = commonData.BillingEmailTo;\r\n $scope.serviceProviderName = commonData.CompanyName;\r\n $scope.billingDepartment = commonData.BillingDepartment;\r\n usSpinnerService.stop('spinner-1');\r\n }, function () {\r\n $moduleServices.setError(\"utilli.errors.serverErrorMessage\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.directive(\"repeatPassword\",\r\n function() {\r\n return {\r\n require: \"ngModel\",\r\n link: function (scope, elem, attrs, ctrl) {\r\n var otherInput = elem.inheritedData(\"$formController\")[attrs.repeatPassword];\r\n\r\n ctrl.$parsers.push(function (value) {\r\n if (value === otherInput.$viewValue) {\r\n ctrl.$setValidity(\"confirm\", true);\r\n return value;\r\n }\r\n ctrl.$setValidity(\"confirm\", false);\r\n });\r\n\r\n otherInput.$parsers.push(function (value) {\r\n ctrl.$setValidity(\"confirm\", value === ctrl.$viewValue);\r\n return value;\r\n });\r\n }\r\n };\r\n });\r\n\r\napp.factory('moduleServices',\r\n [\"$rootScope\", function ($rootScope) {\r\n return {\r\n hideKeyboard: function () {\r\n //hide keyboard\r\n document.activeElement.blur();\r\n //$(\"input\").blur(); Yuriy Sokha: with operation leads to error in brouser console; todo\r\n },\r\n\r\n setError: function (message) {\r\n $rootScope.errors = [{Message: message}];\r\n },\r\n\r\n setErrors: function (errors) {\r\n $rootScope.errors = errors;\r\n }\r\n };\r\n }]);\r\n\r\napp.controller('ForgotPasswordController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n\r\n $scope.goToCsr = function (){\r\n $state.go('ForgotPasswordCsr');\r\n }\r\n\r\n $scope.SecureData = {\r\n userNameOrEmail: '',\r\n zipCode: '',\r\n pstrAccountNumber: '',\r\n securityAnswer: '',\r\n password: '',\r\n confirmpassword: '',\r\n actionEvent: 'ForgotPassword'\r\n };\r\n\r\n $rootScope.serviceUrl = '';\r\n $rootScope.webServicesUrl = '';\r\n }]);\r\n\r\napp.controller('ForgotPasswordStep1Controller', ['$scope', '$rootScope', '$http', '$state',\r\n 'moduleServices', 'ServiceProvidersService', 'usSpinnerService',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, ServiceProvidersService, usSpinnerService) {\r\n\r\n // this hack fixes a select element behavior in mobile (changing selected options).\r\n var allSelectElements = document.getElementsByTagName('select');\r\n for (var i = 0; i < allSelectElements.length; i++) {\r\n allSelectElements[i].addEventListener('touchstart', function (e) {\r\n //This is the important line\r\n e.stopPropagation();\r\n }, false);\r\n }\r\n\r\n $scope.showCsrLink = DeploymentSettings.currentServiceProvider != Config.hcProviderName;\r\n $scope.providers = [];\r\n $scope.provider = {};\r\n $rootScope.errors = [];\r\n $scope.isProviderListVisible = !DeploymentSettings.currentServiceProvider;\r\n if ($scope.isProviderListVisible) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(allProviders){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.providers = allProviders;\r\n $scope.provider = allProviders[0];\r\n },\r\n function(){\r\n usSpinnerService.stop('spinner-1');\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n else{\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(\r\n function(providerData){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.provider = providerData;\r\n },\r\n function(){\r\n usSpinnerService.stop('spinner-1');\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n\r\n $scope.CheckUserInfoFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmCheckUserInfo.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $rootScope.webServicesUrl = $scope.provider.ApiUrl;\r\n $scope.SecureData.userNameOrEmail = $.trim($scope.SecureData.userNameOrEmail);\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/Account/CheckForgotPasswordStep1/',\r\n method: \"GET\",\r\n params: {\r\n userNameOrEmail: $.trim($scope.SecureData.userNameOrEmail),\r\n zip: $.trim($scope.SecureData.zipCode)\r\n }\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.ERROR_LIST && response.ERROR_LIST.length > 0) {\r\n $moduleServices.setErrors(response.ERROR_LIST);\r\n } else {\r\n $scope.SecureData.securityQuestion = response.SecurityQuestions[0].Message;\r\n\r\n $state.go('^.Step2');\r\n }\r\n } else {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\r\n\r\napp.controller('ForgotPasswordStep2Controller', ['$scope', '$rootScope', '$http', '$state',\r\n 'moduleServices', 'usSpinnerService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService, ModalServiceExt) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n $rootScope.errors = [];\r\n\r\n $scope.CheckSecurityAnswerFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmSecurityAnswer.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n $rootScope.errors = [];\r\n usSpinnerService.spin('spinner-1');\r\n $scope.SecureData.securityAnswer = $.trim($scope.SecureData.securityAnswer);\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/Account/CheckForgotPasswordStep2/',\r\n method: \"GET\",\r\n params: {\r\n userNameOrEmail: $scope.SecureData.userNameOrEmail,\r\n securityAnswer: $scope.SecureData.securityAnswer\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n $state.go('^.Success');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ForgotPasswordByEmailController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.model = {\r\n from: '',\r\n userId: '',\r\n securityQuestion: '',\r\n securityAnswer: '',\r\n provider: {}\r\n };\r\n\r\n $scope.cancel = function () {\r\n if ($scope.model.from)\r\n $state.go($scope.model.from);\r\n else if (utilli.isWglcx())\r\n $state.go('TopMenuLayout.SignIn.Credentials');\r\n else\r\n $state.goToWelcome();\r\n };\r\n}])\r\n.controller('ForgotPasswordByEmailStep1Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams',\r\n 'ServiceProvidersService', 'moduleServices', 'ModalServiceExt', 'usSpinnerService',\r\n function ($scope, $rootScope, $http, $state, $stateParams, ServiceProvidersService, $moduleServices, ModalServiceExt, usSpinnerService) {\r\n\r\n $scope.model.from = $stateParams.from;\r\n\r\n if (!DeploymentSettings.currentServiceProvider) {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function (allProviders) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.providers = allProviders;\r\n $scope.model.provider = allProviders[0];\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n } else {\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(\r\n function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.model.provider = providerData;\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n \r\n $scope.submit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmCheckUserInfo.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: $scope.model.provider.ApiUrl + 'api/Account/CheckForgotPasswordByEmail/',\r\n method: \"GET\",\r\n params: {\r\n userName: $.trim($scope.UserId),\r\n email: $.trim($scope.Email)\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $scope.model.userId = $scope.UserId;\r\n $scope.model.securityQuestion = response.Data;\r\n $state.go('TopMenuLayout.ForgotPasswordByEmail.Success');\r\n }\r\n \r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n}])\r\n.controller('ForgotPasswordByEmailSuccessController', ['$scope', '$state', function ($scope, $state) {\r\n $scope.goToWelcome = function () {\r\n if ($scope.model.from)\r\n $state.go($scope.model.from);\r\n else if (utilli.isWglcx())\r\n $state.go('TopMenuLayout.SignIn.Credentials');\r\n else\r\n $state.goToWelcome();\r\n }\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('ForgotUserIdByEmailController', ['$scope', 'CommonHeaderService',\r\n function ($scope, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.Model = { from: '' };\r\n }]);\r\n\r\napp.controller('ForgotUserIdByEmailStep1Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams', 'moduleServices',\r\n 'ServiceProvidersService', 'usSpinnerService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, $state, $stateParams, $moduleServices, ServiceProvidersService, usSpinnerService, ModalServiceExt) {\r\n\r\n $scope.Model.from = $stateParams.from;\r\n $scope.isProviderListVisible = !DeploymentSettings.currentServiceProvider;\r\n \r\n if (!DeploymentSettings.currentServiceProvider) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(allProviders){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.providers = allProviders;\r\n $scope.provider = allProviders[0];\r\n },\r\n function(){\r\n usSpinnerService.stop('spinner-1');\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n else {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function(providerData){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.provider = providerData;\r\n },\r\n function(){\r\n usSpinnerService.stop('spinner-1');\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n\r\n $scope.submit = function () {\r\n $rootScope.errors = null;\r\n $scope.submitted = true;\r\n if (!$scope.frmCheckUserInfo.$valid)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: $scope.provider.ApiUrl + 'api/Account/CheckForgotUserIdData/',\r\n method: \"GET\",\r\n params: {\r\n lastName: $.trim($scope.lastName),\r\n email: $.trim($scope.Email)\r\n }\r\n })\r\n .success(function (response) {\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n $rootScope.errors = [{ Message: response.Errors[0] }];\r\n }\r\n else {\r\n $state.go('TopMenuLayout.ForgotUserIdByEmail.Success');\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.cancel = function () {\r\n if ($scope.Model.from)\r\n $state.go($scope.Model.from);\r\n else if (utilli.isWglcx())\r\n $state.go('TopMenuLayout.SignIn.Credentials');\r\n else\r\n $state.goToWelcome();\r\n };\r\n }]);\r\n\r\napp.controller('ForgotUserIdByEmailSuccessController', ['$scope', '$state',\r\n function ($scope, $state) {\r\n $scope.goToWelcome = function () {\r\n\r\n if ($scope.Model.from)\r\n $state.go($scope.Model.from);\r\n else if (utilli.isWglcx())\r\n $state.go('TopMenuLayout.SignIn.Credentials');\r\n else\r\n $state.goToWelcome();\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ResetPasswordController', ['$scope', '$http', '$state', '$stateParams', 'usSpinnerService',\r\n 'CommonDataService', 'ServiceProvidersService', 'ModalServiceExt',\r\nfunction ($scope, $http, $state, $stateParams, usSpinnerService, CommonDataService, ServiceProvidersService,\r\n ModalServiceExt) {\r\n var _t = $scope._t;\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.togglePassword = function (pswId, iconId) {\r\n utilli.togglePasswordVisibility(pswId, iconId);\r\n }\r\n\r\n var apiUrl = '';\r\n ServiceProvidersService.getProvider(DeploymentSettings.currentServiceProvider)\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n CommonDataService.getCommonData(providerData.ApiUrl).then(function (data) {\r\n $scope.passRequirements = data.PasswordRequirements;\r\n $scope.paswdMinLength = data.PasswordLength;\r\n usSpinnerService.stop('spinner-1');\r\n }, function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n });\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n });\r\n \r\n $scope.errors = {};\r\n\r\n if (!$stateParams.token) {\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n return;\r\n }\r\n\r\n $scope.model = {};\r\n $scope.model.newPassword = '';\r\n $scope.model.confirmNewPassword = '';\r\n\r\n resetErrors();\r\n\r\n $scope.passRequirements = [$scope._t('Loading...')];\r\n\r\n $scope.changePassword = function () {\r\n resetErrors();\r\n\r\n if (!validate()) {\r\n utilli.scrollTop();\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var url = apiUrl + 'api/User/ResetPassword';\r\n var requestData = {\r\n Token: $stateParams.token,\r\n NewPassword: $scope.model.newPassword,\r\n ConfirmPassword: $scope.model.confirmNewPassword\r\n };\r\n\r\n $http({\r\n url: url,\r\n method: 'POST',\r\n data: requestData\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (data.Errors != null && data.Errors.length > 0)\r\n $scope.errors.serverErrors = data.Errors;\r\n else {\r\n ModalServiceExt.showInfo(_t('Password was successfully changed.'), function () {\r\n if (utilli.hasAgentRole($stateParams.token)){\r\n $state.goToAgentsWelcome();\r\n } \r\n else if (utilli.isWglcx())\r\n $state.go('TopMenuLayout.SignIn.Credentials');\r\n else{\r\n $state.goToWelcome();\r\n }\r\n });\r\n }\r\n }).error(function () {\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n function find(list, key) {\r\n return _.find(list, function (item) { return item.Key === key; });\r\n }\r\n\r\n function validate() {\r\n resetErrors();\r\n\r\n var valid = true;\r\n var requirement = find($scope.passRequirements, 'PasswordLength');\r\n if (requirement && (!$scope.model.newPassword || $scope.model.newPassword.length < $scope.paswdMinLength)) {\r\n $scope.errors.newPasswordLength = requirement.ErrorText;\r\n valid = false;\r\n }\r\n else if ((requirement = find($scope.passRequirements, 'DigitsNumber')) && !utilli.hasDigits($scope.model.newPassword)) {\r\n $scope.errors.newPasswordNoDigits = requirement.ErrorText;\r\n valid = false;\r\n }\r\n else if ((requirement = find($scope.passRequirements, 'Letters')) && (!utilli.hasLowerCaseLetters($scope.model.newPassword) || !utilli.hasUpperCaseLetters($scope.model.newPassword))) {\r\n $scope.errors.newPasswordNoLetters = requirement.ErrorText;\r\n valid = false;\r\n }\r\n else if ((requirement = find($scope.passRequirements, 'SpecialSymbols')) && !utilli.hasSpecialSymbols($scope.model.newPassword)) {\r\n $scope.errors.newPasswordNoSpecialSymbols = requirement.ErrorText;\r\n valid = false;\r\n }\r\n\r\n if (!$scope.model.confirmNewPassword || $scope.model.confirmNewPassword != $scope.model.newPassword) {\r\n $scope.errors.passwordsDontMatch = true;\r\n valid = false;\r\n }\r\n\r\n if (localStorage.getItem('current_user') == $scope.model.newPassword) {\r\n $scope.errors.pswSameAsUserNameError = $scope._t('Passwords cannot be your User ID.');\r\n valid = false;\r\n }\r\n\r\n return valid;\r\n };\r\n\r\n function resetErrors() {\r\n $scope.errors.serverErrors = null;\r\n $scope.errors.newPasswordEmpty = null;\r\n $scope.errors.passwordsDontMatch = null;\r\n $scope.errors.newPasswordLength = null;\r\n $scope.errors.newPasswordNoDigits = null;\r\n $scope.errors.newPasswordNoLetters = null;\r\n $scope.errors.newPasswordNoSpecialSymbols = null;\r\n $scope.errors.pswSameAsUserNameError = null;\r\n };\r\n}]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('UsageController', ['$scope', '$http', '$rootScope', 'usSpinnerService',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', '$state', 'UnitsService', 'GetAccountsService',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $http, $rootScope, usSpinnerService, LeftMenuService, CommonHeaderService, ModalServiceExt, $state,\r\n UnitsService, GetAccountsService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.isHc = utilli.isHc();\r\n\r\n $scope.units = UnitsService;\r\n $scope.config = Config;\r\n if ($state.current.name == 'MainLayout.Usage') {\r\n LeftMenuService.setCurrentTab('Usage');\r\n }\r\n CommonHeaderService.setUpNotificationButton();\r\n\r\n $scope.isExportToExcelButtonVisible = !isMobileOrRipple();\r\n\r\n $scope.isMultipleMeters = false;\r\n $scope.meterNum = '';\r\n\r\n $scope.meterOptions = [];\r\n\r\n $scope.currentMeter = \"\";\r\n $scope.currentPage = 0;\r\n $scope.pageSize = 12;\r\n\r\n $scope.previousPage = function () {\r\n if (!$scope.disablePrev) {\r\n $scope.currentPage++;\r\n getGraph();\r\n }\r\n };\r\n\r\n $scope.nextPage = function () {\r\n if (!$scope.disableNext) {\r\n $scope.currentPage--;\r\n getGraph();\r\n }\r\n };\r\n\r\n $scope.tableData = [];\r\n\r\n function showChartLoading(){\r\n $scope.chart.showLoading('');\r\n }\r\n\r\n $scope.currentAccountNumber = '';\r\n $scope.getMeterDataGraph = function (accountNumber) {\r\n $scope.currentAccountNumber = accountNumber;\r\n // build empty chart so that loading.gif will be visible while data is being loaded via ajax call\r\n processGraphData({Count: 0, PageData: []});\r\n showChartLoading();\r\n\r\n startSpin();\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n $http({\r\n url: apiUrl + 'api/Consumption/GetMeterInfo/',\r\n method: \"GET\",\r\n params: { AccountNumber: accountNumber }\r\n }).success(function (jsonData) {\r\n stopSpin();\r\n if (jsonData) {\r\n if (isGetMetersError(jsonData)) {\r\n ModalServiceExt.showError(jsonData[0].ERROR_LIST[0].Message);\r\n return;\r\n }\r\n useMeterData(jsonData);\r\n } else {\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n }\r\n }).error(function (error) {\r\n stopSpin();\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n };\r\n\r\n $scope.getExcelData = function () {\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GenerateConsumptionDataExcel/'\r\n + '?AccountNumber=' + localStorage.getItem('CurrentAccountNumber')\r\n + '&meterNumber=' + $scope.meterNum;\r\n startSpin();\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: { }\r\n }).success(function (response) {\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n stopSpin();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n var url = utilli.getFileUrlWithToken(response.Data);\r\n utilli.downloadFile(url, \"Payments.xlsx\");\r\n }\r\n stopSpin();\r\n }).error(function (error) {\r\n stopSpin();\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n $scope.getGreenButtonData = function () {\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GenerateGreenButtonData/'\r\n + '?AccountNumber=' + localStorage.getItem('CurrentAccountNumber')\r\n + '&meterNumber=' + $scope.meterNum;\r\n startSpin();\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: {}\r\n }).success(function (response) {\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n stopSpin();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n var url = utilli.getFileUrlWithToken(response.Data);\r\n utilli.downloadFile(url, \"Payments.xlsx\");\r\n }\r\n stopSpin();\r\n }).error(function (error) {\r\n stopSpin();\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n function isGetMetersError(jsonData) {\r\n return jsonData.length && jsonData.length == 1 && jsonData[0].ERROR_LIST && jsonData[0].ERROR_LIST.length > 0;\r\n }\r\n\r\n function useMeterData (jsonObject) {\r\n if (jsonObject.length > 0) {\r\n if (jsonObject.length == 1)\r\n useSingleMeterData(jsonObject);\r\n else\r\n useMiltipleMetersData(jsonObject);\r\n }\r\n getGraph();\r\n };\r\n\r\n function useSingleMeterData(jsonObject) {\r\n var jsonMeterNumIs = jsonObject[0].MeterNum;\r\n if (jsonMeterNumIs == \"\" || jsonMeterNumIs == null) {\r\n $scope.isMultipleMeters = false;\r\n }\r\n else {\r\n $scope.isMultipleMeters = false;\r\n setCurrentMeter(jsonObject[0]);\r\n }\r\n }\r\n\r\n function useMiltipleMetersData(jsonObject) {\r\n $scope.isMultipleMeters = true;\r\n $scope.meterOptions = [];\r\n\r\n if (jsonObject.length > 0) {\r\n fillMeterOptions(jsonObject);\r\n setCurrentMeter(jsonObject[0]);\r\n }\r\n }\r\n\r\n function fillMeterOptions(jsonObject) {\r\n for (var i = 0; i < jsonObject.length; i++) {\r\n $scope.meterOptions.push(jsonObject[i]);\r\n }\r\n }\r\n\r\n function setCurrentMeter(meterInfo) {\r\n $scope.currentMeter = meterInfo;\r\n $scope.meterNum = meterInfo.MeterNum;\r\n var selectedAccountAndMeter = {\r\n AccountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n meterNumber: meterInfo.MeterNum\r\n };\r\n }\r\n\r\n /***\r\n * Enables/disables next/prev controls depending on current page and pointsTotalCount\r\n * @param pointsTotalCount count of available points for graph including those not visible on the current page\r\n */\r\n function analyzePointsTotalCount(pointsTotalCount) {\r\n // (currentPage + 1) because counting starts from zero\r\n $scope.disablePrev = ($scope.currentPage + 1) * $scope.pageSize >= pointsTotalCount;\r\n $scope.disableNext = $scope.currentPage == 0;\r\n }\r\n\r\n $scope.selectMeter = function () {\r\n $scope.currentPage = 0;\r\n setCurrentMeter($scope.currentMeter);\r\n getGraph();\r\n }\r\n\r\n $scope.isFirstGraphLoad = true;\r\n /***\r\n * does everything needed to re-plot the chart with current parameters (page number, consumption units)\r\n */\r\n function getGraph() {\r\n var currentAccountNumber = $scope.currentAccountNumber;\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n showChartLoading();\r\n\r\n $http({\r\n url: apiUrl + 'api/Consumption/GetConsumptionGraphPageForUsage/',\r\n method: \"GET\",\r\n params: {\r\n accountNumber: currentAccountNumber,\r\n meterNumber: $scope.currentMeter.MeterNum,\r\n skip: $scope.currentPage * $scope.pageSize,// currentPage starts with 0\r\n pageSize: $scope.pageSize\r\n }\r\n }).success(function (graphPageJson) {\r\n $scope.chart.hideLoading();\r\n if (graphPageJson) {\r\n if (graphPageJson.Errors && graphPageJson.Errors.length > 0) {\r\n ModalServiceExt.showError(graphPageJson.Errors[0]);\r\n }\r\n else {\r\n if ($scope.isFirstGraphLoad && graphPageJson.PageData.length > 0) {\r\n $scope.isFirstGraphLoad = false;\r\n $scope.units.setSelectedUnits(graphPageJson.PageData[0].Unit);\r\n }\r\n processGraphData(graphPageJson);\r\n }\r\n } else {\r\n ModalServiceExt.showError($scope._t(\"Error occurred during getting of consumptions.\"));\r\n }\r\n }).error(function (error) {\r\n $scope.chart.hideLoading();\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n };\r\n\r\n /**\r\n * prepares data for the chart and the table below the chart\r\n * @param graphPageJson json with data received from our back-end\r\n */\r\n function processGraphData(graphPageJson) {\r\n\r\n if (graphPageJson.PageData == undefined)\r\n return;\r\n\r\n analyzePointsTotalCount(graphPageJson.Count);\r\n\r\n // points for the graph must be reset and filled with data in json\r\n $scope.graphPoints = graphPageJson.PageData;\r\n $scope.tableData = [];\r\n\r\n var tableData = convertChartUnits($scope.graphPoints);\r\n if (!$scope.currentRegisterNumber)\r\n $scope.currentRegisterNumber = tableData.length ? tableData[0].RegisterNumber : null;\r\n $scope.registerNumbers = $scope.currentRegisterNumber ? [$scope.currentRegisterNumber] : [];\r\n for (var i = 0; i < tableData.length; i++) {\r\n var reading = tableData[i];\r\n if (reading.RegisterNumber != $scope.currentRegisterNumber) {\r\n // add register number into the list of register numbers if it isn't already added\r\n if (!_.contains($scope.registerNumbers, reading.RegisterNumber))\r\n $scope.registerNumbers.push(reading.RegisterNumber);\r\n continue;\r\n }\r\n // add item in the table under the chart\r\n var tableDataItem = {};\r\n tableDataItem.date = reading.ReadingDateForTable;\r\n tableDataItem.amountString = utilli.formatCurrency(reading.Amount);\r\n tableDataItem.registerNum = reading.RegisterNumber;\r\n tableDataItem.consumption = reading.Consumption;\r\n tableDataItem.averageMonthlyTemperature = reading.MonthAverageTemperature;\r\n if (tableDataItem.averageMonthlyTemperature == \"-99\") {\r\n tableDataItem.averageMonthlyTemperature = \"\";\r\n reading.AverageMonthlyTemperature = null;\r\n }\r\n tableDataItem.unit = reading.Unit;\r\n // insert tableDataItem to the beginning of the array because elements were sorted by ReadingDate desc.\r\n $scope.tableData.unshift(tableDataItem);\r\n }\r\n\r\n $scope.createChart();\r\n };\r\n\r\n $scope.getConsumptionString = function(consumptionHistoryItem){\r\n var selectedFraction = Config.getConsumptionUnitFraction($scope.units.selectedUnitsType.name);\r\n var sourceFraction = Config.getConsumptionUnitFraction(consumptionHistoryItem.unit)\r\n var number = consumptionHistoryItem.consumption * selectedFraction / sourceFraction;\r\n return utilli.formatNumber(number);\r\n }\r\n\r\n /**\r\n * converts consumption units for the graph data\r\n * (for example ccf -> gallons)\r\n * @param graphPoints points for the chart\r\n * @param targetUnitsType target type of the consumption units\r\n * @param sourceUnitsType source type of the consumption units\r\n * @returns {Array|*} cloned graphPoints with converted consumption values\r\n */\r\n function convertUnits(graphPoints, targetUnitsType, sourceUnitsType) {\r\n var consumptionUnits = $scope.units.currentUnits;\r\n var targetFraction = consumptionUnits[targetUnitsType];\r\n var sourceFraction = consumptionUnits[sourceUnitsType];\r\n var coefficient = targetFraction / sourceFraction;\r\n var graphData = $.map(graphPoints, function (item) {\r\n var clone = $.extend({}, item);\r\n var stringFixed = (clone.Consumption * coefficient).toFixed(2);\r\n clone.Consumption = parseFloat(stringFixed);\r\n clone.Unit = targetUnitsType;\r\n return clone;\r\n });\r\n return graphData;\r\n }\r\n\r\n var convertChartUnits = function(graphPoints){\r\n if (!$scope.graphPoints || $scope.graphPoints.length === 0)\r\n return [];\r\n var unitsType = $scope.units.getSelectedUnitsTypeName();\r\n var sourceUnitsType = $scope.graphPoints[0].Unit;\r\n return convertUnits(graphPoints, unitsType, sourceUnitsType);\r\n }\r\n\r\n var buildSeries = function(){\r\n var result = [\r\n {\r\n name: 'Consumption',\r\n data: [],\r\n tooltip: {\r\n headerFormat: '',\r\n pointFormatter: function (){\r\n return '' + _t('Register') +': ' + this.register + '
'\r\n + '' + this.unit + ': ' + utilli.formatNumber(this.y) +'';\r\n }\r\n },\r\n yAxis: 1\r\n },\r\n {\r\n type: 'spline',\r\n name: 'Amount',\r\n data: [],\r\n tooltip: {\r\n pointFormatter: function () {\r\n return utilli.formatCurrency(this.y);\r\n },\r\n headerFormat: ''\r\n }\r\n }\r\n ];\r\n if(!$scope.isHc) {\r\n result.push({\r\n type: 'spline',\r\n name: 'Average Temperature',\r\n data: [],\r\n tooltip: {\r\n pointFormat: '{point.y}F (' + _t('Range') + ': {point.low}F-{point.high}F)',\r\n headerFormat: ''\r\n },\r\n yAxis: 2\r\n });\r\n result.push({\r\n name: 'Temperature Range',\r\n type: 'errorbar',\r\n data: [],\r\n enableMouseTracking: false,\r\n yAxis: 2\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n var buildChart = function (series) {\r\n $scope.chart = Highcharts.chart('chart', {\r\n credits: {\r\n enabled: false\r\n },\r\n lang: {\r\n drillUpText: '◁ Back'\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 100,\r\n type: 'column',\r\n events: {\r\n drilldown: function (e) {\r\n if (!e.seriesOptions) {\r\n var chart = this;\r\n chart.showLoading('Loading ...');\r\n var isMonthDrillDown =e.point.name.indexOf('-') > 0;\r\n var url = isMonthDrillDown \r\n ? localStorage.getItem('ApiUrl') + 'api/Consumption/GetDailyConsumption/'\r\n : localStorage.getItem('ApiUrl') + 'api/Consumption/GetHourlyConsumption/';\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: {\r\n date: e.point.name\r\n }\r\n }).apiThen(function(data){\r\n chart.hideLoading();\r\n\r\n var series = {\r\n name: 'Consumption',\r\n data: _.map(data, function (i) { return {\r\n name: i[0], \r\n y: i[1] * 1,\r\n drilldown: isMonthDrillDown}; \r\n }),\r\n tooltip: {\r\n headerFormat: '',\r\n pointFormatter: function () {\r\n return 'kWh: ' + utilli.formatNumber(this.y) + '';\r\n }\r\n },\r\n yAxis: 1\r\n };\r\n chart.addSingleSeriesAsDrilldown(e.point, series);\r\n\r\n var amounts = {\r\n type: 'spline',\r\n name: 'Amount',\r\n data: _.map(data, function (i) {\r\n return {\r\n name: i[0],\r\n y: i[1] * 0.12,\r\n drilldown: isMonthDrillDown\r\n };\r\n }),\r\n tooltip: {\r\n pointFormatter: function () {\r\n return utilli.formatCurrency(this.y);\r\n },\r\n headerFormat: ''\r\n }\r\n };\r\n chart.addSingleSeriesAsDrilldown(e.point, amounts);\r\n\r\n chart.applyDrilldown();\r\n }, ModalServiceExt);\r\n }\r\n }\r\n },\r\n },\r\n title: {\r\n text: ''\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 270 }\r\n },\r\n yAxis: [\r\n {\r\n labels: {\r\n formatter: function () {\r\n return utilli.formatCurrency(this.value);\r\n }\r\n },\r\n title: {\r\n text: _t('Amount')\r\n },\r\n min: 0\r\n },\r\n {\r\n labels: {\r\n formatter: function () {\r\n return utilli.formatNumber(this.value) + ' ' + $scope.units.getSelectedUnitsTypeName();\r\n }\r\n },\r\n title: {\r\n text: _t('Consumption')\r\n },\r\n opposite: true\r\n },\r\n {\r\n labels: {\r\n format: ''\r\n },\r\n title: {\r\n text: ''\r\n },\r\n min: 0,\r\n visible: false\r\n }\r\n ],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 80,\r\n floating: true,\r\n backgroundColor: (Highcharts.theme && Highcharts.theme.background2) || 'white',\r\n borderColor: '#CCC',\r\n borderWidth: 1,\r\n shadow: false\r\n },\r\n tooltip: {\r\n shared: false,\r\n useHTML: true\r\n },\r\n plotOptions: {\r\n series: {\r\n cursor: 'pointer'\r\n }\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n series: series,\r\n });\r\n }\r\n\r\n /**\r\n * plots the chart using data points from the $scope\r\n */\r\n $scope.createChart = function() {\r\n var graphData = convertChartUnits($scope.graphPoints);\r\n \r\n var consumptionReadingIndex = 0;\r\n var amountIndex = 1;\r\n var averageTemperatureIndex = 2;\r\n var temperatureRangeIndex = 3;\r\n\r\n var series = buildSeries();\r\n\r\n var categories = [];\r\n var uom = $scope.units.getSelectedUnitsTypeName();\r\n\r\n graphData.forEach(function (item) {\r\n categories.push(item.ReadingDateForGraphCategory);\r\n\r\n series[consumptionReadingIndex].data.push({\r\n name: item.ReadingDateForGraphCategory,\r\n y: item.Consumption,\r\n // custom data\r\n register: item.RegisterNumber,\r\n unit: uom,\r\n drilldown: uom == \"kWh\" // enable drilldown only for demo\r\n });\r\n\r\n series[amountIndex].data.push({\r\n name: item.ReadingDateForGraphCategory,\r\n y: item.Amount\r\n });\r\n\r\n if(!$scope.isHc) {\r\n series[averageTemperatureIndex].data.push({\r\n name: item.ReadingDateForGraphCategory,\r\n y: item.MonthAverageTemperature,\r\n low: item.MonthMinTemperature,\r\n high: item.MonthMaxTemperature\r\n });\r\n\r\n series[temperatureRangeIndex].data.push({\r\n name: item.ReadingDateForGraphCategory,\r\n low: item.MonthMinTemperature,\r\n high: item.MonthMaxTemperature\r\n });\r\n }\r\n });\r\n\r\n buildChart(series);\r\n }\r\n\r\n var startSpin = function () {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n var stopSpin = function () {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n\r\n setTimeout(function () {\r\n // render chart after left menu. otherwise the width of the chart will be calculated wrong\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n $scope.getMeterDataGraph(accountNumber);\r\n }, 100);\r\n\r\n if (DeploymentSettings.deploymentEnvironment == \"Demo\") {\r\n $scope.selectAccount = function (account) {\r\n $scope.model.selectedContractAccountNumber = account.AccountNumber;\r\n $scope.currentRegisterNumber = null;\r\n localStorage.setItem('CurrentUtilityType', account.UtilityType);\r\n $scope.units.updateUnits();\r\n $scope.isFirstGraphLoad = true;\r\n $scope.currentPage = 0;\r\n $scope.getMeterDataGraph(account.AccountNumber);\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n GetAccountsService.getAccounts(true).then(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0].Message);\r\n return;\r\n }\r\n $scope.accounts = response.Accounts;\r\n $scope.model = {};\r\n $scope.model.selectedContractAccountNumber = localStorage.getItem('CurrentAccountNumber');\r\n }).catch(function (e) {\r\n usSpinnerService.stop('spinner-1');\r\n console.log(e);\r\n });\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n .service('UnitsService', function() {\r\n var svc = {\r\n selectedUnitsType: { name: '' },\r\n dropDownItems: [{name: ''}]\r\n };\r\n svc.setSelectedUnits = function (unitsTypeName) {\r\n svc.selectedUnitsType = _.find(svc.dropDownItems, function (item) {\r\n return item.name === unitsTypeName;\r\n });\r\n if (!svc.selectedUnitsType)\r\n svc.selectedUnitsType = { name: unitsTypeName };\r\n }\r\n /**\r\n * Sets selected unit types if nothing is currently selected\r\n */\r\n svc.setSelectedUnitsIfEmpty = function (unitsTypeName) {\r\n if (svc.selectedUnitsType.name == null || svc.selectedUnitsType.name == '') {\r\n svc.setSelectedUnits(unitsTypeName);\r\n }\r\n }\r\n // updates values in the units drop down based on currently loaded account data\r\n svc.updateUnits = function() {\r\n svc.currentUnits = Config.getCurrentConsumptionUnits();\r\n svc.dropDownItems = $.map(svc.currentUnits, function(element, index) {\r\n return { name: index };\r\n });\r\n };\r\n svc.getSelectedUnitsTypeName = function(){\r\n return svc.selectedUnitsType ? svc.selectedUnitsType.name : '';\r\n }\r\n // set default units\r\n svc.updateUnits();\r\n /**\r\n * Get multiplier to convert given uom into currently selected uom.\r\n * @param {} uom source uom\r\n * @returns {} multiplier\r\n */\r\n svc.getCoefficient = function(uom) {\r\n var consumptionUnits = Config.getCurrentConsumptionUnits();\r\n var targetFraction = consumptionUnits[svc.selectedUnitsType.name];\r\n var sourceFraction = consumptionUnits[uom];\r\n var coefficient = targetFraction / sourceFraction;\r\n return coefficient;\r\n }\r\n return svc;\r\n });\n'use strict';\r\n// ReSharper disable once UndeclaredGlobalVariableUsing\r\nangular.module('utilliApp')\r\n .service('PropertyListService',\r\n [\r\n '$http', 'ModalServiceExt', '$timeout', '$state', '$q',\r\n// ReSharper disable InconsistentNaming\r\n function($http, ModalServiceExt, $timeout, $state, $q) {\r\n var _t = utilli._t;\r\n// ReSharper restore InconsistentNaming\r\n var svc = {};\r\n svc.updateProperties = function(data, existingPropertyList) {\r\n var areTherePropertiesInProgress = false;\r\n if (data) {\r\n _.each(data,\r\n function(p) {\r\n var existingProperty = _.find(existingPropertyList,\r\n function(ep) {\r\n return ep.Id === p.Id;\r\n });\r\n if (!existingProperty)\r\n return;\r\n existingProperty.Status = p.Status;\r\n existingProperty.IsSyncInProcess = p.IsSyncInProcess;\r\n existingProperty.DisplayedStatus = p.DisplayedStatus;\r\n existingProperty.EnergyStarScore = p.EnergyStarScore;\r\n existingProperty.CurrentConsumption = p.CurrentConsumption;\r\n\r\n if (existingProperty.EnergyStarScore == 0)\r\n {\r\n existingProperty.EnergyStarScore = 'N/A';\r\n }\r\n\r\n if (p.IsSyncInProcess) {\r\n areTherePropertiesInProgress = true;\r\n }\r\n });\r\n }\r\n return areTherePropertiesInProgress;\r\n };\r\n svc.getPropertyList = function(withoutDelegated) {\r\n var requestData = { withoutDelegated: withoutDelegated ? true : false };\r\n utilli.addUserName($state, requestData);\r\n return $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetPropertyList/',\r\n method: \"GET\",\r\n params: requestData\r\n });\r\n };\r\n svc.loadPropertyList = function ($scope, response) {\r\n if (svc.timeout) {\r\n $timeout.cancel(svc.timeout);\r\n }\r\n if (response.Data) {\r\n var areTherePropertiesInProgress = false;\r\n // ReSharper disable once UndeclaredGlobalVariableUsing\r\n _.each(response.Data,\r\n function(p) {\r\n if (p.IsSyncInProcess) {\r\n areTherePropertiesInProgress = true;\r\n }\r\n });\r\n $scope.propertyList = response.Data;\r\n if (areTherePropertiesInProgress) {\r\n svc.timeout = $timeout(function() {\r\n svc.reloadPropertylist($scope, $state.current.name);\r\n },\r\n utilli.propertyRefreshTimeout);\r\n }\r\n } else {\r\n $scope.propertyList = [];\r\n }\r\n }\r\n svc.refreshScore = function ($scope, property) {\r\n //Refresh score button should be always clickable GNIS-2303\r\n //if (property.isLoading)\r\n // return;\r\n property.isLoading = true;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/RefreshPropertyScore/',\r\n method: \"POST\",\r\n params: { propertyId: property.Id }\r\n })\r\n .then(ModalServiceExt.checkApiResponseError, ModalServiceExt.catchAjaxError)\r\n .then(function () {\r\n svc.reloadPropertylist($scope, $state.current.name);\r\n }, function (error) {\r\n if (error === \"PropertyIsNotCompleteError\") {\r\n // todo: add a link to the edit property page\r\n ModalServiceExt.showError(\"Please complete property creation process.\");\r\n }\r\n property.isLoading = false;\r\n });\r\n }\r\n svc.reloadPropertylist = function($scope, stateName) {\r\n // if the state is changed then stop updates\r\n if ($state.current.name !== stateName)\r\n return;\r\n svc.getPropertyList().success(function(response) {\r\n // ReSharper disable once VariableUsedInInnerScopeBeforeDeclared\r\n if (response.Data) {\r\n var areTherePropertiesInProgress =\r\n svc.updateProperties(response.Data, $scope.propertyList);\r\n if (areTherePropertiesInProgress) {\r\n svc.timeout = $timeout(function () {\r\n svc.reloadPropertylist($scope, stateName);\r\n },\r\n utilli.propertyRefreshTimeout);\r\n }\r\n } else {\r\n $scope.propertyList = [];\r\n }\r\n }).error(function(e) {\r\n // i don't want to show user a new error popup every 5 seconds\r\n console.log(e);\r\n });\r\n }\r\n\r\n return svc;\r\n }\r\n ]);\n'use strict';\r\n// ReSharper disable once UndeclaredGlobalVariableUsing\r\nangular.module('utilliApp')\r\n .service('PropertyService', ['$http', 'ModalServiceExt', '$timeout', '$state', 'usSpinnerService',\r\n// ReSharper disable InconsistentNaming\r\n function ($http, ModalServiceExt, $timeout, $state, usSpinnerService) {\r\n var _t = utilli._t;\r\n// ReSharper restore InconsistentNaming\r\n var svc = {};\r\n svc.updateProperty = function(freshProperty, existingProperty) {\r\n if (!freshProperty|| !existingProperty)\r\n return false;\r\n existingProperty.Status = freshProperty.Status;\r\n existingProperty.IsSyncInProcess = freshProperty.IsSyncInProcess;\r\n existingProperty.DisplayedStatus = freshProperty.DisplayedStatus;\r\n existingProperty.EnergyStarScore = freshProperty.EnergyStarScore;\r\n\r\n if (existingProperty.EnergyStarScore == 0)\r\n {\r\n existingProperty.EnergyStarScore = 'N/A';\r\n }\r\n\r\n localStorage.setItem('currentAggregation', JSON.stringify(existingProperty));\r\n return existingProperty.IsSyncInProcess;\r\n };\r\n svc.GetPropertyStatus = function (propertyId) {\r\n return $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetPropertyStatus/',\r\n method: \"GET\",\r\n params: { propertyId: propertyId }\r\n });\r\n };\r\n svc.goToDashboard = function(property, state) {\r\n if (property.MetersCount < Config.maxMetersOnStackedDashboard) {\r\n state.goMainLayout('PropertyStackedDashboard');\r\n } else {\r\n state.goMainLayout('PropertyBarDashboard');\r\n }\r\n }\r\n svc.deleteMeter = function (meters, clientUtilliId, callback) {\r\n var meter = null;\r\n meters.forEach(\r\n function (mtr) {\r\n if (mtr.clientUtilliId === clientUtilliId)\r\n {\r\n meter = mtr;\r\n }\r\n })\r\n //var meter = meters[index];\r\n // if it's not saved meter then just delete it\r\n if (meter.Id === 0) {\r\n meters.splice(meters.indexOf(meter), 1);\r\n return;\r\n }\r\n // if this is a saved meter then confirm\r\n ModalServiceExt.showYesNoMessage(\r\n _t('Delete meter'),\r\n _t('Are you sure you want to delete this meter?'),\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n var params = { meterId: meter.Id };\r\n utilli.addUserName($state, params);\r\n $http({\r\n method: \"POST\",\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/DeleteMeter/',\r\n params: params\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n meters.splice(meters.indexOf(meter), 1);\r\n if (callback)\r\n callback();\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n });\r\n }\r\n\r\n svc.verifyAllAddresses = function(propertyId, meters, callback) {\r\n ModalServiceExt.showYesNoMessage(\r\n _t('Verify all meters'),\r\n _t('Are you sure you want to verify all selected meters?'),\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n var selectedMeters = _.filter(meters, function (m) { return m.checked; });\r\n var selectedIds = _.map(selectedMeters, function(m) { return m.Id; });\r\n $http({\r\n method: \"POST\",\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/MassVerifyServiceAddress/',\r\n data: {\r\n PropertyId: propertyId,\r\n MeterIds: selectedIds,\r\n UserName: $state.params.userId\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (callback)\r\n callback();\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n });\r\n\r\n }\r\n\r\n svc.canMassVerifyServiceAddress = function(meters) {\r\n return _.some(meters, function (m) {\r\n return m.ErrorCode === utilli.pm.meterErrorCodes.serviceAddressMismatch\r\n && !m.HasMultipleAddresses;\r\n });\r\n }\r\n\r\n svc.deleteMeterWithoutConfirmation = function (meters, clientUtilliId, callback) {\r\n var meter = null;\r\n meters.forEach(\r\n function(mtr) {\r\n if (mtr.clientUtilliId === clientUtilliId) {\r\n meter = mtr;\r\n }\r\n });\r\n //var meter = meters[index];\r\n // if it's not saved meter then just delete it\r\n if (meter.Id === 0) {\r\n meters.splice(meters.indexOf(meter), 1);\r\n return;\r\n }\r\n\r\n var params = { meterId: meter.Id };\r\n utilli.addUserName($state, params);\r\n $http({\r\n method: \"POST\",\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/DeleteMeter/',\r\n params: params\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n meters.splice(meters.indexOf(meter), 1);\r\n if (callback)\r\n callback();\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n svc.refreshScore = function (property, reloadFinishCallback) {\r\n //Refresh score button should be always clickable GNIS-2303\r\n //if (property.IsSyncInProcess)\r\n // return;\r\n property.IsSyncInProcess = true;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/RefreshPropertyScore/',\r\n method: \"POST\",\r\n params: { propertyId: property.Id }\r\n })\r\n\r\n .then(ModalServiceExt.checkApiResponseError, ModalServiceExt.catchAjaxError)\r\n .then(function () {\r\n svc.reloadProperty(property, $state.current.name, reloadFinishCallback);\r\n }, function (error) {\r\n if (error === \"PropertyIsNotCompleteError\") {\r\n // todo: add a link to the edit property page\r\n ModalServiceExt.showError(\"Please complete property creation process.\");\r\n }\r\n property.IsSyncInProcess = false;\r\n });\r\n }\r\n /**\r\n * Initiates things that are necessary to automatically update property status.\r\n * @param {} property The property where status needs to be updated.\r\n * @param {} reloadFinishCallback The callback that is called once property refresh is \r\n * completed (status changes to Completed)\r\n * @returns {} void\r\n */\r\n svc.loadProperty = function (property, reloadFinishCallback) {\r\n if (svc.timeout) {\r\n $timeout.cancel(svc.timeout);\r\n }\r\n if (property.IsSyncInProcess) {\r\n svc.timeout = $timeout(function() {\r\n svc.reloadProperty(property, $state.current.name, reloadFinishCallback);\r\n },\r\n utilli.propertyRefreshTimeout);\r\n }\r\n }\r\n svc.reloadProperty = function (property, stateName, reloadFinishCallback) {\r\n // if the state is changed then stop updates\r\n if ($state.current.name !== stateName)\r\n return;\r\n svc.GetPropertyStatus(property.Id).success(function (response) {\r\n // ReSharper disable once VariableUsedInInnerScopeBeforeDeclared\r\n if (response.Data) {\r\n svc.updateProperty(response.Data, property);\r\n if (response.Data.IsSyncInProcess) {\r\n svc.timeout = $timeout(function() {\r\n svc.reloadProperty(property, stateName, reloadFinishCallback);\r\n },\r\n utilli.propertyRefreshTimeout);\r\n } else {\r\n // if update is finished then call calback (to reload the chart on the dashboard)\r\n if (reloadFinishCallback) {\r\n reloadFinishCallback();\r\n }\r\n }\r\n }\r\n }).error(function(e) {\r\n // i don't want to show user a new error popup every 5 seconds\r\n console.log(e);\r\n });\r\n }\r\n return svc;\r\n }\r\n ]);\n'use strict';\r\nangular.module('utilliApp').service('PaymentVerificationService', ['CommonDataService', 'ModalServiceExt',\r\n 'usSpinnerService',\r\n function (CommonDataService, ModalServiceExt, usSpinnerService) {\r\n var _t = utilli._t;\r\n var svc = {};\r\n /** checks that payment amount is not beyond max limit */\r\n \r\n // use verifyPaymentInfoNew instead of verifyPaymentInfo, it give the more understanding \r\n // when we need to use usSpinnerService\r\n svc.verifyPaymentInfo = function (amount, callback) {\r\n CommonDataService.getCommonData().then(function (data) {\r\n if (amount > data.MaxPaymentAmount) {\r\n usSpinnerService.stop('spinner-1');\r\n if (data.CanConfirmMaxPaymentAmount) {\r\n ModalServiceExt.showYesNoMessage(_t(\"Please Confirm\"), data.MaxPaymentAmountWarningText, callback);\r\n }\r\n else {\r\n ModalServiceExt.showError(data.MaxPaymentAmountErrorText);\r\n }\r\n }\r\n else {\r\n callback();\r\n }\r\n });\r\n };\r\n // use this function instead of verifyPaymentInfo, it give the more understanding \r\n // when we need to use usSpinnerService\r\n svc.verifyPaymentInfoNew = function (commonData, amount, callback) {\r\n if (amount > commonData.MaxPaymentAmount) {\r\n if (commonData.CanConfirmMaxPaymentAmount) {\r\n ModalServiceExt.showYesNoMessage(_t(\"Please Confirm\"), \r\n commonData.MaxPaymentAmountWarningText, callback);\r\n \r\n usSpinnerService.stop('spinner-1');\r\n }\r\n else {\r\n ModalServiceExt.showError(commonData.MaxPaymentAmountErrorText);\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }\r\n else {\r\n callback()\r\n }\r\n };\r\n return svc;\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('NoConnectionController', ['$scope', '$timeout', '$sce', function ($scope, $timeout, $sce) {\r\n\r\n $scope.buttonMessage = 'Try to connect again';\r\n $scope.busy = false;\r\n\r\n $scope.getLogo = function () {\r\n return $sce.trustAsUrl(utilli.logoBase64);\r\n }\r\n\r\n $scope.getLogoText = function () {\r\n if (DeploymentSettings.providersGroupShortName === 'wgl'\r\n || DeploymentSettings.providersGroupShortName === 'wglcx')\r\n return '';\r\n\r\n return \"Utilli\";\r\n }\r\n\r\n $scope.getText = function () {\r\n if (DeploymentSettings.providersGroupShortName === 'wgl')\r\n return 'WGL Property Manager by Utilli does not work without internet connection. Restore your connection in order to continue.';\r\n\r\n return \"This website does not work without internet connection\";\r\n }\r\n\r\n $scope.tryPing = function () {\r\n $scope.busy = true;\r\n $scope.buttonMessage = 'Checking connection...'\r\n $.ajax({\r\n url: DeploymentSettings.providersServiceUrl + 'Version/Ping',\r\n method: 'GET'\r\n }).done(function (d) {\r\n utilli.setWindowLocation(window.location.origin + window.location.pathname);\r\n }).fail(function (e) {\r\n // timeout here to have time to display 'Checking connection...' to user. \r\n // Because it is confused for users to press button without some visual response to their actions.\r\n $timeout(function () {\r\n $scope.busy = false;\r\n $scope.buttonMessage = 'Try to connect again';\r\n console.log(e);\r\n }, 1000);\r\n });\r\n }\r\n}]);\r\n\n'use strict';\r\nangular.module('utilliApp').controller('MaintenanceController', ['$scope', '$http', '$state', '$q', 'usSpinnerService', \r\n '$window', '$timeout', 'ServiceProvidersService', '$sce', 'SmartPayLayoutService', function ($scope, $http, $state, \r\n $q, usSpinnerService, $window, $timeout, ServiceProvidersService, $sce, SmartPayLayoutService) {\r\n SmartPayLayoutService.hideNoAdditionalCharge = true;\r\n var intervalId = -1;\r\n $scope.isLoading = true;\r\n initProviders();\r\n\r\n function getProviderNamesFor(shortGroupName) {\r\n var result = [];\r\n for (var providerName in Config.providers) {\r\n var shortName = Config.providers[providerName].providersGroupShortName;\r\n if(shortName && shortName == shortGroupName)\r\n result.push(providerName);\r\n }\r\n return result;\r\n } \r\n \r\n function initProviders() {\r\n if(!isMobileOrRipple()){\r\n getContactPhones(DeploymentSettings.currentServiceProvider);\r\n return;\r\n }\r\n $scope.providers = getProviderNamesFor(DeploymentSettings.providersGroupShortName);\r\n if($scope.providers.length == 1)\r\n getContactPhones($scope.providers[0]);\r\n }\r\n\r\n $timeout(function () {//todo: refactor it - now $timeout is used to the spinner can work\r\n initPing();\r\n }, 0);\r\n\r\n function initPing() {\r\n // set checking interval 1 minute.\r\n intervalId = setInterval($scope.check, 60000);\r\n ping();\r\n }\r\n\r\n $scope.providerChanged = function () { \r\n if($scope.serviceProvider){\r\n getContactPhones($scope.serviceProvider);\r\n return;\r\n }\r\n $scope.contactsInfo = null;\r\n }\r\n\r\n function ping() {\r\n $scope.check();\r\n }\r\n\r\n function getContactPhones(serviceProvider) {\r\n usSpinnerService.spin('spinner-1');\r\n var url = DeploymentSettings.providersServiceUrl\r\n + 'StaticData/GetContactPhonesHtml/?serviceProvider='\r\n + serviceProvider;\r\n $http({\r\n url: url,\r\n notCancelled: true\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.contactsInfo = $sce.trustAsHtml(data);\r\n $scope.phoneLoaded = true;\r\n $scope.hasContacts = true;\r\n $scope.isLoading = false;\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.failedAttempt = true;\r\n $scope.isLoading = false;\r\n $scope.hasContacts = false;\r\n });\r\n }\r\n\r\n function getPayUrl(){\r\n return localStorage.getItem('PayUrl');\r\n }\r\n\r\n $scope.pay = function(){\r\n $window.location = getPayUrl();\r\n //$state.go('SmartPayLayout.SmartPay');\r\n }\r\n\r\n $scope.check = function () {\r\n if ($state.current.name !== \"SmartPayLayout.Maintenance\" && intervalId != -1){\r\n clearInterval(intervalId);\r\n return;\r\n }\r\n var url = localStorage.getItem('ApiUrl');\r\n if (!url && isMobileOrRipple()) {\r\n if (intervalId != -1)\r\n clearInterval(intervalId);\r\n // if we are running in a phone then we might not have ApiUrl because the user hasn't ever login yet.\r\n // hence we need to use providersApiUrl to check for maintenance. but providers web api we can't put \r\n // on maintenance using AppOffline.htm approach because we need it to be working to get support phone\r\n // number. hence we change compatible version to '-2' in UtilliConfig.json for providers web api\r\n // and catch it here.\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http.get(DeploymentSettings.providersServiceUrl + \"Version/IsProvidersWebApiOnMaintenance\")\r\n .then(function (result) {\r\n if (!result.data){\r\n //$state.goToSignIn();\r\n $window.history.back();\r\n }\r\n }).fixedFinally(function() {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return;\r\n }\r\n else if (url) {\r\n usSpinnerService.spin('spinner-1');\r\n makeChecking(url)\r\n .then(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n else {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProviderApiUrl()\r\n .then(function (apiUrl) {\r\n usSpinnerService.stop('spinner-1');\r\n return makeChecking(apiUrl);\r\n })\r\n .then(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n\r\n function setIsPaymentAvailable(isMaintenanceOn){\r\n var payUrl = getPayUrl();\r\n var value = isMaintenanceOn && payUrl;\r\n $timeout(function () {\r\n $scope.isPaymentAvailable = value;\r\n $scope.$apply();\r\n }, 0);\r\n }\r\n\r\n function makeChecking(apiUrl) {\r\n // use jquery instead of $http to not allow interceptors to catch 503 response and loop redirect to maintenance\r\n return $.ajax({\r\n url: apiUrl + 'api/Admin/GetMaintenanceStatus',\r\n method: 'GET'\r\n }).then(function(response){\r\n if (response.Data.IsMaintenanceOn) {\r\n setIsPaymentAvailable(true);\r\n return;\r\n }\r\n if (intervalId != -1)\r\n clearInterval(intervalId);\r\n var token = localStorage.getItem('SecurityToken');\r\n var account = localStorage.getItem('CurrentAccountNumber');\r\n if (!token || !account || utilli.isWglcx()) {\r\n $window.history.back();\r\n }\r\n if (!utilli.isPropertyManagerApp())\r\n $state.goMainLayout('Dashboard');\r\n else\r\n $state.goMainLayout('PropertyStackedDashboard');\r\n }, function(error){\r\n setIsPaymentAvailable(false);\r\n console.error(error);\r\n });\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('LanguagesController', ['$scope', '$http', '$state', 'usSpinnerService', 'LeftMenuService',\r\n 'CommonHeaderService', '$resource', 'ModalServiceExt', '$window', 'CommonDataService',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, $http, $state, usSpinnerService, LeftMenuService, CommonHeaderService, $resource,\r\n ModalServiceExt, $window, CommonDataService) {\r\n// ReSharper restore InconsistentNaming\r\n if (!utilli.isLanguagePackEnabled()) {\r\n $window.history.back();\r\n return;\r\n }\r\n\r\n if (utilli.isAuthorized()) {\r\n LeftMenuService.setCurrentTab('Profile');\r\n }\r\n \r\n CommonHeaderService.setUpBackButton($scope._t('Languages'), true);\r\n\r\n $scope.languages = utilli.languages[DeploymentSettings.providersGroupShortName.toLowerCase()];\r\n\r\n $scope.selectLanguage = function (index) {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n try {\r\n var language = $scope.languages[index].abbreviation;\r\n utilli.changeLanguage($resource, language, saveLanguage);\r\n CommonDataService.refresh();\r\n }\r\n catch (e) {\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }\r\n\r\n function saveLanguage(language) {\r\n if (!utilli.isAuthorized()) {\r\n usSpinnerService.stop('spinner-1');\r\n back();\r\n return;\r\n }\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/Profile/SaveLanguage',\r\n data: { 'Language': language, 'UserName': '' }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n back();\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function back() {\r\n // if Languages page is opened by a direct link in chrome then $window.history.length is 2\r\n // chrome starts counter from 1 and the first page is the empty page\r\n if ($window.history.length > 2) {\r\n $window.history.back();\r\n } else {\r\n $state.goToWelcome();\r\n }\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('SubscriptionController', ['$scope', '$http', '$state', '$stateParams', 'usSpinnerService',\r\n 'CommonDataService', 'ServiceProvidersService', 'ModalServiceExt',\r\nfunction ($scope, $http, $state, $stateParams, usSpinnerService, CommonDataService, ServiceProvidersService,\r\n ModalServiceExt) {\r\n var _t = $scope._t;\r\n\r\n //Unsubscribe or change your email preferences.\r\n\r\n $scope.isDataLoaded = false;\r\n\r\n $scope.email = _t('loading...');\r\n $scope.accountNumber = _t('loading...');\r\n $scope.loadingError = _t('loading...');\r\n $scope.wasSubscribed = false;\r\n\r\n var apiUrl = '';\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProvider(DeploymentSettings.currentServiceProvider)\r\n .then(function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n apiUrl = providerData.ApiUrl;\r\n initPage();\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n $scope.loadingError = _t(\"Service is unavailable now. Try again later.\");\r\n });\r\n\r\n $scope.applyChanges = function () { \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + ($scope.wasSubscribed \r\n ? 'api/Notification/Unsubscribe/'\r\n : 'api/Notification/Subscribe/'),\r\n method: \"POST\",\r\n data: { '': $state.params.token }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function() {\r\n $scope.operationResult = $scope.wasSubscribed \r\n ? $scope._t(\"You have successfully unsubscribed.\")\r\n : $scope._t(\"You have successfully subscribed.\");\r\n $scope.wasSubscribed = !$scope.wasSubscribed;\r\n });\r\n }).error(function () {\r\n ModalServiceExt.showError(_t(\"Service is unavailable now. Try again later.\"));\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.back = function () {\r\n $scope.operationResult = null;\r\n }\r\n\r\n function initPage() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/Notification/ValidateSubscriptionToken/',\r\n method: \"POST\",\r\n data: { '': $state.params.token }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n $scope.loadingError = _t(\"Service is unavailable now. Try again later.\");\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n $scope.loadingError = response.Errors[0];\r\n }\r\n else {\r\n $scope.email = response.Data.Email;\r\n $scope.accountNumber = response.Data.AccountNumber;\r\n $scope.wasSubscribed = response.Data.Subscribed;\r\n $scope.isDataLoaded = true;\r\n $scope.loadingError = false;\r\n }\r\n \r\n }).error(function () {\r\n $scope.loadingError = _t(\"Service is unavailable now. Try again later.\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n}]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('VerifyEmailController', ['$scope', '$http', '$state', 'usSpinnerService',\r\n 'ServiceProvidersService',\r\nfunction ($scope, $http, $state, usSpinnerService, ServiceProvidersService) {\r\n var _t = $scope._t;\r\n\r\n $scope.isDataLoaded = false;\r\n $scope.loadingError = _t('loading...');\r\n\r\n var apiUrl = '';\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProvider(DeploymentSettings.currentServiceProvider)\r\n .then(function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n apiUrl = providerData.ApiUrl;\r\n initPage();\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n $scope.loadingError = _t(\"Service is unavailable now. Try again later.\");\r\n });\r\n \r\n $scope.back = function () {\r\n $scope.operationResult = null;\r\n }\r\n\r\n function initPage() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/CommunicationTypes/VerifyEmail/',\r\n method: \"POST\",\r\n data: { '': $state.params.token }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response == undefined || response.HasErrors == undefined) {\r\n $scope.loadingError = _t(\"Service is unavailable now. Try again later.\");\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n $scope.loadingError = response.Errors[0];\r\n }\r\n else {\r\n $scope.isDataLoaded = true;\r\n $scope.loadingError = false;\r\n }\r\n \r\n }).error(function () {\r\n $scope.loadingError = _t(\"Service is unavailable now. Try again later.\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n}]);\r\n\n'use strict';\r\n\r\nangular.module('utilliApp').controller('ViewBillAccessController', [\"$scope\", \"$http\", \"$state\", \"$stateParams\", \"usSpinnerService\", \"ServiceProvidersService\", \"ModalServiceExt\", \"$timeout\", \"SmartPayLayoutService\", function ($scope, $http, $state, $stateParams, \r\n usSpinnerService, ServiceProvidersService, ModalServiceExt, $timeout, SmartPayLayoutService) {\r\n var _t = $scope._t;\r\n SmartPayLayoutService.hideNoAdditionalCharge = true;\r\n $scope.step = 'loading';\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n $scope.isPhoneNumberPreferred = true;\r\n $scope.notUsePhoneNumber = false;\r\n utilli.savePayUrl($state.params.token);\r\n\r\n $scope.isPhoneNumberVerificationStep = function(){\r\n return $scope.step == 'phone-verification';\r\n }\r\n\r\n $scope.sendSms = function(){\r\n $scope.phoneNumberVerificationForm.$submitted = true;\r\n if (!$scope.phoneNumberVerificationForm.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + '/api/SmartPay/SendPhoneNumberVerificationSms',\r\n data: {\r\n phoneNumber: $scope.phoneNumber,\r\n token: $state.params.token\r\n }\r\n })\r\n .apiThen(function(data){\r\n $scope.smsCodeSent = true;\r\n $scope.phoneNumberVerificationForm.$setPristine();//reset submitted flag\r\n startSmsConfirmationTimer(data ? data.RemainedTime : null);\r\n $scope.sendSmsSuccessMessage = $scope._t(\"SMS verification code has been sent to your mobile number %phoneNumber%.\"\r\n + \" Please use the code to verify your phone number.\")\r\n .replace('%phoneNumber%', utilli.getMaskedPhoneNumberValue($scope.phoneNumber));\r\n }, ModalServiceExt)\r\n .fixedFinally(function(error){\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.confirmPhone = function () {\r\n $scope.phoneNumberVerificationForm.$submitted = true;\r\n if (!$scope.phoneNumberVerificationForm.$valid)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/WglEbill/ConfirmPhoneNumber/',\r\n method: \"POST\",\r\n data: {\r\n token: $stateParams.token,\r\n phoneNumber: $scope.phoneNumber,\r\n confirmationCode: $scope.verificationCode,\r\n consent: $scope.isPhoneNumberPreferred,\r\n name: $scope.name,\r\n houseNumber: $scope.houseNumber,\r\n zip: $scope.zip\r\n }\r\n }).apiThen(function (hasAccess) {\r\n $state.go(\"ViewBill\", {\r\n token: $stateParams.token,\r\n emailId: $stateParams.emailId\r\n });\r\n }, ModalServiceExt).fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function startSmsConfirmationTimer(remainedTime) {\r\n if (remainedTime)\r\n $scope.timeout = remainedTime;\r\n else\r\n $scope.timeout = 31;\r\n\r\n tickTimer();\r\n }\r\n\r\n var tickTimer = function () {\r\n if ($scope.timeout == 0) {\r\n $scope.showTimer = false;\r\n return;\r\n }\r\n $scope.showTimer = true;\r\n $scope.timeout--;\r\n $timeout(tickTimer, 1000);\r\n var secInMinute = 60;\r\n var seconds = '' + ($scope.timeout % secInMinute); //60 seconds in 1 minute\r\n if (seconds.length < 2) {\r\n seconds = '0' + seconds;\r\n }\r\n var minutes = '' + Math.floor($scope.timeout / secInMinute);\r\n if (minutes.length < 1) {\r\n minutes = '0';\r\n }\r\n $scope.timeoutStr = _t('Resend code in %timeout%').replace('%timeout%', minutes + ':' + seconds);\r\n }\r\n\r\n $scope.next = function (){ \r\n $scope.billAccessForm.$submitted = true;\r\n if (!$scope.billAccessForm.$valid)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/WglEbill/VerifyBillAccess/',\r\n method: \"POST\",\r\n data: { \r\n token: $stateParams.token,\r\n name: $scope.name,\r\n phoneNumber: $scope.phoneNumber,\r\n houseNumber: $scope.houseNumber,\r\n zip: $scope.zip\r\n }\r\n }).apiThen(function (hasAccess) {\r\n if (hasAccess) {\r\n if ($scope.zip) {\r\n $scope.step = 'phone-verification';\r\n }\r\n else {\r\n $state.go(\"ViewBill\", {\r\n token: $stateParams.token,\r\n emailId: $stateParams.emailId\r\n });\r\n }\r\n }\r\n else {\r\n if ($scope.zip){\r\n ModalServiceExt.showError(\"We could not authenticate the information entered. Re-enter valid\"\r\n + \" information to proceed. Please note that First Name/Last Name/Name of Organization,\" \r\n + \" House Number, Zip Code must match the information on record with Washington Gas.\"\r\n + \" For assistance, call 844-WASHGAS (844-927-4427).\");\r\n } else {\r\n ModalServiceExt.showError(\"We could not authenticate the information entered. Re-enter valid\"\r\n + \" information to proceed. Please note that telephone/mobile number and house number must\"\r\n + \" match the information on record with Washington Gas.\"\r\n + \" For assistance, call 844-WASHGAS (844-927-4427).\");\r\n }\r\n window.ga('send', {\r\n hitType: 'event',\r\n eventCategory: 'bill_view_access',\r\n eventAction: 'authorization_failure',\r\n eventLabel: ''\r\n });\r\n }\r\n }, ModalServiceExt).fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n var apiUrl = '';\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProvider(DeploymentSettings.currentServiceProvider)\r\n .then(function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n apiUrl = providerData.ApiUrl;\r\n utilli.resolveServiceProviderApiDeffered(providerData.ApiUrl);\r\n initPage();\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.loadingError = _t(\"Service is unavailable now. Try again later.\");\r\n });\r\n\r\n function initPage() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/WglEbill/HasUserViewBillAccess/',\r\n method: \"GET\",\r\n params: { token: $state.params.token }\r\n }).apiThen(function (data) {\r\n if (data.HasUserAccess) {\r\n $state.go(\"ViewBill\", {\r\n token: $stateParams.token,\r\n emailId: $stateParams.emailId\r\n });\r\n return;\r\n }\r\n if (!data.HasHouseNumber) {\r\n $scope.step = 'missing-data';\r\n return;\r\n }\r\n $scope.step = 'verification';\r\n $scope.hasPhoneNumber = data.HasPhoneNumber;\r\n }, ModalServiceExt).fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.getTopWording = function(){\r\n return $scope.hasPhoneNumber\r\n ? _t('To ensure privacy of your account, we need to perform a one-time validation. ' +\r\n 'Please enter house number of the property and either telephone or mobile phone number on record ' + \r\n 'with Washington Gas to continue. Also provide the acknowledgment below.')\r\n : _t('To ensure privacy of your account, we need to perform a one-time validation. ' +\r\n 'Please enter first name or last name, or name of organization, house number of service address ' +\r\n 'and zip code of service address on record with Washington Gas to continue. ' +\r\n 'Also provide the acknowledgment below.');\r\n }\r\n\r\n $scope.confirmWithoutPhoneNumber = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/WglEbill/ConfirmWithoutMobileNumber/',\r\n method: \"POST\",\r\n data: {\r\n token: $stateParams.token,\r\n phoneNumber: $scope.phoneNumber,\r\n consent: $scope.isPhoneNumberPreferred,\r\n name: $scope.name,\r\n houseNumber: $scope.houseNumber,\r\n zip: $scope.zip\r\n }\r\n }).apiThen(function () {\r\n $state.go(\"ViewBill\", {\r\n token: $stateParams.token,\r\n emailId: $stateParams.emailId\r\n });\r\n }, ModalServiceExt).fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n}]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ViewBillController', [\"$scope\", \"$state\", \"$http\", \"usSpinnerService\", \"$stateParams\", \"ModalServiceExt\", \"ServiceProvidersService\", \"$rootScope\", function ($scope, $state, $http, usSpinnerService, $stateParams, ModalServiceExt,\r\n ServiceProvidersService, $rootScope) {\r\n\r\n $scope.isWebPushBellBoxVisible = function () {\r\n var result = (utilli.isFirefox && Notification.permission == \"default\")\r\n || (utilli.isSafari \r\n && 'safari' in window \r\n && 'pushNotification' in window.safari\r\n && utilli.getSafariPushNotificationPermissionData().permission === 'default');\r\n \r\n return result;\r\n };\r\n \r\n $rootScope.getBodyClass = function () {\r\n return { 'smart-pay': false };\r\n }\r\n\r\n var payload = utilli.getPayload($stateParams.token);\r\n $scope.isPayNowVisible = payload.IsPayNowVisible;\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.invoiceData = {\r\n contractAccountNumber: payload.AccountNumber,\r\n invoiceNumber: payload.InvoiceNumber\r\n };\r\n\r\n var apiUrl = '';\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProvider(DeploymentSettings.currentServiceProvider)\r\n .then(function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n apiUrl = providerData.ApiUrl;\r\n utilli.resolveServiceProviderApiDeffered(providerData.ApiUrl);\r\n initPage();\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n ModalServiceExt.showError($scope._t(\"Service is unavailable now. Try again later.\"));\r\n });\r\n\r\n $scope.payNow = function () {\r\n $state.go(\"SmartPayLayout.SmartPay\", { \r\n contractAccountNumber: $scope.invoiceData.AccountNumber,\r\n invoiceNumber: $scope.invoiceData.InvoiceNumber,\r\n token: $stateParams.token,\r\n emailId: $stateParams.emailId\r\n });\r\n }\r\n\r\n function showEbillEnroll() {\r\n var lastEbillEnrollMarketingMessageNum = localStorage.getItem('lastEbillEnrollMarketingMessageNum');\r\n if(lastEbillEnrollMarketingMessageNum) {\r\n lastEbillEnrollMarketingMessageNum++;\r\n if(lastEbillEnrollMarketingMessageNum > 4) {\r\n lastEbillEnrollMarketingMessageNum = 1;\r\n }\r\n }\r\n else {\r\n lastEbillEnrollMarketingMessageNum = 1;\r\n }\r\n localStorage.setItem(\"lastEbillEnrollMarketingMessageNum\", lastEbillEnrollMarketingMessageNum);\r\n\r\n ModalServiceExt.showYesNoMessage('','',\r\n function () {\r\n var url = $state.href('EnrollEBillAfterNotification', \r\n { \r\n token: $stateParams.token\r\n });\r\n window.open(url,'_blank');\r\n },\r\n null, true, null, lastEbillEnrollMarketingMessageNum\r\n );\r\n }\r\n\r\n function initPage() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/WglEBill/HasUserViewBillAccess/',\r\n method: \"GET\",\r\n params: { \r\n token: $stateParams.token,\r\n withInvoiceData: true\r\n }\r\n }).success(function (response) {\r\n if (response == undefined || response.HasErrors == undefined || !response.Data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo($scope._t(\"Service is unavailable now. Try again later.\"));\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(response.Errors[0]);\r\n }\r\n else {\r\n if (!response.Data.HasUserAccess){\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo($scope._t(\"No authorization to view bill.\"));\r\n return;\r\n }\r\n if (response.Data.NoPdfMessage) {\r\n $scope.noPdfMessage = response.Data.NoPdfMessage;\r\n usSpinnerService.stop('spinner-1');\r\n } else {\r\n initIFrame(response.Data.BillPdfUrl);\r\n }\r\n $scope.invoiceData = response.Data.InvoiceData;\r\n $scope.loadingError = false;\r\n\r\n if(response.Data.ShowEnrollInEbill) {\r\n usSpinnerService.stop('spinner-1');\r\n showEbillEnroll();\r\n }\r\n }\r\n \r\n }).error(function () {\r\n ModalServiceExt.showError($scope._t(\"Service is unavailable now. Try again later.\"));\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function initIFrame (billUrl) {\r\n var url = utilli.isMobileBrowserNotCordova()\r\n ? utilli.getRootUrl() + '/pdf/web/viewer.html?file=' + encodeURIComponent(billUrl)\r\n : billUrl;\r\n var iframe = $('