{"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\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\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 getMaskedPhoneNumberValue(rawValue) {\r\n var input = $('').val(rawValue);\r\n input.mask(Config.phoneNumberMask);\r\n return input.val();\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.toString();\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.roles = {\r\n Administrator: 'Administrator',\r\n Agent: 'Agent',\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}\r\n\r\nutilli.scrollTop = function() {\r\n $('.mainPageScroll').scrollTop(0);\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.getCurrentDateForDatePicker = function() {\r\n var date = new Date();\r\n var day = date.getDate();\r\n var month = date.getMonth() + 1;\r\n var result = month + '/' + day + '/' + date.getFullYear();\r\n return result;\r\n};\r\n\r\nutilli.clearLocalStorage = function () {\r\n localStorage.removeItem('ApiUrl');\r\n localStorage.removeItem('ServiceProviderName');\r\n localStorage.removeItem('CurrentAccountNumber');\r\n localStorage.removeItem('BusinessPartner');\r\n localStorage.removeItem('current_user');\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.userName = utilli.isAdmin ? state.params.userId :\r\n (params.userName ? params.userName : '');\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\n/* Retuns a url to our Api with security token.\r\n* @param urlPath - relative path to our api\r\n* @param params - query parameters\r\n*/\r\nutilli.getUrlWithToken = function(urlPath, params) {\r\n var url = localStorage.getItem('ApiUrl') + urlPath;\r\n var tokenParam = 'token=' + localStorage.getItem('SecurityToken');\r\n if (params) {\r\n url += '?' + $.param(params) + '&' + tokenParam;\r\n return url;\r\n }\r\n else {\r\n url += '?' + tokenParam;\r\n }\r\n return url;\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\nutilli.isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\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\r\n setTimeout(function(){ document.location.href = url; }, 1);\r\n }\r\n else {\r\n document.location.href = url;\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 = window.location.origin + window.location.pathname + 'Admin/#/';\r\n utilli.setWindowLocation(adminUrl);\r\n }\r\n var token = localStorage.getItem('SecurityToken');\r\n if (token) {\r\n if (utilli.hasAdminOrCsrRole(token)) {\r\n // check if this is the customer view\r\n if (utilli.hasPropertyManagerRole()) {\r\n $state.goMainLayout('PropertyList');\r\n return;\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\r\n $state.goMainLayout('Dashboard');\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nutilli.hasAgentRole = 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.Agent;\r\n });\r\n\r\n return result;\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 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.DataExporter;\r\n });\r\n\r\n return result;\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 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.CSRAdmin;\r\n });\r\n\r\n return result;\r\n};\r\n\r\nutilli.hasSuperAdminRole = 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.Administrator;\r\n });\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 var json = atob(encoded);\r\n var payload = JSON.parse(json);\r\n return payload;\r\n}\r\n\r\n/* returns phone number that starts with 1 and has 11 digits.\r\n* @param maskPhoneNumber - 10 digit 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 (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\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';\r\n if (utilli.isAdmin)\r\n filePath = '../' + filePath;\r\n resource(filePath).get(function (data) {\r\n utilli.localizationDictionary = data;\r\n localStorage.setItem('language', language);\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\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: 'Русский (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: 'Русский (Russian)', abbreviation: 'ru' }\r\n ],\r\n\r\n \"hc\": [\r\n { name: 'English', abbreviation: 'en' }\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 * 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 * 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 && DeploymentSettings.providersGroupShortName.toUpperCase() === 'WGL';\r\n}\r\n\r\nutilli.ajustPhoneNumber = 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.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}\n$(function() {\r\n var allInputCssSelectors = 'input[type=\"text\"],input[type=\"number\"],input[type=\"password\"],input[type=\"email\"],input[type=\"tel\"], textarea';\r\n var allInputAndSelectCssSelectors = allInputCssSelectors + ', select';\r\n if (isAndroid()) {\r\n $(document).on('focus', allInputCssSelectors, fixHeight);\r\n $(document).on('focusout', allInputCssSelectors, resetHeightFix);\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\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() > 6) {\r\n $(document).on('focus', allInputAndSelectCssSelectors, function () {\r\n applyTopMenuFix();\r\n });\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 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 // 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(getHeigthKeyboardPlace());\r\n // scroll current element to the top of the page\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 getHeigthKeyboardPlace() {\r\n if (isLandscape())\r\n return $('html').height() * 0.6;\r\n if (isPortrait())\r\n return $('html').height() * 0.5;\r\n return 1;\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\n'use strict';\r\n/* Global configuration settings */\r\nif (!window.Config) {\r\n window.Config =\r\n {\r\n version: \"0.3.0\",\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 Gas: { 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 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: true,\r\n\r\n maxMetersOnStackedDashboard: 15,\r\n wglProviderName: \"Wgl\",\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\": true,\r\n \"EnableLanguagePack\": true,\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 \"EnableLanguagePack\": true,\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 \"EnableLanguagePack\": true,\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 \"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 \"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 \"EnableLanguagePack\": true,\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\": false,\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.UtilliMobileGasNatural\",\r\n iOs: \"https://itunes.apple.com/us/app/utilli-mobile/id1076673730\",\r\n winPhone: \"https://www.microsoft.com/en-us/store/apps/utilli-mobile/9nblggh5k7fw\"\r\n }\r\n \r\n };\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;\n var date = dateString.split(\"/\");\r\n // month in JS is index in array of 12 monthes. 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};\n\nString.prototype.getPositiveAmount = function () {\r\n var amountString = this;\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};\n'use strict';\r\nvar provide;\r\nangular.module('utilliApp', ['credit-cards', 'infinite-scroll',\r\n 'angularSpinner', 'angularModalService', 'ngSanitize', 'ngIOS9UIWebViewPatch',\r\n 'commonServices', 'ui.router', 'kendo.directives', 'ct.ui.router.extras', 'ui.mask',\r\n 'ui.bootstrap', 'ngResource'\r\n])\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.params['token'] = 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 isNoConnectionResponse(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 tryPing(fnCallback) {\r\n $.ajax({\r\n url: DeploymentSettings.providersServiceUrl.replace('api/', '') + 'Sms/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\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 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 have to 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('Your session has expired. You have to login again 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 var currentState = stateService.current.name;\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. It's required to refresh to continue.\"), \r\n function () {\r\n var state = $injector.get('$state');\r\n if (isMobileOrRipple()) {\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.go('Maintenance');\r\n return response;\r\n }\r\n\r\n if(isNoConnectionResponse(response))\r\n {\r\n tryPing(function () {\r\n var usSpinnerService = $injector.get('usSpinnerService');\r\n usSpinnerService.stop('spinner-1');\r\n stateService.go('NoConnection');\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 function ($compileProvider, $stateProvider, $urlRouterProvider, $stickyStateProvider, $httpProvider) {\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 $stateProvider.state('MainLayout.' + stateName, {\r\n url: '/' + stateName,\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: '/Step1/?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.Step2', {\r\n url: '/Step2/?from',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/Step2.html',\r\n controller: 'ForgotPasswordByEmailStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPasswordByEmail.Success', {\r\n url: '/Success',\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('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']);\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']);\r\n registerStateWithCommonHeader('Avatars', ['forAgent', 'forPropertyManager']);\r\n registerStateWithCommonHeader('OutageCenter');\r\n registerStateWithCommonHeader('OutageMap');\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 //function registerOutageReportChildView(state) {\r\n // $stateProvider.state('MainLayout.ReportOutage.' + state, {\r\n // url: '/' + state,\r\n // views: {\r\n // \"outage-location\": {\r\n // templateUrl: 'Pages/ReportOutage/' + state + '/' + state + '.html',\r\n // controller: state + 'Controller'\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\r\n //registerOutageReportChildView('ServiceAddress');\r\n //registerOutageReportChildView('NearbyAddress');\r\n //registerOutageReportChildView('NearbyCrossStreet');\r\n //registerOutageReportChildView('MyLocation');\r\n\r\n //function registerOpenOutageReportChildView(state) {\r\n // $stateProvider.state('MainLayout.OpenOutageReport.' + state, {\r\n // url: '/' + state,\r\n // views: {\r\n // \"outage-location\": {\r\n // templateUrl: 'Pages/ReportOutage/' + state + '/' + state + '.html',\r\n // controller: state + 'Controller'\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\r\n //registerOpenOutageReportChildView('ServiceAddress');\r\n //registerOpenOutageReportChildView('NearbyAddress');\r\n //registerOpenOutageReportChildView('NearbyCrossStreet');\r\n //registerOpenOutageReportChildView('MyLocation');\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 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('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('BulkMetersInput');\r\n registerAddPropertyRoute('FailedMeters', ['topMeter']);\r\n registerAddPropertyRoute('Authorization');\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\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 DeploymentSettings.currentServiceProvider === Config.wglProviderName ? '/WelcomeMain/?from' : '/?from';\r\n }\r\n function registerWelcomeRoutes() {\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 DeploymentSettings.currentServiceProvider == Config.wglProviderName ? '/?from' : '/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\r\n registerAgentsRoutes();\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 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 $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 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',\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('Maintenance', {\r\n url: '/Maintenance',\r\n views: {\r\n 'body-view': {\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 // Quick Pay\r\n // Quick Pay on Welcome\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 // Quick Pay standalone\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',\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 $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.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 $provide.decorator('$http', [\"$delegate\", function ($delegate) {\r\n var $http = $delegate;\r\n\r\n // status === 0 - 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 // 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 // fix the method 'then' of the ajax promise\r\n var originalThenMethod = ajaxPromise['then'];\r\n ajaxPromise['then'] = function utilliThenWrapper() {\r\n // handle the case when a lazy developer didn't specify an error handling method. yes, Yuiry, I'm about you.\r\n if (arguments.length === 1)\r\n return originalThenMethod.apply(ajaxPromise, arguments);\r\n // the case when 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 originalThenErrorHandler.apply(originalThenErrorHandler, arguments);\r\n };\r\n return originalThenMethod.apply(ajaxPromise, [thenSuccessHandler, thenErrorHandlerWrapper]);\r\n }\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', '$q', '$window', '$location', 'RequestService', 'CheckVersionService',\r\n 'ServiceProvidersService', 'ServerCacheService', 'ModalServiceExt', '$resource', 'productTourService',\r\n function ($rootScope, $state, $http, $q, $window, $location, RequestService, CheckVersionService,\r\n ServiceProvidersService, ServerCacheService, ModalServiceExt, $resource, productTourService) {\r\n\r\n utilli.registerGoogleAnalytics($window, $rootScope, $location);\r\n if ($window.ga){\r\n $window.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 $window.ga('set', 'checkProtocolTask', function() {});\r\n }\r\n $window.ga('set', 'dimension1', DeploymentSettings.currentServiceProvider);// ServiceProvider\r\n $window.ga('set', 'dimension2', DeploymentSettings.deploymentEnvironment);// DeploymentEnvironment\r\n $window.ga('set', 'dimension3', isMobile ? 'mobile' : 'web');// ClientType\r\n $rootScope.$on('$stateChangeSuccess', function (event) {\r\n $window.ga('send', 'pageview', $location.path());\r\n });\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 if (utilli.isAdmin) {\r\n $http.get('../Images/Utilli-logo.png');\r\n\r\n if (DeploymentSettings.providersGroupShortName === 'wgl')\r\n $http.get('../Images/Wgl-logo.png');\r\n }\r\n else {\r\n $http.get('Images/Utilli-logo.png');\r\n\r\n if (DeploymentSettings.providersGroupShortName === 'wgl')\r\n $http.get('Images/Wgl-logo.png');\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 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 && 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 if (utilli.isAdmin) {\r\n params = params || {};\r\n\r\n if (options && options.reload === stateName)\r\n options.reload = 'AdminMainLayout.Customer.CustomerLayout.' + stateName;\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('AdminMainLayout.Customer.CustomerLayout.' + stateName, params, options);\r\n } else {\r\n if (options && options.reload === stateName)\r\n options.reload = 'MainLayout.' + stateName;\r\n $state.go('MainLayout.' + stateName, 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.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.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.goToAgentsWelcome = function (params) {\r\n $state.go('TopMenuLayout.WelcomeAgent', 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 var redirectedFrom = withRedirect\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 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) 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 function pingPortal() {\r\n //do the empty request to detect the maintenance mode\r\n ServiceProvidersService.getProviderApiUrl().then(function (apiUrl) {\r\n var url = apiUrl + 'api/System/Check';\r\n $http({\r\n url: url,\r\n method: \"POST\",\r\n withoutAuthentication: true\r\n })\r\n .success(function () { })\r\n .error(function () { });\r\n });\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 $state.go('NoConnection');\r\n });\r\n }\r\n else {\r\n pingPortal();\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 = 0;\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 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', '$state', 'CommonHeaderService',\r\n function ($scope, $state, 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\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('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\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 token: $stateParams.token,\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 token: $stateParams.token,\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 = getMaskedPhoneNumberValue(countryCode + $scope.phoneNumber);\r\n var popupMessage = $scope._t('Your phone number') + ' ' + maskedPhone + ' ' + $scope._t('has been sucessfully 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/// \r\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('BotLoginController', [\r\n '$scope', '$http', '$sce', 'usSpinnerService',\r\n 'ServiceProvidersService', 'CommonHeaderService', 'CheckVersionService', '$state', '$stateParams', '$location',\r\n function($scope, $http, $sce, usSpinnerService, ServiceProvidersService, CommonHeaderService, CheckVersionService, $state, $stateParams, $location) {\r\n CommonHeaderService.setUp();\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 var checkVersionPromise = CheckVersionService.checkVersion();\r\n\r\n $scope.goToWithVersionChecking = function (state) {\r\n usSpinnerService.spin('spinner-1');\r\n checkVersionPromise.then(function () {\r\n $state.go(state);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.botLogin = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var login = $.trim($scope.credentials.login);\r\n var password = $.trim($scope.credentials.password);\r\n\r\n\r\n var dataobj = {\r\n userNameOrEmail: login,\r\n password: password,\r\n channelId: $location.search().channelId,\r\n fromId: $location.search().fromId\r\n };\r\n\r\n $http({\r\n //url: data.ApiUrl + 'api/Account/LogOn/',\r\n url: 'https://bot.utilli.com/api/messages/LogOn',\r\n method: \"GET\",\r\n params: dataobj\r\n }).success(function (jsondata) {\r\n if (jsondata) {\r\n if (jsondata.ERROR_LIST.length > 0) {\r\n }\r\n else {\r\n if (jsondata.Valid == 1) {\r\n\r\n\r\n\r\n }\r\n }\r\n }\r\n else {\r\n\r\n }\r\n\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (data) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n .factory('GridService', ['$http',\r\n function ($http) {\r\n var svc = {};\r\n /**\r\n * Creates a function that will be resizing a grid.\r\n * @param gridElement - element of the grid whose size needs to be adjusted\r\n * @param bottomSpace - how much pixels should be left at the bottom of the grid\r\n */\r\n svc.getGridResizeFunc = function (gridElement, bottomSpace) {\r\n var resizeFunc = function (kendoGrid) {\r\n if (!kendoGrid || kendoGrid.table == null)\r\n return;\r\n\r\n var grid = gridElement.find(\".k-grid-content\");\r\n var contentContainerHeight = $('.y-scrollable').innerHeight();\r\n var containerOtherElemententsHeight = gridElement[0].getBoundingClientRect().top - $('.y-scrollable')[0].getBoundingClientRect().top;\r\n //$('.main-ui-view').innerHeight() - gridElement.innerHeight();\r\n\r\n var otherElements = gridElement.children().not(\".k-grid-content\");\r\n var otherElementsHeight = 0;\r\n otherElements.each(function () {\r\n otherElementsHeight += $(this).outerHeight();\r\n });\r\n otherElementsHeight += parseInt(gridElement.css('border-top-width'));\r\n otherElementsHeight += parseInt(gridElement.css('border-bottom-width'));\r\n otherElementsHeight += parseInt(gridElement.css('margin-bottom'));\r\n if (bottomSpace)\r\n otherElementsHeight += bottomSpace;\r\n\r\n var contentContainerHeightWithoutTopElements = contentContainerHeight - containerOtherElemententsHeight;\r\n\r\n var minimumVisibleRows = 5;\r\n var heightOf10Rows = !kendoGrid._data || kendoGrid._data.length === 0 ? 0 : minimumVisibleRows * kendoGrid.table[0].clientHeight / kendoGrid._data.length;\r\n if (contentContainerHeightWithoutTopElements < heightOf10Rows) {\r\n var height = kendoGrid._data.length < minimumVisibleRows ? kendoGrid.table[0].clientHeight : heightOf10Rows;\r\n grid.height(Math.floor(height) - 1);\r\n gridElement[0].style.height = '';\r\n return;\r\n }\r\n // if there is a horizontal scroll then its height should be added to the grid size\r\n var horizontalScrollHeight = 20;\r\n var minHeight = contentContainerHeightWithoutTopElements < kendoGrid.table[0].clientHeight + horizontalScrollHeight + otherElementsHeight\r\n ? contentContainerHeightWithoutTopElements - otherElementsHeight\r\n : kendoGrid.table[0].clientHeight + horizontalScrollHeight;\r\n grid.height(Math.floor(minHeight) - 1);\r\n gridElement[0].style.height = '';\r\n };\r\n return resizeFunc;\r\n }\r\n return svc;\r\n }]);\r\n\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .factory('PaymentHistoryService', ['$http', '$q', 'ModalServiceExt', '$rootScope', 'usSpinnerService',\r\n function ($http, $q, ModalServiceExt, $rootScope, usSpinnerService) {\r\n var _t = utilli._t;\r\n var extendPaymentItem = function(paymentItem, isPaymentCancelationEnabled) {\r\n var getCanCancelPayment = function() {\r\n if (!isPaymentCancelationEnabled)\r\n return false;\r\n var now = new Date();\r\n now.setDate(now.getDate() - 1);\r\n var controlTime = now.getTime();\r\n var paymentTime = paymentItem.PaymentDate.getTime();\r\n if (paymentTime < controlTime)\r\n return false;\r\n return paymentItem.PaymentAmount < 0;\r\n }\r\n paymentItem.PaymentDescription = paymentItem.PaymentDescription === 'Other' && paymentItem.PaymentAmount > 0\r\n ? _t('Cancelled payment')\r\n : paymentItem.PaymentDescription;\r\n\r\n paymentItem.paymentDateUnix = paymentItem.PaymentDate.getTime();\r\n paymentItem.checkOrConfirmationNumberHeader = (paymentItem.PaymentBy && paymentItem.PaymentBy.toUpperCase() == 'CHECK') ? 'Check #:' : 'Conf. #:';\r\n paymentItem.checkOrConfirmationNumber = paymentItem.PaymentConfirmationNumber;\r\n paymentItem.amount = getPositiveAmountString(paymentItem.PaymentAmount);\r\n paymentItem.canCancelPayment = getCanCancelPayment();\r\n paymentItem.cancelPayment = function() {\r\n var requestData = { AccountNumber: paymentItem.AccountNumber, PaymentId: paymentItem.PaymentId };\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PaymentHistory/CancelPayment',\r\n method: \"POST\",\r\n data: requestData\r\n }).success(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n if (data == 'Success') {\r\n if (paymentItem.PaymentDate.getTime() > new Date().getTime())\r\n ModalServiceExt.showInfo(_t('Payment cancellation was successful.'));\r\n else\r\n ModalServiceExt.showInfo(_t('Your request for payment cancellation was successful. Credit will post to your bank account/credit card in approximately 24 hours. Please contact customer service with any questions.'));\r\n // broadcast event so that grid and infinite scrolling will get it and update themselves\r\n $rootScope.$broadcast('paymentCanceledEvent', paymentItem.PaymentId);\r\n } else\r\n ModalServiceExt.showInfo(_t('The payment has been already canceled.'));\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(_t('Your request for payment cancellation failed. Please contact customer services for further assistance.'));\r\n });\r\n }\r\n };\r\n\r\n return {\r\n extendPaymentItem: extendPaymentItem\r\n };\r\n }\r\n ]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('BillsAndPaymentsController', ['$scope', '$http', '$state', 'BillsService', '$rootScope', '$timeout',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', 'CommonDataService', 'PaymentHistoryService',\r\n function ($scope, $http, $state, billsService, $rootScope, $timeout, LeftMenuService, ModalServiceExt,\r\n CommonHeaderService, CommonDataService, PaymentHistoryService) {\r\n LeftMenuService.setCurrentTab('BillsAndPayments');\r\n CommonHeaderService.setUp($scope._t('Bills and Payments'));\r\n $scope.currentTab = 'BillsList';\r\n\r\n var pageSize = 20;\r\n\r\n $scope.viewDetails = function (bill) {\r\n billsService.setCurrentBill(bill);\r\n $rootScope.showSlideAnimation = true;\r\n $state.goMainLayout('BillDetails', { billNumber: bill.BillNumber });\r\n $timeout(function () { $rootScope.showSlideAnimation = false; }, 1000);\r\n };\r\n\r\n $scope.billAmountClass = function (billItem) {\r\n if (billItem.PaidStatus.toUpperCase() == 'UNPAID')\r\n return \"data-amount-unpaid\";\r\n else if (billItem.PaidStatus.toUpperCase().indexOf('PENDING') > -1)\r\n return \"data-amount-pending\";\r\n else\r\n return \"data-amount\";\r\n };\r\n\r\n $scope.billsHistoryInfoForScrolling = [];\r\n $scope.billsInfoForScrolling = [];\r\n\r\n $scope.billsInfoBusy = false;\r\n var billsLoadedCount = 0;\r\n $scope.billsInfoEndReached = false;\r\n\r\n $scope.billsHistoryInfoBusy = false;\r\n var paymentsLoaded = 0;\r\n $scope.billsHistoryInfoEndReached = false;\r\n\r\n $scope.getBillsInfoScrolling = function () {\r\n\r\n if ($scope.billsInfoBusy)\r\n return;\r\n $scope.billsInfoBusy = true;\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n var dataRequest = {\r\n accountNumber: accountNumber,\r\n skip: billsLoadedCount,\r\n pageSize: pageSize,\r\n withTotalCount: false\r\n };\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Bills/GetBillInfoPage/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (data) {\r\n $scope.IsGettingDashboardInfo = false;\r\n if (!data) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (data.ErrorList && data.ErrorList.length > 0) {\r\n ModalServiceExt.showError(data.ErrorList[0].Message);\r\n return;\r\n }\r\n $scope.acceptBillsInfoScrolling(data);\r\n }).error(function () {\r\n $scope.IsGettingDashboardInfo = false;\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n $scope.acceptBillsInfoScrolling = function (data) {\r\n if (!data.Bills) {\r\n $scope.billsInfoBusy = false;\r\n $scope.billsInfoEndReached = true;\r\n return;\r\n }\r\n\r\n for (var i = 0; i < data.Bills.length; i++) {\r\n $scope.billsInfoForScrolling.push(data.Bills[i]);\r\n billsLoadedCount++;\r\n }\r\n $scope.billsInfoBusy = false;\r\n\r\n if (data.Bills.length < pageSize) {\r\n $scope.billsInfoEndReached = true;\r\n }\r\n };\r\n\r\n $scope.getBillsHistoryInfoScrolling = function () {\r\n\r\n if ($scope.billsHistoryInfoBusy)\r\n return;\r\n $scope.billsHistoryInfoBusy = true;\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n var dataRequest = {\r\n accountNumber: accountNumber,\r\n skip: paymentsLoaded,\r\n pageSize: pageSize,\r\n withTotalCount: false\r\n };\r\n\r\n CommonDataService.getCommonData().then(\r\n function(commonData) {\r\n $scope.EnablePaymentCancelation = commonData.EnablePaymentCancelation;\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\r\n }).then(\r\n function() {\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PaymentHistory/GetPaymentsPage/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function(data) {\r\n $scope.IsGettingDashboardInfo = false;\r\n var jsondata = data;\r\n if (jsondata) {\r\n if (jsondata.ErrorList && jsondata.ErrorList.length > 0) {\r\n $scope.billsHistoryInfoEndReached = true;\r\n ModalServiceExt.showError(jsondata.ErrorList[0].Message);\r\n } else {\r\n $scope.acceptBillsHistoryInfoScrolling(data);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n }\r\n }).error(function() {\r\n $scope.billsHistoryInfoEndReached = true;\r\n ModalServiceExt.showServerError();\r\n });\r\n });\r\n };\r\n\r\n $scope.acceptBillsHistoryInfoScrolling = function (data) {\r\n if (!data.GetPaymentHistoricBills || data.GetPaymentHistoricBills.length == 0) {\r\n $scope.billsHistoryInfoBusy = false;\r\n $scope.billsHistoryInfoEndReached = true;\r\n return;\r\n }\r\n\r\n for (var i = 0; i < data.GetPaymentHistoricBills.length; i++) {\r\n PaymentHistoryService.extendPaymentItem(data.GetPaymentHistoricBills[i], $scope.EnablePaymentCancelation);\r\n $scope.billsHistoryInfoForScrolling.push(data.GetPaymentHistoricBills[i]);\r\n paymentsLoaded++;\r\n }\r\n $scope.billsHistoryInfoBusy = false;\r\n\r\n if (data.GetPaymentHistoricBills.length < pageSize) {\r\n $scope.billsHistoryInfoEndReached = true;\r\n }\r\n };\r\n\r\n $scope.$on('paymentCanceledEvent', function(event, data)\r\n {\r\n for (var i = 0; i < $scope.billsHistoryInfoForScrolling.length; i++)\r\n {\r\n var item = $scope.billsHistoryInfoForScrolling[i];\r\n if (item.PaymentId != data)\r\n continue;\r\n\r\n $scope.billsHistoryInfoForScrolling.splice(i, 1);\r\n }\r\n });\r\n }])\r\n;\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('BillsGridCtrl', [\r\n '$scope', '$http', 'BillsService', '$state', 'OpenFileService',\r\n 'GridService', 'ModalServiceExt',\r\n function ($scope, $http, BillsService, $state, OpenFileService, GridService, ModalServiceExt) {\r\n var billsGridResizeFunc = GridService.getGridResizeFunc($(\"#billsGrid\"));\r\n\r\n $(window).resize(function() {\r\n billsGridResizeFunc($scope.billsKendoGrid);\r\n });\r\n\r\n $scope.understandMyBill = function() {\r\n OpenFileService.openUnderstandBillFile();\r\n }\r\n\r\n $scope.makePayment = function() {\r\n $state.goMainLayout(\"PayNow\");\r\n }\r\n\r\n $scope.managePaymentOptions = function () {\r\n $state.goMainLayout(\"PaymentOptions\");\r\n }\r\n\r\n $scope.viewBill = function(bill) {\r\n OpenFileService.openBill(bill.BillNumber, bill.AccountNumber);\r\n }\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n $scope.mainGridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: { url: localStorage.getItem('ApiUrl') + 'api/Bills/GetBillInfoPage/' },\r\n parameterMap: function(data, type) {\r\n if (type == \"read\") {\r\n return {\r\n accountNumber: accountNumber,\r\n skip: (data.page - 1) * data.pageSize,\r\n pageSize: data.pageSize,\r\n withTotalCount: true,\r\n // kendo grid makes requests that doesn't go through angularjs\r\n // hence token will not be added by interceptor and we have\r\n // to add it manually here\r\n token: localStorage.getItem('SecurityToken')\r\n }\r\n }\r\n }\r\n },\r\n schema: {\r\n data: function(response) {\r\n // resize is useful here for the case when number of items per page is changed.\r\n // i call resize to handle that the grid can expand or shrink.\r\n // timeout is necessary to process resize after data is loaded\r\n setTimeout(function () { billsGridResizeFunc($scope.billsKendoGrid); }, 0);\r\n if (!response) {\r\n ModalServiceExt.showServerError();\r\n return [];\r\n }\r\n if (response.ErrorList.length > 0) {\r\n ModalServiceExt.showError(response.ErrorList[0].Message);\r\n return [];\r\n }\r\n return response.Bills;\r\n },\r\n total: \"TotalBillsCount\"\r\n },\r\n pageSize: 20,\r\n serverPaging: true\r\n },\r\n sortable: true,\r\n pageable: {\r\n pageSize: 10,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n dataBound: function() { billsGridResizeFunc($scope.billsKendoGrid); },\r\n columns: [\r\n {\r\n field: \"BillNumber\",\r\n title: $scope._t('Invoice Number'),\r\n template: \"#: BillNumber #\",\r\n width: 140\r\n }, {\r\n field: \"BillDate\",\r\n title: $scope._t('Date'),\r\n template: \"#: BillDate #\",\r\n width: 100\r\n }, {\r\n field: \"BillAmount\",\r\n title: $scope._t('Amount'),\r\n template: \"#: kendo.format('{0:c2}', BillAmount)#\",\r\n width: 90\r\n }, {\r\n field: \"LatePayAmount\",\r\n title: $scope._t('Charges'),\r\n template: \"#: kendo.format('{0:c2}', LatePayAmount)#\",\r\n width: 90\r\n }, {\r\n field: \"DueDate\",\r\n title: $scope._t('Due Date'),\r\n template: \"#: DueDate #\",\r\n width: 100\r\n }, {\r\n field: \"PaidStatus\",\r\n title: $scope._t('Status'),\r\n template: \"#: PaidStatus #\",\r\n width: 70\r\n }, {\r\n width: 70,\r\n template: kendo.template($(\"#view-btn-template\").html())\r\n }\r\n ]\r\n }\r\n }\r\n ]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n.controller('PaymentsGridCtrl', ['$scope', '$http', 'BillsService', 'GridService',\r\n 'CommonDataService', 'ModalServiceExt', 'PaymentHistoryService', '$state',\r\n function ($scope, $http, BillsService, GridService, CommonDataService,\r\n ModalServiceExt, PaymentHistoryService, $state) {\r\n var paymentsGridResizeFunc = GridService.getGridResizeFunc($(\"#paymentsGrid\"));\r\n $(window).resize(function () {\r\n paymentsGridResizeFunc($scope.paymentsKendoGrid);\r\n });\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n $scope.$on('paymentCanceledEvent', function () {\r\n $scope.paymentsKendoGrid.dataSource.read();\r\n $scope.paymentsKendoGrid.refresh();\r\n });\r\n\r\n $scope.makePayment = function () {\r\n $state.goMainLayout(\"PayNow\");\r\n } \r\n\r\n $scope.managePaymentOptions = function () {\r\n $state.goMainLayout(\"PaymentOptions\");\r\n }\r\n\r\n CommonDataService.getCommonData().then(\r\n function(commonData) {\r\n $scope.EnablePaymentCancelation = commonData.EnablePaymentCancelation;\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\r\n }).then(\r\n function () {\r\n var columns = [\r\n {\r\n field: \"PaymentDate\",\r\n title: $scope._t('Date'),\r\n width: 100\r\n }, {\r\n field: \"PaymentAmount\",\r\n title: $scope._t('Amount'),\r\n template: \"#: kendo.format('{0:c2}', PaymentAmount)#\",\r\n width: 80\r\n }, {\r\n field: \"PaymentDescription\",\r\n title: $scope._t('Description'),\r\n width: 130\r\n }, {\r\n field: \"PaymentBy\",\r\n title: $scope._t('Payment By'),\r\n width: 100\r\n }, {\r\n title: $scope._t('Check / Confirmation Number'),\r\n template: \"#: PaymentConfirmationNumber #\",\r\n width: 120\r\n }\r\n ];\r\n if ($scope.EnablePaymentCancelation) {\r\n columns.push({\r\n width: 100,\r\n template: \"\"\r\n });\r\n }\r\n $scope.mainGridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: { url: localStorage.getItem('ApiUrl') + 'api/PaymentHistory/GetPaymentsPage' },\r\n parameterMap: function (data, type) {\r\n if (type == \"read\") {\r\n return {\r\n accountNumber: accountNumber,\r\n skip: (data.page - 1) * data.pageSize,\r\n pageSize: data.pageSize,\r\n withTotalCount: true,\r\n // kendo grid makes requests that doesn't go through angularjs\r\n // hence token will not be added by interceptor and we have\r\n // to add it manually here\r\n token: localStorage.getItem('SecurityToken')\r\n }\r\n }\r\n }\r\n },\r\n schema: {\r\n data: function (response) {\r\n // resize is useful here for the case when number of items per page is changed.\r\n // i call resize to handle that the grid can expand or shrink.\r\n // timeout is necessary to process resize after data is loaded\r\n setTimeout(function () { paymentsGridResizeFunc($scope.paymentsKendoGrid); }, 0);\r\n\r\n if (!response) {\r\n ModalServiceExt.showServerError();\r\n return [];\r\n }\r\n if (response.ErrorList.length > 0) {\r\n ModalServiceExt.showError(response.ErrorList[0].Message);\r\n return [];\r\n }\r\n\r\n response.GetPaymentHistoricBills.forEach(function (item) {\r\n PaymentHistoryService.extendPaymentItem(item, $scope.EnablePaymentCancelation);\r\n });\r\n\r\n return response.GetPaymentHistoricBills;\r\n },\r\n total: \"TotalPaymentsCount\"\r\n },\r\n pageSize: 10,\r\n serverPaging: true\r\n },\r\n sortable: true,\r\n pageable: {\r\n pageSize: 10,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 5,\r\n refresh: true\r\n },\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n dataBound: paymentsGridResizeFunc,\r\n columns: columns\r\n }\r\n });\r\n }])\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('DashboardController', ['$scope', '$http', '$window', 'BillsService',\r\n 'usSpinnerService', '$timeout', 'CommonDataService', '$q', 'ModalService', 'ModalServiceExt',\r\n 'LeftMenuService', '$state', 'CommonHeaderService', 'CustomerInfoDataService', 'DueReminderService',\r\n 'UnitsService', 'productTourService',\r\n function ($scope, $http, $window, billsService, usSpinnerService, $timeout,\r\n// ReSharper disable InconsistentNaming\r\n CommonDataService, $q, ModalService, ModalServiceExt, LeftMenuService, $state,\r\n CommonHeaderService, CustomerInfoDataService, DueReminderService, UnitsService, productTourService) {\r\n // ReSharper restore InconsistentNaming\r\n $scope.units = UnitsService;\r\n $scope.formatNumber = utilli.formatNumber;\r\n $scope.isPayNowButtonVisible = !utilli.hasAgentRole();\r\n LeftMenuService.setCurrentTab('Dashboard');\r\n CommonHeaderService.setUpNotificationButton();\r\n $scope.customerInfo = {};\r\n $scope.customerInfo.account = {};\r\n var loading = $scope._t('loading...');\r\n $scope.customerInfo.account.AccountNumber = loading;\r\n $scope.customerInfo.account.ServiceAddress = loading;\r\n $scope.customerInfo.account.CustomerFullName = loading;\r\n\r\n $scope.customerInfo.userinfo = {};\r\n \r\n $scope.LastPaymentDate = loading;\r\n $scope.LastPaymentAmount = loading;\r\n\r\n $scope.IsGettingDashboardInfo = false;\r\n\r\n $scope.currentBallance = 0;\r\n\r\n $scope.dashboardInfo = {};\r\n\r\n $scope.payNow = function ()\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData().then(\r\n function() {\r\n usSpinnerService.stop('spinner-1');\r\n $state.goMainLayout('PayNow');\r\n },\r\n function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError($scope._t('Sevice is unavailable now. Try again later.'));\r\n });\r\n }\r\n\r\n $scope.getUtilityImage = function () {\r\n var utilliType = localStorage.getItem('CurrentUtilityType');\r\n if (utilliType == 'Gas')\r\n return 'gas-bgr';\r\n if (utilliType == 'Water')\r\n return 'water-bgr';\r\n if (utilliType == 'Electricity')\r\n return 'elctr-bgr';\r\n\r\n return '';\r\n }\r\n\r\n CommonDataService.getCommonData().then(\r\n function (commonData) {\r\n $scope.showRefundButton = commonData.EnablePaymentRefund;\r\n },\r\n function () {\r\n ModalServiceExt.showError($scope._t('Sevice is unavailable now. Try again later.'));\r\n });\r\n\r\n $scope.requestRefund = function() {\r\n usSpinnerService.spin('spinner-1');\r\n $timeout(function() {\r\n ModalServiceExt.showInfo($scope._t('Your request for a refund is being processed. '+\r\n 'Please check back in 24 hours or call customer service for further clarifications.'));\r\n $scope.showRefundButton = false;\r\n usSpinnerService.stop('spinner-1');\r\n }, 1500);\r\n }\r\n\r\n $scope.GetDashboardInfo = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.IsGettingDashboardInfo = true;\r\n CustomerInfoDataService.getCustomerInfoData()\r\n .then(\r\n function(customerInfoData) {\r\n if (!customerInfoData) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n if (customerInfoData.ERROR_LIST && customerInfoData.ERROR_LIST.length > 0) {\r\n ModalServiceExt.showError(customerInfoData.ERROR_LIST[0].Message);\r\n } else {\r\n acceptDashboardData(customerInfoData);\r\n }\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\r\n }\r\n )\r\n .then(showDueReminder)\r\n // \"['finally']\" instead of just \"finally\" because in old android browsers \"finally\" is a reserved keyword\r\n ['finally'](function() {\r\n $scope.IsGettingDashboardInfo = false;\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n function showProductTour() {\r\n if (!utilli.isAdmin && !utilli.hasAgentRole() && $scope.customerInfo.userinfo.Tour)\r\n productTourService.startTour($scope.customerInfo.userinfo.Tour)\r\n }\r\n\r\n function showDueReminder() {\r\n if (DueReminderService.isReminderShown()) {\r\n showProductTour();\r\n return;\r\n }\r\n else\r\n DueReminderService.markAsShown();\r\n\r\n if ((!$scope.customerInfo.userinfo\r\n || !$scope.customerInfo.userinfo.DateDiff\r\n || $scope.customerInfo.userinfo.TotalOpenBalance <= 0) &&\r\n !($scope.customerInfo.userinfo.IsDisconnected && $scope.customerInfo.userinfo.TotalOpenBalance <= 0)) {\r\n showProductTour();\r\n return;\r\n }\r\n\r\n ModalService.showModal({\r\n templateUrl: 'due-reminder',\r\n controller: \"ReminderController\"\r\n }).then(function (modal) {\r\n modal.element.modal();\r\n modal.close.then(function () {\r\n showProductTour();\r\n });\r\n });\r\n }\r\n\r\n function acceptDashboardData(customerInfo) {\r\n\r\n localStorage.setItem('CurrentUtilityType', customerInfo.account.UtilliType);\r\n $scope.units.updateUnits();\r\n $scope.customerInfo = customerInfo;\r\n\r\n $scope.showDueDate = customerInfo.userinfo.TotalOpenBalance > 0 && customerInfo.userinfo.DueDate != '0001-01-01T00:00:00';\r\n $scope.showPastDue = false;\r\n $scope.showDisconnected = false;\r\n\r\n $scope.LastPaymentAmount = customerInfo.userinfo.LastPaymentAmount == null\r\n ? null\r\n : getPositiveAmountString(customerInfo.userinfo.LastPaymentAmount);\r\n $scope.LastPaymentDate = Date.parse(customerInfo.userinfo.LastPaymentDate);\r\n\r\n try {\r\n $scope.customerInfo.dueDateTicks = Date.parse(customerInfo.userinfo.DueDate);\r\n if ($scope.customerInfo.userinfo.IsDisconnected) {\r\n $scope.showDisconnected = true;\r\n }\r\n else if($scope.showDueDate && $scope.customerInfo.dueDateTicks < Date.now()) {\r\n $scope.showPastDue = true;\r\n }\r\n \r\n } catch (ex) {\r\n console.log(ex);\r\n }\r\n };\r\n }])\r\n .controller('ReminderController', ['$scope', 'close', '$state', '$http', 'usSpinnerService',\r\n 'CommonDataService', 'CustomerInfoDataService', '$element',\r\n function ($scope, close, $state, $http, usSpinnerService, CommonDataService,\r\n CustomerInfoDataService, $element) {\r\n\r\n CustomerInfoDataService.getCachedData().then(\r\n function(data) {\r\n $scope.customerInfo = data;\r\n },\r\n function() {\r\n // error message is shown during the first call in dashboard controller\r\n });\r\n\r\n $scope.close = function () {\r\n closeModal();\r\n }\r\n\r\n var closeModal = function () {\r\n // https://github.com/dwmkerr/angular-modal-service/issues/124\r\n // http://stackoverflow.com/a/20109519/292787\r\n // my explanation: modal('hide') hides the modal, this removes backdrop div that adds\r\n // opacity for backgroud. once hide is completed we can close the modal - this removes\r\n // div from body completely. it is necessary to call close only after hide is finished\r\n // because it works async. otherwise if just call it this way:\r\n // $element.modal('hide');\r\n // close();\r\n // then close will destroy the modal and hide will not find what to hide\r\n $element.modal('hide').on('hidden.bs.modal', function () {\r\n close();\r\n });\r\n };\r\n\r\n $scope.gotoPayment = function () {\r\n closeModal();\r\n goTo('PayNow');\r\n }\r\n\r\n $scope.gotoPaymentOptions = function () {\r\n closeModal();\r\n goTo('PaymentOptions');\r\n }\r\n\r\n function getDate(dateSource) {\r\n var dateAsString = dateSource.substr(0, 10);\r\n var result = kendo.parseDate(dateAsString, \"yyyy-MM-dd\");\r\n return result;\r\n }\r\n\r\n $scope.getFormatedDueDate = function () {\r\n if (!$scope.customerInfo || !$scope.customerInfo.userinfo)\r\n return '';\r\n var date = getDate($scope.customerInfo.userinfo.DueDate);\r\n var result = kendo.toString(date, \"d\");\r\n return result;\r\n }\r\n\r\n $scope.getFormatedDisconnectDate = function () {\r\n if (!$scope.customerInfo || !$scope.customerInfo.userinfo)\r\n return '';\r\n var date = getDate($scope.customerInfo.userinfo.DisconnectDate);\r\n var result = kendo.toString(date, \"d\");\r\n return result;\r\n }\r\n\r\n function goTo(address) {\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData()\r\n .then(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $state.goMainLayout(address);\r\n }, function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError($scope._t('Sevice is unavailable now. Try again later.'));\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('WelcomeController', ['$scope', 'LeftMenuService', '$state', 'CommonDataService',\r\n 'ServiceProvidersService', '$sce', 'usSpinnerService', '$http', 'CommonHeaderService',\r\nfunction ($scope, LeftMenuService, $state, CommonDataService, 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)) 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.QuickPay.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.controller('WelcomePropertyManagerController', ['$scope', 'LeftMenuService', '$state', 'CommonDataService',\r\n 'ServiceProvidersService', '$sce', 'usSpinnerService', '$http', 'CommonHeaderService',\r\nfunction ($scope, LeftMenuService, $state, CommonDataService, ServiceProvidersService, $sce,\r\n usSpinnerService, $http, CommonHeaderService) {\r\n CommonHeaderService.setUp();\r\n\r\n $scope.appUrls = Config.appUrls;\r\n $scope.isPropertyManagerWelcomePage = true;\r\n var setApiUrl = function(callback){\r\n ServiceProvidersService.getProviderApiUrl().then(function(apiUrl){\r\n localStorage.setItem('ApiUrl', apiUrl);\r\n callback();\r\n })\r\n }\r\n if (utilli.goesToDefaultPage($state, setApiUrl)) return;\r\n\r\n var token = localStorage.getItem('SecurityToken');\r\n if (token)\r\n {\r\n $state.goMainLayout('PropertyList');\r\n return;\r\n }\r\n\r\n $state.go('TopMenuLayout.WelcomePropertyManager.SignIn.Credentials');\r\n\r\n $scope.goToRequestMeterRevocation = function() {\r\n $state.go('TopMenuLayout.RequestMeterSharingRevoke');\r\n }\r\n\r\n if (DeploymentSettings.currentServiceProvider) {\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 }\r\n else {\r\n $scope.helpEmail = 'help@utilli.com';\r\n }\r\n $scope.phoneNumbers = 'loading...';\r\n $scope.loadPhoneNumbers = function (){\r\n if ($scope.phoneNumbersLoaded){\r\n return;\r\n }\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(providers) {\r\n if (!providers || providers.length == 0) {\r\n $scope.phoneNumbers = \"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 = \"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 = \"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 $scope.phoneNumbersLoaded = true;\r\n }).error(function() {\r\n $scope.phoneNumbers = \"Server error. Try again later.\";\r\n });\r\n },\r\n function() {\r\n $scope.phoneNumbers = \"Server error. Try again later.\";\r\n });\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('SignUpPropertyManagerController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state,\r\n// ReSharper disable InconsistentNaming\r\n CommonHeaderService) {\r\n// ReSharper restore InconsistentNaming\r\n CommonHeaderService.hideMenuToggleButton();\r\n\r\n $scope.Model = $scope.Model || {\r\n firstName: '',\r\n lastName: '',\r\n agency: '',\r\n phoneNumber: '',\r\n userName : '',\r\n email: '',\r\n password: '',\r\n securityQuestion: '',\r\n securityAnswer: ''\r\n };\r\n \r\n }])\r\n.controller('SignUpPropertyManagerStep1Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'usSpinnerService', 'ServiceProvidersService', '$stateParams', 'CheckVersionService', '$q', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService,\r\n // ReSharper disable InconsistentNaming\r\n ServiceProvidersService, $stateParams, CheckVersionService, $q, ModalServiceExt) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.isProviderListVisible = !DeploymentSettings.currentServiceProvider;\r\n usSpinnerService.spin(\"spinner-1\");\r\n if ($scope.isProviderListVisible) {\r\n ServiceProvidersService.getProviders()\r\n .then(function (allProviders) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n if (allProviders && allProviders.length == 1) {\r\n $scope.isProviderListVisible = false;\r\n $rootScope.webServicesUrl = allProviders[0].ApiUrl;\r\n $rootScope.serviceUrl = allProviders[0].ApiUrl + 'api/Registration/Register/';\r\n return;\r\n }\r\n\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 } else {\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $rootScope.webServicesUrl = providerData.ApiUrl;\r\n $rootScope.serviceUrl = providerData.ApiUrl + 'api/Registration/Register/';\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 $scope.cancel = function () {\r\n ModalServiceExt.showYesNoMessage(_t('Confirmation'), _t('Are you sure you want to cancel registration process?'), function () {\r\n $state.go('TopMenuLayout.WelcomePropertyManager', null, { reload: true });\r\n });\r\n };\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n\r\n $scope.checkUserInfoFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n if (!$scope.formUserInfo.$valid) {\r\n $scope.submitted = true;\r\n usSpinnerService.stop(\"spinner-1\");\r\n return;\r\n }\r\n\r\n if ($scope.isProviderListVisible) {\r\n $rootScope.webServicesUrl = $scope.provider.ApiUrl;\r\n $rootScope.serviceUrl = $scope.provider.ApiUrl + 'api/Registration/Register/';\r\n }\r\n\r\n $state.goRelativeTo(\r\n 'SignUpPropertyManager',\r\n 'Step2',\r\n {\r\n email: $stateParams.email,\r\n regData: {\r\n firstName: $.trim($scope.firstName),\r\n lastName: $.trim($scope.lastName),\r\n agency: $.trim($scope.agency),\r\n phoneNumber: $.trim($scope.phoneNumber)\r\n }\r\n });\r\n usSpinnerService.stop(\"spinner-1\");\r\n }\r\n }])\r\n.controller('SignUpPropertyManagerStep2Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'CommonDataService', 'usSpinnerService', '$stateParams', 'ServiceProvidersService', 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $state, $moduleServices, CommonDataService,\r\n usSpinnerService, $stateParams, ServiceProvidersService, ModalServiceExt) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.isEmailPredefined = $stateParams.email != null;\r\n if ($scope.isEmailPredefined)\r\n {\r\n $scope.Model.email = $stateParams.email;\r\n $scope.Model.email2 = $stateParams.email;\r\n }\r\n\r\n $scope.Model.password = '';\r\n $scope.passwdErrors = [];\r\n\r\n $scope.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 var isEmailValid = function () {\r\n var matched = $scope.emailPattern.test($scope.Model.email);\r\n if (!matched) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n $scope.cancel = function () {\r\n $state.goRelativeTo('SignUpPropertyManager', 'Step1');\r\n };\r\n\r\n $scope.errors = [];\r\n\r\n var loadingText = _t('Loading...');\r\n $scope.passRequirements = [loadingText];\r\n $scope.SecurityQuestions = [loadingText];\r\n $scope.Model.securityQuestion = loadingText;\r\n\r\n usSpinnerService.spin(\"spinner-1\");\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($rootScope.webServicesUrl + 'api/StaticData/GetSecurityQuestions/')\r\n .then(function (resp) {\r\n var sequrityQeuestions = JSON.parse(resp.data);\r\n $scope.SecurityQuestions = sequrityQeuestions;\r\n $scope.Model.securityQuestion = $scope.SecurityQuestions[0];\r\n },\r\n function () {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n\r\n $scope.getPasswdMinLength = function () {\r\n var result = $scope.paswdMinLength ? $scope.paswdMinLength : 1;\r\n return result;\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 $scope.isPasswdValid = function () { \r\n $scope.passwdErrors = utilli.validatePassword($scope.Model.password, $scope.Model.userName, $scope.passRequirements, $scope.paswdMinLength);\r\n $scope.passwordsNotMatch = $scope.Model.password && $scope.Model.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.errors = [];\r\n\r\n function checkForScrollTop() {\r\n if (!validateUserID() || $scope.formUserInfo.email.$valid || $scope.formUserInfo.email2.$valid)\r\n utilli.scrollTop();\r\n }\r\n\r\n function validateUserID() {\r\n return $scope.formUserInfo.userName.$valid && $scope.formUserInfo.userName.$viewValue.length >= $scope.minUserIdLength;\r\n }\r\n\r\n $scope.checkLoginInfoFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n $scope.submitted = true;\r\n var isPasswordValid = $scope.isPasswdValid();\r\n var isUserIDValid = validateUserID();\r\n if (!isUserIDValid || !isPasswordValid || $scope.Model.email != $scope.Model.email2 || !isEmailValid()) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n checkForScrollTop();\r\n return;\r\n }\r\n\r\n var data = {\r\n firstName: $.trim($scope.Model.firstName),\r\n lastName: $.trim($scope.Model.lastName),\r\n agency: $.trim($scope.Model.agency),\r\n phoneNumber: $.trim($scope.Model.phoneNumber),\r\n\r\n userName: $.trim($scope.Model.userName),\r\n email: $.trim($scope.Model.email),\r\n password: $.trim($scope.Model.password),\r\n securityQuestion: $scope.Model.securityQuestion,\r\n securityAnswer: $.trim($scope.Model.securityAnswer)\r\n };\r\n\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/PropertyManagers/ValidateRegisterData/',\r\n method: \"POST\",\r\n data: data\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 $scope.errors = response.Errors;\r\n utilli.scrollTop();\r\n }\r\n else {\r\n $state.goRelativeTo('SignUpPropertyManager', 'Step3');\r\n }\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n }])\r\n.controller('SignUpPropertyManagerStep3Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams', 'moduleServices',\r\n 'CommonDataService', 'usSpinnerService', '$sce', 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $state, $stateParams, $moduleServices, CommonDataService, usSpinnerService,\r\n $sce, ModalServiceExt) {\r\n // ReSharper restore InconsistentNaming\r\n $scope.errors = [];\r\n\r\n $scope.cancel = function () {\r\n $state.goRelativeTo('SignUpPropertyManager', 'Step2');\r\n };\r\n\r\n $scope.loadTermsAndConditions = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n var url = $rootScope.webServicesUrl + 'api/StaticData/GetTermsAndConditions';\r\n $http({\r\n url: url,\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 var data = {\r\n firstName: $.trim($scope.Model.firstName),\r\n lastName: $.trim($scope.Model.lastName),\r\n agency: $.trim($scope.Model.agency),\r\n phoneNumber: $.trim($scope.Model.phoneNumber),\r\n\r\n userName: $.trim($scope.Model.userName),\r\n email: $.trim($scope.Model.email),\r\n password: $.trim($scope.Model.password),\r\n securityQuestion: $scope.Model.securityQuestion,\r\n securityAnswer: $.trim($scope.Model.securityAnswer),\r\n client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal\r\n };\r\n\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/PropertyManagers/Register/',\r\n method: \"POST\",\r\n data: data\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 ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $state.goRelativeTo('SignUpPropertyManager', 'Success');\r\n }\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n\r\n }])\r\n.controller('SignUpPropertyManagerSuccessController', ['$scope', '$rootScope', 'CommonDataService',\r\n 'usSpinnerService', '$state',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, CommonDataService, usSpinnerService, $state) {\r\n// ReSharper restore InconsistentNaming\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.go('TopMenuLayout.WelcomePropertyManager', null, { reload: true });\r\n }\r\n });\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('PropertyManagerProfileController', ['$scope', '$rootScope', '$http', '$window', 'usSpinnerService', '$state', '$stateParams',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'avatarsService',\r\n function ($scope, $rootScope, $http, $window, usSpinnerService, $state, $stateParams, \r\n // ReSharper disable InconsistentNaming\r\n LeftMenuService, CommonHeaderService, ModalServiceExt,\r\n // ReSharper restore InconsistentNaming\r\n avatarsService) {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n var _t = $scope._t;\r\n CommonHeaderService.setUp(_t('Profile'));\r\n LeftMenuService.setCurrentTab('PropertyManagerProfile');\r\n CommonHeaderService.setUpBackButton($scope._t('Profile'));\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n $scope.errors = [];\r\n $scope.enableLanguagePack = utilli.isLanguagePackEnabled();\r\n $scope.espmConnected = false;\r\n\r\n init();\r\n\r\n $scope.espmAccountDisconnect = function ()\r\n {\r\n ModalServiceExt.showYesNoMessage(\r\n _t('Disconnection from ESPM Account'),\r\n _t('Are you sure you want to disconnect your Utilli Account from this ESPM Account? All Properties will be deleted on Utilli side but will remain on ESPM Account side.'),\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: \"POST\",\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/DisconnectFromEspmAccount/',\r\n params: {\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 else\r\n {\r\n $scope.espmConnected = false;\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 $scope.save = function () {\r\n $scope.submitted = true;\r\n if(!$scope.editProfileForm.$valid){\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n var postData = {};\r\n $window.jQuery.extend(postData, $scope.userData);\r\n var countryCode = utilli.getCountryPhoneNumberCode();\r\n postData.PhoneNumber = countryCode + postData.PhoneNumber;\r\n postData.UserName = $state.params.userId;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/EditProfile/',\r\n method: \"POST\",\r\n data: postData\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n $rootScope.$broadcast('profile-updated');\r\n ModalServiceExt.showInfo(_t('Your profile has been saved.'));\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.push({ Message: utilli.serverErrorMessage });\r\n });\r\n }\r\n\r\n $scope.changeAvatar = function () {\r\n $state.goMainLayout('Avatars', { forPropertyManager: true });\r\n };\r\n\r\n $scope.changeLanguage = function () {\r\n $state.goMainLayout('Languages');\r\n };\r\n\r\n $scope.securityQuestions = [];\r\n\r\n function init() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/PropertyManagers/GetProfile',\r\n params: { userName: $state.params.userId }\r\n }).success(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.securityQuestions = data.Data.SecurityQuestions;\r\n $scope.userData = data.Data.UserData;\r\n\r\n $scope.userData.PhoneNumber = utilli.ajustPhoneNumber($scope.userData.PhoneNumber);\r\n \r\n if (!$scope.userData.SecurityQuestion) {\r\n $scope.userData.SecurityQuestion = $scope.securityQuestions[0];\r\n } else if (!_.some($scope.securityQuestions, function (item) { return item === $scope.userData.SecurityQuestion } )) {\r\n $scope.securityQuestions.push($scope.userData.SecurityQuestion);\r\n }\r\n\r\n avatarsService.setCurrentAvatar(apiUrl + $scope.userData.AvatarPath);\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.push({ Message: utilli.serverErrorMessage });\r\n });\r\n\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetEnergyStarInfo/',\r\n method: \"GET\",\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.Data == null) {\r\n $scope.espmConnected = false;\r\n }\r\n else {\r\n $scope.espmConnected = true;\r\n $scope.espmFirstName = response.Data.FirstName;\r\n $scope.espmLastName = response.Data.LastName;\r\n $scope.espmAddressLine1 = response.Data.Address1;\r\n $scope.espmAddressLine2 = response.Data.Address2;\r\n $scope.espmCity = response.Data.City;\r\n $scope.espmState = response.Data.State;\r\n $scope.espmZip = response.Data.PostalCode;\r\n $scope.espmEmail = response.Data.Email;\r\n $scope.espmOrganization = response.Data.Organization;\r\n $scope.espmJobTitle = response.Data.JobTitle;\r\n $scope.espmPhone = response.Data.Phone;\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n }]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('PropertyStackedDashboardController',\r\n [\r\n '$scope', '$rootScope', '$http', '$window', '$filter', 'usSpinnerService',\r\n 'ModalServiceExt', 'LeftMenuService', '$state', 'CommonHeaderService',\r\n 'DefaultPropertyService', 'UnitsService', 'PropertyService', 'PropertyListService', 'CommonDataService',\r\n function ($scope, $rootScope, $http, $window, $filter, usSpinnerService,\r\n// ReSharper disable InconsistentNaming\r\n ModalServiceExt, LeftMenuService, $state, CommonHeaderService,\r\n DefaultPropertyService, UnitsService, PropertyService, PropertyListService, CommonDataService) {\r\n // ReSharper restore InconsistentNaming\r\n\r\n LeftMenuService.setCurrentTab('Dashboard');\r\n CommonHeaderService.setUpNotificationButton();\r\n\r\n usSpinnerService.spin('spinner-1');\r\n PropertyListService.getPropertyList().success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (!response.Data || response.Data.length === 0) {\r\n $scope.noProperties = true;\r\n $scope.noData = true;\r\n }\r\n else {\r\n initPage();\r\n }\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n var chart = null;\r\n var meterColors = [];\r\n\r\n function initPage() {\r\n DefaultPropertyService.getAggregation($state.params.userId).then(function(aggregation) {\r\n if (!aggregation || aggregation.Type !== utilli.aggregationTypes.property) {\r\n // https://stackoverflow.com/a/39461700/292787\r\n $state.goMainLayout('GroupStackedDashboard', null, { location: 'replace' });\r\n return;\r\n }\r\n\r\n if (aggregation.MetersCount >= Config.maxMetersOnStackedDashboard) {\r\n // https://stackoverflow.com/a/39461700/292787\r\n $state.goMainLayout('PropertyBarDashboard', null, { location: 'replace' });\r\n return;\r\n }\r\n\r\n $scope.property = aggregation;\r\n\r\n PropertyService.loadProperty($scope.property, $scope.getStackedGraph);\r\n\r\n function setMetersColor() {\r\n chart.options.series.forEach(function (seria) {\r\n if (!_.find(meterColors, function (item) { return item.meter === seria.name; }))\r\n meterColors.push({ meter: seria.name, colorIndex: seria._colorIndex });\r\n });\r\n }\r\n\r\n $scope.previousPage = function() {\r\n if (!$scope.disablePrev) {\r\n $scope.currentPage++;\r\n setMetersColor();\r\n $scope.getStackedGraph();\r\n }\r\n };\r\n \r\n $scope.nextPage = function() {\r\n if (!$scope.disableNext) {\r\n $scope.currentPage--;\r\n setMetersColor();\r\n $scope.getStackedGraph();\r\n }\r\n };\r\n \r\n $scope.getStackedGraph();\r\n });\r\n \r\n $scope.units = UnitsService;\r\n $scope.currentPage = 0;\r\n $scope.pageSize = 12;\r\n }\r\n\r\n function fillChartData(consumptionData, chartOptions) {\r\n var i;\r\n $scope.units.setSelectedUnitsIfEmpty(consumptionData.Uom);\r\n var coefficient = 1; //$scope.units.getCoefficient(consumptionData.Uom);\r\n\r\n $scope.tableData = [];\r\n $scope.disablePrev = consumptionData.TableData.length <= $scope.pageSize;\r\n $scope.disableNext = $scope.currentPage <= 0;\r\n // shift because TableData.length can be bigger than pageSize.\r\n // if it's bigger than we understand that one more page exists (Prev button should be enabled)\r\n var shift = consumptionData.TableData.length < $scope.pageSize ? 0\r\n : consumptionData.TableData.length - $scope.pageSize;\r\n for (i = shift; i < consumptionData.TableData.length; i++) {\r\n var item = consumptionData.TableData[i];\r\n var clone = $.extend({}, item);\r\n\r\n clone.Consumption = utilli.trimFloat2(clone.Consumption * coefficient);\r\n clone.ConsumptionString = utilli.formatNumber(clone.Consumption);\r\n clone.AvgConsumption = utilli.trimFloat2(clone.AvgConsumption * coefficient);\r\n clone.AvgConsumptionString = utilli.formatNumber(clone.AvgConsumption);\r\n\r\n clone.Unit = $scope.units.selectedUnitsType.name;\r\n clone.Date = new Date(clone.Year, clone.Month - 1, 1);\r\n $scope.tableData.push(clone);\r\n }\r\n\r\n consumptionData.MeterConsumptions.forEach(function (meter, index) {\r\n\r\n var colorIndex;\r\n if (meterColors.length > 0) {\r\n var meterColor = _.find(meterColors, function (item) { return item.meter === meter.MeterNumber; });\r\n if (meterColor)\r\n colorIndex = meterColor.colorIndex;\r\n }\r\n\r\n var seria = { name: meter.MeterNumber, _colorIndex: colorIndex, data: [] };\r\n\r\n for (i = shift; i < consumptionData.TableData.length; i++) {\r\n var consumption = meter.Consumptions[i];\r\n var stringFixed = (consumption * coefficient).toFixed(2);\r\n var convertedConsumption = parseFloat(stringFixed);\r\n seria.data.push(convertedConsumption);\r\n }\r\n chartOptions.series.push(seria);\r\n });\r\n\r\n for (i = shift; i < consumptionData.TableData.length; i++) {\r\n var date = consumptionData.Dates[i];\r\n chartOptions.xAxis.categories.push(date.Year + '-' + date.Month);\r\n }\r\n }\r\n\r\n var plotStackedChart = function (consumptionResponse) {\r\n\r\n var unitsName = $scope.unitsName;\r\n if ($scope.units.selectedUnitsType.name != '') {\r\n unitsName = $scope.units.selectedUnitsType.name;\r\n }\r\n\r\n var chartOptions = {\r\n chart: {\r\n type: 'area',\r\n colorCount: Config.maxMetersOnStackedDashboard\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n title: {\r\n text: ''\r\n },\r\n subtitle: {\r\n text: ''\r\n },\r\n xAxis: {\r\n categories: [],\r\n tickmarkPlacement: 'on',\r\n title: {\r\n enabled: false\r\n },\r\n labels: {\r\n rotation: -45\r\n }\r\n },\r\n yAxis: {\r\n title: {\r\n text: 'Consumption (' + unitsName + ')'\r\n },\r\n labels: {\r\n formatter: function () {\r\n return this.value;\r\n }\r\n }\r\n },\r\n tooltip: {\r\n split: true,\r\n valueSuffix: ' ' + unitsName\r\n },\r\n plotOptions: {\r\n area: {\r\n stacking: 'normal',\r\n lineColor: '#666666',\r\n lineWidth: 1,\r\n marker: {\r\n lineWidth: 1,\r\n lineColor: '#666666'\r\n }\r\n }\r\n },\r\n series: [],\r\n credits: {\r\n enabled: false\r\n }\r\n };\r\n\r\n fillChartData(consumptionResponse.Data, chartOptions);\r\n // ReSharper disable once UndeclaredGlobalVariableUsing\r\n chart = Highcharts.chart('stackedGraphHere', chartOptions);\r\n }\r\n\r\n $scope.getStackedGraph = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var propertyId = utilli.getCurrentPropertyId();\r\n\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n $scope.enableIndividualMeters = commonData.EnablePropertyManagersDashboardIndividualMeters || utilli.isAdmin;\r\n\r\n var urlForConumptions = 'api/Consumption/GetPropertyConsumptionStackedAllMetersAggregated/';\r\n if (commonData.EnablePropertyManagersDashboardIndividualMeters || utilli.isAdmin) {\r\n urlForConumptions = 'api/Consumption/GetPropertyConsumptionStacked/'\r\n }\r\n if(!$scope.units.selectedUnitsType.name)\r\n {\r\n $scope.units.selectedUnitsType.name = \"CCF\";\r\n }\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + urlForConumptions,\r\n method: \"GET\",\r\n params: {\r\n propertyId: propertyId,\r\n skip: $scope.currentPage * $scope.pageSize, // currentPage starts with 0\r\n pageSize: $scope.pageSize + 1,\r\n userName: $state.params.userId,\r\n uom : $scope.units.selectedUnitsType.name\r\n }\r\n }).success(function (consumptionResponse) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(consumptionResponse,\r\n ModalServiceExt,\r\n function () {\r\n $scope.unitsName = consumptionResponse.Data.Uom;\r\n plotStackedChart(consumptionResponse);\r\n });\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 $scope.backToBarGraph = function () {\r\n $state.goMainLayout(\"PropertyBarDashboard\");\r\n };\r\n\r\n $scope.getExcelData = function () {\r\n var propertyId = utilli.getCurrentPropertyId();\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GeneratePropertyStackedExcel/';\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: { propertyId: propertyId, uom: $scope.units.selectedUnitsType.name, userName: $state.params.userId }\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 var fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\r\n utilli.downloadFile(url);\r\n }\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n $scope.getGreenButtonData = function () {\r\n var propertyId = utilli.getCurrentPropertyId();\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GeneratePropertyStackedGreenButton/'\r\n + '?propertyId=' + propertyId;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: { userName: $state.params.userId}\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 var fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\r\n utilli.downloadFile(url, \"GreenButtonData.xml\");\r\n }\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n $scope.refreshScore = function () {\r\n PropertyService.refreshScore($scope.property, $scope.getStackedGraph);\r\n };\r\n }\r\n ]);\r\n \n'use strict';\r\nangular.module('utilliApp')\r\n .controller('GroupStackedDashboardController',\r\n [\r\n '$scope', '$rootScope', '$http', '$window', '$filter', 'usSpinnerService', 'ModalServiceExt',\r\n 'LeftMenuService', '$state', 'CommonHeaderService', 'DefaultPropertyService', 'UnitsService',\r\n// ReSharper disable InconsistentNaming\r\n function($scope, $rootScope, $http, $window, $filter, usSpinnerService, ModalServiceExt,\r\n LeftMenuService, $state, CommonHeaderService, DefaultPropertyService, UnitsService) {\r\n// ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('Dashboard');\r\n CommonHeaderService.setUpNotificationButton();\r\n $scope.units = UnitsService;\r\n\r\n DefaultPropertyService.getAggregation().then(function(aggregation) {\r\n if (aggregation.Type === utilli.aggregationTypes.property) {\r\n // https://stackoverflow.com/a/39461700/292787\r\n $state.goMainLayout('PropertyStackedDashboard', null, { location: 'replace' });\r\n return;\r\n }\r\n\r\n $scope.groupName = aggregation.Name;\r\n $scope.delegatingUser = aggregation.DelegatingUser;\r\n $scope.delegatingUserPhone = aggregation.DelegatingUserPhone;\r\n $scope.delegatingUserEmail = aggregation.DelegatingUserEmail;\r\n $scope.NumberOfProperties = aggregation.PropertiesCount;\r\n $scope.currentPage = 0;\r\n $scope.pageSize = 12;\r\n\r\n function fillChartData(consumptionData, chartOptions) {\r\n var i;\r\n var coefficient = $scope.units.getCoefficient(consumptionData.Uom);\r\n\r\n $scope.tableData = [];\r\n $scope.disablePrev = consumptionData.TableData.length < $scope.pageSize;\r\n $scope.disableNext = $scope.currentPage <= 0;\r\n // shift because TableData.length can be bigger than pageSize.\r\n // if it's bigger than we understand that one more page exists (Prev button should be enabled)\r\n var shift = consumptionData.TableData.length < $scope.pageSize ? 0\r\n : consumptionData.TableData.length - $scope.pageSize;\r\n for (i = shift; i < consumptionData.TableData.length; i++) {\r\n var item = consumptionData.TableData[i];\r\n var clone = $.extend({}, item);\r\n\r\n clone.Consumption = utilli.trimFloat2(clone.Consumption * coefficient);\r\n clone.ConsumptionString = utilli.formatNumber(clone.Consumption);\r\n clone.AvgConsumption = utilli.trimFloat2(clone.AvgConsumption * coefficient);\r\n clone.AvgConsumptionString = utilli.formatNumber(clone.AvgConsumption);\r\n clone.AmountString = $filter('currency')(utilli.formatNumber(clone.Amount));\r\n\r\n clone.Unit = $scope.units.selectedUnitsType.name;\r\n clone.Date = new Date(clone.Year, clone.Month - 1, 1);\r\n $scope.tableData.push(clone);\r\n }\r\n\r\n consumptionData.PropertyConsumptions.forEach(function (property) {\r\n var seria = { name: property.PropertyAddress, data: [] };\r\n\r\n for (i = shift; i < consumptionData.TableData.length; i++) {\r\n var consumption = property.Consumptions[i];\r\n var stringFixed = (consumption * coefficient).toFixed(2);\r\n var convertedConsumption = parseFloat(stringFixed);\r\n seria.data.push(convertedConsumption);\r\n }\r\n chartOptions.series.push(seria);\r\n });\r\n\r\n for (i = shift; i < consumptionData.TableData.length; i++) {\r\n var date = consumptionData.Dates[i];\r\n chartOptions.xAxis.categories.push(date.Year + '-' + date.Month);\r\n }\r\n }\r\n\r\n var plotStackedChart = function (consumptionResponse) {\r\n\r\n $scope.units.setSelectedUnitsIfEmpty(consumptionResponse.Data.Uom);\r\n\r\n var chartOptions = {\r\n chart: {\r\n type: 'area'\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n title: {\r\n text: ''\r\n },\r\n subtitle: {\r\n text: ''\r\n },\r\n xAxis: {\r\n categories: [],\r\n tickmarkPlacement: 'on',\r\n title: {\r\n enabled: false\r\n },\r\n labels: {\r\n rotation: -45\r\n }\r\n },\r\n yAxis: {\r\n title: {\r\n text: $scope._t('Consumption') + ' (' + $scope.units.selectedUnitsType.name + ')'\r\n },\r\n labels: {\r\n formatter: function() {\r\n return this.value;\r\n },\r\n rotation: -45\r\n }\r\n },\r\n tooltip: {\r\n split: true,\r\n pointFormat: '{point.y}',\r\n valueSuffix: ' ' + $scope.units.selectedUnitsType.name\r\n },\r\n plotOptions: {\r\n area: {\r\n stacking: 'normal',\r\n lineColor: '#666666',\r\n lineWidth: 1,\r\n marker: {\r\n lineWidth: 1,\r\n lineColor: '#666666'\r\n }\r\n }\r\n },\r\n series: [],\r\n credits: {\r\n enabled: false\r\n }\r\n };\r\n\r\n fillChartData(consumptionResponse.Data, chartOptions);\r\n // ReSharper disable once UndeclaredGlobalVariableUsing\r\n Highcharts.chart('stackedGraphHere', chartOptions);\r\n }\r\n\r\n $scope.getStackedGraph = function() {\r\n usSpinnerService.spin('spinner-1');\r\n var groupId = utilli.getCurrentGroupId();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Consumption/GetGroupConsumptionStacked/',\r\n method: \"GET\",\r\n params: {\r\n groupId: groupId,\r\n skip: $scope.currentPage * $scope.pageSize, // currentPage starts with 0\r\n pageSize: $scope.pageSize + 1,\r\n userName: $state.params.userId\r\n }\r\n }).success(function (consumptionResponse) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(consumptionResponse,\r\n ModalServiceExt,\r\n function () {\r\n plotStackedChart(consumptionResponse);\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n $scope.previousPage = function() {\r\n if (!$scope.disablePrev) {\r\n $scope.currentPage++;\r\n $scope.getStackedGraph();\r\n }\r\n };\r\n\r\n $scope.nextPage = function() {\r\n if (!$scope.disableNext) {\r\n $scope.currentPage--;\r\n $scope.getStackedGraph();\r\n }\r\n };\r\n\r\n $scope.getStackedGraph();\r\n });\r\n\r\n $scope.backToBarGraph = function () {\r\n $state.goMainLayout(\"PropertyBarDashboard\");\r\n };\r\n\r\n $scope.getExcelData = function () {\r\n var groupId = utilli.getCurrentGroupId();\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GenerateGroupStackedExcel/';\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: { groupId: groupId, uom: $scope.units.selectedUnitsType.name, userName: $state.params.userId }\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 var fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\r\n utilli.downloadFile(url);\r\n }\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n $scope.getGreenButtonData = function () {\r\n var groupId = utilli.getCurrentGroupId();\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GenerateGroupStackedGreenButton/';\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: { groupId: groupId, userName: $state.params.userId }\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 var fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\r\n utilli.downloadFile(url, \"GreenButtonData.xml\");\r\n }\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n }\r\n ]);\r\n \n'use strict';\r\n\r\nangular.module('utilliApp').controller('PropertyBarDashboardController',\r\n ['$scope', '$rootScope', '$http', '$window', '$filter', 'usSpinnerService', 'ModalServiceExt', 'LeftMenuService',\r\n '$state', 'CommonHeaderService', 'DefaultPropertyService', 'UnitsService', 'PropertyService', 'CommonDataService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $window, $filter, usSpinnerService, ModalServiceExt, LeftMenuService,\r\n $state, CommonHeaderService, DefaultPropertyService, UnitsService, PropertyService, CommonDataService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n LeftMenuService.setCurrentTab('Dashboard');\r\n CommonHeaderService.setUpNotificationButton();\r\n $scope.formatNumber = utilli.formatNumber;\r\n $scope.units = UnitsService;\r\n $scope.maxMetersOnStackedDashboard = Config.maxMetersOnStackedDashboard;\r\n\r\n $scope.enableIndividualMeters = false;\r\n\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n $scope.enableIndividualMeters = commonData.EnablePropertyManagersDashboardIndividualMeters || utilli.isAdmin;\r\n }\r\n );\r\n\r\n $scope.meters = [''];\r\n $scope.currentMeter = '';\r\n\r\n DefaultPropertyService.getAggregation($state.params.userId).then(function (aggregation) {\r\n if (aggregation.Type !== utilli.aggregationTypes.property) {\r\n // https://stackoverflow.com/a/39461700/292787\r\n $state.goMainLayout('GroupDashboard', null, { location: 'replace' });\r\n return;\r\n }\r\n\r\n var getMeters = function () {\r\n var propertyId = utilli.getCurrentPropertyId();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Consumption/GetMeterNumbers/',\r\n method: \"GET\",\r\n params: {\r\n propertyId: propertyId,\r\n userName: $state.params.userId\r\n }\r\n }).success(function (consumptionResponse) {\r\n utilli.handleAjaxResponse(consumptionResponse,\r\n ModalServiceExt,\r\n function () {\r\n $scope.meters = _.map(consumptionResponse.Data, function (item) {\r\n return { id: item, value: item };\r\n });\r\n $scope.meters.unshift({ id: '', value: _t('All Meters') });\r\n });\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n getMeters();\r\n\r\n $scope.property = aggregation;\r\n PropertyService.loadProperty($scope.property, $scope.getBarGraph);\r\n\r\n $scope.previousPage = function () {\r\n if (!$scope.disablePrev) {\r\n $scope.currentPage++;\r\n $scope.getBarGraph();\r\n }\r\n };\r\n\r\n $scope.nextPage = function () {\r\n if (!$scope.disableNext) {\r\n $scope.currentPage--;\r\n $scope.getBarGraph();\r\n }\r\n };\r\n\r\n $scope.getBarGraph();\r\n });\r\n\r\n $scope.currentPage = 0;\r\n $scope.pageSize = 12;\r\n\r\n var consumptionReadingIndex = 0;\r\n //var amountIndex = 1;\r\n var averageTemperatureIndex = 1;\r\n var temperatureRangeIndex = 2;\r\n\r\n function fillChartData(consumptionData, chartOptions) {\r\n var i;\r\n $scope.units.setSelectedUnitsIfEmpty(consumptionData.Uom);\r\n var coefficient = 1; // $scope.units.getCoefficient(consumptionData.Uom);\r\n\r\n $scope.tableData = [];\r\n $scope.disablePrev = consumptionData.TableData.length <= $scope.pageSize;\r\n $scope.disableNext = $scope.currentPage <= 0;\r\n var shift = consumptionData.TableData.length < $scope.pageSize ? 0\r\n : consumptionData.TableData.length - $scope.pageSize;\r\n for (i = shift; i < consumptionData.TableData.length; i++) {\r\n var item = consumptionData.TableData[i];\r\n var clone = $.extend({}, item);\r\n clone.Consumption = utilli.trimFloat2(clone.Consumption * coefficient);\r\n clone.ConsumptionString = utilli.formatNumber(clone.Consumption);\r\n clone.AvgConsumption = utilli.trimFloat2(clone.AvgConsumption * coefficient);\r\n clone.AvgConsumptionString = utilli.formatNumber(clone.AvgConsumption);\r\n clone.AmountString = $filter('currency')(utilli.formatNumber(clone.Amount));\r\n clone.Unit = $scope.units.selectedUnitsType.name;\r\n clone.Date = new Date(clone.Year, clone.Month - 1, 1);\r\n $scope.tableData.push(clone);\r\n\r\n var date = clone.Year + '-' + clone.Month;\r\n chartOptions.series[consumptionReadingIndex].data.push({\r\n name: date,\r\n y: clone.Consumption,\r\n label: clone.ConsumptionString,\r\n // custom data\r\n unit: $scope.units.selectedUnitsType.name\r\n });\r\n\r\n //chartOptions.series[amountIndex].data.push({\r\n // name: date,\r\n // y: clone.Amount,\r\n // label: clone.AmountString\r\n //});\r\n\r\n chartOptions.series[averageTemperatureIndex].data.push({\r\n name: date,\r\n y: clone.AvgTemperature,\r\n low: clone.MonthMinTemperature,\r\n high: clone.MonthMaxTemperature\r\n });\r\n\r\n chartOptions.series[temperatureRangeIndex].data.push({\r\n name: date,\r\n low: item.MonthMinTemperature,\r\n high: item.MonthMaxTemperature\r\n });\r\n\r\n }\r\n }\r\n\r\n var plotBarChart = function (consumptionResponse) {\r\n var series = [\r\n {\r\n name: 'Consumption',\r\n data: [],\r\n tooltip: {\r\n pointFormat: '{point.label} {point.unit}',\r\n headerFormat: ''\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 // pointFormat: '{point.label}',\r\n // headerFormat: ''\r\n // }\r\n //},\r\n {\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 name: 'Temperature Range',\r\n type: 'errorbar',\r\n data: [],\r\n enableMouseTracking: false,\r\n yAxis: 2\r\n }\r\n ];\r\n var chartOptions = {\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n title: {\r\n text: ''\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: -45 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n formatter: function () {\r\n return utilli.formatNumber(this.value);\r\n }\r\n },\r\n title: {\r\n //text: _t('Amount ($)')\r\n text: _t('')\r\n },\r\n min: 0\r\n }, {\r\n labels: {\r\n formatter: function () {\r\n return utilli.formatNumber(this.value);\r\n }\r\n },\r\n title: {\r\n text: _t('Consumption') + ' (' + $scope.units.selectedUnitsType.name + ')'\r\n },\r\n opposite: true\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 legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\r\n floating: true,\r\n // ReSharper disable UndeclaredGlobalVariableUsing\r\n backgroundColor: (Highcharts.theme && Highcharts.theme.background2) || 'white',\r\n // ReSharper restore UndeclaredGlobalVariableUsing\r\n borderColor: '#CCC',\r\n borderWidth: 0,\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: $scope.currentMeter === '' ? 'pointer' : '',\r\n point: {\r\n events: {\r\n click: function () {\r\n if ($scope.enableIndividualMeters){\r\n $state.goMainLayout('PropertyDetailedDashboard',\r\n { selectedPeriodString: this.name });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n series: series,\r\n credits: {\r\n enabled: false\r\n }\r\n };\r\n\r\n fillChartData(consumptionResponse.Data, chartOptions);\r\n // ReSharper disable once UndeclaredGlobalVariableUsing\r\n Highcharts.chart('barGraphHere', chartOptions);\r\n }\r\n\r\n $scope.getBarGraph = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var propertyId = utilli.getCurrentPropertyId();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Consumption/GetPropertyConsumptionBars/',\r\n method: \"GET\",\r\n params: {\r\n propertyId: propertyId,\r\n skip: $scope.currentPage * $scope.pageSize, // currentPage starts with 0\r\n pageSize: $scope.pageSize + 1,\r\n meterNumber: $scope.currentMeter,\r\n userName: $state.params.userId,\r\n uom: $scope.units.selectedUnitsType.name\r\n }\r\n }).success(function (consumptionResponse) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(consumptionResponse,\r\n ModalServiceExt,\r\n function () {\r\n plotBarChart(consumptionResponse);\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n $scope.backToStackedGraph = function () {\r\n $state.goMainLayout(\"PropertyStackedDashboard\");\r\n };\r\n\r\n $scope.getExcelData = function () {\r\n var propertyId = utilli.getCurrentPropertyId();\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GeneratePropertyBarExcel/';\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: {\r\n propertyId: propertyId,\r\n meterNumber: $scope.currentMeter,\r\n uom: $scope.units.selectedUnitsType.name,\r\n userName: $state.params.userId\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 var fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\r\n utilli.downloadFile(url);\r\n }\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n $scope.getGreenButtonData = function () {\r\n var propertyId = utilli.getCurrentPropertyId();\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GeneratePropertyBarGreenButton/'\r\n + '?propertyId=' + propertyId;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: { userName: $state.params.userId }\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 var fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\r\n utilli.downloadFile(url, \"GreenButtonData.xml\");\r\n }\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n $scope.refreshScore = function () {\r\n PropertyService.refreshScore($scope.property, $scope.getBarGraph);\r\n };\r\n }\r\n ]);\r\n \n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('PropertyDetailedDashboardController',\r\n [\r\n '$scope', '$rootScope', '$http', '$window', '$filter', 'usSpinnerService', 'ModalServiceExt',\r\n 'LeftMenuService', '$state', 'CommonHeaderService', 'DefaultPropertyService', 'UnitsService',\r\n 'PropertyService',\r\n // ReSharper disable InconsistentNaming\r\n function($scope, $rootScope, $http, $window, $filter, usSpinnerService, ModalServiceExt, LeftMenuService,\r\n $state, CommonHeaderService, DefaultPropertyService, UnitsService, PropertyService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n LeftMenuService.setCurrentTab('Dashboard');\r\n CommonHeaderService.setUpNotificationButton();\r\n $scope.formatNumber = utilli.formatNumber;\r\n $scope.units = UnitsService;\r\n $scope.selectedPeriodString = $state.params.selectedPeriodString;\r\n\r\n DefaultPropertyService.getAggregation($state.params.userId).then(function (aggregation) {\r\n if (aggregation.Type !== utilli.aggregationTypes.property) {\r\n // https://stackoverflow.com/a/39461700/292787\r\n $state.goMainLayout('GroupDashboard', null, { location: 'replace' });\r\n return;\r\n }\r\n\r\n $scope.property = aggregation;\r\n PropertyService.loadProperty($scope.property, $scope.getBarGraph);\r\n $scope.getBarGraph();\r\n });\r\n\r\n function fillChartData(consumptionData, chartOptions, treeMapChartOptions) {\r\n var i;\r\n $scope.units.setSelectedUnitsIfEmpty(consumptionData.Uom);\r\n var coefficient = $scope.units.getCoefficient(consumptionData.Uom);\r\n\r\n $scope.tableData = [];\r\n for (i = 0; i < consumptionData.MeterConsumptions.length; i++) {\r\n var item = consumptionData.MeterConsumptions[i];\r\n var clone = $.extend({}, item);\r\n clone.Consumption = utilli.trimFloat2(clone.Consumption * coefficient);\r\n clone.ConsumptionString = utilli.formatNumber(clone.Consumption);\r\n clone.AvgConsumption = utilli.trimFloat2(clone.AvgConsumption * coefficient);\r\n clone.AvgConsumptionString = utilli.formatNumber(clone.AvgConsumption);\r\n clone.Unit = $scope.units.selectedUnitsType.name;\r\n clone.MeterNumber = clone.MeterNumber;\r\n $scope.tableData.push(clone);\r\n\r\n chartOptions.series[0].data.push({\r\n name: clone.MeterNumber,\r\n y: clone.Consumption,\r\n label: clone.ConsumptionString,\r\n // custom data\r\n unit: $scope.units.selectedUnitsType.name\r\n });\r\n\r\n treeMapChartOptions.series[0].data.push({\r\n name: clone.MeterNumber,\r\n value: clone.Consumption,\r\n colorValue: clone.Consumption\r\n });\r\n }\r\n }\r\n\r\n var plotBarChart = function (consumptionResponse) {\r\n var series = [\r\n {\r\n name: 'Consumption',\r\n data: [],\r\n tooltip: {\r\n pointFormat: '{point.label} {point.unit}',\r\n headerFormat: ''\r\n }\r\n }\r\n ];\r\n var chartOptions = {\r\n chart: {\r\n type: 'column'\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n title: {\r\n text: _t('Consumption Bar Chart')\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: -45 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n formatter: function () {\r\n return utilli.formatNumber(this.value);\r\n }\r\n },\r\n title: {\r\n text: _t('Consumption') + ' (' + $scope.units.selectedUnitsType.name + ')'\r\n }\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\r\n floating: true,\r\n // ReSharper disable UndeclaredGlobalVariableUsing\r\n backgroundColor: (Highcharts.theme && Highcharts.theme.background2) || 'white',\r\n // ReSharper restore UndeclaredGlobalVariableUsing\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 series: series,\r\n credits: {\r\n enabled: false\r\n }\r\n };\r\n\r\n var treeMapChartOptions = {\r\n colorAxis: {\r\n minColor: '#FFFFFF',\r\n maxColor: Highcharts.getOptions().colors[0]\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n series: [{\r\n type: 'treemap',\r\n layoutAlgorithm: 'squarified',\r\n data: []\r\n }],\r\n title: {\r\n text: _t('Consumption Treemap Chart')\r\n },\r\n tooltip: {\r\n formatter: function () {\r\n return ' ' + _t('Meter') + ': ' + this.point.name + '
' +\r\n '' + _t('Consumpton') + ': ' + this.point.value + ' ' + $scope.units.selectedUnitsType.name + '
'\r\n }\r\n }\r\n };\r\n\r\n fillChartData(consumptionResponse.Data, chartOptions, treeMapChartOptions);\r\n // ReSharper disable UndeclaredGlobalVariableUsing\r\n Highcharts.chart('barGraphHere', chartOptions);\r\n Highcharts.chart('treeGraphHere', treeMapChartOptions);\r\n // ReSharper restore UndeclaredGlobalVariableUsing\r\n }\r\n\r\n $scope.getBarGraph = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var propertyId = utilli.getCurrentPropertyId();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Consumption/GetPropertyDetailedConsupmtion/',\r\n method: \"GET\",\r\n params: {\r\n propertyId: propertyId,\r\n period: $state.params.selectedPeriodString,\r\n userName: $state.params.userId\r\n }\r\n }).success(function (consumptionResponse) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(consumptionResponse,\r\n ModalServiceExt,\r\n function () {\r\n plotBarChart(consumptionResponse);\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout(\"PropertyBarDashboard\");\r\n };\r\n\r\n $scope.refreshScore = function () {\r\n PropertyService.refreshScore($scope.property, $scope.getBarGraph);\r\n };\r\n }\r\n ]);\r\n \n'use strict';\r\n// ReSharper disable once UndeclaredGlobalVariableUsing\r\nangular.module('utilliApp')\r\n .controller('PropertyListController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', 'GetAccountsService', '$stateParams',\r\n 'CommonHeaderService', 'DueReminderService', 'ModalServiceExt', 'PropertyListService', 'PropertyService',\r\n 'propertyManagerTourService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window, usSpinnerService, LeftMenuService, $state,\r\n GetAccountsService, $stateParams, CommonHeaderService, DueReminderService, ModalServiceExt,\r\n PropertyListService, PropertyService, propertyManagerTourService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n\r\n if (localStorage.getItem('showEsScoreInfoPopup') == 'true') {\r\n localStorage.setItem('showEsScoreInfoPopup', 'false');\r\n ModalServiceExt.showOkMessage($scope._t('Energy Star Score Information'), $scope._t('Please ensure that all gas meters at each property are registered with the Washington Gas Property Manager application for accurate submission to Energy Star Portfolio Manager.
Your Energy Star score:
Includes calculations for all gas, electric and water consumption being reported to the Energy Star Portfolio Manager by property.
Is calculated by Energy Star Portfolio Manager based on the meters submitted for each property.'));\r\n }\r\n\r\n var addProperty = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetEnergyStarInfo/',\r\n method: \"GET\",\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n if (response.Data != null) {\r\n $state.goMainLayout(\"AddProperty.PropertyOverview\", { stepsCount: 5, step: 0 });\r\n } else {\r\n $state.goMainLayout(\"AddProperty.LinkEnergyStarAccount\", { stepsCount: 6, step: 0 });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n };\r\n CommonHeaderService.setUpNotificationButton(_t('My Properties'));\r\n\r\n $scope.addProperty = addProperty;\r\n\r\n $scope.importProperty = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetEnergyStarInfo/',\r\n method: \"GET\",\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.Data != null) {\r\n $state.goMainLayout(\"AddProperty.ShareExistingEnergyStarPropertyInstructions\", { stepsCount: 2 });\r\n } else {\r\n //$state.goMainLayout(\"AddProperty.LinkEnergyStarAccountForPropertyImport\", { stepsCount: 3 });\r\n $state.goMainLayout(\"AddProperty.LinkEnergyStarAccountForPropertyImportInstructions\", { stepsCount: 3 });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n $scope.errors = [];\r\n\r\n $scope.refreshScore = function (property) {\r\n PropertyListService.refreshScore($scope, property);\r\n };\r\n\r\n $scope.why = function (property) {\r\n $state.goMainLayout('ReasonsForNoScore', { propertyId: property.Id });\r\n }\r\n\r\n $scope.goToAuth = function (property) {\r\n $state.goMainLayout('Authorizations');\r\n }\r\n\r\n $scope.deleteProperty = function (property) {\r\n ModalServiceExt.showYesNoMessage(\r\n _t('Delete Property'),\r\n _t('Please be advised that all historical aggregated consumption for meters being reported so far, will be moved from this account and with Energy Star Portfolio Manager. Are you sure you want to delete this property?'),\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/DeleteProperty/',\r\n method: \"POST\",\r\n params: { propertyId: property.Id, userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n // if we delete the currently selected property then select another property as current\r\n var currentAggregation = utilli.getCurrentAggregation();\r\n if (currentAggregation && currentAggregation.Type === utilli.aggregationTypes.property && property.Id === currentAggregation.Id) {\r\n if ($scope.propertyList && $scope.propertyList.length > 1) {\r\n var newCurrentProperty = $scope.propertyList.find(function (item) {\r\n return item.Id !== property.Id;\r\n });\r\n newCurrentProperty.Type = utilli.aggregationTypes.property;\r\n localStorage.setItem('currentAggregation', JSON.stringify(newCurrentProperty));\r\n } else {\r\n localStorage.removeItem('currentAggregation');\r\n }\r\n }\r\n $state.goMainLayout('PropertyList', null, { reload: true });\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n });\r\n }\r\n\r\n $scope.viewProperty = function (property) {\r\n property.Type = utilli.aggregationTypes.property;\r\n localStorage.setItem('currentAggregation', JSON.stringify(property));\r\n PropertyService.goToDashboard(property, $state);\r\n }\r\n\r\n $scope.editProperty = function (property) {\r\n //$state.goMainLayout('AddProperty.PropertyOverview', { id: property.Id, mode: 'edit', stepsCount: 5, step: 0 });\r\n //$state.goMainLayout('Property', { propertyId: property.Id });\r\n\r\n $state.goMainLayout('EditProperty', { id: property.Id });\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n // first time load with error handlers. on the next subsequent reloads don't show error messages\r\n // to avoid creation of too many identical error messages\r\n PropertyListService.getPropertyList().success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n PropertyListService.loadPropertyList($scope, response);\r\n\r\n if (propertyManagerTourService.isTourActive()) {\r\n usSpinnerService.stop('spinner-1');\r\n propertyManagerTourService.resumeTour('Dashboard');\r\n }\r\n else\r\n propertyManagerTourService.startTour(function () { usSpinnerService.stop('spinner-1'); });\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }])\r\n;\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('ReasonsForNoScoreController', ['$scope', '$http', \r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'CommonHeaderService',\r\n 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state,\r\n $stateParams, CommonHeaderService, ModalServiceExt) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUpBackButton(_t('Score Reason'));\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/WhyEmptyScore/',\r\n method: \"GET\",\r\n params: { propertyId: $stateParams.propertyId, userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (response.Data) {\r\n $scope.reaons = response.Data;\r\n }\r\n else {\r\n $scope.reaons = _t(\"Reason is not determined.\");\r\n }\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('PropertyGroupListController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'CommonHeaderService',\r\n 'DueReminderService', 'ModalServiceExt', 'PropertyListService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window, usSpinnerService, LeftMenuService, $state,\r\n $stateParams, CommonHeaderService, DueReminderService, ModalServiceExt, PropertyListService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyPropertyGroups');\r\n CommonHeaderService.setUpNotificationButton(_t('My Property Groups'));\r\n\r\n $scope.addGroup = function () {\r\n if ($scope.noProperties) {\r\n $state.goMainLayout(\"Property\");\r\n } else {\r\n $state.goMainLayout(\"AddPropertyGroup\");\r\n }\r\n };\r\n\r\n $scope.errors = [];\r\n\r\n $scope.createProperty = function() {\r\n $state.goMainLayout(\"PropertyList\");\r\n }\r\n\r\n $scope.deleteGroup = function (group) {\r\n ModalServiceExt.showYesNoMessage(_t('Delete Group'), _t('Are you sure that you want to delete the group?'),\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/DeletePropertyGroup/',\r\n method: \"POST\",\r\n params: { propertyGroupId: group.Id, userName: $state.params.userId }\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n // if we delete the currently selected group then select another group as current\r\n var currentAggregation = utilli.getCurrentAggregation();\r\n if (currentAggregation && currentAggregation.Type === utilli.aggregationTypes.group && group.Id === currentAggregation.Id) {\r\n if ($scope.groupList && $scope.groupList.length > 1) {\r\n var newCurrentGroup = $scope.groupList.find(function(item) {\r\n return item.Id !== group.Id;\r\n });\r\n newCurrentGroup.Type = utilli.aggregationTypes.group;\r\n localStorage.setItem('currentAggregation', JSON.stringify(newCurrentGroup));\r\n } else {\r\n localStorage.removeItem('currentAggregation');\r\n }\r\n }\r\n\r\n $state.goMainLayout('PropertyGroupList', null, { reload: true });\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n });\r\n }\r\n\r\n $scope.viewGroup = function (group) {\r\n group.Type = utilli.aggregationTypes.group;\r\n localStorage.setItem('currentAggregation', JSON.stringify(group));\r\n $state.goMainLayout('GroupStackedDashboard');\r\n }\r\n\r\n $scope.editGroup = function (group) {\r\n $state.goMainLayout('EditPropertyGroup', { propertyGroupId: group.Id });\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetPropertyGroupList/',\r\n method: \"GET\",\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (!response.Data || response.Data.length === 0) {\r\n $scope.groupList = [];\r\n\r\n usSpinnerService.spin('spinner-1');\r\n PropertyListService.getPropertyList().success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (!response.Data || response.Data.length === 0) {\r\n $scope.noProperties = true;\r\n }\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n else {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.groupList = response.Data;\r\n }\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }])\r\n;\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('AddPropertyController', ['$scope', 'LeftMenuService', '$state', '$stateParams', 'CommonHeaderService',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, LeftMenuService, $state, $stateParams, CommonHeaderService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Properties'));\r\n\r\n if ($state.params)\r\n $scope.mode = $state.params.mode;\r\n\r\n $scope.step = 0;\r\n\r\n $scope.cancel = function () {\r\n if ($scope.mode !== 'edit') {\r\n $state.goMainLayout('PropertyList');\r\n }\r\n else if ($scope.mode === 'edit') {\r\n $state.goMainLayout('EditProperty', { id: $state.params.id });\r\n }\r\n }\r\n }])\r\n .controller('PropertyOverviewController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'CommonHeaderService',\r\n 'ModalServiceExt', 'PropertyDataService', 'propertyManagerTourService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state, $stateParams, CommonHeaderService,\r\n ModalServiceExt, PropertyDataService, propertyManagerTourService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n if ($stateParams.mode === 'edit') {\r\n $scope.headerText = _t('Edit Property - Property Overview');\r\n $scope.mode = 'edit';\r\n } else {\r\n $scope.headerText = _t('Add Property - Property Overview');\r\n $scope.mode = 'add';\r\n }\r\n\r\n $scope.currentYear = new Date().getFullYear();\r\n\r\n $scope.deactivateOldMeters = true;\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n\r\n if ($stateParams.id) {\r\n PropertyDataService.getProperty($stateParams.id, function (property) {\r\n $scope.propertyName = property.PropertyName;\r\n $scope.propertyPrimaryFunction = property.PrimaryPropertyFunction;\r\n $scope.address1 = property.Address1;\r\n $scope.address2 = property.Address2;\r\n $scope.city = property.City;\r\n $scope.state = property.State;\r\n $scope.postalCode = property.Zip;\r\n $scope.grossFloorArea = property.GrossFloorArea;\r\n $scope.grossFloorAreaUnits = property.GrossFloorAreaUnits.toString();\r\n $scope.yearBuilt = property.YearBuilt;\r\n $scope.irrigatedArea = property.IrrigatedArea;\r\n $scope.irrigatedAreaUnits = property.IrrigatedAreaUnits.toString();\r\n $scope.occupancy = property.Occupancy.toString();\r\n $scope.numberOfBuildings = property.NumberOfUnits;\r\n //$scope.virtualMeters = property.VirtualMeters;\r\n //$scope.currentVirtualMeter = _.find(\r\n // property.VirtualMeters,\r\n // function (virtualMeter) { return virtualMeter.MeterId === property.EnergyStarMeterId; });\r\n });\r\n }\r\n\r\n if (propertyManagerTourService.isTourActive()) {\r\n propertyManagerTourService.resumeTour('PropertyOverview');\r\n }\r\n\r\n $scope.next = function () {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/PropertyManagers/SavePropertyOverview/';\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: {\r\n Id: $stateParams.id,\r\n PropertyName: $scope.propertyName,\r\n PrimaryPropertyFunction: $scope.propertyPrimaryFunction,\r\n Address1: $scope.address1,\r\n Address2: $scope.address2,\r\n City: $scope.city,\r\n State: $scope.state,\r\n Zip: $scope.postalCode,\r\n GrossFloorArea: {\r\n Area: $scope.grossFloorArea,\r\n Units: $scope.grossFloorAreaUnits\r\n },\r\n YearBuilt: $scope.yearBuilt,\r\n IrrigatedArea: {\r\n Area: $scope.irrigatedArea,\r\n Units: $scope.irrigatedAreaUnits\r\n },\r\n Occupancy: $scope.occupancy,\r\n NumberOfBuildings: $scope.numberOfBuildings,\r\n DeactivateOldMeters: $scope.deactivateOldMeters\r\n },\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n if ($scope.mode !== 'edit') {\r\n $state.goMainLayout(\"AddProperty.PropertyType\",\r\n {\r\n id: response.Data.PropertyId,\r\n mode: $stateParams.mode,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: 1 + $scope.$parent.step * 1\r\n });\r\n }\r\n else if ($scope.mode === 'edit') {\r\n $state.goMainLayout('EditProperty', { id: response.Data.PropertyId });\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('PropertyTypeController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams',\r\n 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService', 'PropertySettingsService', 'propertyManagerTourService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state, $stateParams,\r\n CommonHeaderService, ModalServiceExt, PropertyDataService, PropertySettingsService, propertyManagerTourService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n if ($stateParams.mode === 'edit')\r\n $scope.headerText = _t('Edit Property - Property Types');\r\n else\r\n $scope.headerText = _t('Add Property - Property Types');\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n\r\n if (propertyManagerTourService.isTourActive()) {\r\n propertyManagerTourService.resumeTour('PropertyTypes');\r\n }\r\n\r\n $scope.propertyTypes = [];\r\n PropertySettingsService.getPropertyTypeNames()\r\n .forEach(function (type, index) {\r\n $scope.propertyTypes.push({ typeId: index + 1, caption: type });\r\n });\r\n\r\n $scope.chosenPropertyTypes = [];\r\n PropertyDataService.getProperty($stateParams.id, function (property) {\r\n property.PropertyTypes.forEach(function (type) {\r\n var propType = { id: type.Id, name: type.Name, typeId: type.TypeId, caption: $scope.propertyTypes[type.TypeId - 1] };\r\n if (propType.name == '' || propType.name == null)\r\n {\r\n propType.name = 'not specified yet';\r\n }\r\n $scope.chosenPropertyTypes.push(propType);\r\n });\r\n\r\n if ($scope.chosenPropertyTypes.length === 0)\r\n $scope.chosenPropertyTypes.push({ typeId: -1, caption: '', name: 'not specified yet' });\r\n });\r\n\r\n $scope.addPropertyType = function () {\r\n $scope.chosenPropertyTypes.push({ typeId: -1, caption: '', name: 'not specified yet' });\r\n }\r\n\r\n $scope.deletePropertyType = function ($index) {\r\n $scope.chosenPropertyTypes.splice($index, 1);\r\n }\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout('AddProperty.PropertyOverview', { id: $stateParams.id, mode: $stateParams.mode, stepsCount: $scope.$parent.overallStepsCount, step: $scope.$parent.step - 1 });\r\n }\r\n\r\n var validate = function () {\r\n $scope.chosenPropertyTypes.forEach(function (item, index) {\r\n var empty = !item || item.typeId < 0;\r\n $scope.form['propertyType' + index].$setValidity('required', !empty);\r\n });\r\n }\r\n\r\n $scope.next = function () {\r\n $scope.form.$submitted = true;\r\n validate();\r\n if (!$scope.form.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/PropertyManagers/SavePropertyTypes/';\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: {\r\n PropertyId: $stateParams.id,\r\n PropertyTypes: _.map($scope.chosenPropertyTypes, function (type) {\r\n return {Id: type.id, Name: type.name, TypeId: type.typeId };\r\n })\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\r\n // This is removed to fix UCXPM-67\r\n // Not clear why we are changing collection $scope.chosenPropertyTypes. We will go away from this controller anyway\r\n //PropertyDataService.getProperty($stateParams.id, function (property) {\r\n // property.PropertyTypes.forEach(function (type) {\r\n // $scope.chosenPropertyTypes.push({ id: type.Id, name: type.Name, typeId: type.TypeId, caption: PropertySettingsService.propertyTypeNames[type.TypeId - 1] });\r\n // });\r\n //});\r\n\r\n $state.goMainLayout(\"AddProperty.PropertyDetails\", { id: $stateParams.id, type: 0, mode: $stateParams.mode, stepsCount: $scope.$parent.overallStepsCount, step: 1 + $scope.$parent.step*1 });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }])\r\n .controller('PropertyDetailsController', ['$scope', '$http',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'CommonHeaderService', 'ModalServiceExt',\r\n 'PropertyDataService', 'PropertySettingsService', 'propertyManagerTourService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, CommonHeaderService, ModalServiceExt,\r\n PropertyDataService, PropertySettingsService, propertyManagerTourService) {\r\n // $scope.isNumber = angular.isNumber;\r\n $scope.isNumber = function (n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n $scope.propertyDetailsName = '';\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n if ($stateParams.mode === 'edit')\r\n $scope.headerText = _t('Edit Property - Property Details');\r\n else\r\n $scope.headerText = _t('Add Property - Property Details');\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n\r\n var handledPropertyTypesCount = $stateParams.type;\r\n if (handledPropertyTypesCount == 0 && propertyManagerTourService.isTourActive()) {\r\n propertyManagerTourService.resumeTour('PropertyDetails');\r\n }\r\n\r\n function setPropertyType() {\r\n $scope.currentPropertyType = $scope.propertyTypes[handledPropertyTypesCount];\r\n $scope.propertyDetailsName = $scope.currentPropertyType.Name;\r\n var propTymeNames = PropertySettingsService.getPropertyTypeNames();\r\n $scope.currentPropertyTypeGoodName = propTymeNames[$scope.currentPropertyType.TypeId - 1];\r\n if ($scope.currentPropertyType.FieldsJson) {\r\n var fields = angular.fromJson($scope.currentPropertyType.FieldsJson);\r\n // Need to sort to gaurantee that order of controls after deserialization from json is still desirable \r\n $scope.currentPropertyFieldSettings.fieldsList = _.sortBy(fieldsObjectToArray(fields), function (itm) { return itm.num; }); \r\n } else {\r\n $scope.currentPropertyFieldSettings = PropertySettingsService.getPropertyFieldsSettings()[$scope.currentPropertyType.TypeId];\r\n $scope.currentPropertyFieldSettings.fieldsList.forEach(\r\n function (control) {\r\n if (control.units != null && control.units != '') {\r\n control.units = '';\r\n }\r\n control.value = '';\r\n });\r\n }\r\n }\r\n\r\n $scope.currentPropertyFieldSettings = { fieldsList: [] };\r\n var yearBuilt;\r\n PropertyDataService.getProperty($stateParams.id, function (property) {\r\n $scope.propertyTypes = property.PropertyTypes;\r\n yearBuilt = property.YearBuilt;\r\n setPropertyType();\r\n });\r\n\r\n $scope.fieldCaptionByFieldName = PropertySettingsService.getFieldCaptionByFieldName();\r\n $scope.fieldDescriptionByFieldName = PropertySettingsService.getFieldDescriptionByFieldName();\r\n\r\n function fieldsObjectToArray(fieldsObject) {\r\n var array = [];\r\n for (var field in fieldsObject) {\r\n if (fieldsObject.hasOwnProperty(field)) {\r\n fieldsObject[field].controlType = PropertySettingsService.controlTypeByFieldName[field];//\"grossFloorAreaType\";\r\n fieldsObject[field].name = field;\r\n array.push(fieldsObject[field]);\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n var getPropertyUsage = function (propertyFieldSettings) {\r\n var result = {};\r\n var dateString = 'January 1, ' + yearBuilt + ' 23:15:30';\r\n var itemNum = 0;\r\n propertyFieldSettings.fieldsList.forEach(function (setting) {\r\n result[setting.name] = {\r\n 'value': setting.value,\r\n 'units': setting.units,\r\n 'currentAsOf': new Date(dateString),\r\n 'valueSpecified': true,\r\n 'currentAsOfSpecified': true,\r\n 'temporary': false,\r\n 'temporarySpecified': true,\r\n 'controlType': setting.controlType,\r\n 'name': setting.name,\r\n 'num': itemNum // for sorting after recreation list of controls from json stored in db. will sort by this field\r\n }\r\n itemNum++\r\n });\r\n \r\n return result;\r\n }\r\n \r\n $scope.back = function () {\r\n if (handledPropertyTypesCount <= 0) {\r\n $state.goMainLayout('AddProperty.PropertyType', { id: $stateParams.id, mode: $stateParams.mode, stepsCount: $scope.$parent.overallStepsCount, step: $scope.$parent.step - 1 });\r\n return;\r\n }\r\n handledPropertyTypesCount--;\r\n $state.goMainLayout(\r\n 'AddProperty.PropertyDetails',\r\n { id: $stateParams.id, type: handledPropertyTypesCount, mode: $stateParams.mode, stepsCount: $scope.$parent.overallStepsCount, step: $scope.$parent.step });\r\n }\r\n\r\n function validateUsageDetails () {\r\n var result = true;\r\n if ($scope.propertyDetailsName === '')\r\n result = false;\r\n $scope.currentPropertyFieldSettings.fieldsList.forEach(function (inputField) {\r\n if (inputField.value === '' || inputField.units === '')\r\n result = false;\r\n if (inputField.controlType == 'grossFloorAreaType' && !$scope.isNumber(inputField.value))\r\n result = false;\r\n if (inputField.controlType == 'lengthType' && !$scope.isNumber(inputField.value))\r\n result = false;\r\n if (inputField.controlType == 'useDecimalType' && !$scope.isNumber(inputField.value))\r\n result = false;\r\n if (inputField.controlType == 'weeklyOperatingHoursType' && !$scope.isNumber(inputField.value))\r\n result = false;\r\n if (inputField.controlType == 'intNumberType' && !$scope.isNumber(inputField.value))\r\n result = false;\r\n });\r\n return result;\r\n }\r\n\r\n $scope.next = function () {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid || !validateUsageDetails())\r\n return;\r\n\r\n $scope.form.$submitted = false;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var currentType = $.extend({}, $scope.currentPropertyType);\r\n currentType.Name = $scope.propertyDetailsName;\r\n currentType.FieldsJson = angular.toJson(getPropertyUsage($scope.currentPropertyFieldSettings));\r\n\r\n var url = localStorage.getItem('ApiUrl') + 'api/PropertyManagers/SavePropertyTypeDetails/';\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: {\r\n PropertyId: $stateParams.id,\r\n PropertyType: currentType\r\n },\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n handledPropertyTypesCount++;\r\n if ($scope.propertyTypes.length <= handledPropertyTypesCount) {\r\n \r\n if ($scope.mode != 'edit') {\r\n $state.goMainLayout(\"AddProperty.AddMeters\",\r\n {\r\n id: $stateParams.id,\r\n mode: $stateParams.mode,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: 1 + $scope.$parent.step * 1\r\n });\r\n }\r\n else if ($scope.mode == 'edit') {\r\n $state.goMainLayout(\"EditProperty\",\r\n {\r\n id: $stateParams.id,\r\n });\r\n }\r\n } else {\r\n $state.goMainLayout(\r\n 'AddProperty.PropertyDetails',\r\n {\r\n id: $stateParams.id,\r\n type: handledPropertyTypesCount,\r\n mode: $stateParams.mode,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: $scope.$parent.step\r\n });\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('AddMetersController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService',\r\n '$state', '$stateParams', 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService', 'BulkMetersService',\r\n 'PropertyService', 'propertyManagerTourService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state, $stateParams, CommonHeaderService,\r\n ModalServiceExt, PropertyDataService, BulkMetersService, PropertyService, propertyManagerTourService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n if ($stateParams.mode === 'edit')\r\n $scope.headerText = _t('Edit Property - Edit Meters');\r\n else\r\n $scope.headerText = _t('Add Property - Add Meters');\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n $scope.serviceAddressMismatchErrorCode = utilli.pm.meterErrorCodes.serviceAddressMismatch;\r\n $scope.mode = $stateParams.mode;\r\n $scope.getErrorInfo = PropertyDataService.getErrorInfo;\r\n\r\n if (propertyManagerTourService.isTourActive()) {\r\n propertyManagerTourService.resumeTour('AddMeters');\r\n }\r\n\r\n $scope.setCurrentMeterVisible = function () {\r\n setTimeout(function () {\r\n $('#meter' + $scope.topMeterId)[0].scrollIntoView();\r\n }, 500);\r\n }\r\n\r\n function loadMeters() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'GET',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetPropertyMeters/',\r\n params: { propertyId: $stateParams.id, userName: $state.params.userId }\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 $scope.meters = response.Data.Meters;\r\n $scope.meters.forEach(function(m) {\r\n m.checked = !m.HasMultipleAddresses\r\n && m.ErrorCode === utilli.pm.meterErrorCodes.serviceAddressMismatch;\r\n });\r\n var bulkMeters = BulkMetersService.getMeters();\r\n if (bulkMeters && bulkMeters.length > 0) {\r\n bulkMeters.forEach(function(meter) {\r\n $scope.meters.push({ Id: 0, MeterNumber: meter });\r\n });\r\n BulkMetersService.clear();\r\n }\r\n\r\n if ($scope.meters.length === 0)\r\n $scope.meters.push({ Id: 0, MeterNumber: '' })\r\n else if ($stateParams.topMeter)\r\n $scope.topMeterId = $stateParams.topMeter;\r\n else if ($scope.canMassVerifyServiceAddress($scope.failedMeters))\r\n utilli.scrollBottom();\r\n\r\n // We need our own client unique meter Id to delete/update meters since filter will broke angular index:\r\n var clientUtilliIdCounter = 0;\r\n $scope.meters.forEach(function(meter) {\r\n meter.clientUtilliId = clientUtilliIdCounter;\r\n meter.numberForSearch =\r\n meter\r\n .MeterNumber; // it is for search because if search by MeterNumber than meter will dissapear during edit and this suxx\r\n clientUtilliIdCounter++;\r\n });\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n loadMeters();\r\n\r\n $scope.getMetersCount = function () {\r\n var filteredMeters = _.filter($scope.meters, function (mtr) { return mtr.numberForSearch !== undefined && mtr.numberForSearch !== ''; });\r\n return filteredMeters.length;\r\n }\r\n\r\n $scope.isDeleteAllAvailable = function () {\r\n //var filteredMeters = _.filter($scope.meters, function (mtr) { return mtr.numberForSearch !== '' || mtr.MeterNumber !== ''; });\r\n //return filteredMeters.length > 0;\r\n return $scope.meters != undefined && $scope.meters != null && $scope.getMetersCount() > 0;\r\n }\r\n\r\n $scope.bulkInput = function () {\r\n // push currently added but not yet submitted meters\r\n var addedMeters = _.filter($scope.meters, function (m) { return m.Id === 0 && m.MeterNumber !==''; });\r\n var addedMeterNumbers = _.map(addedMeters, function(m) { return m.MeterNumber; });\r\n BulkMetersService.addMeters(addedMeterNumbers);\r\n $state.goMainLayout('AddProperty.BulkMetersInput', { id: $stateParams.id, mode: $stateParams.mode, stepsCount: $stateParams.stepsCount, step: $stateParams.step});\r\n }\r\n\r\n $scope.canMassVerifyServiceAddress = function() {\r\n return PropertyService.canMassVerifyServiceAddress($scope.meters);\r\n }\r\n\r\n $scope.verifyAllAddresses = function() {\r\n PropertyService.verifyAllAddresses($stateParams.id, $scope.meters, loadMeters);\r\n }\r\n\r\n $scope.deleteAllMeters = function () {\r\n ModalServiceExt.showYesNoMessage(\r\n _t('Delete all meters'),\r\n _t('Are you sure you want to delete all meters?'),\r\n function () {\r\n $scope.meters.slice().forEach(function (meter) {\r\n PropertyService.deleteMeterWithoutConfirmation($scope.meters, meter.clientUtilliId);\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.copyMeters = function () {\r\n var $temp = $(\"\");\r\n $(\"body\").append($temp);\r\n\r\n var copiedMeters = '';\r\n if ($scope.meters && $scope.meters.length > 0) {\r\n copiedMeters = _.pluck($scope.meters, 'MeterNumber').join();\r\n }\r\n\r\n $temp.val(copiedMeters).select();\r\n document.execCommand(\"copy\");\r\n $temp.remove();\r\n\r\n ModalServiceExt.showInfo('Meter numbers were copied to clipboard.');\r\n }\r\n\r\n $scope.addMeter = function () {\r\n var maxId = 0;\r\n $scope.meters.forEach(function (meter) {\r\n if (meter.clientUtilliId >= maxId)\r\n {\r\n maxId = meter.clientUtilliId + 1;\r\n }\r\n });\r\n\r\n $scope.meters.push({ Id: 0, MeterNumber: '', clientUtilliId: maxId, numberForSearch: '' });\r\n }\r\n\r\n $scope.deleteMeter = function (clientUtilliId) {\r\n usSpinnerService.spin('spinner-1');\r\n PropertyService.deleteMeter($scope.meters, clientUtilliId);\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n\r\n $scope.back = function () {\r\n PropertyDataService.getProperty($stateParams.id,\r\n function(property) {\r\n var typeIndex = property.PropertyTypes.length - 1;\r\n $state.goMainLayout(\r\n 'AddProperty.PropertyDetails',\r\n {\r\n id: $stateParams.id,\r\n type: typeIndex,\r\n mode: $stateParams.mode,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: $scope.$parent.step - 1\r\n });\r\n });\r\n }\r\n\r\n $scope.next = function () {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/PropertyManagers/SaveMeters/';\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: {\r\n PropertyId: $stateParams.id,\r\n Meters: $scope.meters\r\n },\r\n params: { userName: $state.params.userId }\r\n }).then(function(httpResponse) {\r\n var response = httpResponse.data;\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function() {\r\n \r\n if (response.Data.Meters && response.Data.Meters.length > 0) {\r\n $state.goMainLayout(\"AddProperty.FailedMeters\",\r\n {\r\n id: $stateParams.id,\r\n mode: $stateParams.mode,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: $scope.$parent.step\r\n });\r\n }\r\n else if ($stateParams.mode === 'edit') {\r\n if(response.Data.NeedMetersApproval)\r\n PropertyDataService.showAuthorizationMetersWarningDialog($stateParams.id, function () {\r\n ModalServiceExt.showInfo(\r\n _t(\"Property is successfuly edited but consumption data will not be submitted to Energy Star until tenants authorize data sharing.\"),\r\n function () { $state.goMainLayout(\"EditProperty\", { id: $stateParams.id }); });\r\n });\r\n else\r\n $state.goMainLayout(\"EditProperty\", { id: $stateParams.id });\r\n } else {\r\n $state.goMainLayout(\"AddProperty.Authorization\",\r\n {\r\n id: $stateParams.id,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: $scope.$parent.step * 1 + 1\r\n });\r\n }\r\n });\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\r\n })['finally'](function() {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }])\r\n .controller('FailedMetersController', ['$scope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService', 'CommonHeaderService',\r\n 'ModalServiceExt', 'PropertyDataService', 'PropertyService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, $timeout, $window, usSpinnerService, LeftMenuService, $state, $stateParams,\r\n GetAccountsService, CommonHeaderService, ModalServiceExt, PropertyDataService, PropertyService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n if ($stateParams.mode === 'edit')\r\n $scope.headerText = _t('Edit Property - Validation Error');\r\n else\r\n $scope.headerText = _t('Add Property - Validation Error');\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n $scope.serviceAddressMismatchErrorCode = utilli.pm.meterErrorCodes.serviceAddressMismatch;\r\n\r\n $scope.property = {};\r\n\r\n $scope.setCurrentMeterVisible = function () {\r\n setTimeout(function () {\r\n $('#meter' + $scope.topMeterId)[0].scrollIntoView();\r\n }, 500);\r\n }\r\n\r\n function loadMeters() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: \"GET\",\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetFailedMeters/',\r\n params: { propertyId: $stateParams.id, userName: $state.params.userId }\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\r\n if (response.Data.Meters && response.Data.Meters.length > 0) {\r\n $scope.failedMeters = response.Data.Meters;\r\n $scope.failedMeters.forEach(function(mtr) {\r\n mtr.clientUtilliId = mtr.Id;\r\n mtr.checked = !mtr.HasMultipleAddresses &&\r\n mtr.ErrorCode === utilli.pm.meterErrorCodes.serviceAddressMismatch;\r\n });\r\n\r\n if ($stateParams.topMeter)\r\n $scope.topMeterId = $stateParams.topMeter;\r\n else if ($scope.canMassVerifyServiceAddress($scope.failedMeters))\r\n utilli.scrollBottom();\r\n } \r\n else if ($stateParams.mode === 'edit') {\r\n var requestParams = { id: $state.params.id };\r\n if (response.Data.NeedMetersApproval)\r\n requestParams.showAuthorizationMetersWarning = true;\r\n $state.goMainLayout('EditProperty', requestParams);\r\n } \r\n else {\r\n $state.goMainLayout(\"AddProperty.Authorization\",\r\n {\r\n id: $stateParams.id,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: $scope.$parent.step * 1 + 1\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 loadMeters();\r\n\r\n\r\n $scope.verifyAllAddresses = function () {\r\n PropertyService.verifyAllAddresses($stateParams.id, $scope.failedMeters, loadMeters);\r\n }\r\n\r\n $scope.getErrorInfo = PropertyDataService.getErrorInfo;\r\n $scope.deleteMeter = function (utilliIndex) {\r\n PropertyService.deleteMeter($scope.failedMeters, utilliIndex, function() {\r\n if ($scope.failedMeters.length === 0)\r\n $state.goMainLayout('AddProperty.AddMeters', {\r\n id: $stateParams.id,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: $scope.$parent.step,\r\n mode: $stateParams.mode\r\n });\r\n });\r\n }\r\n\r\n $scope.canMassVerifyServiceAddress = function () {\r\n return PropertyService.canMassVerifyServiceAddress($scope.failedMeters);\r\n }\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout('AddProperty.AddMeters',\r\n {\r\n id: $stateParams.id,\r\n mode: $stateParams.mode,\r\n stepsCount: $scope.$parent.overallStepsCount,\r\n step: $scope.$parent.step - 1\r\n });\r\n }\r\n\r\n $scope.verify = function () {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/PropertyManagers/SaveMeters/';\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: {\r\n PropertyId: $stateParams.id,\r\n Meters: $scope.failedMeters\r\n },\r\n params: { userName: $state.params.userId }\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 else if (response.Data.Meters && response.Data.Meters.length > 0)\r\n $scope.failedMeters = response.Data.Meters;\r\n else if ($stateParams.mode === 'edit')\r\n {\r\n if(response.Data.NeedMetersApproval)\r\n PropertyDataService.showAuthorizationMetersWarningDialog($stateParams.id, function () {\r\n ModalServiceExt.showInfo(\r\n _t(\"Property is successfuly edited but consumption data will not be submitted to Energy Star until tenants authorize data sharing.\"),\r\n function () { \r\n $state.goMainLayout(\"EditProperty\", { id: $stateParams.id });\r\n });\r\n });\r\n else\r\n $state.goMainLayout('EditProperty', { id: $state.params.id });\r\n } \r\n else\r\n $state.goMainLayout(\"AddProperty.Authorization\", { id: $stateParams.id, stepsCount: $scope.$parent.overallStepsCount, step: 1 + $scope.$parent.step*1 });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }])\r\n .controller('AuthorizationController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService',\r\n 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService', 'propertyManagerTourService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, GetAccountsService,\r\n CommonHeaderService, ModalServiceExt, PropertyDataService, propertyManagerTourService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n $scope.headerText = _t('Add Property - Authorization');\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n\r\n if (propertyManagerTourService.isTourActive()) {\r\n propertyManagerTourService.resumeTour('Authorization');\r\n }\r\n\r\n PropertyDataService.getProperty($stateParams.id, function (property) {\r\n if (property.Authorized)\r\n $state.goMainLayout('PropertyList');\r\n });\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout('AddProperty.AddMeters', { id: $stateParams.id, stepsCount: $scope.$parent.overallStepsCount, step: $scope.$parent.step - 1 });\r\n }\r\n\r\n $scope.submit = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AuthorizeProperty/',\r\n params: { propertyId: $stateParams.id, userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n\r\n if (response.Data && response.Data.NeedsAuthorization)\r\n PropertyDataService.showAuthorizationMetersWarningDialog($stateParams.id, function () {\r\n ModalServiceExt.showInfo(\r\n _t(\"Property is successfuly created but consumption data will not be submitted to Energy Star until tenants authorize data sharing.\"),\r\n function () { $state.goMainLayout('PropertyList'); });\r\n });\r\n else\r\n ModalServiceExt.showInfo(_t(\"Property is successfuly created.\"), function () { $state.goMainLayout('PropertyList'); });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }])\r\n .controller('LinkEnergyStarAccountController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService', 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, GetAccountsService, CommonHeaderService, ModalServiceExt, PropertyDataService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n $scope.headerText = _t('Add Property - Link Energy Star Account');\r\n $scope.data = PropertyDataService.data;\r\n $scope.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 LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Properties'));\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'GET',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetProfile',\r\n params: { userName: $state.params.userId }\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(data, ModalServiceExt,\r\n function () {\r\n $scope.userData = data.Data.UserData;\r\n $scope.firstName = $scope.userData.FirstName;\r\n $scope.lastName = $scope.userData.LastName;\r\n $scope.email = $scope.userData.Email;\r\n $scope.phone = $scope.userData.PhoneNumber;\r\n $scope.organizationName = $scope.userData.Agency;\r\n }); \r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.push({ Message: utilli.serverErrorMessage });\r\n });\r\n\r\n $scope.next = function () {\r\n if ($scope.radioEnergyStarAccountType === 'linkExistingEnergyStarAccount') {\r\n $state.goMainLayout(\"AddProperty.LinkEnergyStarAccountInstructions\", { stepsCount: $state.params.stepsCount, step: $scope.$parent.step });\r\n $scope.radioEnergyStarAccountType = null;\r\n }\r\n else if ($scope.radioEnergyStarAccountType === 'createNewEnergyStarAccount') {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/CreateNewEsAccountForCurrentUserRequest/',\r\n data: {\r\n FirstName: $scope.firstName,\r\n LastName: $scope.lastName,\r\n Address1: $scope.address1,\r\n Address2: $scope.address2,\r\n City: $scope.city,\r\n State: $scope.state,\r\n PostalCode: $scope.postalCode,\r\n Email: $scope.email, \r\n Phone: $scope.phone, \r\n JobTitle: $scope.jobTitle,\r\n OrganizationName: $scope.organizationName,\r\n PrimaryBusiness: $scope.primaryBusiness,\r\n OtherBusinessDescription: $scope.otherBusinessDescription,\r\n EnergyStarPartner: $scope.energyStarPartner,\r\n EnergyStarPartnerType: $scope.energyStarPartnerType,\r\n OtherEnergyStarPartnerTypeDescription: $scope.otherEnergyStarPartnerTypeDescription\r\n },\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showInfo('Error in procces of new Energy Star Account creation. Please try again later.');\r\n return;\r\n } else {\r\n $state.goMainLayout(\"AddProperty.PropertyOverview\", { stepsCount: $state.params.stepsCount, step: $scope.$parent.step * 1 + 1 });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n }])\r\n .controller('LinkEnergyStarAccountForPropertyImportController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService', 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, GetAccountsService, CommonHeaderService, ModalServiceExt, PropertyDataService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n $scope.headerText = _t('Import Property - Link Energy Star Account');\r\n $scope.data = PropertyDataService.data;\r\n\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Properties'));\r\n\r\n $scope.step = 0;\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = 0;\r\n }\r\n\r\n $scope.next = function () {\r\n if ($scope.radioEnergyStarAccountType === 'linkExistingEnergyStarAccount') {\r\n $state.goMainLayout(\"AddProperty.LinkEnergyStarAccountForPropertyImportInstructions\", { stepsCount: $state.params.stepsCount, step: 1 + $scope.$parent.step*1 });\r\n $scope.radioEnergyStarAccountType = null;\r\n }\r\n else if ($scope.radioEnergyStarAccountType === 'createNewEnergyStarAccount') {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/CreateNewEsAccountForCurrentUserRequest/',\r\n data: {}\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showInfo(response.Errors[0]);\r\n return;\r\n } else {\r\n $state.goMainLayout(\"AddProperty.ShareExistingEnergyStarPropertyInstructions\", { stepsCount: $state.params.stepsCount, step: 1 + $scope.$parent.step*1 });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n }])\r\n .controller('LinkEnergyStarAccountInstructionsController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService', 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, GetAccountsService, CommonHeaderService, ModalServiceExt, PropertyDataService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n $scope.headerText = _t('Add Property - Link Energy Star Account');\r\n $scope.currentUserName = utilli.isAdmin ? $state.params.userId : localStorage.getItem('current_user');\r\n\r\n $scope.data = PropertyDataService.data;\r\n\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Properties'));\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $state.params.step;\r\n }\r\n\r\n $scope.isBackVisible = function(){ return true;}\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout('AddProperty.LinkEnergyStarAccount', { stepsCount: $scope.$parent.overallStepsCount, step: $scope.$parent.step - 1 });\r\n }\r\n\r\n $scope.next = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AcceptEsConnectionRequestForCurrentUser/',\r\n data: {},\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showInfo( response.Errors[0]);\r\n return;\r\n } else {\r\n $state.goMainLayout(\"AddProperty.PropertyOverview\", { stepsCount: $scope.$parent.overallStepsCount, step: 1 + $scope.$parent.step * 1 });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n \r\n }\r\n }])\r\n .controller('LinkEnergyStarAccountForPropertyImportInstructionsController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService', 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, GetAccountsService, CommonHeaderService, ModalServiceExt, PropertyDataService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n $scope.headerText = _t('Import Property - Link Energy Star Account');\r\n $scope.data = PropertyDataService.data;\r\n\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Properties'));\r\n\r\n $scope.currentUserName = utilli.isAdmin ? $state.params.userId : localStorage.getItem('current_user');\r\n\r\n $scope.step = 0;\r\n\r\n $scope.isBackVisible = function () { return false; }\r\n\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = 0;\r\n }\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout('AddProperty.LinkEnergyStarAccountForPropertyImport', { stepsCount: $state.params.stepsCount });\r\n }\r\n\r\n $scope.next = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AcceptEsConnectionRequestForCurrentUser/',\r\n data: {},\r\n params: { userName: $state.params.userId } \r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showInfo(response.Errors[0]);\r\n return;\r\n } else {\r\n $state.goMainLayout(\"AddProperty.ShareExistingEnergyStarPropertyInstructions\", { stepsCount: $state.params.stepsCount });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n }\r\n }])\r\n .controller('ShareExistingEnergyStarPropertyInstructionsController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService', 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, GetAccountsService, CommonHeaderService, ModalServiceExt, PropertyDataService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $scope.$parent.overallStepsCount - 2;\r\n }\r\n\r\n $scope.headerText = _t('Import Property - Share Property');\r\n $scope.data = PropertyDataService.data;\r\n\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Properties'));\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout('AddProperty.AddNewOrShareExisting');\r\n }\r\n\r\n $scope.next = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AcceptEsSharingRequestsForCurrentUser/',\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.$parent.PropertySharingResult = response.Data;\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showInfo(response.Errors[0]);\r\n return;\r\n } else {\r\n $state.goMainLayout(\"AddProperty.PropertySharingResults\", { stepsCount: $state.params.stepsCount });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }])\r\n .controller('PropertySharingResultsController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams', 'GetAccountsService', 'CommonHeaderService', 'ModalServiceExt', 'PropertyDataService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window,\r\n usSpinnerService, LeftMenuService, $state, $stateParams, GetAccountsService, CommonHeaderService, ModalServiceExt, PropertyDataService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n if ($state.params) {\r\n $scope.$parent.overallStepsCount = $state.params.stepsCount;\r\n $scope.$parent.step = $scope.$parent.overallStepsCount;\r\n }\r\n\r\n $scope.headerText = _t('Import Property - Result');\r\n $scope.data = PropertyDataService.data;\r\n\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Properties'));\r\n\r\n $scope.next = function () {\r\n $state.goMainLayout(\"PropertyList\");\r\n }\r\n }])\r\n .factory('PropertyDataService', ['$http', 'usSpinnerService', 'ModalServiceExt', '$state', '$stateParams',\r\n// ReSharper disable InconsistentNaming\r\n function ($http, usSpinnerService, ModalServiceExt, $state, $stateParams) {\r\n// ReSharper restore InconsistentNaming\r\n var getProperty = function (id, callback) {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'GET',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetProperty/',\r\n params: { propertyId: id, userName: $state.params.userId }\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 callback(response.Data);\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n var showAuthorizationMetersWarningDialog = function (propertyId, noCallback) { \r\n ModalServiceExt.showYesNoMessage(\r\n utilli._t(\"Authorization Required\"),\r\n utilli._t(\"When a property has less than 5 meters, it is required to get authorizations from tenants. Do you want to be redirected to the Send Authorization Requests page?\"),\r\n function () { $state.goMainLayout('SendInvitation', { propertyId: propertyId }) },\r\n noCallback\r\n );\r\n }\r\n\r\n return {\r\n getProperty: getProperty,\r\n getErrorInfo: function (meter, parent, from) {\r\n var fromState = from ? utilli.getStateNameWithoutLayout($state.current.name) : null;\r\n if (!meter.ApprovedByPM)\r\n $state.goMainLayout('MeterNeedsApproval',\r\n {\r\n propertyId: $stateParams.id,\r\n meterId: meter.Id,\r\n meterNumber: meter.MeterNumber,\r\n mode: $stateParams.mode,\r\n stepsCount: parent.overallStepsCount,\r\n step: parent.step,\r\n from: fromState\r\n });\r\n else if (meter.ErrorCode === 1) {\r\n $state.goMainLayout('MeterDoesNotExist', {\r\n propertyId: $stateParams.id,\r\n meterId: meter.Id,\r\n mode: $stateParams.mode,\r\n stepsCount: parent.overallStepsCount,\r\n step: parent.step,\r\n from: fromState\r\n });\r\n }\r\n else if (meter.ErrorCode === 2)\r\n $state.goMainLayout('MeterDuplicated',\r\n {\r\n propertyId: $stateParams.id,\r\n meterId: meter.Id,\r\n mode: $stateParams.mode,\r\n stepsCount: parent.overallStepsCount,\r\n step: parent.step,\r\n from: fromState\r\n });\r\n else if (meter.ErrorCode === 7)\r\n $state.goMainLayout('MultipleTiedMeters',\r\n {\r\n propertyId: $stateParams.id,\r\n meterId: meter.Id,\r\n mode: $stateParams.mode,\r\n stepsCount: parent.overallStepsCount,\r\n step: parent.step,\r\n from: fromState\r\n });\r\n else if (meter.ErrorCode === 8)\r\n $state.goMainLayout('MeterIsUsed',\r\n {\r\n propertyId: $stateParams.id,\r\n meterId: meter.Id,\r\n mode: $stateParams.mode,\r\n stepsCount: parent.overallStepsCount,\r\n step: parent.step,\r\n from: fromState\r\n });\r\n else if (meter.ErrorCode === 3)\r\n $state.goMainLayout('ServiceAddressMismatches',\r\n {\r\n propertyId: $stateParams.id,\r\n meterId: meter.Id,\r\n mode: $stateParams.mode,\r\n stepsCount: parent.overallStepsCount,\r\n step: parent.step,\r\n from: fromState\r\n });\r\n },\r\n showAuthorizationMetersWarningDialog: showAuthorizationMetersWarningDialog\r\n };\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .service('PropertySettingsService', function () {\r\n var _t = utilli._t;\r\n\r\n var primaryPropertyFunctions = {\r\n 'AdultEducation' : 'Adult Education',\r\n 'AmbulatorySurgicalCenter' :'Ambulatory Surgical Center',\r\n 'Aquarium' :'Aquarium',\r\n 'AutomobileDealership' :'Automobile Dealership',\r\n 'BankBranch' :'Bank Branch',\r\n 'BarNightclub' :'Bar/Nightclub',\r\n 'Barracks' :'Barracks',\r\n 'BowlingAlley' :'Bowling Alley',\r\n 'Casino' :'Casino',\r\n 'CollegeUniversity' :'College/University',\r\n 'ConvenienceStorewithGasStation' :'Convenience Store with Gas Station',\r\n 'ConvenienceStorewithoutGasStation' :'Convenience Store without Gas Station',\r\n 'ConventionCenter' :'Convention Center',\r\n 'Courthouse' :'Courthouse',\r\n 'DataCenter' :'Data Center',\r\n 'DistributionCenter' :'Distribution Center',\r\n 'DrinkingWaterTreatmentDistribution' :'Drinking Water Treatment & Distribution',\r\n 'EnclosedMall' :'Enclosed Mall',\r\n 'EnergyPowerStation' :'Energy/Power Station',\r\n 'FastFoodRestaurant' :'Fast Food Restaurant',\r\n 'FinancialOffice' :'Financial Office',\r\n 'FireStation' :'Fire Station',\r\n 'FitnessCenterHealthClubGym' :'Fitness Center/Health Club/Gym',\r\n 'FoodSales' :'Food Sales',\r\n 'FoodService' :'Food Service',\r\n 'HospitalGeneralMedicalSurgical' :'Hospital (General Medical & Surgical)',\r\n 'Hotel' :'Hotel',\r\n 'IceCurlingRink' :'Ice/Curling Rink',\r\n 'IndoorArena' :'Indoor Arena',\r\n 'K12School' :'K-12 School',\r\n 'Laboratory' :'Laboratory',\r\n 'Library' :'Library',\r\n 'LifestyleCenter' :'Lifestyle Center',\r\n 'MailingCenterPostOffice' :'Mailing Center/Post Office',\r\n 'ManufacturingIndustrialPlant' :'Manufacturing/Industrial Plant',\r\n 'MedicalOffice' :'Medical Office',\r\n 'MixedUseProperty' :'Mixed Use Property',\r\n 'MovieTheater' :'Movie Theater',\r\n 'MultifamilyHousing' :'Multifamily Housing',\r\n 'Museum' :'Museum',\r\n 'NonRefrigeratedWarehouse' :'Non-Refrigerated Warehouse',\r\n 'Office' :'Office',\r\n 'OtherEducation' :'Other - Education',\r\n 'OtherEntertainmentPublicAssembly' :'Other - Entertainment/Public Assembly',\r\n 'OtherLodgingResidential' :'Other - Lodging/Residential',\r\n 'OtherMall' :'Other - Mall',\r\n 'OtherPublicServices' :'Other - Public Services',\r\n 'OtherRecreation' :'Other - Recreation',\r\n 'OtherRestaurantBar' :'Other - Restaurant/Bar',\r\n 'OtherServices' :'Other - Services',\r\n 'OtherStadium' :'Other - Stadium',\r\n 'OtherTechnologyScience' :'Other - Technology/Science',\r\n 'OtherUtility' :'Other - Utility',\r\n 'Other' :'Other',\r\n 'OtherSpecialtyHospital' :'Other/Specialty Hospital',\r\n 'OutpatientRehabilitationPhysicalTherapy' :'Outpatient Rehabilitation/Physical Therapy',\r\n 'Parking' :'Parking',\r\n 'PerformingArts' :'Performing Arts',\r\n 'PersonalServicesHealthBeautyDryCleaningetc' :'Personal Services (Health/Beauty, Dry Cleaning, etc)',\r\n 'PoliceStation' :'Police Station',\r\n 'PreschoolDaycare' :'Pre-school/Daycare',\r\n 'PrisonIncarceration' :'Prison/Incarceration',\r\n 'RaceTrack' :'Race Track',\r\n 'RefrigeratedWarehouse' :'Refrigerated Warehouse',\r\n 'RepairServicesVehicleShoeLocksmithetc' :'Repair Services (Vehicle, Shoe, Locksmith, etc)',\r\n 'ResidenceHallDormitory' :'Residence Hall/Dormitory',\r\n 'ResidentialCareFacility' :'Residential Care Facility',\r\n 'Restaurant' :'Restaurant',\r\n 'RetailStore' :'Retail Store',\r\n 'RollerRink' :'Roller Rink',\r\n 'SelfStorageFacility' :'Self-Storage Facility',\r\n 'SeniorCareCommunity' :'Senior Care Community',\r\n 'SingleFamilyHome' :'Single Family Home',\r\n 'SocialMeetingHall' :'Social/Meeting Hall',\r\n 'StadiumClosed' :'Stadium (Closed)',\r\n 'StadiumOpen' :'Stadium (Open)',\r\n 'StripMall' :'Strip Mall',\r\n 'SupermarketGroceryStore' :'Supermarket/Grocery Store',\r\n 'SwimmingPool' :'Swimming Pool',\r\n 'TransportationTerminalStation' :'Transportation Terminal/Station',\r\n 'UrgentCareClinicOtherOutpatient' :'Urgent Care/Clinic/Other Outpatient',\r\n 'VeterinaryOffice' :'Veterinary Office',\r\n 'VocationalSchool' :'Vocational School',\r\n 'WastewaterTreatmentPlant' :'Wastewater Treatment Plant',\r\n 'WholesaleClubSupercenter' :'Wholesale Club/Supercenter',\r\n 'WorshipFacility' :'Worship Facility',\r\n 'Zoo' :'Zoo'\r\n };\r\n\r\n \r\n\r\n var getPropertyTypeNames = function () {\r\n var result = [\r\n _t(\"Adult Education\"),\r\n _t(\"Ambulatory Surgical Center\"),\r\n _t(\"Aquarium\"),\r\n _t(\"Vehicle Dealership\"),\r\n _t(\"Bank Branch\"),\r\n _t(\"Bar/Nightclub\"),\r\n _t(\"Barracks\"),\r\n _t(\"Bowling Alley\"),\r\n _t(\"Casino\"),\r\n _t(\"College/University\"),\r\n _t(\"Convenience Store with Gas Station\"),\r\n _t(\"Convenience Store without Gas Station\"),\r\n _t(\"Convention Center\"),\r\n _t(\"Courthouse\"),\r\n _t(\"Data Center\"),\r\n _t(\"Distribution Center\"),\r\n _t(\"Drinking Water Treatment & Distribution\"),\r\n _t(\"Enclosed Mall\"),\r\n _t(\"Energy/Power Station\"),\r\n _t(\"Fast Food Restaurant\"),\r\n _t(\"Financial Office\"),\r\n _t(\"Fire Station\"),\r\n _t(\"Fitness Center/Health Club/Gym\"),\r\n _t(\"Food Sales\"),\r\n _t(\"Food Service\"),\r\n _t(\"Hospital (General Medical & Surgical)\"),\r\n _t(\"Hotel\"),\r\n _t(\"Ice/Curling Rink\"),\r\n _t(\"Indoor Arena\"),\r\n _t(\"K-12 School\"),\r\n _t(\"Laboratory\"),\r\n _t(\"Library\"),\r\n _t(\"Lifestyle Center\"),\r\n _t(\"Mailing Center/Post Office\"),\r\n _t(\"Manufacturing/ Industrial Plan\"),\r\n _t(\"Mixed Use Property\"),\r\n _t(\"Medical Office\"),\r\n _t(\"Movie Theater\"),\r\n _t(\"Multifamily Housing\"),\r\n _t(\"Museum\"),\r\n _t(\"Non-Refrigerated Warehouse\"),\r\n _t(\"Office\"),\r\n _t(\"Other\"),\r\n _t(\"Other - Education\"),\r\n _t(\"Other - Entertainment/Public Assembly\"),\r\n _t(\"Other - Lodging/Residential\"),\r\n _t(\"Other - Mall\"),\r\n _t(\"Other - Public Services\"),\r\n _t(\"Other - Recreation\"),\r\n _t(\"Other - Restaurant/Bar\"),\r\n _t(\"Other - Services\"),\r\n _t(\"Other - Stadium\"),\r\n _t(\"Other - Technology/Science\"),\r\n _t(\"Other - Utility\"),\r\n _t(\"Other - Specialty Hospital\"),\r\n _t(\"Outpatient Rehabilitation/Physical Therapy\"),\r\n _t(\"Parking\"),\r\n _t(\"Performing Arts\"),\r\n _t(\"Personal Services (Health/Beauty, Dry Cleaning, etc)\"),\r\n _t(\"Police Station\"),\r\n _t(\"Pre-school/Daycare\"),\r\n _t(\"Prison/Incarceration\"),\r\n _t(\"Race Track\"),\r\n _t(\"Refrigerated Warehouse\"),\r\n _t(\"Repair Services (Vehicle, Shoe, Locksmith, etc)\"),\r\n _t(\"Residential Care Facility\"),\r\n _t(\"Residence Hall/Dormitory\"),\r\n _t(\"Restaurant\"),\r\n _t(\"Retail Store\"),\r\n _t(\"Roller Rink\"),\r\n _t(\"Self-Storage Facility\"),\r\n _t(\"Senior Care Community\"),\r\n _t(\"Single Family Home\"),\r\n _t(\"Social/Meeting Hall\"),\r\n _t(\"Stadium (Closed)\"),\r\n _t(\"Stadium (Open)\"),\r\n _t(\"Strip Mall\"),\r\n _t(\"Supermarket/ Grocery Store\"),\r\n _t(\"Swimming Pool\"),\r\n _t(\"Transportation Terminal/Station\"),\r\n _t(\"Urgent Care/Clinic/Other Outpatient\"),\r\n _t(\"Veterinary Office\"),\r\n _t(\"Vocational School\"),\r\n _t(\"Wastewater Treatment Plant\"),\r\n _t(\"Wholesale Club/Supercenter\"),\r\n _t(\"Worship Facility\"),\r\n _t(\"Zoo\")\r\n ];\r\n return result;\r\n }\r\n\r\n var getFieldDescriptionByFieldName = function () {\r\n var result = {\r\n amountOfLaundryProcessedAnnually: _t('Quantity of laundry processed at the property.'),\r\n averageEffluentBiologicalOxygenDemand: _t('The concentration of effluent Biological Oxygen Demand (BOD5) at a wastewater treatment plant.'),\r\n averageInfluentBiologicalOxygenDemand: _t('The concentration of influent Biological Oxygen Demand (BOD5) at a wastewater treatment plant.'),\r\n averageNumberOfResidents: _t('Annual average number of residents at the property.'),\r\n completelyEnclosedFootage: _t('Area of parking garage that is completely enclosed.'),\r\n cookingFacilities: _t('Whether there are Cooking Facilities.'),\r\n coolingEquipmentRedundancy: _t('Level of redundancy for the cooling equipment in a Data Center.'),\r\n exteriorEntranceToThePublic: _t('Whether there is an Exterior Entrance to the Public.'),\r\n fixedFilmTrickleFiltrationProcess: _t('Whether there is a Fixed Film Trickle Filtration Process.'),\r\n fullServiceSpaFloorArea: _t('Floor area associated with a Full Service Spa.'),\r\n areaOfAllWalkInRefrigerationUnits: _t('Area of all walk-in refrigeration/freezer units - include only commercial type units that a person actually walks into to retrieve goods. See numberOfWalkInRefrigerationUnits for more information.'),\r\n lengthOfAllOpenClosedRefrigerationUnits: _t('Length of all open or closed Refrigeration or Freezer cases that are used for the sale or storage of perishable goods. Include display-type refrigerated open or closed cases and cabinets, as well as display-type freezer units. These are typically found on the sales floor.'),\r\n enclosedFloorArea: _t('Total enclosed floor area at a Stadium/Arena.'),\r\n governmentSubsidizedHousing: _t('Whether this is housing that is subsidized by the local, state, or Federal government.'),\r\n gymCenterFloorArea: _t('Floor area associated with a Gym/Fitness Center.'),\r\n hasComputerLab: _t('Whether there is a Computer Lab.'),\r\n hasDiningHall: _t('Whether there is a Dining Hall.'),\r\n hasLaboratory: _t('Presence of a laboratory (Yes/No).'),\r\n hoursPerDayGuestsOnsite: _t('Number of hours per day a typical guest spends at the property (Less Than 15, 15 To 19, More Than 20)'),\r\n isHighSchool: _t('Presence of a High School, as indicated by education of grades 10, 11, and/or 12 (Yes/No).'),\r\n isTertiaryCare: _t('Presence of tertiary medical care, specialized care beyond a typical secondary level, such as Level 1 trauma centers, organ transplant, or prenatal intensive care units (Yes/No).'),\r\n iceEvents: _t('Are there ice-related events such as Hockey, Skating, Ice Capades?'),\r\n numberOfConcertShowEventsPerYear: _t('Number of concert/show events per year.'),\r\n numberOfSpecialOtherEventsPerYear: _t('Number of special/other events per year at a stadium/arena (i.e. events that are neither concerts/shows nor athletic events).'),\r\n numberOfSportingEventsPerYear: _t('Number of sporting/athletic events per year.'),\r\n numberOfSurgicalOperatingBeds: _t('Number of beds associated with surgical operation at a medial office/outpatient healthcare facility.'),\r\n sizeOfElectronicScoreBoards: _t('The total size of electronic score boards at a stadium/arena.'),\r\n surgeryCenterFloorArea: _t('The area within a medical office or outpatient healthcare property devoted to surgery.'),\r\n itEnergyMeterConfiguration: _t('The IT Energy Configuration/location of IT Energy meters at a data center.'),\r\n itEnergyConfiguration: _t('The IT Energy Configuration/location of IT Energy meters at a data center.'),\r\n laundryFacility: _t('Type of laundry processed at the property (linens, Terry, Linens & Terry)'),\r\n maximumNumberOfFloors: _t('Maximum number of floors in the tallest building at the property.'),\r\n maximumResidentCapacity: _t('Maximum capacity of residents, based on the design of the facility.'),\r\n licensedBedCapacity: _t('Licensed Bed Capacity is the total number of beds that your hospital is licensed to have in operation. This may be more than your Staffed Beds, which are those that are set up and ready for use.'),\r\n monthsInUse: _t('Number of months per year the property is in use.'),\r\n numberOfBedrooms: _t('Number of bedrooms.'),\r\n numberOfCashRegisters: _t('Number of cash registers.'),\r\n numberOfCommercialRefrigerationUnits: _t('Number of Commercial Refrigeration/Freezer cases, including any open or closed commercial type case, and including any walk-in units.'),\r\n numberOfCommercialWashingMachines: _t('Number of commercial-type washing machines. (This does not include residential or coin-operated machines)'),\r\n numberOfComputers: _t('Number of computers and servers at the property.'),\r\n numberOfResidentialLivingUnitsLowRiseSetting: _t('Number of units located in individual buildings that are 1 to 4 stories in height, as well as units located wings/portions of larger buildings that fall in this height range (e.g. if Wing A is 6 stories and Wing B is 3 stories, only units in Wing B would be counted here).'),\r\n numberOfFTEWorkers: _t('Number of full-time equivalent workers (total number of hours worked by all workers, divided by the standard hours in a full time shift).'),\r\n numberOfGuestMealsServedPerYear: _t('Total number of guest meals (also called meal covers) served each year.'),\r\n numberOfLaundryHookupsInAllUnits: _t('The total number of laundry hookups in all individual living units (counting hookups, whether or not there is a machine).'),\r\n numberOfLaundryHookupsInCommonArea: _t('The total number of laundry hookups in all common areas (counting hookups, whether or not there is a machine).'),\r\n numberOfMriMachines: _t('Number of MRI Machines.'),\r\n numberOfOpenClosedRefrigerationUnits: _t('The Number of Open or Closed Refrigeration/Freezer Units is the count of open or closed cases that are used for the sale or storage of perishable goods. This includes display-type refrigerated open or closed cases and cabinets as well as display-type freezer units typically found on a sales floor. Each case or cabinet section, typically 4 to 12 feet in length, should be considered 1 unit. Include those cases located inside and immediately adjacent to the building. These units may be portable or permanent, and may have doors, plastic strips, or other flexible cover. This count should not include vending machines. If your property is in the design phase, use your best estimate for the intended conditions when the property is fully operational.'),\r\n numberOfPeople: _t('Number of people living in the home.'),\r\n numberOfResidentialLiftSystems: _t('Number of residential electronic lift systems.'),\r\n numberOfResidentialLivingUnits: _t('Total number of residential living units (apartments or condominiums) at the property. This value must equal the sum of the number of residential living units in a low-rise setting, mid-rise setting, and high-rise setting. A 0.9 tolerance is allowed.'),\r\n numberOfResidentialWashingMachines: _t('Number of residential-type washing machines.'),\r\n numberOfRooms: _t('Total number of rooms for a lodging type of property (hotel, dormitory, etc).'),\r\n numberOfHotelRooms: _t('Total number of rooms for a lodging type of property (hotel).'),\r\n numberOfStaffedBeds: _t('Number of beds set up and staffed for use at a hospital.'),\r\n numberOfWalkInRefrigerationUnits: _t('Number of walk-in refrigeration/freezer units - including only those commercial type units that you can completely enter to retrieve goods.'),\r\n numberOfWeekdaysOpen: _t('Number of weekdays (Monday through Friday) the property is open. This will be an number between 0 and 5.'),\r\n numberOfWorkers: _t('The total number of workers during the primary (largest shift) - this is only a total number of people in the building at a single time.'),\r\n gymnasiumFloorArea: _t('Floor area associated with a gymnasium at a K12 School.'),\r\n studentSeatingCapacity: _t('The number of students the school can accommodate (including portable classrooms).'),\r\n nutrientRemoval: _t('Presence of a nutrient removal system at a wastewater treatment plant (Yes/No).'),\r\n onSiteLaundryFacility: _t('Presence of an on-site Laundry Facility (Yes/No).'),\r\n openFootage: _t('Total area of open parking lots/areas.'),\r\n openOnWeekends: _t('Indication of regular activities that occur on either Saturday or Sunday (Yes/No).'),\r\n ownedBy: _t('Indication of whether the property is owned by a private, not-for profit, or government organization.'),\r\n partiallyEnclosedFootage: _t('Total area of all parking structures that are only partially enclosed (i.e. multi-level structures that only have partial walls).'),\r\n percentCooled: _t('The percent of the property that can be cooled by mechanical cooling equipment.'),\r\n percentHeated: _t('The percent of the property that can be heated by mechanical heating equipment.'),\r\n numberOfResidentialLivingUnitsMidRiseSetting: _t('Number of units located in individual buildings that are 5 to 9 stories in height, as well as units located wings/portions of larger buildings that fall in this height range (e.g. if Wing A is 6 stories and Wing B is 3 stories, only units in Wing A would be counted here).'),\r\n percentOfGrossFloorAreaThatIsCommonSpaceOnly: _t('The percent of the Gross Floor Area that is common space (not individual tenant areas)'),\r\n plantDesignFlowRate: _t('The designed flow rate of a wastewater treatment plant (e.g. the capacity of the plant)'),\r\n poolLocation: _t('Indication of whether a pool is indoor or outdoor.'),\r\n poolSize: _t('Approximate size of a swimming pool (Short Course, Recreational, Olympic).'),\r\n numberOfResidentialLivingUnitsHighRiseSetting: _t('Number of units located in individual buildings that are 10 or more stories in height, as well as units located in wings/portions of buildings that fall in this range (e.g. if Wing A is 10 stories and Wing B is 5 stories, only units in Wing A would be counted here).'),\r\n residentPopulation: _t('An indication of the type of residents living at the property, if applicable (e.g. student, military, senior, etc).'),\r\n schoolDistrict: _t('The school district in which the school is located.'),\r\n seatingCapacity: _t('The seating capacity associated with the main areas of worship in a worship facility.'),\r\n singleStore: _t('Indication that a Retail Store is a single store (Yes/No).'),\r\n upsSystemRedundancy: _t('Level of redundancy for the Uninterruptible Power Supply (UPS) system in a Data Center.'),\r\n supplementalHeating: _t('Presence of supplemental heating systems in a parking garage (Yes/No).'),\r\n weeklyOperatingHours: _t('The total number of hours per week that the property is occupied by the majority of the employees. It does not include hours when the property is occupied only by maintenance, security, or other support personnel.'),\r\n totalGrossFloorArea: _t('The total gross floor area of all buildings at the property, measured at the exterior boundary of the enclosing walls, including all areas within the building (common, tenant, maintenance, etc).'),\r\n numberOfIndoorIceRinks: _t('Number of indoor ice rinks used for indoor hockey, ringette, public or figure skating. This does not include curling sheets.'),\r\n totalIceRinkSurfaceAreaForAllRinks: _t('The indoor ice rink surface area is the total area covered by ice of all the ice rinks used for indoor hockey, ringette, public or figure skating and can be estimated by multiplying the length of the ice surface with the width of the ice surface and adding together the calculated area for each ice rink in the facility. This surface area does not include curling sheets.'),\r\n numberOfWeeklyIceResurfacingForAllRinks: _t('Total number of floods in a week using ice resurfacing machines after typical ice rink use for all indoor hockey, ringette, public or figure skating ice rinks in the facility. This does not include curling sheet resurfacing or pebbling. For multiple rinks, sum the total number of weekly resurfacing for all rinks.'),\r\n numberOfCurlingSheets: _t('Number of ice sheets specifically for the purpose of the game of curling.'),\r\n spectatorSeatingCapacity: _t('Seating capacity.'),\r\n monthsMainIndoorIceRinkInUse: _t('Number of months per year the property is in use.'),\r\n };\r\n return result;\r\n }\r\n\r\n var getFieldCaptionByFieldName = function () {\r\n var result = {\r\n amountOfLaundryProcessedAnnually: _t('Quantity of laundry processed at the property annually'),\r\n averageEffluentBiologicalOxygenDemand: _t('The concentration of effluent Biological Oxygen Demand (BOD5)'),\r\n averageInfluentBiologicalOxygenDemand: _t('The concentration of influent Biological Oxygen Demand (BOD5)'),\r\n averageNumberOfResidents: _t('Annual average number of residents'),\r\n completelyEnclosedFootage: _t('Enclosed Footage'),\r\n cookingFacilities: _t('Cooking Facilities'),\r\n coolingEquipmentRedundancy: _t('Cooling Equipment Redudancy'),\r\n exteriorEntranceToThePublic: _t('Exterior Entrance to the Public'),\r\n fixedFilmTrickleFiltrationProcess: _t('Fixed Film Trickle Filtration Process'),\r\n fullServiceSpaFloorArea: _t('Full Service Spa Floor Area'),\r\n areaOfAllWalkInRefrigerationUnits: _t('Area of all walk-in refrigeration/freezer units'),\r\n lengthOfAllOpenClosedRefrigerationUnits: _t('Length of all open or closed Refrigeration or Freezer cases'),\r\n enclosedFloorArea: _t('Total enclosed floor area at a Stadium/Arena'),\r\n governmentSubsidizedHousing: _t('Subsidized by the local, state, or Federal government'),\r\n gymCenterFloorArea: _t('Gym/Fitness Center Floor Area'),\r\n hasComputerLab: _t('Computer Lab'),\r\n hasDiningHall: _t('Dining Hall'),\r\n hasLaboratory: _t('Presence of a laboratory'),\r\n hoursPerDayGuestsOnsite: _t('Hours Per Day Guests Onsite'),\r\n isHighSchool: _t('Presence of a High School'),\r\n isTertiaryCare: _t('Presence of tertiary medical care'),\r\n iceEvents: _t('Ice Events'),\r\n numberOfConcertShowEventsPerYear: _t('Number of concert/show events per year'),\r\n numberOfSpecialOtherEventsPerYear: _t('Number of special/other events per year'),\r\n numberOfSportingEventsPerYear: _t('Number of sporting/athletic events per year'),\r\n numberOfSurgicalOperatingBeds: _t('Number of beds associated with surgical operation medial office'),\r\n sizeOfElectronicScoreBoards: _t('Size of electronic score boards'),\r\n surgeryCenterFloorArea: _t('Surgery Center Floor Area'),\r\n itEnergyMeterConfiguration: _t('The IT Energy Configuration/location'),\r\n itEnergyConfiguration: _t('The IT Energy Configuration/location'),\r\n laundryFacility: _t('Type of laundry processed at the property'),\r\n maximumNumberOfFloors: _t('Maximum number of floors'),\r\n maximumResidentCapacity: _t('Maximum capacity of residents,'),\r\n licensedBedCapacity: _t('Licensed Bed Capacity'),\r\n monthsInUse: _t('Months In Use'),\r\n numberOfBedrooms: _t('Number of bedrooms'),\r\n numberOfCashRegisters: _t('Number of cash registers'),\r\n numberOfCommercialRefrigerationUnits: _t('Number of Commercial Refrigeration/Freezer cases'),\r\n numberOfCommercialWashingMachines: _t('Number of commercial-type washing machines'),\r\n numberOfComputers: _t('Number of computers'),\r\n numberOfResidentialLivingUnitsLowRiseSetting: _t('Low Rise Residential Lining Units Number'),\r\n numberOfFTEWorkers: _t('Number of full-time equivalent workers'),\r\n numberOfGuestMealsServedPerYear: _t('Number of guest meals served each year.'),\r\n numberOfLaundryHookupsInAllUnits: _t('Number of laundry hookups in all individual living units'),\r\n numberOfLaundryHookupsInCommonArea: _t('Number of laundry hookups in all common areas'),\r\n numberOfMriMachines: _t('Number of MRI Machines.'),\r\n numberOfOpenClosedRefrigerationUnits: _t('The Number of Open or Closed Refrigeration/Freezer Units'),\r\n numberOfPeople: _t('Number of people'),\r\n numberOfResidentialLiftSystems: _t('Number of residential electronic lift systems'),\r\n numberOfResidentialLivingUnits: _t('Total number of residential living units'),\r\n numberOfResidentialLivingUnitsMidRiseSetting: _t('Number of Residential Units Mid Rise'),\r\n numberOfResidentialWashingMachines: _t('Number of residential-type washing machines'),\r\n numberOfRooms: _t('Total number of rooms'),\r\n numberOfHotelRooms: _t('Total number of rooms'),\r\n numberOfStaffedBeds: _t('Number of beds'),\r\n numberOfWalkInRefrigerationUnits: _t('Number of walk-in refrigeration/freezer units'),\r\n numberOfWeekdaysOpen: _t('Number of weekdays (Monday through Friday) the property is open'),\r\n numberOfWorkers: _t('The total number of workers'),\r\n gymnasiumFloorArea: _t('Floor area associated with a gymnasium'),\r\n studentSeatingCapacity: _t('The number of students'),\r\n nutrientRemoval: _t('Presence of a nutrient removal system'),\r\n onSiteLaundryFacility: _t('Presence of an on-site Laundry Facility'),\r\n openFootage: _t('Open Footage'),\r\n openOnWeekends: _t('Open On Weekends'),\r\n ownedBy: _t('Owned By'),\r\n partiallyEnclosedFootage: _t('Partially Enclosed Footage'),\r\n percentCooled: _t('Percent Cooled'),\r\n percentHeated: _t('Percent Heated'),\r\n percentOfficeCooled: _t('Percent Office Cooled'),\r\n percentOfficeHeated: _t('Percent Office Heated'),\r\n percentOfGrossFloorAreaThatIsCommonSpaceOnly: _t('The percent of the Gross Floor Area that is common space'),\r\n plantDesignFlowRate: _t('Designed Flow Rate'),\r\n poolLocation: _t('Pool Location'),\r\n poolSize: _t('Pool Size'),\r\n numberOfResidentialLivingUnitsHighRiseSetting: _t('Number of units High Rise'),\r\n residentPopulation: _t('Resident Population'),\r\n schoolDistrict: _t('School District'),\r\n seatingCapacity: _t('Seating Capacity'),\r\n singleStore: _t('Single Store'),\r\n upsSystemRedundancy: _t('UPS System Redudancy'),\r\n supplementalHeating: _t('Supplement Heating'),\r\n weeklyOperatingHours: _t('Weekly Operating Hours'),\r\n totalGrossFloorArea: _t('Total Gross Floor Area'),\r\n enrollment: _t('Enrollment'),\r\n grantDollars: _t('Grant Dollars'),\r\n numberOfIndoorIceRinks: _t('Number of indoor ice rinks'),\r\n totalIceRinkSurfaceAreaForAllRinks: _t('The indoor ice rink surface area'),\r\n numberOfWeeklyIceResurfacingForAllRinks: _t('Total number of floods in a week using ice resurfacing machines'),\r\n numberOfCurlingSheets: _t('Number of ice sheets'),\r\n spectatorSeatingCapacity: _t('Number of seats for spectators'),\r\n monthsMainIndoorIceRinkInUse: _t('Months in use'),\r\n };\r\n return result;\r\n }\r\n\r\n var controlTypeByFieldName = {\r\n amountOfLaundryProcessedAnnually: 'amountOfLaundryProcessedAnnuallyType',\r\n averageEffluentBiologicalOxygenDemand: 'useDecimalType',\r\n averageInfluentBiologicalOxygenDemand: 'useDecimalType',\r\n averageNumberOfResidents: 'useDecimalType',\r\n completelyEnclosedFootage: 'grossFloorAreaType',\r\n cookingFacilities: 'yesNoType',\r\n coolingEquipmentRedundancy: 'equipmentRedundancyType',\r\n exteriorEntranceToThePublic: 'yesNoType',\r\n fixedFilmTrickleFiltrationProcess: 'yesNoType',\r\n fullServiceSpaFloorArea: 'grossFloorAreaType',\r\n areaOfAllWalkInRefrigerationUnits: 'grossFloorAreaType',\r\n lengthOfAllOpenClosedRefrigerationUnits: 'lengthType',\r\n enclosedFloorArea: 'grossFloorAreaType',\r\n governmentSubsidizedHousing: 'yesNoType',\r\n gymCenterFloorArea: 'grossFloorAreaType',\r\n hasComputerLab: 'yesNoType',\r\n hasDiningHall: 'yesNoType',\r\n hasLaboratory: 'yesNoType',\r\n hoursPerDayGuestsOnsite: 'hoursPerDayGuestsOnsiteType',\r\n isHighSchool: 'yesNoType',\r\n isTertiaryCare: 'yesNoType',\r\n iceEvents: 'yesNoType',\r\n numberOfConcertShowEventsPerYear: 'intNumberType',\r\n numberOfSpecialOtherEventsPerYear: 'intNumberType',\r\n numberOfSportingEventsPerYear: 'intNumberType',\r\n numberOfSurgicalOperatingBeds: 'useDecimalType',\r\n sizeOfElectronicScoreBoards: 'grossFloorAreaType',\r\n surgeryCenterFloorArea: 'grossFloorAreaType',\r\n itEnergyMeterConfiguration: 'useStringType',\r\n itEnergyConfiguration: 'itEnergyConfigurationType',\r\n laundryFacility: 'laundryFacilityType',\r\n maximumNumberOfFloors: 'intNumberType',\r\n maximumResidentCapacity: 'useDecimalType',\r\n licensedBedCapacity: 'useDecimalType',\r\n monthsInUse: 'useDecimalType',\r\n numberOfBedrooms: 'useDecimalType',\r\n numberOfCashRegisters: 'useDecimalType',\r\n numberOfCommercialRefrigerationUnits: 'useDecimalType',\r\n numberOfCommercialWashingMachines: 'useDecimalType',\r\n numberOfComputers: 'useDecimalType',\r\n numberOfResidentialLivingUnitsLowRiseSetting: 'useDecimalType',\r\n numberOfFTEWorkers: 'useDecimalType',\r\n numberOfGuestMealsServedPerYear: 'intNumberType',\r\n numberOfLaundryHookupsInAllUnits: 'intNumberType',\r\n numberOfLaundryHookupsInCommonArea: 'intNumberType',\r\n numberOfMriMachines: 'useDecimalType',\r\n numberOfOpenClosedRefrigerationUnits: 'useDecimalType',\r\n numberOfPeople: 'intNumberType',\r\n numberOfResidentialLiftSystems: 'useDecimalType',\r\n numberOfResidentialLivingUnits: 'useDecimalType',\r\n numberOfResidentialWashingMachines: 'useDecimalType',\r\n numberOfRooms: 'intNumberType',\r\n numberOfHotelRooms: 'useDecimalType',\r\n numberOfStaffedBeds: 'useDecimalType',\r\n numberOfWalkInRefrigerationUnits: 'useDecimalType',\r\n numberOfWeekdaysOpen: 'numberOfWeekdaysType',\r\n numberOfWorkers: 'useDecimalType',\r\n gymnasiumFloorArea: 'grossFloorAreaType',\r\n studentSeatingCapacity: 'useDecimalType',\r\n nutrientRemoval: 'yesNoType',\r\n onSiteLaundryFacility: 'yesNoType',\r\n openFootage: 'grossFloorAreaType',\r\n openOnWeekends: 'yesNoType',\r\n ownedBy: 'ownedByType',\r\n partiallyEnclosedFootage: 'grossFloorAreaType',\r\n percentCooled: 'percentsOver10',\r\n percentHeated: 'percentsOver10',\r\n percentOfficeCooled: 'percentOfficeCooledType',\r\n percentOfficeHeated: 'percentOfficeHeatedType',\r\n numberOfResidentialLivingUnitsMidRiseSetting: 'useDecimalType',\r\n percentOfGrossFloorAreaThatIsCommonSpaceOnly: 'useStringType',\r\n plantDesignFlowRate: 'plantDesignFlowRateType',\r\n poolLocation: 'poolType',\r\n poolSize: 'poolSizeType',\r\n numberOfResidentialLivingUnitsHighRiseSetting: 'useDecimalType',\r\n residentPopulation: 'residentPopulationType',\r\n schoolDistrict: 'useStringType',\r\n seatingCapacity: 'useDecimalType',\r\n singleStore: 'yesNoType',\r\n upsSystemRedundancy: 'equipmentRedundancyType',\r\n supplementalHeating: 'yesNoType',\r\n weeklyOperatingHours: 'weeklyOperatingHoursType',\r\n totalGrossFloorArea: 'grossFloorAreaType',\r\n enrollment: 'useDecimalType',\r\n grantDollars: 'useDecimalType',\r\n numberOfIndoorIceRinks: 'intNumberType',\r\n totalIceRinkSurfaceAreaForAllRinks: 'grossFloorAreaType',\r\n numberOfWeeklyIceResurfacingForAllRinks: 'intNumberType',\r\n numberOfCurlingSheets: 'intNumberType',\r\n spectatorSeatingCapacity: 'intNumberType',\r\n monthsMainIndoorIceRinkInUse: 'intNumberType',\r\n }\r\n\r\n // ReSharper disable InconsistentNaming\r\n function TotalGrossFloorArea() {\r\n this.name = 'totalGrossFloorArea';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n this.units = '';\r\n }\r\n\r\n function AreaOfAllWalkInRefrigerationUnitsElement() {\r\n this.name = 'areaOfAllWalkInRefrigerationUnits';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n this.units = '';\r\n }\r\n\r\n function GymnasiumFloorAreaElement() {\r\n this.name = 'gymnasiumFloorArea';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n this.units = '';\r\n }\r\n\r\n function CoolingEquipmentRedundancyElement() {\r\n this.name = 'coolingEquipmentRedundancy';\r\n this.controlType = 'equipmentRedundancyType';\r\n this.value = '';\r\n }\r\n\r\n function ItEnergyConfigurationElement() {\r\n this.name = 'itEnergyConfiguration';\r\n this.controlType = 'itEnergyConfigurationType';\r\n this.value = '';\r\n }\r\n\r\n function UpsSystemRedundancyElement() {\r\n this.name = 'upsSystemRedundancy';\r\n this.controlType = 'equipmentRedundancyType';\r\n this.value = '';\r\n }\r\n\r\n function LengthOfAllOpenClosedRefrigerationUnitsElement() {\r\n this.name = 'lengthOfAllOpenClosedRefrigerationUnits';\r\n this.controlType = 'lengthType';\r\n this.value = '';\r\n this.units = '';\r\n }\r\n\r\n function NumberOfWorkers() {\r\n this.name = 'numberOfWorkers';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfComputers() {\r\n this.name = 'numberOfComputers';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function WeeklyOperatingHours() {\r\n this.name = 'weeklyOperatingHours';\r\n this.controlType = 'weeklyOperatingHoursType';\r\n this.value = '';\r\n }\r\n\r\n function OtherProperty() {\r\n this.fieldsList = [\r\n new TotalGrossFloorArea(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new WeeklyOperatingHours()\r\n ];\r\n }\r\n\r\n function HeatingElement() {\r\n this.name = 'percentOfficeHeated';\r\n this.controlType = 'percentOfficeHeatedType';\r\n this.value = '';\r\n }\r\n\r\n function CoolingElement() {\r\n this.name = 'percentOfficeCooled';\r\n this.controlType = 'percentOfficeCooledType';\r\n this.value = '';\r\n }\r\n\r\n function HeatingPercentElement() {\r\n this.name = 'percentCooled';\r\n this.controlType = 'percentsOver10';\r\n this.value = '';\r\n }\r\n\r\n function CoolingPercentElement() {\r\n this.name = 'percentHeated';\r\n this.controlType = 'percentsOver10';\r\n this.value = '';\r\n }\r\n\r\n function HasComputerLabElement() {\r\n this.name = 'hasComputerLab';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function CookingFacilitiesElement() {\r\n this.name = 'cookingFacilities';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfWalkInRefrigerationUnitsElement() {\r\n this.name = 'numberOfWalkInRefrigerationUnits';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfCashRegistersElement() {\r\n this.name = 'numberOfCashRegisters';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfOpenClosedRefrigerationUnitsElement() {\r\n this.name = 'numberOfOpenClosedRefrigerationUnits';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function HasDiningHallElement() {\r\n this.name = 'hasDiningHall';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function OpenOnWeekendsElement() {\r\n this.name = 'openOnWeekends';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function HasLaboratoryElement() {\r\n this.name = 'hasLaboratory';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function OnSiteLaundryFacilityElement() {\r\n this.name = 'onSiteLaundryFacility';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function LaundryFacilityElement() {\r\n this.name = 'laundryFacility';\r\n this.controlType = 'laundryFacilityType';\r\n this.value = '';\r\n }\r\n\r\n function MaximumNumberOfFloorsElement() {\r\n this.name = 'maximumNumberOfFloors';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfStaffedBedsElement() {\r\n this.name = 'numberOfStaffedBeds';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfMriMachinesElement() {\r\n this.name = 'numberOfMriMachines';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function ownedByElement() {\r\n this.name = 'ownedBy';\r\n this.controlType = 'ownedByType';\r\n this.value = '';\r\n }\r\n\r\n function IsTertiaryCareElement() {\r\n this.name = 'isTertiaryCare';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function LicensedBedCapacityElement() {\r\n this.name = 'licensedBedCapacity';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function IsHighSchoolElement() {\r\n this.name = 'isHighSchool';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function MonthsInUseElement() {\r\n this.name = 'monthsInUse';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function SchoolDistrictElement() {\r\n this.name = 'schoolDistrict';\r\n this.controlType = 'useStringType';\r\n this.value = '';\r\n }\r\n\r\n function StudentSeatingCapacityElement() {\r\n this.name = 'studentSeatingCapacity';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfRoomsElement() {\r\n this.name = 'numberOfRooms';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfFteWorkersElement() {\r\n this.name = 'numberOfFTEWorkers';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function EnrollmentElement() {\r\n this.name = 'enrollment';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function GrantDollarsElement() {\r\n this.name = 'grantDollars';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function FullServiceSpaFloorAreaElement() {\r\n this.name = 'fullServiceSpaFloorArea';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function GymCenterFloorAreaAreaElement() {\r\n this.name = 'gymCenterFloorArea';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function HoursPerDayGuestsOnsiteElement() {\r\n this.name = 'hoursPerDayGuestsOnsite';\r\n this.controlType = 'hoursPerDayGuestsOnsiteType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfCommercialRefrigerationUnitsElement() {\r\n this.name = 'numberOfCommercialRefrigerationUnits';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfGuestMealsServedPerYearElement() {\r\n this.name = 'numberOfGuestMealsServedPerYear';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfHotelRoomsElement() {\r\n this.name = 'numberOfHotelRooms';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function AmountOfLaundryProcessedAnnuallyElement() {\r\n this.name = 'amountOfLaundryProcessedAnnually';\r\n this.controlType = 'amountOfLaundryProcessedAnnuallyType';\r\n this.value = '';\r\n this.units = '';\r\n }\r\n\r\n function EnclosedFloorAreaElement() {\r\n this.name = 'enclosedFloorArea';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfSportingEventsPerYearElement() {\r\n this.name = 'numberOfSportingEventsPerYear';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n\r\n function NumberOfConcertShowEventsPerYearElement() {\r\n this.name = 'numberOfConcertShowEventsPerYear';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfSpecialOtherEventsPerYearElement() {\r\n this.name = 'numberOfSpecialOtherEventsPerYear';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function SizeOfElectronicScoreBoardsElement() {\r\n this.name = 'sizeOfElectronicScoreBoards';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function IceEventsElement() {\r\n this.name = 'iceEvents';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfSurgicalOperatingBedsElement() {\r\n this.name = 'numberOfSurgicalOperatingBeds';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function SurgeryCenterFloorAreaElement() {\r\n this.name = 'surgeryCenterFloorArea';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfResidentialLivingUnitsElement() {\r\n this.name = 'numberOfResidentialLivingUnits';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfBedroomsElement() {\r\n this.name = 'numberOfBedrooms';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfResidentialLivingUnitsMidRiseSettingElement() {\r\n this.name = 'numberOfResidentialLivingUnitsMidRiseSetting';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfLaundryHookupsInAllUnitsElement() {\r\n this.name = 'numberOfLaundryHookupsInAllUnits';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfLaundryHookupsInCommonAreaElement() {\r\n this.name = 'numberOfLaundryHookupsInCommonArea';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfResidentialLivingUnitsLowRiseSettingElement() {\r\n this.name = 'numberOfResidentialLivingUnitsLowRiseSetting';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfResidentialLivingUnitsHighRiseSettingElement() {\r\n this.name = 'numberOfResidentialLivingUnitsHighRiseSetting';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function ResidentPopulationElement() {\r\n this.name = 'residentPopulation';\r\n this.controlType = 'residentPopulationType';\r\n this.value = '';\r\n }\r\n\r\n function GovernmentSubsidizedHousingElement() {\r\n this.name = 'governmentSubsidizedHousing';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function SupplementalHeatingElement() {\r\n this.name = 'supplementalHeating';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function OpenFootageElement() {\r\n this.name = 'openFootage';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function CompletelyEnclosedFootageElement() {\r\n this.name = 'completelyEnclosedFootage';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function PartiallyEnclosedFootageElement() {\r\n this.name = 'partiallyEnclosedFootage';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function AverageNumberOfResidentsElement() {\r\n this.name = 'averageNumberOfResidents';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function MaximumResidentCapacityElement() {\r\n this.name = 'maximumResidentCapacity';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfCommercialWashingMachinesElement() {\r\n this.name = 'numberOfCommercialWashingMachines';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfResidentialWashingMachinesElement() {\r\n this.name = 'numberOfResidentialWashingMachines';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfResidentialLiftSystemsElement() {\r\n this.name = 'numberOfResidentialLiftSystems';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function SingleStoreElement() {\r\n this.name = 'singleStore';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function ExteriorEntranceToThePublicElement() {\r\n this.name = 'exteriorEntranceToThePublic';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfPeopleElement() {\r\n this.name = 'numberOfPeople';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function PoolSizeElement() {\r\n this.name = 'poolSize';\r\n this.controlType = 'poolSizeType';\r\n this.value = '';\r\n }\r\n\r\n function PoolLocationElement() {\r\n this.name = 'poolLocation';\r\n this.controlType = 'poolType';\r\n this.value = '';\r\n }\r\n\r\n function AverageInfluentBiologicalOxygenDemandElement() {\r\n this.name = 'averageInfluentBiologicalOxygenDemand';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function AverageEffluentBiologicalOxygenDemandElement() {\r\n this.name = 'averageEffluentBiologicalOxygenDemand';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function PlantDesignFlowRateElement() {\r\n this.name = 'plantDesignFlowRate';\r\n this.controlType = 'plantDesignFlowRateType';\r\n this.value = '';\r\n this.units = '';\r\n }\r\n\r\n function FixedFilmTrickleFiltrationProcessElement() {\r\n this.name = 'fixedFilmTrickleFiltrationProcess';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function NutrientRemovalElement() {\r\n this.name = 'nutrientRemoval';\r\n this.controlType = 'yesNoType';\r\n this.value = '';\r\n }\r\n\r\n function SeatingCapacityElement() {\r\n this.name = 'seatingCapacity';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfWeekdaysOpenElement() {\r\n this.name = 'numberOfWeekdaysOpen';\r\n this.controlType = 'numberOfWeekdaysType';\r\n this.value = '';\r\n }\r\n\r\n function MonthsMainIndoorIceRinkInUseElement() {\r\n this.name = 'monthsMainIndoorIceRinkInUse';\r\n this.controlType = 'useDecimalType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfWeeklyIceResurfacingForAllRinksElement() {\r\n this.name = 'numberOfWeeklyIceResurfacingForAllRinks';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfIndoorIceRinksElement() {\r\n this.name = 'numberOfIndoorIceRinks';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function NumberOfCurlingSheetsElement() {\r\n this.name = 'numberOfCurlingSheets';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n function TotalIceRinkSurfaceAreaForAllRinksElement() {\r\n this.name = 'totalIceRinkSurfaceAreaForAllRinks';\r\n this.controlType = 'grossFloorAreaType';\r\n this.value = '';\r\n }\r\n\r\n function SpectatorSeatingCapacityElement() {\r\n this.name = 'spectatorSeatingCapacity';\r\n this.controlType = 'intNumberType';\r\n this.value = '';\r\n }\r\n\r\n // ReSharper restore InconsistentNaming\r\n\r\n var adultEducationFields = new OtherProperty();\r\n\r\n var ambulatorySurgicalCenterFields = new OtherProperty();\r\n\r\n var aquariumFields = new OtherProperty();\r\n\r\n var automobileDealershipFields = new OtherProperty();\r\n\r\n var bankBranchFields = new OtherProperty();\r\n bankBranchFields.fieldsList.push(new HeatingElement());\r\n bankBranchFields.fieldsList.push(new CoolingElement());\r\n\r\n var barNightclubFields = new OtherProperty();\r\n\r\n var barracksFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new HasComputerLabElement(),\r\n new HasDiningHallElement(),\r\n new NumberOfRoomsElement(),\r\n new HeatingPercentElement(),\r\n new CoolingPercentElement()]\r\n }\r\n \r\n var bowlingAlleyFields = new OtherProperty();\r\n\r\n var casinoFields = new OtherProperty();\r\n\r\n var collegeUniversityFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfComputers(),\r\n new EnrollmentElement(),\r\n new GrantDollarsElement(),\r\n new NumberOfFteWorkersElement()]\r\n }\r\n \r\n var convenienceStoreWithGasStationFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new CookingFacilitiesElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new NumberOfOpenClosedRefrigerationUnitsElement(),\r\n new NumberOfCashRegistersElement(),\r\n new HeatingPercentElement(),\r\n new CoolingPercentElement(),\r\n new AreaOfAllWalkInRefrigerationUnitsElement(),\r\n new LengthOfAllOpenClosedRefrigerationUnitsElement()]\r\n }\r\n \r\n var convenienceStoreWithoutGasStationFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new CookingFacilitiesElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new NumberOfOpenClosedRefrigerationUnitsElement(),\r\n new NumberOfCashRegistersElement(),\r\n new HeatingPercentElement(),\r\n new CoolingPercentElement(),\r\n new AreaOfAllWalkInRefrigerationUnitsElement(),\r\n new LengthOfAllOpenClosedRefrigerationUnitsElement()]\r\n }\r\n \r\n var conventionCenterFields = new OtherProperty();\r\n\r\n var courthouseFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new HeatingElement(),\r\n new CoolingElement()]\r\n }\r\n \r\n var dataCenterFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new CoolingEquipmentRedundancyElement(),\r\n new ItEnergyConfigurationElement(),\r\n new UpsSystemRedundancyElement()]\r\n }\r\n \r\n var distributionCenterFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new HeatingPercentElement(),\r\n new CoolingPercentElement()]\r\n }\r\n \r\n var drinkingWaterTreatmentDistributionFields = {\r\n fieldsList: [ new TotalGrossFloorArea() ]\r\n }\r\n\r\n var enclosedMallFields = new OtherProperty();\r\n\r\n var energyPowerStationFields = new OtherProperty();\r\n\r\n var fastFoodRestaurantFields = new OtherProperty();\r\n\r\n var financialOfficeFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new HeatingElement(),\r\n new CoolingElement()]\r\n }\r\n \r\n var fireStationFields = new OtherProperty();\r\n\r\n var fitnessCenterHealthClubGymFields = new OtherProperty();\r\n\r\n var foodSalesFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new CookingFacilitiesElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new NumberOfOpenClosedRefrigerationUnitsElement(),\r\n new NumberOfCashRegistersElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new AreaOfAllWalkInRefrigerationUnitsElement(),\r\n new LengthOfAllOpenClosedRefrigerationUnitsElement()]\r\n }\r\n \r\n var foodServiceFields = new OtherProperty();\r\n\r\n var hospitalGeneralMedicalSurgicalFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new HasLaboratoryElement(),\r\n new OnSiteLaundryFacilityElement(),\r\n new MaximumNumberOfFloorsElement(),\r\n new NumberOfStaffedBedsElement(),\r\n new NumberOfFteWorkersElement(),\r\n new NumberOfMriMachinesElement(),\r\n new ownedByElement(),\r\n new IsTertiaryCareElement(),\r\n new LicensedBedCapacityElement(),\r\n new NumberOfWorkers(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement()]\r\n }\r\n \r\n var hotelFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new FullServiceSpaFloorAreaElement(),\r\n new GymCenterFloorAreaAreaElement(),\r\n new HoursPerDayGuestsOnsiteElement(),\r\n new NumberOfCommercialRefrigerationUnitsElement(),\r\n new NumberOfGuestMealsServedPerYearElement(),\r\n new NumberOfHotelRoomsElement(),\r\n new LaundryFacilityElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new CookingFacilitiesElement(),\r\n new AmountOfLaundryProcessedAnnuallyElement(),\r\n new NumberOfWorkers()]\r\n }\r\n \r\n var iceCurlingRinkFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfIndoorIceRinksElement(),\r\n new TotalIceRinkSurfaceAreaForAllRinksElement(),\r\n new MonthsMainIndoorIceRinkInUseElement(),\r\n new NumberOfWeeklyIceResurfacingForAllRinksElement(),\r\n new NumberOfFteWorkersElement(),\r\n new SpectatorSeatingCapacityElement()]\r\n }\r\n\r\n var indoorArenaFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new EnclosedFloorAreaElement(),\r\n new NumberOfSportingEventsPerYearElement(),\r\n new NumberOfConcertShowEventsPerYearElement(),\r\n new NumberOfSpecialOtherEventsPerYearElement(),\r\n new SizeOfElectronicScoreBoardsElement(),\r\n new IceEventsElement(),\r\n new NumberOfComputers(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement()]\r\n }\r\n \r\n var k12SchoolFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new OpenOnWeekendsElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new NumberOfComputers(),\r\n new CookingFacilitiesElement(),\r\n new IsHighSchoolElement(),\r\n new MonthsInUseElement(),\r\n new SchoolDistrictElement(),\r\n new StudentSeatingCapacityElement(),\r\n new NumberOfWorkers(),\r\n new GymnasiumFloorAreaElement()]\r\n }\r\n \r\n var laboratoryFields = new OtherProperty();\r\n\r\n var libraryFields = new OtherProperty();\r\n\r\n var lifestyleCenterFields = new OtherProperty();\r\n\r\n var mailingCenterPostOfficeFields = new OtherProperty();\r\n\r\n var manufacturingIndustrialPlantFields = new OtherProperty();\r\n\r\n var medicalOfficeFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfWorkers(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfSurgicalOperatingBedsElement(),\r\n new SurgeryCenterFloorAreaElement(),\r\n new NumberOfMriMachinesElement()]\r\n }\r\n \r\n var movieTheaterFields = new OtherProperty();\r\n\r\n var multifamilyHousingFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfResidentialLivingUnitsElement(),\r\n new NumberOfResidentialLivingUnitsLowRiseSettingElement(),\r\n new NumberOfResidentialLivingUnitsMidRiseSettingElement(),\r\n new NumberOfResidentialLivingUnitsHighRiseSettingElement(),\r\n new NumberOfBedroomsElement(),\r\n new NumberOfLaundryHookupsInAllUnitsElement(),\r\n new NumberOfLaundryHookupsInCommonAreaElement(),\r\n new HeatingPercentElement(),\r\n new CoolingPercentElement(),\r\n new ResidentPopulationElement(),\r\n new GovernmentSubsidizedHousingElement()]\r\n }\r\n \r\n var museumFields = new OtherProperty();\r\n\r\n var nonRefrigeratedWarehouseFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfWorkers(),\r\n new WeeklyOperatingHours(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement()]\r\n }\r\n\r\n var officeFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new CoolingElement(),\r\n new HeatingElement(),\r\n new WeeklyOperatingHours()\r\n ]\r\n }\r\n\r\n var otherFields = new OtherProperty();\r\n\r\n var otherEducationFields = new OtherProperty();\r\n\r\n var otherEntertainmentPublicAssemblyFields = new OtherProperty();\r\n\r\n var otherLodgingResidentialFields = new OtherProperty();\r\n\r\n var otherMallFields = new OtherProperty();\r\n\r\n var otherPublicServicesFields = new OtherProperty();\r\n\r\n var otherRecreationFields = new OtherProperty();\r\n\r\n var otherRestaurantBarFields = new OtherProperty();\r\n\r\n var otherServicesFields = new OtherProperty();\r\n\r\n var otherStadiumFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new EnclosedFloorAreaElement(),\r\n new NumberOfSportingEventsPerYearElement(),\r\n new NumberOfConcertShowEventsPerYearElement(),\r\n new NumberOfSpecialOtherEventsPerYearElement(),\r\n new SizeOfElectronicScoreBoardsElement(),\r\n new IceEventsElement(),\r\n new NumberOfComputers(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement()\r\n ]\r\n }\r\n\r\n var otherTechnologyScienceFields = new OtherProperty();\r\n\r\n var otherUtilityFields = new OtherProperty();\r\n\r\n var otherSpecialityHospitalFields = new OtherProperty();\r\n\r\n var outpatientRehabilitationPhysicalTherapyFields = new OtherProperty();\r\n\r\n var parkingFields = {\r\n fieldsList: [\r\n new SupplementalHeatingElement(),\r\n new OpenFootageElement(),\r\n new CompletelyEnclosedFootageElement(),\r\n new PartiallyEnclosedFootageElement()\r\n ]\r\n }\r\n\r\n var performingArtsFields = new OtherProperty();\r\n\r\n var personalServicesHealthBeautyDryCleaningFields = new OtherProperty();\r\n\r\n var policeStationFields = new OtherProperty();\r\n\r\n var preSchoolDaycareFields = new OtherProperty();\r\n\r\n var prisonIncarcerationFields = new OtherProperty();\r\n\r\n var raceTrackFields = new OtherProperty();\r\n\r\n var refrigeratedWarehouseFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfWorkers(),\r\n new WeeklyOperatingHours()\r\n ]\r\n }\r\n\r\n var repairServicesVehicleShoeLocksmithFields = new OtherProperty();\r\n\r\n var residentialCareFacilityFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfResidentialLivingUnitsElement(),\r\n new AverageNumberOfResidentsElement(),\r\n new MaximumResidentCapacityElement(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new NumberOfCommercialRefrigerationUnitsElement(),\r\n new NumberOfCommercialWashingMachinesElement(),\r\n new NumberOfResidentialLiftSystemsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new LicensedBedCapacityElement()\r\n ]\r\n }\r\n\r\n var residenceHallDormitoryFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfRoomsElement(),\r\n new HeatingPercentElement(),\r\n new CoolingPercentElement(),\r\n new HasComputerLabElement(),\r\n new HasDiningHallElement()\r\n ]\r\n }\r\n\r\n var restaurantFields = new OtherProperty();\r\n\r\n var retailStoreFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new NumberOfCashRegistersElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new NumberOfOpenClosedRefrigerationUnitsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new SingleStoreElement(),\r\n new ExteriorEntranceToThePublicElement(),\r\n new AreaOfAllWalkInRefrigerationUnitsElement(),\r\n new LengthOfAllOpenClosedRefrigerationUnitsElement(),\r\n new CookingFacilitiesElement()\r\n ]\r\n }\r\n\r\n var rollerRinkFields = new OtherProperty();\r\n\r\n var selfStorageFacilityFields = new OtherProperty();\r\n\r\n var seniorCareCommunityFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfResidentialLivingUnitsElement(),\r\n new AverageNumberOfResidentsElement(),\r\n new MaximumResidentCapacityElement(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new NumberOfCommercialRefrigerationUnitsElement(),\r\n new NumberOfCommercialWashingMachinesElement(),\r\n new NumberOfResidentialWashingMachinesElement(),\r\n new NumberOfResidentialLiftSystemsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new LicensedBedCapacityElement()\r\n ]\r\n }\r\n\r\n var singleFamilyHomeFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new NumberOfBedroomsElement(),\r\n new NumberOfPeopleElement()\r\n ]\r\n }\r\n\r\n var socialMeetingHallFields = new OtherProperty();\r\n\r\n var stadiumClosedFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new EnclosedFloorAreaElement(),\r\n new NumberOfSportingEventsPerYearElement(),\r\n new NumberOfConcertShowEventsPerYearElement(),\r\n new NumberOfSpecialOtherEventsPerYearElement(),\r\n new SizeOfElectronicScoreBoardsElement(),\r\n new IceEventsElement(),\r\n new NumberOfComputers(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement()\r\n ]\r\n }\r\n\r\n var stadiumOpenFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new EnclosedFloorAreaElement(),\r\n new NumberOfSportingEventsPerYearElement(),\r\n new NumberOfConcertShowEventsPerYearElement(),\r\n new NumberOfSpecialOtherEventsPerYearElement(),\r\n new SizeOfElectronicScoreBoardsElement(),\r\n new IceEventsElement(),\r\n new NumberOfComputers(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement()\r\n ]\r\n }\r\n\r\n var stripMallFields = new OtherProperty();\r\n\r\n var supermarketGroceryStoreFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfComputers(),\r\n new CookingFacilitiesElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new NumberOfOpenClosedRefrigerationUnitsElement(),\r\n new NumberOfCashRegistersElement(),\r\n new CoolingPercentElement(),\r\n new HeatingPercentElement(),\r\n new AreaOfAllWalkInRefrigerationUnitsElement(),\r\n new LengthOfAllOpenClosedRefrigerationUnitsElement()\r\n ]\r\n }\r\n\r\n var swimmingPoolFields = {\r\n fieldsList: [\r\n new PoolSizeElement(),\r\n new PoolLocationElement(),\r\n new MonthsInUseElement\r\n ]\r\n }\r\n\r\n var transportationTerminalStationFields = new OtherProperty();\r\n\r\n var urgentCareClinicOtherOutpatientFields = new OtherProperty();\r\n\r\n var veterinaryOfficeFields = new OtherProperty();\r\n\r\n var vocationalSchoolFields = new OtherProperty();\r\n\r\n var wastewaterTreatmentPlantFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new AverageInfluentBiologicalOxygenDemandElement(),\r\n new AverageEffluentBiologicalOxygenDemandElement(),\r\n new PlantDesignFlowRateElement(),\r\n new FixedFilmTrickleFiltrationProcessElement(),\r\n new NutrientRemovalElement()\r\n ]\r\n }\r\n\r\n var wholesaleClubSupercenterFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new ExteriorEntranceToThePublicElement(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfWorkers(),\r\n new NumberOfCashRegistersElement(),\r\n new NumberOfComputers(),\r\n new NumberOfOpenClosedRefrigerationUnitsElement(),\r\n new NumberOfWalkInRefrigerationUnitsElement(),\r\n new HeatingPercentElement(),\r\n new CoolingPercentElement(),\r\n new SingleStoreElement(),\r\n new AreaOfAllWalkInRefrigerationUnitsElement(),\r\n new LengthOfAllOpenClosedRefrigerationUnitsElement(),\r\n new CookingFacilitiesElement()\r\n ]\r\n }\r\n\r\n var worshipFacilityFields = {\r\n fieldsList: [\r\n new TotalGrossFloorArea(),\r\n new WeeklyOperatingHours(),\r\n new NumberOfCommercialRefrigerationUnitsElement(),\r\n new NumberOfComputers(),\r\n new CookingFacilitiesElement(),\r\n new SeatingCapacityElement(),\r\n new NumberOfWeekdaysOpenElement()\r\n ]\r\n }\r\n\r\n var zooFields = new OtherProperty();\r\n\r\n function getPropertyFieldsSettings() {\r\n var propertyFieldSettings = {\r\n \"1\": adultEducationFields,\r\n \"2\": ambulatorySurgicalCenterFields,\r\n \"3\": aquariumFields,\r\n \"4\": automobileDealershipFields,\r\n \"5\": bankBranchFields,\r\n \"6\": barNightclubFields,\r\n \"7\": barracksFields,\r\n \"8\": bowlingAlleyFields,\r\n \"9\": casinoFields,\r\n \"10\": collegeUniversityFields,\r\n \"11\": convenienceStoreWithGasStationFields,\r\n \"12\": convenienceStoreWithoutGasStationFields,\r\n \"13\": conventionCenterFields,\r\n \"14\": courthouseFields,\r\n \"15\": dataCenterFields,\r\n \"16\": distributionCenterFields,\r\n \"17\": drinkingWaterTreatmentDistributionFields,\r\n \"18\": enclosedMallFields,\r\n \"19\": energyPowerStationFields,\r\n \"20\": fastFoodRestaurantFields,\r\n \"21\": financialOfficeFields,\r\n \"22\": fireStationFields,\r\n \"23\": fitnessCenterHealthClubGymFields,\r\n \"24\": foodSalesFields,\r\n \"25\": foodServiceFields,\r\n \"26\": hospitalGeneralMedicalSurgicalFields,\r\n \"27\": hotelFields,\r\n \"28\": iceCurlingRinkFields,\r\n \"29\": indoorArenaFields,\r\n \"30\": k12SchoolFields,\r\n \"31\": laboratoryFields,\r\n \"32\": libraryFields,\r\n \"33\": lifestyleCenterFields,\r\n \"34\": mailingCenterPostOfficeFields,\r\n \"35\": manufacturingIndustrialPlantFields,\r\n \"36\": otherFields, // TODO: understand what to put here\r\n \"37\": medicalOfficeFields,\r\n \"38\": movieTheaterFields,\r\n \"39\": multifamilyHousingFields,\r\n \"40\": museumFields,\r\n \"41\": nonRefrigeratedWarehouseFields,\r\n \"42\": officeFields,\r\n \"43\": otherFields,\r\n \"44\": otherEducationFields,\r\n \"45\": otherEntertainmentPublicAssemblyFields,\r\n \"46\": otherLodgingResidentialFields,\r\n \"47\": otherMallFields,\r\n \"48\": otherPublicServicesFields,\r\n \"49\": otherRecreationFields,\r\n \"50\": otherRestaurantBarFields,\r\n \"51\": otherServicesFields,\r\n \"52\": otherStadiumFields,\r\n \"53\": otherTechnologyScienceFields,\r\n \"54\": otherUtilityFields,\r\n \"55\": otherSpecialityHospitalFields,\r\n \"56\": outpatientRehabilitationPhysicalTherapyFields,\r\n \"57\": parkingFields,\r\n \"58\": performingArtsFields,\r\n \"59\": personalServicesHealthBeautyDryCleaningFields,\r\n \"60\": policeStationFields,\r\n \"61\": preSchoolDaycareFields,\r\n \"62\": prisonIncarcerationFields,\r\n \"63\": raceTrackFields,\r\n \"64\": refrigeratedWarehouseFields,\r\n \"65\": repairServicesVehicleShoeLocksmithFields,\r\n \"66\": residentialCareFacilityFields,\r\n \"67\": residenceHallDormitoryFields,\r\n \"68\": restaurantFields,\r\n \"69\": retailStoreFields,\r\n \"70\": rollerRinkFields,\r\n \"71\": selfStorageFacilityFields,\r\n \"72\": seniorCareCommunityFields,\r\n \"73\": singleFamilyHomeFields,\r\n \"74\": socialMeetingHallFields,\r\n \"75\": stadiumClosedFields,\r\n \"76\": stadiumOpenFields,\r\n \"77\": stripMallFields,\r\n \"78\": supermarketGroceryStoreFields,\r\n \"79\": swimmingPoolFields,\r\n \"80\": transportationTerminalStationFields,\r\n \"81\": urgentCareClinicOtherOutpatientFields,\r\n \"82\": veterinaryOfficeFields,\r\n \"83\": vocationalSchoolFields,\r\n \"84\": wastewaterTreatmentPlantFields,\r\n \"85\": wholesaleClubSupercenterFields,\r\n \"86\": worshipFacilityFields,\r\n \"87\": zooFields\r\n }\r\n return propertyFieldSettings;\r\n }\r\n\r\n return {\r\n getPropertyTypeNames: getPropertyTypeNames,\r\n getPropertyFieldsSettings: getPropertyFieldsSettings,\r\n getFieldDescriptionByFieldName: getFieldDescriptionByFieldName,\r\n getFieldCaptionByFieldName: getFieldCaptionByFieldName,\r\n controlTypeByFieldName: controlTypeByFieldName,\r\n getPropertyFieldsSettings: getPropertyFieldsSettings,\r\n primaryPropertyFunctions: primaryPropertyFunctions\r\n }\r\n});\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('AddPropertyGroupController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', 'GetAccountsService', '$stateParams', 'CommonHeaderService',\r\n 'DueReminderService', 'ModalServiceExt', 'PropertyListService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window, usSpinnerService, LeftMenuService, $state,\r\n GetAccountsService, $stateParams, CommonHeaderService, DueReminderService, ModalServiceExt,\r\n PropertyListService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyPropertyGroups');\r\n CommonHeaderService.setUpBackButton(_t('Create Group'), true);\r\n\r\n $scope.errors = [];\r\n\r\n $scope.group = {\r\n Properties: [\r\n {\r\n selectId: 0,\r\n Address: ''\r\n },\r\n {\r\n selectId: 1,\r\n Address: ''\r\n }\r\n ]\r\n };\r\n\r\n $scope.addProperty = function () {\r\n var ticks = new Date().getTime();\r\n $scope.group.Properties.push({\r\n selectId: ticks,\r\n Address: ''\r\n });\r\n }\r\n\r\n $scope.removeProperty = function (property) {\r\n if ($scope.group.Properties.length <= 2) {\r\n ModalServiceExt.showMessage(_t('Error'), _t('Each group should have at least two properties.'));\r\n return;\r\n }\r\n var index = $scope.group.Properties.findIndex(function (e) { return e.selectId === property.selectId });\r\n $scope.group.Properties.splice(index, 1);\r\n }\r\n\r\n $scope.cancel = function() {\r\n $state.goMainLayout('PropertyGroupList');\r\n }\r\n\r\n $scope.submit = function() {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid) {\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n var ids = _.map($scope.group.Properties, function (property) { return property.Id; });\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AddPropertyGroup/',\r\n method: \"POST\",\r\n data: {\r\n UserName: $state.params.userId,\r\n Name: $scope.group.Name,\r\n PropertyIds: ids\r\n }\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n $state.goMainLayout('PropertyGroupList');\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var withoutDelegated = false;\r\n PropertyListService.getPropertyList(withoutDelegated).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n $scope.propertyList = response.Data;\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.getAvailableProperties = function(property) {\r\n var availableProperties = _.reject($scope.propertyList, function (p) {\r\n // note: compares int Id with string Id\r\n // ReSharper disable CoercedEqualsUsing\r\n var shouldBeRejected = p.Id != property.Id && _.some($scope.group.Properties,\r\n function (gp) {\r\n return gp.Id == p.Id;\r\n });\r\n return shouldBeRejected;\r\n // ReSharper restore CoercedEqualsUsing\r\n });\r\n return availableProperties;\r\n }\r\n\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('EditPropertyGroupController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', 'GetAccountsService', '$stateParams',\r\n 'CommonHeaderService', 'DueReminderService', 'ModalServiceExt', '$q', 'PropertyListService',\r\n 'PropertyService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $timeout, $window, usSpinnerService, LeftMenuService, $state,\r\n GetAccountsService, $stateParams, CommonHeaderService, DueReminderService, ModalServiceExt, $q,\r\n PropertyListService, PropertyService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyPropertyGroups');\r\n CommonHeaderService.setUpBackButton(_t('Edit Property Group'), true);\r\n\r\n $scope.errors = [];\r\n\r\n $scope.addProperty = function () {\r\n if (!$scope.selectedPropertyToAdd)\r\n return;\r\n $scope.group.Properties.push($scope.selectedPropertyToAdd);\r\n }\r\n\r\n $scope.cancel = function () {\r\n $state.goMainLayout('PropertyGroupList');\r\n }\r\n\r\n $scope.submit = function() {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid) {\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n var ids = _.map($scope.group.Properties, function (property) { return property.Id; });\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/EditPropertyGroup/',\r\n method: \"POST\",\r\n data: {\r\n Id: $state.params.propertyGroupId,\r\n Name: $scope.group.Name,\r\n PropertyIds: ids,\r\n userName: $state.params.userId\r\n }\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n ModalServiceExt.showInfo(_t('Group was successfuly changed.'), function () { $state.goMainLayout('PropertyGroupList'); });\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.getAvailableProperties = function () {\r\n var availableProperties = _.reject($scope.propertyList, function (p) {\r\n if (!$scope.group)\r\n return null;\r\n // note: compares int Id with string Id\r\n // ReSharper disable CoercedEqualsUsing\r\n var shouldBeRejected = _.some($scope.group.Properties,\r\n function (gp) {\r\n return gp.Id == p.Id;\r\n });\r\n return shouldBeRejected;\r\n // ReSharper restore CoercedEqualsUsing\r\n });\r\n\r\n if (availableProperties.length > 0 && !$scope.selectedPropertyToAdd)\r\n $scope.selectedPropertyToAdd = availableProperties[0];\r\n return availableProperties;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var getGroup = function() {\r\n return $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetPropertyGroup/',\r\n method: \"GET\",\r\n params: { propertyGroupId: $state.params.propertyGroupId }\r\n });\r\n }\r\n $q.all([PropertyListService.getPropertyList(), getGroup()]).then(function (response) {\r\n utilli.handleAjaxResponse(response[0].data, ModalServiceExt,\r\n function() {\r\n PropertyListService.loadPropertyList($scope, response[0].data);\r\n });\r\n utilli.handleAjaxResponse(response[1].data, ModalServiceExt,\r\n function () {\r\n var group = response[1].data.Data;\r\n group.Properties = _.map(group.Properties,\r\n function (property) {\r\n var propertyFromTheList = _.find($scope.propertyList,\r\n function(p) {\r\n return p.Id === property.Id;\r\n });\r\n propertyFromTheList.selectId = property.Id;\r\n return propertyFromTheList;\r\n });\r\n $scope.group = group;\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).catch(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.viewProperty = function(property) {\r\n property.Type = utilli.aggregationTypes.property;\r\n localStorage.setItem('currentAggregation', JSON.stringify(property));\r\n PropertyService.goToDashboard(property, $state);\r\n }\r\n\r\n $scope.editProperty = function (property) {\r\n $state.goMainLayout('EditProperty', { id: property.Id });\r\n }\r\n\r\n $scope.deleteProperty = function (property) {\r\n if($scope.group.Properties.length <=2)\r\n {\r\n ModalServiceExt.showMessage(_t('Error'), _t('Each group should have at least two properties.')); \r\n return; \r\n }\r\n ModalServiceExt.showYesNoMessage(\r\n _t('Delete Property'),\r\n _t('Are you sure that you want to delete the property from the group?'),\r\n function() {\r\n var index = $scope.group.Properties.findIndex(function (e) { return e.Id === property.Id });\r\n $scope.group.Properties.splice(index, 1);\r\n });\r\n }\r\n\r\n $scope.why = function (property) {\r\n $state.goMainLayout('ReasonsForNoScore', { propertyId: property.Id });\r\n }\r\n\r\n $scope.refreshScore = function (property) {\r\n PropertyListService.refreshScore($scope, property);\r\n };\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('AuthorizationsController', ['$scope', '$http', 'usSpinnerService',\r\n 'LeftMenuService', '$state', 'CommonHeaderService', 'ModalServiceExt', 'GridService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state, \r\n CommonHeaderService, ModalServiceExt, GridService) {\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('Authorizations');\r\n CommonHeaderService.setUpBackButton(_t('Authorizations'), true);\r\n\r\n $scope.authorizations = [];\r\n var pageSize = 20;\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n $scope.fixScore = function (score)\r\n {\r\n if (score == 0) {\r\n return 'N/A';\r\n } else {\r\n return score;\r\n }\r\n }\r\n \r\n $scope.getAuthorizations = function () {\r\n if ($scope.scrollingBusy)\r\n return;\r\n $scope.scrollingBusy = true;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = apiUrl + 'api/PropertyManagers/GetAuthorizationsPaged';\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params: {\r\n skip: $scope.authorizations.length,\r\n pageSize: pageSize,\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 {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n $scope.authorizationsCompleted = true;\r\n return;\r\n }\r\n\r\n if (!response.Data || response.Data.length < pageSize) {\r\n $scope.scrollingBusy = false;\r\n $scope.authorizationsCompleted = true;\r\n }\r\n\r\n for (var i = 0; i < response.Data.length; i++) {\r\n $scope.authorizations.push(response.Data[i]);\r\n }\r\n\r\n $scope.scrollingBusy = false;\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.authorizationsCompleted = true;\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.view = function (id) {\r\n $state.goMainLayout('Invitations', { propertyId: id });\r\n }\r\n\r\n $scope.sendInvitation = function () {\r\n $state.goMainLayout('SendInvitation');\r\n }\r\n\r\n $scope.exportData = function () {\r\n var url = apiUrl + 'api/PropertyManagers/GenerateAuthorizationsExcelData';\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n \r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: response.Data });\r\n utilli.downloadFile(url, \"Authorizations.xlsx\");\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('AuthorizationsGridController', ['$scope', '$http', 'usSpinnerService', '$state', 'ModalServiceExt', 'GridService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, $state, ModalServiceExt, GridService) {\r\n var _t = $scope._t;\r\n\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#AuthorizationsGrid\"));\r\n $(window).resize(function () {\r\n gridResizeFunc($scope.authorizationsKendoGrid);\r\n });\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n $scope.gridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: function (options) {\r\n var webapi = new kendo.data.transports.webapi({ prefix: \"\" });\r\n var params = webapi.parameterMap(options.data);\r\n params.userName = $state.params.userId;\r\n var url = apiUrl + 'api/PropertyManagers/GetAuthorizations';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.authorizationsKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\r\n });\r\n }\r\n },\r\n schema: { data: \"Data.PageData\", total: \"Data.Count\" },\r\n pageSize: 10,\r\n serverPaging: true,\r\n serverSorting: true\r\n },\r\n resizable: true,\r\n sortable: true,\r\n pageable: {\r\n pageSize: 25,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n dataBound: function () { gridResizeFunc($scope.authorizationsKendoGrid); },\r\n columns: [\r\n {\r\n field: \"PropertyAddress\",\r\n title: $scope._t(\"Property Address\"),\r\n width: 250\r\n }, {\r\n template: kendo.template($(\"#total-meters-template\").html()),\r\n field: \"TotalMeters\",\r\n title: $scope._t(\"Total Meters\"),\r\n width: 80\r\n }, {\r\n template: kendo.template($(\"#approved-template\").html()),\r\n field: \"Approved\",\r\n title: $scope._t(\"Data Authorizations Approved\"),\r\n width: 100\r\n }, {\r\n template: kendo.template($(\"#denied-template\").html()),\r\n field: \"Denied\",\r\n title: $scope._t(\"Data Authorizations Denied\"),\r\n width: 100\r\n }, {\r\n template: kendo.template($(\"#pending-template\").html()),\r\n field: \"Pending\",\r\n title: $scope._t(\"Data Authorizations Pending\"),\r\n width: 100\r\n }, {\r\n template: kendo.template($(\"#energy-star-score-template\").html()),\r\n field: \"EnergyStarScore\",\r\n title: $scope._t(\"ENERGY STAR Score\"),\r\n width: 100\r\n }, {\r\n title: $scope._t(\"Details\"),\r\n template: kendo.template($(\"#commands-template\").html()),\r\n width: \"100px\"\r\n }\r\n ]\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('InvitationsController', ['$scope', '$http', 'usSpinnerService',\r\n 'LeftMenuService', '$state', 'CommonHeaderService', 'ModalServiceExt', '$stateParams',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state,\r\n CommonHeaderService, ModalServiceExt, $stateParams) {\r\n var _t = $scope._t;\r\n $scope.noData = true;\r\n LeftMenuService.setCurrentTab('Authorizations');\r\n CommonHeaderService.setUpBackButton(_t('Invitations'), true);\r\n\r\n\r\n if (!$stateParams.propertyId)\r\n return;\r\n\r\n $scope.invitations = [];\r\n var pageSize = 20;\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n $scope.getInvitations = function () {\r\n if ($scope.scrollingBusy)\r\n return;\r\n $scope.scrollingBusy = true;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = apiUrl + 'api/PropertyManagers/GetInvitationsPaged';\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params: {\r\n propertyId: $stateParams.propertyId,\r\n skip: $scope.invitations.length,\r\n pageSize: pageSize,\r\n userName: $state.params.userId\r\n }\r\n }).success(function (response) {\r\n $scope.scrollingBusy = false;\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n $scope.invitationsCompleted = true;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n $scope.noData = !response.Data || response.Data.length == 0;\r\n\r\n if (!response.Data || response.Data.length < pageSize) {\r\n $scope.invitationsCompleted = true;\r\n }\r\n\r\n for (var i = 0; i < response.Data.length; i++) {\r\n $scope.invitations.push(response.Data[i]);\r\n }\r\n\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.invitationsCompleted = true;\r\n $scope.scrollingBusy = false;\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.view = function (id, meterNumber) {\r\n $state.goMainLayout('RecipientInvitationView', { id: id, meterNumber: meterNumber });\r\n }\r\n\r\n $scope.sendInvitation = function () {\r\n $state.goMainLayout('SendInvitation');\r\n }\r\n\r\n $scope.exportData = function () {\r\n var url = apiUrl + 'api/PropertyManagers/GenerateInvitationsExcelData';\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: { propertyId: $stateParams.propertyId, userName: $state.params.userId }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: response.Data });\r\n utilli.downloadFile(url, \"Invitations.xlsx\");\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('InvitationsGridController', ['$scope', '$http', 'usSpinnerService', '$state', 'ModalServiceExt', 'GridService', '$stateParams',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, $state, ModalServiceExt, GridService, $stateParams) {\r\n var _t = $scope._t;\r\n\r\n if (!$stateParams.propertyId)\r\n return;\r\n\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#InvitationsGrid\"));\r\n $(window).resize(function () {\r\n gridResizeFunc($scope.invitationsKendoGrid);\r\n });\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n $scope.gridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: function (options) {\r\n var webapi = new kendo.data.transports.webapi({ prefix: \"\" });\r\n var params = webapi.parameterMap(options.data);\r\n params = $.extend(params, { propertyId: $stateParams.propertyId });\r\n params.userName = $state.params.userId;\r\n var url = apiUrl + 'api/PropertyManagers/GetInvitationRecipients';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.invitationsKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\r\n });\r\n }\r\n },\r\n schema: { data: \"Data.PageData\", total: \"Data.Count\" },\r\n pageSize: 10,\r\n serverPaging: true,\r\n serverSorting: true\r\n },\r\n noRecords: true,\r\n messages:{\r\n noRecords: $scope._t(\"No authorizations received\"),\r\n },\r\n resizable: true,\r\n sortable: true,\r\n pageable: {\r\n pageSize: 25,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n dataBound: function () { gridResizeFunc($scope.invitationsKendoGrid); },\r\n columns: [\r\n {\r\n field: \"Recipient\",\r\n title: $scope._t(\"Recipient Name/ Company Name\"),\r\n width: 230\r\n }, {\r\n field: \"Email\",\r\n title: $scope._t(\"Email Address\"),\r\n width: 140\r\n }, {\r\n field: \"MeterNumber\",\r\n title: $scope._t(\"Meter Number\"),\r\n width: 90\r\n }, {\r\n field: \"Status\",\r\n title: $scope._t(\"Status\"),\r\n template: \"#= DisplayedStatus #\",\r\n width: 90\r\n }, {\r\n field: \"InvitationDate\",\r\n title: $scope._t(\"Date of Invitation\"),\r\n template: \"#= DisplayedInvitationDate #\",\r\n width: 100\r\n }, {\r\n field: \"ResponseDate\",\r\n title: $scope._t(\"Date of Response\"),\r\n template: \"#= DisplayedResponseDate #\",\r\n width: 100\r\n }, {\r\n title: $scope._t(\"Details\"),\r\n template: kendo.template($(\"#commands-template\").html()),\r\n width: \"100px\"\r\n }\r\n ]\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('RecipientInvitationViewController', ['$scope', '$http', 'usSpinnerService',\r\n 'LeftMenuService', '$state', 'CommonHeaderService', 'ModalServiceExt', '$stateParams', '$window',\r\n '$timeout',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state,\r\n CommonHeaderService, ModalServiceExt, $stateParams, $window, $timeout) {\r\n var _t = $scope._t;\r\n\r\n LeftMenuService.setCurrentTab('Authorizations');\r\n CommonHeaderService.setUpBackButton(_t('Invitation Details'), true);\r\n $scope.emailPattern = Config.emailPattern;\r\n\r\n initPage();\r\n\r\n function initPage() {\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/PropertyManagers/GetRecipientInvitationDetails',\r\n method: 'GET',\r\n params: { id: $stateParams.id, meterNumber: $stateParams.meterNumber }\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 $scope.recipientInvitation = response.Data;\r\n $scope.initRecipientInvitationData = {\r\n Email: response.Data.Email,\r\n Recipient: response.Data.Recipient\r\n };\r\n \r\n $scope.isPending = $scope.recipientInvitation.DisplayedStatus == \"Pending\";\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.saveChanges = function () {\r\n if(!$scope.editInvitationForm.$valid) {\r\n return;\r\n }\r\n\r\n var hasChanges = $scope.initRecipientInvitationData.Email != $scope.recipientInvitation.Email \r\n || $scope.initRecipientInvitationData.Recipient != $scope.recipientInvitation.Recipient;\r\n if(!hasChanges)\r\n return;\r\n\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/PropertyManagers/EditRecipientInvitationDetails',\r\n method: 'POST',\r\n params: { \r\n id: $stateParams.id, \r\n recipientEmail: $scope.recipientInvitation.Email, \r\n recipientName: $scope.recipientInvitation.Recipient \r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n $scope.recipientInvitation.Email = $scope.initRecipientInvitationData.Email;\r\n $scope.recipientInvitation.Recipient = $scope.initRecipientInvitationData.Recipient;\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n $scope.initRecipientInvitationData.Email = $scope.recipientInvitation.Email;\r\n $scope.initRecipientInvitationData.Recipient = $scope.recipientInvitation.Recipient;\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n \r\n $scope.setFocus = function (elSelector) {\r\n $timeout(function () {\r\n var age = $window.document.getElementById(elSelector);\r\n age.focus();\r\n });\r\n return true;\r\n };\r\n\r\n\r\n $scope.back = function () {\r\n $window.history.back();\r\n }\r\n\r\n $scope.getStatusClass = function () {\r\n if (!$scope.recipientInvitation)\r\n return '';\r\n\r\n if ($scope.recipientInvitation.Status === 0)\r\n return \"blue-status\";\r\n if ($scope.recipientInvitation.Status === 1)\r\n return \"green-status\";\r\n if ($scope.recipientInvitation.Status === 2)\r\n return \"red-status\";\r\n\r\n return '';\r\n }\r\n\r\n $scope.resend = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/PropertyManagers/ResendRecipientInvitation';\r\n $http({\r\n url: url,\r\n method: 'POST',\r\n data: { '': $scope.recipientInvitation.Id },\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0)\r\n {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showInfo(\"Invitation was successfully sent.\");\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('MeterDoesNotExistController', ['$rootScope', '$scope', 'usSpinnerService', 'LeftMenuService',\r\n '$state', '$stateParams', 'CommonHeaderService', 'ModalServiceExt', 'OpenFileService', '$window', 'SharedMetersCacheService', 'ServiceProvidersService',\r\n// ReSharper disable InconsistentNaming\r\n function ($rootScope, $scope, usSpinnerService, LeftMenuService, $state, $stateParams, CommonHeaderService,\r\n ModalServiceExt, OpenFileService, $window, SharedMetersCacheService, ServiceProvidersService) {\r\n\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Meter Validation Error'));\r\n $scope.helpEmail = utilli.getHelpEmail();\r\n $scope.supportPhoneNumber = utilli.getSupportPhoneNumber();\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.provider = providerData;\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n $scope.viewUnderstandYourBill = function () {\r\n OpenFileService.openUnderstandBillFile($scope.provider.ApiUrl);\r\n }\r\n\r\n $scope.close = function () {\r\n if (utilli.isAuthorized()) {\r\n if ($stateParams.from) {\r\n $state.goMainLayout(\r\n $stateParams.from,\r\n {\r\n id: $stateParams.propertyId,\r\n mode: $stateParams.mode,\r\n stepsCount: $stateParams.stepsCount,\r\n step: $stateParams.step,\r\n topMeter: $stateParams.meterId\r\n })\r\n }\r\n else\r\n $window.history.back();\r\n }\r\n else\r\n $state.go('TopMenuLayout.SendDataSharingInvitation', { useCachedMeters: true, token: $stateParams.token });\r\n }\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('MeterDuplicatedController', ['$scope', 'usSpinnerService', 'LeftMenuService', '$state',\r\n '$stateParams', 'CommonHeaderService', '$window',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, usSpinnerService, LeftMenuService, $state, $stateParams, CommonHeaderService, $window) {\r\n// ReSharper restore InconsistentNaming\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Meter Validation Error'));\r\n $scope.helpEmail = utilli.getHelpEmail();\r\n $scope.supportPhoneNumber = utilli.getSupportPhoneNumber();\r\n\r\n var goBack = function () {\r\n if (utilli.isAuthorized()) {\r\n if ($stateParams.from) {\r\n $state.goMainLayout(\r\n $stateParams.from,\r\n {\r\n id: $stateParams.propertyId,\r\n mode: $stateParams.mode,\r\n stepsCount: $stateParams.stepsCount,\r\n step: $stateParams.step,\r\n topMeter: $stateParams.meterId\r\n })\r\n }\r\n else {\r\n $window.history.back();\r\n }\r\n }\r\n else\r\n $state.go('TopMenuLayout.SendDataSharingInvitation', { useCachedMeters: true, token: $stateParams.token });\r\n }\r\n\r\n $scope.close = function () {\r\n goBack();\r\n }\r\n\r\n $scope.claim = function () {\r\n if (utilli.isAuthorized())\r\n $state.goMainLayout('ClaimMeter', { propertyId: $stateParams.propertyId, meterId: $stateParams.meterId, mode: $stateParams.mode });\r\n else\r\n $state.go('TopMenuLayout.ClaimMeter', { meterId: $stateParams.meterId, token: $stateParams.token });\r\n }\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('ServiceAddressMismatchesController', ['$scope', 'usSpinnerService', 'LeftMenuService', '$http',\r\n '$state', '$stateParams', 'CommonHeaderService', 'ModalServiceExt', '$window', 'ServiceProvidersService',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, usSpinnerService, LeftMenuService, $http, $state, $stateParams, CommonHeaderService,\r\n ModalServiceExt, $window, ServiceProvidersService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Meter Validation Error'));\r\n $scope.helpEmail = utilli.getHelpEmail();\r\n $scope.supportPhoneNumber = utilli.getSupportPhoneNumber();\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n if (utilli.checkDefinedValue(apiUrl)) {\r\n usSpinnerService.spin('spinner-1');\r\n getServiceAddress();\r\n } else {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n getServiceAddress();\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function getServiceAddress() {\r\n $http({\r\n method: \"GET\",\r\n url: apiUrl + 'api/PropertyManagers/GetMeterMismatchedAddresses/',\r\n params: { meterId: $stateParams.meterId }\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\r\n $scope.response = response.Data;\r\n // ReSharper disable once UndeclaredGlobalVariableUsing\r\n $scope.addresses = _.map(response.Data, function (address) {\r\n return address.HouseNumber + ' ' + address.Street + ', ' + address.City + ', ' + address.State\r\n + ', ' + address.Zip;\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 $scope.addressChecked = function (index) {\r\n $scope.currentAddress = $scope.response[index];\r\n $scope.currentAddressIndex = index;\r\n }\r\n\r\n $scope.close = function () {\r\n goBack();\r\n }\r\n\r\n $scope.confirm = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/PropertyManagers/SaveConfirmedMeter/',\r\n data: { 'MeterId': $stateParams.meterId, Address: $scope.currentAddress }\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\r\n //SharedMetersCacheService.deleteMeter($stateParams.meterId);\r\n goBack();\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function goBack() {\r\n if (utilli.isAuthorized()) {\r\n if ($stateParams.from) {\r\n $state.goMainLayout(\r\n $stateParams.from,\r\n {\r\n id: $stateParams.propertyId,\r\n mode: $stateParams.mode,\r\n stepsCount: $stateParams.stepsCount,\r\n step: $stateParams.step,\r\n topMeter: $stateParams.meterId\r\n })\r\n }\r\n else {\r\n $window.history.back();\r\n }\r\n }\r\n else\r\n $state.go('TopMenuLayout.SendDataSharingInvitation', { useCachedMeters: true, token: $stateParams.token });\r\n }\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('ClaimMeterController', ['$scope', 'usSpinnerService', 'LeftMenuService', '$state', '$stateParams',\r\n '$http', 'CommonHeaderService', 'ModalServiceExt', 'OpenFileService', '$window', 'ServiceProvidersService',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, usSpinnerService, LeftMenuService, $state, $stateParams, $http, CommonHeaderService,\r\n ModalServiceExt, OpenFileService, $window, ServiceProvidersService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Claim Meter'));\r\n\r\n $scope.accountMaxLength = Config.contractAccountMaxLength;\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n if (!utilli.checkDefinedValue(apiUrl)) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n apiUrl = providerData.ApiUrl;\r\n },\r\n function () {\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.viewUnderstandYourBill = function () {\r\n OpenFileService.openUnderstandBillFile(apiUrl);\r\n }\r\n\r\n var goBack = function () {\r\n if (utilli.isAuthorized()) {\r\n // history.back() doesn't accept parameters https://stackoverflow.com/a/32083943/292787\r\n // $window.history.back(-2); \r\n $window.history.go(-2); //AddProperty.FailedMeters or SendDataSharingInvitation page\r\n } else {\r\n $state.go('TopMenuLayout.SendDataSharingInvitation',\r\n { useCachedMeters: true, token: $stateParams.token });\r\n }\r\n }\r\n\r\n $scope.close = function () {\r\n goBack();\r\n }\r\n\r\n $scope.change = function() {\r\n var split = $scope.accountNumber.split(/[,\\s]/);\r\n split = _.map(split, function (x) { return x.trim(); });\r\n split = _.filter(split, function (x) { return x !== ''; });\r\n\r\n if (split.length === 3) {\r\n $scope.accountNumber = split[0];\r\n $scope.zip = split[1];\r\n $scope.invoiceNumber = split[2];\r\n }\r\n }\r\n\r\n $scope.claim = function () {\r\n $scope.submitted = true;\r\n if (!$scope.claimMeterForm.$valid)\r\n return;\r\n \r\n var recipientId;\r\n if ($stateParams.token) {\r\n var payload = utilli.getPayload($stateParams.token);\r\n recipientId = payload.RecipientId;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: apiUrl + 'api/PropertyManagers/ClaimMeter/',\r\n data: {\r\n MeterId: $stateParams.meterId,\r\n AccountNumber: $scope.accountNumber,\r\n Zip: $scope.zip,\r\n RecipientId: recipientId\r\n },\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function() {\r\n if (response.Data) {\r\n ModalServiceExt.showInfo(\r\n _t('The meter has been added to your property.'),\r\n function() {\r\n goBack();\r\n });\r\n } else {\r\n ModalServiceExt.showMessage(\r\n _t('Oops!'),\r\n //_t('The information you gave me doesn\\'t match my records, so I can\\'t add the meter right now. I\\'ve sent your request to a human for futher review. You can always check the status of your request by visiting the \"Authorizations\" page.'));\r\n _t('The information you gave me doesn\\'t match my records, so I can\\'t add the meter right now. Please confirm your details, or contact aggregateddata@wgl.com if you need assistance.'));\r\n }\r\n });\r\n\r\n \r\n }).error(function () {\r\n usSpinnerService.spin('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('MeterIsUsedController', ['$scope', 'usSpinnerService', 'LeftMenuService',\r\n '$state', '$stateParams', 'CommonHeaderService', 'ServiceProvidersService', 'ModalServiceExt',\r\n '$window', '$http',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, usSpinnerService, LeftMenuService, $state, $stateParams,\r\n CommonHeaderService, ServiceProvidersService, ModalServiceExt,\r\n $window, $http) {\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Meter Validation Error'));\r\n $scope.helpEmail = utilli.getHelpEmail();\r\n $scope.supportPhoneNumber = utilli.getSupportPhoneNumber();\r\n\r\n $scope.close = function () {\r\n if ($stateParams.from) {\r\n $state.goMainLayout(\r\n $stateParams.from,\r\n {\r\n id: $stateParams.propertyId,\r\n mode: $stateParams.mode,\r\n stepsCount: $stateParams.stepsCount,\r\n step: $stateParams.step,\r\n topMeter: $stateParams.meterId\r\n })\r\n }\r\n else {\r\n $window.history.back();\r\n }\r\n }\r\n\r\n $scope.goEditProperty = function (property) {\r\n $state.goMainLayout(\"EditProperty\", { id: property.Id });\r\n }\r\n\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n $scope.provider = providerData;\r\n\r\n $http({\r\n method: \"GET\",\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/FindPropertyWithThisMeter/',\r\n params: {\r\n propertyId: $stateParams.propertyId,\r\n meterId: $stateParams.meterId\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 $scope.propertiesWithTheSameMeter = response.Data;\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n },\r\n function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('MultipleTiedMetersController', ['$scope', 'usSpinnerService', 'LeftMenuService', 'ServiceProvidersService',\r\n '$state', '$stateParams', 'CommonHeaderService', 'ModalServiceExt', '$http', '$window', 'SharedMetersCacheService',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, usSpinnerService, LeftMenuService, ServiceProvidersService,\r\n $state, $stateParams, CommonHeaderService, ModalServiceExt, $http, $window, SharedMetersCacheService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Meter Validation Error'));\r\n $scope.helpEmail = utilli.getHelpEmail();\r\n $scope.supportPhoneNumber = utilli.getSupportPhoneNumber();\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n $scope.provider = providerData;\r\n\r\n $http({\r\n method: \"GET\",\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/GetTiedMeters/',\r\n params: { meterId: $stateParams.meterId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function () {\r\n $scope.tiedMeters = response.Data;\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n },\r\n function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n \r\n $scope.close = function () {\r\n goBack();\r\n }\r\n\r\n $scope.acknowledge = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/ConfirmTiedMeters/',\r\n data: { '': $stateParams.meterId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function () {\r\n //SharedMetersCacheService.deleteMeter($stateParams.meterId);\r\n goBack();\r\n });\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function goBack() {\r\n if (utilli.isAuthorized()) {\r\n if ($stateParams.from) {\r\n $state.goMainLayout(\r\n $stateParams.from,\r\n {\r\n id: $stateParams.propertyId,\r\n mode: $stateParams.mode,\r\n stepsCount: $stateParams.stepsCount,\r\n step: $stateParams.step,\r\n topMeter: $stateParams.meterId\r\n })\r\n }\r\n else {\r\n $window.history.back();\r\n }\r\n }\r\n else\r\n $state.go('TopMenuLayout.SendDataSharingInvitation', { useCachedMeters: true, token: $stateParams.token });\r\n }\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('BulkMetersInputController', ['$scope', 'LeftMenuService', '$state', '$stateParams', 'CommonHeaderService', 'BulkMetersService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, LeftMenuService, $state, $stateParams, CommonHeaderService, BulkMetersService) {\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Add Meters'));\r\n\r\n $scope.cancel = function () {\r\n $state.goMainLayout('AddProperty.AddMeters', { id: $stateParams.id, mode: $stateParams.mode, stepsCount: $stateParams.stepsCount, step: $stateParams.step});\r\n }\r\n\r\n $scope.ok = function () {\r\n if ($scope.metersText) {\r\n var meters = $scope.metersText.split(/[,\\s]/);\r\n meters = _.map(meters, function (meter) { return meter.trim(); });\r\n meters = _.filter(meters, function(meter) { return meter !== ''; });\r\n BulkMetersService.addMeters(meters);\r\n }\r\n\r\n $state.goMainLayout('AddProperty.AddMeters', { id: $stateParams.id, mode: $stateParams.mode, stepsCount: $stateParams.stepsCount, step: $stateParams.step });\r\n }\r\n }])\r\n .factory('BulkMetersService', function () {\r\n\r\n var metersNumbers = [];\r\n var clear = function () {\r\n metersNumbers = [];\r\n }\r\n var getMeters = function () {\r\n return metersNumbers;\r\n }\r\n var addMeters = function(meters) {\r\n metersNumbers = metersNumbers.concat(meters);\r\n }\r\n\r\n return {\r\n getMeters: getMeters,\r\n clear: clear,\r\n addMeters: addMeters\r\n };\r\n });\n'use strict';\r\n// ReSharper disable once UndeclaredGlobalVariableUsing\r\nangular.module('utilliApp')\r\n .controller('SharedAccountsController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService', \r\n 'CommonHeaderService', 'ModalServiceExt', '$state',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, CommonHeaderService, ModalServiceExt, $state) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('SharedAccounts');\r\n CommonHeaderService.setUp(_t('Shared Accounts'));\r\n\r\n var takeRecords = 20;\r\n $scope.requests = [];\r\n\r\n $scope.getRequests = function () {\r\n if ($scope.scrollingBusy)\r\n return;\r\n\r\n $scope.scrollingBusy = true;\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n method: 'GET',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetSharingAccountRequests/',\r\n params: { userName: $state.params.userId, skip: $scope.requests.length, count: takeRecords }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0], function () { $scope.scrollingBusy = false; });\r\n return;\r\n }\r\n\r\n if (response.Data.length === 0) {\r\n $scope.requestsCompleted = true;\r\n $scope.scrollingBusy = false;\r\n return;\r\n }\r\n\r\n for (var i = 0; i < response.Data.length; i++) {\r\n $scope.requests.push(response.Data[i]);\r\n }\r\n $scope.scrollingBusy = false;\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError(function () { $scope.scrollingBusy = false; });\r\n });\r\n }\r\n\r\n $scope.sendSharingAccountRequest = function () {\r\n $state.goMainLayout('SendSharingAccountRequest');\r\n }\r\n\r\n function changeRequestStatus(requestId, url, successMessage) {\r\n usSpinnerService.spin('spinner-1');\r\n \r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: { '': requestId },\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n var index = _.findIndex($scope.requests, function (item) { return item.Id === response.Data.Id; })\r\n if (index === -1) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n\r\n $scope.requests[index] = response.Data;\r\n ModalServiceExt.showInfo(successMessage);\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.accept = function (requestId) {\r\n changeRequestStatus(\r\n requestId,\r\n localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AcceptSharingAccountRequest/',\r\n 'Sharing request accepted.')\r\n }\r\n\r\n $scope.reject = function (requestId) {\r\n changeRequestStatus(\r\n requestId,\r\n localStorage.getItem('ApiUrl') + 'api/PropertyManagers/RejectSharingAccountRequest/',\r\n 'Sharing request rejected.')\r\n }\r\n\r\n $scope.revoke = function (requestId) {\r\n changeRequestStatus(\r\n requestId,\r\n localStorage.getItem('ApiUrl') + 'api/PropertyManagers/RevokeSharingAccountRequest/',\r\n 'Sharing request revoked.')\r\n }\r\n\r\n $scope.makeActive = function (requestId) {\r\n changeRequestStatus(\r\n requestId,\r\n localStorage.getItem('ApiUrl') + 'api/PropertyManagers/MakeActiveSharingAccountRequest/',\r\n 'Sharing request is active.')\r\n }\r\n\r\n $scope.delete = function (requestId) {\r\n ModalServiceExt.showYesNoMessage(\r\n _t('Delete Sharing Request'),\r\n _t('Are you sure that you want to delete the sharing request?'),\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/DeleteSharingAccountRequest/',\r\n data: { '': requestId },\r\n params: { userName: $state.params.userId }\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 $scope.requests = _.reject($scope.requests, function (item) { return item.Id === requestId; });\r\n ModalServiceExt.showInfo(_t('Sharing request deleted.'));\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError(response.Errors[0]);\r\n });\r\n });\r\n }\r\n }]);\n'use strict';\r\n// ReSharper disable once UndeclaredGlobalVariableUsing\r\nangular.module('utilliApp')\r\n .controller('SendSharingAccountRequestController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService',\r\n 'CommonHeaderService', 'ModalServiceExt', '$window', '$state',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, CommonHeaderService, ModalServiceExt, $window, $state) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('SharedAccounts');\r\n CommonHeaderService.setUp(_t('Send Sharing Account Request'));\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n }\r\n\r\n $scope.send = function () {\r\n \r\n if (!$scope.userIdOrEmail) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n $scope.submitted = false;\r\n var params = { userIdOrEmail: $scope.userIdOrEmail };\r\n utilli.addUserName($state, params);\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n params: params,\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/SendSharingAccountRequest/'\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.HasErrors) {\r\n if (response.Errors[0].indexOf('User with Id or Email') != -1) {\r\n ModalServiceExt.showYesNoMessage(_t('Sending Email Invitation'), _t('We can not find user in our system by email you provided. Would you like us to invite person to register in UtilliCX by sending invitation email?'),\r\n function () {\r\n $state.goMainLayout('SendSharingAccountRequestEmail', { email: $scope.userIdOrEmail });\r\n return;\r\n },\r\n\r\n function () {\r\n $state.goMainLayout('SharedAccounts');\r\n return;\r\n });\r\n }\r\n else {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n }\r\n else {\r\n ModalServiceExt.showInfo(\r\n _t('Sharing account request sent successfully.'),\r\n function () { $window.history.back(); });\r\n }\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }]);\n'use strict';\r\n// ReSharper disable once UndeclaredGlobalVariableUsing\r\nangular.module('utilliApp')\r\n .controller('SendSharingAccountRequestEmailController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService',\r\n 'CommonHeaderService', 'ModalServiceExt', '$window', '$state',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, CommonHeaderService, ModalServiceExt, $window, $state) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('SharedAccounts');\r\n CommonHeaderService.setUp(_t('Send Sharing Account Request Email'));\r\n\r\n $scope.explanation = '';\r\n\r\n $scope.email = $state.params.email;\r\n $scope.emailPattern = window.Config.emailPattern;\r\n if (!$scope.emailPattern.test($scope.email))\r\n {\r\n $scope.email = '';\r\n $scope.explanation = _t('Please, enter email. We will use this email to send invitation.');\r\n }\r\n else\r\n {\r\n $scope.explanation = _t('Please, confirm email. We will use this email to send invitation.');\r\n }\r\n\r\n $scope.cancel = function () {\r\n //$window.history.back();\r\n $state.goMainLayout('SharedAccounts');\r\n }\r\n\r\n $scope.send = function () {\r\n \r\n if (!$scope.email) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n $scope.submitted = false;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var params = {\r\n email: $scope.email\r\n };\r\n utilli.addUserName($state, params);\r\n $http({\r\n method: 'POST',\r\n params: params,\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/SendInvitationEmail/',\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showInfo(\r\n _t('Email Invitation was successfully sent.'),\r\n function () { $state.goMainLayout('SharedAccounts'); });\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('MeterNeedsApprovalController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService', '$state',\r\n '$stateParams', 'CommonHeaderService', 'ModalServiceExt', '$window',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state, $stateParams, CommonHeaderService,\r\n ModalServiceExt, $window) {\r\n\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('Edit Property');\r\n CommonHeaderService.setUp(_t('Approve Property Meter'));\r\n\r\n $scope.meterNumber = $stateParams.meterNumber;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'GET',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetInvitationRecipient/',\r\n params: {\r\n propertyId: $stateParams.propertyId,\r\n meterId: $stateParams.meterId,\r\n userName: $state.params.userId\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 $scope.tenantName = response.Data.Recipient;\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.delete = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var params = { meterId: $stateParams.meterId };\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.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showInfo(_t('Property meter deleted.'), function () { $window.history.back(); });\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.approve = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/ApproveMeter/',\r\n data: { '': $stateParams.meterId },\r\n params: { userName: $state.params.userId }\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 ModalServiceExt.showInfo(_t('Property meter approved.'), function () { goBack(); });\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function goBack() {\r\n if (utilli.isAuthorized()) {\r\n if ($stateParams.from) {\r\n $state.goMainLayout(\r\n $stateParams.from,\r\n {\r\n id: $stateParams.propertyId,\r\n mode: $stateParams.mode,\r\n stepsCount: $stateParams.stepsCount,\r\n step: $stateParams.step,\r\n topMeter: $stateParams.meterId\r\n })\r\n }\r\n else\r\n $window.history.back();\r\n }\r\n else\r\n $state.go('TopMenuLayout.SendDataSharingInvitation', { useCachedMeters: true, token: $stateParams.token });\r\n }\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('WelcomeAgentController', ['$scope', 'LeftMenuService', '$state', 'CommonDataService',\r\n 'ServiceProvidersService', '$sce', 'usSpinnerService', '$http', 'CommonHeaderService',\r\nfunction ($scope, LeftMenuService, $state, CommonDataService, ServiceProvidersService, $sce,\r\n usSpinnerService, $http, CommonHeaderService) {\r\n CommonHeaderService.setUp();\r\n\r\n $scope.appUrls = Config.appUrls;\r\n\r\n var token = localStorage.getItem('SecurityToken');\r\n if (token)\r\n {\r\n $state.goMainLayout('Dashboard');\r\n return;\r\n }\r\n\r\n $state.go('TopMenuLayout.WelcomeAgent.SignIn.Credentials');\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 }\r\n else {\r\n $scope.helpEmail = 'help@utilli.com';\r\n }\r\n $scope.phoneNumbers = 'loading...';\r\n $scope.loadPhoneNumbers = function (){\r\n if ($scope.phoneNumbersLoaded){\r\n return;\r\n }\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(providers) {\r\n if (!providers || providers.length == 0) {\r\n $scope.phoneNumbers = \"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 = \"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 = \"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 $scope.phoneNumbersLoaded = true;\r\n }).error(function() {\r\n $scope.phoneNumbers = \"Server error. Try again later.\";\r\n });\r\n },\r\n function() {\r\n $scope.phoneNumbers = \"Server error. Try again later.\";\r\n });\r\n }\r\n}]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('SearchController', ['$scope', '$rootScope', '$state', '$http', '$timeout', 'LeftMenuService',\r\n 'CommonHeaderService', 'ModalServiceExt', 'usSpinnerService',\r\n function ($scope, $rootScope, $state, $http, $timeout,\r\n// ReSharper disable InconsistentNaming\r\n LeftMenuService, CommonHeaderService, ModalServiceExt,\r\n// ReSharper restore InconsistentNaming\r\n usSpinnerService) {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('Search');\r\n CommonHeaderService.setUpNotificationButton(_t('Account/Property Search'));\r\n $scope.submitted = false;\r\n $scope.isSearchResultVisible = false;\r\n\r\n $scope.search = function () {\r\n $scope.submitted = true;\r\n if (!$scope.isRequiredFilled() || $scope.searchForm.accountNumber.$error.pattern && $scope.accountNumber) {\r\n return;\r\n }\r\n $scope.submitted = false;\r\n var url;\r\n var parameters;\r\n if ($scope.accountNumber) {\r\n url = localStorage.getItem('ApiUrl') + 'api/Agents/SearchByAccountNumber/';\r\n parameters = { accountNumber: $scope.accountNumber };\r\n searchBy(url, parameters);\r\n }\r\n else {\r\n url = localStorage.getItem('ApiUrl') + 'api/Agents/SearchByAddress/';\r\n parameters = {\r\n houseNumber: $scope.HouseNumber,\r\n street: $scope.Street,\r\n city: $scope.City,\r\n state: $scope.State,\r\n zipCode: $scope.Zip,\r\n unitApt: $scope.HouseNoSupplement\r\n };\r\n searchBy(url, parameters);\r\n }\r\n }\r\n\r\n function searchBy(url, parameters) {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: parameters\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (response.Data) {\r\n $scope.searchResults = response.Data;\r\n $scope.companyName = localStorage.getItem('ServiceProviderName');\r\n }\r\n else {\r\n $scope.searchResults = [];\r\n }\r\n $scope.isSearchResultVisible = true;\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.onHouseNumberChange = function () {\r\n if (/\\d*\\s+[\\w\\s]+,[\\w\\s]+,[\\w\\s]+,\\s*\\d+/.test($scope.HouseNumber)) {\r\n var splited = $scope.HouseNumber.split(',');\r\n $scope.HouseNumber = splited[0].split(' ')[0];\r\n $scope.Street = splited[0].replace($scope.HouseNumber, '');\r\n $scope.City = splited[1];\r\n $scope.State = splited[2];\r\n $scope.Zip = splited[3].trim().substring(0, 5);\r\n }\r\n }\r\n\r\n $scope.isRequiredFilled = function() {\r\n var byAccountNumber = $scope.accountNumber;\r\n var byAddress = $scope.Street && $scope.Zip;\r\n return byAccountNumber || byAddress;\r\n }\r\n\r\n $scope.isZipCodeValid = function () {\r\n var matched = Config.zipCodeRegexp.test($scope.Zip);\r\n return matched;\r\n }\r\n\r\n var goToAccountDashboard = function (accountNumber, utilityType) {\r\n localStorage.setItem('CurrentAccountNumber', accountNumber);\r\n localStorage.setItem('CurrentUtilityType', utilityType);\r\n\r\n $rootScope.showSlideAnimation = true;\r\n\r\n $state.goMainLayout(\"Dashboard\");\r\n\r\n $timeout(function () {\r\n $rootScope.showSlideAnimation = false;\r\n }, 300);\r\n };\r\n\r\n $scope.askAboutSettlementProperty = function (accountNumber, utilityType, address) {\r\n ModalServiceExt.showYesNoMessage(_t('Property settlement'), _t('Is this property going to settlement?'),\r\n function () {\r\n $state.goMainLayout('SettlementProperty',\r\n {\r\n AccountNumber: accountNumber,\r\n Address: address\r\n });\r\n }, function () {\r\n goToAccountDashboard(accountNumber, utilityType);\r\n });\r\n }\r\n\r\n $scope.getUtilityImage = function (utilityType) {\r\n if (utilityType === 'Gas')\r\n return 'gas-bgr';\r\n if (utilityType === 'Water')\r\n return 'water-bgr';\r\n if (utilityType === 'Electricity')\r\n return 'elctr-bgr';\r\n return '';\r\n }\r\n }]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('SearchHistoryController', ['$scope', '$rootScope', '$state', '$http', '$timeout',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'TimeService', 'GridService',\r\n 'usSpinnerService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $state, $http, $timeout, LeftMenuService, CommonHeaderService, ModalServiceExt,\r\n TimeService, GridService, usSpinnerService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('SearchHistory');\r\n CommonHeaderService.setUp(_t('Account/Property Search History'));\r\n\r\n TimeService.getTimeZone().then(function (timeZoneShift) {\r\n $scope.convertDate = function (date) {\r\n date = kendo.parseDate(date);\r\n date.addHours(timeZoneShift);\r\n var result = kendo.toString(date, 'dd MMM yyyy HH:mm');\r\n return result;\r\n }\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#searchHistoryGrid\"));\r\n\r\n $scope.mainGridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: function (options) {\r\n // ReSharper disable once InconsistentNaming\r\n var webapi = new kendo.data.transports.webapi({ prefix: \"\" });\r\n var params = webapi.parameterMap(options.data);\r\n var usersUrl = localStorage.getItem('ApiUrl') + 'api/Agents/GetSearchHistory/';\r\n $http.get(usersUrl, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.searchHistoryKenoGrid);\r\n })\r\n .error(function () {\r\n options.error();\r\n });\r\n }\r\n },\r\n schema: { data: \"Data.PageData\", total: \"Data.Count\" },\r\n pageSize: 20,\r\n serverPaging: true,\r\n serverSorting: true,\r\n serverFiltering: true\r\n },\r\n sortable: true,\r\n pageable: {\r\n pageSize: 10,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n dataBound: function () {\r\n gridResizeFunc($scope.searchHistoryKenoGrid);\r\n },\r\n columns: [\r\n {\r\n field: \"Date\",\r\n title: _t(\"Date\"),\r\n template: \"#: data.Date# \",\r\n width: 140\r\n },\r\n {\r\n field: \"AccountNumber\",\r\n title: _t(\"Account Number\"),\r\n width: 100\r\n },\r\n {\r\n field: \"Address\",\r\n title: _t(\"Address\"),\r\n width: 90\r\n },\r\n {\r\n field: \"UtillityType\",\r\n hidden: true\r\n },\r\n {\r\n width: 70,\r\n template: \"\"\r\n }\r\n ]\r\n }\r\n\r\n $scope.askAboutSettlementProperty = function (dataItem) {\r\n var url = localStorage.getItem('ApiUrl') + 'api/Agents/SearchByAccountNumber/';\r\n var parameters = { accountNumber: dataItem.AccountNumber };\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: parameters\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (response.Data)\r\n askUser(dataItem);\r\n else\r\n ModalServiceExt.showInfo(_t('The contract account number not found.'));\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n var goToOverview = function (dataItem) {\r\n localStorage.setItem('CurrentAccountNumber', dataItem.AccountNumber);\r\n localStorage.setItem('CurrentUtilityType', dataItem.UtilityType);\r\n\r\n $state.goMainLayout(\"Dashboard\");\r\n };\r\n\r\n function askUser(dataItem) {\r\n ModalServiceExt.showYesNoMessage(_t('Property settlement'),\r\n _t('Is this property going to settlement?'),\r\n function () {\r\n $state.goMainLayout('SettlementProperty',\r\n {\r\n AccountNumber: dataItem.AccountNumber,\r\n Address: dataItem.Address,\r\n UtilityType: dataItem.UtilityType\r\n });\r\n }, function () {\r\n goToOverview(dataItem);\r\n });\r\n }\r\n });\r\n }]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('SettlementPropertyController', ['$scope', '$rootScope', '$state', '$window', '$http', '$timeout',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'TimeService',\r\n 'GridService', 'usSpinnerService', '$stateParams',\r\n function ($scope, $rootScope, $state, $window, $http, $timeout,\r\n// ReSharper disable InconsistentNaming\r\n LeftMenuService, CommonHeaderService, ModalServiceExt, TimeService, GridService,\r\n// ReSharper restore InconsistentNaming\r\n usSpinnerService, $stateParams) {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('SearchHistory');\r\n CommonHeaderService.setUp(_t('Property Settlement'));\r\n\r\n initDatePicker();\r\n \r\n $scope.accountNumber = $stateParams.AccountNumber;\r\n $scope.propertyAddress = $stateParams.Address;\r\n\r\n $scope.submit = function () {\r\n $scope.submitted = true;\r\n if (!$scope.settlementPropertyForm.$valid)\r\n return;\r\n $scope.submitted = false;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var requestData = {\r\n accountNumber: $stateParams.AccountNumber,\r\n addressLine: $stateParams.Address,\r\n firstAndLastName: $scope.firstLastName,\r\n mailingAddress: $scope.mailingAddress,\r\n settlementDate: $scope.settlementDate.toUTCString()\r\n };\r\n $http.post(localStorage.getItem('ApiUrl') + 'api/Agents/SavePropertySettlementDetails',\r\n requestData)\r\n .success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n var dataItem = {\r\n AccountNumber: $stateParams.AccountNumber,\r\n UtilityType: $stateParams.UtilityType\r\n };\r\n localStorage.setItem('CurrentAccountNumber', dataItem.AccountNumber);\r\n localStorage.setItem('CurrentUtilityType', dataItem.UtilityType);\r\n $state.goMainLayout(\"Dashboard\");\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.back = function () {\r\n $window.history.back();\r\n }\r\n\r\n function initDatePicker() {\r\n $scope.settlementDate = new Date();\r\n\r\n $scope.dpOptions = utilli.datePickerOptions;\r\n\r\n $scope.format = 'shortDate';\r\n $scope.altInputFormats = ['M!/d!/yyyy'];\r\n\r\n $scope.datepickerPopup = {\r\n opened: false\r\n };\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('SignUpAgentController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state,\r\n// ReSharper disable InconsistentNaming\r\n CommonHeaderService) {\r\n// ReSharper restore InconsistentNaming\r\n CommonHeaderService.hideMenuToggleButton();\r\n\r\n $scope.Model = $scope.Model || {\r\n firstName: '',\r\n lastName: '',\r\n agency: '',\r\n phoneNumber: '',\r\n userName : '',\r\n email: '',\r\n password: '',\r\n securityQuestion: '',\r\n securityAnswer: ''\r\n };\r\n \r\n }])\r\n.controller('SignUpAgentStep1Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'usSpinnerService', 'ServiceProvidersService', '$stateParams', 'CheckVersionService', '$q', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService,\r\n // ReSharper disable InconsistentNaming\r\n ServiceProvidersService, $stateParams, CheckVersionService, $q, ModalServiceExt) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.cancel = function () {\r\n ModalServiceExt.showYesNoMessage(_t('Confirmation'), _t('Are you sure you want to cancel agent registration process?'), function () {\r\n $state.go('TopMenuLayout.WelcomeAgent', null, { reload: true });\r\n });\r\n };\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n\r\n $scope.checkUserInfoFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n if (!$scope.formUserInfo.$valid) {\r\n $scope.submitted = true;\r\n usSpinnerService.stop(\"spinner-1\");\r\n return;\r\n }\r\n $state.goRelativeTo('SignUpAgent', 'Step2',\r\n {\r\n regData: {\r\n firstName: $.trim($scope.firstName),\r\n lastName: $.trim($scope.lastName),\r\n agency: $.trim($scope.agency),\r\n phoneNumber: $.trim($scope.phoneNumber)\r\n }\r\n });\r\n usSpinnerService.stop(\"spinner-1\");\r\n }\r\n }])\r\n.controller('SignUpAgentStep2Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'CommonDataService', 'usSpinnerService', '$stateParams', 'ServiceProvidersService', 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $state, $moduleServices, CommonDataService,\r\n usSpinnerService, $stateParams, ServiceProvidersService, ModalServiceExt) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.Model.password = '';\r\n\r\n $scope.cancel = function () {\r\n $state.goRelativeTo('SignUpAgent', 'Step1');\r\n };\r\n\r\n $scope.errors = [];\r\n\r\n var loadingText = _t('Loading...');\r\n $scope.passRequirements = [loadingText];\r\n $scope.SecurityQuestions = [loadingText];\r\n $scope.Model.securityQuestion = loadingText;\r\n\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.Model.securityQuestion = $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 $scope.getPasswdMinLength = function () {\r\n var result = $scope.paswdMinLength ? $scope.paswdMinLength : 1;\r\n return result;\r\n }\r\n\r\n $scope.isPasswordValid = function () {\r\n var isValid = utilli.isPasswordValid($scope.Model.userName, $scope.Model.password,\r\n $scope.confirmPassword, $scope.Model.paswdMinLength);\r\n return isValid;\r\n }\r\n\r\n $scope.hasDigits = function () {\r\n return utilli.hasDigits($scope.password);\r\n };\r\n\r\n $scope.hasLetters = function () {\r\n return utilli.hasLetters($scope.password);\r\n };\r\n\r\n $scope.errors = [];\r\n\r\n $scope.checkLoginInfoFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n if (!$scope.formUserInfo.$valid || !$scope.isPasswordValid()) {\r\n $scope.submitted = true;\r\n usSpinnerService.stop(\"spinner-1\");\r\n return;\r\n }\r\n var data = {\r\n firstName: $.trim($scope.Model.firstName),\r\n lastName: $.trim($scope.Model.lastName),\r\n agency: $.trim($scope.Model.agency),\r\n phoneNumber: $.trim($scope.Model.phoneNumber),\r\n\r\n userName: $.trim($scope.Model.userName),\r\n email: $.trim($scope.Model.email),\r\n password: $.trim($scope.Model.password),\r\n securityQuestion: $scope.Model.securityQuestion,\r\n securityAnswer: $.trim($scope.Model.securityAnswer)\r\n };\r\n\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/Agents/ValidateRegisterData/',\r\n method: \"POST\",\r\n data: data\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 $scope.errors = response.Errors;\r\n utilli.scrollTop();\r\n }\r\n else {\r\n $state.goRelativeTo('SignUpAgent', 'Step3');\r\n }\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n }])\r\n.controller('SignUpAgentStep3Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams', 'moduleServices',\r\n 'CommonDataService', 'usSpinnerService', '$sce', 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $state, $stateParams, $moduleServices, CommonDataService, usSpinnerService,\r\n $sce, ModalServiceExt) {\r\n // ReSharper restore InconsistentNaming\r\n $scope.errors = [];\r\n\r\n $scope.cancel = function () {\r\n $state.goRelativeTo('SignUpAgent', 'Step2');\r\n };\r\n\r\n $scope.loadTermsAndConditions = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n var url = $rootScope.webServicesUrl + 'api/StaticData/GetTermsAndConditions';\r\n $http({\r\n url: url,\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 var data = {\r\n firstName: $.trim($scope.Model.firstName),\r\n lastName: $.trim($scope.Model.lastName),\r\n agency: $.trim($scope.Model.agency),\r\n phoneNumber: $.trim($scope.Model.phoneNumber),\r\n\r\n userName: $.trim($scope.Model.userName),\r\n email: $.trim($scope.Model.email),\r\n password: $.trim($scope.Model.password),\r\n securityQuestion: $scope.Model.securityQuestion,\r\n securityAnswer: $.trim($scope.Model.securityAnswer)\r\n };\r\n\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/Agents/Register/',\r\n method: \"POST\",\r\n data: data\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 ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $state.goRelativeTo('SignUpAgent', 'Success');\r\n }\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n\r\n }])\r\n.controller('SignUpAgentSuccessController', ['$scope', '$rootScope', 'CommonDataService',\r\n 'usSpinnerService', '$state',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, CommonDataService, usSpinnerService, $state) {\r\n// ReSharper restore InconsistentNaming\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.go('TopMenuLayout.WelcomeAgent', null, { reload: true });\r\n }\r\n });\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('AgentProfileController', ['$scope', '$http', '$window', 'usSpinnerService', '$state', '$stateParams',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'avatarsService',\r\n function ($scope, $http, $window, usSpinnerService, $state, $stateParams, \r\n // ReSharper disable InconsistentNaming\r\n LeftMenuService, CommonHeaderService, ModalServiceExt,\r\n // ReSharper restore InconsistentNaming\r\n avatarsService) {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n var _t = $scope._t;\r\n CommonHeaderService.setUp(_t('Edit Agent Profile'));\r\n LeftMenuService.setCurrentTab('Profile');\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n $scope.errors = [];\r\n\r\n init();\r\n\r\n $scope.save = function () {\r\n $scope.submitted = true;\r\n if(!$scope.editProfileForm.$valid){\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n var postData = {};\r\n $window.jQuery.extend(postData, $scope.userData);\r\n var countryCode = utilli.getCountryPhoneNumberCode();\r\n postData.PhoneNumber = countryCode + postData.PhoneNumber;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Agents/EditProfile/',\r\n method: \"POST\",\r\n data: postData\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n ModalServiceExt.showInfo(_t('Your profile has been saved.'));\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.push({ Message: utilli.serverErrorMessage });\r\n });\r\n }\r\n\r\n $scope.changeAvatar = function () {\r\n $state.goMainLayout('Avatars', { forAgent: true });\r\n };\r\n\r\n function init() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/Agents/GetProfile'\r\n }).success(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.userData = data.Data;\r\n avatarsService.setCurrentAvatar(apiUrl + $scope.userData.AvatarPath);\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.push({ Message: utilli.serverErrorMessage });\r\n });\r\n };\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('WelcomeMobileController', ['$state', '$scope',\r\n function ($state, $scope) {\r\n if (utilli.goesToDefaultPage($state)) return;\r\n\r\n var language = localStorage.getItem('language');\r\n var languageParams = _.find(utilli.languages[DeploymentSettings.providersGroupShortName.toLowerCase()], function (x) { return language === x.abbreviation });\r\n if (!languageParams)\r\n $scope.currentLanguage = 'English';\r\n else\r\n $scope.currentLanguage = languageParams.name;\r\n\r\n $scope.goToLanguages = function () {\r\n $state.go('TopMenuLayout.Languages');\r\n }\r\n\r\n $scope.goToSignIn = function () {\r\n $state.goToSignIn();\r\n }\r\n\r\n $scope.goToSignUp = function () {\r\n $state.goToSignUp();\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.factory('SignInService', ['$http', '$rootScope', '$q', 'usSpinnerService', '$state', 'DueReminderService',\r\n 'NotificationBoxService',\r\n function ($http, $rootScope, $q, usSpinnerService, $state, DueReminderService, NotificationBoxService) {\r\n var svc = {};\r\n svc.services = [];\r\n svc.errors = {};\r\n svc.showResentVerificationEmailField = false;\r\n\r\n var clientEnum = {\r\n mobileApp: 1,\r\n portal: 2\r\n };\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 }\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 svc.signIn = function (login, passwd, apiUrl, serviceProviderName, fromAddress) {\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 };\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.serverErrors = response.ERROR_LIST;\r\n svc.errors.showServerErrors = true;\r\n if (response.ERROR_LIST[0].Message != null && response.ERROR_LIST[0].Message.indexOf(\"You have not completed the registration process\") != -1) {\r\n svc.showResentVerificationEmailField = true;\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 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 // TODO: may be admin portal url and user portal url should be saved in the config or DeploymentSettings.js\r\n var adminUrl = window.location.origin + window.location.pathname + '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.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 svc.showResentVerificationEmailField = false;\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (e) {\r\n svc.showResentVerificationEmailField = false;\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', ['$scope', '$state', '$http', '$window',\r\n 'usSpinnerService', 'SignInService', '$stateParams', 'CommonHeaderService', 'CheckVersionService', '$q',\r\n function ($scope, $state, $http, $window, usSpinnerService, SignInService, $stateParams, CommonHeaderService,\r\n CheckVersionService, $q) {\r\n var checkVersionPromise = CheckVersionService\r\n .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\r\n var state = '';\r\n var params = null;\r\n if ($state.current.name.indexOf('WelcomeAgent') > 0 || utilli.isPropertyManagerApp()) {\r\n state = 'TopMenuLayout.ForgotPasswordByEmail.Step1';\r\n params = { from: $state.current.name }\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\r\n var state = '';\r\n var params = null;\r\n if ($state.current.name.indexOf('WelcomeAgent') > 0 || utilli.isPropertyManagerApp()) {\r\n state = 'TopMenuLayout.ForgotUserIdByEmail.Step1';\r\n params = { from: $state.current.name }\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);\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 $state.go('NoConnection');\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 providersApiUrl = DeploymentSettings.currentServiceProvider == Config.wglProviderName \r\n ? \"https://apistaging.utilli.com/wgl-providers/api/\"\r\n : 'https://apistaging.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(\"Login name '\" + login.login + \"' is not registered.\");\r\n deferred.reject(\"Login name '\" + login.login + \"' 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 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(\"Login name '\" + $scope.credentials.login + \"' is not registered.\");\r\n usSpinnerService.stop('spinner-1');\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);\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);\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\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 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', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n\r\n // if there is a part of state equals to 'Step2' then we don't need to redirect to Step1. It means that user should continue his \r\n // registration process from Step2 because of Step1 was done by CSR in admin portal.\r\n var toStep2 = $state.get().filter(function (state) { return state.name.indexOf('.SignUp.Step2') >= 0 });\r\n if (!toStep2)\r\n $state.goRelativeTo('SignUp', 'Step1');\r\n\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n }])\r\n.controller('SignUpStep1Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'usSpinnerService', 'ServiceProvidersService', '$stateParams', 'CheckVersionService', '$q',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService, ServiceProvidersService,\r\n $stateParams, CheckVersionService, $q) {\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 var checkVersionPromise = CheckVersionService\r\n .checkVersion();\r\n\r\n $scope.accountMaxLength = Config.contractAccountMaxLength;\r\n\r\n $scope.providers = [];\r\n $scope.provider = {};\r\n $scope.errors = [];\r\n\r\n $scope.init = function () {\r\n if ($stateParams.accountnumber != undefined && $stateParams.zip != undefined && $stateParams.customerfullname != undefined) {\r\n $scope.AccountNumber = $stateParams.accountnumber;\r\n $scope.ZipCode = $stateParams.zip;\r\n $scope.FullName = $stateParams.customerfullname;\r\n }\r\n };\r\n\r\n $scope.isProviderListVisible = !DeploymentSettings.currentServiceProvider;\r\n usSpinnerService.spin(\"spinner-1\");\r\n if ($scope.isProviderListVisible) {\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 $scope.errors.push(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 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 $scope.checkAccountInfoFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n\r\n $moduleServices.hideKeyboard();\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 = checkAccountInfoFormSubmit();\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 $state.goRelativeTo(\r\n 'SignUp',\r\n 'Step2',\r\n {\r\n accountnumber: $.trim($scope.AccountNumber),\r\n zip: $.trim($scope.ZipCode),\r\n customerfullname: $.trim($scope.FullName),\r\n token: $scope.token\r\n });\r\n }\r\n }\r\n else if (CheckVersionService.isVersionWrong(checkVersionResult)) {\r\n $state.go('UpdateApp');\r\n }\r\n else {\r\n $state.go('NoConnection');\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 checkAccountInfoFormSubmit() {\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', 'moduleServices',\r\n 'CommonDataService', 'usSpinnerService', '$stateParams', 'ServiceProvidersService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $state, $moduleServices, CommonDataService, usSpinnerService, $stateParams,\r\n ServiceProvidersService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.errors = [];\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.passRequirements = [{ Value: loadingText }];\r\n $scope.SecurityQuestions = [loadingText];\r\n $scope.SecurityQuestion = loadingText;\r\n\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 = $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 $scope.getPasswdMinLength = function () {\r\n var result = $scope.paswdMinLength ? $scope.paswdMinLength : 1;\r\n return result;\r\n }\r\n\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.errors = [];\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 $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.checkLoginInfoFormSubmit = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\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: $stateParams.accountnumber,\r\n ZipCode: $stateParams.zip,\r\n Token: $stateParams.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 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 $state.goRelativeTo(\r\n 'SignUp',\r\n 'Step3',\r\n {\r\n token: response.Token,\r\n accountnumber: $stateParams.accountnumber,\r\n zip: $stateParams.zip,\r\n customerfullname: $stateParams.customerfullname,\r\n user: $.trim($scope.UserID),\r\n email: $.trim($scope.Email.toLowerCase()),\r\n psw: $scope.Password,\r\n question: $scope.SecurityQuestion,\r\n answer: $scope.SecurityAnswer\r\n });\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.controller('SignUpStep3Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams', 'moduleServices',\r\n 'CommonDataService', 'usSpinnerService', '$sce',\r\n function ($scope, $rootScope, $http, $state, $stateParams, $moduleServices, CommonDataService, usSpinnerService, $sce) {\r\n $scope.errors = [];\r\n\r\n $scope.loadTermsAndConditions = function () {\r\n\r\n usSpinnerService.spin(\"spinner-1\");\r\n\r\n var url = $rootScope.webServicesUrl + 'api/StaticData/GetTermsAndConditions';\r\n\r\n $http({\r\n url: url,\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: $stateParams.accountnumber,\r\n ZipCode: $stateParams.zip,\r\n Fullname: $stateParams.customerfullname,\r\n UserName: $stateParams.user,\r\n Email: $stateParams.email,\r\n Password: $stateParams.psw,\r\n SecurityQuestion1: $stateParams.question,\r\n SecurityAnswer1: $stateParams.answer,\r\n Token: $stateParams.token,\r\n TermsAndConditions: $scope.termsAccepted,\r\n Language: language,\r\n Step: 3\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 }\r\n else {\r\n $state.goRelativeTo('SignUp', 'Success');\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 usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\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',\r\n 'CommonDataService', '$q', 'ServiceProvidersService', 'ModalServiceExt',\r\nfunction ($scope, $timeout, $state, $http, usSpinnerService, CommonDataService, $q, ServiceProvidersService, ModalServiceExt) {\r\n\r\n if (utilli.isAdmin) {\r\n $scope.imagesPath = \"../Images\";\r\n } else {\r\n $scope.imagesPath = \"Images\";\r\n }\r\n\r\n var apiUrl = '';\r\n\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.onlyNumbers = /^\\d+$/;\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n $scope.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 $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 },\r\n function() {\r\n // todo: implement error handling\r\n //$moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\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.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.clearAccountSearch = function () {\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 $scope.clearAddressSearch = function () {\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 $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 (data) {\r\n var jsondata = data;\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 $scope.clearAddressSearch();\r\n $scope.radioSearchType = 'searchByAccount';\r\n };\r\n\r\n $scope.iKnowServiceAddressClick = function () {\r\n $scope.clearAccountSearch();\r\n $scope.radioSearchType = 'searchByAddress';\r\n };\r\n\r\n $scope.selectAccount = function (account) {\r\n $scope.clearPaymentSettings();\r\n $scope.currentAccount = account;\r\n $scope.stepName = 'selectPaymentOption';\r\n\r\n usSpinnerService.spin('spinner-1'); // stop - inside of function getConvFeeInfo\r\n $scope.getConvFeeInfo(account);\r\n\r\n $scope.amountDue = $scope.currentAccount.TotalOpenBallance;\r\n $scope.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 = $scope.formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n }\r\n\r\n $scope.formatTotalAmount();\r\n }\r\n\r\n $scope.clearPaymentSettings = function () {\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 $scope.phone = '';\r\n $scope.email = '';\r\n //$scope.amountDue = '';\r\n }\r\n\r\n $scope.getConvFeeInfo = function (account) {\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 $scope.updateConvinienceFee();\r\n if ($scope.convFeeInfo.Disconnected == $scope._t('Account Disconnected')) {\r\n ModalServiceExt.showMessage($scope._t('Account is disconnected'), $scope._t('Your account is currently disconnected. After making the payment please contact support.'));\r\n }\r\n } else {\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 $scope.updateConvinienceFee = function () {\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 = $scope.formatDecimal($scope.amountDue / 100 * info.FeeAmount);\r\n } else if (info.FeeType == \"flat\") {\r\n $scope.convinienceFee = $scope.formatDecimal(info.FeeAmount);\r\n }\r\n } else if ($scope.stepName == 'payByBankAccount') {\r\n if (info.FeeTypeAch == \"percent\") {\r\n $scope.convinienceFee = $scope.formatDecimal($scope.amountDue / 100 * info.FeeAmountAch);\r\n } else if (info.FeeTypeAch == \"flat\") {\r\n $scope.convinienceFee = $scope.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 = $scope.formatDecimal(parseFloat($scope.amountDue) + parseFloat($scope.convinienceFee));\r\n\r\n }\r\n\r\n $scope.formatDecimal = function (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.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 var requestResult = false;\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 var requestUrl = '';\r\n\r\n if ($scope.quickPayValidationType == 'InvoiceNumber') {\r\n requestParams = { accountNum: $scope.currentAccount.AccountNumber, invoiceNum: $scope.invoiceNumber };\r\n requestUrl = 'api/Payment/IsInvoiceValid';\r\n }\r\n else if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n requestParams = { accountNum: $scope.currentAccount.AccountNumber, businessPartnerNum: $scope.invoiceNumber };;\r\n requestUrl = 'api/Payment/IsBusinessPartnerValid';\r\n }\r\n\r\n $http({\r\n url: apiUrl + requestUrl, //'api/Payment/IsInvoiceValid', //$scope.commomData.CheckInvoiceNumberUrl, //window.OneTimePayments.checkInvoiceNumberUrl,\r\n method: \"GET\",\r\n params: requestParams //{ accountNum: $scope.currentAccount.AccountNumber, invoiceNum: $scope.invoiceNumber }\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 } else {\r\n requestResult = response.Data;\r\n deferred.resolve(response.Data);\r\n }\r\n }).error(function() {\r\n alert($scope._t('Server error. Try again later.'));\r\n deferred.resolve(requestResult);\r\n });\r\n\r\n\r\n return deferred.promise;\r\n }\r\n\r\n $scope.payNowCard = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n if ($scope.payCardAccount_form.cardNumber.$error.ccNumber ||\r\n $scope.payCardAccount_form.amountDue.$error.pattern) {\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n if ($scope.payCardAccount_form.cardNumber.$error.ccNumber\r\n || $scope.payCardAccount_form.amountDue.$error.pattern\r\n || $scope.payCardAccount_form.amountDue.$invalid\r\n || $scope.payCardAccount_form.phone.$invalid\r\n || $scope.payCardAccount_form.email.$invalid\r\n || $scope.payCardAccount_form.cardNumber.$invalid\r\n || $scope.payCardAccount_form.nameOnCard.$invalid\r\n || $scope.payCardAccount_form.cardExpiryMonth.$error.ccExpMonth\r\n || $scope.payCardAccount_form.cardExpiryYear.$error.ccExpYear\r\n || $scope.payCardAccount_form.$error.ccExp\r\n || $scope.payCardAccount_form.cardExpiryMonth.$invalid\r\n || $scope.payCardAccount_form.cardExpiryYear.$invalid\r\n || (!utilli.isAdmin && $scope.payCardAccount_form.invoiceNumber.$invalid)\r\n || $scope.payCardAccount_form.cardNumber.$type == 'JCB'\r\n || $scope.payCardAccount_form.cardNumber.$type == 'American Express'\r\n || $scope.payCardAccount_form.cardNumber.$type == 'Diners Club'\r\n || ($scope.isPaymentInfoAgreeCard == false && $scope.isFeeEnabled)\r\n || (utilli.isAdmin && $scope.proceededWithoutSearch && $scope.selectedCompany.companyCode == \"0\")\r\n\r\n || ($scope.isCreditCardBillingAddressEnabled == 'True' && $scope.payCardAccount_form.billToAddress.$invalid)\r\n || ($scope.isCreditCardBillingAddressEnabled == 'True' && $scope.payCardAccount_form.billToCity.$invalid)\r\n || ($scope.isCreditCardBillingAddressEnabled == 'True' && $scope.payCardAccount_form.billToState.$invalid)\r\n || ($scope.isCreditCardBillingAddressEnabled == 'True' && $scope.payCardAccount_form.billToZip.$invalid)\r\n || ($scope.isCreditCardCvvEnabled && $scope.payCardAccount_form.cardCode.$invalid)\r\n ) {\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n validateInvoiceNumber().then(function (resolve) {\r\n $scope.invoiceNumberError = !resolve;\r\n if ($scope.invoiceNumberError) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showMessage($scope._t('Error'), $scope._t('Invalid Invoice Number.'));\r\n return;\r\n }\r\n\r\n $scope.cardFormSubmitted = false;\r\n $scope.phone = '1' + $('#phone-cc').mask();\r\n //$scope.stepName = 'processingPayment';\r\n\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 cardNumber: $scope.cardNumber,\r\n nameOnCard: $scope.nameOnCard,\r\n expirationDateYear: $scope.cardExpiryYear,\r\n expirationDateMonth: $scope.cardExpiryMonth,\r\n companyCode: 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 };\r\n\r\n if (!utilli.isAdmin) {\r\n paymentObject.invoiceNumber = $scope.invoiceNumber;\r\n paymentObject.PaymentPage = 1;\r\n } else {\r\n paymentObject.invoiceNumber = '0';\r\n paymentObject.PaymentPage = 3;\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 usSpinnerService.stop('spinner-1');\r\n } else {\r\n }\r\n }).error(function (data) {\r\n var jsondata = data;\r\n $scope.paymwntResult = jsondata.Message;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n });\r\n }\r\n\r\n $scope.payNowBankAccount = function () {\r\n\r\n if ($scope.bankCheckingAccountNumber != $scope.bankCheckingAccountNumber2) {\r\n return;\r\n }\r\n\r\n if ($scope.payBankAccount_form.amountDue.$error.pattern) {\r\n return;\r\n }\r\n\r\n if ($scope.payBankAccount_form.amountDue.$error.pattern\r\n || $scope.payBankAccount_form.amountDue.$invalid\r\n || $scope.payBankAccount_form.phone.$invalid\r\n || $scope.payBankAccount_form.email.$invalid\r\n || $scope.payBankAccount_form.checkNameOnAccount.$invalid\r\n || $scope.payBankAccount_form.bankRoutingNumber.$invalid\r\n || $scope.payBankAccount_form.bankCheckingAccountNumber.$invalid\r\n || $scope.payBankAccount_form.bankCheckingAccountNumber2.$invalid\r\n || ($scope.isPaymentInfoAgreeBank == false && $scope.isFeeEnabled)\r\n || (utilli.isAdmin && $scope.proceededWithoutSearch && $scope.payCardAccount_form.selectedCompanyOption.$invalid)\r\n || ($scope.payBankAccount_form.bankRoutingNumber == $scope.payBankAccount_form.bankCheckingAccountNumber)\r\n ) {\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n validateRoutingNumber().then(function (resolve) {\r\n $scope.routNumError = !resolve;\r\n if ($scope.routNumError){\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n bankAccountPay();\r\n });\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 $scope.phone = '1' + $('#phone-ba').mask();\r\n usSpinnerService.spin('spinner-1');\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\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 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 $scope.paymentOk = function () {\r\n $scope.clear();\r\n $scope.stepName = 'find';\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.phone = getMaskedPhoneNumberValue($scope.phone);\r\n\r\n $scope.proceedToRegistration = function () {\r\n //$rootScope.RegisterAccountNumber = $scope.currentAccount.AccountNumber;\r\n //$rootScope.RegisterCustomerFullName = $scope.currentAccount.CustomerFullName;\r\n //$rootScope.RegisterZip = $scope.currentAccount.Zip.substring(0, 5);\r\n //$scope.clear(); \r\n ////$state.go(\"SignUpStep1\");\r\n //$state.goTopMenuLayout('SignUp');\r\n\r\n $state.go('TopMenuLayout.SignUp', { accountnumber: $scope.currentAccount.AccountNumber, customerfullname: $scope.currentAccount.CustomerFullName, zip: $scope.currentAccount.Zip.substring(0, 5) });\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.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 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.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\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.Step2');\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('ForgotPasswordByEmailStep2Controller', ['$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\r\n $scope.securityQuestion = $scope.model.securityQuestion;\r\n $scope.checkSecurityAnswer = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmSecurityAnswer.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n \r\n usSpinnerService.spin('spinner-1');\r\n $scope.model.securityAnswer = $.trim($scope.securityAnswer);\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $http({\r\n url: $scope.model.provider.ApiUrl + 'api/Account/CheckForgotPasswordStep2/',\r\n method: \"GET\",\r\n params: {\r\n userNameOrEmail: $scope.model.userId,\r\n securityAnswer: $scope.model.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('TopMenuLayout.ForgotPasswordByEmail.Success');\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\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\r\n $state.goToWelcome();\r\n }\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('ForgotUserIdByEmailController', ['$scope', '$rootScope', '$window', '$state', '$stateParams', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, $stateParams, 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\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\r\n $state.goToWelcome();\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('SendInvitationController', ['$scope', '$state', '$rootScope', '$window', '$http', '$sce', '$timeout', 'LeftMenuService',\r\n '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ModalServiceExt', 'PropertyListService',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $state, $rootScope, $window, $http, $sce, $timeout, LeftMenuService, $stateParams, CommonHeaderService, usSpinnerService,\r\n ModalServiceExt, PropertyListService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.show();\r\n CommonHeaderService.setUpBackButton($scope._t('New Invitation'));\r\n\r\n $scope.emailPattern = Config.emailPattern;\r\n\r\n getStaticData();\r\n $scope.userMessage = \"loading...\";\r\n\r\n $scope.recipients = [];\r\n loadData();\r\n\r\n $scope.addresses = {\r\n availableOptions: [],\r\n selectedOption: { id: '0', name: _t('loading...')}\r\n };\r\n\r\n $scope.addRecipient = function () {\r\n var ticks = new Date().getTime();\r\n $scope.recipients.push({\r\n id: ticks,\r\n email: '',\r\n name: ''\r\n });\r\n }\r\n\r\n $scope.addRecipient();\r\n\r\n $scope.removeRecipient = function (recipient) {\r\n if ($scope.recipients.length === 1) {\r\n ModalServiceExt.showMessage(_t('Error'), _t('Each invitation should have at least one recipient.'));\r\n return;\r\n }\r\n var index = $scope.recipients.findIndex(function (e) { return e.id === recipient.id });\r\n $scope.recipients.splice(index, 1);\r\n }\r\n\r\n $scope.send = function () {\r\n $scope.submitted = true;\r\n if ($scope.form.$invalid || $scope.addresses.selectedOption.id == null)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AddInvitation/',\r\n method: \"POST\",\r\n data: {\r\n recipient: 'Recipient',\r\n propertyId: $scope.addresses.selectedOption.id,\r\n recipients: $scope.recipients\r\n },\r\n params: { userName: $state.params.userId }\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n ModalServiceExt.showInfo(_t('Your invitation has been successfully sent.'), function () {\r\n if ($stateParams.propertyId)\r\n $state.goMainLayout('PropertyList');\r\n else\r\n $window.history.back();\r\n })\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n }\r\n\r\n function loadData() {\r\n usSpinnerService.spin('spinner-1');\r\n var params = {};\r\n utilli.addUserName($state, params);\r\n PropertyListService.getPropertyList().success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n $scope.addresses.availableOptions.push({ id: null, name: ''});\r\n\r\n _.each(response.Data, function (item) {\r\n $scope.addresses.availableOptions.push({\r\n id: item.Id,\r\n name: item.Name\r\n });\r\n });\r\n $scope.addresses.selectedOption = $scope.addresses.availableOptions[0]\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function getStaticData() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetInvitationText/',\r\n method: 'GET',\r\n params: { recipientId: '' }\r\n }).success(function(response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n $scope.userMessage = response.Data;\r\n });\r\n usSpinnerService.stop('spinner-1');\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}]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('SendDataSharingInvitationController', ['$scope', '$state', '$rootScope', '$window', '$http',\r\n '$timeout', 'LeftMenuService', '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ModalServiceExt',\r\n 'ServiceProvidersService', 'PropertyDataService', 'SharedMetersCacheService', '$q', 'PropertyService',\r\n// ReSharper disable InconsistentNaming\r\n function ($scope, $state, $rootScope, $window, $http, $timeout, LeftMenuService, $stateParams,\r\n CommonHeaderService, usSpinnerService, ModalServiceExt, ServiceProvidersService, PropertyDataService,\r\n SharedMetersCacheService, $q, PropertyService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.show();\r\n CommonHeaderService.setUpBackButton($scope._t('Send Invitation'));\r\n\r\n $scope.provider = {};\r\n $scope.Meters = [];\r\n $scope.userMessage = _t(\"loading...\");\r\n\r\n $scope.meterIsUsedErrorCode = 8;\r\n\r\n $scope.addMeter = function () {\r\n var ticks = new Date().getTime();\r\n $scope.Meters.push({\r\n Id: 0,\r\n clientUtilliId: ticks,\r\n Number: ''\r\n });\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.provider = providerData;\r\n getStaticData();\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n var invitationData = utilli.getPayload($stateParams.token);\r\n $scope.name = invitationData.Name;\r\n\r\n $scope.deleteMeter = function (clientUtilliId) {\r\n var meters = $scope.Meters;\r\n var meter = _.find(meters, function(mtr) { return mtr.clientUtilliId === clientUtilliId });\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('Unauthorize meter'),\r\n _t('Are you sure you want to cancel authorization for this meter?'),\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: \"POST\",\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/UnauthorizeMeter/',\r\n data: { MeterId: meter.Id, InvitationToken: $stateParams.token }\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 }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n });\r\n }\r\n\r\n $scope.getErrorInfo = function (meter) {\r\n var targetState = '';\r\n if (meter.ErrorCode === 1) {\r\n targetState = 'TopMenuLayout.MeterDoesNotExist';\r\n } else if (meter.ErrorCode === 2) {\r\n targetState = 'TopMenuLayout.MeterDuplicated';\r\n } else if (meter.ErrorCode === 3) {\r\n targetState = 'TopMenuLayout.ServiceAddressMismatches';\r\n } else if (meter.ErrorCode === 7) {\r\n targetState = 'TopMenuLayout.MultipleTiedMeters';\r\n }\r\n\r\n if (!targetState) {\r\n console.log('Uknown meter validation error: ' + meter.Error);\r\n return;\r\n }\r\n\r\n $state.go(targetState, { meterId: meter.Id, token: $stateParams.token });\r\n SharedMetersCacheService.setMeters($scope.Meters);\r\n }\r\n\r\n $scope.accept = function () {\r\n $scope.submitted = true;\r\n if ($scope.form.$invalid)\r\n return;\r\n if ($scope.Meters.length === 0) {\r\n ModalServiceExt.showError(_t('No meters added.'));\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n SharedMetersCacheService.clear();\r\n $http({\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/AcceptInvitation/',\r\n method: \"POST\",\r\n data: {\r\n token: $stateParams.token,\r\n meters: $scope.Meters,\r\n comments: $scope.comments\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n var failedMeter = _.find(response.Data.Meters, function (meter) { return meter.ErrorCode !== 0 && meter.ErrorCode != $scope.meterIsUsedErrorCode; });\r\n $scope.Meters = response.Data.Meters;\r\n $scope.Meters.forEach(function (v) { v.clientUtilliId = v.Id; });\r\n // if no failed meters then end\r\n if (response.Data.Meters.length > 0 && !failedMeter) {\r\n ModalServiceExt.showInfo(_t('Your approval has been successfully received.'),\r\n function () { $state.goToPropertyManagersWelcome(); });\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 $scope.decline = function () {\r\n usSpinnerService.spin('spinner-1');\r\n SharedMetersCacheService.clear();\r\n $http({\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/DeclineInvitation/',\r\n method: \"POST\",\r\n data: {\r\n token: $stateParams.token,\r\n InvitationRecipientId: invitationData.RecipientId,\r\n Meters: $scope.Meters,\r\n Comments: $scope.comments\r\n }\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n ModalServiceExt.showInfo(_t('Your invitation has successfully declined.'),\r\n function () { $state.goToPropertyManagersWelcome(); });\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function getStaticData() {\r\n usSpinnerService.spin('spinner-1');\r\n var getInvitationText = $http({\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/GetInvitationText/',\r\n method: 'GET',\r\n params: {\r\n recipientId: invitationData.RecipientId\r\n }\r\n });\r\n var getMeters = $http({\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/GetRecipientMeters/',\r\n method: 'GET',\r\n params: {\r\n invitationToken: $stateParams.token\r\n }\r\n });\r\n $q.all([getInvitationText, getMeters]).then(function (responses) {\r\n usSpinnerService.stop('spinner-1');\r\n var invitationTextResponse = responses[0].data;\r\n var metersResponse = responses[1].data;\r\n utilli.handleAjaxResponse(invitationTextResponse, ModalServiceExt,\r\n function () {\r\n $scope.userMessage = invitationTextResponse.Data;\r\n });\r\n utilli.handleAjaxResponse(metersResponse, ModalServiceExt,\r\n function () {\r\n $scope.Meters = metersResponse.Data.Meters;\r\n $scope.Meters.forEach(function (v) { v.clientUtilliId = v.Id; });\r\n if ($scope.Meters.length === 0) {\r\n $scope.addMeter();\r\n }\r\n });\r\n }, 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 .factory('SharedMetersCacheService', function () {\r\n var savedMeters = null;\r\n var setMeters = function (meters) {\r\n savedMeters = meters;\r\n }\r\n\r\n var getMeters = function () {\r\n return savedMeters;\r\n }\r\n\r\n var clear = function () {\r\n savedMeters = null;\r\n }\r\n\r\n var deleteMeter = function (meterId) {\r\n if (!savedMeters)\r\n return;\r\n savedMeters = _.reject(savedMeters, function (meter) { return meter.Id == meterId; });\r\n if (savedMeters.length === 0)\r\n savedMeters = null;\r\n }\r\n \r\n return {\r\n setMeters: setMeters,\r\n getMeters: getMeters,\r\n clear: clear,\r\n deleteMeter: deleteMeter\r\n }\r\n });\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('RequestMeterSharingRevokeController', ['$scope', '$state', '$rootScope', '$window', '$http', '$timeout', 'LeftMenuService',\r\n '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ModalServiceExt', 'ServiceProvidersService',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $state, $rootScope, $window, $http, $timeout, LeftMenuService, $stateParams, CommonHeaderService, usSpinnerService,\r\n ModalServiceExt, ServiceProvidersService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.meter = '';\r\n $scope.provider = {};\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider(Config.wglProviderName)\r\n .then(\r\n function(providerData){\r\n $scope.provider = providerData;\r\n usSpinnerService.stop('spinner-1');\r\n },\r\n function () {\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n );\r\n\r\n CommonHeaderService.setUpBackButton($scope._t('Revoke Access'), true);\r\n\r\n $scope.cancel = function () {\r\n $state.goToPropertyManagersWelcome();\r\n }\r\n\r\n $scope.submit = function () {\r\n $scope.submitted = true;\r\n if($scope.form.$invalid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/RequestMeterSharingRevoke/',\r\n method: \"POST\",\r\n data: {\r\n MeterNumber: $scope.meter,\r\n Email: $scope.email,\r\n Comments: $scope.comments\r\n }\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (response.Data) {\r\n ModalServiceExt.showError(response.Data);\r\n } else {\r\n ModalServiceExt.showInfo(_t('Your request is successfully accepted. '\r\n + 'Please check your email inbox for the link to continue.'),\r\n function () {\r\n var isAuthUser = !!localStorage.getItem('SecurityToken');\r\n if (isAuthUser)\r\n $state.goMainLayout('Authorizations');\r\n else\r\n $state.goToPropertyManagersWelcome();\r\n });\r\n }\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('RevokeMeterSharingController', ['$scope', '$state', '$rootScope', '$window', '$http', '$timeout', 'LeftMenuService',\r\n '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ModalServiceExt', 'ServiceProvidersService',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $state, $rootScope, $window, $http, $timeout, LeftMenuService, $stateParams, CommonHeaderService, usSpinnerService,\r\n ModalServiceExt, ServiceProvidersService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.provider = {};\r\n $scope.Meters = [];\r\n\r\n var invitationData = utilli.getPayload($stateParams.token);\r\n $scope.name = invitationData.Name;\r\n $scope.recipientId = invitationData.RecipientId;\r\n\r\n CommonHeaderService.setUpBackButton($scope._t('Withdraw Authorization'));\r\n\r\n $scope.removeMeter = function (meter) {\r\n if ($scope.Meters.length === 1) {\r\n ModalServiceExt.showMessage(_t('Error'), _t('The invitation should have at least one meter.'));\r\n return;\r\n }\r\n var index = $scope.Meters.findIndex(function (e) { return e.Id === meter.Id });\r\n $scope.Meters.splice(index, 1);\r\n }\r\n\r\n $scope.revoke = function () {\r\n $scope.submitted = true;\r\n if ($scope.form.$invalid)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/RevokeMeters/',\r\n method: \"POST\",\r\n data: {\r\n token: $stateParams.token,\r\n InvitationRecipientId: invitationData.RecipientId,\r\n meters: $scope.Meters,\r\n comments: $scope.comments\r\n }\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (response.Data.Meters.length > 0) {\r\n $scope.Meters.forEach(function(m) {\r\n m.Error = null;\r\n });\r\n response.Data.Meters.forEach(function (v) {\r\n var meter = $scope.Meters.find(function (m) {\r\n return m.Id == v.Id;\r\n });\r\n meter.Error = v.Error;\r\n });\r\n } else {\r\n exit(_t(\"Your request has been successfully accepted.\"));\r\n }\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\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 getStaticData();\r\n },\r\n function () {\r\n ModalServiceExt.showError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n );\r\n\r\n function exit(message) {\r\n ModalServiceExt.showInfo(message,\r\n function () {\r\n var isAuthUser = !!localStorage.getItem('SecurityToken');\r\n if (isAuthUser)\r\n $state.goMainLayout('Authorizations');\r\n else\r\n $state.goToPropertyManagersWelcome();\r\n });\r\n }\r\n\r\n function getStaticData() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: $scope.provider.ApiUrl + 'api/PropertyManagers/GetRecipientMeters/',\r\n method: 'GET',\r\n params: { invitationToken : $stateParams.token }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n if (response.Data.Meters.length > 0) {\r\n $scope.Meters = [];\r\n response.Data.Meters.forEach(function(v) {\r\n $scope.Meters.push({\r\n Id: v.Id,\r\n MeterNumber: v.MeterNumber\r\n });\r\n });\r\n } else {\r\n exit(_t(\"You don't have shared meters. There is nothing to revoke.\"));\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}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('PropertyManagerEnergyEfficiencyController', ['$scope', '$rootScope', '$window', '$http', '$sce', '$timeout',\r\n 'LeftMenuService', '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ModalService', 'ModalServiceExt',\r\n 'DefaultPropertyService', '$state',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $rootScope, $window, $http, $sce, $timeout, LeftMenuService, $stateParams, CommonHeaderService, usSpinnerService, \r\n ModalService, ModalServiceExt, DefaultPropertyService, $state) {\r\n var _t = $scope._t;\r\n// ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('EnergyEfficiency');\r\n CommonHeaderService.setUpBackButton($scope._t('Energy Insights'));\r\n\r\n $scope.radioGraphType = 'last12Monthes'; //'calendarYear';\r\n $scope.radioGraphTypeConsumption = 'absolute'; \r\n\r\n usSpinnerService.spin('spinner-1');\r\n DefaultPropertyService.getAggregation($state.params.userId).then(function(aggregation) {\r\n $scope.noData = false;\r\n $scope.noMeters = false;\r\n if (aggregation == null) {\r\n $scope.noData = true;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n \r\n $scope.AggregationName = aggregation.Type === utilli.aggregationTypes.property \r\n ? _t('Address') \r\n : _t('Group Name');\r\n $scope.AggregationValue = aggregation.Name;\r\n\r\n if (aggregation.MetersCount === 0) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.noMeters = true;\r\n $scope.noMetersMessage = _t(\"Your property\") + ' \\'' + aggregation.Name + '\\' ' + _t(\"does not have meters.\");\r\n return;\r\n }\r\n \r\n $scope.meters = [''];\r\n $scope.currentMeter = '';\r\n\r\n getMeterDataGraph();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n function getMeterDataGraph () {\r\n usSpinnerService.spin('spinner-1');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var groupId = utilli.getCurrentGroupId();\r\n var propertyId = utilli.getCurrentPropertyId();\r\n $http({\r\n url: apiUrl + 'api/Consumption/GetMeterInfoByGroupId/',\r\n method: \"GET\",\r\n params: { groupId: groupId, propertyId: propertyId }\r\n }).success(function (jsonData) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(jsonData,\r\n ModalServiceExt,\r\n function () {\r\n $scope.meters = _.map(jsonData.Data, function (item) {\r\n return { id: item, value: item };\r\n });\r\n $scope.meters.unshift({ id: '', value: _t('All Meters') });\r\n $scope.initTables($scope.currentMeter, $scope.radioGraphType, $scope.radioGraphTypeConsumption);\r\n });\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n };\r\n\r\n $scope.selectMeter = function () {\r\n $scope.initTables($scope.currentMeter, $scope.radioGraphType, $scope.radioGraphTypeConsumption);\r\n }\r\n\r\n $scope.data = null;\r\n\r\n $scope.createChartFullYear = function (data) {\r\n if (!data.YearOverYearFullUsageData)\r\n return;\r\n var title = data.YearOverYearFullUsageData.EfficiencyInfo;\r\n $scope.title = title;\r\n var labelRotation = -90; // 90 degrees to the left to make labels vertical\r\n $(\"#comparChartFullYear\").kendoChart({\r\n title: {\r\n //text: title,\r\n },\r\n legend: {\r\n position: \"bottom\",\r\n visible: true,\r\n labels: {\r\n font: \"10px Arial, Helvetica, sans-serif\"\r\n }\r\n },\r\n seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#c4c4c4\", \"#0069a5\"],\r\n series: [\r\n {\r\n axis: \"Usage\",\r\n name: $scope._t(\"Cons. in\") + \" \" + data.YearOverYearFullUsageData.PreviousYear,\r\n data: data.YearOverYearFullUsageData.PreviousYearConsumptions,\r\n tooltip: {\r\n visible: true,\r\n color: \"white\",\r\n format: \"{0} \" + data.YearOverYearFullUsageData.ConsumptionUnit\r\n }\r\n },\r\n {\r\n axis: \"Usage\",\r\n name: $scope._t(\"Cons. in\") + \" \" + data.YearOverYearFullUsageData.ThisYear,\r\n data: data.YearOverYearFullUsageData.ThisYearConsumptions,\r\n tooltip: {\r\n visible: true,\r\n color: \"white\",\r\n format: \"{0} \" + data.YearOverYearFullUsageData.ConsumptionUnit\r\n }\r\n },\r\n {\r\n axis: \"Temperature\",\r\n type: \"line\",\r\n name: $scope._t(\"Avrg. Tem. in\") + \" \" + data.YearOverYearFullUsageData.PreviousYear,\r\n data: data.YearOverYearFullUsageData.PreviousYearMonthlyAverageTemperatures,\r\n visibleInLegend: true,\r\n tooltip: {\r\n visible: true,\r\n format: \"{0} F\",\r\n color: \"white\"\r\n }\r\n },\r\n {\r\n axis: \"Temperature\",\r\n type: \"line\",\r\n name: $scope._t(\"Avrg. Temp. in\") + \" \" + data.YearOverYearFullUsageData.ThisYear,\r\n \r\n data: data.YearOverYearFullUsageData.ThisYearMonthlyAverageTemperatures,\r\n visibleInLegend: true,\r\n tooltip: {\r\n visible: true,\r\n format: \"{0} F\",\r\n color: \"white\"\r\n }\r\n }\r\n ],\r\n valueAxis: [\r\n {\r\n name: \"Usage\",\r\n line: {\r\n visible: true\r\n },\r\n minorGridLines: {\r\n visible: true\r\n },\r\n labels: {\r\n rotation: \"auto\"\r\n }\r\n },\r\n {\r\n name: \"Temperature\",\r\n labels: {\r\n format: \"{0} F\"\r\n }\r\n }\r\n ],\r\n categoryAxis: {\r\n categories: data.YearOverYearFullUsageData.PeriodNames,\r\n axisCrossingValues: [0, 12],\r\n majorGridLines: {\r\n visible: false\r\n },\r\n labels: {\r\n rotation: labelRotation\r\n }\r\n }\r\n });\r\n\r\n // HACK: enable scrolling on Windows Phone when swiping over the chart\r\n //chartElement.css(\"-ms-touch-action\", \"auto\");\r\n };\r\n\r\n $scope.createChartTable1 = function (data) {\r\n if (!data.SameYearDifference)\r\n return;\r\n var title = data.SameYearDifference.ConsumptionPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n\r\n $(\"#comparChartTable1\").kendoChart({\r\n title: {\r\n text: $scope._t(\"Consumption\") + \": \" + title + \"%\"\r\n },\r\n chartArea: {\r\n height: 200\r\n },\r\n legend: {\r\n visible: false\r\n },\r\n seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#0069a5\", \"#0098ee\"],\r\n series: [{\r\n name: \"Consumption\",\r\n data: [data.SameYearOldPeriod.Consumption, data.SameYearNewPeriod.Consumption]\r\n }\r\n ],\r\n valueAxis: {\r\n max: Math.max(data.SameYearOldPeriod.Consumption, data.SameYearNewPeriod.Consumption) * 1.1,\r\n min: 0,\r\n line: {\r\n visible: true\r\n },\r\n minorGridLines: {\r\n visible: true\r\n },\r\n labels: {\r\n rotation: \"auto\"\r\n }\r\n },\r\n categoryAxis: {\r\n categories: [data.SameYearOldPeriod.PeriodName, data.SameYearNewPeriod.PeriodName],\r\n majorGridLines: {\r\n visible: false\r\n }\r\n },\r\n tooltip: {\r\n visible: true,\r\n template: \"#= series.name #: #= value #\"\r\n }\r\n });\r\n\r\n\r\n // HACK: enable scrolling on Windows Phone when swiping over the chart\r\n //chartElement.css(\"-ms-touch-action\", \"auto\");\r\n };\r\n\r\n $scope.createChartTable2 = function (data) {\r\n if (!data.SameYearDifference)\r\n return;\r\n var title = data.SameYearDifference.BillAmountPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n $(\"#comparChartTable2\").kendoChart({\r\n title: {\r\n text: $scope._t(\"Bill Amount\") + \": \" + title + \"%\"\r\n },\r\n chartArea: {\r\n height: 200\r\n },\r\n legend: {\r\n visible: false\r\n },\r\n seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#0069a5\", \"#0098ee\"],\r\n series: [{\r\n name: $scope._t(\"Bill Amount\") + \":\",\r\n data: [data.SameYearOldPeriod.BillAmount, data.SameYearNewPeriod.BillAmount]\r\n }\r\n ],\r\n valueAxis: {\r\n max: Math.max(data.SameYearOldPeriod.BillAmount, data.SameYearNewPeriod.BillAmount) * 1.1,\r\n min: 0,\r\n line: {\r\n visible: true\r\n },\r\n minorGridLines: {\r\n visible: true\r\n },\r\n labels: {\r\n rotation: \"auto\"\r\n }\r\n },\r\n categoryAxis: {\r\n categories: [data.SameYearOldPeriod.PeriodName, data.SameYearNewPeriod.PeriodName],\r\n majorGridLines: {\r\n visible: false\r\n }\r\n },\r\n tooltip: {\r\n visible: true,\r\n template: \"#= series.name # $#= value #\"\r\n }\r\n });\r\n };\r\n\r\n $scope.createChartTable3 = function (data) {\r\n if (!data.SameYearDifference)\r\n return;\r\n var title = data.SameYearDifference.EnergyCostGcrPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n $(\"#comparChartTable3\").kendoChart({\r\n title: {\r\n text: $scope._t(\"Energy Cost\") + \": \" + title + \"%\"\r\n },\r\n chartArea: {\r\n height: 200\r\n },\r\n legend: {\r\n visible: false\r\n },\r\n seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#0069a5\", \"#0098ee\"],\r\n series: [{\r\n name: \"Energy Cost:\",\r\n data: [data.SameYearOldPeriod.EnergyCostGcr, data.SameYearNewPeriod.EnergyCostGcr]\r\n }\r\n ],\r\n valueAxis: {\r\n max: Math.max(data.SameYearOldPeriod.EnergyCostGcr, data.SameYearNewPeriod.EnergyCostGcr) * 1.1,\r\n min: 0,\r\n line: {\r\n visible: true\r\n },\r\n minorGridLines: {\r\n visible: true\r\n },\r\n labels: {\r\n rotation: \"auto\"\r\n }\r\n },\r\n categoryAxis: {\r\n categories: [data.SameYearOldPeriod.PeriodName, data.SameYearNewPeriod.PeriodName],\r\n majorGridLines: {\r\n visible: false\r\n }\r\n },\r\n tooltip: {\r\n visible: true,\r\n template: \"#= series.name # $#= value #\"\r\n }\r\n });\r\n };\r\n\r\n $scope.createChartTable4 = function (data) {\r\n if (!data.YearOverYearDifference)\r\n return;\r\n var title = data.YearOverYearDifference.ConsumptionPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n $(\"#comparChartTable4\").kendoChart({\r\n title: {\r\n text: $scope._t(\"Consumption\") + \": \" + title + \"%\"\r\n },\r\n chartArea: {\r\n height: 200\r\n },\r\n legend: {\r\n visible: false\r\n },\r\n seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#0069a5\", \"#0098ee\"],\r\n series: [{\r\n name: \"Consumption\",\r\n data: [data.YearOverYearOldPeriod.Consumption, data.YearOverYearNewPeriod.Consumption]\r\n }\r\n ],\r\n valueAxis: {\r\n max: Math.max(data.YearOverYearOldPeriod.Consumption, data.YearOverYearNewPeriod.Consumption) * 1.1,\r\n min: 0,\r\n line: {\r\n visible: true\r\n },\r\n minorGridLines: {\r\n visible: true\r\n },\r\n labels: {\r\n rotation: \"auto\"\r\n }\r\n },\r\n categoryAxis: {\r\n categories: [data.YearOverYearOldPeriod.PeriodName, data.YearOverYearNewPeriod.PeriodName],\r\n majorGridLines: {\r\n visible: false\r\n }\r\n },\r\n tooltip: {\r\n visible: true,\r\n template: \"#= series.name #: #= value #\"\r\n }\r\n });\r\n };\r\n\r\n $scope.createChartTable5 = function (data) {\r\n if (!data.YearOverYearDifference)\r\n return;\r\n var title = data.YearOverYearDifference.BillAmountPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n $(\"#comparChartTable5\").kendoChart({\r\n title: {\r\n text: $scope._t(\"Bill Amount\") + \": \" + title + \"%\"\r\n },\r\n chartArea: {\r\n height: 200\r\n },\r\n legend: {\r\n visible: false\r\n },\r\n seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#0069a5\", \"#0098ee\"],\r\n series: [{\r\n name: $scope._t(\"Bill Amount\") + \":\",\r\n data: [data.YearOverYearOldPeriod.BillAmount, data.YearOverYearNewPeriod.BillAmount]\r\n }\r\n ],\r\n valueAxis: {\r\n max: Math.max(data.YearOverYearOldPeriod.BillAmount, data.YearOverYearNewPeriod.BillAmount) * 1.1,\r\n min: 0,\r\n line: {\r\n visible: true\r\n },\r\n minorGridLines: {\r\n visible: true\r\n },\r\n labels: {\r\n rotation: \"auto\"\r\n }\r\n },\r\n categoryAxis: {\r\n categories: [data.YearOverYearOldPeriod.PeriodName, data.YearOverYearNewPeriod.PeriodName],\r\n majorGridLines: {\r\n visible: false\r\n }\r\n },\r\n tooltip: {\r\n visible: true,\r\n template: \"#= series.name # $#= value #\"\r\n }\r\n });\r\n };\r\n\r\n $scope.createChartTable6 = function (data) {\r\n if (!data.YearOverYearDifference)\r\n return;\r\n var title = data.YearOverYearDifference.EnergyCostGcrPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n $(\"#comparChartTable6\").kendoChart({\r\n title: {\r\n text: $scope._t(\"Energy Cost\") + \": \" + title + \"%\"\r\n },\r\n chartArea: {\r\n height: 200\r\n },\r\n legend: {\r\n visible: false\r\n },\r\n seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#0069a5\", \"#0098ee\"],\r\n series: [{\r\n name: \"Energy Cost:\",\r\n data: [data.YearOverYearOldPeriod.EnergyCostGcr, data.YearOverYearNewPeriod.EnergyCostGcr]\r\n }\r\n ],\r\n valueAxis: {\r\n max: Math.max(data.YearOverYearOldPeriod.EnergyCostGcr, data.YearOverYearNewPeriod.EnergyCostGcr) * 1.1,\r\n min: 0,\r\n line: {\r\n visible: true\r\n },\r\n minorGridLines: {\r\n visible: true\r\n },\r\n labels: {\r\n rotation: \"auto\"\r\n }\r\n },\r\n categoryAxis: {\r\n categories: [data.YearOverYearOldPeriod.PeriodName, data.YearOverYearNewPeriod.PeriodName],\r\n majorGridLines: {\r\n visible: false\r\n }\r\n },\r\n tooltip: {\r\n visible: true,\r\n template: \"#= series.name # $#= value #\"\r\n }\r\n });\r\n };\r\n\r\n $scope.createAllCharts = function (data) {\r\n $scope.createChartFullYear(data);\r\n $scope.createChartTable1(data);\r\n $scope.createChartTable2(data);\r\n $scope.createChartTable3(data);\r\n $scope.createChartTable4(data);\r\n $scope.createChartTable5(data);\r\n $scope.createChartTable6(data);\r\n }\r\n\r\n $scope.changeGraphType = function () {\r\n $scope.initTables($scope.currentMeter, $scope.radioGraphType, $scope.radioGraphTypeConsumption);\r\n }\r\n\r\n $scope.changeGraphTypeConsumption = function () {\r\n $scope.initTables($scope.currentMeter, $scope.radioGraphType, $scope.radioGraphTypeConsumption);\r\n }\r\n\r\n $scope.initTables = function (currentMeter, graphType, graphTypeConsumption) {\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var groupId = utilli.getCurrentGroupId();\r\n var propertyId = utilli.getCurrentPropertyId();\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/Consumption/GetPropertyEnergyEfficiency/',\r\n method: \"GET\",\r\n params: {\r\n groupId: groupId,\r\n propertyId: propertyId,\r\n meterNum: currentMeter,\r\n graphType: graphType,\r\n consumptionType: graphTypeConsumption,\r\n userName: $state.params.userId\r\n }\r\n }).success(function (json) {\r\n if (json) {\r\n if (json.Errors && json.Errors.length > 0) {\r\n ModalServiceExt.showError(json.Errors[0]);\r\n }\r\n else {\r\n $scope.data = json.Data;\r\n $scope.createAllCharts($scope.data);\r\n $(window).bind('resize', function () {\r\n $scope.createAllCharts($scope.data);\r\n });\r\n }\r\n } else {\r\n ModalServiceExt.showError($scope._t(\"Error occurred during getting of consumptions.\"));\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('EditPropertyController', ['$scope', '$http', 'usSpinnerService', 'LeftMenuService', '$state', \r\n '$stateParams', 'CommonHeaderService', 'PropertyDataService', 'PropertySettingsService', 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, LeftMenuService, $state, $stateParams, CommonHeaderService,\r\n PropertyDataService, PropertySettingsService, ModalServiceExt) {\r\n\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('MyProperties');\r\n CommonHeaderService.setUp(_t('Edit Property'));\r\n\r\n $scope.NeedMetersApproval = false;\r\n\r\n $scope.propertyTypes = [];\r\n\r\n $scope.totalNumberOfMeters = '';\r\n $scope.numberOfErrors = '';\r\n\r\n PropertyDataService.getProperty($stateParams.id, function (property) {\r\n $scope.authorized = property.Authorized;\r\n $scope.propertyName = property.PropertyName;\r\n\r\n $scope.delegatingUser = property.DelegatingUser;\r\n $scope.delegatingUserPhone = property.DelegatingUserPhone;\r\n $scope.delegatingUserEmail = property.DelegatingUserEmail;\r\n\r\n $scope.propertyPrimaryFunctionName = PropertySettingsService.primaryPropertyFunctions[property.PrimaryPropertyFunction];\r\n\r\n $scope.address = property.Address1;\r\n if (property.Address2 != null && property.Address2 != '')\r\n $scope.address += ' ' + property.Address2;\r\n\r\n $scope.NeedMetersApproval = property.NeedMetersApproval;\r\n\r\n $scope.address += ' ' + property.City;\r\n $scope.address += ' ' + property.State;\r\n $scope.address += ' ' + property.Zip;\r\n\r\n $scope.address1 = property.Address1;\r\n $scope.address2 = property.Address2;\r\n $scope.city = property.City;\r\n $scope.state = property.State;\r\n $scope.postalCode = property.Zip;\r\n $scope.grossFloorArea = property.GrossFloorArea;\r\n $scope.grossFloorAreaUnits = property.GrossFloorAreaUnits.toString();\r\n $scope.yearBuilt = property.YearBuilt;\r\n $scope.irrigatedArea = property.IrrigatedArea;\r\n $scope.irrigatedAreaUnits = property.IrrigatedAreaUnits.toString();\r\n $scope.occupancy = property.Occupancy.toString() + \"%\";\r\n $scope.numberOfBuildings = property.NumberOfUnits;\r\n $scope.numberOfMeters = property.NumberOfMeters;\r\n $scope.numberOfErrors = property.NumberOfErrors;\r\n\r\n if ($scope.grossFloorAreaUnits == 0) {\r\n $scope.grossFloorAreaUnits = 'Sq.Ft.';\r\n }\r\n if ($scope.grossFloorAreaUnits == 1) {\r\n $scope.grossFloorAreaUnits = 'Sq.M.';\r\n }\r\n if ($scope.irrigatedAreaUnits == 0) {\r\n $scope.irrigatedAreaUnits = 'Sq.Ft.';\r\n }\r\n if ($scope.irrigatedAreaUnits == 1) {\r\n $scope.irrigatedAreaUnits = 'Sq.M.';\r\n }\r\n if ($scope.irrigatedAreaUnits == 2) {\r\n $scope.irrigatedAreaUnits = 'Acres';\r\n }\r\n if ($scope.irrigatedAreaUnits == 3) {\r\n $scope.irrigatedAreaUnits = 'Item';\r\n }\r\n\r\n var propTypeNames = PropertySettingsService.getPropertyTypeNames();\r\n\r\n property.PropertyTypes.forEach(function (type) {\r\n if (type.Name != null && type.Name != '') {\r\n $scope.propertyTypes.push({ id: type.TypeId, caption: type.Name + ' (' + propTypeNames[type.TypeId - 1] + ')' });\r\n }\r\n else {\r\n $scope.propertyTypes.push({ id: type.TypeId, name: type.Name, caption: propTypeNames[type.TypeId - 1] });\r\n }\r\n });\r\n\r\n if($stateParams.showAuthorizationMetersWarning) {\r\n PropertyDataService.showAuthorizationMetersWarningDialog($stateParams.id, function () {\r\n ModalServiceExt.showInfo(\r\n _t(\"Property is successfuly edited but consumption data will not be submitted to Energy Star until tenants authorize data sharing.\"));\r\n });\r\n } \r\n });\r\n\r\n if ($state.params)\r\n $scope.propertyId = $state.params.id;\r\n\r\n $scope.cancel = function () {\r\n $state.goMainLayout('PropertyList');\r\n }\r\n\r\n $scope.editPropertyOverview = function() {\r\n $state.goMainLayout(\r\n 'AddProperty.PropertyOverview',\r\n { id: $scope.propertyId, mode: 'edit', stepsCount: 5, step: 0 });\r\n };\r\n\r\n $scope.editPropertyDetails = function() {\r\n $state.goMainLayout(\"AddProperty.PropertyType\",\r\n {\r\n id: $scope.propertyId,\r\n mode: 'edit',\r\n stepsCount: 1 + $scope.propertyTypes.length,\r\n step: 0\r\n });\r\n }\r\n\r\n $scope.editMeters = function () {\r\n $state.goMainLayout(\"AddProperty.AddMeters\",\r\n {\r\n id: $scope.propertyId,\r\n mode: 'edit',\r\n });\r\n }\r\n\r\n $scope.submitAuth = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/AuthorizeProperty/',\r\n params: { propertyId: $stateParams.id, userName: $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n\r\n if (response.Data && response.Data.NeedsAuthorization) {\r\n PropertyDataService.showAuthorizationMetersWarningDialog($stateParams.id, function () {\r\n ModalServiceExt.showInfo(\r\n _t(\"Property is successfuly authorized but consumption data will not be submitted to Energy Star until tenants authorize data sharing.\"),\r\n function () { $state.goMainLayout('EditProperty', { id: $stateParams.id }, { reload: true }); });\r\n });\r\n } else {\r\n ModalServiceExt.showInfo(_t(\"Property is successfuly authorized.\"), function () { $state.goMainLayout('EditProperty', { id: $stateParams.id }, { reload: true }); });\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\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',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $http, $rootScope, usSpinnerService, LeftMenuService, CommonHeaderService, ModalServiceExt, $state,\r\n UnitsService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\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.greenButtonDataUrl = '';\r\n $scope.exportToExcelUrl = '';\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.getMeterDataGraph = function () {\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 accountNumber = localStorage.getItem('CurrentAccountNumber');\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 fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\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 fileId = response.Data;\r\n var url = utilli.getUrlWithToken('api/GeneratedFiles/GetFile', { fileId: fileId });\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 $scope.greenButtonDataUrl = utilli.getUrlWithToken('api/Consumption/GetGreenButtonData/',\r\n selectedAccountAndMeter);\r\n $scope.exportToExcelUrl = utilli.getUrlWithToken('api/Consumption/GetConsumptionDataExcel/',\r\n selectedAccountAndMeter);\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 = localStorage.getItem('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\r\n for (var i = 0; i < tableData.length; i++) {\r\n\r\n var reading = tableData[i];\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.formatNumber(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 createChart();\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.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 return [\r\n {\r\n name: 'Consumption',\r\n data: [],\r\n tooltip: {\r\n pointFormat: '' + _t('Register') +': {point.register}
{point.unit}: {point.y}',\r\n headerFormat: ''\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 pointFormat: '${point.y}',\r\n headerFormat: ''\r\n }\r\n }, {\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 name: 'Temperature Range',\r\n type: 'errorbar',\r\n data: [],\r\n enableMouseTracking: false,\r\n yAxis: 2\r\n }\r\n ];\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 chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\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 labels: {\r\n formatter: function () {\r\n return '$' + utilli.formatNumber(this.value);\r\n }\r\n },\r\n title: {\r\n text: _t('Amount')\r\n },\r\n min: 0\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 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 legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 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 var 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\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: $scope.units.getSelectedUnitsTypeName()\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 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 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 $scope.getMeterDataGraph();\r\n }, 100);\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')\r\n .controller('EditAccountsController', ['$scope', '$rootScope', '$http', '$q', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', 'GetAccountsService', 'ModalService', 'CommonHeaderService',\r\n 'ModalServiceExt', 'DueReminderService', 'AccountListService',\r\n function ($scope, $rootScope, $http, $q, $timeout, $window, usSpinnerService, LeftMenuService, $state,\r\n GetAccountsService, ModalService, CommonHeaderService, ModalServiceExt, DueReminderService, AccountListService) {\r\n\r\n LeftMenuService.setCurrentTab('AccountList');\r\n $scope.AddAccount = function () {\r\n $state.goMainLayout(\"AddAccount\");\r\n };\r\n CommonHeaderService.setUp($scope._t('Edit Accounts'), $scope._t('Add'), $scope.AddAccount, true);\r\n $scope.Errors = null;\r\n\r\n $scope.accountDataList = {};\r\n\r\n $scope.DeleteAccount = function (account) {\r\n if ($scope.accountDataList.length <= 1) {\r\n ModalServiceExt.showOkMessage($scope._t('Delete account.'), $scope._t('Last contract account cannot be deleted.'))\r\n return;\r\n }\r\n ModalServiceExt.showYesNoMessage($scope._t('Delete account'), $scope._t('Are you sure you want to delete this contract account?'), \r\n function () {\r\n deleteAccountInternal(account);\r\n });\r\n };\r\n\r\n function getNewPrimaryAccount(currentPrimaryAccount) {\r\n for(var i = 0; i < $scope.accountDataList.length; i++)\r\n if ($scope.accountDataList[i].AccountNumber != currentPrimaryAccount)\r\n return $scope.accountDataList[i].AccountNumber;\r\n }\r\n\r\n function saveAsPrimaryAccount(accountNumber, userName) {\r\n var deferred = $q.defer();\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/SetPrimaryContractAccount/',\r\n method: \"POST\",\r\n params: {\r\n //todo: user token\r\n accountNumber: accountNumber,\r\n userName: userName\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n deferred.reject();\r\n }\r\n deferred.resolve(response);\r\n }).error(function () {\r\n deferred.reject();\r\n })\r\n // \"['finally']\" instead of just \"finally\" because in old android browsers \"finally\" is a reserved keyword\r\n ['finally'](function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function GoToAccountList(acc) {\r\n AccountListService.changeContractAccount(acc, function () {\r\n $state.goMainLayout('AccountList');\r\n });\r\n };\r\n\r\n function deleteAccountInternal (account) {\r\n var newPrimaryAccount = getNewPrimaryAccount(account.AccountNumber);\r\n\r\n var dataobj = { accountNumber: account.AccountNumber };\r\n utilli.addUserName($state, dataobj);\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/DeleteAccount',\r\n method: \"POST\",\r\n params: dataobj\r\n }).success(function (data) {\r\n $scope.isLoading = false;\r\n var jsondata = data;\r\n if (jsondata) {\r\n if (jsondata.ERROR_LIST && jsondata.ERROR_LIST.length > 0) {\r\n ModalServiceExt.showError(jsondata.ERROR_LIST[0].Message);\r\n } else {\r\n var acc;\r\n for (var i = 0; i < $scope.accountDataList.length; i++)\r\n {\r\n if ($scope.accountDataList[i].AccountNumber == newPrimaryAccount)\r\n acc = $scope.accountDataList[i];\r\n }\r\n if (!acc)\r\n ModalServiceExt.showError($scope._t(\"Cannot find the account with the account number \") + newPrimaryAccount);\r\n GoToAccountList(acc);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n }\r\n }).error(function () {\r\n $scope.isLoading = false;\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n $scope.GetAccountsList = function () {\r\n var promise = GetAccountsService.getAccounts();\r\n promise.then(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0].Message);\r\n return;\r\n }\r\n\r\n $scope.accountDataList = response.Accounts;\r\n }).catch(function (error) {\r\n ModalServiceExt.showError(error);\r\n });\r\n }\r\n\r\n function showDueDateInternal(account) {\r\n return account.TotalBalance > 0 && account.DueDate != '0001-01-01T00:00:00';\r\n }\r\n\r\n function showPastDueInternal(account) {\r\n if (showDueDateInternal(account))\r\n return account.dueDateTicks < Date.now();\r\n\r\n return false;\r\n }\r\n\r\n $scope.showDueDate = function (account) {\r\n return showDueDateInternal(account);\r\n }\r\n\r\n $scope.showPastDue = function (account) {\r\n return showPastDueInternal(account);\r\n }\r\n\r\n $scope.getTotalBalanceClass = function (account) {\r\n if (showPastDueInternal(account))\r\n return 'warnig-color';\r\n else\r\n return 'success-color';\r\n }\r\n\r\n $scope.getAccountBalanceClass = function (account) {\r\n if (showDueDateInternal(account))\r\n return '';\r\n\r\n return 'balance-without-dueDate';\r\n }\r\n\r\n $scope.getDueDateClass = function (account) {\r\n if (showPastDueInternal(account))\r\n return 'warnig-color';\r\n\r\n return '';\r\n }\r\n\r\n $scope.getUtilityImage = function (data) {\r\n if (data.UtilityType == 'Gas')\r\n return 'gas-bgr';\r\n if (data.UtilityType == 'Water')\r\n return 'water-bgr';\r\n return 'elctr-bgr';\r\n }\r\n }])\r\n;\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('NoConnectionController', ['$scope', '$timeout', function ($scope, $timeout) {\r\n\r\n $scope.buttonMessage = 'Try to connect again';\r\n $scope.busy = false;\r\n\r\n $scope.getLogo = function () {\r\n if (DeploymentSettings.providersGroupShortName === 'wgl')\r\n return utilli.isAdmin ? '../Images/Wgl-logo.png' : 'Images/Wgl-logo.png';\r\n\r\n return utilli.isAdmin ? '../Images/Utilli-logo.png' : 'Images/Wgl-logo.png';\r\n }\r\n\r\n $scope.getLogoText = function () {\r\n if (DeploymentSettings.providersGroupShortName === 'wgl')\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 \"Utilli 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.replace('api/', '') + 'Sms/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\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('UpdateAppController', ['$scope', function ($scope) {\r\n $scope.UpdateApp = function () {\r\n // TODO: fill out references after the app will be deployed.\r\n var url = 'http://utilli.com';\r\n if (iOS())\r\n url = Config.appUrls.iOs;\r\n else if (isAndroid())\r\n url = Config.appUrls.android;\r\n else if (deviceIsWindowsPhone)\r\n url = Config.appUrls.winPhone;\r\n window.open(url, \"_system\", \"location=yes,closebuttoncaption=Back\");\r\n };\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('AddAccountController', ['$scope', '$http', '$rootScope', '$state', '$window', 'LeftMenuService',\r\n 'usSpinnerService', 'CommonHeaderService',\r\n function ($scope, $http, $rootScope, $state, $window, LeftMenuService, usSpinnerService, CommonHeaderService) {\r\n\r\n LeftMenuService.setCurrentTab('AccountList');\r\n CommonHeaderService.setUpBackButton();\r\n $scope.errors = null;\r\n $scope.name = '';\r\n $scope.zip = '';\r\n $scope.accountNumber = '';\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n }\r\n\r\n function validate()\r\n {\r\n var validated = true;\r\n var matched;\r\n\r\n if (!$scope.accountNumber)\r\n {\r\n $scope.accountEmptyError = true;\r\n validated = false;\r\n }\r\n else \r\n {\r\n var re = /^[0-9]*$/;\r\n matched = re.test($scope.accountNumber);\r\n if (!matched)\r\n {\r\n $scope.accountFormatError = true;\r\n validated = false;\r\n }\r\n }\r\n\r\n if (!$scope.zip) {\r\n $scope.zipEmptyError = true;\r\n validated = false;\r\n }\r\n else {\r\n matched = Config.zipCodeRegexp.test($scope.zip);\r\n if (!matched) {\r\n $scope.zipFormatError = true;\r\n validated = false;\r\n }\r\n }\r\n\r\n if (!$scope.name)\r\n {\r\n $scope.fullNameEmptyError = true;\r\n validated = false;\r\n }\r\n\r\n return validated;\r\n }\r\n\r\n function resetErrors()\r\n {\r\n $scope.accountEmptyError = false;\r\n $scope.accountFormatError = false;\r\n $scope.zipEmptyError = false;\r\n $scope.zipFormatError = false;\r\n $scope.fullNameEmptyError = false;\r\n $scope.errors = null;\r\n }\r\n\r\n $scope.addAccount = function () {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n resetErrors();\r\n\r\n if (!validate())\r\n {\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n $scope.errors = null;\r\n\r\n var dataObj = {\r\n AccountNumber: $scope.accountNumber,\r\n Zip: $scope.zip,\r\n FullName: $scope.name\r\n };\r\n\r\n utilli.addUserName($state, dataObj);\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/AddAccount',\r\n method: \"POST\",\r\n data: dataObj\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n \r\n if (data) {\r\n if (data.Messages && data.Messages.length > 0) {\r\n $scope.errors = data.Messages;\r\n } else {\r\n $state.goMainLayout('AccountList');\r\n }\r\n } else {\r\n $scope.errors = [utilli.errors.serverErrorMessage];\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors = [utilli.errors.serverErrorMessage];\r\n });\r\n }\r\n }]);\nangular.module('utilliApp')\r\n.controller('PaymentHistoryController', [function () {\r\n}]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .directive('paymentHistoryItem', function () {\r\n\r\n return {\r\n restrict: 'A',\r\n transclude: true,\r\n replace: true,\r\n scope: { paymentHistoryItem: '=paymentHistoryItem' },\r\n templateUrl: utilli.isAdmin ? '../Pages/PaymentHistoryItem/PaymentHistoryItem.html' : 'Pages/PaymentHistoryItem/PaymentHistoryItem.html',\r\n controller: 'PaymentHistoryController'\r\n };\r\n });\r\n\r\n\nangular.module('utilliApp')\r\n.controller('ConsumptionHistoryController', ['$scope', '$rootScope', '$http', '$window', \r\n function ($scope, $rootScope, $http, $window) {\r\n $scope.config = $window.Config;\r\n $scope.formatNumber = utilli.formatNumber;\r\n $scope._t = $rootScope._t;\r\n }\r\n]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .directive('consumptionHistoryItem', function () {\r\n\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n scope: { consumptionHistoryItem: '=historyItem', selectedUnitsType: '=' },\r\n templateUrl: 'Pages/UsageChart/ConsumptionHistoryItem/ConsumptionHistoryItem.html',\r\n controller: 'ConsumptionHistoryController'\r\n };\r\n });\r\n\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ResetPasswordController', ['$scope', '$http', '$state', '$stateParams', 'usSpinnerService',\r\n 'CommonDataService', 'ServiceProvidersService',\r\nfunction ($scope, $http, $state, $stateParams, usSpinnerService, CommonDataService, ServiceProvidersService) {\r\n\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(\"Sevice 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(\"Sevice 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(\"Sevice 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 alert($scope._t('Password was successfuly changed.'));\r\n $state.goToWelcome();\r\n }\r\n }).error(function () {\r\n $scope.errors.serverErrors = [$scope._t(\"Sevice is unavailable now. Try again later.\")];\r\n usSpinnerService.stop('spinner-1');\r\n });\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/// \r\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('BotAuthorizeController', [\r\n '$scope', '$http', '$sce', 'usSpinnerService',\r\n 'ServiceProvidersService', 'CommonHeaderService', 'CheckVersionService', '$state', \r\n function ($scope, $http, $sce, usSpinnerService, ServiceProvidersService, CommonHeaderService, CheckVersionService, $state) {\r\n CommonHeaderService.setUp();\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.SuccessMessage = $scope._t('We are processing your request') + '...';\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n if ($state.params.logoutRequired == \"logoutRequired\") {\r\n utilli.clearLocalStorage();\r\n $state.params.logoutRequired = 'doNotLogout';\r\n $state.goToSignIn(true);\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var serviceUrl = atob($state.params.serviceUrl);\r\n var dataobj = {\r\n channelId: $state.params.channelId,\r\n fromId: $state.params.clientId,\r\n conversationId: $state.params.conversationId,\r\n serviceUrl: serviceUrl\r\n };\r\n\r\n $http({\r\n url: apiUrl + 'api/Account/AuthorizeBot/',\r\n method: \"GET\",\r\n params: dataobj\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.Errors && response.Errors.length > 0) {\r\n $scope.SuccessMessage = response.Errors[0];\r\n return;\r\n }\r\n $scope.SuccessMessage = $scope._t('You have been successfully authorized. You can now use Utilli Bot.');\r\n }).error(function (data) {\r\n $scope.SuccessMessage = $scope._t('Error');\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('BillDetailsController', ['$scope', '$http', 'BillsService', '$rootScope', 'ModalServiceExt',\r\n '$timeout', '$state', 'CommonHeaderService', 'OpenFileService', '$stateParams', 'usSpinnerService', 'LeftMenuService',\r\n function ($scope, $http, billsService, $rootScope, ModalServiceExt, $timeout, $state, CommonHeaderService,\r\n OpenFileService, $stateParams, usSpinnerService, LeftMenuService) {\r\n\r\n LeftMenuService.setCurrentTab('BillsAndPayments');\r\n CommonHeaderService.setUp($scope._t('Bill Details'), $scope._t('Pay'), function () {\r\n $state.goMainLayout('PayNow');\r\n });\r\n \r\n $scope.backFromBillDetails = function () {\r\n $state.goMainLayout('BillsAndPayments');\r\n }\r\n\r\n if (!$stateParams.billNumber) {\r\n $scope.backFromBillDetails();\r\n return;\r\n }\r\n\r\n $scope.loadBill = function () {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n \r\n var dataRequest = { accountNumber: accountNumber, billNumber: $stateParams.billNumber };\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Bills/GetBill/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n if (data) {\r\n if (data.ERROR_LIST && data.ERROR_LIST.length > 0) {\r\n ModalServiceExt.showError(data.ERROR_LIST[0].Message);\r\n } else {\r\n $scope.bill = data.Data;\r\n\r\n $scope.bill.billDateUnix = $scope.bill.BillDate.getTime();\r\n $scope.bill.dueDateUnix = $scope.bill.DueDate.getTime();\r\n $scope.bill.Amount = $scope.bill.BillAmount;\r\n $scope.bill.Charges = $scope.bill.LatePayAmount;\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.billAmountClass = function () {\r\n if ($scope.bill) {\r\n if ($scope.bill.PaidStatus.toUpperCase() == 'UNPAID')\r\n return \"data-amount-unpaid\";\r\n else if ($scope.bill.PaidStatus.toUpperCase().indexOf('PENDING') > -1)\r\n return \"data-amount-pending\";\r\n }\r\n\r\n return \"data-amount\";\r\n };\r\n\r\n $scope.enableBillDownload = Config.enableBillDownload;\r\n\r\n $scope.isUnderstandLoading = false;\r\n\r\n $scope.ViewPdf = function () {\r\n OpenFileService.openBill($scope.bill.BillNumber, $scope.bill.AccountNumber);\r\n }\r\n\r\n $scope.understandBill = function () {\r\n OpenFileService.openUnderstandBillFile();\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('MoveServiceController', ['$scope', '$rootScope', '$window', '$http', '$state', 'StatesService',\r\n 'CustomerInfoDataService', 'usSpinnerService', 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService',\r\nfunction ($scope, $rootScope, $window, $http, $state, StatesService, CustomerInfoDataService, usSpinnerService,\r\n LeftMenuService, ModalServiceExt, CommonHeaderService) {\r\n\r\n LeftMenuService.setCurrentTab('MoveService');\r\n CommonHeaderService.setUpBackButton($scope._t('Move Service'));\r\n\r\n initPicker();\r\n\r\n function initPicker() {\r\n $scope.dpOptions = utilli.datePickerOptions;\r\n $scope.altInputFormats = ['M!/d!/yyyy'];\r\n }\r\n\r\n $scope.needConfirmAddress = false;\r\n $scope.confirmAddressText = '';\r\n\r\n $scope.errors = {};\r\n $scope.errors.addServerError = function (message) {\r\n $scope.errors.commonMessage = message;\r\n $scope.errors.hasErrors = true;\r\n };\r\n resetErrors();\r\n CustomerInfoDataService.getCachedData().then(\r\n function (customerInfo) {\r\n $scope.model = createModel(customerInfo);\r\n $scope.state = StatesService.states[0];\r\n $scope.states = StatesService.states;\r\n $scope.currentAddress = customerInfo.account.ServiceAddress;\r\n },\r\n function (errorInfo) {\r\n $scope.errors.addServerError(errorInfo);\r\n });\r\n\r\n $scope.moveService = function () {\r\n $scope.submitted = true;\r\n if (!validate()) {\r\n utilli.scrollTop();\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $scope.model.State = $scope.state.Abbreviation;\r\n \r\n // deep copy because i'm going to change the phone number below\r\n // and i don't want it to be changed on the model\r\n var modelCopy = jQuery.extend(true, {}, $scope.model);\r\n modelCopy.Phone = utilli.getCountryPhoneNumberCode() + $window.$('#phone').mask();\r\n modelCopy.StopServiceDate = modelCopy.StopServiceDate.toUTCString();\r\n modelCopy.StartServiceDate = modelCopy.StartServiceDate.toUTCString();\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/Move',\r\n method: 'POST',\r\n data: modelCopy\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n if (data.Success)\r\n {\r\n ModalServiceExt.showInfo(\r\n $scope._t('Your request has been submitted. We will contact you shortly to finish processing your request.'),\r\n successDialogClosed);\r\n return;\r\n }\r\n if (data.NeedConfirmAddress)\r\n {\r\n $scope.needConfirmAddress = true;\r\n $scope.confirmAddressText = data.Message;\r\n // wrapped into a timeout to run after this method ends because right now \r\n // the message about needConfirmAddress is not rendered \r\n // and clientHeight is wrong\r\n setTimeout(utilli.scrollBottom, 0);\r\n }\r\n else\r\n {\r\n $scope.errors.addServerError(data.Message);\r\n // scroll to the top\r\n utilli.scrollTop();\r\n }\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.addServerError($scope._t('Service is unavailable now. Try again later.'));\r\n utilli.scrollTop();\r\n });\r\n };\r\n\r\n function createModel(data) {\r\n var model = {};\r\n model.AccountNumber = data.account.AccountNumber;\r\n model.BusinessPartner = data.account.BusinessPartner;\r\n model.StartServiceDate = '';\r\n model.StopServiceDate = utilli.getCurrentDateForDatePicker();\r\n model.HouseNumber = '';\r\n model.AddressLine = '';\r\n model.HouseNoSupplement = '';\r\n model.AdditionalAccountName = '';\r\n model.City = '';\r\n model.State = '';\r\n model.Zip = '';\r\n model.Phone = getMaskedPhoneNumberValue(data.userinfo.Phone);\r\n model.Email = data.userinfo.Email;\r\n model.ProceedAddress = false;\r\n return model;\r\n };\r\n \r\n $scope.updateProceedAddress = function()\r\n {\r\n var proceedAddress = $scope.model.ProceedAddress;\r\n $scope.model.ProceedAddress = !proceedAddress;\r\n }\r\n\r\n function validate()\r\n {\r\n resetErrors();\r\n\r\n if (!$scope.model.Email)\r\n {\r\n $scope.errors.emptyEmail = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n else\r\n {\r\n var re = /^(([^<>()[\\]\\\\.,;:\\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 var matched = re.test($scope.model.Email);\r\n if (!matched) {\r\n $scope.errors.wrongEmail = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n }\r\n \r\n if (!$scope.model.HouseNumber)\r\n {\r\n $scope.errors.emptyHouseNumber = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n\r\n if (!$scope.model.City) {\r\n $scope.errors.emptyCity = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n\r\n if (!$scope.model.AddressLine) {\r\n $scope.errors.emptyStreet = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n\r\n if (!$scope.model.Zip) {\r\n $scope.errors.emptyZip = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n else if (/^(\\d{5})?$|^$/.test($scope.model.Zip) == false)\r\n {\r\n $scope.errors.wrongZip = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n \r\n if (!$scope.model.StartServiceDate) {\r\n $scope.errors.emptyStartDate = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n\r\n if (!$scope.model.StopServiceDate) {\r\n $scope.errors.emptyStopDate = true;\r\n $scope.errors.hasErrors = true;\r\n }\r\n\r\n if ($scope.errors.hasErrors)\r\n $scope.errors.commonMessage = utilli.errors.validationErorrsMessage;\r\n\r\n return !$scope.errors.hasErrors;\r\n }\r\n\r\n function resetErrors()\r\n {\r\n $scope.errors.hasErrors = false;\r\n $scope.errors.wrongEmail = false;\r\n $scope.errors.emptyEmail = false;\r\n $scope.errors.emptyHouseNumber = false;\r\n $scope.errors.emptyCity = false;\r\n $scope.errors.emptyStreet = false;\r\n $scope.errors.emptyZip = false;\r\n $scope.errors.wrongZip = false;\r\n $scope.errors.emptyStartDate = false;\r\n $scope.errors.emptyStopDate = false;\r\n $scope.errors.commonMessage = '';\r\n };\r\n\r\n function successDialogClosed() {\r\n $state.goMainLayout('Dashboard');\r\n };\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('CancelServiceController', ['$scope', '$rootScope', '$window', '$http', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'CommonHeaderService', 'CustomerInfoDataService', 'StatesService',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $rootScope, $window, $http, $state, usSpinnerService, LeftMenuService,\r\n CommonHeaderService, CustomerInfoDataService, StatesService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n LeftMenuService.setCurrentTab('CancelService');\r\n CommonHeaderService.setUpBackButton(_t('Cancel Service'));\r\n\r\n $scope.isLoading = false;\r\n\r\n $scope.states = StatesService.states;\r\n $scope.state = {};\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CustomerInfoDataService.getCachedData().then(\r\n function (customerInfo) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.model = {\r\n accountNumber: customerInfo.account.AccountNumber,\r\n phone: getMaskedPhoneNumberValue(customerInfo.userinfo.Phone),\r\n email: customerInfo.userinfo.Email,\r\n currentAddress: customerInfo.account.ServiceAddress,\r\n ForwardingAddress: {\r\n HouseNumber: '',\r\n HouseNoSupplement: '',\r\n POBox: '',\r\n AddressLine: '',\r\n City: '',\r\n State: '',\r\n Zip: ''\r\n }\r\n };\r\n },\r\n function (errorInfo) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.addServerError(errorInfo);\r\n });\r\n\r\n function resetErrors() {\r\n $scope.houseNumberPOBoxEmptyError = false;\r\n $scope.houseNumberPOBoxFilledError = false;\r\n $scope.invalidHouseNumberError = false;\r\n $scope.invalidPOBoxError = false;\r\n $scope.streetError = false;\r\n $scope.oddStreetError = false;\r\n $scope.cityError = false;\r\n $scope.invalidCityError = false;\r\n $scope.stateError = false;\r\n $scope.invalidStateError = false;\r\n $scope.zipError = false;\r\n $scope.zipFormatError = false;\r\n };\r\n\r\n function validate() {\r\n var valid = true;\r\n var matched;\r\n var regexp;\r\n\r\n var forwardingAddress = $scope.model.ForwardingAddress;\r\n if (forwardingAddress.POBox) {\r\n if (forwardingAddress.HouseNumber) {\r\n $scope.houseNumberPOBoxFilledError = true;\r\n valid = false;\r\n }\r\n\r\n if (forwardingAddress.AddressLine) {\r\n $scope.oddStreetError = true;\r\n valid = false;\r\n }\r\n }\r\n else {\r\n if (!forwardingAddress.HouseNumber) {\r\n $scope.houseNumberPOBoxEmptyError = true;\r\n valid = false;\r\n }\r\n\r\n if (!forwardingAddress.AddressLine) {\r\n $scope.streetError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n if (!$scope.houseNumberPOBoxFilledError && !$scope.houseNumberPOBoxEmptyError) {\r\n regexp = /^[0-9]+$/;\r\n if (forwardingAddress.HouseNumber) {\r\n matched = regexp.test(forwardingAddress.HouseNumber);\r\n if (!matched) {\r\n $scope.invalidHouseNumberError = true;\r\n valid = false;\r\n }\r\n } else {\r\n matched = regexp.test(forwardingAddress.POBox);\r\n if (!matched) {\r\n $scope.invalidPOBoxError = true;\r\n valid = false;\r\n }\r\n }\r\n }\r\n //\r\n if (!forwardingAddress.City) {\r\n $scope.cityError = true;\r\n valid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]+(?:[\\s-][a-zA-Z]+)*$/;\r\n matched = regexp.test(forwardingAddress.City);\r\n if (!matched) {\r\n $scope.invalidCityError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n //\r\n if (!$scope.state) {\r\n $scope.stateError = true;\r\n valid = false;\r\n } else {\r\n $scope.model.ForwardingAddress.State = $scope.state.Abbreviation;\r\n }\r\n\r\n //\r\n if (!forwardingAddress.Zip) {\r\n $scope.zipError = true;\r\n valid = false;\r\n }\r\n else {\r\n matched = Config.zipCodeRegexp.test(forwardingAddress.Zip);\r\n if (!matched) {\r\n $scope.zipFormatError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n if (!$scope.model.stopServiceDate) {\r\n valid = false;\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n $scope.cancelService = function () {\r\n resetErrors();\r\n $scope.submitted = true;\r\n var valid = validate();\r\n if (!valid) {\r\n $scope.error = utilli.errors.validationErorrsMessage;\r\n utilli.scrollTop();\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $scope.error = '';\r\n\r\n $scope.model.stopServiceDate = $scope.model.stopServiceDate.toUTCString();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/Cancel',\r\n method: 'POST',\r\n data: $scope.model\r\n }).success(function(data)\r\n {\r\n usSpinnerService.stop('spinner-1');\r\n if (data && data.Success)\r\n $state.goMainLayout('CancelSuccess');\r\n else \r\n $scope.error = data \r\n ? data.Message\r\n : utilli.errors.serverErrorMessage;\r\n }).error(function()\r\n {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.error = utilli.errors.serverErrorMessage;\r\n });\r\n };\r\n}]);\nangular.module('utilliApp')\r\n.controller('CancelSuccessController', ['$scope', '$state', function ($scope, $state)\r\n{\r\n $scope.successMessage = $scope._t('Your request has been submitted. ' +\r\n 'We will contact you shortly to finish processing your request.');\r\n\r\n $scope.ok = function () {\r\n $state.goMainLayout('Dashboard');\r\n };\r\n}]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ProgramEnrolmentsController', ['$scope', '$http', '$sce', '$state', 'LeftMenuService', 'CommonHeaderService',\r\n 'ModalServiceExt', 'usSpinnerService', 'ProgramEnrollmentsSettings', '$timeout',\r\n function ($scope, $http, $sce, $state, LeftMenuService, CommonHeaderService, ModalServiceExt, usSpinnerService,\r\n ProgramEnrollmentsSettings, $timeout) {\r\n\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('Program Enrollments'));\r\n\r\n function loadSettings() {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .getSettings(null, true)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.programs = data;\r\n }, function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n loadSettings();\r\n\r\n $scope.learnMore = function (programName) {\r\n if (programName == 'Donation')\r\n alert('not implemented, go to ' + programName);\r\n else if (programName == 'SmsNotifications')\r\n alert('not implemented, go to ' + programName);\r\n else\r\n alert('not implemented ' + programName);\r\n }\r\n\r\n $scope.enrollEBilling = function () {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.eBilling)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.programs.EBilling.IsEnrolled = !$scope.programs.EBilling.IsEnrolled;\r\n if(data)\r\n ModalServiceExt.showInfo(\"Program is successfuly enrolled.\");\r\n else\r\n ModalServiceExt.showInfo(\"Program is successfuly unenrolled.\");\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n return;\r\n }\r\n\r\n\r\n $scope.enrollAutoPay = function (programName) {\r\n alert('not implemented ' + programName);\r\n }\r\n\r\n $scope.showNotImplemented = function () {\r\n alert('not implemented');\r\n }\r\n\r\n $scope.goDonationHistory = function () {\r\n $state.goMainLayout('DonationHistory');\r\n }\r\n\r\n $scope.enrollBudgetBillingAction = \"Enroll\";\r\n\r\n $scope.budgetBillingLearnMore = function () {\r\n $state.goMainLayout('BudgetBillingLearnMore');\r\n }\r\n\r\n $scope.budgetBillingAction = function () {\r\n if($scope.programs.BudgetBilling.IsEnrolled)\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.budgetBilling)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.programs.BudgetBilling.IsEnrolled = !$scope.programs.BudgetBilling.IsEnrolled;\r\n ModalServiceExt.showInfo(\"Program is successfuly unenrolled.\")\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n return;\r\n }\r\n $state.goMainLayout('BudgetBilling');\r\n }\r\n\r\n $scope.unenrollSmsNotifications = function () {\r\n var params = { };\r\n utilli.addUserName($state, params);\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollSmsNotifications',\r\n method: 'POST',\r\n params: params\r\n }).success(function(response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n loadSettings();\r\n });\r\n }).error(function(error) {\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n }\r\n\r\n $scope.unenrollEmailNotifications = function () {\r\n var params = {};\r\n utilli.addUserName($state, params);\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollEmailNotifications',\r\n method: 'POST',\r\n params: params\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n loadSettings();\r\n });\r\n }).error(function (error) {\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n }\r\n\r\n $scope.goDonationProgramEnrollment = function () {\r\n if($scope.programs.Donation.IsEnrolled)\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.donation)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.programs.Donation.IsEnrolled = !$scope.programs.Donation.IsEnrolled;\r\n ModalServiceExt.showInfo(\"Program is successfuly unenrolled.\")\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n return;\r\n }\r\n var donationProgram = $scope.programs.Donation;\r\n if(donationProgram.RoundUpEnabled && !donationProgram.FixedAmountEnabled && !donationProgram.PercentageEnabled)\r\n enrollRoundUpDonation();\r\n else if(donationProgram.FixedAmountEnabled && !donationProgram.RoundUpEnabled && !donationProgram.PercentageEnabled)\r\n $state.goMainLayout('DonationEnrollment.PercentageEnrollmentStep2');\r\n else if(donationProgram.PercentageEnabled && !donationProgram.FixedAmountEnabled && !donationProgram.RoundUpEnabled)\r\n $state.goMainLayout('DonationEnrollment.FixedAmountEnrollmentStep2');\r\n else\r\n $state.goMainLayout(\"DonationEnrollment\", { program: donationProgram });\r\n }\r\n\r\n function enrollRoundUpDonation () {\r\n var params = { };\r\n utilli.addUserName($state, params);\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/EnrollRoundUpDonation',\r\n method: 'POST',\r\n params: params\r\n }).success(function(response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n loadSettings();\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function(error) {\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]).\r\ncontroller('DonationLearnMoreController', ['$scope', '$state', '$http', 'LeftMenuService', 'CommonHeaderService', '$stateParams',\r\n 'usSpinnerService', 'ModalServiceExt', 'ProgramEnrollmentsSettings',\r\n function ($scope, $state, $http, LeftMenuService, CommonHeaderService, $stateParams, usSpinnerService, ModalServiceExt,\r\n ProgramEnrollmentsSettings) {\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('Donation Learn Program Information'));\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .getSettings('Donation')\r\n .then(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.program = data;\r\n }, function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.toggleEnrollment = function () {\r\n if($scope.program.IsEnrolled)\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.donation)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.program.IsEnrolled = !$scope.program.IsEnrolled;\r\n ModalServiceExt.showInfo(\"Program is successfuly unenrolled.\")\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n return;\r\n }\r\n $state.goMainLayout('DonationEnrollment', { program: $scope.program });\r\n }\r\n}]).\r\ncontroller('SmsNotificationsLearnMoreController', ['$scope', 'LeftMenuService', 'CommonHeaderService',\r\n 'usSpinnerService', 'ProgramEnrollmentsSettings', '$http', '$state', 'ModalServiceExt',\r\n function ($scope, LeftMenuService, CommonHeaderService, usSpinnerService, ProgramEnrollmentsSettings,\r\n $http, $state, ModalServiceExt) {\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('Sms Notification Program Information'));\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .getSettings('SmsNotifications')\r\n .then(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.program = data;\r\n }, function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n function sendRequest(url, message) {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: { '': $state.params.userId }\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 ModalServiceExt.showInfo(message, function () { $state.goMainLayout('ProgramEnrolments'); });\r\n }).error(function (error) {\r\n usSpinnerService.spin('spinner-1');\r\n ModalServiceExt.showServerError();\r\n }); \r\n }\r\n\r\n $scope.enrollOrUnenroll = function () {\r\n if (!$scope.program.IsEnrolled) {\r\n sendRequest(\r\n localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/EnrollSmsNotifications',\r\n $scope._t('You successfuly enrolled'));\r\n } else {\r\n sendRequest(\r\n localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollSmsNotifications',\r\n $scope._t('You successfuly unenrolled'));\r\n }\r\n }\r\n }]).\r\ncontroller('EBillingLearnMoreController', ['$scope', 'LeftMenuService', 'CommonHeaderService',\r\n 'usSpinnerService', 'ProgramEnrollmentsSettings',\r\n function ($scope, LeftMenuService, CommonHeaderService, usSpinnerService, ProgramEnrollmentsSettings) {\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('eBilling Program Information'));\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .getSettings('EBilling')\r\n .then(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.program = data;\r\n }, function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }]);\r\n\r\nangular.module('utilliApp').factory('ProgramEnrollmentsSettings', ['$http', '$q', 'ModalServiceExt',\r\n function($http, $q, ModalServiceExt) {\r\n var _cachedData = null;\r\n\r\n return {\r\n programEnrollmentsType: {\r\n donation: 'Donation',\r\n budgetBilling: 'BudgetBilling',\r\n eBilling: 'EBilling',\r\n autoPay: 'AutoPay',\r\n },\r\n toggleProgramEnrollment: function (programType) {\r\n var deferred = $q.defer();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/ToggleProgramEnrollment',\r\n method: 'POST',\r\n params: {\r\n programType: programType,\r\n caNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\r\n }).success(function(response) {\r\n if (response == undefined || response.HasErrors == undefined)\r\n deferred.reject(utilli.errors.serverErrorMessage);\r\n else if (response.HasErrors)\r\n deferred.reject(response.Errors[0]);\r\n else\r\n deferred.resolve(response.Data);\r\n }).error(function(error) {\r\n console.error(error);\r\n deferred.reject(utilli.errors.serverErrorMessage);\r\n });\r\n\r\n return deferred.promise;\r\n },\r\n getSettings: function (settingName, withoutCache) {\r\n var deferred = $q.defer();\r\n if (_cachedData && !withoutCache) {\r\n var result = settingName\r\n ? _cachedData[settingName]\r\n : _cachedData;\r\n deferred.resolve(result);\r\n return deferred.promise;\r\n }\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/GetProgramEnrolments',\r\n method: 'GET',\r\n params: {\r\n caNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\r\n }).success(function(response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n _cachedData = response.Data;\r\n var result = settingName\r\n ? _cachedData[settingName]\r\n : _cachedData;\r\n deferred.resolve(result)\r\n });\r\n }).error(function(error) {\r\n console.error(error);\r\n deferred.reject(utilli.errors.serverErrorMessage);\r\n });\r\n return deferred.promise;\r\n }\r\n };\r\n}])\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('EmailNotificationsLearnMoreController', ['$scope', '$http', '$sce', '$state', 'LeftMenuService', 'CommonHeaderService',\r\n 'ModalServiceExt', 'usSpinnerService', 'ProgramEnrollmentsSettings', '$timeout',\r\n function ($scope, $http, $sce, $state, LeftMenuService, CommonHeaderService, ModalServiceExt, usSpinnerService,\r\n ProgramEnrollmentsSettings, $timeout) {\r\n\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('Email Notification Program Information'));\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings.getSettings('EmailNotifications')\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.program = data;\r\n }, function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.enrollOrUnenroll = function () {\r\n usSpinnerService.spin('spinner-1');\r\n if (!$scope.program.IsEnrolled) {\r\n sendRequest(\r\n localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/EnrollEmailNotifications',\r\n $scope._t('You successfuly enrolled'));\r\n } else {\r\n sendRequest(\r\n localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollEmailNotifications',\r\n $scope._t('You successfuly unenrolled'));\r\n }\r\n }\r\n\r\n function sendRequest(url, message) {\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: { '': $state.params.userId }\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 ModalServiceExt.showInfo(message, function () { $state.goMainLayout('ProgramEnrolments'); });\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('DonationEnrollmentStepsController', ['$scope', '$state', 'LeftMenuService',\r\n 'CommonHeaderService', '$window', '$stateParams',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, $window, $stateParams) {\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('Donation Enrollment'));\r\n\r\n $scope.model = $scope.model || {\r\n program: null,\r\n goToStep1: function () {\r\n $state.goMainLayout('DonationEnrollment.DonationEnrollmentStep1');\r\n },\r\n back: function () {\r\n $window.history.back();\r\n }\r\n };\r\n\r\n if($stateParams.program)\r\n $scope.model.program = $stateParams.program;\r\n\r\n $scope.model.goToStep1();\r\n }])\r\n .controller('DonationEnrollmentStep1Controller', ['$scope', '$http', '$state', 'LeftMenuService',\r\n 'usSpinnerService', 'ProgramEnrollmentsSettings', 'ModalServiceExt',\r\n function ($scope, $http, $state, LeftMenuService, usSpinnerService, ProgramEnrollmentsSettings, ModalServiceExt) {\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n\r\n $scope.model.isDataLoaded = false;\r\n if(!$scope.model.program) {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .getSettings('Donation')\r\n .then(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.model.program = data;\r\n checkSettings();\r\n $scope.model.isDataLoaded = true;\r\n }, function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n else {\r\n checkSettings();\r\n $scope.model.isDataLoaded = true;\r\n }\r\n\r\n function enrollRoundUpDonation () {\r\n var params = { };\r\n utilli.addUserName($state, params);\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/EnrollRoundUpDonation',\r\n method: 'POST',\r\n params: params\r\n }).success(function(response) {\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n \r\n });\r\n }).error(function(error) {\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n }\r\n\r\n $scope.next = function () {\r\n $scope.submitted = true;\r\n if(!$scope.model.donationPreference) {\r\n return;\r\n }\r\n if($scope.model.donationPreference == 'roundUp')\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.donation)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Program is successfuly enrolled.\", function () {\r\n $state.goMainLayout(\"ProgramEnrolments\");\r\n });\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n }\r\n\r\n else if($scope.model.donationPreference == 'fixedAmount')\r\n $state.goMainLayout('DonationEnrollment.FixedAmountEnrollmentStep2');\r\n else if($scope.model.donationPreference == 'percentage')\r\n $state.goMainLayout('DonationEnrollment.PercentageEnrollmentStep2');\r\n }\r\n\r\n function checkSettings() {\r\n if(!$scope.model.program) {\r\n return;\r\n }\r\n if($scope.model.program.RoundUpEnabled && !$scope.model.program.FixedAmountEnabled && !$scope.model.program.PercentageEnabled)\r\n enrollRoundUpDonation();\r\n else if($scope.model.program.FixedAmountEnabled && !$scope.model.program.RoundUpEnabled && !$scope.model.program.PercentageEnabled)\r\n $state.goMainLayout('DonationEnrollment.PercentageEnrollmentStep2');\r\n else if($scope.model.program.PercentageEnabled && !$scope.model.program.FixedAmountEnabled && !$scope.model.program.RoundUpEnabled)\r\n $state.goMainLayout('DonationEnrollment.FixedAmountEnrollmentStep2');\r\n else\r\n $scope.model.goToStep1();\r\n }\r\n }])\r\n .controller('FixedAmountEnrollmentStep2Controller', ['$scope', '$state', 'LeftMenuService', 'usSpinnerService',\r\n 'ModalServiceExt', 'ProgramEnrollmentsSettings',\r\n function ($scope, $state, LeftMenuService, usSpinnerService, ModalServiceExt, ProgramEnrollmentsSettings) {\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n\r\n if(!$scope.model.program)\r\n $scope.model.goToStep1();\r\n\r\n $scope.next = function () {\r\n $scope.submitted = true;\r\n if($scope.fixedAmountEnrollForm.$invalid)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.donation)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Program is successfuly enrolled.\", function () {\r\n $state.goMainLayout(\"ProgramEnrolments\");\r\n });\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n }\r\n }])\r\n .controller('PercentageEnrollmentStep2Controller', ['$scope', '$state', 'LeftMenuService', 'usSpinnerService',\r\n 'ProgramEnrollmentsSettings', 'ModalServiceExt',\r\n function ($scope, $state, LeftMenuService, usSpinnerService, ProgramEnrollmentsSettings, ModalServiceExt) {\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n\r\n if(!$scope.model.program)\r\n $scope.model.goToStep1();\r\n\r\n $scope.next = function () {\r\n $scope.submitted = true;\r\n if($scope.percentageEnrollmentForm.$invalid)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.donation)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Program is successfuly enrolled.\", function () {\r\n $state.goMainLayout(\"ProgramEnrolments\");\r\n });\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ChangePasswordController', ['$scope', '$rootScope', '$http', '$window', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonDataService', 'CommonHeaderService',\r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $rootScope, $http, $window, $state, usSpinnerService, LeftMenuService, ModalServiceExt,\r\n CommonDataService, CommonHeaderService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n LeftMenuService.setCurrentTab('ChangePassword');\r\n CommonHeaderService.setUpBackButton(_t('Change Password'));\r\n\r\n $scope.passRequirements = [{ Value: _t('Loading...') }];\r\n $scope.passwdErrors = [];\r\n\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData().then(function (data) {\r\n $scope.paswdMinLength = data.PasswordLength;\r\n $scope.passRequirements = data.ChangePasswordPasswordRequirements;\r\n usSpinnerService.stop('spinner-1');\r\n }, function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.model = {};\r\n $scope.model.currentPassword = '';\r\n $scope.model.newPassword = '';\r\n $scope.model.confirmNewPassword = '';\r\n\r\n $scope.serverErrors = [];\r\n\r\n $scope.errors = {};\r\n\r\n $scope.togglePassword = function (pswId, iconId) {\r\n utilli.togglePasswordVisibility(pswId, iconId);\r\n }\r\n\r\n $scope.changePassword = function () {\r\n $scope.serverErrors = [];\r\n $scope.isButtonPressed = true;\r\n\r\n if (!$scope.isPasswdValid()) {\r\n $scope.serverErrors = [utilli.errors.validationErorrsMessage];\r\n utilli.scrollTop();\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var requestData = {\r\n CurrentPassword: $scope.model.currentPassword,\r\n NewPassword: $scope.model.newPassword,\r\n ConfirmPassword: $scope.model.confirmNewPassword\r\n };\r\n utilli.addUserName($state, requestData);\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/ChangePassword',\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.serverErrors = data.Errors;\r\n else\r\n ModalServiceExt.showInfo(_t('Password was changed successfully.'), function () {\r\n utilli.goesToDefaultPage($state);\r\n });\r\n\r\n }).error(function () {\r\n $scope.serverErrors = [utilli.serverErrorMessage];\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 $scope.isPasswdValid = function () { \r\n $scope.passwdErrors = utilli.validatePassword($scope.model.newPassword, localStorage.getItem('current_user'), \r\n $scope.passRequirements, $scope.paswdMinLength, $scope.model.currentPassword);\r\n $scope.passwordsNotMatch = $scope.model.newPassword && $scope.model.newPassword !== $scope.model.confirmNewPassword \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}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('FaqsController', ['$scope', '$rootScope', '$window', '$http', '$sce', '$timeout', 'LeftMenuService', \r\n '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ServiceProvidersService', 'ModalServiceExt',\r\nfunction ($scope, $rootScope, $window, $http, $sce, $timeout, LeftMenuService, $stateParams, CommonHeaderService,\r\n usSpinnerService, ServiceProvidersService, ModalServiceExt) {\r\n LeftMenuService.setCurrentTab('Faqs');\r\n CommonHeaderService.setUpBackButton($scope._t('FAQs'));\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n $scope.serverAddress = apiUrl;\r\n if (!apiUrl) {\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n $scope.serverAddress = apiUrl;\r\n loadFAQ();\r\n loadSystemInfo();\r\n },\r\n function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showError(utilli.serverErrorMessage);\r\n }\r\n );\r\n } else {\r\n loadFAQ();\r\n loadSystemInfo();\r\n }\r\n\r\n function loadFAQ() {\r\n $http({\r\n url: apiUrl + 'api/StaticData/GetFaqs/',\r\n method: \"GET\"\r\n }).success(function (jsonData) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.faqContent = JSON.parse(jsonData);\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(utilli.serverErrorMessage);\r\n });\r\n }\r\n\r\n function loadSystemInfo() {\r\n $http({\r\n url: apiUrl + 'api/StaticData/GetSystemInfo/',\r\n method: \"GET\",\r\n }).success(function (responseData) {\r\n $scope.serverInfo = responseData;\r\n }).error(function (errorData) {\r\n console.log(errorData);\r\n });\r\n }\r\n\r\n $scope.toHtml = function (htmlCode) {\r\n return $sce.trustAsHtml(htmlCode);\r\n }\r\n\r\n $scope.checkFaq = function (item) {\r\n if (item.param === 'directDebit' && $stateParams.directDebitParam === 'true')\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n $scope.processFaq = function () {\r\n if ($stateParams.directDebitParam !== 'true')\r\n return;\r\n\r\n setTimeout(function () {\r\n $(\".direct-debit-collapse\").closest('.highlighted-region')[0].scrollIntoView(); }, 1000);\r\n }\r\n $scope.currentVersion = DeploymentSettings.currentVersion.replace('?v=', '');\r\n\r\n $scope.downloadManual = function (item) {\r\n var url = decodeURIComponent(item.param);\r\n utilli.downloadFile(url, \"UserManual.pdf\");\r\n }\r\n}])\r\n.directive('repeatDone', function () {\r\n return function (scope, element, attrs) {\r\n if (scope.$last) {\r\n scope.$eval(attrs.repeatDone);\r\n }\r\n }\r\n})\r\n.directive('compileTemplate', [\"$compile\", \"$parse\", function ($compile, $parse) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attr) {\r\n var parsed = $parse(attr.ngBindHtml);\r\n //Recompile if the template changes\r\n scope.$watch(\r\n function () {\r\n return (parsed(scope) || '').toString(); \r\n }, function () {\r\n $compile(element, null, -9999)(scope); //The -9999 makes it skip directives so that we do not recompile ourselves\r\n });\r\n }\r\n }\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.factory('avatarsService', [\"$rootScope\", function ($rootScope) {\r\n var factory = {};\r\n\r\n factory.setCurrentAvatar = function (avatar) {\r\n $rootScope.avatar = avatar;\r\n };\r\n\r\n factory.getCurrentAvatar = function () {\r\n return $rootScope.avatar;\r\n };\r\n\r\n factory.getAvatars = function () {\r\n return $rootScope.avatars;\r\n };\r\n\r\n factory.setAvatars = function (avatars) {\r\n return $rootScope.avatars = avatars;\r\n };\r\n\r\n factory.clear = function () {\r\n $scope.avatars = [];\r\n };\r\n\r\n return factory;\r\n}]);\r\n\r\napp.controller('ProfileController', ['$scope', '$rootScope', '$state', '$http', 'avatarsService', '$window', 'usSpinnerService',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', 'CommonDataService', 'NotificationBoxService',\r\n function ($scope, $rootScope, $state, $http, avatarsService, $window, usSpinnerService, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, CommonDataService, NotificationBoxService)\r\n {\r\n LeftMenuService.setCurrentTab('Profile');\r\n\r\n CommonHeaderService.setUpBackButton($scope._t('Profile'));\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n $scope.accountInfoActive = true;\r\n $scope.mailingAddressDisabled = false;\r\n $scope.userInfoErrors = [];\r\n $scope.accountInfoErrors = [];\r\n $scope.enableLanguagePack = utilli.isLanguagePackEnabled();\r\n\r\n CommonDataService.getCommonData().then(function (data) {\r\n $scope.mailingAddressDisabled = !data.EnableMailingAddress;\r\n \r\n }, function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n function addAccountError(error)\r\n {\r\n $scope.accountInfoErrors.push({Message:error});\r\n }\r\n\r\n function addUserInfoError(error) {\r\n $scope.userInfoErrors.push({ Message: error });\r\n }\r\n\r\n function addAccountErrors(errors) {\r\n $.merge($scope.accountInfoErrors, errors);\r\n }\r\n\r\n function addUserInfoErrors(errors) {\r\n $.merge($scope.userInfoErrors, errors);\r\n }\r\n\r\n function clearAccountErrors() {\r\n $scope.accountInfoErrors = [];\r\n }\r\n\r\n function clearUserInfoErrors() {\r\n $scope.userInfoErrors = [];\r\n }\r\n\r\n $scope.getProfileData = function ()\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var requestData = { accountNumber: accountNumber };\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n url: apiUrl + 'api/Profile/GetProfile/',\r\n method: \"GET\",\r\n params: requestData\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0)\r\n {\r\n addAccountErrors(data.Errors);\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n $scope.profile = data.AccountData;\r\n $scope.profile.PrimaryPhoneNumber = utilli.ajustPhoneNumber($scope.profile.PrimaryPhoneNumber);\r\n\r\n avatarsService.setCurrentAvatar(apiUrl + data.AvatarURL);\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n addAccountError($scope._t(\"Server error. Try again later.\"));\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n $scope.dashboard = function ()\r\n {\r\n resetErrors();\r\n $state.goMainLayout('Dashboard');\r\n };\r\n\r\n $scope.toAccountInfo = function () {\r\n $scope.accountInfoActive = true;\r\n resetErrors();\r\n };\r\n\r\n $scope.toUserInfo = function () {\r\n $scope.accountInfoActive = false;\r\n resetErrors();\r\n };\r\n\r\n $scope.getUserInfoClasses = function()\r\n {\r\n if ($scope.accountInfoActive)\r\n return 'profile-page-invisible';\r\n\r\n return 'profile-page-visible';\r\n }\r\n\r\n $scope.getAccountInfoClasses = function () {\r\n if ($scope.accountInfoActive)\r\n return 'profile-page-visible';\r\n\r\n return 'profile-page-invisible';\r\n }\r\n\r\n $scope.changeAvatar = function () {\r\n $state.goMainLayout('Avatars');\r\n resetErrors();\r\n };\r\n\r\n $scope.changeLanguage = function () {\r\n $state.goMainLayout('Languages');\r\n resetErrors();\r\n };\r\n\r\n function resetErrors() {\r\n clearAccountErrors();\r\n clearUserInfoErrors();\r\n\r\n $scope.phoneNumberError = false;\r\n $scope.emailError = false;\r\n $scope.invalidEmailError = false;\r\n $scope.houseNumberPOBoxEmptyError = false;\r\n $scope.houseNumberPOBoxFilledError = false;\r\n $scope.invalidHouseNumberError = false;\r\n $scope.invalidPOBoxError = false;\r\n $scope.streetError = false;\r\n $scope.oddStreetError = false;\r\n $scope.cityError = false;\r\n $scope.invalidCityError = false;\r\n $scope.stateError = false;\r\n $scope.invalidStateError = false;\r\n $scope.zipError = false;\r\n $scope.zipFormatError = false;\r\n };\r\n\r\n $scope.save = function () {\r\n resetErrors();\r\n\r\n var valid = validate();\r\n if (!valid) {\r\n addUserInfoError(utilli.errors.validationErorrsMessage);\r\n utilli.scrollTop();\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var postData = {};\r\n $window.jQuery.extend(postData, $scope.profile);\r\n var countryCode = utilli.getCountryPhoneNumberCode();\r\n postData.PrimaryPhoneNumber = countryCode + postData.PrimaryPhoneNumber;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Profile/UpdateProfile/',\r\n method: \"POST\",\r\n data: postData\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $rootScope.$broadcast('profile-updated');\r\n\r\n if (data.Errors && data.Errors.length > 0) {\r\n addUserInfoErrors(data.Errors);\r\n }\r\n else\r\n ModalServiceExt.showInfo($scope._t('Your profile has been saved.'));\r\n if ($scope.profile.SubscribeForSmsNotification === \"0\")\r\n NotificationBoxService.setSubscribeSmsVisibilityServerFlag(true);\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n addUserInfoError($scope._t(\"Server error. Try again later.\"));\r\n });\r\n };\r\n\r\n $scope.subscribeYes = function () {\r\n $scope.profile.SubscribeForEmailNotification = '1';\r\n };\r\n\r\n $scope.subscribeNo = function () {\r\n $scope.profile.SubscribeForEmailNotification = '0';\r\n };\r\n\r\n $scope.phoneSubscribeYes = function () {\r\n $scope.profile.SubscribeForSmsNotification = '1';\r\n };\r\n\r\n $scope.phoneSubscribeNo = function () {\r\n $scope.profile.SubscribeForSmsNotification = '0';\r\n };\r\n \r\n $scope.changePhoneNumber = function () {\r\n $state.goMainLayout('MobilePhoneConfirmation');\r\n }\r\n\r\n $scope.deletePhoneNumber = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/Profile/DeletePhoneNumber/',\r\n data: { '': $state.params.userId }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\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 $scope.profile.PrimaryPhoneNumber = '';\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function validate() {\r\n var valid = true;\r\n var matched;\r\n var regexp = '';\r\n\r\n if (!$scope.profile.Email) {\r\n $scope.emailError = true;\r\n valid = false;\r\n }\r\n else {\r\n // if input type is 'email' then the validation below is not required because when \r\n // format is wrong the value will be empty, but i decided to leave this check for the case\r\n // if someone will decide to change input type to text and forgot to add custom validation\r\n regexp = /^(([^<>()[\\]\\\\.,;:\\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 matched = regexp.test($scope.profile.Email);\r\n if (!matched) {\r\n $scope.invalidEmailError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n // For some companies Mailing Address is not editable. Then there is nothing else to validate.\r\n if ($scope.mailingAddressDisabled)\r\n return valid;\r\n\r\n //\r\n if ($scope.profile.POBox) {\r\n if ($scope.profile.HouseNumber) {\r\n $scope.houseNumberPOBoxFilledError = true;\r\n valid = false;\r\n }\r\n\r\n if ($scope.profile.AddressLine) {\r\n $scope.oddStreetError = true;\r\n valid = false;\r\n }\r\n }\r\n else\r\n {\r\n if (!$scope.profile.HouseNumber) {\r\n $scope.houseNumberPOBoxEmptyError = true;\r\n valid = false;\r\n }\r\n\r\n if (!$scope.profile.AddressLine) {\r\n $scope.streetError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n if (!$scope.houseNumberPOBoxFilledError && !$scope.houseNumberPOBoxEmptyError) {\r\n regexp = /^[0-9]+$/;\r\n if ($scope.profile.HouseNumber) {\r\n matched = regexp.test($scope.profile.HouseNumber);\r\n if (!matched) {\r\n $scope.invalidHouseNumberError = true;\r\n valid = false;\r\n }\r\n } else {\r\n matched = regexp.test($scope.profile.POBox);\r\n if (!matched) {\r\n $scope.invalidPOBoxError = true;\r\n valid = false;\r\n }\r\n }\r\n }\r\n //\r\n if (!$scope.profile.City) {\r\n $scope.cityError = true;\r\n valid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]+(?:[\\s-][a-zA-Z]+)*$/;\r\n matched = regexp.test($scope.profile.City);\r\n if (!matched) {\r\n $scope.invalidCityError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n //\r\n if (!$scope.profile.State) {\r\n $scope.stateError = true;\r\n valid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]{2}$/;\r\n matched = regexp.test($scope.profile.State);\r\n if (!matched) {\r\n $scope.invalidStateError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n //\r\n if (!$scope.profile.Zip) {\r\n $scope.zipError = true;\r\n valid = false;\r\n }\r\n else {\r\n matched = Config.zipCodeRegexp.test($scope.profile.Zip);\r\n if (!matched) {\r\n $scope.zipFormatError = true;\r\n valid = false;\r\n }\r\n }\r\n\r\n return valid;\r\n }\r\n }]);\r\n\r\napp.controller('AvatarsController', ['$scope', '$http', '$state', 'avatarsService',\r\n 'usSpinnerService', 'LeftMenuService', 'CommonHeaderService', '$stateParams',\r\n function ($scope, $http, $state, avatarsService, usSpinnerService, LeftMenuService, CommonHeaderService, $stateParams) {\r\n\r\n CommonHeaderService.setUpBackButton('Profile', true);\r\n $scope.selectedImage = avatarsService.getCurrentAvatar();\r\n $scope.errors = [];\r\n \r\n $scope.loadAvatars = function ()\r\n {\r\n $scope.avatars = avatarsService.getAvatars();\r\n if ($scope.avatars && $scope.avatars.length > 0)\r\n return;\r\n \r\n usSpinnerService.spin('spinner-1');\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var userData = { accountNumber: accountNumber };\r\n\r\n $http({\r\n url: apiUrl + 'api/Profile/GetAvatars/',\r\n method: \"GET\",\r\n params: userData\r\n }).success(function (data) {\r\n if (data.length > 0)\r\n {\r\n var avatars = data.map(function (imageUrl) {\r\n return apiUrl + imageUrl;\r\n });\r\n avatarsService.setAvatars(avatars);\r\n $scope.avatars = avatars;\r\n }\r\n\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $scope.errors.push({ Message: $scope._t(\"Server error. Try again later.\") });\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function getValidAvatarPath() {\r\n var length = localStorage.getItem('ApiUrl').length;\r\n var path = $scope.selectedImage.slice(length);\r\n return path;\r\n };\r\n\r\n $scope.selectAvatar = function (index)\r\n {\r\n $scope.selectedImage = $scope.avatars[index];\r\n var avatarPath = getValidAvatarPath();\r\n var avatarData = { path: avatarPath };\r\n utilli.addUserName($state, avatarData);\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Profile/UpdateAvatar/',\r\n method: \"POST\",\r\n params: avatarData\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n if (data == 'success') {\r\n avatarsService.setCurrentAvatar($scope.selectedImage);\r\n LeftMenuService.avatar = $scope.selectedImage;\r\n $state.goMainLayout(getBackStateName());\r\n return;\r\n }\r\n $scope.errors.push({ Message: data });\r\n }).error(function () {\r\n usSpinnerService.spin('spinner-1');\r\n $scope.errors.push({ Message: $scope._t(\"Server error. Try again later.\") });\r\n });\r\n };\r\n\r\n function getBackStateName() {\r\n var result = 'Profile';\r\n if ($stateParams.forAgent)\r\n result = 'AgentProfile';\r\n else if ($stateParams.forPropertyManager)\r\n result = 'PropertyManagerProfile';\r\n return result;\r\n }\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OutageCenterController',\r\n['$scope', '$state', 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'usSpinnerService',\r\n 'GetAccountsService', '$http', 'ServiceProvidersService', '$stateParams',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, ModalServiceExt, usSpinnerService,\r\n GetAccountsService, $http, ServiceProvidersService, $stateParams) {\r\n\r\n LeftMenuService.setCurrentTab('OutageCenter');\r\n CommonHeaderService.setUpBackButton($scope._t('Outage Center'), true);\r\n\r\n $scope.outageMapDescription = $scope._t('View a map displaying all currently reported outages.');\r\n $scope.outageListDescription = $scope._t('View a list of all currently reported outages.');\r\n $scope.outageSafetyDescription = $scope._t('View important outage safety information and severe weather planning tips.');\r\n $scope.outageHistoryDescription = $scope._t('View your previously reported outages and information about them.');\r\n\r\n $scope.anonymous = $stateParams.anonymous;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var apiUrl = '';\r\n if ($scope.anonymous) {\r\n ServiceProvidersService.getProviderApiUrl().then(function (result) {\r\n if (!result) {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n return;\r\n }\r\n\r\n apiUrl = result;\r\n getOutagesStatistic();\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n });\r\n } else {\r\n apiUrl = localStorage.getItem('ApiUrl');\r\n getOutagesStatistic();\r\n }\r\n\r\n function getOutagesStatistic() {\r\n\r\n var url = apiUrl + 'api/Outages/GetOutagesStatistic/';\r\n $http({\r\n method: 'GET',\r\n url: url\r\n })\r\n .success(function (result) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n $scope.reportsCount = result.Data.Count;\r\n $scope.avgRestorationHours = result.Data.AverageRestorationTime.Hours;\r\n $scope.hoursAbbreviation = 'h';\r\n $scope.avgRestorationMins = result.Data.AverageRestorationTime.Minutes;\r\n $scope.minutesAbbreviation = 'm';\r\n })\r\n .error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.outageMap = function () {\r\n if ($scope.anonymous)\r\n $state.go('TopMenuLayout.OutageMap', { anonymous: true });\r\n else\r\n $state.goMainLayout('OutageMap');\r\n }\r\n\r\n $scope.outageList = function () {\r\n if ($scope.anonymous)\r\n $state.go('TopMenuLayout.OutageList', { anonymous: true });\r\n else\r\n $state.goMainLayout('OutageList');\r\n }\r\n\r\n $scope.outageSafety = function () {\r\n if ($scope.anonymous)\r\n $state.go('TopMenuLayout.OutageSafety', { anonymous: true });\r\n else\r\n $state.goMainLayout('OutageSafety');\r\n }\r\n\r\n $scope.outageHistory = function () {\r\n $state.goMainLayout('OutageHistory');\r\n }\r\n }\r\n]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OutageMapController', ['$scope', '$state', 'LeftMenuService', 'CommonHeaderService',\r\n '$http', 'ModalServiceExt', 'usSpinnerService', '$timeout', '$stateParams', 'ServiceProvidersService', 'OutagesService',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService,\r\n $http, ModalServiceExt, usSpinnerService, $timeout, $stateParams, ServiceProvidersService, OutagesService) {\r\n LeftMenuService.setCurrentTab('OutageMap');\r\n CommonHeaderService.setUpBackButton($scope._t('Outage Map'), true);\r\n\r\n $scope.anonymous = $stateParams.anonymous;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var mapOptions = {\r\n zoom: 8,\r\n center: new google.maps.LatLng(38.967576, -77.077550),\r\n mapTypeId: google.maps.MapTypeId.ROADMAP,\r\n mapTypeControl: false,\r\n streetViewControl: false,\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition.RIGHT_TOP\r\n }\r\n }\r\n\r\n $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions);\r\n adjustSize();\r\n var geocoder = new google.maps.Geocoder();\r\n\r\n var apiUrl = '';\r\n if ($scope.anonymous) {\r\n ServiceProvidersService.getProviderApiUrl().then(function (result) {\r\n if (!result) {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n return;\r\n }\r\n\r\n apiUrl = result;\r\n getOutages();\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n });\r\n }\r\n else {\r\n apiUrl = localStorage.getItem('ApiUrl');\r\n getOutages();\r\n }\r\n\r\n function getOutages() {\r\n\r\n var url = apiUrl + 'api/Outages/GetOutagesForMap/';\r\n $scope.outages = [];\r\n $http({\r\n method: 'GET',\r\n url: url\r\n }).success(function (result) {\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n adjustSize();\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n if (result.Data && result.Data.length === 0) {\r\n adjustSize();\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n $scope.outages = result.Data;\r\n $scope.outages.forEach(function (outage, index) {\r\n\r\n var location = { lat: outage.Coordinate.Latitude, lng: outage.Coordinate.Longitude };\r\n var marker = new google.maps.Marker({\r\n map: $scope.map,\r\n position: location,\r\n title: outage.Location\r\n });\r\n var icon = $scope.getIcon(outage.Status);\r\n marker.setIcon(icon);\r\n marker.addListener('click', function () {\r\n markerClicked(marker, outage);\r\n });\r\n\r\n if (index === $scope.outages.length - 1) {\r\n adjustSize();\r\n $scope.map.setCenter(location);\r\n usSpinnerService.stop('spinner-1');\r\n }\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 $scope.closeOutageDetails = function (e) {\r\n OutagesService.common.closeDetails();\r\n $scope.selectedOutages = [];\r\n $scope.selectedOutage = null;\r\n\r\n if (e)\r\n e.stopPropagation();\r\n }\r\n\r\n $scope.currentOutage = null; \r\n\r\n $scope.panelClicked = function (e, outage) {\r\n e.stopPropagation();\r\n OutagesService.big.handleClick(outage);\r\n }\r\n \r\n $scope.next = function () {\r\n OutagesService.small.next();\r\n }\r\n\r\n $scope.previous = function () {\r\n OutagesService.small.previous();\r\n }\r\n\r\n $scope.disablePrevious = function () {\r\n return OutagesService.small.disablePrevious();\r\n }\r\n\r\n $scope.disableNext = function () {\r\n return OutagesService.small.disableNext();\r\n }\r\n\r\n $scope.addressClicked = function () {\r\n OutagesService.small.addressClicked();\r\n }\r\n\r\n function displayDetails(outages) {\r\n outages = _.sortBy(outages, function (o) { return o.CreatedOn; }).reverse();\r\n $scope.selectedOutages = outages;\r\n OutagesService.common.init(outages, function (outage) { $scope.currentOutage = outage; });\r\n OutagesService.common.displayDetails();\r\n }\r\n\r\n function loadImagesAndDisplay(selectedOutages, withoutImage) {\r\n var ids = _.map(withoutImage, function (outage) { return outage.Id });\r\n var url = apiUrl + 'api/Outages/GetOutageImages/';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: { 'ids': ids }\r\n })\r\n .success(function (result) {\r\n if (result.Errors && result.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n if (!result.Data || result.Data.length === 0) {\r\n usSpinnerService.stop('spinner-1');\r\n displayDetails(selectedOutages);\r\n return;\r\n }\r\n\r\n _.each(result.Data, function (data) {\r\n var outage = _.find(selectedOutages, { 'Id': data.Id });\r\n if (outage)\r\n outage.Image = data.Image;\r\n });\r\n displayDetails(selectedOutages);\r\n usSpinnerService.stop('spinner-1');\r\n })\r\n .error(function (error) {\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function markerClicked(marker, outage) {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.map.setCenter(marker.getPosition());\r\n\r\n var selectedOutages = _.filter($scope.outages, function (o) {\r\n return o.Coordinate.Latitude === outage.Coordinate.Latitude && o.Coordinate.Longitude === outage.Coordinate.Longitude;\r\n });\r\n var withoutImage = _.where(selectedOutages, { Image: null });\r\n if (withoutImage.length > 0) {\r\n loadImagesAndDisplay(selectedOutages, withoutImage);\r\n return;\r\n }\r\n\r\n $timeout(function () {\r\n displayDetails(selectedOutages);\r\n usSpinnerService.stop('spinner-1');\r\n }, 100);\r\n }\r\n\r\n google.maps.event.addDomListener(window, \"resize\", function () {\r\n var center = $scope.map.getCenter();\r\n google.maps.event.trigger($scope.map, \"resize\");\r\n $scope.map.setCenter(center);\r\n adjustSize();\r\n });\r\n\r\n $scope.reportOutage = function () {\r\n\r\n if ($scope.anonymous) {\r\n\r\n ModalServiceExt.showLoginRequired(\r\n $scope._t('Login Required'),\r\n $scope._t(\"It's required to log in for reporting an outage\"),\r\n function () { $state.goToSignInWithRedirectTo('MainLayout.OutageMap') },\r\n function () { $state.goTopMenuLayout('SignUp.Step1') });\r\n\r\n return;\r\n }\r\n\r\n $state.goMainLayout('ReportOutage');\r\n };\r\n\r\n $scope.getIcon = function (status) {\r\n return OutagesService.common.getStatusIcon(status);\r\n }\r\n\r\n function adjustSize() {\r\n var mapElement = $('#map');\r\n var contentContainerHeight = $('.y-scrollable').innerHeight();\r\n var containerOtherElemententsHeight = mapElement[0].getBoundingClientRect().top - $('.y-scrollable')[0].getBoundingClientRect().top;\r\n var height = contentContainerHeight - containerOtherElemententsHeight - 1;\r\n mapElement.height(height);\r\n }\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('ReportOutageController', ['$scope', '$state', '$stateParams', 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt',\r\n 'usSpinnerService', 'GetAccountsService', '$http', 'outageReportDataService', 'outageMyLocationService', '$timeout',\r\n function ($scope, $state, $stateParams, LeftMenuService, CommonHeaderService, ModalServiceExt,\r\n usSpinnerService, GetAccountsService, $http, outageReportDataService, outageMyLocationService, $timeout) {\r\n\r\n LeftMenuService.show();\r\n CommonHeaderService.setUpBackButton($scope._t('Report Outage'));\r\n LeftMenuService.setCurrentTab('ReportOutage');\r\n $scope.isLocationServiceTurnOff = false;\r\n $scope.isMobileOrRipple = isMobileOrRipple();\r\n $scope.data = outageReportDataService.getEmptyData();\r\n $scope.errors = $scope.data.errors;\r\n\r\n if($scope.isMobileOrRipple)\r\n cordova.plugins.locationAccuracy.canRequest(function(canRequest){\r\n $scope.isLocationServiceTurnOff = canRequest;\r\n });\r\n\r\n function getUtillityTypes() {\r\n return [\r\n { val: 'Street Light', translated: $scope._t('Street Light') },\r\n { val: 'Fire Hydrant', translated: $scope._t('Fire Hydrant') },\r\n { val: 'Sewer', translated: $scope._t('Sewer') },\r\n { val: 'Gas', translated: $scope._t('Gas') },\r\n { val: 'Water', translated: $scope._t('Water') },\r\n { val: 'Electricity', translated: $scope._t('Electricity') },\r\n { val: 'Other', translated: $scope._t('Other') }\r\n ];\r\n };\r\n\r\n function getCurrentUtillityType() {\r\n\r\n var utillityTypes = getUtillityTypes();\r\n var utilliType = localStorage.getItem('CurrentUtilityType');\r\n if (utilliType) {\r\n var currentType = _.find(utillityTypes, function (type) { return type.val === utilliType; });\r\n return currentType;\r\n }\r\n\r\n return utillityTypes[0];\r\n }\r\n\r\n $scope.utillityTypes = getUtillityTypes();\r\n $scope.selectedUtillityType = getCurrentUtillityType();\r\n\r\n $scope.locations = [];\r\n $scope.selectedLocation = '';\r\n\r\n usSpinnerService.spin('spinner-1');\r\n GetAccountsService.getAccounts(true).then(function (response) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0].Message);\r\n return;\r\n }\r\n\r\n response.Accounts.forEach(function(account) {\r\n var accountAddress = { accountNumber: account.AccountNumber, serviceAddress: account.ServiceAddress, state: 'ServiceAddress' };\r\n $scope.locations.push(accountAddress);\r\n if (account.IsDefault)\r\n $scope.selectedLocation = accountAddress;\r\n });\r\n\r\n $scope.locations.push({ accountNumber: null, serviceAddress: $scope._t('Nearby Address'), state: 'NearbyAddress' });\r\n $scope.locations.push({ accountNumber: null, serviceAddress: $scope._t('Nearby Cross Street'), state: 'NearbyCrossStreet' });\r\n $scope.locations.push({ accountNumber: null, serviceAddress: $scope._t('My Location'), state: 'MyLocation' });\r\n }).catch(function (e) {\r\n usSpinnerService.stop('spinner-1');\r\n console.log(e);\r\n });\r\n\r\n $scope.$watch('image', function () {\r\n if ($scope.image === $scope.data.image)\r\n return;\r\n\r\n if (!$scope.image) {\r\n $scope.data.image = null;\r\n return;\r\n }\r\n\r\n var reader = new FileReader();\r\n reader.onload = function (loadEvent) {\r\n $scope.data.image = loadEvent.target.result;\r\n var container = $('#imageContainer' + $scope.selectedLocation.state);\r\n container.css('background-image', 'url(' + $scope.data.image + ')');\r\n }\r\n reader.readAsDataURL($scope.image);\r\n });\r\n\r\n $scope.setCurrentLocation = function (notCached) { \r\n usSpinnerService.spin('spinner-1');\r\n if($scope.map && !notCached){\r\n usSpinnerService.stop('spinner-1'); \r\n return;\r\n }\r\n cordova.plugins.locationAccuracy.canRequest(function(canRequest){\r\n $scope.isLocationServiceTurnOff = canRequest;\r\n });\r\n $timeout(function () {// $timeout - to fix issue related to google maps (it doesn't appear)\r\n $scope.map = outageMyLocationService.getMap('myLocationMap');\r\n outageMyLocationService.setCurrentLocation($scope.map, $scope.data, function (rejected) { \r\n $timeout(function () { // $timeout - to smooth location changing \r\n if(rejected) //because cordova.plugins.locationAccuracy.canRequest always return true for android (v2.2.1) \r\n {\r\n usSpinnerService.stop('spinner-1'); \r\n $scope.isLocationServiceTurnOff = true;\r\n $scope.$apply();\r\n }\r\n else\r\n cordova.plugins.locationAccuracy.canRequest(function(canRequest){\r\n usSpinnerService.stop('spinner-1'); \r\n $scope.isLocationServiceTurnOff = isAndroid() ? !canRequest : canRequest;\r\n $scope.$apply();\r\n });\r\n }, 500);\r\n });\r\n }, 0);\r\n }\r\n\r\n $scope.locationChanged = function () {\r\n $scope.data.clear();\r\n $scope.image = null;\r\n $scope.data.clearErrors();\r\n\r\n if (!$scope.selectedLocation)\r\n return;\r\n\r\n if ($scope.selectedLocation.state === 'MyLocation')\r\n $scope.setCurrentLocation();\r\n }\r\n\r\n function validateServiceAddress() {\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function validateNearbyAddress() {\r\n var isValid = true;\r\n\r\n if (!$scope.data.houseNumber) {\r\n $scope.data.errors.houseNumberEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n if (!$scope.data.street) {\r\n $scope.data.errors.streetEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n var regexp;\r\n var matched;\r\n if (!$scope.data.city) {\r\n $scope.data.errors.cityEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]+(?:[\\s-][a-zA-Z]+)*$/;\r\n matched = regexp.test($scope.data.city);\r\n if (!matched) {\r\n $scope.data.errors.invalidCityError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.state) {\r\n $scope.data.errors.stateEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]{2}$/;\r\n matched = regexp.test($scope.data.state);\r\n if (!matched) {\r\n $scope.data.errors.invalidStateError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.zip) {\r\n $scope.data.errors.zipEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^(\\d{5})?$|^$|^(\\d{5}-\\d{4})?$/;\r\n matched = regexp.test($scope.data.zip);\r\n if (!matched) {\r\n $scope.data.errors.invalidZipError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n function validateNearbyCrossStreet() {\r\n var isValid = true;\r\n\r\n if (!$scope.data.street || !$scope.data.street2) {\r\n $scope.data.errors.streetEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n var regexp;\r\n var matched;\r\n if (!$scope.data.city) {\r\n $scope.data.errors.cityEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]+(?:[\\s-][a-zA-Z]+)*$/;\r\n matched = regexp.test($scope.data.city);\r\n if (!matched) {\r\n $scope.data.errors.invalidCityError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.state) {\r\n $scope.data.errors.stateEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]{2}$/;\r\n matched = regexp.test($scope.data.state);\r\n if (!matched) {\r\n $scope.data.errors.invalidStateError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.zip) {\r\n $scope.data.errors.zipEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^(\\d{5})?$|^$|^(\\d{5}-\\d{4})?$/;\r\n matched = regexp.test($scope.data.zip);\r\n if (!matched) {\r\n $scope.data.errors.invalidZipError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n function validateMyLocation() {\r\n var isValid = true;\r\n\r\n if (!$scope.data.lat || !$scope.data.lng) {\r\n $scope.data.errors.wrongLocation = true;\r\n isValid = false;\r\n }\r\n\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n function validate() {\r\n if (!$scope.selectedLocation)\r\n return false;\r\n\r\n if ($scope.selectedLocation.state === $scope._t('ServiceAddress'))\r\n return validateServiceAddress();\r\n else if ($scope.selectedLocation.state === $scope._t('NearbyAddress'))\r\n return validateNearbyAddress();\r\n else if ($scope.selectedLocation.state === $scope._t('NearbyCrossStreet'))\r\n return validateNearbyCrossStreet();\r\n else\r\n return validateMyLocation();\r\n }\r\n\r\n function clearErrors() {\r\n $scope.data.clearErrors();\r\n }\r\n\r\n function isServiceAddressSelected() {\r\n return $scope.selectedLocation.state === 'ServiceAddress';\r\n }\r\n\r\n function isNearbyAddressSelected() {\r\n return $scope.selectedLocation.state === 'NearbyAddress';\r\n }\r\n\r\n function isNearbyCrossStreetSelected() {\r\n return $scope.selectedLocation.state === 'NearbyCrossStreet';\r\n }\r\n\r\n function isMyLocationSelected() {\r\n return $scope.selectedLocation.state === 'MyLocation';\r\n }\r\n\r\n function collectDataAndSend() {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n if (isMyLocationSelected()) {\r\n var geoLocation = {\r\n Latitude: $scope.data.lat,\r\n Longitude: $scope.data.lng\r\n };\r\n var data = {\r\n UtillityType: $scope.selectedUtillityType.val,\r\n OutageLocation: $scope.selectedLocation.state,\r\n ContractAccount: null,\r\n Description: $scope.data.problemDescription,\r\n Address: null,\r\n Coordinate: geoLocation,\r\n Image: $scope.data.image\r\n }\r\n sendReport(data);\r\n } else {\r\n var position = '';\r\n var address = null;\r\n if (isServiceAddressSelected()) {\r\n position = $scope.selectedLocation.serviceAddress;\r\n } else {\r\n position = $scope.data.getPosition($scope.selectedLocation.state);\r\n address = $scope.data.getAddress($scope.selectedLocation.state);\r\n }\r\n\r\n var geocoder = new google.maps.Geocoder();\r\n geocoder.geocode({ 'address': position }, function (results, status) {\r\n\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n var googleLocation = results[0].geometry.location;\r\n var latitude = parseFloat(googleLocation.lat());\r\n var longitude = parseFloat(googleLocation.lng());\r\n var geoLocation = { Latitude: latitude, Longitude: longitude };\r\n\r\n var data = {\r\n UtillityType: $scope.selectedUtillityType.val,\r\n OutageLocation: $scope.selectedLocation.state,\r\n ContractAccount: $scope.selectedLocation.accountNumber,\r\n Description: $scope.data.problemDescription,\r\n Address: address,\r\n Coordinate: geoLocation,\r\n Image: $scope.data.image\r\n }\r\n sendReport(data);\r\n } else {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError($scope._t('Can not get address coordinates.'));\r\n }\r\n });\r\n }\r\n }\r\n\r\n $scope.report = function () {\r\n clearErrors();\r\n\r\n if (!validate())\r\n return;\r\n\r\n collectDataAndSend();\r\n };\r\n\r\n function sendReport(data) {\r\n var url = localStorage.getItem('ApiUrl') + 'api/Outages/CreateOutageReport/';\r\n\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: data\r\n })\r\n .success(function (result) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showInfo(\r\n $scope._t('Outage was successfuly reported.'),\r\n function() {\r\n $scope.data.clear();\r\n $state.goMainLayout('OutageMap');\r\n });\r\n })\r\n .error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error);\r\n });\r\n };\r\n\r\n $scope.back = function () {\r\n $state.goMainLayout('OutageMap');\r\n };\r\n\r\n }])\r\n.directive(\"fileUpload\", [function () {\r\n return {\r\n scope: {\r\n fileUpload: '='\r\n },\r\n link: function (scope, element, attributes) {\r\n element.bind(\"change\", function (changeEvent) {\r\n scope.$apply(function () {\r\n scope.fileUpload = changeEvent.target.files[0];\r\n });\r\n });\r\n }\r\n }\r\n}]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .service('outageReportDataService', function () {\r\n\r\n function getReportData(report) {\r\n var data = this.getEmptyData();\r\n if (report.Address) {\r\n data.houseNumber = report.Address.HouseNumber;\r\n data.street = report.Address.AddressLine;\r\n data.street2 = report.Address.AddressLine2;\r\n data.city = report.Address.City;\r\n data.state = report.Address.State;\r\n data.zip = report.Address.Zip;\r\n }\r\n\r\n if (report.Coordinate) {\r\n data.lat = report.Coordinate.Latitude;\r\n data.lng = report.Coordinate.Longitude;\r\n }\r\n\r\n data.problemDescription = report.Description;\r\n data.image = report.Image;\r\n data.contractAccount = report.ContractAccount;\r\n return data;\r\n }\r\n\r\n function getEmptyData() {\r\n return {\r\n houseNumber: '',\r\n street: '',\r\n street2: '',\r\n city: '',\r\n state: '',\r\n zip: '',\r\n problemDescription: '',\r\n image: null,\r\n contractAccount: '',\r\n lat: 0,\r\n lng: 0,\r\n getPosition: function (location) {\r\n if (location === 'NearbyAddress') {\r\n return this.houseNumber + ' ' + this.street + ' ' + this.city + ' ' + this.state + ' ' + this.zip;\r\n } else if (location === 'NearbyCrossStreet') {\r\n // to get geocode for cross street we should use request format: [StreetName A & StreetName B, City].\r\n // http://www.nodalbits.com/bits/google-maps-intersections/\r\n return this.street + ' & ' + this.street2 + ', ' + this.city + ' ' + this.state + ' ' + this.zip;\r\n } else return '';\r\n },\r\n getAddress: function (location) {\r\n if (location === 'NearbyAddress') {\r\n return {\r\n HouseNumber: this.houseNumber,\r\n HouseNoSupplement: this.unit,\r\n AddressLine: this.street,\r\n City: this.city,\r\n State: this.state,\r\n Zip: this.zip\r\n }\r\n } else if (location === 'NearbyCrossStreet') {\r\n return {\r\n AddressLine: this.street,\r\n AddressLine2: this.street2,\r\n City: this.city,\r\n State: this.state,\r\n Zip: this.zip\r\n }\r\n } else return null;\r\n },\r\n clear: function () {\r\n this.houseNumber = '';\r\n this.street = '';\r\n this.street2 = '';\r\n this.city = '';\r\n this.state = '';\r\n this.zip = '';\r\n this.problemDescription = '';\r\n this.image = null;\r\n this.contractAccount = '';\r\n this.lat = 0;\r\n this.lng = 0;\r\n },\r\n clearExcept: function (location) {\r\n if (location === 'ServiceAddress') {\r\n this.houseNumber = '';\r\n this.street = '';\r\n this.street2 = '';\r\n this.city = '';\r\n this.state = '';\r\n this.zip = '';\r\n this.lat = 0;\r\n this.lng = 0;\r\n } else if (location === 'NearbyAddress') {\r\n this.street2 = '';\r\n this.contractAccount = '';\r\n this.lat = 0;\r\n this.lng = 0;\r\n } else if (location === 'NearbyCrossStreet') {\r\n this.houseNumber = '';\r\n this.contractAccount = '';\r\n this.lat = 0;\r\n this.lng = 0;\r\n } else {\r\n this.houseNumber = '';\r\n this.street = '';\r\n this.street2 = '';\r\n this.city = '';\r\n this.state = '';\r\n this.zip = '';\r\n this.contractAccount = '';\r\n }\r\n },\r\n errors: {\r\n houseNumberEmptyError: false,\r\n streetEmptyError: false,\r\n cityEmptyError: false,\r\n invalidCityError: false,\r\n stateEmptyError: false,\r\n invalidStateError: false,\r\n zipEmptyError: false,\r\n invalidZipError: false,\r\n descriptionEmptyError: false,\r\n wrongLocation: false\r\n },\r\n clearErrors: function () {\r\n this.errors.houseNumberEmptyError = false;\r\n this.errors.streetEmptyError = false;\r\n this.errors.cityEmptyError = false;\r\n this.errors.invalidCityError = false;\r\n this.errors.stateEmptyError = false;\r\n this.errors.invalidStateError = false;\r\n this.errors.zipEmptyError = false;\r\n this.errors.invalidZipError = false;\r\n this.errors.descriptionEmptyError = false;\r\n this.errors.wrongLocation = false;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n getEmptyData: getEmptyData,\r\n getReportData: getReportData\r\n }\r\n });\n'use strict';\r\nangular.module('utilliApp')\r\n .service('outageMyLocationService', ['ModalServiceExt', 'usSpinnerService', function (ModalServiceExt, usSpinnerService) {\r\n\r\n function getMap(elementId) {\r\n var mapOptions = {\r\n zoom: 15,\r\n center: new google.maps.LatLng(38.967576, -77.077550),//Chevy Chase, Bethesda\r\n mapTypeId: google.maps.MapTypeId.ROADMAP,\r\n mapTypeControl: false,\r\n streetViewControl: false,\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition.RIGHT_TOP\r\n }\r\n }\r\n\r\n return new google.maps.Map(document.getElementById(elementId), mapOptions);\r\n }\r\n\r\n function setLocation(googleMap, lat, lng) {\r\n var latLng = new google.maps.LatLng(lat, lng);\r\n new google.maps.Marker({\r\n map: googleMap,\r\n position: latLng\r\n });\r\n googleMap.setCenter(latLng);\r\n }\r\n\r\n function setCurrentLocation(googleMap, data, fnCallback) {\r\n navigator.geolocation.getCurrentPosition(function (location) {\r\n var latLng = new google.maps.LatLng(location.coords.latitude, location.coords.longitude);\r\n new google.maps.Marker({\r\n map: googleMap,\r\n position: latLng\r\n });\r\n googleMap.setCenter(latLng);\r\n data.lat = latLng.lat();\r\n data.lng = latLng.lng();\r\n if(fnCallback)\r\n fnCallback();\r\n }, function (error) {\r\n if(fnCallback)\r\n fnCallback();\r\n console.log(error);\r\n if(error.code == 1)\r\n ModalServiceExt.showError(utilli._t('Permission denied.'));\r\n else if(error.code == 3)\r\n ModalServiceExt.showError(utilli._t('Position retrieval timed out (30 seconds). Please try later again.'));\r\n else\r\n ModalServiceExt.showError(utilli._t('Can not get current position. Please try later again.'));\r\n },\r\n {\r\n maximumAge: 0,\r\n // timeout is mandatory here. otherwise error function will not be called in case an error.\r\n timeout: 30000,\r\n enableHighAccuracy: true\r\n });\r\n }\r\n\r\n document.addEventListener(\"resume\", onResume, false);\r\n function onResume() {\r\n if(isAndroid()){\r\n localStorage.removeItem(\"lastLocationServiceStatus\");\r\n return;\r\n }\r\n setTimeout(function() {\r\n handleNewLocationServiceStatus();\r\n }, 0);\r\n }\r\n\r\n function handleNewLocationServiceStatus () {\r\n if(utilli.localStorageItemNotNull(\"lastLocationServiceStatus\"))\r\n {\r\n var lastStatus = localStorage.getItem(\"lastLocationServiceStatus\");\r\n var turnOnStatus = \"0\";\r\n cordova.plugins.locationAccuracy.canRequest(function(canRequest){\r\n if(lastStatus != turnOnStatus && canRequest.toString() != lastStatus){\r\n var reportOutageControllerScope = angular.element(document.getElementById('selectedLocation')).scope();\r\n reportOutageControllerScope.setCurrentLocation(true);\r\n }\r\n localStorage.removeItem(\"lastLocationServiceStatus\")\r\n });\r\n } \r\n }\r\n\r\n function requestAcuracyAndSetPosition(googleMap, data, fnCallback) {\r\n if (isMobileOrRipple()) {\r\n function onRequestSuccess(success) {\r\n if(isAndroid())\r\n setCurrentLocation(googleMap, data, fnCallback);\r\n else if(fnCallback)\r\n fnCallback();\r\n console.log(\"Location request successful\");\r\n }\r\n\r\n function onRequestFailure(error) {\r\n console.error(\"Request failed\");\r\n if (error && error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED) {\r\n // Android only\r\n console.error(\"error code=\"+error.code+\"; error message=\"+error.message);\r\n if (window.confirm(utilli._t(\"Failed to set current location. Would you like to switch on Geolocation Service manually?\"))) {\r\n cordova.plugins.diagnostic.switchToLocationSettings();\r\n }\r\n }\r\n if(fnCallback)\r\n fnCallback(true);\r\n }\r\n\r\n cordova.plugins.locationAccuracy.canRequest(function(canRequest) {\r\n if(canRequest){\r\n localStorage.setItem(\"lastLocationServiceStatus\", canRequest);\r\n // this plugin check device's geolocation service is on. if not - ask the user to switch it on in the native popup.\r\n cordova.plugins.locationAccuracy.request(\r\n onRequestSuccess,\r\n onRequestFailure,\r\n cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);\r\n }\r\n else {\r\n setCurrentLocation(googleMap, data, fnCallback);\r\n }\r\n });\r\n\r\n } else {\r\n setCurrentLocation(googleMap, data, fnCallback);\r\n }\r\n }\r\n\r\n return {\r\n getMap: getMap,\r\n setCurrentLocation: requestAcuracyAndSetPosition,\r\n setLocation: setLocation\r\n }\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OutageListController',\r\n['$scope', '$state', 'LeftMenuService', 'CommonHeaderService', '$http', 'ModalServiceExt', 'usSpinnerService', 'GridService', '$stateParams', 'ServiceProvidersService',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, $http, ModalServiceExt, usSpinnerService, GridService, $stateParams, ServiceProvidersService) {\r\n\r\n CommonHeaderService.setUpBackButton($scope._t('Outage List'), true);\r\n LeftMenuService.setCurrentTab('OutageList');\r\n\r\n $scope.getScrollContainer = function () {\r\n return $state.includes('TopMenuLayout') ? '#screen' : '#panel';\r\n }\r\n\r\n $scope.outages = [];\r\n $scope.scrollInProcess = false;\r\n $scope.listFinished = false;\r\n var pageSize = 20;\r\n var apiUrl = '';\r\n\r\n $scope.getOutages = function () {\r\n \r\n usSpinnerService.spin(\"spinner-1\");\r\n\r\n if ($stateParams.anonymous) {\r\n ServiceProvidersService.getProviderApiUrl().then(function (result) {\r\n if (!result) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n return;\r\n }\r\n\r\n apiUrl = result;\r\n getOutagesInternal();\r\n },\r\n function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n });\r\n }\r\n else {\r\n apiUrl = localStorage.getItem('ApiUrl');\r\n getOutagesInternal();\r\n }\r\n \r\n }\r\n\r\n function getOutagesInternal() {\r\n\r\n if ($scope.scrollInProcess) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n return;\r\n }\r\n\r\n $scope.scrollInProcess = true;\r\n\r\n var dataRequest = {\r\n skip: $scope.outages.length,\r\n pageSize: pageSize\r\n };\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/Outages/GetOutagesPageable',\r\n params: dataRequest\r\n })\r\n .success(function (result) {\r\n\r\n usSpinnerService.stop(\"spinner-1\");\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n $scope.scrollInProcess = false;\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n Array.prototype.push.apply($scope.outages, result.Data);\r\n\r\n if (result.Data.length < pageSize)\r\n $scope.listFinished = true;\r\n\r\n $scope.scrollInProcess = false;\r\n })\r\n .error(function (error) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.scrollInProcess = false;\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.view = function(id) {\r\n if ($stateParams.anonymous)\r\n $state.go('TopMenuLayout.OpenOutageReport', { Id: id, mode: 'view', anonymous: true });\r\n else\r\n $state.goMainLayout('OpenOutageReport', { Id: id, mode: 'view' });\r\n }\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OutageListGridController',\r\n['$scope', '$state', 'LeftMenuService', 'CommonHeaderService', '$http', 'ModalServiceExt', 'usSpinnerService', 'GridService', '$stateParams', 'ServiceProvidersService',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, $http, ModalServiceExt, usSpinnerService, GridService, $stateParams, ServiceProvidersService) {\r\n\r\n LeftMenuService.setCurrentTab('OutageList');\r\n CommonHeaderService.setUpBackButton($scope._t('Outage List'), true);\r\n\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#outagesGrid\"));\r\n $(window).resize(function () {\r\n gridResizeFunc($scope.outagesKendoGrid);\r\n });\r\n\r\n var apiUrl = '';\r\n if ($stateParams.anonymous) {\r\n ServiceProvidersService.getProviderApiUrl().then(function (result) {\r\n if (!result) {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n return;\r\n }\r\n\r\n apiUrl = result;\r\n setupGridOptions();\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n });\r\n }\r\n else {\r\n apiUrl = localStorage.getItem('ApiUrl');\r\n setupGridOptions();\r\n }\r\n\r\n function setupGridOptions() {\r\n $scope.gridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: function (options) {\r\n var webapi = new kendo.data.transports.webapi({ prefix: \"\" });\r\n var params = webapi.parameterMap(options.data);\r\n var url = apiUrl + 'api/Outages/GetOutagesPageable';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.outagesKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\r\n });\r\n }\r\n },\r\n schema: { data: \"Data.PageData\", total: \"Data.Count\" },\r\n pageSize: 10,\r\n serverPaging: true,\r\n serverSorting: true,\r\n serverFiltering: true\r\n },\r\n resizable: true,\r\n sortable: false,\r\n filterable: false,\r\n pageable: {\r\n pageSize: 25,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n dataBound: function () { gridResizeFunc($scope.outagesKendoGrid); },\r\n columns: [\r\n {\r\n field: \"Location\",\r\n title: $scope._t('Address'),\r\n width: 100\r\n }, {\r\n field: \"Date\",\r\n title: $scope._t('Created On'),\r\n template: \"#= DisplayedCreatedOn #\",\r\n width: 100\r\n }, {\r\n field: \"StatusDisplayingName\",\r\n title: $scope._t('Status'),\r\n width: 70\r\n }, {\r\n field: \"UtillityType\",\r\n title: $scope._t('Type'),\r\n width: 40\r\n }, {\r\n title: $scope._t('Actions'),\r\n template: kendo.template($(\"#commands-template\").html()),\r\n width: \"50px\"\r\n }\r\n ]\r\n }\r\n }\r\n\r\n $scope.resizeGrid = function () {\r\n // timeout because grid size calculation should happen after action collapse finish it's animation\r\n setTimeout(function () {\r\n gridResizeFunc($scope.outagesKendoGrid);\r\n }, 1);\r\n };\r\n\r\n $scope.view = function (id) {\r\n if ($stateParams.anonymous)\r\n $state.go('TopMenuLayout.OpenOutageReport', { Id: id, mode: 'view', anonymous: true });\r\n else\r\n $state.goMainLayout('OpenOutageReport', { Id: id, mode: 'view' });\r\n };\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OutageHistoryController',\r\n['$scope', '$state', 'LeftMenuService', 'CommonHeaderService', '$http', 'ModalServiceExt', 'usSpinnerService', 'GridService', '$stateParams', 'ServiceProvidersService',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, $http, ModalServiceExt, usSpinnerService, GridService, $stateParams, ServiceProvidersService) {\r\n\r\n LeftMenuService.setCurrentTab('OutageCenter');\r\n CommonHeaderService.setUpBackButton($scope._t('Outage List'), true);\r\n\r\n usSpinnerService.spin(\"spinner-1\");\r\n\r\n $scope.outages = [];\r\n $scope.scrollInProcess = false;\r\n $scope.listFinished = false;\r\n var pageSize = 20;\r\n var apiUrl = '';\r\n\r\n $scope.getOutages = function () {\r\n\r\n usSpinnerService.spin(\"spinner-1\");\r\n\r\n if ($stateParams.anonymous) {\r\n ServiceProvidersService.getProviderApiUrl().then(function (result) {\r\n if (!result) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n return;\r\n }\r\n\r\n apiUrl = result;\r\n getOutagesInternal();\r\n },\r\n function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n });\r\n }\r\n else {\r\n apiUrl = localStorage.getItem('ApiUrl');\r\n getOutagesInternal();\r\n }\r\n\r\n }\r\n\r\n function getOutagesInternal() {\r\n\r\n if ($scope.scrollInProcess) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n return;\r\n }\r\n\r\n $scope.scrollInProcess = true;\r\n\r\n var dataRequest = {\r\n userName: utilli.getCurrentUserName(),\r\n skip: $scope.outages.length,\r\n pageSize: pageSize\r\n };\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/Outages/GetOutagesHistory',\r\n params: dataRequest\r\n })\r\n .success(function (result) {\r\n\r\n usSpinnerService.stop(\"spinner-1\");\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n $scope.scrollInProcess = false;\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n Array.prototype.push.apply($scope.outages, result.Data);\r\n\r\n if (result.Data.length < pageSize)\r\n $scope.listFinished = true;\r\n\r\n $scope.scrollInProcess = false;\r\n })\r\n .error(function (error) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.scrollInProcess = false;\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.edit = function (id) {\r\n $state.goMainLayout('OpenOutageReport', { Id: id, mode: 'edit' });\r\n }\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OutageHistoryGridController',\r\n['$scope', '$state', 'LeftMenuService', 'CommonHeaderService', '$http', 'ModalServiceExt', 'usSpinnerService', 'GridService',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, $http, ModalServiceExt, usSpinnerService, GridService) {\r\n\r\n LeftMenuService.setCurrentTab('OutageCenter');\r\n CommonHeaderService.setUpBackButton($scope._t('Outage History'), true);\r\n\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#outagesGrid\"));\r\n $(window)\r\n .resize(function () {\r\n gridResizeFunc($scope.outagesKendoGrid);\r\n });\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n $scope.gridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: function (options) {\r\n var webapi = new kendo.data.transports.webapi({ prefix: \"\" });\r\n var params = webapi.parameterMap(options.data);\r\n params.userName = utilli.getCurrentUserName();\r\n var url = apiUrl + 'api/Outages/GetOutagesHistory';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.outagesKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\r\n });\r\n }\r\n },\r\n schema: { data: \"Data.PageData\", total: \"Data.Count\" },\r\n pageSize: 10,\r\n serverPaging: true,\r\n serverSorting: true,\r\n serverFiltering: true\r\n },\r\n resizable: true,\r\n sortable: false,\r\n filterable: false,\r\n pageable: {\r\n pageSize: 25,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n dataBound: function () { gridResizeFunc($scope.outagesKendoGrid); },\r\n columns: [\r\n {\r\n field: \"Location\",\r\n title: $scope._t('Address'),\r\n width: 100\r\n }, {\r\n field: \"Date\",\r\n title: $scope._t('Created On'),\r\n template: \"#= DisplayedCreatedOn #\",\r\n width: 100\r\n }, {\r\n field: \"StatusDisplayingName\",\r\n title: $scope._t('Status'),\r\n width: 70\r\n }, {\r\n field: \"UtillityType\",\r\n title: $scope._t('Type'),\r\n width: 40\r\n }, {\r\n title: $scope._t('Actions'),\r\n template: kendo.template($(\"#commands-template\").html()),\r\n width: \"50px\"\r\n }\r\n ]\r\n }\r\n\r\n $scope.resizeGrid = function () {\r\n // timeout because grid size calculation should happen after action collapse finish it's animation\r\n setTimeout(function () {\r\n gridResizeFunc($scope.outagesKendoGrid);\r\n }, 1);\r\n };\r\n\r\n $scope.edit = function (id) {\r\n $state.goMainLayout('OpenOutageReport', { Id: id, mode: 'edit' });\r\n };\r\n\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OpenOutageReportController',\r\n['$scope', '$state', 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'usSpinnerService',\r\n 'GetAccountsService', '$http', '$stateParams', 'ServiceProvidersService', 'outageReportDataService', 'outageMyLocationService', '$timeout',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, ModalServiceExt, usSpinnerService,\r\n GetAccountsService, $http, $stateParams, ServiceProvidersService, outageReportDataService, outageMyLocationService, $timeout) {\r\n\r\n LeftMenuService.setCurrentTab('OutageCenter');\r\n \r\n $scope.editMode = $stateParams.mode === 'edit';\r\n if ($scope.editMode)\r\n CommonHeaderService.setUpBackButton($scope._t('Edit Outage Report'));\r\n else\r\n CommonHeaderService.setUpBackButton($scope._t('Outage Report'));\r\n\r\n if (!$stateParams.Id) {\r\n console.error('Outage report Id is empty.');\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.locations = [];\r\n $scope.selectedLocation = '';\r\n\r\n var apiUrl = '';\r\n if ($stateParams.anonymous) {\r\n ServiceProvidersService.getProviderApiUrl()\r\n .then(function(result) {\r\n if (!result) {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n return;\r\n }\r\n\r\n apiUrl = result;\r\n loadOutageReport();\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n });\r\n } else {\r\n apiUrl = localStorage.getItem('ApiUrl');\r\n loadOutageReport();\r\n }\r\n\r\n function loadOutageReport() {\r\n var url = apiUrl + 'api/Outages/GetOutageReport/';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: { id: $stateParams.Id }\r\n }).success(function (result) {\r\n if (result.Errors && result.Errors.length > 0) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n $scope.data = outageReportDataService.getReportData(result.Data.OutageReport);\r\n $scope.locations = result.Data.Locations;\r\n $scope.locations.push({ AccountNumber: null, Location: $scope._t('Nearby Address'), State: 'NearbyAddress' });\r\n $scope.locations.push({ AccountNumber: null, Location: $scope._t('Nearby Cross Street'), State: 'NearbyCrossStreet' });\r\n $scope.locations.push({ AccountNumber: null, Location: $scope._t('My Location'), State: 'MyLocation' });\r\n\r\n $scope.outageReport = result.Data.OutageReport;\r\n if ($scope.outageReport.DisplayedOutageLocation === 'ServiceAddress')\r\n $scope.selectedLocation = _.find($scope.locations, function (location) { return location.AccountNumber === $scope.outageReport.ContractAccount });\r\n else\r\n $scope.selectedLocation = _.find($scope.locations, function (location) { return location.State === $scope.outageReport.DisplayedOutageLocation });\r\n\r\n if ($scope.outageReport.DisplayedOutageLocation === 'MyLocation') {\r\n $scope.map = outageMyLocationService.getMap('myLocationMap');\r\n\r\n $timeout(function () {\r\n outageMyLocationService.setLocation(\r\n $scope.map,\r\n $scope.outageReport.Coordinate.Latitude,\r\n $scope.outageReport.Coordinate.Longitude);\r\n }, 300);\r\n }\r\n\r\n $scope.utillityTypes = result.Data.UtillityTypes;\r\n $scope.selectedUtillityType = $scope.outageReport.UtillityType;\r\n\r\n if ($scope.outageReport.Image)\r\n setImage();\r\n\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function setImage() {\r\n var container = $('#imageContainer' + $scope.selectedLocation.State);\r\n container.css('background-image', 'url(' + $scope.data.image + ')');\r\n }\r\n\r\n $scope.locationChanged = function () {\r\n $scope.data.clearExcept($scope.selectedLocation.State);\r\n if ($scope.data.image)\r\n setImage();\r\n $scope.data.clearErrors();\r\n\r\n if (!$scope.selectedLocation)\r\n return;\r\n\r\n if ($scope.selectedLocation.State === 'MyLocation') {\r\n if ($scope.map)\r\n return;\r\n\r\n $scope.map = outageMyLocationService.getMap('myLocationMap');\r\n if ($scope.outageReport.DisplayedOutageLocation === 'MyLocation') {\r\n $timeout(function () {\r\n outageMyLocationService.setLocation(\r\n $scope.map,\r\n $scope.outageReport.Coordinate.Latitude,\r\n $scope.outageReport.Coordinate.Longitude);\r\n }, 300);\r\n } else {\r\n $timeout(function () {\r\n outageMyLocationService.setCurrentLocation($scope.map, $scope.data);\r\n }, 300);\r\n }\r\n }\r\n }\r\n\r\n function clearErrors() {\r\n $scope.data.clearErrors();\r\n }\r\n\r\n function validateServiceAddress() {\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n \r\n $scope.wrongLocation = function () {\r\n $scope.selectedLocation = $scope.selectedLocation = _.find($scope.locations, function (location) { return location.State === 'NearbyAddress' });\r\n $scope.locationChanged();\r\n }\r\n\r\n function validateNearbyAddress() {\r\n var isValid = true;\r\n\r\n if (!$scope.data.houseNumber) {\r\n $scope.data.errors.houseNumberEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n if (!$scope.data.street) {\r\n $scope.data.errors.streetEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n var regexp;\r\n var matched;\r\n if (!$scope.data.city) {\r\n $scope.data.errors.cityEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]+(?:[\\s-][a-zA-Z]+)*$/;\r\n matched = regexp.test($scope.data.city);\r\n if (!matched) {\r\n $scope.data.errors.invalidCityError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.state) {\r\n $scope.data.errors.stateEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]{2}$/;\r\n matched = regexp.test($scope.data.state);\r\n if (!matched) {\r\n $scope.data.errors.invalidStateError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.zip) {\r\n $scope.data.errors.zipEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^(\\d{5})?$|^$|^(\\d{5}-\\d{4})?$/;\r\n matched = regexp.test($scope.data.zip);\r\n if (!matched) {\r\n $scope.data.errors.invalidZipError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n function validateNearbyCrossStreet() {\r\n var isValid = true;\r\n\r\n if (!$scope.data.street || !$scope.data.street2) {\r\n $scope.data.errors.streetEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n var regexp;\r\n var matched;\r\n if (!$scope.data.city) {\r\n $scope.data.errors.cityEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]+(?:[\\s-][a-zA-Z]+)*$/;\r\n matched = regexp.test($scope.data.city);\r\n if (!matched) {\r\n $scope.data.errors.invalidCityError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.state) {\r\n $scope.data.errors.stateEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^[a-zA-Z]{2}$/;\r\n matched = regexp.test($scope.data.state);\r\n if (!matched) {\r\n $scope.data.errors.invalidStateError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.zip) {\r\n $scope.data.errors.zipEmptyError = true;\r\n isValid = false;\r\n } else {\r\n regexp = /^(\\d{5})?$|^$|^(\\d{5}-\\d{4})?$/;\r\n matched = regexp.test($scope.data.zip);\r\n if (!matched) {\r\n $scope.data.errors.invalidZipError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n function validateMyLocation() {\r\n var isValid = true;\r\n\r\n if (!$scope.data.lat || !$scope.data.lng) {\r\n $scope.data.errors.wrongLocation = true;\r\n isValid = false;\r\n }\r\n\r\n if (!$scope.data.problemDescription) {\r\n $scope.data.errors.descriptionEmptyError = true;\r\n isValid = false;\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n function validate() {\r\n if (!$scope.selectedLocation)\r\n return false;\r\n\r\n if (isServiceAddressSelected())\r\n return validateServiceAddress();\r\n else if (isNearbyAddressSelected())\r\n return validateNearbyAddress();\r\n else if (isNearbyCrossStreetSelected())\r\n return validateNearbyCrossStreet();\r\n else\r\n return validateMyLocation();\r\n }\r\n\r\n function isServiceAddressSelected() {\r\n return $scope.selectedLocation.State === 'ServiceAddress';\r\n }\r\n\r\n function isNearbyAddressSelected() {\r\n return $scope.selectedLocation.State === 'NearbyAddress';\r\n }\r\n\r\n function isNearbyCrossStreetSelected() {\r\n return $scope.selectedLocation.State === 'NearbyCrossStreet';\r\n }\r\n\r\n function isMyLocationSelected() {\r\n return $scope.selectedLocation.State === 'MyLocation';\r\n }\r\n\r\n function collectDataAndSend() {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n if (isMyLocationSelected()) {\r\n var geoLocation = {\r\n Latitude: $scope.data.lat,\r\n Longitude: $scope.data.lng\r\n };\r\n var data = {\r\n Id: $scope.outageReport.Id,\r\n UtillityType: $scope.selectedUtillityType,\r\n OutageLocation: $scope.selectedLocation.State,\r\n ContractAccount: null,\r\n Description: $scope.data.problemDescription,\r\n Address: null,\r\n Coordinate: geoLocation,\r\n Image: $scope.data.image\r\n }\r\n updateReport(data);\r\n } else {\r\n var position = '';\r\n var address = null;\r\n if (isServiceAddressSelected()) {\r\n position = $scope.selectedLocation.Location;\r\n } else {\r\n position = $scope.data.getPosition($scope.selectedLocation.State);\r\n address = $scope.data.getAddress($scope.selectedLocation.State);\r\n }\r\n\r\n var geocoder = new google.maps.Geocoder();\r\n geocoder.geocode({ 'address': position }, function (results, status) {\r\n\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n var googleLocation = results[0].geometry.location;\r\n var latitude = parseFloat(googleLocation.lat());\r\n var longitude = parseFloat(googleLocation.lng());\r\n var geoLocation = { Latitude: latitude, Longitude: longitude };\r\n\r\n var data = {\r\n Id: $scope.outageReport.Id,\r\n UtillityType: $scope.selectedUtillityType,\r\n OutageLocation: $scope.selectedLocation.State,\r\n ContractAccount: $scope.selectedLocation.AccountNumber,\r\n Description: $scope.data.problemDescription,\r\n Address: address,\r\n Coordinate: geoLocation,\r\n Image: $scope.data.image\r\n }\r\n updateReport(data);\r\n } else {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError($scope._t('Can not get address coordinates.'));\r\n }\r\n });\r\n }\r\n }\r\n\r\n $scope.save = function() {\r\n\r\n clearErrors();\r\n\r\n if (!validate())\r\n return;\r\n\r\n collectDataAndSend();\r\n };\r\n\r\n function updateReport(data) {\r\n var url = localStorage.getItem('ApiUrl') + 'api/Outages/UpdateOutageReport/';\r\n\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: data\r\n })\r\n .success(function(result) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showInfo($scope._t('Outage was successfuly updated.'), function() { $scope.cancel(); } );\r\n })\r\n .error(function(error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error);\r\n });\r\n };\r\n\r\n $scope.$watch('image', function () {\r\n if (!$scope.data || $scope.image === $scope.data.image)\r\n return;\r\n\r\n if (!$scope.image) {\r\n $scope.data.image = null;\r\n return;\r\n }\r\n\r\n var reader = new FileReader();\r\n reader.onload = function (loadEvent) {\r\n $scope.data.image = loadEvent.target.result;\r\n setImage();\r\n }\r\n reader.readAsDataURL($scope.image);\r\n });\r\n\r\n $scope.cancel = function () {\r\n window.history.back();\r\n };\r\n }\r\n]);\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\napp.controller('OutageSafetyController',\r\n['$scope', '$state', 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'usSpinnerService',\r\n '$http', 'ServiceProvidersService', '$stateParams', '$sce',\r\n function ($scope, $state, LeftMenuService, CommonHeaderService, ModalServiceExt, usSpinnerService,\r\n $http, ServiceProvidersService, $stateParams, $sce) {\r\n\r\n LeftMenuService.setCurrentTab('OutageCenter');\r\n CommonHeaderService.setUpBackButton($scope._t('Outage Safety'), true);\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var apiUrl = '';\r\n if ($stateParams.anonymous) {\r\n ServiceProvidersService.getProviderApiUrl()\r\n .then(function (result) {\r\n if (!result) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n return;\r\n }\r\n\r\n apiUrl = result;\r\n loadOutageSafety();\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n $state.goToSignIn();\r\n });\r\n } else {\r\n apiUrl = localStorage.getItem('ApiUrl');\r\n loadOutageSafety();\r\n }\r\n\r\n function loadOutageSafety() {\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/StaticData/GetOutageSafety'\r\n })\r\n .success(function(result) {\r\n if (result.Errors && result.Errors.length > 0) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n $scope.html = $sce.trustAsHtml(result.Data);\r\n usSpinnerService.stop('spinner-1');\r\n })\r\n .error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }\r\n]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('MeterDataController', ['$scope', '$rootScope', '$window', '$http', '$sce', '$timeout',\r\n 'LeftMenuService', '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ModalServiceExt', 'CommonDataService',\r\n function($scope, $rootScope, $window, $http, $sce, $timeout, LeftMenuService, $stateParams, CommonHeaderService, usSpinnerService, ModalServiceExt, CommonDataService) {\r\n\r\n LeftMenuService.setCurrentTab('MeterData');\r\n CommonHeaderService.setUpBackButton('Meter Data');\r\n\r\n $scope.isDisputeEnabled = false;\r\n $scope.isEditMeterReadingEnabled = false;\r\n $scope.noMeterReadings = false;\r\n\r\n CommonDataService.getCommonData()\r\n .then(function(commonData) {\r\n $scope.isDisputeEnabled = commonData.EnablePaymentDispute;\r\n var grid = $('#readsGrid').data(\"kendoGrid\");\r\n if (!commonData.EnablePaymentDispute) {\r\n grid.hideColumn($scope._t(\"Dispute\"));\r\n }\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 $scope.disputeCollection = [];\r\n\r\n $scope.selectMeter = function() {\r\n $scope.meterNum = $scope.currentMeter.MeterNum;\r\n $scope.RefreshScrollingList();\r\n }\r\n\r\n $scope.sendDispute = function() {\r\n ModalServiceExt.showInfo($scope._t('Information for Dispute was successfully sent.'), function() {\r\n $scope.disputeCollection = [];\r\n $('#readsGrid').data('kendoGrid').dataSource.read();\r\n $('#readsGrid').data('kendoGrid').refresh();\r\n });\r\n }\r\n\r\n $scope.disputeMeterRead = function(reading) {\r\n ModalServiceExt.showInfo($scope._t('Information for Dispute was successfully sent.'), function() {\r\n });\r\n }\r\n\r\n $scope.meterNum = \"\";\r\n\r\n $scope.readingValue = '';\r\n $scope.registerValue = '001';\r\n\r\n var postMeterReading = function() {\r\n\r\n var token = localStorage.getItem('SecurityToken');\r\n token = decodeURIComponent(token);\r\n\r\n var dataRequest = {\r\n token: token,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n meterNumber: $scope.meterNum,\r\n registerNumber: $scope.registerValue,\r\n meterReadValue: $scope.readingValue\r\n };\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Consumption/AddMeterRead',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n ModalServiceExt.showInfo($scope._t('Meter read data has been successfully uploaded.'), function () {\r\n $scope.readingValue = '';\r\n $scope.registerValue = '001';\r\n $scope.formSubmitted = false;\r\n $scope.disputeCollection = [];\r\n $('#readsGrid').data('kendoGrid').dataSource.read();\r\n $('#readsGrid').data('kendoGrid').refresh();\r\n\r\n $scope.RefreshScrollingList();\r\n });\r\n\r\n stopSpin();\r\n }).error(function () {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.submitReading = function() {\r\n if ($scope.readingValue != '' && $scope.registerValue != '' &&\r\n $scope.readingValue != undefined && $scope.registerValue != undefined) {\r\n\r\n startSpin();\r\n\r\n\r\n if ($scope.imageFormData != null) {\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var uploadUrl = apiUrl + 'api/Consumption/UploadImage';\r\n $http.post(uploadUrl, $scope.imageFormData, {\r\n withCredentials: false,\r\n headers: { 'Content-Type': undefined },\r\n transformRequest: angular.identity\r\n })\r\n .success(\r\n function () {\r\n postMeterReading();\r\n $scope.imageFormData = null;\r\n stopSpin();\r\n //ModalServiceExt.showInfo('Meter read image was uploaded successfully.', function () { });\r\n }\r\n )\r\n .error(function () {\r\n stopSpin();\r\n //ModalServiceExt.showError('Error when attempt to upload meter read image');\r\n }\r\n );\r\n } else {\r\n postMeterReading();\r\n }\r\n }\r\n }\r\n\r\n function isGetMetersError(jsonData) {\r\n return jsonData.HasErrors;\r\n }\r\n\r\n function useMeterData(jsonObject) {\r\n\r\n CommonDataService.getCommonData()\r\n .then(function(commonData) {\r\n var grid = $('#readsGrid').data('kendoGrid');\r\n if (!commonData.EnablePaymentDispute) {\r\n grid.hideColumn(9);\r\n }\r\n\r\n $scope.isEditMeterReadingEnabled = commonData.EnableAddDeleteMeterRead;\r\n\r\n if (!commonData.EnableAddDeleteMeterRead) {\r\n grid.hideColumn(10);\r\n }\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\r\n }\r\n );\r\n\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 };\r\n\r\n function useSingleMeterData(jsonObject) {\r\n var jsonMeterNumIs = jsonObject[0].MeterNum;\r\n $scope.meterNum = jsonMeterNumIs;\r\n if (jsonMeterNumIs == \"\" || jsonMeterNumIs == null) {\r\n $scope.isMultipleMeters = false;\r\n } else {\r\n $scope.isMultipleMeters = false;\r\n\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 $scope.RefreshScrollingList();\r\n }\r\n\r\n\r\n $scope.getMeterDataGraph = function () {\r\n startSpin();\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n \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 } else {\r\n useMeterData(jsonData);\r\n }\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.deleteMeterRead = function (meterRead) {\r\n startSpin();\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n $http({\r\n url: apiUrl + 'api/Consumption/DeleteMeterRead/',\r\n method: \"GET\",\r\n params: { accountNumber: accountNumber, meterNumber: $scope.meterNum, registerNumber: meterRead.RegisterNum, meterReadDate: meterRead.DateString, }\r\n }).success(function (jsonData) {\r\n stopSpin();\r\n if (jsonData) {\r\n if (isGetMetersError(jsonData)) {\r\n ModalServiceExt.showError(jsonData.Errors[0]);\r\n } else {\r\n ModalServiceExt.showInfo($scope._t('Meter read was successfully deleted.'), function () {\r\n $('#readsGrid').data('kendoGrid').dataSource.read();\r\n $('#readsGrid').data('kendoGrid').refresh();\r\n\r\n $scope.RefreshScrollingList();\r\n });\r\n }\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\r\n $scope.RefreshScrollingList = function() {\r\n $scope.meterReadingInfoBusy = false;\r\n $scope.meterReadingInfoForScrolling = [];\r\n $scope.meterReadingInfoEndReached = false;\r\n\r\n $scope.getMeterReadingInfoForScrolling();\r\n }\r\n\r\n $scope.meterReadingInfoBusy = false;\r\n var pageSize = 10;\r\n $scope.meterReadingInfoForScrolling = [];\r\n $scope.meterReadingInfoEndReached = false;\r\n\r\n $scope.getMeterReadingInfoForScrolling = function () {\r\n\r\n if ($scope.meterReadingInfoBusy)\r\n return;\r\n $scope.meterReadingInfoBusy = true;\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var meterNumber= $scope.meterNum;\r\n if (meterNumber == undefined || meterNumber == '') {\r\n $scope.meterReadingInfoBusy = false;\r\n return;\r\n }\r\n\r\n var dataRequest = {\r\n meterNumber: meterNumber,\r\n accountNumber: accountNumber,\r\n skip: $scope.meterReadingInfoForScrolling.length,\r\n pageSize: pageSize,\r\n withTotalCount: false\r\n };\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Consumption/GetConsumptionGraphPageAllReadings/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (data) {\r\n $scope.meterReadingInfoBusy = false;\r\n var jsondata = data;\r\n if (jsondata) {\r\n if (jsondata.Errors && jsondata.Errors.length > 0) {\r\n $scope.meterReadingInfoEndReached = true;\r\n ModalServiceExt.showError(jsondata.Errors[0]);\r\n } else {\r\n $scope.acceptMeterReadingInfoForScrolling(data);\r\n }\r\n } else {\r\n $scope.meterReadingInfoEndReached = true;\r\n ModalServiceExt.showServerError();\r\n }\r\n }).error(function () {\r\n $scope.meterReadingInfoBusy = false;\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n $scope.acceptMeterReadingInfoForScrolling = function (data) {\r\n if (data.PageData) {\r\n for (var i = 0; i < data.PageData.length; i++) {\r\n $scope.meterReadingInfoForScrolling.push(data.PageData[i]);\r\n }\r\n if (data.PageData.length < pageSize) {\r\n $scope.meterReadingInfoEndReached = true;\r\n }\r\n } else {\r\n $scope.meterReadingInfoEndReached = true;\r\n }\r\n $scope.meterReadingInfoBusy = false;\r\n $scope.noMeterReadings = $scope.meterReadingInfoForScrolling.length === 0;\r\n };\r\n\r\n $scope.imageFormData = null;\r\n\r\n $scope.createImageDataForUpload = function (files) {\r\n $scope.imageFormData = new FormData();\r\n //Take the first selected file\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var meterNumber = $scope.meterNum;\r\n var registerNumber = $scope.registerValue;\r\n var fileExtension = files[0].name.split('.').pop();\r\n\r\n var nameForFile = accountNumber + '_' + meterNumber + '_' + registerNumber + '_' + fileExtension;\r\n //$scope.imageFormData.append(files[0].name, files[0]);\r\n $scope.imageFormData.append(nameForFile, files[0]);\r\n }\r\n\r\n $scope.uploadImageFile = function() {\r\n if ($scope.imageFormData != null) {\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var uploadUrl = apiUrl + 'api/Consumption/UploadImage';\r\n $http.post(uploadUrl, $scope.imageFormData, {\r\n withCredentials: false,\r\n headers: { 'Content-Type': undefined },\r\n transformRequest: angular.identity\r\n })\r\n //.success(ModalServiceExt.showInfo('Meter read image was uploaded successfully.', function() {}))\r\n .error(function() {\r\n ModalServiceExt.showError($scope._t('Error when attempt to upload meter read image'));\r\n }\r\n );\r\n }\r\n };\r\n\r\n}])\r\n;\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('MeterReadsGridCtrl', [\r\n '$scope', '$http', 'BillsService', '$state', 'OpenFileService', 'GridService',\r\n function ($scope, $http, BillsService, $state, OpenFileService, GridService) {\r\n var readsGridResizeFunc = GridService.getGridResizeFunc($(\"#readsGrid\"), 85);\r\n\r\n $(window).resize(function () {\r\n readsGridResizeFunc($scope.readsKendoGrid);\r\n });\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n var watchForChange = function () {\r\n return $scope.$parent.meterNum;\r\n }\r\n\r\n $scope.$watch(watchForChange, function (newValue, oldValue) {\r\n if (newValue != '') {\r\n $scope.readsKendoGrid.dataSource.read();\r\n $scope.readsKendoGrid.refresh();\r\n }\r\n });\r\n\r\n $scope.delete = function (dataItem) {\r\n $scope.$parent.deleteMeterRead(dataItem);\r\n //$scope.readsKendoGrid.dataSource.read();\r\n //$scope.readsKendoGrid.refresh();\r\n }\r\n\r\n $scope.dispute = function (dataItem) {\r\n var filteredArray = $scope.$parent.disputeCollection.filter(function (entry) {\r\n return entry != dataItem;\r\n });\r\n\r\n if (filteredArray.length != $scope.$parent.disputeCollection.length) {\r\n $scope.$parent.disputeCollection = filteredArray;\r\n return;\r\n } else {\r\n $scope.$parent.disputeCollection.push(dataItem);\r\n }\r\n }\r\n\r\n $scope.mainGridOptions = {\r\n\r\n dataSource: {\r\n transport: {\r\n read: { url: localStorage.getItem('ApiUrl') + 'api/Consumption/GetConsumptionGraphPageAllReadings/' },\r\n parameterMap: function (data, type) {\r\n var meterNumber = $scope.$parent.meterNum;\r\n if (type == \"read\" && meterNumber!='') {\r\n return {\r\n meterNumber: meterNumber, //function () { return $scope.$parent.meterNum; },\r\n accountNumber: accountNumber,\r\n skip: (data.page - 1) * data.pageSize,\r\n pageSize: data.pageSize,\r\n withTotalCount: true,\r\n // kendo grid makes requests that doesn't go through angularjs\r\n // hence token will not be added by interceptor and we have\r\n // to add it manually here\r\n token: localStorage.getItem('SecurityToken')\r\n }\r\n }\r\n }\r\n },\r\n schema: {\r\n data: function (response) {\r\n // resize is useful here for the case when number of items per page is changed.\r\n // i call resize to handle that the grid can expand or shrink.\r\n // timeout is necessary to process resize after data is loaded\r\n setTimeout(function () { readsGridResizeFunc($scope.readsKendoGrid); }, 0);\r\n $scope.$parent.disputeCollection = [];\r\n return response.PageData;\r\n },\r\n total: \"Count\"\r\n },\r\n pageSize: 20,\r\n serverPaging: true\r\n },\r\n autoBind: false,\r\n sortable: true,\r\n pageable: {\r\n pageSize: 10,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n dataBound: function () { readsGridResizeFunc($scope.readsKendoGrid); },\r\n columns: [\r\n {\r\n field: \"DateOfReading\",\r\n title: $scope._t(\"Date\"),\r\n template: \"#: DateString #\",\r\n width: 100\r\n },\r\n {\r\n field: \"Cost\",\r\n title: $scope._t(\"Cost\"),\r\n template: \"#: Cost #\",\r\n width: 80\r\n },\r\n {\r\n field: \"RegisterNum\",\r\n title: $scope._t(\"Register\"),\r\n template: \"#: RegisterNum #\",\r\n width: 80\r\n },\r\n {\r\n field: \"RunningMeterReading\",\r\n title: $scope._t(\"Meter Reading\"),\r\n template: \"#: RunningMeterReading #\",\r\n width: 100\r\n },\r\n {\r\n field: \"UnitsOfMeasure\",\r\n title: $scope._t(\"Units\"),\r\n template: \"#: UnitOfMeasure #\",\r\n width: 80\r\n },\r\n {\r\n field: \"Days\",\r\n title: $scope._t(\"Days\"),\r\n template: \"#: Days #\",\r\n width: 80\r\n },\r\n {\r\n field: \"Consumption\",\r\n title: $scope._t(\"Usage\"),\r\n template: \"#: Consumption #\",\r\n width: 80\r\n },\r\n {\r\n field: \"DailyAverageString\",\r\n title: $scope._t(\"Daily Average\"),\r\n template: \"#: DailyAverageString #\",\r\n width: 100\r\n },\r\n {\r\n field: \"MeterNumber\",\r\n title: $scope._t(\"Meter\"),\r\n template: \"#: MeterNumber #\",\r\n width: 120\r\n },\r\n {\r\n field: \"\",\r\n title: $scope._t(\"Dispute\"),\r\n template: \"\",\r\n width: 80,\r\n sortable: false,\r\n },\r\n //{\r\n // field: \"\",\r\n // title: \"Delete\",\r\n // template: \"delete\",\r\n // width: 100,\r\n // sortable: false,\r\n //},\r\n {\r\n field: \"\",\r\n title: $scope._t(\"Delete\"),\r\n template: \"# if ( CanBeDeleted ) { # delete # } #\",\r\n width: 100,\r\n sortable: false,\r\n }\r\n\r\n ]\r\n }\r\n }\r\n ]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('AccountMenuController', ['$scope', '$http', '$rootScope', '$window', '$state', '$timeout',\r\n function ($scope, $http, $rootScope, $window, $state, $timeout) {\r\n\r\n $scope.backFromBillDetails = function () {\r\n $rootScope.showSlideBackAnimation = true;\r\n $state.goMainLayout('BillsAndPayments');\r\n $timeout(function () { $rootScope.showSlideBackAnimation = false; }, 1000);\r\n }\r\n\r\n $scope.showNotifications = function () {\r\n $rootScope.showSlideAnimation = true;\r\n $state.goMainLayout('Notifications');\r\n $timeout(function () { $rootScope.showSlideAnimation = false; }, 1000);\r\n }\r\n\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('PayNowController', ['$scope', '$rootScope', '$window', '$http', '$state', '$stateParams', 'CommonDataService', \r\n 'usSpinnerService', 'LeftMenuService', 'CommonHeaderService', 'GetAccountsService', 'ModalServiceExt', 'AccountListService',\r\n function ($scope, $rootScope, $window, $http, $state, $stateParams, CommonDataService, usSpinnerService, LeftMenuService, CommonHeaderService,\r\n GetAccountsService, ModalServiceExt, AccountListService) {\r\n\r\n LeftMenuService.setCurrentTab('PayNow');\r\n CommonHeaderService.setUpBackButton($scope._t('Pay Now'));\r\n\r\n $scope.agreed = false;\r\n $scope.isFeeEnabled = false;\r\n\r\n if ($stateParams.AccountNumber && $stateParams.AccountNumber != AccountListService.getCurrentContractAccount())\r\n checkContractAccount($stateParams.AccountNumber);\r\n else\r\n getFeeInfo();\r\n\r\n\r\n function getFeeInfo() {\r\n usSpinnerService.spin('spinner-1');\r\n var dataoRequest = { accountNumber: localStorage.getItem('CurrentAccountNumber') }\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/GetConvFeeInfo/',\r\n method: \"GET\",\r\n params: dataoRequest\r\n }).success(function (data) {\r\n $scope.feeInformation = data.FeeInfoTextAchAndCard;\r\n $scope.isFeeEnabled = data.IsFeeEnabled;\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function checkContractAccount(caNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n \r\n GetAccountsService\r\n .getAccounts(true)\r\n .then(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0].Message);\r\n }\r\n else {\r\n var contractAccount = _.findWhere(response.Accounts, { AccountNumber: caNumber });\r\n if (contractAccount) {\r\n AccountListService.changeContractAccount(contractAccount);\r\n getFeeInfo();\r\n }\r\n else {\r\n ModalServiceExt.showError($scope._t('Using an incorrect contract account number.'));\r\n }\r\n }\r\n }).catch(function (e) {\r\n usSpinnerService.stop('spinner-1');\r\n console.log(e);\r\n });\r\n }\r\n\r\n $scope.updateAgreed = function()\r\n {\r\n if ($scope.agreed)\r\n $scope.agreed = false;\r\n else\r\n $scope.agreed = true;\r\n };\r\n\r\n $scope.payByCard = function()\r\n {\r\n $state.goMainLayout('PayByCard');\r\n }\r\n\r\n $scope.payByCheck = function ()\r\n {\r\n $state.goMainLayout('PayByCheck');\r\n }\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n };\r\n}]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('PayByCardController', ['$scope', '$http', '$rootScope', '$state', '$window', '$timeout',\r\n 'usSpinnerService', 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', 'CommonDataService',\r\n function ($scope, $http, $rootScope, $state, $window, $timeout, usSpinnerService, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, CommonDataService) {\r\n LeftMenuService.setCurrentTab('PayByCard');\r\n CommonHeaderService.setUpCancelButton();\r\n\r\n if (utilli.isAdmin) {\r\n $scope.imagesPath = \"../Images\";\r\n } else {\r\n $scope.imagesPath = \"Images\";\r\n }\r\n\r\n $scope.isMobile = isMobileOrRipple();\r\n $scope.deviceIsWindowsPhone = deviceIsWindowsPhone;\r\n\r\n initPicker();\r\n\r\n $scope.errors = [];\r\n\r\n $scope.savedCards = [];\r\n $scope.currentSavedCard = {};\r\n $scope.useSavedCard = false;\r\n $scope.savedCardsVisible = false;\r\n\r\n $scope.cardNumber = '';\r\n $scope.nameOnCard = '';\r\n $scope.cardExpiryMonth = '';\r\n $scope.cardExpiryYear = '';\r\n $scope.saveThisCard = false;\r\n\r\n $scope.isPayingContinuing = false;\r\n\r\n $scope.enableSaveBankAccounts = false;\r\n $scope.enableSaveCreditCards = false;\r\n\r\n $scope.paymentResultData = '';\r\n $scope.isResultShowing = false;\r\n\r\n $scope.isFeeEnabled = false;\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n $scope.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 $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n\r\n function getAmount() {\r\n var amount;\r\n if ($scope.amountType == \"allAmount\")\r\n amount = parseFloat($scope.currentAccountData.userinfo.TotalOpenBalance);\r\n else\r\n amount = parseFloat($scope.otherAmountSumm);\r\n return amount;\r\n }\r\n \r\n CommonDataService.getCommonData().then(\r\n function (commonData) {\r\n $scope.showSchedulePayment = commonData.EnablePaymentScheduling;\r\n $scope.enableSaveBankAccounts = commonData.EnableSaveBankAccounts;\r\n $scope.enableSaveCreditCards = commonData.EnableSaveCards;\r\n $scope.isFeeEnabled = commonData.IsFeeEnabled;\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.requestSchedulePayment = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var params = { \r\n contractAccountNumber: localStorage.getItem('CurrentAccountNumber'), \r\n amount: getAmount(), \r\n paymentType: 'Credit Card',\r\n paymentDate: $scope.scheduleDate.toUTCString()\r\n };\r\n utilli.addUserName($state, params);\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/SchedulePayment/',\r\n method: \"POST\",\r\n data: params\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showMessage(\r\n $scope._t('Schedule Payment'),\r\n $scope._t('Your request to schedule a payment has been received. Thank you for your payment.'),\r\n function(){ $state.goMainLayout('Dashboard'); });\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.checkValid = function () {\r\n alert('is form valid: ' + $scope.pay_form.$valid);\r\n };\r\n\r\n $scope.availablePaymentTypes = [\r\n { name: 'Credit Card', id: 'CreditCard' },\r\n { name: 'Debit Card', id: 'DebitCard' }\r\n ];\r\n\r\n function initPicker() {\r\n $scope.dpOptions = utilli.datePickerOptions;\r\n $scope.altInputFormats = ['M!/d!/yyyy'];\r\n }\r\n\r\n $scope.updateConvenienceFee = function (amountToPay) {\r\n //if (amountToPay <= window.Config.largeConvenienceFeeBorder) {\r\n // $scope.convenienceFee = $scope.smallConvenienceFee;\r\n //} else {\r\n // $scope.convenienceFee = $scope.largeConvenienceFee;\r\n //}\r\n\r\n //if ($scope.amountDue <= window.OneTimePayments.largeConvenienceFeeBorder) {\r\n // $scope.convinienceFee = window.OneTimePayments.smallConvenienceFee;\r\n //}\r\n //else if ($scope.amountDue > window.OneTimePayments.largeConvenienceFeeBorder) {\r\n // $scope.convinienceFee = window.OneTimePayments.largeConvenienceFee;\r\n //}\r\n\r\n var info = $scope.convFeeInfo;\r\n\r\n if (info == null) return;\r\n\r\n if (isNaN(amountToPay) || amountToPay == '') {\r\n $scope.totalSumToPay = '';\r\n $scope.convenienceFee = '';\r\n return;\r\n }\r\n\r\n if ($scope.isFeeEnabled) {\r\n if (info.FeeType == \"percent\") {\r\n $scope.convenienceFee = $scope.formatDecimal(amountToPay / 100 * info.FeeAmount);\r\n } else if (info.FeeType == \"flat\") {\r\n $scope.convenienceFee = $scope.formatDecimal(info.FeeAmount);\r\n }\r\n }\r\n else\r\n {\r\n $scope.convenienceFee = 0;\r\n }\r\n\r\n $scope.totalAmount = $scope.formatDecimal(parseFloat(amountToPay) + parseFloat($scope.convenienceFee));\r\n\r\n $scope.totalSumToPay = $scope.totalAmount;\r\n }\r\n\r\n $scope.savedCardChanged = function () {\r\n\r\n setCurrentSavedCardAttributes();\r\n }\r\n\r\n function setSavedCards(data) {\r\n var foundPrimary = false;\r\n for (var i = 0; i < data.length; i++) {\r\n var card = data[i];\r\n var cardInfo = { title: $scope._t('Card ending with ') + card.LastPart, card: card };\r\n $scope.savedCards.push(cardInfo);\r\n\r\n if (card.IsPrimary) {\r\n $scope.currentSavedCard = cardInfo;\r\n foundPrimary = true;\r\n }\r\n }\r\n\r\n if (!foundPrimary)\r\n $scope.currentSavedCard = $scope.savedCards[0];\r\n\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 $scope.cardNumber = '';\r\n $scope.nameOnCard = '';\r\n $scope.cardExpiryMonth = '';\r\n $scope.cardExpiryYear = '';\r\n }\r\n };\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.getProfileData = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var requestData = { accountNumber: accountNumber };\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n url: apiUrl + 'api/Profile/GetProfile/',\r\n method: \"GET\",\r\n params: requestData\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n $scope.profile = data.AccountData;\r\n if ($scope.profile.PrimaryPhoneNumber && $scope.profile.PrimaryPhoneNumber.length === 11) {\r\n $scope.phoneNumber = $scope.profile.PrimaryPhoneNumber.substr(1);\r\n }\r\n\r\n $scope.email = $scope.profile.Email;\r\n\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n function setupDashboardInfo() {\r\n var requestResult = false;\r\n\r\n $scope.IsGettingDashboardInfo = true;\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var dataoRequest = { contractAccountNumber: accountNumber }\r\n\r\n $http({\r\n url: apiUrl + 'api/Customer/GetCustomerInfo/',\r\n method: \"GET\",\r\n params: dataoRequest\r\n }).success(function (data) {\r\n $scope.IsGettingDashboardInfo = false;\r\n var jsondata = data;\r\n if (jsondata) {\r\n if (jsondata.ERROR_LIST && jsondata.ERROR_LIST.length > 0) {\r\n\r\n ModalServiceExt.showError(jsondata.ERROR_LIST[0].Message);\r\n deferred.reject(requestResult);\r\n } else {\r\n acceptDashboardData(data);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n };\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function acceptDashboardData(data) {\r\n $scope.currentAccountData = data;\r\n $scope.data = data;\r\n $rootScope.UserInfo = data.userinfo;\r\n $scope.totalSumToPay = data.userinfo.TotalOpenBalance;\r\n\r\n\r\n if ($scope.totalSumToPay <= 0) {\r\n $scope.amountType = \"otherAmount\";\r\n $scope.otherAmountSumm = \"0.00\";\r\n $scope.totalSumToPay = 0;\r\n $scope.updateConvenienceFee($scope.otherAmountSumm);\r\n } else {\r\n $scope.updateConvenienceFee(parseFloat(data.userinfo.TotalOpenBalance));\r\n }\r\n };\r\n\r\n $scope.getConvFeeInfo = function (accountNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n var searchObject = {\r\n accountNumber: accountNumber,\r\n };\r\n $http({\r\n url: localStorage.getItem('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 setupDashboardInfo();\r\n $scope.updateConvenienceFee(parseFloat($scope.otherAmountSumm));\r\n } else {\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.init = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.amountType = \"allAmount\";\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProfileCardManage/GetCreditCards',\r\n method: \"GET\",\r\n params: { accountNumber: accountNumber }\r\n }).success(function (data) {\r\n if (data == null || data.length == 0) {\r\n $scope.useSavedCard = false;\r\n $scope.savedCardsVisible = false;\r\n } else {\r\n $scope.useSavedCard = true;\r\n $scope.savedCardsVisible = true;\r\n setSavedCards(data);\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 $scope.getConvFeeInfo(accountNumber);\r\n $scope.getProfileData();\r\n\r\n var minServiceAppointmentDate = (function () {\r\n var tomorrow = new Date();\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n return tomorrow;\r\n })();\r\n }\r\n\r\n $scope.allSummSelected = function () {\r\n if ($scope.currentAccountData.userinfo.TotalOpenBalance <= 0) {\r\n return;\r\n }\r\n\r\n $scope.amountType = \"allAmount\";\r\n $scope.otherAmountSumm = '';\r\n\r\n $scope.updateConvenienceFee(parseFloat($scope.currentAccountData.userinfo.TotalOpenBalance));\r\n }\r\n\r\n $scope.otherSummSelected = function () {\r\n $scope.amountType = 'otherAmount';\r\n $scope.totalSumToPay = '';\r\n $scope.totalSumToPay = $scope.otherAmountSumm;\r\n $scope.updateConvenienceFee($scope.totalSumToPay);\r\n }\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n }\r\n\r\n $scope.okAfterSuccessfulPayment = function () {\r\n $state.goMainLayout('Dashboard');\r\n }\r\n\r\n $scope.dateRegex = /^\\d{2}\\/\\d{2}\\/\\d{4}$/;\r\n\r\n var validateFormData = function () {\r\n if (($scope.amountType == 'otherAmount') && ((parseFloat($scope.otherAmountSumm) <= 0) || $scope.otherAmountSumm == '' || $scope.otherAmountSumm == undefined)) {\r\n $scope.otherAmountError = true;\r\n } else {\r\n $scope.otherAmountError = false;\r\n }\r\n\r\n if (($scope.amountType == 'otherAmount') && ($scope.otherAmountSumm == '' || $scope.otherAmountSumm == undefined)) {\r\n $scope.otherAmountEmptyError = true;\r\n } else {\r\n $scope.otherAmountEmptyError = false;\r\n }\r\n\r\n if ($scope.pay_form.email.$invalid\r\n || $scope.pay_form.phoneNumber.$invalid\r\n || $scope.pay_form.email.$invalid\r\n || ($scope.pay_form.cardNumber.$invalid && !$scope.useSavedCard)\r\n || $scope.pay_form.nameOnCard.$invalid\r\n || ($scope.pay_form.cardExpiryMonth.$error.ccExpMonth && !$scope.useSavedCard)\r\n || ($scope.pay_form.cardExpiryYear.$error.ccExpYear && !$scope.useSavedCard)\r\n || ($scope.pay_form.$error.ccExp && !$scope.useSavedCard)\r\n || ($scope.pay_form.cardExpiryMonth.$invalid && !$scope.useSavedCard)\r\n || ($scope.pay_form.cardExpiryYear.$invalid && !$scope.useSavedCard)\r\n || $scope.pay_form.cardNumber.$type == 'JCB'\r\n || $scope.pay_form.cardNumber.$type == 'American Express'\r\n || $scope.pay_form.cardNumber.$type == 'Diners Club'\r\n || (($scope.amountType == 'otherAmount') && ((parseFloat($scope.otherAmountSumm) <= 0) || $scope.otherAmountSumm == '' || $scope.otherAmountSumm == undefined))\r\n ) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n $scope.makePaymentApi = function () {\r\n\r\n $scope.errors = [];\r\n if ($scope.scheduleButtonClicked) {\r\n\r\n if ($scope.scheduleDate) {\r\n usSpinnerService.spin('spinner-1');\r\n $timeout(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.requestSchedulePayment();\r\n }, 1500);\r\n return;\r\n }\r\n }\r\n\r\n utilli.scrollTop();\r\n\r\n if (!validateFormData()) {\r\n $scope.errors = [{ Message: utilli.errors.validationErorrsMessage }];\r\n return;\r\n }\r\n\r\n $scope.isPayingContinuing = true;\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n var amount = getAmount();\r\n\r\n if ($scope.useSavedCard) {\r\n var payDataRequest = {\r\n Card: $scope.currentSavedCard.card,\r\n AccountNumber: accountNumber,\r\n Amount: amount,\r\n Email: $scope.email,\r\n PhoneNumber: utilli.getFullPhoneNumber($scope.phoneNumber)\r\n };\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/PayBySavedCard/',\r\n method: \"POST\",\r\n data: payDataRequest\r\n }).success(function (data) {\r\n handlePaymentSuccess(data);\r\n }).error(function (error) {\r\n $scope.isPayingContinuing = false;\r\n usSpinnerService.stop('spinner-1');\r\n\r\n ModalServiceExt.showServerError();\r\n });\r\n } else {\r\n var cardExpiry = formExpiryDate();\r\n\r\n var dataRequest = {\r\n ContractAccountNumber: accountNumber,\r\n CardNumber: $scope.cardNumber,\r\n Amount: amount,\r\n CardholderName: $scope.nameOnCard,\r\n ExpirationDate: cardExpiry,\r\n Email: $scope.email,\r\n PhoneNumber: utilli.getFullPhoneNumber($scope.phoneNumber),\r\n SaveThisCard: $scope.saveThisCard\r\n };\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/PayByCard/',\r\n method: \"POST\",\r\n data: dataRequest\r\n }).success(function (data) {\r\n handlePaymentSuccess(data);\r\n }).error(function (error, status) {\r\n if (status === 0) {\r\n $scope.isPayingContinuing = false;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n $scope.isPayingContinuing = false;\r\n usSpinnerService.stop('spinner-1');\r\n\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }\r\n\r\n function formExpiryDate() {\r\n var expiryYear = $scope.cardExpiryYear.toString();\r\n if (expiryYear.length > 2)\r\n expiryYear = expiryYear.substr(expiryYear.length - 2);\r\n\r\n var expiryMonth = $scope.cardExpiryMonth.toString();\r\n if (expiryMonth.length < 2)\r\n expiryMonth = '0' + expiryMonth;\r\n\r\n var expiryDate = expiryMonth.concat(expiryYear);\r\n return expiryDate;\r\n }\r\n\r\n function handlePaymentSuccess(data) {\r\n $scope.isPayingContinuing = false;\r\n usSpinnerService.stop('spinner-1');\r\n $scope.IsGettingDashboardInfo = false;\r\n if (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n ModalServiceExt.showError(data.Errors[0]);\r\n } else {\r\n $scope.acceptBillsData(data);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n }\r\n }\r\n\r\n $scope.acceptBillsData = function (data) {\r\n CommonHeaderService.setUp();\r\n $scope.isResultShowing = true;\r\n $scope.paymentResultMessage = data.Data;\r\n }\r\n\r\n $scope.acceptPaymentResultData = function (data) {\r\n $scope.paymentResultData = data;\r\n }\r\n\r\n $scope.$watch('otherAmountSumm', function (newValue, oldValue) {\r\n if ($scope.amountType == 'otherAmount') {\r\n\r\n $scope.updateConvenienceFee(parseFloat($scope.otherAmountSumm));\r\n\r\n if (parseFloat($scope.otherAmountSumm) <= 0 || $scope.otherAmountSumm == '' || $scope.otherAmountSumm == undefined) {\r\n $scope.otherAmountError = true;\r\n } else {\r\n $scope.otherAmountError = false;\r\n }\r\n\r\n if ($scope.otherAmountSumm == '' || $scope.otherAmountSumm == undefined) {\r\n $scope.otherAmountEmptyError = true;\r\n } else {\r\n $scope.otherAmountEmptyError = false;\r\n }\r\n }\r\n });\r\n\r\n $scope.formatOtherAmount = function () {\r\n try {\r\n if ($scope.otherAmountSumm == undefined || $scope.otherAmountSumm == \"\") {\r\n return;\r\n }\r\n $scope.otherAmountSumm = $scope.formatDecimal(parseFloat($scope.otherAmountSumm));\r\n } catch (ex) {\r\n }\r\n }\r\n\r\n $scope.formatDecimal = function (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\r\n\r\n function onCardIOComplete(response) {\r\n $scope.cardNumber = response[\"cardNumber\"];\r\n $scope.cardExpiryYear = response[\"expiryYear\"];\r\n $scope.cardExpiryMonth = response[\"expiryMonth\"];\r\n $scope.$apply();\r\n\r\n $(\"#inptCcNum\").trigger(\"input\");\r\n }\r\n\r\n function onCardIOCancel() {\r\n //alert(\"card.io scan cancelled\");\r\n }\r\n\r\n $scope.scanCreditCard = function () {\r\n CardIO.scan({\r\n \"requireExpiry\": true,\r\n \"scanExpiry\": true,\r\n \"requirePostalCode\": false,\r\n \"requireCVV\": false,\r\n \"restrictPostalCodeToNumericOnly\": true,\r\n \"hideCardIOLogo\": true,\r\n \"suppressScan\": false,\r\n \"keepApplicationTheme\": true\r\n }, onCardIOComplete, onCardIOCancel);\r\n }\r\n\r\n }\r\n ]);\r\n\r\n//.directive('blurToCurrency', function ($filter) {\r\n// return {\r\n// scope: {\r\n// amount: '='\r\n// },\r\n// link: function (scope, el, attrs) {\r\n// el.val($filter('currency')(scope.amount));\r\n\r\n// el.bind('focus', function () {\r\n// el.val(scope.amount);\r\n// });\r\n\r\n// el.bind('input', function () {\r\n// scope.amount = el.val();\r\n// scope.$apply();\r\n// });\r\n\r\n// //el.bind('blur', function () {\r\n// // el.val($filter('currency')(scope.amount));\r\n// //});\r\n\r\n// el.bind('blur', function () {\r\n// el.val($filter('currency')(scope.amount).substring(1));\r\n// });\r\n\r\n// //scope.$watch('amount', function (newValue, oldValue) {\r\n// // var arr = String(newValue).split(\"\");\r\n// // if (arr.length === 0) return;\r\n// // if (arr.length === 1 && (arr[0] == '0' || arr[0] === '.')) return;\r\n// // if (arr.length === 2 && newValue === '0.') return;\r\n// // if (isNaN(newValue)) {\r\n// // scope.amount = oldValue;\r\n// // }\r\n// //});\r\n\r\n// //ngModelCtrl.$parsers.push(function(val) {\r\n// // var clean = val.replace( /[^0-9]+/g, '');\r\n// // if (val !== clean) {\r\n// // ngModelCtrl.$setViewValue(clean);\r\n// // ngModelCtrl.$render();\r\n// // }\r\n// // return clean;\r\n// //});\r\n\r\n// //element.bind('keypress', function(event) {\r\n// // if(event.keyCode === 32) {\r\n// // event.preventDefault();\r\n// // }\r\n// //});\r\n// }\r\n// }\r\n//});\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('PayByCheckController', ['$scope', '$http', '$rootScope', '$state', '$window',\r\n 'PayByCheckService', '$timeout', 'usSpinnerService', 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService',\r\n 'CommonDataService',\r\nfunction ($scope, $http, $rootScope, $state, $window, PayByCheckService, $timeout,\r\n usSpinnerService, LeftMenuService, ModalServiceExt, CommonHeaderService, CommonDataService) {\r\n\r\n LeftMenuService.setCurrentTab('PayByCheck');\r\n CommonHeaderService.setUpCancelButton();\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n $scope.errors = [];\r\n $scope.savedAccountsVisible = false;\r\n $scope.useSavedBankAccount = false;\r\n $scope.currentSavedAccount = {};\r\n $scope.savedAccounts = [];\r\n\r\n $scope.model = {};\r\n $scope.model.nameOnAccount = '';\r\n\r\n $scope.saveThisBankAccount = false;\r\n\r\n $scope.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 $scope.onlyNumbers = /^\\d+$/;\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n\r\n $scope.model.bankRoutingNumber = '';\r\n $scope.model.checkingAccountNumber = '';\r\n $scope.model.reenterCheckingAccountNumber = '';\r\n\r\n $scope.model.totalAmount = '';\r\n\r\n $scope.enableSaveBankAccounts = false;\r\n $scope.enableSaveCreditCards = false;\r\n\r\n $scope.isFeeEnabled = false;\r\n\r\n initPicker();\r\n\r\n //$scope.model.smallConvenienceFee = window.Config.smallConvenienceFee;\r\n //$scope.model.largeConvenienceFee = window.Config.largeConvenienceFee;\r\n //$scope.model.convenienceFee = $scope.model.largeConvenienceFee;\r\n\r\n CommonDataService.getCommonData().then(\r\n function (commonData) {\r\n $scope.showSchedulePayment = commonData.EnablePaymentScheduling;\r\n $scope.enableSaveBankAccounts = commonData.EnableSaveBankAccounts;\r\n $scope.enableSaveCreditCards = commonData.EnableSaveCards;\r\n $scope.isFeeEnabled = commonData.IsFeeEnabled;\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.useSavedAccountClicked = function ()\r\n {\r\n if ($scope.isPayingContinuing){\r\n return;\r\n }\r\n\r\n if ($scope.useSavedBankAccount)\r\n $scope.useSavedBankAccount = false;\r\n else\r\n $scope.useSavedBankAccount = true;\r\n\r\n $scope.useSavedAccountChanged();\r\n }\r\n\r\n $scope.useSavedAccountChanged = function()\r\n {\r\n if ($scope.useSavedBankAccount)\r\n {\r\n $scope.currentSavedAccount = $scope.savedAccounts[0];\r\n for (var i = 0; i < $scope.savedAccounts.length; i++) {\r\n var bankAccountInfo = $scope.savedAccounts[i];\r\n if (bankAccountInfo.bankAccount.IsPrimary) {\r\n $scope.currentSavedAccount = bankAccountInfo;\r\n break;\r\n }\r\n }\r\n\r\n setCurrentSavedBankAccountAttributes();\r\n }\r\n else\r\n {\r\n $scope.model.bankRoutingNumber = '';\r\n $scope.model.checkingAccountNumber = '';\r\n $scope.model.reenterCheckingAccountNumber = '';\r\n $scope.model.nameOnAccount = '';\r\n }\r\n }\r\n\r\n function setCurrentSavedBankAccountAttributes()\r\n {\r\n $scope.model.bankRoutingNumber = $scope.currentSavedAccount.bankAccount.RoutingNumber;\r\n $scope.model.checkingAccountNumber = $scope.currentSavedAccount.title;\r\n $scope.model.reenterCheckingAccountNumber = $scope.currentSavedAccount.title;\r\n $scope.model.nameOnAccount = $scope.currentSavedAccount.bankAccount.NameOnAccount;\r\n }\r\n\r\n function setSavedAccounts(data)\r\n {\r\n var foundPrimary = false;\r\n for (var i = 0; i < data.length; i++)\r\n {\r\n var bankAccount = data[i];\r\n var accountInfo = { title: $scope._t('Account ending with') + ' ' + bankAccount.BankAccountNumber, bankAccount: bankAccount };\r\n $scope.savedAccounts.push(accountInfo);\r\n\r\n if (bankAccount.IsPrimary)\r\n {\r\n $scope.currentSavedAccount = accountInfo;\r\n foundPrimary = true;\r\n }\r\n }\r\n\r\n if (!foundPrimary)\r\n $scope.currentSavedAccount = $scope.savedAccounts[0];\r\n\r\n setCurrentSavedBankAccountAttributes();\r\n };\r\n\r\n $scope.savedAccountChanged = function()\r\n {\r\n setCurrentSavedBankAccountAttributes();\r\n }\r\n\r\n function setupDashboardInfo() {\r\n var requestResult = false;\r\n\r\n $scope.IsGettingDashboardInfo = true;\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var dataRequest = { contractAccountNumber: accountNumber }\r\n\r\n $http({\r\n url: apiUrl + 'api/Customer/GetCustomerInfo/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (data) {\r\n $scope.IsGettingDashboardInfo = false;\r\n var jsondata = data;\r\n if (jsondata) {\r\n if (jsondata.ERROR_LIST && jsondata.ERROR_LIST.length > 0) {\r\n ModalServiceExt.showError(jsondata.ERROR_LIST[0].Message);\r\n deferred.reject(requestResult);\r\n } else {\r\n acceptDashboardData(data);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n };\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function acceptDashboardData(data) {\r\n var currentAccountData = data;\r\n $scope.model.accountNumber = currentAccountData.account.AccountNumber;\r\n $scope.model.payAmount = Math.max(currentAccountData.userinfo.TotalOpenBalance, 0);\r\n\r\n if ($scope.model.payAmount == 0) {\r\n $scope.model.payAmount = \"0.00\";\r\n }\r\n };\r\n\r\n $scope.getConvFeeInfo = function (accountNumber) {\r\n usSpinnerService.spin('spinner-1');\r\n var searchObject = {\r\n accountNumber: accountNumber,\r\n };\r\n $http({\r\n url: localStorage.getItem('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 $scope.updateAmounts();\r\n usSpinnerService.stop('spinner-1');\r\n } else {\r\n }\r\n }).error(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.getProfileData = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var requestData = { accountNumber: accountNumber };\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n url: apiUrl + 'api/Profile/GetProfile/',\r\n method: \"GET\",\r\n params: requestData\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n $scope.profile = data.AccountData;\r\n // we have mask that ensures that all phone numbers are stored in database as\r\n // 11 digit number that starts with 1, but ui-mask expect phone number \r\n // to be 10 digits - the unmasked part\r\n if ($scope.profile.PrimaryPhoneNumber && $scope.profile.PrimaryPhoneNumber.length === 11) {\r\n $scope.model.phoneNumber = $scope.profile.PrimaryPhoneNumber.substr(1);\r\n }\r\n\r\n $scope.model.email = $scope.profile.Email;\r\n\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n $scope.init = function ()\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n setupDashboardInfo();\r\n $scope.getProfileData();\r\n var currentAccountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProfileBankAccountManage/GetBankAccounts',\r\n method: \"GET\",\r\n params: { accountNumber: currentAccountNumber }\r\n }).success(function (data) {\r\n if (data == null || data.length == 0) {\r\n $scope.useSavedBankAccount = false;\r\n $scope.savedAccountsVisible = false;\r\n }\r\n else {\r\n $scope.useSavedBankAccount = true;\r\n $scope.savedAccountsVisible = true;\r\n setSavedAccounts(data);\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $scope.errors.push({ Message: $scope._t(\"Server error. Try again later.\") });\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n $scope.getConvFeeInfo(currentAccountNumber);\r\n\r\n var minServiceAppointmentDate = (function () {\r\n var tomorrow = new Date();\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n return tomorrow;\r\n })();\r\n\r\n // init datepicker components\r\n $('input[name=\"scheduleDate\"]').datepicker({\r\n autoclose: true,\r\n format: \"m/d/yyyy\",\r\n startDate: minServiceAppointmentDate,\r\n todayHighlight: true\r\n });\r\n }\r\n\r\n $scope.requestSchedulePayment = function () {\r\n usSpinnerService.spin('spinner-1');\r\n var params = { \r\n contractAccountNumber: localStorage.getItem('CurrentAccountNumber'), \r\n amount: $scope.model.payAmount, \r\n paymentType: 'Check',\r\n paymentDate: $scope.scheduleDate.toUTCString()\r\n };\r\n utilli.addUserName($state, params);\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/SchedulePayment/',\r\n method: \"POST\",\r\n data: params\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showMessage(\r\n $scope._t('Schedule Payment'),\r\n $scope._t('Your request to schedule a payment has been received. Thank you for your payment.'),\r\n function(){ $state.goMainLayout('Dashboard'); });\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.$watch('model.payAmount', function () {\r\n $scope.updateAmounts();\r\n });\r\n\r\n $scope.updateAmounts = function () {\r\n if ($scope.model.payAmount == undefined) {\r\n $scope.model.totalAmount = '';\r\n $scope.model.convenienceFee = '';\r\n if ($scope.payForm != undefined)\r\n $scope.payForm.$setValidity(\"AmountToPay\", false);\r\n return;\r\n }\r\n\r\n //if (parseFloat($scope.model.payAmount) > window.Config.largeConvenienceFeeBorder) {\r\n // $scope.model.convenienceFee = $scope.model.largeConvenienceFee;\r\n //} else {\r\n // $scope.model.convenienceFee = $scope.model.smallConvenienceFee;\r\n //}\r\n\r\n //var payAmount = parseFloat($scope.model.payAmount);\r\n //$scope.model.totalAmount = $scope.formatDecimal(payAmount + parseFloat($scope.model.convenienceFee));\r\n\r\n var info = $scope.convFeeInfo;\r\n\r\n if (info == null) return;\r\n\r\n var payAmount = parseFloat($scope.model.payAmount);\r\n\r\n if (isNaN(payAmount)) {\r\n $scope.model.totalAmount = '';\r\n if ($scope.payForm != undefined)\r\n $scope.payForm.$setValidity(\"AmountToPay\", false);\r\n return;\r\n }\r\n\r\n if ($scope.isFeeEnabled) {\r\n if (info.FeeTypeAch == \"percent\") {\r\n $scope.model.convenienceFee = $scope.formatDecimal(payAmount / 100 * info.FeeAmountAch);\r\n } else if (info.FeeTypeAch == \"flat\") {\r\n $scope.model.convenienceFee = $scope.formatDecimal(info.FeeAmountAch);\r\n }\r\n }\r\n else {\r\n $scope.model.convenienceFee = 0;\r\n }\r\n\r\n $scope.model.totalAmount = $scope.formatDecimal(payAmount + parseFloat($scope.model.convenienceFee));\r\n }\r\n\r\n $scope.model = $.extend({}, $scope.model, PayByCheckService.model); // restore form data\r\n\r\n $scope.isPayingContinuing = false;\r\n $scope.paymentResultData = '';\r\n $scope.isResultShowing = false;\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n };\r\n\r\n var getFormData = function () {\r\n\r\n var data = {\r\n AccountNumber: $scope.model.accountNumber,\r\n AmountToPay: $scope.model.payAmount,\r\n BankRoutingNumber: $scope.model.bankRoutingNumber,\r\n CheckingAccountNumber: $scope.model.checkingAccountNumber,\r\n Email: $scope.model.email,\r\n NameOnAccount: $scope.model.nameOnAccount,\r\n PhoneNumber: utilli.getFullPhoneNumber($scope.model.phoneNumber)\r\n };\r\n\r\n return data;\r\n };\r\n\r\n $scope.okAfterSuccessfulPayment = function () {\r\n $state.goMainLayout('Dashboard');\r\n }\r\n\r\n $scope.validate = function () {\r\n var result = true;\r\n var re, matched;\r\n\r\n $scope.amountError = false;\r\n\r\n $scope.errors = [];\r\n if ($scope.model.payAmount == undefined || $scope.model.payAmount == '') {\r\n result = false;\r\n $scope.amountError = true;\r\n }\r\n else\r\n {\r\n re = /^[0-9]+(\\.[0-9][0-9]?)?$/i;\r\n matched = re.test($scope.model.payAmount);\r\n if (!matched) {\r\n result = false;\r\n $scope.amountError = true;\r\n }\r\n }\r\n\r\n if (!$scope.model.bankRoutingNumber) {\r\n result = false;\r\n }\r\n else {\r\n re = /^[0-9]{9}$/i;\r\n matched = re.test($scope.model.bankRoutingNumber);\r\n if (!matched) {\r\n result = false;\r\n }\r\n }\r\n\r\n if (!$scope.useSavedBankAccount && !$scope.model.checkingAccountNumber) {\r\n result = false;\r\n }\r\n else if (!$scope.useSavedBankAccount) {\r\n re = /^[0-9]{0,17}$/i;\r\n matched = re.test($scope.model.checkingAccountNumber);\r\n if (!matched) {\r\n result = false;\r\n }\r\n }\r\n\r\n if ($scope.model.reenterCheckingAccountNumber == $scope.model.bankRoutingNumber) {\r\n result = false;\r\n }\r\n\r\n if ($scope.model.reenterCheckingAccountNumber != $scope.model.checkingAccountNumber) {\r\n result = false; // this is important!\r\n }\r\n\r\n if ($scope.payForm.$error.confirmCheckingAccount) {\r\n result = false;\r\n }\r\n\r\n if (!$scope.model.email) {\r\n result = false;\r\n }\r\n else {\r\n re = /^(([^<>()[\\]\\\\.,;:\\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 matched = re.test($scope.model.email);\r\n if (!matched) {\r\n result = false;\r\n }\r\n }\r\n\r\n if ($scope.model.nameOnAccount == undefined || !$scope.model.nameOnAccount) {\r\n result = false;\r\n }\r\n\r\n if ($scope.model.nameOnAccount.length < 1) {\r\n result = false;\r\n }\r\n\r\n if (!$scope.model.phoneNumber) {\r\n result = false;\r\n }\r\n return result;\r\n }\r\n\r\n $scope.formatDecimal = function (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 initPicker() {\r\n $scope.dpOptions = utilli.datePickerOptions;\r\n $scope.altInputFormats = ['M!/d!/yyyy'];\r\n }\r\n\r\n $scope.pay = function () {\r\n if ($scope.scheduleButtonClicked) {\r\n if ($scope.scheduleDate) {\r\n usSpinnerService.spin('spinner-1');\r\n $timeout(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.requestSchedulePayment();\r\n }, 1500);\r\n return;\r\n }\r\n }\r\n\r\n utilli.scrollTop();\r\n\r\n var validated = $scope.validate();\r\n if (!validated) {\r\n $scope.errors = [{ Message: utilli.errors.validationErorrsMessage }];\r\n utilli.scrollTop();\r\n return;\r\n }\r\n\r\n $scope.isPayingContinuing = true;\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var requestData;\r\n if ($scope.useSavedBankAccount)\r\n {\r\n apiUrl += 'api/Payment/PayBySavedCheck';\r\n var bankAccountInfo = $scope.currentSavedAccount.bankAccount;\r\n requestData = {\r\n bankAccountId: bankAccountInfo.Id,\r\n AccountNumber: accountNumber,\r\n AmountToPay: $scope.model.payAmount,\r\n Phone: utilli.getFullPhoneNumber($scope.model.phoneNumber),\r\n Email: $scope.model.email,\r\n };\r\n }\r\n else\r\n {\r\n apiUrl += 'api/Payment/PayByCheck';\r\n requestData = getFormData($('form[name=\"payForm\"]'));\r\n requestData.saveThisBankAccount = $scope.saveThisBankAccount;\r\n }\r\n\r\n $http({\r\n url: apiUrl,\r\n method: \"POST\",\r\n data: requestData\r\n }).success(function (response) {\r\n if (response.IsSuccessful)\r\n {\r\n PayByCheckService.paymentConfirmation = response.Message;\r\n $scope.isPayingContinuing = false;\r\n usSpinnerService.stop('spinner-1');\r\n\r\n $state.goMainLayout('PayByCheckConfirmation');\r\n }\r\n else\r\n {\r\n $scope.errors.push({ Message: response.Message });\r\n $scope.isPayingContinuing = false;\r\n usSpinnerService.stop('spinner-1');\r\n utilli.scrollTop();\r\n ModalServiceExt.showError(response.Message);\r\n }\r\n }).error(function (data) {\r\n PayByCheckService.model = $scope.model;\r\n $scope.isPayingContinuing = false;\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(data);\r\n });\r\n };\r\n}])\r\n.directive(\"repeatAccount\", function () {\r\n return {\r\n require: \"ngModel\",\r\n link: function (scope, elem, attrs, ctrl) {\r\n var otherInput = elem.inheritedData(\"$formController\")[attrs.repeatAccount];\r\n\r\n ctrl.$parsers.push(function (value) {\r\n if (value === otherInput.$viewValue) {\r\n ctrl.$setValidity(\"confirmCheckingAccount\", true);\r\n return value;\r\n }\r\n ctrl.$setValidity(\"confirmCheckingAccount\", false);\r\n });\r\n\r\n otherInput.$parsers.push(function (value) {\r\n ctrl.$setValidity(\"confirmCheckingAccount\", value === ctrl.$viewValue);\r\n return value;\r\n });\r\n }\r\n };\r\n});\r\n\nangular.module('utilliApp')\r\n .controller('PayByCheckConfirmationController', ['$scope', 'PayByCheckService', '$state', 'CommonHeaderService',\r\n function ($scope, PayByCheckService, $state, CommonHeaderService) {\r\n CommonHeaderService.setUp();\r\n \r\n $scope.ok = function(){\r\n $state.goMainLayout('Dashboard');\r\n };\r\n $scope.init = function () {\r\n $scope.paymentResultMessage = PayByCheckService.paymentConfirmation;\r\n if ($scope.paymentResultMessage == '') {\r\n $state.goMainLayout('Dashboard');\r\n }\r\n };\r\n }]);\r\n\nangular.module('utilliApp')\r\n .service('PayByCheckService', function () {\r\n var _model = {};\r\n var _paymentConfirmation = '';\r\n return {\r\n model: _model,\r\n paymentConfirmation: _paymentConfirmation\r\n };\r\n });\r\n\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n.controller('PaymentOptionsController', ['$scope', '$rootScope', '$window', '$state', '$http', 'usSpinnerService',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', 'CommonDataService',\r\nfunction ($scope, $rootScope, $window, $state, $http, usSpinnerService, LeftMenuService, ModalServiceExt, CommonHeaderService, CommonDataService) {\r\n LeftMenuService.setCurrentTab('PaymentOptions');\r\n CommonHeaderService.setUp($scope._t('Payment Options'));\r\n\r\n $scope.enableSaveBankAccounts = false;\r\n $scope.enableSaveCreditCards = false;\r\n\r\n $scope.isDataLoaded = false;\r\n $scope.PaymentOptions = [];\r\n //todo: to config\r\n\r\n CommonDataService.getCommonData().then(\r\n function (commonData) {\r\n $scope.showSchedulePayment = commonData.EnablePaymentScheduling;\r\n $scope.enableSaveBankAccounts = commonData.EnableSaveBankAccounts;\r\n $scope.enableSaveCreditCards = commonData.EnableSaveCards;\r\n },\r\n function () {\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n getPaymentOptions();\r\n\r\n $scope.addBa = function () {\r\n $state.goMainLayout('AddBankAccount');\r\n }\r\n\r\n $scope.addCard = function () {\r\n $state.goMainLayout('AddCard');\r\n }\r\n\r\n $scope.toCard = function (id) {\r\n $state.goMainLayout('Card', { Id: id });\r\n };\r\n\r\n $scope.toBankAccount = function (id) {\r\n $state.goMainLayout('BankAccount', { Id: id });\r\n };\r\n\r\n $scope.isOverdue = function(month, year)\r\n {\r\n var nowDate = new Date();\r\n var nowMonth = nowDate.getMonth() + 1;\r\n var nowYear = nowDate.getFullYear().toString().substr(2, 2);\r\n return nowYear > year || nowYear == year && nowMonth > month;\r\n }\r\n\r\n function getPaymentOptions() {\r\n startSpin();\r\n \r\n $http.get(\r\n localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetPaymentOptions',\r\n { params: { accountNumber: localStorage.getItem('CurrentAccountNumber') } })\r\n .success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n } else if (response.Data != null && response.Data.Count > 0) {\r\n $scope.PaymentOptions = response.Data.PageData;\r\n }\r\n $scope.isDataLoaded = true;\r\n stopSpin();\r\n }).\r\n error(function() {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n }\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('AddBankAccountController', ['$scope', '$http', '$q', '$rootScope', '$window', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', \r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $http, $q, $rootScope, $window, $state, usSpinnerService, LeftMenuService, ModalServiceExt, CommonHeaderService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n LeftMenuService.setCurrentTab('AddBankAccount');\r\n CommonHeaderService.setUpCancelButton(_t('New Bank Account'));\r\n //todo: to config\r\n\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n\r\n var bankAccount = {\r\n Id: '',\r\n BankAccountNumber: '',\r\n NameOnAccount: '',\r\n RoutingNumber: '',\r\n AccountType: '01',\r\n IsPrimary: false,\r\n IsEnrolled: false\r\n };\r\n $scope.BankAccount = bankAccount;\r\n\r\n $scope.submit = function () {\r\n if (!$scope.baDialog.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n startSpin();\r\n\r\n var requestData = {\r\n nameOnAccount: $scope.BankAccount.NameOnAccount,\r\n bankRoutingNumber: $scope.BankAccount.RoutingNumber,\r\n bankAccountNumber: $scope.BankAccount.BankAccountNumber,\r\n accountType: $scope.BankAccount.AccountType,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n };\r\n\r\n $http.post(localStorage.getItem('ApiUrl') + 'api/ProfileBankAccountManage/AddSavedBankAccount',\r\n requestData)\r\n .success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n ModalServiceExt.showInfo(_t('Bank Account information is successfully saved'), function () {\r\n $state.goMainLayout('PaymentOptions');\r\n });\r\n }\r\n stopSpin();\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n stopSpin();\r\n });\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('AddCardController', ['$scope', '$http', '$q', '$rootScope', '$window', 'usSpinnerService', '$state',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', \r\n// ReSharper disable InconsistentNaming\r\nfunction ($scope, $http, $q, $rootScope, $window, usSpinnerService, $state, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n $scope.firstLastNamePattern = /^(\\S)+( \\S+)+$/;\r\n\r\n $scope.isMobile = isMobileOrRipple();\r\n $scope.deviceIsWindowsPhone = deviceIsWindowsPhone;\r\n\r\n LeftMenuService.setCurrentTab('AddCard');\r\n CommonHeaderService.setUpCancelButton(_t('New Card'));\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n };\r\n\r\n var card = {\r\n id: '',\r\n number: '',\r\n holderName: '',\r\n isPrimary: false,\r\n enrolled: false,\r\n expMonth: '',\r\n expYear: ''\r\n };\r\n $scope.Card = card;\r\n\r\n $scope.submit = function () {\r\n if (!$scope.addCardDialog.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n if ($scope.addCardDialog.number.$type === 'JCB'\r\n || $scope.addCardDialog.number.$type === 'American Express'\r\n || $scope.addCardDialog.number.$type === 'Diners Club') {\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var requestData = {\r\n cardNumber: $scope.Card.number,\r\n expirationDate: '' + $scope.Card.expMonth + $scope.Card.expYear,\r\n cardHolderName: $scope.Card.holderName,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n };\r\n $http.post(localStorage.getItem('ApiUrl') + 'api/ProfileCardManage/AddSavedCard',\r\n requestData)\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 } else if (response.Data == null) {\r\n ModalServiceExt.showUnexpectedError();\r\n }\r\n else {\r\n ModalServiceExt.showInfo(_t('Credit card information successfully stored'), function () {\r\n $state.goMainLayout('PaymentOptions');\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 function onCardIOComplete(response) {\r\n $scope.Card.number = response[\"cardNumber\"];\r\n $scope.Card.expYear = response[\"expiryYear\"];\r\n $scope.Card.expMonth = response[\"expiryMonth\"];\r\n $scope.$apply();\r\n\r\n $(\"#inptCcNum\").trigger(\"input\");\r\n }\r\n\r\n function onCardIOCancel() {\r\n //alert(\"card.io scan cancelled\");\r\n }\r\n\r\n $scope.scanCreditCard = function () {\r\n CardIO.scan({\r\n \"requireExpiry\": true,\r\n \"scanExpiry\": true,\r\n \"requirePostalCode\": false,\r\n \"requireCVV\": false,\r\n \"restrictPostalCodeToNumericOnly\": true,\r\n \"hideCardIOLogo\": true,\r\n \"suppressScan\": false,\r\n \"keepApplicationTheme\": true\r\n }, onCardIOComplete, onCardIOCancel);\r\n }\r\n}]);\nangular.module('utilliApp')\r\n.controller('BankAccountController', ['$scope', '$http', '$q', '$rootScope', '$window', 'usSpinnerService', '$state',\r\n 'ModalService', 'ModalServiceExt', 'LeftMenuService', 'CommonDataService', 'CommonHeaderService', '$stateParams',\r\nfunction ($scope, $http, $q, $rootScope, $window, usSpinnerService, $state, ModalService, ModalServiceExt,\r\n LeftMenuService, CommonDataService, CommonHeaderService, $stateParams) {\r\n\r\n LeftMenuService.setCurrentTab('BankAccount');\r\n CommonHeaderService.setUpBackButton('Bank Account');\r\n\r\n $scope.enableDirectDebit = false;\r\n\r\n initBa();\r\n\r\n $scope.cancel = function () {\r\n $state.goMainLayout('PaymentOptions');\r\n };\r\n\r\n $scope.goDirectDebitFaq = function () {\r\n $state.goMainLayout('Faqs', { directDebitParam: 'true' });\r\n }\r\n\r\n $scope.togglePrimaryBankAccount = function () {\r\n startSpin();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProfileBankAccountManage/SetPrimarySavedBankAccount',\r\n method: 'POST',\r\n data: {\r\n bankAccountId: $scope.BankAccount.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n $scope.BankAccount.IsPrimary = !$scope.BankAccount.IsPrimary;\r\n stopSpin();\r\n if ($scope.BankAccount.IsPrimary)\r\n ModalServiceExt.showInfo($scope._t('Successfully set as primary account'));\r\n else\r\n ModalServiceExt.showInfo($scope._t('Successfully removed as primary account'));\r\n }).error(function (data) {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.showDeleteConfirmation = function () {\r\n ModalServiceExt.showYesNoMessage($scope._t('Yes or No?'), $scope._t('Are you sure you want to delete this bank account?'), deleteBankAccount);\r\n };\r\n\r\n function deleteBankAccount() {\r\n startSpin();\r\n \r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProfileBankAccountManage/DeleteSavedBankAccount',\r\n method: 'POST',\r\n data: {\r\n bankAccountId: $scope.BankAccount.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n stopSpin();\r\n\r\n ModalServiceExt.showInfo($scope._t('Bank Account information successfully removed.'), function () {\r\n $state.goMainLayout('PaymentOptions');\r\n });\r\n }).error(function (data) {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.makeEnrolled = function () {\r\n alert('not implemente');\r\n if ($scope.BankAccount.enrolled) {\r\n $scope.BankAccount.enrolled = !$scope.BankAccount.enrolled;\r\n }\r\n else {\r\n $scope.BankAccount.enrolled = !$scope.BankAccount.enrolled;\r\n }\r\n }\r\n\r\n $scope.toggleEnrollment = function () {\r\n if ($scope.BankAccount.IsEnrolled) {\r\n $state.goMainLayout('UnenrollBankAccountMessage', { Id: $stateParams.Id });\r\n }\r\n else {\r\n $state.goMainLayout('EnrollBankAccountMessage', { Id: $stateParams.Id });\r\n }\r\n }\r\n\r\n $scope.makePrimary = function () {\r\n alert('not implemented');\r\n if ($scope.BankAccount.isPrimary) {\r\n $scope.BankAccount.isPrimary = !$scope.BankAccount.isPrimary;\r\n }\r\n else {\r\n $scope.BankAccount.isPrimary = !$scope.BankAccount.isPrimary;\r\n }\r\n }\r\n\r\n function initBa() {\r\n if (!$stateParams.Id)\r\n {\r\n $state.goMainLayout('PaymentOptions');\r\n return;\r\n }\r\n \r\n startSpin();\r\n \r\n $http.get(localStorage.getItem('ApiUrl') + 'api/ProfileBankAccountManage/GetBankAccount', {\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n baId: $stateParams.Id\r\n }\r\n }).success(function(response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0], function() {\r\n $state.goMainLayout('PaymentOptions');\r\n });\r\n stopSpin();\r\n return;\r\n }\r\n $scope.BankAccount = response.Data;\r\n\r\n CommonDataService.getCommonData()\r\n .then(function(commonData) {\r\n $scope.enableDirectDebit = commonData.EnableSavedBankAccountsInDirectDebitGrid;\r\n });\r\n\r\n stopSpin();\r\n }).error(function() {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('EnrollBankAccountMessageController', ['$scope', '$http', '$rootScope', '$window', '$state',\r\n 'usSpinnerService', 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', '$stateParams',\r\n function ($scope, $http, $rootScope, $window, $state, usSpinnerService, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, $stateParams) {\r\n\r\n LeftMenuService.setCurrentTab('EnrollBankAccountMessage');\r\n CommonHeaderService.setUpBackButton('Enroll', true);\r\n $scope.enrollMessage = $scope._t('loading...');\r\n $scope.errors = [];\r\n\r\n if (!$stateParams.Id)\r\n $state.goMainLayout('PaymentOptions');\r\n\r\n $scope.init = function () {\r\n startSpin();\r\n \r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetEnrollMessage';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: { paymentType: '1', accountNumber: accountNumber, id: $stateParams.Id }\r\n }).success(function (data) {\r\n $scope.enrollMessage = data.Data.Message;\r\n\r\n if (data.Data.WasEnrolled) {\r\n $scope.wasEnrolled = true;\r\n $scope.errors.push({ Message: $scope._t('This Bank Account was already enrolled.') });\r\n }\r\n\r\n stopSpin();\r\n }).error(function () {\r\n stopSpin();\r\n });\r\n }\r\n\r\n $scope.enroll = function () {\r\n startSpin();\r\n\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/EnrollSavedBankAccount';\r\n $http({\r\n url: url,\r\n method: 'POST',\r\n data: {\r\n id: $stateParams.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n userId: $stateParams.userId\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n stopSpin();\r\n ModalServiceExt.showInfo($scope._t('Bank account was successfully enrolled.'), function () {\r\n $state.goMainLayout('BankAccount', { Id: $stateParams.Id });\r\n });\r\n }).error(function () {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n }])\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('CardController',\r\n['$scope', '$http', '$q', '$rootScope', '$window', '$state', 'usSpinnerService', 'ModalService', 'ModalServiceExt',\r\n 'LeftMenuService', 'CommonDataService', 'CommonHeaderService', '$stateParams', \r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, $q, $rootScope, $window, $state, usSpinnerService, ModalService, ModalServiceExt,\r\n LeftMenuService, CommonDataService, CommonHeaderService, $stateParams) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n LeftMenuService.setCurrentTab('Card');\r\n CommonHeaderService.setUpBackButton(_t('Credit/Debit Card'));\r\n\r\n $scope.enableDirectDebit = false;\r\n\r\n initCard();\r\n\r\n $scope.cancel = function () {\r\n $state.goMainLayout('PaymentOptions');\r\n };\r\n\r\n $scope.goDirectDebitFaq = function () {\r\n $state.goMainLayout('Faqs', { directDebitParam: 'true' });\r\n }\r\n\r\n $scope.togglePrimaryCard = function () {\r\n startSpin();\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProfileCardManage/SetPrimarySavedCard',\r\n method: 'POST',\r\n data: {\r\n cardId: $scope.Card.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\r\n }).success(function(response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n $scope.Card.IsPrimary = !$scope.Card.IsPrimary;\r\n stopSpin();\r\n if ($scope.Card.IsPrimary)\r\n ModalServiceExt.showInfo(_t('Successfully set as primary account'));\r\n else\r\n ModalServiceExt.showInfo(_t('Successfully removed as primary account'));\r\n }).error(function() {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function deleteCard() {\r\n startSpin();\r\n $http.post(localStorage.getItem('ApiUrl') + 'api/ProfileCardManage/DeleteSavedCard', {\r\n id: $scope.Card.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n }).success(function(response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n stopSpin();\r\n\r\n ModalServiceExt.showInfo(_t('Credit Card information successfully removed.'), function () {\r\n $state.goMainLayout('PaymentOptions');\r\n });\r\n }).error(function() {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.toggleEnrollment = function () {\r\n if ($scope.Card.IsEnrolled) {\r\n $state.goMainLayout('UnenrollCardMessage', { Id: $stateParams.Id });\r\n }\r\n else {\r\n $state.goMainLayout('EnrollCardMessage', { Id: $stateParams.Id });\r\n }\r\n }\r\n\r\n $scope.showDeleteConfirmation = function () {\r\n ModalServiceExt.showYesNoMessage(_t('Yes or No?'), _t('Are you sure you want to delete this card?'),\r\n deleteCard);\r\n };\r\n\r\n function initCard() {\r\n if (!$stateParams.Id) {\r\n $state.goMainLayout('PaymentOptions');\r\n return;\r\n }\r\n\r\n startSpin();\r\n \r\n $http.get(localStorage.getItem('ApiUrl') + 'api/ProfileCardManage/GetCreditCard', {\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n cardId: $stateParams.Id\r\n }\r\n }).success(function(response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0], function() {\r\n $state.goMainLayout('PaymentOptions');\r\n });\r\n\r\n stopSpin();\r\n return;\r\n }\r\n $scope.Card = response.Data;\r\n CommonDataService.getCommonData()\r\n .then(function(commonData) {\r\n $scope.enableDirectDebit = commonData.EnableSavedCreditCardsInDirectDebitGrid;\r\n });\r\n\r\n stopSpin();\r\n }).error(function() {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n }])\r\n ;\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('EnrollCardMessageController', ['$scope', '$http', '$rootScope', '$window', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', '$stateParams',\r\n function ($scope, $http, $rootScope, $window, $state, usSpinnerService, LeftMenuService, ModalServiceExt,\r\n CommonHeaderService, $stateParams) {\r\n\r\n LeftMenuService.setCurrentTab('EnrollCardMessage');\r\n CommonHeaderService.setUpBackButton($scope._t('Enroll'), true);\r\n $scope.enrollMessage = $scope._t('loading...');\r\n $scope.errors = [];\r\n\r\n if (!$stateParams.Id)\r\n $state.goMainLayout('PaymentOptions');\r\n\r\n $scope.init = function ()\r\n {\r\n startSpin();\r\n \r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetEnrollMessage';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n paymentType: '0',\r\n accountNumber: accountNumber,\r\n id: $stateParams.Id,\r\n userId: $stateParams.userId\r\n }\r\n }).success(function (data) {\r\n $scope.enrollMessage = data.Data.Message;\r\n\r\n if (data.Data.WasEnrolled) {\r\n $scope.wasEnrolled = true;\r\n $scope.errors.push({ Message: $scope._t('This Card was already enrolled.') });\r\n }\r\n\r\n stopSpin();\r\n }).error(function () {\r\n stopSpin();\r\n });\r\n }\r\n\r\n $scope.enroll = function ()\r\n {\r\n startSpin();\r\n\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/EnrollSavedCreditCard';\r\n $http({\r\n url: url,\r\n method: 'POST',\r\n data: {\r\n id: $stateParams.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n stopSpin();\r\n ModalServiceExt.showInfo($scope._t('Card was successfully enrolled.'), function () {\r\n $state.goMainLayout('Card', { Id: $stateParams.Id });\r\n });\r\n }).error(function () {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.cancel = function ()\r\n {\r\n $window.history.back();\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n }])\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('UnenrollCardMessageController', ['$scope', '$http', '$rootScope', '$window', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', '$stateParams',\r\n function ($scope, $http, $rootScope, $window, $state, usSpinnerService, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, $stateParams) {\r\n\r\n LeftMenuService.setCurrentTab('EnrollCardMessage');\r\n CommonHeaderService.setUpBackButton($scope._t('Unenroll'), true);\r\n $scope.unenrollMessage = 'loading...';\r\n $scope.errors = [];\r\n\r\n if (!$stateParams.Id)\r\n $state.goMainLayout('PaymentOptions');\r\n\r\n $scope.init = function ()\r\n {\r\n startSpin();\r\n \r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetUnenrollMessage';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n optionId: $stateParams.Id,\r\n paymentType: '0'\r\n }\r\n }).success(function (data) {\r\n $scope.unenrollMessage = data.Data.Message;\r\n\r\n if (!data.Data.WasEnrolled) {\r\n $scope.wasUnenrolled = true;\r\n $scope.errors.push({ Message: $scope._t('This Card is not enrolled or was already unenrolled.') });\r\n }\r\n\r\n stopSpin();\r\n }).error(function () {\r\n stopSpin();\r\n });\r\n }\r\n\r\n $scope.unenroll = function () {\r\n startSpin();\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/DbUnenroll';\r\n $http({\r\n url: url,\r\n method: 'POST',\r\n data: {\r\n id: $stateParams.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n userId: $stateParams.userId\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n stopSpin();\r\n ModalServiceExt.showInfo($scope._t('Card was successfully unenrolled.'), function () {\r\n $state.goMainLayout('Card', { Id: $stateParams.Id });\r\n });\r\n }).error(function () {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.cancel = function ()\r\n {\r\n $window.history.back();\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n }])\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('UnenrollBankAccountMessageController', ['$scope', '$http', '$rootScope', '$window', '$state',\r\n 'usSpinnerService', 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', '$stateParams',\r\n function ($scope, $http, $rootScope, $window, $state, usSpinnerService, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, $stateParams) {\r\n\r\n LeftMenuService.setCurrentTab('EnrollBankAccountMessage');\r\n CommonHeaderService.setUpBackButton($scope._t('Unenroll'), true);\r\n $scope.unenrollMessage = $scope._t('loading...');\r\n $scope.errors = [];\r\n\r\n if (!$stateParams.Id)\r\n $state.goMainLayout('PaymentOptions');\r\n\r\n $scope.init = function () {\r\n startSpin();\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetUnenrollMessage';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n optionId: $stateParams.Id,\r\n paymentType: '1'\r\n }\r\n }).success(function (data) {\r\n $scope.unenrollMessage = data.Data.Message;\r\n\r\n if (!data.Data.WasEnrolled) {\r\n $scope.wasUnenrolled = true;\r\n $scope.errors.push({ Message: $scope._t('This Bank Account is not enrolled or was already unenrolled.') });\r\n }\r\n\r\n stopSpin();\r\n }).error(function () {\r\n stopSpin();\r\n });\r\n }\r\n\r\n $scope.unenroll = function () {\r\n startSpin();\r\n \r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/DbUnenroll';\r\n $http({\r\n url: url,\r\n method: 'POST',\r\n data: {\r\n id: $stateParams.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n userId: $stateParams.userId\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n stopSpin();\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n stopSpin();\r\n ModalServiceExt.showInfo($scope._t('Bank account was successfully unenrolled.'), function () {\r\n $state.goMainLayout('BankAccount', { Id: $stateParams.Id });\r\n });\r\n }).error(function () {\r\n stopSpin();\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n }\r\n\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n }])\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('MaintenanceController', ['$scope', '$http', '$state', '$q', 'usSpinnerService', '$window',\r\n '$timeout', 'ServiceProvidersService', '$sce',\r\n function ($scope, $http, $state, $q, usSpinnerService, $window, $timeout, ServiceProvidersService, $sce) {\r\n\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 usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: DeploymentSettings.providersServiceUrl + 'StaticData/GetContactPhonesHtml/?serviceProvider='\r\n }).success(function (data) {\r\n $scope.hasContacts = true;\r\n $scope.isLoading = false;\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $scope.failedAttempt = true;\r\n $scope.isLoading = false;\r\n usSpinnerService.stop('spinner-1');\r\n });\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 }).success(function (data) {\r\n $scope.contactsInfo = $sce.trustAsHtml(data);\r\n $scope.phoneLoaded = true;\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $scope.failedAttempt = true;\r\n $scope.isLoading = false;\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.check = function () {\r\n var url = localStorage.getItem('ApiUrl');\r\n if (!url && isMobileOrRipple()) {\r\n if (intervalId != -1)\r\n clearInterval(intervalId);\r\n $state.goToSignIn();\r\n return;\r\n }\r\n else if (url) {\r\n usSpinnerService.spin('spinner-1');\r\n url += 'api/System/Check';\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 url = apiUrl + 'api/System/Check';\r\n return makeChecking(url);\r\n })\r\n .then(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n\r\n function makeChecking(url) {\r\n var result = $q.defer();\r\n $http({\r\n url: url,\r\n method: 'POST'\r\n }).success(function (data) {\r\n if (data !== 'success') {\r\n result.resolve();\r\n return;\r\n }\r\n\r\n if (intervalId != -1)\r\n clearInterval(intervalId);\r\n\r\n var token = localStorage.getItem('SecurityToken');\r\n var account = localStorage.getItem('CurrentAccountNumber');\r\n if (!token || !account) {\r\n $state.goToSignIn();\r\n result.resolve();\r\n return;\r\n }\r\n\r\n $state.goMainLayout('Dashboard');\r\n result.resolve();\r\n\r\n }).error(function (e) {\r\n result.resolve();\r\n });\r\n return result.promise;\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('AboutUsController', ['$scope', '$http', '$q', '$rootScope', '$window', 'usSpinnerService', '$state',\r\n 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService', '$sce',\r\nfunction ($scope, $http, $q, $rootScope, $window, usSpinnerService, $state, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, $sce) {\r\n\r\n LeftMenuService.setCurrentTab('AboutUs');\r\n CommonHeaderService.setUpBackButton($scope._t('About Us'));\r\n\r\n $scope.aboutUsHtml = '';\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n };\r\n\r\n $scope.init = function () {\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var url = apiUrl + 'api/StaticData/GetAboutUsText/';\r\n startSpin();\r\n $http({\r\n url: url,\r\n method: \"GET\"\r\n }).success(function (data) {\r\n $scope.aboutUsHtml = $sce.trustAsHtml(data);\r\n stopSpin();\r\n }).error(function () {\r\n stopSpin();\r\n });\r\n\r\n }\r\n\r\n //todo: improve the service\r\n function startSpin() {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n function stopSpin() {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('DonationHistoryController', ['$scope', 'LeftMenuService', 'CommonHeaderService', '$window', '$http', 'usSpinnerService', 'ModalServiceExt',\r\n function ($scope, LeftMenuService, CommonHeaderService, $window, $http, usSpinnerService, ModalServiceExt) {\r\n\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton('Donation History');\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n $scope.years = [2018, 2017, 2016, 2015];\r\n $scope.year = $scope.years[0];\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n getDonations();\r\n\r\n function getDonations() {\r\n $http({\r\n url: apiUrl + 'api/Donation/GetDonationHistory',\r\n method: 'GET',\r\n params: { accountNumber: accountNumber, year: $scope.year }\r\n })\r\n .success(function (result) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n $scope.donationsKendoGrid.dataSource.data(result.Data);\r\n })\r\n .error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n $scope.gridOptions = {\r\n columns: [\r\n {\r\n field: \"InvoiceNumber\",\r\n title: $scope._t(\"Invoice Number\"),\r\n width: 100\r\n }, \r\n {\r\n field: \"Date\",\r\n title: $scope._t(\"Date\"),\r\n template: \"#= DisplayedDate #\",\r\n width: 150\r\n },\r\n {\r\n field: \"Donation\",\r\n title: $scope._t(\"Donation\"),\r\n template: \"$#= Donation #\",\r\n width: 50\r\n },\r\n {\r\n field: \"Status\",\r\n title: $scope._t(\"Status\"),\r\n template: \"#= DisplayedStatus #\",\r\n width: 50\r\n }\r\n ]\r\n }\r\n \r\n $scope.yearChanged = function() {\r\n getDonations();\r\n }\r\n\r\n $scope.back = function() {\r\n $window.history.back();\r\n }\r\n\r\n $scope.emailReport = function () {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n url: apiUrl + 'api/Donation/SendEmailReport',\r\n method: 'POST',\r\n data: { AccountNumber: accountNumber, Year: $scope.year }\r\n }).success(function(result) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (result.Errors && result.Errors.length > 0)\r\n ModalServiceExt.showError(result.Errors[0]);\r\n else\r\n ModalServiceExt.showInfo($scope._t('Report was successfuly sent.'));\r\n }).error(function(error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('BudgetBillingLearnMoreController',\r\n[\r\n '$scope', '$window', '$http', '$state', 'usSpinnerService', 'LeftMenuService', 'CommonHeaderService', '$sce',\r\n 'ProgramEnrollmentsSettings', 'ModalServiceExt',\r\n function ($scope, $window, $http, $state, usSpinnerService, LeftMenuService, CommonHeaderService, $sce,\r\n ProgramEnrollmentsSettings, ModalServiceExt) {\r\n\r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('Learn More'), true);\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.infoHtmlCode = '';\r\n\r\n $http({\r\n url: apiUrl + 'api/BudgetBilling/GetLearnMoreInfo',\r\n method: 'GET'\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.infoHtmlCode = $sce.trustAsHtml(response.Data);\r\n }).error(function(error) {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .getSettings('BudgetBilling')\r\n .then(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.program = data;\r\n }, function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.toggleEnrollment = function () {\r\n if($scope.program.IsEnrolled)\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.budgetBilling)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.program.IsEnrolled = !$scope.program.IsEnrolled;\r\n ModalServiceExt.showInfo(\"Program is successfuly unenrolled.\")\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n return;\r\n }\r\n $state.goMainLayout('BudgetBilling');\r\n }\r\n\r\n $scope.back = function() {\r\n $window.history.back();\r\n }\r\n }\r\n]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('BudgetBillingController',\r\n['$scope', '$http', '$state', 'usSpinnerService', 'LeftMenuService', 'CommonHeaderService', '$window', 'ModalServiceExt',\r\n 'ProgramEnrollmentsSettings',\r\n function ($scope, $http, $state, usSpinnerService, LeftMenuService, CommonHeaderService, $window, ModalServiceExt,\r\n ProgramEnrollmentsSettings) {\r\n \r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton($scope._t('Budget Billing'), true);\r\n\r\n $scope.enrollStep = 'step1';\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http({\r\n method: 'GET',\r\n url: apiUrl + 'api/BudgetBilling/GetBudgetBillingData',\r\n params: { accountNumber: accountNumber }\r\n }).success(function (result) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n\r\n $scope.billingData = result.Data;\r\n\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.viewBillingHistory = function() {\r\n $state.goMainLayout('BillsAndPayments');\r\n }\r\n\r\n $scope.next = function() {\r\n $scope.enrollStep = 'step2';\r\n }\r\n\r\n $scope.enroll = function () {\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .toggleProgramEnrollment(ProgramEnrollmentsSettings.programEnrollmentsType.budgetBilling)\r\n .then(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo($scope._t('You successfuly enrolled.'), function () {\r\n $state.goMainLayout(\"ProgramEnrolments\");\r\n });\r\n }, function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n console.error(error);\r\n });\r\n usSpinnerService.spin('spinner-1');\r\n }\r\n\r\n $scope.back = function () {\r\n if ($scope.enrollStep === 'step1')\r\n $window.history.back();\r\n\r\n if ($scope.enrollStep === 'step2')\r\n $scope.enrollStep = 'step1';\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 }]);\nangular.module('utilliApp')\r\n .service('BillsService', function() {\r\n\r\n var currentBill = null;\r\n\r\n var getCurrentBill = function() {\r\n return currentBill;\r\n }\r\n\r\n var setCurrentBill = function(bill) {\r\n currentBill = bill;\r\n }\r\n\r\n return {\r\n getCurrentBill: getCurrentBill,\r\n setCurrentBill: setCurrentBill,\r\n };\r\n\r\n });\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .service('CustomerInfoDataService', ['$http', '$q', '$state', function ($http, $q, $state) {\r\n var cache = null;\r\n var getCustomerInfoData = function () {\r\n var deferred = $q.defer();\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var securityToken = localStorage.getItem('SecurityToken');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n if (!apiUrl || !securityToken || !accountNumber)\r\n {\r\n $state.goToSignIn();\r\n return deferred.promise;\r\n }\r\n\r\n var params = { contractAccountNumber: accountNumber }\r\n var url = apiUrl + 'api/Customer/GetCustomerInfo/';\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: params\r\n }).success(function (data) {\r\n if (!data) {\r\n deferred.reject(utilli.errors.serverErrorMessage);\r\n return;\r\n }\r\n if (data.ERROR_LIST && data.ERROR_LIST.length > 0) {\r\n deferred.reject(data.ERROR_LIST[0].Message);\r\n return;\r\n }\r\n deferred.resolve(data);\r\n cache = data;\r\n }).error(function (errorInfo) {\r\n deferred.reject(errorInfo);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n return {\r\n getCustomerInfoData: getCustomerInfoData,\r\n /**\r\n * Cached data can be used on pages where it's not required to show fields that can be changed.\r\n * For example, service address or utillity type can't be changed, \r\n * hence we can use cached data for this cases.\r\n */\r\n getCachedData: function () {\r\n // cache can be empty if user pressed F5\r\n if (!cache) {\r\n return this.getCustomerInfoData();\r\n }\r\n var deferred = $q.defer();\r\n deferred.resolve(cache);\r\n return deferred.promise;\r\n }\r\n };\r\n }]);\nangular.module('utilliApp')\r\n .service('AddPropertyService', function () {\r\n\r\n var currentProperty = null;\r\n\r\n var getCurrentProperty = function () {\r\n return currentProperty;\r\n }\r\n\r\n var setCurrentProperty = function (property) {\r\n currentProperty = property;\r\n }\r\n\r\n return {\r\n getCurrentProperty: getCurrentProperty,\r\n setCurrentProperty: setCurrentProperty\r\n };\r\n\r\n});\nangular.module('utilliApp')\r\n .service('ModalServiceExt', ['ModalService', '$window', '$q', function (ModalService, $window, $q) {\r\n var messagesQueue = [];\r\n\r\n var messageTypes = {\r\n simpleModal: 'simpleModal',\r\n yesNo: 'yesNo',\r\n ok: 'ok',\r\n loginRequired: 'loginRequired'\r\n }\r\n\r\n function addMessageToQueue(message, typeMessage, showModalCallback) {\r\n messagesQueue.push({\r\n message: message,\r\n messageType: typeMessage,\r\n showModalCallback: showModalCallback\r\n });\r\n }\r\n\r\n function removeMessage(message, messageType) {\r\n messagesQueue = _.without(messagesQueue, _.findWhere(messagesQueue, {\r\n message: message,\r\n messageType: messageType\r\n }));\r\n }\r\n\r\n function processQueue(message, messageType) {\r\n removeMessage(message, messageType);\r\n if (messagesQueue.length > 0)\r\n messagesQueue[messagesQueue.length - 1].showModalCallback();\r\n }\r\n\r\n function isMessagesQueueContains(message, messageType) {\r\n var result = _.some(messagesQueue, function (item) {\r\n return item.message === message && item.messageType === messageType;\r\n });\r\n return result;\r\n }\r\n\r\n var Service = function (isBackdropStatic) {\r\n //if _isBackdropStatic is false then we can close modal window \r\n //by clicking on backdrop area (not modal window)\r\n var service = this;\r\n\r\n this._isBackdropStatic = isBackdropStatic || false;\r\n\r\n this.withStaticBackdrop = function () {\r\n var result = new Service(true);\r\n return result;\r\n };\r\n\r\n this.clear = function () {\r\n messagesQueue = [];\r\n $window.$('.modal').modal('hide');\r\n }\r\n\r\n this.showYesNoMessage = function (title, message, yesCallback, noCallback, needHideCloseButton) {\r\n var that = this;\r\n if (isMessagesQueueContains(message, messageTypes.yesNo))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.yesNo,\r\n function () { that._showYesNoMessageTask(title, message, yesCallback, noCallback, needHideCloseButton) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showYesNoMessageTask(title, message, yesCallback, noCallback, needHideCloseButton);\r\n }\r\n\r\n this._showYesNoMessageTask = function (title, message, yesCallback, noCallback, needHideCloseButton) {\r\n var templateUrl = this._getYesNoTemplateUrl();\r\n var closeModal = null;\r\n ModalService.showModal({\r\n templateUrl: templateUrl,\r\n controller: [\"$scope\",\"close\", function ($scope, close) {\r\n closeModal = close;\r\n $scope.title = title;\r\n $scope.message = message;\r\n $scope.needToHide = needHideCloseButton;\r\n $scope.close = function (action) {\r\n if (action === 'Yes') {\r\n if (yesCallback)\r\n yesCallback();\r\n }\r\n else if (action === 'No') {\r\n if (noCallback)\r\n noCallback();\r\n } else\r\n service.showError(utilli.errors.serverErrorMessage);\r\n };\r\n }]\r\n }).then(function (modal) {\r\n modal.element.modal();\r\n modal.element.on('hidden.bs.modal', function () {\r\n // Why this is here? I dont what No callback. We have No and Yes callback running at the same time: https://atrinova.atlassian.net/browse/GNIS-2599\r\n // I see that Daniel added this when he was fixing this GNIS-2522. I can not reproduce GNIS-2522 after I commented this out:\r\n //if (noCallback) {\r\n // noCallback();\r\n //}\r\n if (closeModal)\r\n closeModal();\r\n processQueue(message, messageTypes.yesNo);\r\n });\r\n });\r\n }\r\n \r\n this.showOkMessage = function (title, message, closedCallback) {\r\n var that = this;\r\n if (isMessagesQueueContains(message, messageTypes.ok))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.ok,\r\n function () { that._showOkMessageTask(title, message, closedCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showOkMessageTask(title, message, closedCallback);\r\n }\r\n\r\n this._showOkMessageTask = function (title, message, closedCallback) {\r\n var templateUrl = this._getSimpleOkTemplateUrl();\r\n var closeModal = null;\r\n ModalService.showModal({\r\n templateUrl: templateUrl,\r\n controller: [\"$scope\",\"close\", function ($scope, close) {\r\n closeModal = close;\r\n $scope.title = title;\r\n $scope.message = message;\r\n $scope.close = function () {\r\n };\r\n }]\r\n }).then(function (modal) {\r\n modal.element.modal();\r\n modal.element.on('hidden.bs.modal', function () {\r\n if (closedCallback) {\r\n closedCallback();\r\n }\r\n if (closeModal)\r\n closeModal();\r\n processQueue(message, messageTypes.ok);\r\n });\r\n });\r\n };\r\n\r\n this.showError = function (message, closedCallback) {\r\n console.error(message);\r\n var that = this;\r\n if (isMessagesQueueContains(message, messageTypes.simpleModal))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.simpleModal,\r\n function () { that._showErrorTask(message, closedCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showErrorTask(message, closedCallback);\r\n }\r\n\r\n this._showErrorTask = function (message, closedCallback) {\r\n this._showMessage('Error', message, closedCallback);\r\n };\r\n\r\n this.checkApiResponseError = function(response) {\r\n if (response == undefined || response.data == undefined\r\n || response.data.HasErrors == undefined\r\n || response.data.Errors == undefined) {\r\n return $q.reject('Unexpected response format.');\r\n }\r\n if (response.data.HasErrors) {\r\n return $q.reject(response.data.Errors[0]);\r\n }\r\n return $q.resolve(response);\r\n };\r\n this.catchAjaxError = function () {\r\n return $q.reject(utilli.errors.serverErrorMessage);\r\n };\r\n this.showAjaxError = function () {\r\n service.showError(utilli.errors.serverErrorMessage);\r\n return $q.reject();\r\n };\r\n\r\n this.showServerError = function (closedCallback) {\r\n var that = this;\r\n var message = utilli.errors.serverErrorMessage;\r\n if (isMessagesQueueContains(message, messageTypes.simpleModal))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.simpleModal,\r\n function () { that._showServerErrorTask(message, closedCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showServerErrorTask(message, closedCallback);\r\n }\r\n\r\n this._showServerErrorTask = function (message, closedCallback) {\r\n this._showMessage('Error', message, closedCallback);\r\n };\r\n\r\n this.showUnexpectedError = function (closedCallback) {\r\n var that = this;\r\n var message = utilli._t('Unexpected error. Try to restart the application.');\r\n if (isMessagesQueueContains(message, messageTypes.simpleModal))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.simpleModal,\r\n function () { that._showUnexpectedErrorTask(message, closedCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showUnexpectedErrorTask(message, closedCallback);\r\n }\r\n\r\n this._showUnexpectedErrorTask = function (message, closedCallback) {\r\n this._showMessage('Error', message, closedCallback);\r\n };\r\n \r\n this.showInfo = function (message, closedCallback) {\r\n var that = this;\r\n if (isMessagesQueueContains(message, messageTypes.simpleModal))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.simpleModal,\r\n function () { that._showInfoTask(message, closedCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showInfoTask(message, closedCallback);\r\n }\r\n\r\n this._showInfoTask = function (message, closedCallback) {\r\n this._showMessage('Info', message, closedCallback);\r\n };\r\n\r\n this.showMessage = function (title, message, closedCallback) {\r\n var that = this;\r\n if (isMessagesQueueContains(message, messageTypes.simpleModal))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.simpleModal,\r\n function () { that._showMessage(title, message, closedCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showMessage(title, message, closedCallback);\r\n }\r\n\r\n this._showMessage = function (title, message, closedCallback) {\r\n if (!message)\r\n return;\r\n var templateUrl = this._getTemplateUrl();\r\n var closeModal = null;\r\n ModalService.showModal({\r\n templateUrl: templateUrl,\r\n controller: [\"$scope\",\"close\", function ($scope, close) {\r\n closeModal = close;\r\n $scope.title = title;\r\n $scope.message = message;\r\n $scope.close = function () {\r\n };\r\n }]\r\n }).then(function (modal) {\r\n modal.element.modal();\r\n modal.element.on('hidden.bs.modal', function () {\r\n if (closedCallback) {\r\n closedCallback();\r\n }\r\n if (closeModal)\r\n closeModal();\r\n processQueue(message, messageTypes.simpleModal);\r\n });\r\n });\r\n };\r\n\r\n this.showLoginRequired = function (title, message, loginCallback, registerCallback) {\r\n\r\n var that = this;\r\n if (isMessagesQueueContains(message, messageTypes.loginRequired))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.loginRequired,\r\n function () { that._showLoginRequired(title, message, loginCallback, registerCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showLoginRequired(title, message, loginCallback, registerCallback);\r\n }\r\n\r\n this._showLoginRequired = function (title, message, loginCallback, registerCallback) {\r\n if (!message)\r\n return;\r\n\r\n var templateUrl = this._getLoginRequiredTemplateUrl();\r\n var closeModal = null;\r\n ModalService.showModal({\r\n templateUrl: templateUrl,\r\n controller: [\"$scope\",\"close\", function ($scope, close) {\r\n closeModal = close;\r\n $scope.title = title;\r\n $scope.message = message;\r\n $scope.close = function (action) {\r\n if (action === 'Login') {\r\n if (loginCallback)\r\n loginCallback();\r\n }\r\n else if (action === 'Register') {\r\n if (registerCallback)\r\n registerCallback();\r\n }\r\n };\r\n }]\r\n }).then(function (modal) {\r\n modal.element.modal();\r\n modal.element.on('hidden.bs.modal', function () {\r\n if (closeModal)\r\n closeModal();\r\n processQueue(message, messageTypes.loginRequired);\r\n });\r\n });\r\n };\r\n\r\n this._getTemplateUrl = function () {\r\n var result;\r\n if (this._isBackdropStatic) {\r\n result = utilli.isAdmin\r\n ? '../Pages/Modals/simple-modal-message-static-backdrop.html'\r\n : 'Pages/Modals/simple-modal-message-static-backdrop.html';\r\n }\r\n else {\r\n result = utilli.isAdmin\r\n ? '../Pages/Modals/simple-modal-message.html'\r\n : 'Pages/Modals/simple-modal-message.html';\r\n }\r\n return result;\r\n }\r\n\r\n this._getYesNoTemplateUrl = function () {\r\n var result = utilli.isAdmin\r\n ? '../Pages/Modals/yes-no-template.html'\r\n : 'Pages/Modals/yes-no-template.html';\r\n return result;\r\n }\r\n\r\n this._getSimpleOkTemplateUrl = function () {\r\n var result = utilli.isAdmin\r\n ? '../Pages/Modals/simple-ok-template.html'\r\n : 'Pages/Modals/simple-ok-template.html';\r\n return result;\r\n }\r\n\r\n this._getLoginRequiredTemplateUrl = function() {\r\n return 'Pages/Modals/signin-register-template.html';\r\n }\r\n\r\n };\r\n\r\n\r\n return new Service();\r\n }])\r\n .controller('ModalController', [\"$scope\", \"close\", function ($scope, close) {\r\n $scope._t = utilli._t;\r\n $scope.close = function (result) {\r\n close(result, 500);\r\n };\r\n }]);\nangular.module('utilliApp')\r\n\t.service('StatesService', function () {\r\n\t\treturn { states : [\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Alabama\",\r\n\t\t\t\t\"Abbreviation\": \"AL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Alaska\",\r\n\t\t\t\t\"Abbreviation\": \"AK\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"American Samoa\",\r\n\t\t\t\t\"Abbreviation\": \"AS\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Arizona\",\r\n\t\t\t\t\"Abbreviation\": \"AZ\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Arkansas\",\r\n\t\t\t\t\"Abbreviation\": \"AR\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"California\",\r\n\t\t\t\t\"Abbreviation\": \"CA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Colorado\",\r\n\t\t\t\t\"Abbreviation\": \"CO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Connecticut\",\r\n\t\t\t\t\"Abbreviation\": \"CT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Delaware\",\r\n\t\t\t\t\"Abbreviation\": \"DE\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"District Of Columbia\",\r\n\t\t\t\t\"Abbreviation\": \"DC\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Federated States Of Micronesia\",\r\n\t\t\t\t\"Abbreviation\": \"FM\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Florida\",\r\n\t\t\t\t\"Abbreviation\": \"FL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Georgia\",\r\n\t\t\t\t\"Abbreviation\": \"GA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Guam\",\r\n\t\t\t\t\"Abbreviation\": \"GU\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Hawaii\",\r\n\t\t\t\t\"Abbreviation\": \"HI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Idaho\",\r\n\t\t\t\t\"Abbreviation\": \"ID\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Illinois\",\r\n\t\t\t\t\"Abbreviation\": \"IL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Indiana\",\r\n\t\t\t\t\"Abbreviation\": \"IN\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Iowa\",\r\n\t\t\t\t\"Abbreviation\": \"IA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Kansas\",\r\n\t\t\t\t\"Abbreviation\": \"KS\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Kentucky\",\r\n\t\t\t\t\"Abbreviation\": \"KY\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Louisiana\",\r\n\t\t\t\t\"Abbreviation\": \"LA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Maine\",\r\n\t\t\t\t\"Abbreviation\": \"ME\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Marshall Islands\",\r\n\t\t\t\t\"Abbreviation\": \"MH\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Maryland\",\r\n\t\t\t\t\"Abbreviation\": \"MD\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Massachusetts\",\r\n\t\t\t\t\"Abbreviation\": \"MA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Michigan\",\r\n\t\t\t\t\"Abbreviation\": \"MI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Minnesota\",\r\n\t\t\t\t\"Abbreviation\": \"MN\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Mississippi\",\r\n\t\t\t\t\"Abbreviation\": \"MS\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Missouri\",\r\n\t\t\t\t\"Abbreviation\": \"MO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Montana\",\r\n\t\t\t\t\"Abbreviation\": \"MT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Nebraska\",\r\n\t\t\t\t\"Abbreviation\": \"NE\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Nevada\",\r\n\t\t\t\t\"Abbreviation\": \"NV\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"New Hampshire\",\r\n\t\t\t\t\"Abbreviation\": \"NH\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"New Jersey\",\r\n\t\t\t\t\"Abbreviation\": \"NJ\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"New Mexico\",\r\n\t\t\t\t\"Abbreviation\": \"NM\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"New York\",\r\n\t\t\t\t\"Abbreviation\": \"NY\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"North Carolina\",\r\n\t\t\t\t\"Abbreviation\": \"NC\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"North Dakota\",\r\n\t\t\t\t\"Abbreviation\": \"ND\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Northern Mariana Islands\",\r\n\t\t\t\t\"Abbreviation\": \"MP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Ohio\",\r\n\t\t\t\t\"Abbreviation\": \"OH\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Oklahoma\",\r\n\t\t\t\t\"Abbreviation\": \"OK\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Oregon\",\r\n\t\t\t\t\"Abbreviation\": \"OR\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Palau\",\r\n\t\t\t\t\"Abbreviation\": \"PW\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Pennsylvania\",\r\n\t\t\t\t\"Abbreviation\": \"PA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Puerto Rico\",\r\n\t\t\t\t\"Abbreviation\": \"PR\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Rhode Island\",\r\n\t\t\t\t\"Abbreviation\": \"RI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"South Carolina\",\r\n\t\t\t\t\"Abbreviation\": \"SC\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"South Dakota\",\r\n\t\t\t\t\"Abbreviation\": \"SD\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Tennessee\",\r\n\t\t\t\t\"Abbreviation\": \"TN\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Texas\",\r\n\t\t\t\t\"Abbreviation\": \"TX\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Utah\",\r\n\t\t\t\t\"Abbreviation\": \"UT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Vermont\",\r\n\t\t\t\t\"Abbreviation\": \"VT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Virgin Islands\",\r\n\t\t\t\t\"Abbreviation\": \"VI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Virginia\",\r\n\t\t\t\t\"Abbreviation\": \"VA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Washington\",\r\n\t\t\t\t\"Abbreviation\": \"WA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"West Virginia\",\r\n\t\t\t\t\"Abbreviation\": \"WV\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Wisconsin\",\r\n\t\t\t\t\"Abbreviation\": \"WI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"Name\": \"Wyoming\",\r\n\t\t\t\t\"Abbreviation\": \"WY\"\r\n\t\t\t}\r\n\t\t]};\r\n\t});\n'use strict';\r\nangular.module('commonServices', [])\r\n .service('CommonDataService', ['$http', '$q', function ($http, $q) {\r\n\r\n var commonData = {};\r\n var hasCommonData = false;\r\n\r\n var hasData = function () {\r\n return hasCommonData;\r\n };\r\n\r\n var getCommonData = function (webServiceUrl, isNewRequest) {\r\n var deferred = $q.defer();\r\n var url = webServiceUrl \r\n ? webServiceUrl + 'api/Account/GetCommonData/'\r\n : localStorage.getItem('ApiUrl') + 'api/Account/GetCommonData/';\r\n\r\n if (isNewRequest || !hasData()) {\r\n $http({\r\n url: url,\r\n method: \"GET\"\r\n }).success(function(data) {\r\n if (data.Success) {\r\n commonData = data.Data;\r\n hasCommonData = true;\r\n deferred.resolve(commonData);\r\n }\r\n }).error(function() {\r\n deferred.reject(null);\r\n });\r\n } else {\r\n deferred.resolve(commonData);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n return {\r\n getCommonData: getCommonData,\r\n refresh: function() { hasCommonData = false; }\r\n };\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.service('LeftMenuService', ['$http', '$state', '$q', 'usSpinnerService', 'ModalServiceExt', 'NotificationBoxService', '$rootScope',\r\n function ($http, $state, $q, usSpinnerService, ModalServiceExt, NotificationBoxService, $rootScope) {\r\n var fullMenu = {\r\n Avatar: { isVisible: true }, \r\n SignOut: { isVisible: true }, \r\n AccountList: { isVisible: true }, \r\n Dashboard: { isVisible: true }, \r\n BillsAndPayments: { isVisible: true }, \r\n Usage: { isVisible: true }, \r\n PaymentOptions: { isVisible: true },\r\n MeterData: { isVisible: true }, \r\n ChangePassword: { isVisible: true }, \r\n Profile: { isVisible: true },\r\n CancelService: { isVisible: true },\r\n MoveService: { isVisible: true },\r\n OutageCenter: { isVisible: true },\r\n EnergyEfficiency: { isVisible: true },\r\n Faqs: { isVisible: true },\r\n AboutUs: { isVisible: true },\r\n Notifications: { isVisible: true },\r\n ProgramEnrolments: { isVisible: true },\r\n\r\n //Agents:\r\n Search: { isVisible: true },\r\n SearchHistory: { isVisible: true },\r\n AgentProfile: { isVisible: true },\r\n //PropertyManagers:\r\n MyPropertyGroups: { isVisible: true },\r\n MyProperties: { isVisible: true },\r\n PropertyManagerProfile: { isVisible: true },\r\n Authorizations: { isVisible: true },\r\n SharedAccounts: { isVisible: true }\r\n };\r\n\r\n var saveAsPrimaryAccount = function (userNameId) {\r\n var deferred = $q.defer();\r\n usSpinnerService.spin('spinner-1');\r\n var userName = userNameId;\r\n if (userName == null) {\r\n userName = localStorage.getItem('current_user');\r\n }\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/SetPrimaryContractAccount/',\r\n method: \"POST\",\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n userName: userName\r\n }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n deferred.reject();\r\n }\r\n deferred.resolve(response);\r\n }).error(function () {\r\n deferred.reject();\r\n })\r\n // \"['finally']\" instead of just \"finally\" because in old android browsers \"finally\" is a reserved keyword\r\n ['finally'](function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return deferred.promise;\r\n }\r\n return {\r\n isMenuItemVisible: function (menuItem) {\r\n return this.currentMenu[menuItem] && this.currentMenu[menuItem].isVisible;\r\n },\r\n currentMenu: fullMenu,\r\n setFull: function () {\r\n this.currentMenu = fullMenu;\r\n },\r\n currentTab: 'Dashboard',\r\n setCurrentTab: function (tab) {\r\n this.show();\r\n this.currentTab = tab;\r\n },\r\n isVisible: false,\r\n hide: function () {\r\n this.isVisible = false;\r\n },\r\n show: function () {\r\n this.isVisible = true;\r\n },\r\n firstAndLastNameOrCompanyName: $rootScope._t('loading...'),\r\n avatar: utilli.isAdmin ? '../Images/Icons/avatar_unknown.png' : 'Images/Icons/avatar_unknown.png',\r\n changeAccount: function (accountNumber, userEmail) {\r\n var self = this;\r\n self.avatar = utilli.isAdmin ? '../Images/Icons/avatar_unknown.png' : 'Images/Icons/avatar_unknown.png';\r\n self.firstAndLastNameOrCompanyName = $rootScope._t('loading...');\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var requestData;\r\n if (utilli.checkDefinedValue(accountNumber)) {\r\n requestData = { accountNumber: accountNumber };\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n url: apiUrl + 'api/Profile/GetProfile/',\r\n method: \"GET\",\r\n params: requestData,\r\n notCancelled: true\r\n }).success(function (data) {\r\n //if (data.Errors && data.Errors.length > 0) {\r\n // $moduleServices.setErrors(data.Errors);\r\n // usSpinnerService.stop('spinner-1');\r\n // return;\r\n //}\r\n if (data.AccountData) {\r\n self.firstAndLastNameOrCompanyName = data.AccountData.FirstAndLastNameOrCompanyName;\r\n self.avatar = apiUrl + data.AvatarURL;\r\n saveAsPrimaryAccount(data.AccountData.UserId);\r\n if (!utilli.hasAgentRole() && !utilli.hasPropertyManagerRole())\r\n NotificationBoxService.setSubscribeSmsVisibilityServerFlag(data.AccountData.SubscribeForSmsNotification !== \"1\");\r\n }\r\n }).error(function (data) {\r\n console.log(data);\r\n });\r\n }\r\n else if (utilli.hasAgentRole() || utilli.hasPropertyManagerRole())\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n var isAgent = utilli.hasAgentRole();\r\n requestData = {};\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n method: 'GET',\r\n url: isAgent ? apiUrl + 'api/Agents/GetProfile' : apiUrl + 'api/PropertyManagers/GetProfile',\r\n params: { userName: $state.params.userId }\r\n }).success(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n var userData = isAgent ? data.Data : data.Data.UserData;\r\n self.firstAndLastNameOrCompanyName = userData.FirstName + ' ' + userData.LastName;\r\n self.avatar = apiUrl + userData.AvatarPath;\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showMessage(utilli.serverErrorMessage);\r\n });\r\n }\r\n else {\r\n self.firstAndLastNameOrCompanyName = userEmail;\r\n }\r\n },\r\n signOut: function () {\r\n if (utilli.isAdmin) {\r\n ModalServiceExt.showMessage($rootScope._t('Customer sign out does not work from admin.'));\r\n } else {\r\n $state.goToWelcome();\r\n NotificationBoxService.resetSmsSubscribeNotification();\r\n utilli.clearLocalStorage();\r\n }\r\n },\r\n };\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .service('DefaultPropertyService',\r\n [\r\n '$http', '$state', '$q', 'ModalServiceExt',\r\n// ReSharper disable InconsistentNaming\r\n function($http, $state, $q, ModalServiceExt) {\r\n// ReSharper restore InconsistentNaming\r\n return {\r\n getAggregation: function(userName) {\r\n var deferred = $q.defer();\r\n var aggregation = utilli.getCurrentAggregation();\r\n var params = { propertyId: null, userName: userName };\r\n if (aggregation != null && aggregation.Type != null && aggregation.Type == utilli.aggregationTypes.group) {\r\n deferred.resolve(aggregation);\r\n }\r\n else {\r\n if (aggregation != null) {\r\n params.propertyId = aggregation.Id\r\n } \r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetDefaultProperty/',\r\n method: \"GET\",\r\n params: params\r\n }).success(function(response) {\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function() {\r\n var aggregation = response.Data;\r\n if(aggregation){\r\n aggregation.Type = utilli.aggregationTypes.property;\r\n localStorage.setItem('currentAggregation', JSON.stringify(aggregation));\r\n deferred.resolve(response.Data);\r\n }\r\n deferred.resolve(null);\r\n });\r\n }).error(function(d) {\r\n ModalServiceExt.showServerError();\r\n deferred.reject(d);\r\n });\r\n }\r\n return deferred.promise;\r\n }\r\n }\r\n }\r\n ]);\n'use strict';\r\nangular.module('utilliApp')\r\n.factory('NotificationBoxService', [\r\n function () {\r\n var _settingsKey = 'notificationBoxSettings';\r\n var observerCallbacks = [];\r\n var tempVisibility = false;\r\n\r\n var notifyObservers = function () {\r\n angular.forEach(observerCallbacks, function (callback) {\r\n callback();\r\n });\r\n };\r\n\r\n var defaultNotificationBoxSettings = {\r\n SmsSubscribeNotification: {\r\n isVisibleByServer: false,\r\n isVisibleByUser: true\r\n }\r\n };\r\n\r\n function getSettings () {\r\n var result = JSON.parse(localStorage.getItem(_settingsKey)) || defaultNotificationBoxSettings;\r\n return result;\r\n }\r\n\r\n function saveSettings(settings) {\r\n localStorage.setItem(_settingsKey, JSON.stringify(settings));\r\n }\r\n\r\n return {\r\n registerObserverCallback: function (callback) {\r\n observerCallbacks.push(callback);\r\n },\r\n\r\n isSmsSubscribeNotificationVisible: function () {\r\n var settings = getSettings();\r\n var result = settings.SmsSubscribeNotification.isVisibleByUser \r\n && settings.SmsSubscribeNotification.isVisibleByServer;\r\n return result;\r\n },\r\n\r\n hideSmsSubscribeNotification: function () {\r\n //todo: may be we should use user id in _settingsKey\r\n var settings = getSettings();\r\n settings.SmsSubscribeNotification.isVisibleByUser = false;\r\n saveSettings(settings);\r\n },\r\n\r\n resetSmsSubscribeNotification: function() {\r\n var settings = getSettings();\r\n settings.SmsSubscribeNotification.isVisibleByUser = true;\r\n settings.SmsSubscribeNotification.isVisibleByServer = false;\r\n saveSettings(settings);\r\n },\r\n\r\n setSubscribeSmsVisibilityServerFlag: function (flag) {\r\n var settings = getSettings();\r\n settings.SmsSubscribeNotification.isVisibleByServer = flag;\r\n if (flag)\r\n settings.SmsSubscribeNotification.isVisibleByUser = true;\r\n saveSettings(settings);\r\n notifyObservers();\r\n },\r\n isTemporarilyHidden: function () {\r\n return tempVisibility;\r\n },\r\n setTemporarilyHide: function (flag) {\r\n tempVisibility = flag;\r\n notifyObservers();\r\n }\r\n };\r\n }\r\n]);\nangular.module('utilliApp')\r\n .service('OpenFileService', ['$http', '$timeout', 'ModalServiceExt', 'usSpinnerService',\r\n function ($http, $timeout, ModalServiceExt, usSpinnerService) {\r\n\r\n var openBill = function (billNumber, accountNumber)\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var billTab;\r\n if (!isMobileOrRipple()) {\r\n billTab = window.open(\"about:blank\", \"_blank\");\r\n }\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Bills/DoesBillExists/',\r\n params: { accountNumber: accountNumber, invoiceNumber: billNumber },\r\n method: \"GET\"\r\n }).success(function (data) {\r\n if (data != null && data.Exists) {\r\n var billUrl = data.BillPdfUrl;\r\n if (isAndroid()) {\r\n openPdf(billUrl, billNumber);\r\n }\r\n else if (!isMobileOrRipple()) {\r\n billTab.location = billUrl;\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n else {\r\n window.open(billUrl, \"_system\", \"location=yes,closebuttoncaption=Back\");\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }\r\n else {\r\n if (billTab)\r\n billTab.close();\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n ModalServiceExt.showInfo(\"Bill PDF does not exist yet.\");\r\n }\r\n }).error(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n var openUnderstandBillFile = function (apiUrl)\r\n {\r\n try {\r\n var url = apiUrl ? apiUrl + 'api/Bills/GetUnderstandMyBill' : localStorage.getItem('ApiUrl') + 'api/Bills/GetUnderstandMyBill';\r\n\r\n if (isAndroid()) {\r\n openUnderstandBill(url);\r\n }\r\n else if (!isMobileOrRipple()) {\r\n window.open(url, '_blank');\r\n }\r\n else {\r\n window.open(url, \"_system\", \"location=yes,closebuttoncaption=Back\");\r\n }\r\n }\r\n catch (error) {\r\n ModalServiceExt.showServerError();\r\n }\r\n }\r\n\r\n\r\n function isAndroid() {\r\n return (navigator.userAgent.match(/Android/i) == \"Android\");\r\n }\r\n\r\n function openPdf(url, billNumber) {\r\n var requestFileSystemSuccessFn = function (dirEntry) {\r\n var targetFilePath = dirEntry.toURL() + billNumber + \".pdf\";\r\n var fileTransfer = new FileTransfer();\r\n var downloadErrorFn = function (error) {\r\n var errorCodeDesc = \"\";\r\n switch (error.code) {\r\n case 1:\r\n errorCodeDesc = \"FILE_NOT_FOUND_ERR\";\r\n break;\r\n case 2:\r\n errorCodeDesc = \"INVALID_URL_ERR\";\r\n break;\r\n case 3:\r\n errorCodeDesc = \"CONNECTION_ERR\";\r\n break;\r\n default:\r\n errorCodeDesc = \"unknown (\" + error.code + \")\";\r\n }\r\n console.log(\"Error downloading PDF from URL: \" + url);\r\n console.log(\"Error code = \" + errorCodeDesc + \", http_status = \" + error.http_status + \", source = \" + error.source + \", target = \" + error.target + \", body = \" + error.body);\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(\"There was an error downloading your bill. Please try again.\");\r\n };\r\n var downloadSuccessFn = function (entry) {\r\n window.plugins.webintent.startActivity(\r\n {\r\n action: window.plugins.webintent.ACTION_VIEW,\r\n url: entry.toURL(),\r\n type: \"application/pdf\"\r\n },\r\n function () { },\r\n function (e) {\r\n console.log(e);\r\n ModalServiceExt.showError(\"There was an error opening your bill. Please try again.\");\r\n }\r\n );\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n fileTransfer.download(url, targetFilePath, downloadSuccessFn, downloadErrorFn, true);\r\n\r\n }\r\n var requestFileSystemErrorFn = function (error) {\r\n ModalServiceExt.showError(\"Error during get file system. Code = \" + error.code);\r\n }\r\n window.resolveLocalFileSystemURL(cordova.file.externalCacheDirectory, requestFileSystemSuccessFn, requestFileSystemErrorFn);\r\n }\r\n\r\n function openUnderstandBill(url) {\r\n var requestFileSystemSuccessFn = function (fileSystem) {\r\n var targetFilePath = fileSystem.root.toURL() + '/understandYourBill.pdf';\r\n var fileTransfer = new FileTransfer();\r\n var downloadErrorFn = function (error) {\r\n //$scope.isUnderstandLoading = false;\r\n var errorCodeDesc = \"\";\r\n switch (error.code) {\r\n case 1:\r\n errorCodeDesc = \"FILE_NOT_FOUND_ERR\";\r\n break;\r\n case 2:\r\n errorCodeDesc = \"INVALID_URL_ERR\";\r\n break;\r\n case 3:\r\n errorCodeDesc = \"CONNECTION_ERR\";\r\n break;\r\n default:\r\n errorCodeDesc = \"unknown (\" + error.code + \")\";\r\n }\r\n console.log(\"Error downloading 'Understan Your Bill' PDF from URL: \" + url);\r\n console.log(\"Error code = \" + errorCodeDesc + \", http_status = \" + error.http_status + \", source = \" + error.source + \", target = \" + error.target + \", body = \" + error.body);\r\n ModalServiceExt.showError(\"There was an error downloading 'Understand your bill'. Please try again.\");\r\n };\r\n\r\n var downloadSuccessFn = function (entry) {\r\n window.plugins.webintent.startActivity(\r\n {\r\n action: window.plugins.webintent.ACTION_VIEW,\r\n url: entry.toURL(),\r\n type: \"application/pdf\"\r\n },\r\n function () { },\r\n function (e) {\r\n console.log(e);\r\n ModalServiceExt.showError(\"There was an error opening 'Understand your bill' pdf. Please try again.\");\r\n }\r\n );\r\n };\r\n\r\n fileTransfer.download(url, targetFilePath, downloadSuccessFn, downloadErrorFn, true);\r\n }\r\n\r\n var requestFileSystemErrorFn = function (error) {\r\n //$scope.isUnderstandLoading = false;\r\n ModalServiceExt.showError(\"Error during get file system. Code = \" + error.code);\r\n }\r\n\r\n window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, requestFileSystemSuccessFn, requestFileSystemErrorFn);\r\n }\r\n\r\n return {\r\n openBill: openBill,\r\n openUnderstandBillFile: openUnderstandBillFile\r\n };\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .factory('ServiceProvidersService', ['$http', '$q', function($http, $q) {\r\n\r\n var isCached = false;\r\n var cachedData = {};\r\n\r\n return {\r\n /**\r\n * Returns a promise with data about all service providers\r\n * @returns an array of objects with Name, LongName, Url\r\n */\r\n getProviders: function () {\r\n var deferred = $q.defer();\r\n if (isCached) {\r\n deferred.resolve(cachedData);\r\n return deferred.promise;\r\n }\r\n\r\n var url = DeploymentSettings.providersServiceUrl + 'Providers/GetAllProviders';\r\n $http({\r\n url: url,\r\n method: \"GET\"\r\n }).success(function(data) {\r\n if (!data || data.length == 0) {\r\n deferred.reject(utilli.errors.serverErrorMessage);\r\n }\r\n cachedData = data;\r\n isCached = true;\r\n deferred.resolve(cachedData);\r\n }).error(function(data) {\r\n console.error(data);\r\n deferred.reject(utilli.errors.serverErrorMessage);\r\n });\r\n return deferred.promise;\r\n },\r\n /**\r\n * Returns a promise with data about a provider\r\n * @param providerShortName short name of a provider as it's in specified for\r\n * currentServiceProvider in DeploymentSettings\r\n * @returns an object with Name, LongName, Url\r\n */\r\n getProvider: function (providerShortName){\r\n return this.getProviders()\r\n .then(function(providers){\r\n var providerName = Config.providers[providerShortName].Name;\r\n var providersFiltered = $.grep(providers, function(item){\r\n return item.Name == providerName;\r\n });\r\n return providersFiltered[0];\r\n });\r\n },\r\n getCurrentProvider: function (currentProviderName) {\r\n var providerName = currentProviderName \r\n ? currentProviderName \r\n : DeploymentSettings.currentServiceProvider;\r\n return this.getProvider(providerName);\r\n },\r\n getProviderApiUrl: function () {\r\n var result = $q.defer();\r\n this.getProviders()\r\n .then(function (providers) {\r\n try {\r\n var currentServiceProvider = DeploymentSettings.currentServiceProvider;\r\n if (currentServiceProvider.length == 0) {\r\n console.log(\"Configuration error: can't get current service provider.\");\r\n result.reject();\r\n return;\r\n }\r\n var currentProviderName = Config.providers[currentServiceProvider].Name;\r\n var providersFiltered = $.grep(providers, function (item) {\r\n return item.Name == currentProviderName;\r\n });\r\n if (!providersFiltered || providersFiltered.length !== 1) {\r\n console.log(\"Configuration error: can't get current service provider.\");\r\n result.reject();\r\n return;\r\n }\r\n result.resolve(providersFiltered[0].ApiUrl);\r\n }\r\n catch (e) {\r\n result.reject();\r\n console.log(e);\r\n }\r\n });\r\n return result.promise;\r\n }\r\n };\r\n }]);\nangular.module('utilliApp')\r\n .service('GetAccountsService', ['$http', '$q', '$state', function ($http, $q, $state) {\r\n\r\n var accounts = {};\r\n var hasAccounts = false;\r\n\r\n var getAccounts = function (forceRequest) {\r\n var deferred = $q.defer();\r\n\r\n if (hasAccounts && !forceRequest)\r\n {\r\n deferred.resolve(accounts);\r\n return deferred.promise;\r\n }\r\n\r\n hasAccounts = false;\r\n var params = { };\r\n utilli.addUserName($state, params);\r\n\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Account/GetAccountList/',\r\n method: \"GET\",\r\n params: params\r\n }).success(function (data) {\r\n\r\n if (!data)\r\n {\r\n accounts = {}\r\n accounts.Errors = [{ key: 'Error', Message: utilli.serverErrorMessage }];\r\n deferred.resolve(accounts);\r\n }\r\n\r\n accounts = data;\r\n\r\n if (accounts.Accounts && accounts.Accounts.length > 0)\r\n {\r\n hasAccounts = true;\r\n var serviceProvider = localStorage.getItem('ServiceProviderName');\r\n\r\n for (var i = 0; i < accounts.Accounts.length; i++) {\r\n accounts.Accounts[i].companyName = serviceProvider;\r\n }\r\n }\r\n \r\n deferred.resolve(accounts);\r\n }).error(function () {\r\n accounts = {};\r\n accounts.Errors = [{ key: 'Error', Message: utilli.serverErrorMessage }];\r\n deferred.resolve(accounts);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return {\r\n getAccounts: getAccounts\r\n };\r\n\r\n }]);\nangular.module('utilliApp')\r\n .service('RequestService', [\r\n '$q', function($q) {\r\n var requests = [];\r\n\r\n var add = function(config) {\r\n if (!config.url.startsWith('http://') && !config.url.startsWith('https://'))\r\n return;\r\n\r\n var abortTimeout = $q.defer();\r\n config.timeout = abortTimeout.promise;\r\n requests.push({ timeout: abortTimeout, timestamp: new Date(), notCancelled: config.notCancelled });\r\n }\r\n\r\n /**\r\n * aborts all requests that were launched before the specified timestamp\r\n */\r\n var abort = function (timestamp) {\r\n if (!timestamp) {\r\n timestamp = new Date();\r\n }\r\n var remainingRequests = [];\r\n requests.forEach(function (item) {\r\n if (item.timestamp < timestamp && !item.notCancelled) {\r\n item.timeout.promise.status = 499; //will be checked in utilliApp responseError interceptor.\r\n item.timeout.resolve();\r\n } else {\r\n remainingRequests.push(item);\r\n }\r\n });\r\n requests = remainingRequests;\r\n }\r\n\r\n var forcedAbort = function (request) {\r\n\r\n if (request.timeout) {\r\n var remainingRequests = [];\r\n requests.forEach(function (item) {\r\n if (item == request) {\r\n item.timeout.promise.status = 499; //will be checked in utilliApp responseError interceptor.\r\n item.timeout.resolve();\r\n } else {\r\n remainingRequests.push(item);\r\n }\r\n });\r\n requests = remainingRequests;\r\n return;\r\n }\r\n\r\n var abortTimeout = $q.defer();\r\n request.timeout = abortTimeout.promise;\r\n abortTimeout.resolve();\r\n }\r\n\r\n return { add: add, abort: abort, forcedAbort: forcedAbort }\r\n }\r\n ]);\n'use strict';\r\nangular.module('utilliApp')\r\n .service('DueReminderService', function () {\r\n var _isReminderShown = true;\r\n\r\n var unmarkAsShown = function () {\r\n _isReminderShown = false;\r\n }\r\n\r\n var markAsShown = function () {\r\n _isReminderShown = true;\r\n }\r\n\r\n var isReminderShown = function () {\r\n return _isReminderShown;\r\n }\r\n\r\n return {\r\n markAsShown: markAsShown,\r\n unmarkAsShown: unmarkAsShown,\r\n isReminderShown: isReminderShown\r\n };\r\n\r\n });\nangular.module('utilliApp')\r\n .service('CheckVersionService', ['$http', '$q', function ($http, $q) {\r\n var checkVersion = function () {\r\n var deferred = $q.defer();\r\n\r\n var version = Config.version.split('.')[1];\r\n var providersApiUrl = DeploymentSettings.providersServiceUrl;\r\n\r\n var url = providersApiUrl + \"Version/CheckVersion?version=\" + version;\r\n\r\n $http.get(url)\r\n .success(function (result) {\r\n deferred.resolve(result);\r\n })\r\n .error(function (err) {\r\n deferred.reject(err);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n return {\r\n checkVersion: checkVersion,\r\n // the case for old api (published before 2016-Sep-3) is \r\n // just to submit new app to stores.\r\n // we need the new app to be running while old api is still deployed\r\n // appreviewer user needs to be able to login. he will be using apistaging.utilli.com\r\n // but the check here needs to be passed so that reviewer will be \r\n // able to reach the signin page\r\n isVersionWrong: function (versionCheckResult) {\r\n return versionCheckResult === 'WrongVersion'// new api after 2016-Sep-3\r\n || versionCheckResult === 'error';// old api before 2016-Sep-3\r\n },\r\n isVersionCorrect: function(versionCheckResult) {\r\n return versionCheckResult === 'Success'// new api after 2016-Sep-3\r\n || versionCheckResult === 'success';// old api before 2016-Sep-3\r\n }\r\n };\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n .service('ServerCacheService', [\r\n '$http', function($http) {\r\n \r\n return {\r\n clearServerCache: function() {\r\n // if it was refresh (F5 pressed) then send request to refresh server cache.\r\n var token = localStorage.getItem(\"SecurityToken\");\r\n if (!token)\r\n return;\r\n \r\n var accountNumber = localStorage.getItem(\"CurrentAccountNumber\");\r\n if (!accountNumber || accountNumber === \"null\") {\r\n if (utilli.hasPropertyManagerRole()) {\r\n accountNumber = \"propertyManager\";\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n var apiUrl = localStorage.getItem(\"ApiUrl\");\r\n var url = apiUrl + \"api/Account/ClearCache\";\r\n $http({\r\n url: url,\r\n method: \"POST\",\r\n params: { accountNumber: accountNumber }\r\n })\r\n .success(function () { })\r\n .error(function () { });\r\n }\r\n }\r\n\r\n }])\n'use strict';\r\nangular.module('utilliApp').factory('HeaderServiceFactory', [\r\n '$window', '$state', '$rootScope', 'AccountListService', '$http', 'ModalServiceExt',\r\n// ReSharper disable InconsistentNaming\r\n function ($window, $state, $rootScope, AccountListService, $http, ModalServiceExt) {\r\n// ReSharper restore InconsistentNaming\r\n var getHeaderSerivce = function() {\r\n\r\n var backButtonClick = function() {\r\n $window.history.back();\r\n };\r\n\r\n var svc = {\r\n // i use underscore prefixes '_' because i want to emphasise that these fields should \r\n // be used only for reading values from them, not for setting values. \r\n // use setUp* methods if you want to set values. this will ensure absense of\r\n // bugs when you set a filed in one controller and forgot to set it to default\r\n // value in another\r\n _title: \"\",\r\n // _isDefaultTitle is used in css to hide default title when logo replaces it\r\n _isDefaultTitle: false,\r\n _rightButtonText: null,\r\n _rightButtonClick: null,\r\n _isRightButtonVisible: false,\r\n _isRightButtonAlwaysVisible: false,\r\n _areNotificationsVisible: false,\r\n _isMenuToggleButtonVisible: false,\r\n _notificationsClick: function() {\r\n $state.goMainLayout('UserNotifications');\r\n },\r\n showInsect: DeploymentSettings.deploymentEnvironment === 'Qa',\r\n logoClick: function () {\r\n if (!this.showInsect) {\r\n //if (DeploymentSettings.currentServiceProvider == 'Wgl') {\r\n // $state.goToPropertyManagersWelcome();\r\n // return;\r\n //}\r\n\r\n if (!utilli.hasAgentRole() && !utilli.hasPropertyManagerRole())\r\n $state.goToWelcome();\r\n } else {\r\n this.showInsect = false;\r\n }\r\n },\r\n _unreadNotificationCount: 0\r\n };\r\n\r\n var loadUnreadNotificationCount = function () {\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var dataRequest = {};\r\n if (utilli.hasPropertyManagerRole()) {\r\n dataRequest.accountNumber = 'propertyManager';\r\n dataRequest.userName = localStorage.getItem('current_user');\r\n } else {\r\n dataRequest.accountNumber = AccountListService.getCurrentContractAccount();\r\n }\r\n utilli.addUserName($state, dataRequest);\r\n $http({\r\n url: apiUrl + 'api/NotificationsLog/GetPortalNotificationsCount/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (response) {\r\n utilli.handleAjaxResponse(response,\r\n ModalServiceExt,\r\n function() {\r\n svc._unreadNotificationCount = response.Data;\r\n });\r\n }).error(function (data) {\r\n ModalServiceExt.showError(utilli._t(\"Can't get unread notifications count.\"));\r\n console.error(data);\r\n });\r\n }\r\n\r\n svc.setTitle = function(title) {\r\n this._isDefaultTitle = !title;\r\n this._title = title ? title : this.getDefaultTitle();\r\n };\r\n\r\n /**\r\n * Sets up header configuration.\r\n * title - optional, default value is defaultTitle\r\n * rightButtonText - optional, if not specified then the right button is not visible\r\n * rightButtonClick - optional\r\n * isRightButtonAlwaysVisible - optional, false by default. \r\n * if isRightButtonAlwaysVisible is true then the button doesn't get hidden on desktop screen sizes\r\n */\r\n svc.setUp = function(title, rightButtonText, rightButtonClick, isRightButtonAlwaysVisible) {\r\n this.setTitle(title);\r\n this._rightButtonText = rightButtonText;\r\n // the right button is visible only if a button text is specified\r\n this._isRightButtonVisible = !!rightButtonText;\r\n this._rightButtonClick = rightButtonClick;\r\n this._areNotificationsVisible = false;\r\n this._isMenuToggleButtonVisible = true;\r\n // usually the right button is the back button and it needs to be visible only in mobile apps \r\n // because it's possible that a mobile device doesn't have hardware back button\r\n // but for custom buttons such as 'Add' or 'Edit' it is required to show the button always\r\n this._rightButtonClass = isRightButtonAlwaysVisible\r\n ? '' : isMobileOrRipple()\r\n ? '' : 'visible-xs';\r\n };\r\n\r\n /**\r\n * Sets up a header with a back button on the right\r\n * title - optional, default value is defaultTitle\r\n * isRightButtonAlwaysVisible - optional, false by default. \r\n * if isRightButtonAlwaysVisible is true then the button doesn't get hidden on desktop screen sizes\r\n */\r\n svc.setUpBackButton = function(title, isRightButtonAlwaysVisible) {\r\n this.setUp(title, $rootScope._t('Back'), backButtonClick, isRightButtonAlwaysVisible);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets up a header with a back button on the right.\r\n * The only difference from setUpBackButton is the text on the right button.\r\n * title - optional, default value is defaultTitle\r\n */\r\n svc.setUpCancelButton = function(title) {\r\n this.setUp(title, $rootScope._t('Cancel'), backButtonClick);\r\n return this;\r\n };\r\n\r\n /**\r\n * Sets up a header with a notifications button on the right.\r\n * title - optional, default value is defaultTitle\r\n */\r\n svc.setUpNotificationButton = function(title) {\r\n this.setTitle(title);\r\n this._isRightButtonVisible = false;\r\n this._areNotificationsVisible = true;\r\n loadUnreadNotificationCount();\r\n this._isMenuToggleButtonVisible = true;\r\n return this;\r\n };\r\n\r\n svc.hideMenuToggleButton = function() {\r\n this._isMenuToggleButtonVisible = false;\r\n return this;\r\n };\r\n\r\n // Note: getDefaultTitle is overriden in admin in AdminHeaderService\r\n svc.getDefaultTitle = function() {\r\n var serviceProviderName = localStorage.getItem('ServiceProviderName');\r\n return serviceProviderName ? serviceProviderName : 'Utilli';\r\n };\r\n\r\n svc.setTitle();\r\n\r\n return svc;\r\n };\r\n\r\n return {\r\n getHeaderSerivce: getHeaderSerivce\r\n };\r\n }\r\n]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.factory('TimeService', ['$q', 'CommonDataService', 'ModalServiceExt',\r\n function ($q, CommonDataService, ModalServiceExt) {\r\n\r\n function createCurrentDate(timeZoneShift) {\r\n var currentDate = new Date();\r\n var currentUtcDate = currentDate.getTime() + (currentDate.getTimezoneOffset() * 60000);\r\n var currentServerDate = new Date(currentUtcDate + (3600000 * timeZoneShift));\r\n return currentServerDate;\r\n }\r\n\r\n function getTimeZone() {\r\n var resultPromise = $q.defer();\r\n\r\n CommonDataService.getCommonData()\r\n .then(function (data) {\r\n resultPromise.resolve(data.TimeZoneShift);\r\n }, function () {\r\n resultPromise.reject(null);\r\n });\r\n\r\n return resultPromise.promise;\r\n }\r\n\r\n var getTimeZoneDateAndCurrentDate = function (dateString) {\r\n var deferred = $q.defer();\r\n\r\n CommonDataService.getCommonData()\r\n .then(function (data) {\r\n \r\n var currentServerDate = createCurrentDate(data.TimeZoneShift);\r\n var timeZoneDate = kendo.parseDate(dateString, data.DateTimeFormat);\r\n\r\n deferred.resolve({\r\n currentServerDate: currentServerDate,\r\n timeZoneDate: timeZoneDate\r\n });\r\n });\r\n\r\n return deferred.promise;\r\n };\r\n\r\n var getCurrentDate = function () {\r\n var deferred = $q.defer();\r\n\r\n CommonDataService.getCommonData()\r\n .then(function (data) {\r\n var currentServerDate = createCurrentDate(data.TimeZoneShift);\r\n deferred.resolve(currentServerDate);\r\n });\r\n\r\n return deferred.promise;\r\n };\r\n\r\n var getDateString = function (date) {\r\n date = new Date(date); //if date is string\r\n var stringDate = kendo.toString(date, 'dd MMM yyyy HH:mm');\r\n return stringDate;\r\n };\r\n\r\n return {\r\n getCurrentDate: getCurrentDate,\r\n getDateString: getDateString,\r\n getTimeZone: getTimeZone,\r\n getTimeZoneDateAndCurrentDate: getTimeZoneDateAndCurrentDate\r\n }\r\n }]);\nangular.module('utilliApp')\r\n .service('PushHandlerService',['$state', function ($state) {\r\n function redirectToUserNotifications () {\r\n $state.goMainLayout('UserNotifications');\r\n }\r\n\r\n return {\r\n redirectToUserNotifications: redirectToUserNotifications\r\n };\r\n }]);\r\n\n'use strict';\r\nangular.module('utilliApp').service('OutagesService', ['$timeout', function ($timeout) {\r\n\r\n var _currentOutage = null;\r\n var _selectedOutages = [];\r\n var _callBack = null;\r\n\r\n var common = {\r\n init: function (outages, callBack) {\r\n _selectedOutages = outages;\r\n if (_selectedOutages && _selectedOutages.length > 0)\r\n _currentOutage = outages[0];\r\n\r\n if (callBack) {\r\n _callBack = callBack;\r\n _callBack(_currentOutage);\r\n }\r\n },\r\n setCurrent: function (outage, displayImage) {\r\n small.setCurrent(outage, displayImage);\r\n big.setCurrent(outage);\r\n this.callBack();\r\n },\r\n setCurrentById: function (id) {\r\n small.setCurrentById(id);\r\n big.setCurrentById(id);\r\n },\r\n closeDetails: function close() {\r\n small.close();\r\n big.close();\r\n },\r\n getStatusIcon: function (status) {\r\n var preffix = utilli.isAdmin ? '../' : '';\r\n if (status === 0) // Unverified\r\n return preffix + 'Images/map-markers/blue-dot.png';\r\n if (status === 1) // Verified\r\n return preffix + 'Images/map-markers/green-dot.png';\r\n if (status === 2) // In Progress\r\n return preffix + 'Images/map-markers/yellow-dot.png';\r\n\r\n return preffix + 'Images/map-markers/red-dot.png';\r\n },\r\n displayDetails: function () {\r\n small.displayDetails();\r\n big.displayDetails();\r\n },\r\n callBack: function () {\r\n if (_callBack)\r\n _callBack(_currentOutage);\r\n }\r\n };\r\n var small = {\r\n setCurrent: function (outage, displayImage) {\r\n _currentOutage = outage;\r\n var outageImage = $('#imageContainerSm');\r\n if (_currentOutage.Image && displayImage) {\r\n outageImage.removeClass('ng-hide');\r\n outageImage.css('background-image', 'url(' + _currentOutage.Image + ')');\r\n this.adjustImageSize();\r\n } else {\r\n if (!outageImage.hasClass('ng-hide'))\r\n outageImage.addClass('ng-hide');\r\n }\r\n common.callBack();\r\n },\r\n setCurrentById: function (id) {\r\n var selectedOutage = _.find(_selectedOutages, function (outage) {\r\n return outage.Id === id;\r\n });\r\n this.setCurrent(selectedOutage);\r\n },\r\n next: function () {\r\n var index = _.indexOf(_selectedOutages, _currentOutage);\r\n if (index >= _selectedOutages.length - 1) {\r\n common.callBack();\r\n return;\r\n }\r\n\r\n index++;\r\n var nextOutage = _selectedOutages[index];\r\n var displayImage = this.allInfoShown();\r\n common.setCurrent(nextOutage, displayImage);\r\n\r\n },\r\n previous: function () {\r\n var index = _.indexOf(_selectedOutages, _currentOutage);\r\n if (index <= 0) {\r\n common.callBack();\r\n return;\r\n }\r\n\r\n index--;\r\n var previousOutage = _selectedOutages[index];\r\n var displayImage = this.allInfoShown();\r\n common.setCurrent(previousOutage, displayImage);\r\n },\r\n disablePrevious: function () {\r\n if (!_selectedOutages || !_currentOutage)\r\n return true;\r\n\r\n var isFirst = _currentOutage === _selectedOutages[0];\r\n return isFirst;\r\n },\r\n disableNext: function () {\r\n if (!_selectedOutages || !_currentOutage)\r\n return true;\r\n\r\n var isLast = _currentOutage === _selectedOutages[_selectedOutages.length - 1];\r\n return isLast;\r\n },\r\n addressClicked: function () {\r\n if (_currentOutage.Image) {\r\n var outageImage = $('#imageContainerSm');\r\n outageImage.css('background-image', 'url(' + _currentOutage.Image + ')');\r\n outageImage.removeClass('ng-hide');\r\n this.adjustImageSize();\r\n }\r\n\r\n var outageDetails = $('.state-details');\r\n outageDetails.removeClass('ng-hide');\r\n },\r\n allInfoShown: function () {\r\n var outageDetails = $('.state-details');\r\n var infoShown = !outageDetails.hasClass('ng-hide');\r\n return infoShown;\r\n },\r\n displayDetails: function () {\r\n this.setCurrent(_currentOutage);\r\n var outageDetailsSm = $('.outage-details-sm');\r\n outageDetailsSm.removeClass('ng-hide');\r\n },\r\n adjustImageSize: function () {\r\n var imageElement = $('#imageContainerSm');\r\n var contentContainerHeight = $('.y-scrollable').innerHeight();\r\n var containerOtherElemententsHeight = $('.y-scrollable')[0].getBoundingClientRect().bottom - imageElement[0].getBoundingClientRect().bottom;\r\n var height = contentContainerHeight - containerOtherElemententsHeight - 1;\r\n imageElement.height(height);\r\n },\r\n close: function () {\r\n var outageDetailsSm = $('.outage-details-sm');\r\n outageDetailsSm.addClass('ng-hide');\r\n\r\n var stateDetails = $('.state-details');\r\n stateDetails.addClass('ng-hide');\r\n\r\n var containerSm = $('#imageContainerSm');\r\n containerSm.addClass('ng-hide');\r\n }\r\n };\r\n\r\n var big = {\r\n handleClick: function (outage) {\r\n var panelCollapse = $('#' + outage.Id);\r\n if (panelCollapse.hasClass('in')) {\r\n // panel expanded, collapse it\r\n this.collapse(panelCollapse);\r\n } else {\r\n // panel collapsed, expand it\r\n common.setCurrent(outage);\r\n }\r\n common.callBack();\r\n },\r\n setCurrentById: function (id) {\r\n var outage = _.find(_selectedOutages, function (item) {\r\n return item.Id == id;\r\n });\r\n this.setCurrent(outage);\r\n },\r\n setCurrent: function (outage) {\r\n _currentOutage = outage;\r\n var panel = $('#' + outage.Id);\r\n if (!panel.hasClass('in')) {\r\n // panel collapsed, expand it\r\n this.expand(panel);\r\n } else {\r\n this.adjustOutageDetailsSize(true);\r\n }\r\n\r\n common.callBack();\r\n },\r\n collapse: function (panel) {\r\n var outageDetails = $('.outage-details');\r\n var outageDetailsHeight = outageDetails.height() - panel.height();\r\n outageDetails.animate({ height: outageDetailsHeight }, 300);\r\n panel.slideToggle(300);\r\n panel.removeClass('in');\r\n panel.parents('.panel').children('.panel-heading').addClass('collapsed');\r\n },\r\n expand: function expand(panel) {\r\n // if there is expanded item - collapse it.\r\n var expanedPanels = $('.panel-collapse.collapse.in');\r\n if (expanedPanels.length > 0) {\r\n expanedPanels.slideToggle(100);\r\n expanedPanels.removeClass('in');\r\n expanedPanels.parents('.panel').children('.panel-heading').addClass('collapsed');\r\n }\r\n\r\n panel.slideToggle(100);\r\n panel.addClass('in');\r\n // if there is no expanded item - increase the height of outage-details div, in other case\r\n // the height is not changed because the panel-body area will appear instead of collapsed one in the begining of the function.\r\n var outageDetailsHeaderHeight = 43;\r\n var outageDetailsBodyHeight = 256;\r\n var height = _selectedOutages.length * outageDetailsHeaderHeight + outageDetailsBodyHeight;\r\n var outageDetails = $('.outage-details');\r\n outageDetails.animate({ height: height }, 100);\r\n\r\n panel.parents('.panel').children('.panel-heading.collapsed').removeClass('collapsed');\r\n },\r\n displayDetails: function () {\r\n var outageDetails = $('.outage-details');\r\n outageDetails.height(0);\r\n outageDetails.removeClass('ng-hide');\r\n\r\n var me = this;\r\n $timeout(function () {\r\n _.each(_selectedOutages, function (outage) {\r\n if (!outage.Image)\r\n return;\r\n\r\n me.attachImage(outage);\r\n });\r\n }, 100);\r\n this.setCurrent(_currentOutage);\r\n },\r\n adjustOutageDetailsSize: function (expandedExist) {\r\n var details = $('.outage-details');\r\n var height = _selectedOutages.length * 43;\r\n if (expandedExist)\r\n height += 256;\r\n details.height(height);\r\n },\r\n attachImage: function (outage) {\r\n var container = $('#imageContainer' + outage.Id);\r\n container.css('background-image', 'url(' + outage.Image + ')');\r\n },\r\n close: function () {\r\n var outageDetails = $('.outage-details');\r\n outageDetails.height(0);\r\n outageDetails.addClass('ng-hide');\r\n }\r\n };\r\n\r\n return {\r\n common: common,\r\n small: small,\r\n big: big\r\n }\r\n}]);\r\n\nangular.module('utilliApp')\r\n .service('AccountListService', [\"$rootScope\", \"LeftMenuService\", \"DueReminderService\", \"$timeout\",\r\n function($rootScope, LeftMenuService, DueReminderService, $timeout) {\r\n\r\n var changeContractAccount = function(acc, fnCallback) {\r\n localStorage.setItem('CurrentAccountNumber', acc.AccountNumber);\r\n localStorage.setItem('CurrentUtilityType', acc.UtilityType);//todo: to constants structure\r\n DueReminderService.unmarkAsShown();\r\n\r\n // update current user in left menu (avatar, name)\r\n var userEmail = localStorage.getItem('email');\r\n LeftMenuService.changeAccount(acc.AccountNumber, userEmail);\r\n\r\n $rootScope.showSlideAnimation = true;\r\n\r\n if(fnCallback)\r\n fnCallback();\r\n\r\n $timeout(function () {\r\n $rootScope.showSlideAnimation = false;\r\n }, 300);\r\n }\r\n\r\n function getCurrentContractAccount () {\r\n var result = localStorage.getItem('CurrentAccountNumber');\r\n return result;\r\n }\r\n\r\n return {\r\n changeContractAccount: changeContractAccount,\r\n getCurrentContractAccount: getCurrentContractAccount,\r\n };\r\n\r\n }]);\r\n\nangular.module('utilliApp')\r\n .service('productTourService', ['$http', 'ModalServiceExt', function ($http, ModalServiceExt) {\r\n\r\n var tour = null;\r\n var tourOptions = null;\r\n\r\n function isTourActive() {\r\n var tour = hopscotch.getCurrTour();\r\n if (tour)\r\n return true;\r\n return false;\r\n }\r\n\r\n function pauseTour() {\r\n hopscotch.unregisterHelper('onEndTour');\r\n var clearCookie = false;\r\n hopscotch.endTour(clearCookie);\r\n }\r\n\r\n function tourClosed(tourOptions, currentStep) {\r\n if (currentStep === tourOptions.steps.length - 1)\r\n return;\r\n\r\n ModalServiceExt.showYesNoMessage(\r\n utilli._t('Close tour'),\r\n utilli._t('Are you sure you want stop this product tour?'),\r\n function () {\r\n var clearCookie = true;\r\n hopscotch.endTour(clearCookie);\r\n tourDone(tourOptions.id);\r\n },\r\n function () {\r\n hopscotch.startTour(tourOptions, currentStep);\r\n }, true);\r\n }\r\n\r\n function tourDone(tourId) {\r\n $('#panel')[0].onscroll = null;\r\n $('#menu')[0].onscroll = null;\r\n\r\n var url = localStorage.getItem('ApiUrl') + 'api/User/ProductTourDone';\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: { '': tourId }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0)\r\n console.error('tourDone(): server returned [' + response.Errors[0] + '].');\r\n }).error(function (error) {\r\n console.error('tourDone(): error [' + err + '].');\r\n })\r\n }\r\n\r\n function scrollMenu() {\r\n var target = tour.getCurrTarget();\r\n var rect = target.getBoundingClientRect();\r\n var viewPortHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\r\n if (rect.bottom > viewPortHeight) {\r\n var menuElement = $('#menu')[0];\r\n menuElement.scrollTop = menuElement.scrollHeight;\r\n }\r\n }\r\n\r\n function nextStep(tour) {\r\n var step = tour.getCurrStepNum();\r\n // for now only 4 the first tour bubbles attached to menu items that can be scrolled.\r\n if (step < 4) {\r\n return;\r\n }\r\n\r\n scrollMenu();\r\n }\r\n\r\n function startTour(tourJson) {\r\n tourOptions = JSON.parse(tourJson);\r\n tour = hopscotch.startTour(tourOptions);\r\n hopscotch.registerHelper('onCloseTour', function () {\r\n var currentStep = tour.getCurrStepNum();\r\n tourClosed(tourOptions, currentStep);\r\n });\r\n hopscotch.registerHelper('onEndTour', function () {\r\n tourDone(tourOptions.id);\r\n });\r\n hopscotch.registerHelper('onNextStep', function () {\r\n nextStep(tour);\r\n });\r\n\r\n $('#menu .collapse').on('hidden.bs.collapse', function () {\r\n tour.refreshBubblePosition();\r\n });\r\n $('#menu .collapse').on('shown.bs.collapse', function () {\r\n scrollMenu();\r\n tour.refreshBubblePosition();\r\n });\r\n\r\n $('#panel')[0].onscroll = function () {\r\n var currentStep = tour.getCurrStepNum();\r\n // step 2 for now points to notifications icon placed on top menu and should not be scrolled.\r\n // other following steps for now are attached to left menu and should not be scrolled with #panel.\r\n if (currentStep > 1)\r\n return;\r\n\r\n tour.refreshBubblePosition();\r\n var currentTarget = tour.getCurrTarget();\r\n var rect = currentTarget.getBoundingClientRect();\r\n // Magic number 65 is height of top menu.\r\n if (rect.top + rect.height < 65) {\r\n $('.hopscotch-bubble').hide();\r\n } else {\r\n $('.hopscotch-bubble').show();\r\n }\r\n }\r\n\r\n $('#menu')[0].onscroll = function () {\r\n var currentStep = tour.getCurrStepNum();\r\n // tour bubbles attached to left menu begin from 4th. Number of steps in tour is zero based.\r\n if (currentStep < 3)\r\n return;\r\n\r\n tour.refreshBubblePosition();\r\n var currentTarget = tour.getCurrTarget();\r\n var rect = currentTarget.getBoundingClientRect();\r\n // Magic number 65 is height of top menu.\r\n if (rect.top + rect.height < 65) {\r\n $('.hopscotch-bubble').hide();\r\n } else {\r\n $('.hopscotch-bubble').show();\r\n }\r\n }\r\n }\r\n\r\n return {\r\n startTour: startTour,\r\n isTourActive: isTourActive,\r\n pauseTour: pauseTour\r\n }\r\n }]);\nangular.module('utilliApp')\r\n .service('propertyManagerTourService', ['$http', 'ModalServiceExt', function ($http, ModalServiceExt) {\r\n\r\n var tour = null;\r\n var tourOptions = null;\r\n var steps = [\r\n 'ImportProperty',\r\n 'AddProperty',\r\n 'PropertyOverview',\r\n 'PropertyTypes',\r\n 'PropertyDetails',\r\n 'AddMeters',\r\n 'Authorization',\r\n 'Dashboard',\r\n 'Groups',\r\n 'Profile',\r\n 'EnergyInsights'\r\n ];\r\n\r\n function isTourActive() {\r\n var tourJson = localStorage.getItem(\"PropertyManagerTour\");\r\n if (!utilli.checkDefinedValue(tourJson))\r\n return false;\r\n\r\n tourOptions = angular.fromJson(tourJson);\r\n var step = localStorage.getItem(tourOptions.id);\r\n if (utilli.checkDefinedValue(step))\r\n return true;\r\n return false;\r\n }\r\n\r\n function pauseTour() {\r\n hopscotch.unregisterHelper('onEndTour');\r\n localStorage.setItem(tourOptions.id, tour.getCurrStepNum());\r\n hopscotch.endTour();\r\n }\r\n\r\n function resumeTour(stepName) {\r\n if(isMobileOrRipple())\r\n return;\r\n var stepNumber = _.indexOf(steps, stepName);\r\n\r\n var tourJson = localStorage.getItem('PropertyManagerTour');\r\n var step = localStorage.getItem(tourOptions.id);\r\n var stepInt = parseInt(step);\r\n if (stepInt == stepNumber)\r\n startTourInternal(tourJson, stepInt);\r\n }\r\n\r\n function tourClosed(tourOptions, currentStep) {\r\n ModalServiceExt.showYesNoMessage(\r\n utilli._t('Close tour'),\r\n utilli._t('Are you sure you want stop this product tour?'),\r\n function () {\r\n var clearCookie = true;\r\n hopscotch.endTour(clearCookie);\r\n tourDone(tourOptions.id);\r\n },\r\n function () {\r\n hopscotch.startTour(tourOptions, currentStep);\r\n }, true);\r\n }\r\n\r\n function tourDone(tourId) {\r\n $('#panel')[0].onscroll = null;\r\n\r\n localStorage.setItem(tourOptions.id, null);\r\n localStorage.setItem('PropertyManagerTour', null);\r\n\r\n var url = localStorage.getItem('ApiUrl') + 'api/PropertyManagers/TourDone';\r\n $http({\r\n method: 'POST',\r\n url: url,\r\n data: { '': tourId }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0)\r\n console.error('tourDone(): server returned [' + response.Errors[0] + '].');\r\n }).error(function (error) {\r\n console.error('tourDone() failed: ' + error);\r\n })\r\n }\r\n\r\n function nextStep(tour) {\r\n var step = localStorage.getItem(tourOptions.id);\r\n if (utilli.checkDefinedValue(step)) {\r\n var stepInt = parseInt(step);\r\n localStorage.setItem(tourOptions.id, stepInt + 1);\r\n } \r\n else {\r\n step = 0;\r\n localStorage.setItem(tourOptions.id, step + 1);\r\n }\r\n\r\n if (tourOptions.steps[step].showSkip) {\r\n hopscotch.unregisterHelper('onEndTour');\r\n hopscotch.endTour();\r\n }\r\n }\r\n\r\n function startTour(callback) {\r\n if(isMobileOrRipple()){\r\n if (callback)\r\n callback();\r\n return;\r\n }\r\n var tourJson = localStorage.getItem('PropertyManagerTour');\r\n if (utilli.checkDefinedValue(tourJson)) {\r\n var tourOptions = angular.fromJson(tourJson);\r\n var step = localStorage.getItem(tourOptions.id);\r\n if (utilli.checkDefinedValue(step)) {\r\n var stepInt = parseInt(step);\r\n startTourInternal(tourJson, stepInt);\r\n\r\n if (callback)\r\n callback();\r\n\r\n return;\r\n }\r\n }\r\n\r\n $http({\r\n method: \"GET\",\r\n url: localStorage.getItem('ApiUrl') + 'api/PropertyManagers/GetPropertyManagerTour/',\r\n }).success(function (response) {\r\n\r\n if (callback)\r\n callback();\r\n\r\n if (!response.Data)\r\n return;\r\n\r\n startTourInternal(response.Data);\r\n }).error(function (error) {\r\n if (callback)\r\n callback();\r\n\r\n console.error(\"Get property manager tour error: \", error);\r\n });\r\n }\r\n\r\n function startTourInternal(tourJson, step) {\r\n sessionStorage.clear();\r\n tourOptions = JSON.parse(tourJson);\r\n // var addPropertyStep = _.find(tourOptions.steps, function (step) { return step.title == \"Add Property\"});\r\n // addPropertyStep.onNext = function () { };\r\n\r\n if (step) {\r\n tour = hopscotch.startTour(tourOptions, step);\r\n } else {\r\n tour = hopscotch.startTour(tourOptions);\r\n localStorage.setItem('PropertyManagerTour', tourJson);\r\n }\r\n\r\n hopscotch.registerHelper('onCloseTour', function () {\r\n var currentStep = tour.getCurrStepNum();\r\n tourClosed(tourOptions, currentStep);\r\n });\r\n hopscotch.registerHelper('onEndTour', function () {\r\n tourDone(tourOptions.id);\r\n });\r\n hopscotch.registerHelper('onNextStep', function () {\r\n nextStep(tour);\r\n });\r\n\r\n $('#menu .collapse').on('hidden.bs.collapse', function () {\r\n tour.refreshBubblePosition();\r\n });\r\n $('#menu .collapse').on('shown.bs.collapse', function () {\r\n scrollMenu();\r\n tour.refreshBubblePosition();\r\n });\r\n\r\n $('#panel')[0].onscroll = function () {\r\n var currentStep = tour.getCurrStepNum();\r\n // step 5 for now points to notifications icon placed on top menu and should not be scrolled.\r\n // other following steps for now are attached to left menu and should not be scrolled with #panel.\r\n if (currentStep > 5)\r\n return;\r\n\r\n tour.refreshBubblePosition();\r\n var currentTarget = tour.getCurrTarget();\r\n var rect = currentTarget.getBoundingClientRect();\r\n // Magic number 65 is height of top menu.\r\n if (rect.top + rect.height < 65) {\r\n $('.hopscotch-bubble').hide();\r\n } else {\r\n $('.hopscotch-bubble').show();\r\n }\r\n }\r\n }\r\n\r\n return {\r\n startTour: startTour,\r\n isTourActive: isTourActive,\r\n pauseTour: pauseTour,\r\n resumeTour: resumeTour\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('NotificationDetailsController',\r\n [\r\n '$scope', '$http', 'usSpinnerService', '$state', '$stateParams', 'CommonHeaderService', 'ModalServiceExt',\r\n function ($scope, $http, usSpinnerService, $state, $stateParams, CommonHeaderService, ModalServiceExt) {\r\n\r\n CommonHeaderService.setUp($scope._t('Notification Details'));\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var apiUrl = localStorage.getItem(\"ApiUrl\");\r\n\r\n $http({\r\n url: apiUrl + 'api/NotificationsLog/GetPortalNotificationAndSetViewed',\r\n method: 'GET',\r\n params: { Id: $stateParams.Id }\r\n })\r\n .success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.notificationLog = data.Data;\r\n })\r\n .error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.cancel = function () {\r\n $state.goMainLayout('UserNotifications');\r\n }\r\n }\r\n ]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n.controller('UserNotificationsController', ['$scope', '$http', '$window', 'LeftMenuService',\r\n 'CommonHeaderService', 'ModalServiceExt', '$state', 'usSpinnerService',\r\nfunction ($scope, $http, $window, LeftMenuService, CommonHeaderService, ModalServiceExt, $state, usSpinnerService) {\r\n\r\n LeftMenuService.setCurrentTab('Messages');\r\n CommonHeaderService.setUpBackButton();\r\n CommonHeaderService.setTitle($scope._t('Notifications'));\r\n\r\n $scope.back = function () {\r\n $window.history.back();\r\n }\r\n\r\n $scope.isBusy = false;\r\n $scope.endReached = false;\r\n var notificationsLoadedCount = 0;\r\n var pageSize = 20;\r\n\r\n $scope.notificationsForScrolling = [];\r\n\r\n $scope.getNotifications = function () {\r\n\r\n if ($scope.isBusy)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.isBusy = true;\r\n\r\n var accountNumber = utilli.hasPropertyManagerRole() ? 'propertyManager' : localStorage.getItem('CurrentAccountNumber');\r\n\r\n var dataRequest = { accountNumber: accountNumber, skip: notificationsLoadedCount, pageSize: pageSize };\r\n if (utilli.hasPropertyManagerRole()) {\r\n dataRequest.userName = localStorage.getItem('current_user');\r\n }\r\n utilli.addUserName($state, dataRequest);\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/NotificationsLog/GetUserPortalNotifications/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n ModalServiceExt.showError(data.Errors[0]);\r\n } else {\r\n acceptNotifications(data.Data);\r\n }\r\n\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n\r\n function acceptNotifications(notifications) {\r\n if (notifications.length === 0)\r\n {\r\n $scope.isBusy = false;\r\n $scope.endReached = true;\r\n return;\r\n }\r\n\r\n for (var i = 0; i < notifications.length; i++) {\r\n $scope.notificationsForScrolling.push(notifications[i]);\r\n notificationsLoadedCount++;\r\n }\r\n\r\n if (notifications.length < pageSize) {\r\n $scope.endReached = true;\r\n }\r\n\r\n $scope.isBusy = false;\r\n };\r\n\r\n $scope.setViewed = function (notification) {\r\n\r\n if (notification.IsViewed)\r\n return;\r\n\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/NotificationsLog/SetNotificationViewed',\r\n data: { '': notification.Id }\r\n })\r\n .success(function(response) {\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 notification.IsViewed = true;\r\n })\r\n .error(function() {\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n}]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('UserNotificationsGridController', [\r\n '$scope', '$http', '$state', '$stateParams', 'GridService', 'ModalServiceExt',\r\n function($scope, $http, $state, $stateParams, GridService, ModalServiceExt) {\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#notificationsGrid\"));\r\n\r\n $(window)\r\n .resize(function() {\r\n gridResizeFunc($scope.notificationsKendoGrid);\r\n });\r\n\r\n $scope.viewDetails = function(id) {\r\n $state.goMainLayout('NotificationDetails', { Id: id });\r\n }\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\r\n $scope.gridOptions = {\r\n dataSource: {\r\n transport: {\r\n read: function(options) {\r\n var webapi = new kendo.data.transports.webapi({ prefix: \"\" });\r\n var params = webapi.parameterMap(options.data);\r\n params = $.extend(params,\r\n {\r\n accountNumber: utilli.hasPropertyManagerRole() ? \"propertyManager\" : accountNumber\r\n });\r\n if (utilli.hasPropertyManagerRole()) {\r\n params.userName = localStorage.getItem('current_user');\r\n }\r\n\r\n var notificationsUrl = apiUrl + 'api/NotificationsLog/GetUserPortalNotifications/';\r\n $http.get(notificationsUrl, { params: params })\r\n .success(function(data) {\r\n options.success(data);\r\n gridResizeFunc($scope.notificationsKendoGrid);\r\n })\r\n .error(function() {\r\n options.error();\r\n });\r\n }\r\n },\r\n schema: { data: \"Data.PageData\", total: \"Data.Count\" },\r\n pageSize: 20,\r\n serverPaging: true\r\n },\r\n sortable: true,\r\n pageable: {\r\n pageSize: 10,\r\n pageSizes: [10, 25, 50],\r\n buttonCount: 3,\r\n refresh: true\r\n },\r\n filterable: {\r\n extra: false,\r\n operators: {\r\n string: {\r\n contains: $scope._t('Contains'),\r\n startswith: $scope._t(\"Starts with\"),\r\n eq: $scope._t(\"Is equal to\"),\r\n neq: $scope._t(\"Is not equal to\")\r\n }\r\n }\r\n },\r\n serverPaging: true,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n dataBound: function() { gridResizeFunc($scope.notificationsKendoGrid); },\r\n columns: [\r\n {\r\n field: \"ContractAccountNumber\",\r\n title: $scope._t(\"Account Number\"),\r\n width: 100\r\n }, {\r\n field: \"UserId\",\r\n title: $scope._t(\"User\"),\r\n template: \"#= UserName #\",\r\n width: 100\r\n },\r\n {\r\n field: \"ScheduledOn\",\r\n title: $scope._t(\"Scheduled On\"),\r\n template: \"#= DisplayedScheduledOn #\",\r\n width: 100,\r\n type: \"date\",\r\n filterable: {\r\n ui: dateTimeFilter\r\n }\r\n },\r\n {\r\n field: \"IsViewed\",\r\n title: $scope._t(\"Viewed\"),\r\n template: \"#= DisplayedIsViewed #\",\r\n width: 100,\r\n filterable: {\r\n ui: viewedFilter,\r\n operators: {\r\n string: {\r\n eq: $scope._t('Is equal to'),\r\n neq: $scope._t('Is not equal to')\r\n }\r\n }\r\n }\r\n },\r\n {\r\n title: $scope._t(\"Actions\"),\r\n template: kendo.template($(\"#commands-template\").html()),\r\n width: \"100px\"\r\n }]\r\n }\r\n\r\n function dateTimeFilter(element) {\r\n element.kendoDateTimePicker({\r\n format: \"MM/dd/yyyy HH:mm:ss\",\r\n timeFormat: \"HH:mm:ss\"\r\n });\r\n }\r\n\r\n function viewedFilter(element) {\r\n element.kendoDropDownList({\r\n dataTextField: \"Name\",\r\n dataValueField: \"Value\",\r\n dataSource: {\r\n transport: { read: utilli.getUrlWithToken('api/CommonData/GetNotificationViewedStatusesNames') },\r\n schema: { data: \"Data\" }\r\n },\r\n optionLabel: $scope._t(\"--Select Value--\")\r\n });\r\n }\r\n }\r\n ]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('AccountListController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', 'GetAccountsService', '$stateParams', 'CommonHeaderService',\r\n 'DueReminderService', 'ModalServiceExt', 'AccountListService',\r\n function ($scope, $rootScope, $http, $timeout, $window, usSpinnerService, LeftMenuService, $state,\r\n GetAccountsService, $stateParams, CommonHeaderService, DueReminderService, ModalServiceExt, AccountListService) {\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('AccountList');\r\n\r\n $scope.DeleteAccount = function () {\r\n $state.goMainLayout(\"EditAccounts\");\r\n };\r\n CommonHeaderService.setUp(_t('My Accounts'), _t('Edit'), $scope.DeleteAccount, true);\r\n $scope.errors = [];\r\n $scope.accountDataList = {};\r\n\r\n //it is copypast of the EditAccountCtrl.js -> GoToAccountList\r\n $scope.GoToAccountDashboard = function (acc) {\r\n AccountListService.changeContractAccount(acc, function () {\r\n if (utilli.isAdmin)\r\n $state.params.contractAccountNumber = acc.AccountNumber;\r\n $state.goMainLayout(\"Dashboard\", $state.params);\r\n });\r\n localStorage.setItem('CurrentAccountNumber', acc.AccountNumber);\r\n localStorage.setItem('CurrentUtilityType', acc.UtilityType);//todo: to constants structure\r\n DueReminderService.unmarkAsShown();\r\n\r\n // update current user in left menu (avatar, name)\r\n var userEmail = localStorage.getItem('email');\r\n LeftMenuService.changeAccount(acc.AccountNumber, userEmail);\r\n\r\n $rootScope.showSlideAnimation = true;\r\n if (utilli.isAdmin)\r\n $state.params.contractAccountNumber = acc.AccountNumber;\r\n $state.goMainLayout(\"Dashboard\", $state.params);\r\n\r\n $timeout(function () {\r\n $rootScope.showSlideAnimation = false;\r\n }, 300);\r\n };\r\n\r\n function getBalance(account)\r\n {\r\n var url = localStorage.getItem('ApiUrl') + 'api/Account/GetAccountBalance/';\r\n var params = { accountNumber: account.AccountNumber };\r\n utilli.addUserName($state, params);\r\n\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n params: params\r\n }).success(function (data) {\r\n\r\n account.isBalanceLoaded = true;\r\n\r\n if (!data || data.Errors.length > 0)\r\n {\r\n $scope.errors = data.Errors;\r\n return;\r\n }\r\n \r\n account.TotalBalance = data.TotalBalance;\r\n account.DueDate = data.DueDate;\r\n account.dueDateTicks = Date.parse(account.DueDate);\r\n account.IsAccountDisconnected = data.IsAccountDisconnected;\r\n\r\n }).error(function () {\r\n account.isBalanceLoaded = true;\r\n $scope.errors = [{Message: utilli.errors.serverErrorMessage}];\r\n });\r\n }\r\n\r\n function showDueDateInternal(account)\r\n {\r\n return account.TotalBalance > 0 && account.DueDate != '0001-01-01T00:00:00';\r\n //return account.TotalBalance >= 0;\r\n }\r\n\r\n function showPastDueInternal(account) {\r\n if (showDueDateInternal(account))\r\n return account.dueDateTicks < Date.now();\r\n\r\n return false;\r\n }\r\n\r\n $scope.showDueDate = function (account) {\r\n return showDueDateInternal(account);\r\n }\r\n\r\n $scope.showPastDue = function (account)\r\n {\r\n return !account.IsAccountDisconnected && showPastDueInternal(account);\r\n }\r\n\r\n $scope.getTotalBalanceClass = function (account) {\r\n\r\n if (showPastDueInternal(account))\r\n return 'warnig-color';\r\n else\r\n return 'success-color';\r\n }\r\n\r\n $scope.getAccountBalanceClass = function (account) {\r\n if (showDueDateInternal(account))\r\n return '';\r\n\r\n return 'balance-without-dueDate';\r\n }\r\n\r\n $scope.getDueDateClass = function (account) {\r\n if (showPastDueInternal(account))\r\n return 'warnig-color';\r\n\r\n return '';\r\n }\r\n\r\n $scope.getUtilityImage = function(data)\r\n {\r\n if (data.UtilityType == 'Gas')\r\n return 'gas-bgr';\r\n if (data.UtilityType == 'Water')\r\n return 'water-bgr';\r\n if (data.UtilityType == 'Electricity')\r\n return 'elctr-bgr';\r\n\r\n return '';\r\n }\r\n\r\n function logout() {\r\n utilli.clearLocalStorage();\r\n\r\n $state.goToWelcome();\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var promise = GetAccountsService.getAccounts(true);\r\n promise.then(function (response) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0].Message);\r\n return;\r\n }\r\n\r\n if ($stateParams.redirectIfSingle === 'true' && response.Accounts.length == 1) {\r\n $scope.GoToAccountDashboard(response.Accounts[0]);\r\n }\r\n else {\r\n $scope.accountDataList = response.Accounts;\r\n\r\n $scope.accountDataList.forEach(function(item) {\r\n getBalance(item);\r\n });\r\n }\r\n\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\nfunction InitSideMenu(){\r\n // turn off touches for windows phone and old iOS because we haven't fixed issues for them\r\n var isTouchDisabled = deviceIsWindowsPhone || (iOS() && getIosVersionFloat() < 7);\r\n if (deviceIsWindowsPhone) {\r\n window.slideout = new Slideout({\r\n 'panel': document.getElementById('panel'),\r\n 'menu': document.getElementById('menu'),\r\n 'padding': 260,\r\n 'tolerance': 70,\r\n 'touch': !isTouchDisabled\r\n });\r\n\r\n $('body').on('click', '.toggle-show-menu, .main-panel-blocker', function () {\r\n window.slideout.toggle();\r\n });\r\n }\r\n else {\r\n window.snapper = new Snap({\r\n element: document.getElementById('panel'),\r\n disable: 'right',\r\n maxPosition: 260,\r\n minPosition: -260\r\n });\r\n $('body').on('click', '.toggle-show-menu, .main-panel-blocker', function () {\r\n if (snapper.state().state == \"left\") {\r\n snapper.close();\r\n } else {\r\n snapper.open('left');\r\n }\r\n });\r\n // enable drag only on mobile\r\n if (!isMobileOrRipple()) {\r\n snapper.disable();\r\n }\r\n }\r\n}\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('MainLayoutController', [\r\n function () {\r\n InitSideMenu();\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('WelcomeFooterController', ['$scope', '$state',\r\n function ($scope, $state) {\r\n\r\n $scope.enableLanguagePack = utilli.isLanguagePackEnabled();\r\n if (!$scope.enableLanguagePack)\r\n return;\r\n\r\n var language = localStorage.getItem('language');\r\n var languageParams = _.find(utilli.languages[DeploymentSettings.providersGroupShortName.toLowerCase()], function (x) { return language === x.abbreviation });\r\n if (!languageParams)\r\n $scope.currentLanguage = 'English';\r\n else\r\n $scope.currentLanguage = languageParams.name;\r\n\r\n $scope.goToLanguages = function () {\r\n $state.go('TopMenuLayout.Languages');\r\n }\r\n\r\n $scope.enablePropertyManagerLink = Config.providers[DeploymentSettings.currentServiceProvider].EnablePropertyManagerLink;\r\n $scope.isSsoLinkVisible = DeploymentSettings.currentServiceProvider === Config.wglProviderName && !isMobileOrRipple();\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('LeftMenuController', ['$scope', '$rootScope', '$http', 'LeftMenuService', '$window', '$state',\r\n 'CommonDataService', 'RequestService', 'usSpinnerService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, LeftMenuService, $window, $state, CommonDataService,\r\n RequestService, usSpinnerService, ModalServiceExt) {\r\n setMenuTemplate();\r\n // init the left menu for a current user and a current contract account if it's already selected\r\n $scope.deviceIsWindowsPhone = deviceIsWindowsPhone;\r\n \r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var userEmail = localStorage.getItem('email');\r\n LeftMenuService.changeAccount(accountNumber, userEmail);\r\n\r\n $scope.leftMenu = LeftMenuService;\r\n\r\n $scope.isMenuLoaded = false;\r\n\r\n $scope.signOut = LeftMenuService.signOut;\r\n\r\n $scope.isAdmin = utilli.isAdmin;\r\n\r\n $rootScope.$on('profile-updated', function (event, args) {\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var userEmail = localStorage.getItem('email');\r\n LeftMenuService.changeAccount(accountNumber, userEmail);\r\n })\r\n\r\n $scope.goTo = function (state) {\r\n usSpinnerService.stop('spinner-1');\r\n if ($window.slideout)\r\n $window.slideout.toggle();\r\n else\r\n if ($window.snapper) {\r\n $window.snapper.close();\r\n }\r\n\r\n RequestService.abort();\r\n\r\n\r\n if ($scope.checkAccess(state) && utilli.isAdmin) {\r\n // We should set options.reload as state name instead of 'true', because if we set it as 'true' \r\n // all the parent states of the target state will reload with their previous parameters \r\n // that can be not actual for the moment (at list for the nested customer app in the admin portal) and we will have\r\n // tricky issues with wrong data.\r\n $state.goMainLayout(state, {}, { reload: state });\r\n }\r\n };\r\n\r\n var mapping = {\r\n 'AccountList': '#top-menu-item-account-manager',\r\n 'Profile': '#top-menu-item-account-manager',\r\n 'ChangePassword': '#top-menu-item-account-manager',\r\n\r\n 'PayNow': '#top-menu-item-bill-payment-center',\r\n 'PaymentOptions': '#top-menu-item-bill-payment-center',\r\n 'BillsAndPayments': '#top-menu-item-bill-payment-center',\r\n\r\n 'Messages': '#top-menu-item-notifications',\r\n 'Preferences': '#top-menu-item-notifications',\r\n\r\n 'ReportOutage': '#top-menu-item-outage-center',\r\n 'OutageMap': '#top-menu-item-outage-center',\r\n 'OutageList': '#top-menu-item-outage-center',\r\n 'OutageCenter': '#top-menu-item-outage-center',\r\n\r\n 'MeterData': '#top-menu-item-service-center',\r\n 'MoveService': '#top-menu-item-service-center',\r\n 'CancelService': '#top-menu-item-service-center',\r\n }\r\n\r\n angular.element($window).on('load', setTimeout(function() {\r\n if (mapping[LeftMenuService.currentTab] != 'undefined') {\r\n $(mapping[LeftMenuService.currentTab]).click();\r\n }}, 1000));\r\n\r\n $scope.checkAccess = function (e, stateName) {\r\n var isAccountDataValid = utilli.localStorageItemNotNull('CurrentAccountNumber') && utilli.localStorageItemNotNull('CurrentUtilityType'); \r\n if (utilli.hasAgentRole() && isProtectedPage(stateName) && !isAccountDataValid) {\r\n e.preventDefault();\r\n ModalServiceExt.showInfo($scope._t(\"You need to choose a contract account (by search or search history pages).\"));\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function isProtectedPage (stateName) {\r\n var result = stateName == 'Dashboard' || stateName == 'BillsAndPayments' || stateName == 'MeterData';\r\n return result;\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 $scope.getStateRef = function (stateName) {\r\n if (utilli.isAdmin) {\r\n return '';\r\n } else {\r\n return $state.href('MainLayout.' + stateName);\r\n }\r\n }\r\n\r\n CommonDataService.getCommonData()\r\n .then(function (commonData) {\r\n LeftMenuService.currentMenu.OutageCenter.isVisible = commonData.EnableOutageMap;\r\n LeftMenuService.currentMenu.CancelService.isVisible = commonData.EnableCancelService;\r\n LeftMenuService.currentMenu.MoveService.isVisible = commonData.EnableMoveService;\r\n LeftMenuService.currentMenu.MeterData.isVisible = commonData.EnableMeterDataPage;\r\n LeftMenuService.currentMenu.EnergyEfficiency.isVisible = commonData.EnableEnergyEfficiencyPage;\r\n LeftMenuService.currentMenu.ProgramEnrolments.isVisible = commonData.EnableProgramEnrolments;\r\n $scope.isMenuLoaded = true;\r\n },\r\n function () {\r\n $scope.isMenuLoaded = true;\r\n // error handling happens in other places for getCommonData\r\n }\r\n );\r\n\r\n function setMenuTemplate() {\r\n if (utilli.hasAgentRole())\r\n $scope.menuTemplate = utilli.isAdmin ? '../Pages/Agents/LeftMenu.html' : 'Pages/Agents/LeftMenu.html';\r\n else if (utilli.hasPropertyManagerRole())\r\n $scope.menuTemplate = utilli.isAdmin ? '../Pages/PropertyManagers/LeftMenu.html' : 'Pages/PropertyManagers/LeftMenu.html';\r\n else\r\n $scope.menuTemplate = utilli.isAdmin ? '../Pages/LeftMenu.html' : 'Pages/LeftMenu.html';\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('NotificationBoxController', ['$scope', '$rootScope', '$http', '$window', '$state',\r\n 'CommonDataService', 'usSpinnerService', 'NotificationBoxService',\r\n function ($scope, $rootScope, $http, $window, $state, CommonDataService,\r\n usSpinnerService, NotificationBoxService) {\r\n $scope.isTemporarilyHidden = false;\r\n NotificationBoxService.setTemporarilyHide(false);\r\n\r\n $scope.hideSubscribeSmsNotification = function () {\r\n NotificationBoxService.hideSmsSubscribeNotification();\r\n $scope.subscribeSmsNotificationFlag = false;\r\n }\r\n\r\n $scope.goToSubscribe = function () {\r\n $state.goMainLayout('MobilePhoneConfirmation');\r\n }\r\n\r\n NotificationBoxService.registerObserverCallback(function () {\r\n $scope.subscribeSmsNotificationFlag = NotificationBoxService.isSmsSubscribeNotificationVisible();\r\n $scope.isTemporarilyHidden = NotificationBoxService.isTemporarilyHidden();\r\n });\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('EnergyEfficiencyController', ['$scope', '$rootScope', '$window', '$http', '$sce', '$timeout',\r\n 'LeftMenuService', '$stateParams', 'CommonHeaderService', 'usSpinnerService', 'ModalService', 'ModalServiceExt',\r\nfunction ($scope, $rootScope, $window, $http, $sce, $timeout, LeftMenuService, $stateParams, CommonHeaderService, usSpinnerService, ModalService, ModalServiceExt) {\r\n LeftMenuService.setCurrentTab('EnergyEfficiency');\r\n CommonHeaderService.setUpBackButton($scope._t('Energy Insights'));\r\n\r\n $scope.radioGraphType = 'calendarYear'; //'last12Monthes';\r\n $scope.radioGraphTypeConsumption = 'absolute';\r\n var _t = $scope._t;\r\n function isGetMetersError(jsonData) {\r\n return jsonData.HasErrors;\r\n }\r\n\r\n $scope.getMeterDataGraph = function () {\r\n startSpin();\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n\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 } else {\r\n useMeterData(jsonData);\r\n }\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 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 };\r\n\r\n function useSingleMeterData(jsonObject) {\r\n var jsonMeterNumIs = jsonObject[0].MeterNum;\r\n $scope.meterNum = jsonMeterNumIs;\r\n if (jsonMeterNumIs == \"\" || jsonMeterNumIs == null) {\r\n $scope.isMultipleMeters = false;\r\n } else {\r\n $scope.isMultipleMeters = false;\r\n\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 $scope.meterOptions.push({ MeterNum: $scope._t('All meters') });\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 $scope.initTables($scope.meterNum, $scope.radioGraphType, $scope.radioGraphTypeConsumption);\r\n }\r\n\r\n $scope.selectMeter = function () {\r\n setCurrentMeter($scope.currentMeter);\r\n }\r\n\r\n $scope.data = null;\r\n\r\n var getConsumptionEfficiency = function (value, unit) {\r\n return value + \" \" + unit;\r\n }\r\n\r\n $scope.createChartFullYear = function (data) {\r\n var title = data.YearOverYearFullUsageData.EfficiencyInfo;\r\n\r\n var unitsType = data.YearOverYearFullUsageData.ConsumptionUnit;\r\n\r\n var consumptionReadingIndexPreviousYear = 0;\r\n var consumptionReadingIndexThisYear = 1;\r\n var averageTemperatureIndexPreviousYear = 2;\r\n var averageTemperatureIndexThisYear = 3;\r\n\r\n var series = [\r\n {\r\n color: '#c4c4c4',\r\n name: $scope._t(\"Consumption in\") + \" \" + data.YearOverYearFullUsageData.PreviousYear,\r\n data: [],\r\n tooltip: {\r\n pointFormat: 'Consumption: {point.y} ' + unitsType,\r\n headerFormat: ''\r\n },\r\n yAxis: 1\r\n },\r\n {\r\n color: '#099aed',\r\n name: $scope._t(\"Consumption in\") + \" \" + data.YearOverYearFullUsageData.ThisYear,\r\n data: [],\r\n tooltip: {\r\n pointFormat: 'Consumption: {point.y} ' + unitsType,\r\n headerFormat: ''\r\n },\r\n yAxis: 1\r\n },\r\n {\r\n color: '#a4a4a4',\r\n type: 'spline',\r\n name: $scope._t(\"Avrg. Temperature in\") + \" \" + data.YearOverYearFullUsageData.PreviousYear,\r\n data: [],\r\n tooltip: {\r\n pointFormat: 'Average Temperature: {point.y}F',\r\n headerFormat: ''\r\n },\r\n yAxis: 2\r\n },\r\n {\r\n color: '#0069a5',\r\n type: 'spline',\r\n name: $scope._t(\"Avrg. Temperature in\") + \" \" + data.YearOverYearFullUsageData.ThisYear,\r\n data: [],\r\n tooltip: {\r\n pointFormat: 'Average Temperature: {point.y}F',\r\n headerFormat: ''\r\n },\r\n yAxis: 2\r\n }\r\n ];\r\n\r\n var categories = [];\r\n\r\n categories = data.YearOverYearFullUsageData.PeriodNames;\r\n\r\n var i = 0;\r\n data.YearOverYearFullUsageData.PreviousYearConsumptions.forEach(function (item) {\r\n series[consumptionReadingIndexPreviousYear].data.push(\r\n {\r\n name: categories[i],\r\n y: item,\r\n }\r\n );\r\n i++;\r\n });\r\n\r\n i = 0;\r\n data.YearOverYearFullUsageData.PreviousYearMonthlyAverageTemperatures.forEach(function (item) {\r\n series[averageTemperatureIndexPreviousYear].data.push(\r\n {\r\n name: categories[i],\r\n y: item,\r\n }\r\n );\r\n i++;\r\n });\r\n\r\n i = 0;\r\n data.YearOverYearFullUsageData.ThisYearConsumptions.forEach(function (item) {\r\n series[consumptionReadingIndexThisYear].data.push(\r\n {\r\n name: categories[i],\r\n y: item,\r\n }\r\n );\r\n i++;\r\n });\r\n\r\n i = 0;\r\n data.YearOverYearFullUsageData.ThisYearMonthlyAverageTemperatures.forEach(function (item) {\r\n series[averageTemperatureIndexThisYear].data.push(\r\n {\r\n name: categories[i],\r\n y: item,\r\n }\r\n );\r\n i++;\r\n });\r\n\r\n Highcharts.chart('comparChartFullYearHighcharts', {\r\n credits: {\r\n enabled: false\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n title: {\r\n text: title\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 0 }\r\n },\r\n yAxis: [\r\n {\r\n labels: {\r\n format: '{value:,.1f} ' + data.YearOverYearFullUsageData.ConsumptionUnit\r\n },\r\n title: {\r\n text: _t('Average Temperature')\r\n },\r\n opposite: true,\r\n visible: false,\r\n },\r\n {\r\n labels: {\r\n format: '{value:,.0f} ' + data.YearOverYearFullUsageData.ConsumptionUnit\r\n },\r\n title: {\r\n text: _t('Consumption')\r\n },\r\n min: 0\r\n }, {\r\n labels: {\r\n format: '{value:,1f}' + ' F'\r\n },\r\n title: {\r\n text: _t('Average Temperature')\r\n },\r\n min: 0,\r\n visible: true,\r\n opposite: true\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 series: series\r\n });\r\n\r\n //$(\"#comparChartFullYear\").kendoChart({\r\n // title: {\r\n // text: title\r\n // },\r\n // legend: {\r\n // position: \"bottom\",\r\n // visible: true\r\n // },\r\n // seriesColors: window.themeSettings != undefined ? [themeSettings.consumptionReadingColor, themeSettings.costColor] : [\"#c4c4c4\", \"#0069a5\"],\r\n // series: [\r\n // {\r\n // axis: \"Usage\",\r\n // name: $scope._t(\"Consumption in\") + \" \" + data.YearOverYearFullUsageData.PreviousYear,\r\n // data: data.YearOverYearFullUsageData.PreviousYearConsumptions,\r\n // tooltip: {\r\n // visible: true,\r\n // color: \"white\",\r\n // format: \"{0:n} \" + data.YearOverYearFullUsageData.ConsumptionUnit\r\n // },\r\n // },\r\n // {\r\n // axis: \"Usage\",\r\n // name: $scope._t(\"Consumption in\") + \" \" + data.YearOverYearFullUsageData.ThisYear,\r\n // data: data.YearOverYearFullUsageData.ThisYearConsumptions,\r\n // tooltip: {\r\n // visible: true,\r\n // color: \"white\",\r\n // format: \"{0:n} \" + data.YearOverYearFullUsageData.ConsumptionUnit\r\n // },\r\n // },\r\n // {\r\n // axis: \"Temperature\",\r\n // type: \"line\",\r\n // name: $scope._t(\"Avrg. Temperature in\") + \" \" + data.YearOverYearFullUsageData.PreviousYear,\r\n // data: data.YearOverYearFullUsageData.PreviousYearMonthlyAverageTemperatures,\r\n // visibleInLegend: true,\r\n // tooltip: {\r\n // visible: true,\r\n // format: \"{0} F\",\r\n // color: \"white\",\r\n // },\r\n // },\r\n // {\r\n // axis: \"Temperature\",\r\n // type: \"line\",\r\n // name: $scope._t(\"Avrg. Temperature in\") + \" \" + data.YearOverYearFullUsageData.ThisYear,\r\n // data: data.YearOverYearFullUsageData.ThisYearMonthlyAverageTemperatures,\r\n // visibleInLegend: true,\r\n // tooltip: {\r\n // visible: true,\r\n // format: \"{0} F\",\r\n // color: \"white\",\r\n // },\r\n // }\r\n // ],\r\n // valueAxis: [\r\n // {\r\n // name: \"Usage\",\r\n // line: {\r\n // visible: true\r\n // },\r\n // minorGridLines: {\r\n // visible: true\r\n // },\r\n // labels: {\r\n // rotation: \"auto\",\r\n // }\r\n // },\r\n // {\r\n // name: \"Temperature\",\r\n // labels: {\r\n // format: \"{0} F\"\r\n // }\r\n // }\r\n // ],\r\n // categoryAxis: {\r\n // categories: data.YearOverYearFullUsageData.PeriodNames,\r\n // axisCrossingValues: [0, 12],\r\n // majorGridLines: {\r\n // visible: false\r\n // }\r\n // },\r\n //});\r\n\r\n\r\n\r\n };\r\n\r\n $scope.createChartTable1 = function (data) {\r\n var title = data.SameYearDifference.ConsumptionPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n\r\n\r\n Highcharts.chart('comparChartTable1', {\r\n credits: {\r\n enabled: false\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n title: {\r\n text: $scope._t(\"Consumption\") + \": \" + title + \"%\"\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 0 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n format: '{value}'\r\n },\r\n title: {\r\n text: _t('Consumption') + ', ' + data.YearOverYearFullUsageData.ConsumptionUnit\r\n },\r\n min: 0\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 formatter: function () {\r\n console.log(this);\r\n return 'Period: ' + this.key + '
Consumption: ' + this.y + ' ' + data.YearOverYearFullUsageData.ConsumptionUnit;\r\n }\r\n },\r\n plotOptions: {\r\n series: {\r\n cursor: 'pointer'\r\n }\r\n },\r\n series: [{\r\n name: \"Consumption\",\r\n showInLegend: false,\r\n data: [[data.SameYearOldPeriod.PeriodName, data.SameYearOldPeriod.Consumption], [data.SameYearNewPeriod.PeriodName, data.SameYearNewPeriod.Consumption]],\r\n }]\r\n });\r\n };\r\n\r\n $scope.createChartTable2 = function (data) {\r\n var title = data.SameYearDifference.BillAmountPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n\r\n Highcharts.chart('comparChartTable2', {\r\n credits: {\r\n enabled: false\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n title: {\r\n text: $scope._t(\"Bill Amount\") + \": \" + title + \"%\"\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 0 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n format: '{value}'\r\n },\r\n title: {\r\n text: _t('Bill Amount') + ', ' + '$'\r\n },\r\n min: 0\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 formatter: function () {\r\n console.log(this);\r\n return 'Period: ' + this.key + '
Bill Amount: $' + this.y;\r\n }\r\n },\r\n plotOptions: {\r\n series: {\r\n cursor: 'pointer'\r\n }\r\n },\r\n series: [{\r\n name: \"Bill Amount\",\r\n showInLegend: false,\r\n data: [[data.SameYearOldPeriod.PeriodName, data.SameYearOldPeriod.BillAmount], [data.SameYearNewPeriod.PeriodName, data.SameYearNewPeriod.BillAmount]],\r\n }]\r\n });\r\n };\r\n\r\n $scope.createChartTable3 = function (data) {\r\n var title = data.SameYearDifference.EnergyCostGcrPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n\r\n Highcharts.chart('comparChartTable3', {\r\n credits: {\r\n enabled: false\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n title: {\r\n text: $scope._t(\"Energy Cost\") + \": \" + title + \"%\"\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 0 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n format: '{value}'\r\n },\r\n title: {\r\n text: _t('Energy Cost') + ', ' + '$'\r\n },\r\n min: 0\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 formatter: function () {\r\n console.log(this);\r\n return 'Period: ' + this.key + '
Energy Cost: $' + this.y;\r\n }\r\n },\r\n plotOptions: {\r\n series: {\r\n cursor: 'pointer'\r\n }\r\n },\r\n series: [{\r\n name: \"Bill Amount\",\r\n showInLegend: false,\r\n data: [[data.SameYearOldPeriod.PeriodName, data.SameYearOldPeriod.EnergyCostGcr], [data.SameYearNewPeriod.PeriodName, data.SameYearNewPeriod.EnergyCostGcr]],\r\n }]\r\n });\r\n };\r\n\r\n $scope.createChartTable4 = function (data) {\r\n var title = data.YearOverYearDifference.ConsumptionPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n\r\n Highcharts.chart('comparChartTable4', {\r\n credits: {\r\n enabled: false\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n title: {\r\n text: $scope._t(\"Consumption\") + \": \" + title + \"%\"\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 0 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n format: '{value}'\r\n },\r\n title: {\r\n text: _t('Consumption') + ', ' + data.YearOverYearFullUsageData.ConsumptionUnit\r\n },\r\n min: 0\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 formatter: function () {\r\n console.log(this);\r\n return 'Period: ' + this.key + '
Consumption: ' + this.y + ' ' + data.YearOverYearFullUsageData.ConsumptionUnit;\r\n }\r\n },\r\n plotOptions: {\r\n series: {\r\n cursor: 'pointer'\r\n }\r\n },\r\n series: [{\r\n name: \"Consumption\",\r\n showInLegend: false,\r\n data: [[data.YearOverYearOldPeriod.PeriodName, data.YearOverYearOldPeriod.Consumption], [data.YearOverYearNewPeriod.PeriodName, data.YearOverYearNewPeriod.Consumption]],\r\n }]\r\n });\r\n };\r\n\r\n $scope.createChartTable5 = function (data) {\r\n var title = data.YearOverYearDifference.BillAmountPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n\r\n Highcharts.chart('comparChartTable5', {\r\n credits: {\r\n enabled: false\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n title: {\r\n text: $scope._t(\"Bill Amount\") + \": \" + title + \"%\"\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 0 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n format: '{value}'\r\n },\r\n title: {\r\n text: _t('Bill Amount') + ', ' + '$'\r\n },\r\n min: 0\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 formatter: function () {\r\n console.log(this);\r\n return 'Period: ' + this.key + '
Bill Amount: $' + this.y;\r\n }\r\n },\r\n plotOptions: {\r\n series: {\r\n cursor: 'pointer'\r\n }\r\n },\r\n series: [{\r\n name: \"Consumption\",\r\n showInLegend: false,\r\n data: [[data.YearOverYearOldPeriod.PeriodName, data.YearOverYearOldPeriod.BillAmount], [data.YearOverYearNewPeriod.PeriodName, data.YearOverYearNewPeriod.BillAmount]],\r\n }]\r\n });\r\n };\r\n\r\n $scope.createChartTable6 = function (data) {\r\n var title = data.YearOverYearDifference.EnergyCostGcrPercents;\r\n if (title > 0) {\r\n title = \"+\" + title;\r\n }\r\n\r\n Highcharts.chart('comparChartTable6', {\r\n credits: {\r\n enabled: false\r\n },\r\n chart: {\r\n spacingTop: 40,\r\n spacingBottom: 60,\r\n type: 'column'\r\n },\r\n title: {\r\n text: $scope._t('Energy Cost') + ': ' + title + '%'\r\n },\r\n xAxis: {\r\n type: 'category', labels: { rotation: 0 }\r\n },\r\n yAxis: [{\r\n labels: {\r\n format: '{value}'\r\n },\r\n title: {\r\n text: _t('Energy Cost') + ', ' + '$'\r\n },\r\n min: 0\r\n }],\r\n legend: {\r\n align: 'center',\r\n verticalAlign: 'bottom',\r\n y: 60,\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 formatter: function () {\r\n console.log(this);\r\n return 'Period: ' + this.key + '
Energy Cost: $' + this.y;\r\n }\r\n },\r\n plotOptions: {\r\n series: {\r\n cursor: 'pointer'\r\n }\r\n },\r\n series: [{\r\n name: \"Consumption\",\r\n showInLegend: false,\r\n data: [[data.YearOverYearOldPeriod.PeriodName, data.YearOverYearOldPeriod.EnergyCostGcr], [data.YearOverYearNewPeriod.PeriodName, data.YearOverYearNewPeriod.EnergyCostGcr]],\r\n }]\r\n });\r\n };\r\n\r\n $scope.createAllCharts = function (data) {\r\n $scope.createChartFullYear(data);\r\n $scope.createChartTable1(data);\r\n $scope.createChartTable2(data);\r\n $scope.createChartTable3(data);\r\n $scope.createChartTable4(data);\r\n $scope.createChartTable5(data);\r\n $scope.createChartTable6(data);\r\n }\r\n\r\n $scope.changeGraphType = function () {\r\n $scope.initTables($scope.meterNum, $scope.radioGraphType, $scope.radioGraphTypeConsumption);\r\n }\r\n\r\n $scope.changeGraphTypeConsumption = function () {\r\n $scope.initTables($scope.meterNum, $scope.radioGraphType, $scope.radioGraphTypeConsumption);\r\n }\r\n\r\n $scope.initTables = function (meterNum, graphType, graphTypeConsumption) {\r\n var currentAccountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/Consumption/GetEnergyEfficiencyReport/',\r\n method: \"GET\",\r\n params: {\r\n accountNumber: currentAccountNumber,\r\n meterNum: meterNum,\r\n graphType: graphType,\r\n graphTypeConsumption: graphTypeConsumption\r\n }\r\n }).success(function (json) {\r\n if (json) {\r\n if (json.Errors && json.Errors.length > 0) {\r\n ModalServiceExt.showError(json.Errors[0]);\r\n }\r\n else {\r\n $scope.data = json.Data;\r\n $scope.createAllCharts($scope.data);\r\n $(window).bind('resize', function () {\r\n $scope.createAllCharts($scope.data);\r\n });\r\n }\r\n } else {\r\n ModalServiceExt.showError($scope._t(\"Error occurred during getting of consumptions.\"));\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (error) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n //$scope.initTables();\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 $scope.getMeterDataGraph();\r\n\r\n\r\n\r\n}]);"],"names":["window","location","origin","protocol","hostname","port","String","prototype","startsWith","searchString","position","this","substr","length","Array","findIndex","predicate","TypeError","value","list","Object","thisArg","arguments","i","call","Date","addHours","h","setTime","getTime","deviceIsWindowsPhone","navigator","userAgent","indexOf","isAndroid","iOS","test","isMobileOrRipple","cordova","parent","ripple","getIosVersion","match","split","getIosVersionFloat","iOsVersion","parseFloat","isLandscape","undefined","orientation","isPortrait","getAndroidVersion","ua","toLowerCase","loadCss","url","link","document","createElement","setAttribute","getElementsByTagName","appendChild","getInternetExplorerVersion","rv","appName","RegExp","exec","$1","isIE","getAbsoluteUrl","base","relative","hashPosition","slice","stack","parts","pop","push","join","isNumberFormatCorrect","numberStr","getMaskedPhoneNumberValue","rawValue","input","$","val","mask","Config","phoneNumberMask","getPositiveAmountString","amount","Math","abs","toString","documentWrite","data","MSApp","execUnsafeLocalFunction","writeln","write","provide","utilli","findRequirementByName","key","_","find","item","Key","getCurrentLanguage","isLanguagePackEnabled","language","localStorage","getItem","console","log","checkDefinedValue","hideSplashScreen","splashscreen","AndroidFullScreen","immersiveMode","hide","roles","Administrator","Agent","PropertyManager","CSR","CSRAdmin","FieldServiceEngineer","SystemUser","DataExporter","scrollTop","scrollBottom","delay","setTimeout","each","index","scrollHeight","getCurrentDateForDatePicker","date","day","getDate","getMonth","getFullYear","clearLocalStorage","removeItem","aggregationTypes","property","group","addUserName","state","params","userName","isAdmin","userId","getCurrentAggregation","json","JSON","parse","clearCurrentAggregation","getCurrentGroupId","aggregation","Type","Id","getCurrentPropertyId","handleAjaxResponse","response","ModalServiceExt","successCallbackFn","HasErrors","showError","Errors","showServerError","downloadFile","apiUrl","fileName","href","style","visibility","download","body","click","removeChild","isPasswordValid","passwd","passwdConf","passwdMinLength","hasDigits","hasLetters","validatePassword","password","passRequirements","paswdMinLength","oldPassword","minUserIdLength","requirement","passwordErrors","ErrorText","hasLowerCaseLetters","hasUpperCaseLetters","hasSpecialSymbols","getUrlWithToken","urlPath","tokenParam","param","hasAdminOrCsrRole","token","payload","getPayload","some","role","isSafari","setWindowLocation","goesToDefaultPage","$state","setApiUrl","goToAdmin","adminUrl","pathname","hasPropertyManagerRole","goMainLayout","hasAgentRole","result","hasDataExporterRole","hasAdminRole","hasCsrAdminRole","hasSuperAdminRole","isDemo","DeploymentSettings","deploymentEnvironment","getCurrentUserName","encoded","atob","getFullPhoneNumber","maskPhoneNumber","registerGoogleAnalytics","win","rootScope","isMobile","ga","currentServiceProvider","$on","event","relativeUrl","path","localizationDictionary","enableLanguagePack","providers","EnableLanguagePack","registerLocalization","resource","setItem","changeLanguage","_t","localized","callback","filePath","get","languages","wgl","name","abbreviation","gni","demo","hc","getCountryPhoneNumberCode","datePickerOptions","formatYear","startingDay","showWeeks","isAuthorized","errors","serverErrorMessage","validationErorrsMessage","getApplicationService","serviceName","angular","element","querySelector","injector","mobilePlatforms","unknown","android","iOs","windowsPhone","getPlatformName","formatNumber","num","toLocaleString","maximumFractionDigits","trimFloat2","toFixed","localStorageItemNotNull","propertyRefreshTimeout","getCurrentProviderConfigValue","defaultValue","getHelpEmail","getSupportPhoneNumber","isPropertyManagerApp","providersGroupShortName","toUpperCase","ajustPhoneNumber","phoneNumber","phoneNumberLengthWithoutCountryCode","countryCodeLength","clientEnum","mobileApp","portal","pm","meterErrorCodes","serviceAddressMismatch","getStateNameWithoutLayout","fullStateName","togglePasswordVisibility","pswId","iconId","elemPassword","attr","toggleClass","allInputCssSelectors","allInputAndSelectCssSelectors","getTopMenu","getBottomMenu","applyTopMenuFix","css","top","height","fixHeight","labels","id","scrollToElement","append","scrollIntoView","topMenuHeight","on","onorientationchange","is","version","Debug","serverErrorMsg","consumptionUnits","Water","CCF","Gallons","Electricity","kWh","Gas","Therms","getCurrentConsumptionUnits","utilliType","getConsumptionUnitFraction","unitsType","enableBillDownload","smallConvenienceFee","largeConvenienceFee","largeConvenienceFeeBorder","ccNumberMask","contractAccountMaxLength","zipCodeRegexp","emailPattern","maxMetersOnStackedDashboard","wglProviderName","Neo","Name","SiteName","HelpEmail","EnablePhoneNumbersOnLoginPage","EnableOutageMap","Orwell","Ewst","Wgl","EnablePropertyManagerLink","SupportPhoneNumber","Bangor","Frontier","Hc","DemoProvider","SapDemoProvider","appUrls","winPhone","states","month","parseInt","getPositiveAmount","module","factory","request","config","clientVersion","withoutAuthentication","$q","$injector","RequestService","notAuthenticatedRequest","reload","newUrl","indexOfAdmin","indexOfIndex","newLocation","current","indexOfRelativeUrl","keys","forcedAbort","goToSignIn","currentVersion","add","isObject","forEach","isUndefined","header","headers","showMessage","abort","responseError","fnCallback","stateService","status","go","timeout","stop","ajax","providersServiceUrl","replace","method","fail","e","reject","$compileProvider","$stateProvider","$urlRouterProvider","$stickyStateProvider","$httpProvider","isParamsArray","getCommonHeaderViewsConfiguration","stateName","parentFolder","pagesPath","top-menu","templateUrl","controller","main-content","enableDebug","imgSrcSanitizationWhitelist","interceptors","otherwise","registerForLayoutStateWithCommonHeader","layout","views","registerPropertyManagerRoute","registerRelative","mainFolder","registerStateWithCommonHeader","registerForTopMenuLayout","registerAddPropertyRoute","AddPropertySteps","registerAddPropertyErrorsRoute","registerImportPropertyRoute","templateName","template","body-view","Wizard","parentView","wizardRootStateName","parentDirectory","registerWizardRoot","wizardRoot","registerWizardStep","stepNumber","createWizard","program","footer","sticky","dsr","SignIn","SignInSteps","SignUpPropertyManagerSteps","email","signInParams","from","login","SignUpAgentSteps","ForgotPasswordSteps","ForgotUserIdSteps","ForgotUserIdByEmailSteps","SignUpSteps","QuickPay","QuickPaySteps","$provide","decorator","$delegate","fixHttpPromise","ajaxPromise","originalErrorMethod","apply","originalErrorHandler","originalThenMethod","originalThenErrorHandler","wrapper","promise","$http","filter","defaults","post","obj","subName","subValue","innerObj","query","encodeURIComponent","transformRequest","run","$rootScope","$window","$location","CheckVersionService","ServiceProvidersService","ServerCacheService","$resource","productTourService","lastLocationChangeTimestamp","itemNotNull","isProtectedPage","toState","clearServerCache","extendedSplashScreen","FastClick","attach","actualLocation","clear","$watch","toParams","fromState","isTourActive","pauseTour","isAccountDataValid","preventDefault","options","propertyManager","contractAccountNumber","goTopMenuLayout","goToWelcome","goToAgentsWelcome","goToPropertyManagersWelcome","withRedirect","redirectedFrom","stringify","stateParams","goToSignUp","goToForgotPassword","goToForgotUserID","goToSignInWithRedirectTo","to","redirectTo","includesChild","childStateName","goFromWelcomeTo","goRelativeTo","parentName","childName","parentPos","topRoute","checkVersion","then","isVersionWrong","isVersionCorrect","getProviderApiUrl","success","error","directive","restrict","scope","fixNumberFormat","Number","keyup","trim","oldValue","keydown","keyCode","focusout","$timeout","$scope","placeholder","CommonHeaderService","HeaderServiceFactory","getHeaderSerivce","$stateParams","$sce","usSpinnerService","validateToken","isAgent","isPropertyManager","welcomePath","spin","getProvider","providerData","ApiUrl","verificationToken","html","trustAsHtml","Data","Html","NotificationBoxService","LeftMenuService","setTemporarilyHide","show","setUpBackButton","forProgramEnrollments","forProgramEnrollmentsLearnMore","countryCode","confirmationCodeMask","verificationCodeRequested","canRequestVerificationCode","timeoutStr","tickTimer","sendVerificationCode","requestData","valid","phoneNumberError","validatePhoneNumber","confirmPhone","confirmationCodeError","confirmationCode","validateConfirmationCode","code","setSubscribeSmsVisibilityServerFlag","maskedPhone","popupMessage","back","loadContent","getCurrentProvider","Message","setUp","provider","resp","dbInfo","showInfo","applyMigrations","checkVersionPromise","goToWithVersionChecking","botLogin","dataobj","userNameOrEmail","credentials","channelId","search","fromId","jsondata","ERROR_LIST","Valid","svc","getGridResizeFunc","gridElement","bottomSpace","kendoGrid","table","grid","contentContainerHeight","innerHeight","containerOtherElemententsHeight","getBoundingClientRect","otherElements","children","not","otherElementsHeight","outerHeight","contentContainerHeightWithoutTopElements","heightOf10Rows","_data","clientHeight","floor","minHeight","extendPaymentItem","paymentItem","isPaymentCancelationEnabled","PaymentDescription","PaymentAmount","paymentDateUnix","PaymentDate","checkOrConfirmationNumberHeader","PaymentBy","checkOrConfirmationNumber","PaymentConfirmationNumber","canCancelPayment","now","setDate","controlTime","getCanCancelPayment","cancelPayment","AccountNumber","PaymentId","$broadcast","billsService","CommonDataService","PaymentHistoryService","setCurrentTab","currentTab","viewDetails","bill","setCurrentBill","showSlideAnimation","billNumber","BillNumber","billAmountClass","billItem","PaidStatus","billsHistoryInfoForScrolling","billsInfoForScrolling","billsInfoBusy","billsLoadedCount","billsInfoEndReached","billsHistoryInfoBusy","paymentsLoaded","billsHistoryInfoEndReached","getBillsInfoScrolling","dataRequest","accountNumber","skip","pageSize","withTotalCount","IsGettingDashboardInfo","ErrorList","acceptBillsInfoScrolling","Bills","getBillsHistoryInfoScrolling","getCommonData","commonData","EnablePaymentCancelation","acceptBillsHistoryInfoScrolling","GetPaymentHistoricBills","splice","BillsService","OpenFileService","GridService","billsGridResizeFunc","resize","billsKendoGrid","understandMyBill","openUnderstandBillFile","makePayment","managePaymentOptions","viewBill","openBill","mainGridOptions","dataSource","transport","read","parameterMap","type","page","schema","total","serverPaging","sortable","pageable","pageSizes","buttonCount","refresh","serverFiltering","serverSorting","dataBound","columns","field","title","width","kendo","paymentsGridResizeFunc","paymentsKendoGrid","ModalService","CustomerInfoDataService","DueReminderService","UnitsService","units","isPayNowButtonVisible","setUpNotificationButton","customerInfo","account","loading","showProductTour","userinfo","Tour","startTour","showDueReminder","isReminderShown","markAsShown","DateDiff","TotalOpenBalance","IsDisconnected","showModal","modal","close","ServiceAddress","CustomerFullName","LastPaymentDate","LastPaymentAmount","currentBallance","dashboardInfo","payNow","getUtilityImage","showRefundButton","EnablePaymentRefund","requestRefund","GetDashboardInfo","getCustomerInfoData","customerInfoData","UtilliType","updateUnits","showDueDate","DueDate","showPastDue","showDisconnected","dueDateTicks","ex","acceptDashboardData","$element","getCachedData","closeModal","dateSource","dateAsString","parseDate","goTo","address","gotoPayment","gotoPaymentOptions","getFormatedDueDate","getFormatedDisconnectDate","DisconnectDate","isMultipleProviders","enableOutageMap","goToQuickPay","goToOutages","anonymous","serviceProviderName","helpEmail","showPhoneNumbers","phoneNumbers","loadPhoneNumbers","getProviders","currentProviderName","providersFiltered","grep","isPropertyManagerWelcomePage","goToRequestMeterRevocation","phoneNumbersLoaded","hideMenuToggleButton","Model","firstName","lastName","agency","securityQuestion","securityAnswer","$moduleServices","isProviderListVisible","allProviders","webServicesUrl","serviceUrl","cancel","showYesNoMessage","checkUserInfoFormSubmit","formUserInfo","$valid","submitted","regData","isEmailPredefined","email2","passwdErrors","loadingText","validateUserID","$viewValue","SecurityQuestions","PasswordLength","PasswordRequirements","MinUserIdLength","sequrityQeuestions","getPasswdMinLength","isPasswdValid","passwordsNotMatch","confirmPassword","checkLoginInfoFormSubmit","loadTermsAndConditions","TermAndConditionsFormSubmit","hideKeyboard","client","companyNameLong","CompanyNameLong","companyNameLongWithoutTrailingPeriod","CompanyNameLongWithoutTrailingPeriod","CompanyHelpEmail","SuccessOk","avatarsService","espmConnected","securityQuestions","userData","UserData","PhoneNumber","SecurityQuestion","setCurrentAvatar","AvatarPath","espmFirstName","FirstName","espmLastName","LastName","espmAddressLine1","Address1","espmAddressLine2","Address2","espmCity","City","espmState","State","espmZip","PostalCode","espmEmail","Email","espmOrganization","Organization","espmJobTitle","JobTitle","espmPhone","Phone","espmAccountDisconnect","UserName","save","postData","editProfileForm","jQuery","extend","changeAvatar","forPropertyManager","$filter","DefaultPropertyService","PropertyService","PropertyListService","getPropertyList","getAggregation","setMetersColor","chart","series","seria","meterColors","meter","colorIndex","_colorIndex","MetersCount","loadProperty","getStackedGraph","previousPage","disablePrev","currentPage","nextPage","disableNext","noProperties","noData","plotStackedChart","consumptionResponse","unitsName","selectedUnitsType","chartOptions","colorCount","exporting","enabled","text","subtitle","xAxis","categories","tickmarkPlacement","rotation","yAxis","formatter","tooltip","valueSuffix","plotOptions","area","stacking","lineColor","lineWidth","marker","credits","consumptionData","setSelectedUnitsIfEmpty","Uom","tableData","TableData","shift","clone","Consumption","ConsumptionString","AvgConsumption","AvgConsumptionString","Unit","Year","Month","MeterConsumptions","meterColor","MeterNumber","stringFixed","Consumptions","convertedConsumption","Dates","fillChartData","Highcharts","propertyId","enableIndividualMeters","EnablePropertyManagersDashboardIndividualMeters","urlForConumptions","uom","backToBarGraph","getExcelData","fileId","getGreenButtonData","refreshScore","groupName","delegatingUser","DelegatingUser","delegatingUserPhone","DelegatingUserPhone","delegatingUserEmail","DelegatingUserEmail","NumberOfProperties","PropertiesCount","pointFormat","coefficient","getCoefficient","AmountString","Amount","PropertyConsumptions","PropertyAddress","groupId","meters","currentMeter","map","unshift","getBarGraph","plotBarChart","headerFormat","enableMouseTracking","spacingTop","spacingBottom","min","opposite","format","visible","legend","align","verticalAlign","y","floating","backgroundColor","theme","background2","borderColor","borderWidth","shadow","shared","useHTML","cursor","point","events","selectedPeriodString","label","unit","AvgTemperature","low","MonthMinTemperature","high","MonthMaxTemperature","meterNumber","backToStackedGraph","treeMapChartOptions","colorAxis","minColor","maxColor","getOptions","colors","layoutAlgorithm","colorValue","period","GetAccountsService","propertyManagerTourService","showOkMessage","addProperty","stepsCount","step","importProperty","why","goToAuth","deleteProperty","currentAggregation","propertyList","newCurrentProperty","viewProperty","goToDashboard","editProperty","loadPropertyList","resumeTour","reaons","addGroup","createProperty","deleteGroup","propertyGroupId","groupList","newCurrentGroup","viewGroup","editGroup","mode","PropertyDataService","headerText","currentYear","deactivateOldMeters","$parent","overallStepsCount","getProperty","propertyName","PropertyName","propertyPrimaryFunction","PrimaryPropertyFunction","address1","address2","city","postalCode","Zip","grossFloorArea","GrossFloorArea","grossFloorAreaUnits","GrossFloorAreaUnits","yearBuilt","YearBuilt","irrigatedArea","IrrigatedArea","irrigatedAreaUnits","IrrigatedAreaUnits","occupancy","Occupancy","numberOfBuildings","NumberOfUnits","next","form","$submitted","Area","Units","NumberOfBuildings","DeactivateOldMeters","PropertyId","PropertySettingsService","propertyTypes","getPropertyTypeNames","typeId","caption","chosenPropertyTypes","PropertyTypes","propType","TypeId","addPropertyType","deletePropertyType","$index","empty","$setValidity","isNumber","n","isNaN","isFinite","propertyDetailsName","handledPropertyTypesCount","setPropertyType","currentPropertyType","propTymeNames","currentPropertyTypeGoodName","FieldsJson","fields","fromJson","currentPropertyFieldSettings","fieldsList","sortBy","fieldsObject","array","hasOwnProperty","controlType","controlTypeByFieldName","fieldsObjectToArray","itm","getPropertyFieldsSettings","control","fieldCaptionByFieldName","getFieldCaptionByFieldName","fieldDescriptionByFieldName","getFieldDescriptionByFieldName","currentType","dateString","itemNum","inputField","toJson","propertyFieldSettings","setting","currentAsOf","valueSpecified","currentAsOfSpecified","temporary","temporarySpecified","PropertyType","BulkMetersService","loadMeters","clientUtilliIdCounter","Meters","m","checked","HasMultipleAddresses","ErrorCode","bulkMeters","getMeters","topMeter","topMeterId","canMassVerifyServiceAddress","failedMeters","clientUtilliId","numberForSearch","serviceAddressMismatchErrorCode","getErrorInfo","setCurrentMeterVisible","getMetersCount","mtr","isDeleteAllAvailable","bulkInput","addedMeters","addedMeterNumbers","addMeters","verifyAllAddresses","deleteAllMeters","deleteMeterWithoutConfirmation","copyMeters","$temp","copiedMeters","pluck","select","execCommand","remove","addMeter","maxId","deleteMeter","typeIndex","httpResponse","NeedMetersApproval","showAuthorizationMetersWarningDialog","requestParams","showAuthorizationMetersWarning","utilliIndex","verify","Authorized","submit","NeedsAuthorization","phone","organizationName","Agency","radioEnergyStarAccountType","jobTitle","OrganizationName","PrimaryBusiness","primaryBusiness","OtherBusinessDescription","otherBusinessDescription","EnergyStarPartner","energyStarPartner","EnergyStarPartnerType","energyStarPartnerType","OtherEnergyStarPartnerTypeDescription","otherEnergyStarPartnerTypeDescription","currentUserName","isBackVisible","PropertySharingResult","ApprovedByPM","meterId","noCallback","service","TotalGrossFloorArea","AreaOfAllWalkInRefrigerationUnitsElement","LengthOfAllOpenClosedRefrigerationUnitsElement","NumberOfWorkers","NumberOfComputers","WeeklyOperatingHours","OtherProperty","HeatingElement","CoolingElement","HeatingPercentElement","CoolingPercentElement","HasComputerLabElement","CookingFacilitiesElement","NumberOfWalkInRefrigerationUnitsElement","NumberOfCashRegistersElement","NumberOfOpenClosedRefrigerationUnitsElement","HasDiningHallElement","NumberOfMriMachinesElement","LicensedBedCapacityElement","MonthsInUseElement","NumberOfRoomsElement","NumberOfFteWorkersElement","NumberOfCommercialRefrigerationUnitsElement","EnclosedFloorAreaElement","NumberOfSportingEventsPerYearElement","NumberOfConcertShowEventsPerYearElement","NumberOfSpecialOtherEventsPerYearElement","SizeOfElectronicScoreBoardsElement","IceEventsElement","NumberOfResidentialLivingUnitsElement","NumberOfBedroomsElement","AverageNumberOfResidentsElement","MaximumResidentCapacityElement","NumberOfCommercialWashingMachinesElement","NumberOfResidentialLiftSystemsElement","SingleStoreElement","ExteriorEntranceToThePublicElement","adultEducationFields","ambulatorySurgicalCenterFields","aquariumFields","automobileDealershipFields","bankBranchFields","barNightclubFields","barracksFields","bowlingAlleyFields","casinoFields","collegeUniversityFields","convenienceStoreWithGasStationFields","convenienceStoreWithoutGasStationFields","conventionCenterFields","courthouseFields","dataCenterFields","distributionCenterFields","drinkingWaterTreatmentDistributionFields","enclosedMallFields","energyPowerStationFields","fastFoodRestaurantFields","financialOfficeFields","fireStationFields","fitnessCenterHealthClubGymFields","foodSalesFields","foodServiceFields","hospitalGeneralMedicalSurgicalFields","hotelFields","iceCurlingRinkFields","indoorArenaFields","k12SchoolFields","laboratoryFields","libraryFields","lifestyleCenterFields","mailingCenterPostOfficeFields","manufacturingIndustrialPlantFields","medicalOfficeFields","movieTheaterFields","multifamilyHousingFields","museumFields","nonRefrigeratedWarehouseFields","officeFields","otherFields","otherEducationFields","otherEntertainmentPublicAssemblyFields","otherLodgingResidentialFields","otherMallFields","otherPublicServicesFields","otherRecreationFields","otherRestaurantBarFields","otherServicesFields","otherStadiumFields","otherTechnologyScienceFields","otherUtilityFields","otherSpecialityHospitalFields","outpatientRehabilitationPhysicalTherapyFields","parkingFields","performingArtsFields","personalServicesHealthBeautyDryCleaningFields","policeStationFields","preSchoolDaycareFields","prisonIncarcerationFields","raceTrackFields","refrigeratedWarehouseFields","repairServicesVehicleShoeLocksmithFields","residentialCareFacilityFields","residenceHallDormitoryFields","restaurantFields","retailStoreFields","rollerRinkFields","selfStorageFacilityFields","seniorCareCommunityFields","singleFamilyHomeFields","socialMeetingHallFields","stadiumClosedFields","stadiumOpenFields","stripMallFields","supermarketGroceryStoreFields","swimmingPoolFields","transportationTerminalStationFields","urgentCareClinicOtherOutpatientFields","veterinaryOfficeFields","vocationalSchoolFields","wastewaterTreatmentPlantFields","wholesaleClubSupercenterFields","worshipFacilityFields","zooFields","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","amountOfLaundryProcessedAnnually","averageEffluentBiologicalOxygenDemand","averageInfluentBiologicalOxygenDemand","averageNumberOfResidents","completelyEnclosedFootage","cookingFacilities","coolingEquipmentRedundancy","exteriorEntranceToThePublic","fixedFilmTrickleFiltrationProcess","fullServiceSpaFloorArea","areaOfAllWalkInRefrigerationUnits","lengthOfAllOpenClosedRefrigerationUnits","enclosedFloorArea","governmentSubsidizedHousing","gymCenterFloorArea","hasComputerLab","hasDiningHall","hasLaboratory","hoursPerDayGuestsOnsite","isHighSchool","isTertiaryCare","iceEvents","numberOfConcertShowEventsPerYear","numberOfSpecialOtherEventsPerYear","numberOfSportingEventsPerYear","numberOfSurgicalOperatingBeds","sizeOfElectronicScoreBoards","surgeryCenterFloorArea","itEnergyMeterConfiguration","itEnergyConfiguration","laundryFacility","maximumNumberOfFloors","maximumResidentCapacity","licensedBedCapacity","monthsInUse","numberOfBedrooms","numberOfCashRegisters","numberOfCommercialRefrigerationUnits","numberOfCommercialWashingMachines","numberOfComputers","numberOfResidentialLivingUnitsLowRiseSetting","numberOfFTEWorkers","numberOfGuestMealsServedPerYear","numberOfLaundryHookupsInAllUnits","numberOfLaundryHookupsInCommonArea","numberOfMriMachines","numberOfOpenClosedRefrigerationUnits","numberOfPeople","numberOfResidentialLiftSystems","numberOfResidentialLivingUnits","numberOfResidentialWashingMachines","numberOfRooms","numberOfHotelRooms","numberOfStaffedBeds","numberOfWalkInRefrigerationUnits","numberOfWeekdaysOpen","numberOfWorkers","gymnasiumFloorArea","studentSeatingCapacity","nutrientRemoval","onSiteLaundryFacility","openFootage","openOnWeekends","ownedBy","partiallyEnclosedFootage","percentCooled","percentHeated","numberOfResidentialLivingUnitsMidRiseSetting","percentOfGrossFloorAreaThatIsCommonSpaceOnly","plantDesignFlowRate","poolLocation","poolSize","numberOfResidentialLivingUnitsHighRiseSetting","residentPopulation","schoolDistrict","seatingCapacity","singleStore","upsSystemRedundancy","supplementalHeating","weeklyOperatingHours","totalGrossFloorArea","numberOfIndoorIceRinks","totalIceRinkSurfaceAreaForAllRinks","numberOfWeeklyIceResurfacingForAllRinks","numberOfCurlingSheets","spectatorSeatingCapacity","monthsMainIndoorIceRinkInUse","percentOfficeCooled","percentOfficeHeated","enrollment","grantDollars","primaryPropertyFunctions","AdultEducation","AmbulatorySurgicalCenter","Aquarium","AutomobileDealership","BankBranch","BarNightclub","Barracks","BowlingAlley","Casino","CollegeUniversity","ConvenienceStorewithGasStation","ConvenienceStorewithoutGasStation","ConventionCenter","Courthouse","DataCenter","DistributionCenter","DrinkingWaterTreatmentDistribution","EnclosedMall","EnergyPowerStation","FastFoodRestaurant","FinancialOffice","FireStation","FitnessCenterHealthClubGym","FoodSales","FoodService","HospitalGeneralMedicalSurgical","Hotel","IceCurlingRink","IndoorArena","K12School","Laboratory","Library","LifestyleCenter","MailingCenterPostOffice","ManufacturingIndustrialPlant","MedicalOffice","MixedUseProperty","MovieTheater","MultifamilyHousing","Museum","NonRefrigeratedWarehouse","Office","OtherEducation","OtherEntertainmentPublicAssembly","OtherLodgingResidential","OtherMall","OtherPublicServices","OtherRecreation","OtherRestaurantBar","OtherServices","OtherStadium","OtherTechnologyScience","OtherUtility","Other","OtherSpecialtyHospital","OutpatientRehabilitationPhysicalTherapy","Parking","PerformingArts","PersonalServicesHealthBeautyDryCleaningetc","PoliceStation","PreschoolDaycare","PrisonIncarceration","RaceTrack","RefrigeratedWarehouse","RepairServicesVehicleShoeLocksmithetc","ResidenceHallDormitory","ResidentialCareFacility","Restaurant","RetailStore","RollerRink","SelfStorageFacility","SeniorCareCommunity","SingleFamilyHome","SocialMeetingHall","StadiumClosed","StadiumOpen","StripMall","SupermarketGroceryStore","SwimmingPool","TransportationTerminalStation","UrgentCareClinicOtherOutpatient","VeterinaryOffice","VocationalSchool","WastewaterTreatmentPlant","WholesaleClubSupercenter","WorshipFacility","Zoo","Properties","selectId","Address","ticks","removeProperty","ids","PropertyIds","getAvailableProperties","p","gp","selectedPropertyToAdd","availableProperties","all","propertyFromTheList","catch","authorizations","fixScore","score","getAuthorizations","scrollingBusy","authorizationsCompleted","view","sendInvitation","exportData","gridResizeFunc","authorizationsKendoGrid","gridOptions","transports","webapi","prefix","resizable","invitations","getInvitations","invitationsCompleted","invitationsKendoGrid","noRecords","messages","recipientInvitation","initRecipientInvitationData","Recipient","isPending","DisplayedStatus","saveChanges","editInvitationForm","recipientEmail","recipientName","setFocus","elSelector","getElementById","focus","history","getStatusClass","Status","resend","","SharedMetersCacheService","supportPhoneNumber","viewUnderstandYourBill","useCachedMeters","claim","getServiceAddress","addresses","HouseNumber","Street","goBack","addressChecked","currentAddress","currentAddressIndex","confirm","MeterId","accountMaxLength","change","x","zip","invoiceNumber","recipientId","claimMeterForm","RecipientId","goEditProperty","propertiesWithTheSameMeter","setError","tiedMeters","acknowledge","ok","metersText","metersNumbers","concat","changeRequestStatus","requestId","successMessage","requests","getRequests","count","requestsCompleted","sendSharingAccountRequest","accept","revoke","makeActive","delete","send","userIdOrEmail","explanation","tenantName","approve","searchBy","parameters","searchResults","companyName","isSearchResultVisible","isRequiredFilled","searchForm","$error","pattern","houseNumber","street","zipCode","unitApt","HouseNoSupplement","onHouseNumberChange","splited","substring","byAccountNumber","byAddress","isZipCodeValid","askAboutSettlementProperty","utilityType","TimeService","getTimeZone","timeZoneShift","convertDate","usersUrl","searchHistoryKenoGrid","hidden","dataItem","UtilityType","goToOverview","settlementDate","dpOptions","altInputFormats","datepickerPopup","opened","propertyAddress","settlementPropertyForm","addressLine","firstAndLastName","firstLastName","mailingAddress","toUTCString","forAgent","languageParams","currentLanguage","goToLanguages","services","showResentVerificationEmailField","redirect","defaulState","isDebug","resetErrors","errorFromServerReturned","serverErrorInformation","serverErrors","showServerErrors","signIn","fromAddress","defer","mobilePlatform","rememberMe","mobileDeviceToken","getDeviceToken","errorMessage","resolve","SecurityToken","Language","providerName","_getCurrentProviderName","IsAdmin","fromPart","getFromPart","CurrentAccountNo","BusinessPartner","unmarkAsShown","resendVerificationEmail","showResendVerificationEmail","app","InitSideMenu","isTouchDisabled","slideout","Slideout","panel","menu","padding","tolerance","touch","toggle","snapper","Snap","disable","maxPosition","minPosition","open","SignInService","_lastLoginWithRequiredEmail","stepName","showResentVerificationEmail","showResentVerificationEmailDone","togglePassword","emailRequired","debug","gotoAfterVersionChecking","message","goToForgotUserId","backVisible","resentVerificationEmail","copyServices","loginForm","isMaintenance","any","IsAvailable","emailError","checkProvidersPromise","deferred","providersApiUrl","checkServiceProviders","checkVersionResult","checkProvidersSuccess","isEmailRequired","loginByProvider","err","capsLockFlags","resetCapsLockFlags","bind","which","$apply","shiftKey","capsLock","includes","selectedService","radioClick","removeClass","prop","addClass","allSelectElements","addEventListener","stopPropagation","init","accountnumber","customerfullname","ZipCode","FullName","checkAccountInfoFormSubmit","formAccountInfo","checkAccountInfoPromise","Step","Client","Token","NonLegacyAccount","serviceProvider","checkAccountInfoResult","Email2","Value","isUserDataCorrect","UserID","required","SecurityAnswer","Password","ConfirmPassword","SecurityQuestion1","SecurityAnswer1","user","psw","question","answer","Fullname","TermsAndConditions","termsAccepted","checkTermAndConditionsFormSubmit","goToStep2","imagesPath","streetName","onlyNumbers","firstLastNamePattern","quickPayValidationType","quickPayValidationCaption","isFeeEnabled","LargeConvenienceFeeBorder","SmallConvenienceFee","LargeConvenienceFee","paymentInfoText","FeeInformation","commomData","isBankAccountPaymentsEnabled","IsBankAccountPaymentsEnabled","isCreditCardCvvEnabled","IsCreditCardCvvEnabled","isCreditCardBillingAddressEnabled","IsCreditCardBillingAddressEnabled","QuickPayValidationType","IsFeeEnabled","findResultVisible","appartment","informationMessage","invoiceNumberError","isInformationMessageShown","isPaymentInfoAgreeBank","isPaymentInfoAgreeCard","clearAccountSearch","clearAddressSearch","amountDue","showProceedAnyway","outputSearchType","searchRequest","streetNumber","apartmentNumber","IsSuccessful","findResultList","iKnowAccountNumberClick","radioSearchType","iKnowServiceAddressClick","selectAccount","clearPaymentSettings","currentAccount","getConvFeeInfo","TotalOpenBallance","updateConvinienceFee","totalAmount","formatDecimal","convinienceFee","formatTotalAmount","cardNumber","nameOnCard","cardExpiryMonth","cardExpiryYear","billToAddress","billToCity","billToState","billToZip","cardCode","checkNameOnAccount","bankRoutingNumber","bankCheckingAccountNumber","bankCheckingAccountNumber2","driversLicenseNumber","checkPaymentState","searchObject","convFeeInfo","Disconnected","info","FeeType","FeeAmount","FeeTypeAch","FeeAmountAch","decimal","formated","round","onAmountChange","cancelPaymentOptionSelection","selectPayByCard","selectPayByBankAccount","bankAccountFormSubmitted","cardFormSubmitted","payNowCard","payCardAccount_form","ccNumber","$invalid","ccExpMonth","ccExpYear","ccExp","$type","proceededWithoutSearch","selectedCompany","companyCode","requestResult","requestUrl","accountNum","invoiceNum","businessPartnerNum","alert","validateInvoiceNumber","CompanyCode","paymentObject","amountToPay","expirationDateYear","expirationDateMonth","PaymentPage","paymentResult","paymwntResult","payNowBankAccount","payBankAccount_form","selectedCompanyOption","routingNumber","routNumError","nameOnAccount","checkingAccountNumber","bankAccountPay","paymentOk","viewurl","proceedToRegistration","activeElement","blur","setErrors","SecureData","CheckUserInfoFormSubmit","frmCheckUserInfo","appUrl","CheckSecurityAnswerFormSubmit","frmSecurityAnswer","contactPhoneNumber","SupportPhone","workingHours","WorkingHours","billingEmailTo","BillingEmailTo","CompanyName","require","elem","attrs","ctrl","otherInput","inheritedData","repeatPassword","$parsers","goToCsr","pstrAccountNumber","confirmpassword","actionEvent","model","UserId","checkSecurityAnswer","userMessage","recipients","availableOptions","selectedOption","loadData","addRecipient","removeRecipient","recipient","meterIsUsedErrorCode","getInvitationText","invitationData","invitationToken","responses","invitationTextResponse","metersResponse","v","getStaticData","InvitationToken","targetState","setMeters","Error","comments","failedMeter","decline","InvitationRecipientId","Comments","savedMeters","exit","removeMeter","radioGraphType","radioGraphTypeConsumption","noMeters","AggregationName","AggregationValue","noMetersMessage","jsonData","initTables","getMeterDataGraph","selectMeter","createChartFullYear","YearOverYearFullUsageData","EfficiencyInfo","kendoChart","font","seriesColors","themeSettings","consumptionReadingColor","costColor","axis","PreviousYear","PreviousYearConsumptions","color","ConsumptionUnit","ThisYear","ThisYearConsumptions","PreviousYearMonthlyAverageTemperatures","visibleInLegend","ThisYearMonthlyAverageTemperatures","valueAxis","line","minorGridLines","categoryAxis","PeriodNames","axisCrossingValues","majorGridLines","createChartTable1","SameYearDifference","ConsumptionPercents","chartArea","SameYearOldPeriod","SameYearNewPeriod","max","PeriodName","createChartTable2","BillAmountPercents","BillAmount","createChartTable3","EnergyCostGcrPercents","EnergyCostGcr","createChartTable4","YearOverYearDifference","YearOverYearOldPeriod","YearOverYearNewPeriod","createChartTable5","createChartTable6","createAllCharts","changeGraphType","changeGraphTypeConsumption","graphType","graphTypeConsumption","meterNum","consumptionType","totalNumberOfMeters","numberOfErrors","authorized","propertyPrimaryFunctionName","numberOfMeters","NumberOfMeters","NumberOfErrors","propTypeNames","editPropertyOverview","editPropertyDetails","editMeters","submitAuth","showChartLoading","showLoading","setCurrentMeter","meterInfo","MeterNum","selectedAccountAndMeter","greenButtonDataUrl","exportToExcelUrl","getGraph","currentAccountNumber","graphPageJson","hideLoading","isFirstGraphLoad","PageData","setSelectedUnits","processGraphData","pointsTotalCount","Count","graphPoints","convertChartUnits","reading","tableDataItem","ReadingDateForTable","amountString","registerNum","RegisterNumber","consumption","averageMonthlyTemperature","MonthAverageTemperature","AverageMonthlyTemperature","createChart","isExportToExcelButtonVisible","isMultipleMeters","meterOptions","startSpin","stopSpin","jsonObject","jsonMeterNumIs","fillMeterOptions","useMeterData","targetUnitsType","getSelectedUnitsTypeName","sourceUnitsType","currentUnits","graphData","ReadingDateForGraphCategory","register","dropDownItems","unitsTypeName","updateProperties","existingPropertyList","areTherePropertiesInProgress","existingProperty","ep","IsSyncInProcess","EnergyStarScore","CurrentConsumption","withoutDelegated","reloadPropertylist","isLoading","checkApiResponseError","catchAjaxError","updateProperty","freshProperty","GetPropertyStatus","selectedMeters","selectedIds","MeterIds","reloadFinishCallback","reloadProperty","AccountListService","showDueDateInternal","TotalBalance","showPastDueInternal","AddAccount","accountDataList","DeleteAccount","newPrimaryAccount","currentPrimaryAccount","getNewPrimaryAccount","acc","changeContractAccount","GetAccountsList","getAccounts","Accounts","getTotalBalanceClass","getAccountBalanceClass","getDueDateClass","buttonMessage","busy","getLogo","getLogoText","getText","tryPing","done","d","UpdateApp","addAccount","dataObj","accountEmptyError","accountFormatError","zipEmptyError","zipFormatError","fullNameEmptyError","validated","Messages","transclude","paymentHistoryItem","consumptionHistoryItem","newPasswordEmpty","passwordsDontMatch","newPasswordLength","newPasswordNoDigits","newPasswordNoLetters","newPasswordNoSpecialSymbols","pswSameAsUserNameError","newPassword","confirmNewPassword","changePassword","validate","NewPassword","SuccessMessage","logoutRequired","clientId","conversationId","backFromBillDetails","loadBill","billDateUnix","BillDate","dueDateUnix","Charges","LatePayAmount","isUnderstandLoading","ViewPdf","understandBill","StatesService","hasErrors","wrongEmail","emptyEmail","emptyHouseNumber","emptyCity","emptyStreet","emptyZip","wrongZip","emptyStartDate","emptyStopDate","commonMessage","successDialogClosed","needConfirmAddress","confirmAddressText","addServerError","StartServiceDate","StopServiceDate","AddressLine","AdditionalAccountName","ProceedAddress","errorInfo","moveService","modelCopy","Abbreviation","Success","NeedConfirmAddress","updateProceedAddress","proceedAddress","ForwardingAddress","POBox","cancelService","regexp","forwardingAddress","houseNumberPOBoxEmptyError","houseNumberPOBoxFilledError","invalidHouseNumberError","invalidPOBoxError","streetError","oddStreetError","cityError","invalidCityError","stateError","invalidStateError","zipError","stopServiceDate","ProgramEnrollmentsSettings","loadSettings","getSettings","programs","learnMore","programName","enrollEBilling","toggleProgramEnrollment","programEnrollmentsType","eBilling","EBilling","IsEnrolled","enrollAutoPay","showNotImplemented","goDonationHistory","enrollBudgetBillingAction","budgetBillingLearnMore","budgetBillingAction","BudgetBilling","budgetBilling","unenrollSmsNotifications","unenrollEmailNotifications","goDonationProgramEnrollment","Donation","donation","donationProgram","RoundUpEnabled","FixedAmountEnabled","PercentageEnabled","toggleEnrollment","sendRequest","enrollOrUnenroll","_cachedData","autoPay","programType","caNumber","settingName","withoutCache","goToStep1","checkSettings","isDataLoaded","donationPreference","fixedAmountEnrollForm","percentageEnrollmentForm","ChangePasswordPasswordRequirements","currentPassword","isButtonPressed","CurrentPassword","loadFAQ","faqContent","loadSystemInfo","responseData","serverInfo","errorData","serverAddress","toHtml","htmlCode","checkFaq","directDebitParam","processFaq","closest","downloadManual","decodeURIComponent","$last","$eval","repeatDone","$compile","$parse","parsed","ngBindHtml","avatar","getCurrentAvatar","getAvatars","avatars","setAvatars","addUserInfoError","userInfoErrors","accountInfoErrors","invalidEmailError","accountInfoActive","mailingAddressDisabled","EnableMailingAddress","getProfileData","merge","profile","AccountData","PrimaryPhoneNumber","AvatarURL","dashboard","toAccountInfo","toUserInfo","getUserInfoClasses","getAccountInfoClasses","SubscribeForSmsNotification","subscribeYes","SubscribeForEmailNotification","subscribeNo","phoneSubscribeYes","phoneSubscribeNo","changePhoneNumber","deletePhoneNumber","selectedImage","loadAvatars","imageUrl","selectAvatar","avatarData","getBackStateName","outageMapDescription","outageListDescription","outageSafetyDescription","outageHistoryDescription","getOutagesStatistic","reportsCount","avgRestorationHours","AverageRestorationTime","Hours","hoursAbbreviation","avgRestorationMins","Minutes","minutesAbbreviation","outageMap","outageList","outageSafety","outageHistory","OutagesService","mapOptions","zoom","center","google","maps","LatLng","mapTypeId","MapTypeId","ROADMAP","mapTypeControl","streetViewControl","zoomControlOptions","ControlPosition","RIGHT_TOP","Map","adjustSize","Geocoder","getOutages","outages","outage","lat","Coordinate","Latitude","lng","Longitude","Marker","Location","icon","getIcon","setIcon","addListener","setCenter","getPosition","selectedOutages","o","withoutImage","where","Image","displayDetails","loadImagesAndDisplay","markerClicked","CreatedOn","reverse","common","currentOutage","mapElement","closeOutageDetails","closeDetails","selectedOutage","panelClicked","big","handleClick","small","previous","disablePrevious","addressClicked","addDomListener","getCenter","trigger","reportOutage","showLoginRequired","getStatusIcon","outageReportDataService","outageMyLocationService","getUtillityTypes","translated","utillityTypes","isValid","selectedLocation","problemDescription","descriptionEmptyError","houseNumberEmptyError","streetEmptyError","cityEmptyError","stateEmptyError","invalidZipError","street2","wrongLocation","collectDataAndSend","geoLocation","sendReport","UtillityType","selectedUtillityType","OutageLocation","ContractAccount","Description","image","serviceAddress","getAddress","geocode","results","GeocoderStatus","OK","googleLocation","geometry","isLocationServiceTurnOff","getEmptyData","plugins","locationAccuracy","canRequest","locations","accountAddress","IsDefault","reader","FileReader","onload","loadEvent","target","readAsDataURL","setCurrentLocation","notCached","getMap","rejected","locationChanged","clearErrors","report","fileUpload","attributes","changeEvent","files","contractAccount","AddressLine2","clearExcept","getReportData","googleMap","geolocation","getCurrentPosition","latLng","coords","latitude","longitude","maximumAge","enableHighAccuracy","lastStatus","handleNewLocationServiceStatus","elementId","onRequestSuccess","onRequestFailure","ERROR_USER_DISAGREED","diagnostic","switchToLocationSettings","REQUEST_PRIORITY_HIGH_ACCURACY","setLocation","getScrollContainer","scrollInProcess","listFinished","getOutagesInternal","outagesKendoGrid","setupGridOptions","filterable","resizeGrid","edit","loadOutageReport","OutageReport","Locations","outageReport","DisplayedOutageLocation","UtillityTypes","setImage","isServiceAddressSelected","updateReport","editMode","loadOutageSafety","isDisputeEnabled","isEditMeterReadingEnabled","noMeterReadings","EnablePaymentDispute","hideColumn","disputeCollection","RefreshScrollingList","sendDispute","disputeMeterRead","readingValue","registerValue","postMeterReading","registerNumber","meterReadValue","formSubmitted","isGetMetersError","EnableAddDeleteMeterRead","submitReading","uploadUrl","imageFormData","withCredentials","Content-Type","identity","deleteMeterRead","meterRead","RegisterNum","meterReadDate","DateString","meterReadingInfoBusy","meterReadingInfoForScrolling","meterReadingInfoEndReached","getMeterReadingInfoForScrolling","acceptMeterReadingInfoForScrolling","createImageDataForUpload","FormData","nameForFile","uploadImageFile","readsGridResizeFunc","readsKendoGrid","newValue","dispute","filteredArray","entry","autoBind","showSlideBackAnimation","showNotifications","getFeeInfo","dataoRequest","feeInformation","FeeInfoTextAchAndCard","agreed","getCurrentContractAccount","findWhere","updateAgreed","payByCard","payByCheck","getAmount","amountType","currentAccountData","otherAmountSumm","setCurrentSavedCardAttributes","currentSavedCard","card","HolderName","ExpMonth","ExpYear","setupDashboardInfo","UserInfo","totalSumToPay","updateConvenienceFee","setUpCancelButton","savedCards","useSavedCard","savedCardsVisible","saveThisCard","isPayingContinuing","enableSaveBankAccounts","enableSaveCreditCards","paymentResultData","isResultShowing","showSchedulePayment","EnablePaymentScheduling","EnableSaveBankAccounts","EnableSaveCards","requestSchedulePayment","paymentType","paymentDate","scheduleDate","checkValid","pay_form","availablePaymentTypes","convenienceFee","savedCardChanged","useSavedCardChanged","cardInfo","IsPrimary","foundPrimary","LastPart","setSavedCards","tomorrow","allSummSelected","otherSummSelected","okAfterSuccessfulPayment","dateRegex","handlePaymentSuccess","acceptBillsData","onCardIOComplete","onCardIOCancel","makePaymentApi","scheduleButtonClicked","otherAmountError","otherAmountEmptyError","payDataRequest","Card","cardExpiry","expiryYear","expiryMonth","formExpiryDate","ContractAccountNumber","CardNumber","CardholderName","ExpirationDate","SaveThisCard","paymentResultMessage","acceptPaymentResultData","formatOtherAmount","scanCreditCard","CardIO","scan","requireExpiry","scanExpiry","requirePostalCode","requireCVV","restrictPostalCodeToNumericOnly","hideCardIOLogo","suppressScan","keepApplicationTheme","PayByCheckService","setCurrentSavedBankAccountAttributes","currentSavedAccount","bankAccount","RoutingNumber","reenterCheckingAccountNumber","NameOnAccount","payAmount","savedAccountsVisible","useSavedBankAccount","savedAccounts","saveThisBankAccount","useSavedAccountClicked","useSavedAccountChanged","bankAccountInfo","savedAccountChanged","updateAmounts","accountInfo","BankAccountNumber","setSavedAccounts","datepicker","autoclose","startDate","minServiceAppointmentDate","todayHighlight","payForm","amountError","confirmCheckingAccount","pay","bankAccountId","AmountToPay","BankRoutingNumber","CheckingAccountNumber","paymentConfirmation","repeatAccount","PaymentOptions","addBa","addCard","toCard","toBankAccount","isOverdue","year","nowDate","nowMonth","nowYear","BankAccount","AccountType","baDialog","bankAccountNumber","accountType","number","expYear","expMonth","holderName","isPrimary","enrolled","addCardDialog","expirationDate","cardHolderName","showUnexpectedError","deleteBankAccount","enableDirectDebit","baId","EnableSavedBankAccountsInDirectDebitGrid","initBa","goDirectDebitFaq","togglePrimaryBankAccount","showDeleteConfirmation","makeEnrolled","makePrimary","enrollMessage","WasEnrolled","wasEnrolled","enroll","deleteCard","cardId","EnableSavedCreditCardsInDirectDebitGrid","initCard","togglePrimaryCard","unenrollMessage","optionId","wasUnenrolled","unenroll","intervalId","getContactPhones","contactsInfo","phoneLoaded","failedAttempt","makeChecking","clearInterval","shortGroupName","shortName","getProviderNamesFor","initProviders","setInterval","check","hasContacts","providerChanged","aboutUsHtml","getDonations","donationsKendoGrid","years","yearChanged","emailReport","infoHtmlCode","enrollStep","billingData","viewBillingHistory","saveLanguage","selectLanguage","currentBill","getCurrentBill","cache","securityToken","currentProperty","getCurrentProperty","setCurrentProperty","messagesQueue","messageTypes","addMessageToQueue","typeMessage","showModalCallback","messageType","processQueue","without","isMessagesQueueContains","Service","isBackdropStatic","_isBackdropStatic","withStaticBackdrop","yesCallback","needHideCloseButton","that","_showYesNoMessageTask","_getYesNoTemplateUrl","needToHide","action","closedCallback","_showOkMessageTask","_getSimpleOkTemplateUrl","_showErrorTask","_showMessage","showAjaxError","_showServerErrorTask","_showUnexpectedErrorTask","_showInfoTask","_getTemplateUrl","loginCallback","registerCallback","_showLoginRequired","_getLoginRequiredTemplateUrl","hasCommonData","webServiceUrl","isNewRequest","fullMenu","Avatar","isVisible","SignOut","AccountList","Dashboard","BillsAndPayments","Usage","MeterData","ChangePassword","Profile","CancelService","MoveService","OutageCenter","EnergyEfficiency","Faqs","AboutUs","Notifications","ProgramEnrolments","Search","SearchHistory","AgentProfile","MyPropertyGroups","MyProperties","PropertyManagerProfile","Authorizations","SharedAccounts","isMenuItemVisible","menuItem","currentMenu","setFull","tab","firstAndLastNameOrCompanyName","changeAccount","userEmail","self","notCancelled","FirstAndLastNameOrCompanyName","userNameId","saveAsPrimaryAccount","signOut","resetSmsSubscribeNotification","notifyObservers","observerCallbacks","_settingsKey","tempVisibility","defaultNotificationBoxSettings","SmsSubscribeNotification","isVisibleByServer","isVisibleByUser","saveSettings","settings","registerObserverCallback","isSmsSubscribeNotificationVisible","hideSmsSubscribeNotification","flag","isTemporarilyHidden","billTab","Exists","billUrl","BillPdfUrl","resolveLocalFileSystemURL","file","externalCacheDirectory","dirEntry","targetFilePath","toURL","FileTransfer","webintent","startActivity","ACTION_VIEW","errorCodeDesc","http_status","source","requestFileSystem","LocalFileSystem","TEMPORARY","fileSystem","root","isCached","cachedData","providerShortName","accounts","hasAccounts","forceRequest","abortTimeout","timestamp","remainingRequests","_isReminderShown","versionCheckResult","backButtonClick","_title","_isDefaultTitle","_rightButtonText","_rightButtonClick","_isRightButtonVisible","_isRightButtonAlwaysVisible","_areNotificationsVisible","_isMenuToggleButtonVisible","_notificationsClick","showInsect","logoClick","_unreadNotificationCount","setTitle","getDefaultTitle","rightButtonText","rightButtonClick","isRightButtonAlwaysVisible","_rightButtonClass","createCurrentDate","currentDate","currentUtcDate","getTimezoneOffset","getCurrentDate","currentServerDate","TimeZoneShift","getDateString","resultPromise","getTimeZoneDateAndCurrentDate","timeZoneDate","DateTimeFormat","redirectToUserNotifications","_currentOutage","_selectedOutages","_callBack","callBack","setCurrent","displayImage","setCurrentById","preffix","outageImage","adjustImageSize","hasClass","nextOutage","allInfoShown","previousOutage","imageElement","bottom","panelCollapse","collapse","adjustOutageDetailsSize","expand","outageDetails","outageDetailsHeight","animate","slideToggle","parents","expanedPanels","me","attachImage","expandedExist","details","tourOptions","tour","tourDone","tourId","onscroll","scrollMenu","rect","getCurrTarget","viewPortHeight","documentElement","menuElement","tourJson","hopscotch","registerHelper","currentStep","getCurrStepNum","steps","endTour","refreshBubblePosition","getCurrTour","unregisterHelper","startTourInternal","sessionStorage","stepInt","showSkip","notificationLog","isBusy","endReached","notificationsLoadedCount","notificationsForScrolling","getNotifications","notifications","acceptNotifications","setViewed","notification","IsViewed","notificationsKendoGrid","notificationsUrl","extra","operators","string","contains","startswith","eq","neq","ui","kendoDateTimePicker","timeFormat","kendoDropDownList","dataTextField","dataValueField","optionLabel","GoToAccountDashboard","IsAccountDisconnected","redirectIfSingle","isBalanceLoaded","enablePropertyManagerLink","isSsoLinkVisible","menuTemplate","leftMenu","isMenuLoaded","args","checkAccess","mapping","PayNow","Preferences","ReportOutage","OutageMap","OutageList","getStateRef","EnableCancelService","EnableMoveService","EnableMeterDataPage","EnableEnergyEfficiencyPage","EnableProgramEnrolments","hideSubscribeSmsNotification","subscribeSmsNotificationFlag","goToSubscribe","showInLegend"],"mappings":"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"}