');\r\n $('#virtualKeyboardPlace').height(getHeigthKeyboardPlace());\r\n // scroll current element to the top of the page\r\n if (scrollToElement)\r\n scrollToElement.scrollIntoView(true);\r\n // move scroll so that current element will be below the top menu\r\n var topMenuHeight = getTopMenu().height();\r\n $('body').scrollTop($('body').scrollTop() - topMenuHeight);\r\n }, 10);\r\n }\r\n\r\n function resetHeightFix() {\r\n // wrap it in a timeout so that if a user presses a button then button click will fire first\r\n setTimeout(function(){\r\n $('#virtualKeyboardPlace').height(0);\r\n }, 1);\r\n }\r\n\r\n function 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.4.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 },\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: \"calculated below\",\r\n\r\n maxMetersOnStackedDashboard: 15,\r\n wglProviderName: 'Wgl',\r\n hcProviderName: 'Hc',\r\n pxProviderName: 'Px',\r\n\r\n // the below info exists on server and it's not good to duplicate it here,\r\n // but i want welcome page to load fast, so i don't want to pull these data from server\r\n providers: {\r\n \"Neo\": {\r\n \"Name\": \"NEO Natural Gas\",\r\n \"SiteName\": \"Northeast Ohio Natural Gas\",\r\n \"HelpEmail\": \"billpay@neogas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableOutageMap\": 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 \"Px\": {\r\n \"Name\": \"Property Experience\",\r\n \"SiteName\": \"Utilli PX\",\r\n \"HelpEmail\": \"px@utilli.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": false,\r\n \"EnableLanguagePack\": true,\r\n \"EnablePropertyManagerLink\": DeploymentSettings.deploymentEnvironment !== \"Prod\",\r\n \"SupportPhoneNumber\": \"123-123-1234\",\r\n \"providersGroupShortName\": \"px\"\r\n },\r\n \"Bangor\": {\r\n \"Name\": \"Bangor Natural Gas\",\r\n \"SiteName\": \"Bangor Natural Gas\",\r\n \"HelpEmail\": \"billpay@bangorgas.com\",\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"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\": true,\r\n \"providersGroupShortName\": \"hc\"\r\n },\r\n \"DemoProvider\": {\r\n \"Name\": \"Utilli Demo\",\r\n \"SiteName\": \"Utilli Demo\",\r\n \"HelpEmail\": \"info@utilli.com\",\r\n \"EnableOutageMap\": true,\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableLanguagePack\": true,\r\n },\r\n \"SapDemoProvider\": {\r\n \"Name\": \"Utilli SAP Demo\",\r\n \"SiteName\": \"Utilli SAP Demo\",\r\n \"HelpEmail\": \"info@utilli.com\",\r\n \"EnableOutageMap\": true,\r\n \"EnablePhoneNumbersOnLoginPage\": true,\r\n \"EnableLanguagePack\": true,\r\n }\r\n },\r\n appUrls: {\r\n android: \"https://play.google.com/store/apps/details?id=com.utilli.UtilliMobile\",\r\n iOs: \"https://itunes.apple.com/us/app/howard-county-utilli/id905053011\",\r\n winPhone: \"https://www.microsoft.com/en-us/store/apps/utilli-mobile/9nblggh5k7fw\"\r\n }\r\n \r\n };\r\n\r\n Config.wglProvidersGroupShortName = Config.providers[Config.wglProviderName].providersGroupShortName;\r\n Config.hcProvidersGroupShortName = Config.providers[Config.hcProviderName].providersGroupShortName;\r\n Config.pxProvidersGroupShortName = Config.providers[Config.pxProviderName].providersGroupShortName;\r\n}\r\n\nwindow.Config.states = [\r\n{ name: 'ALABAMA', abbreviation: 'AL' },\r\n{ name: 'ALASKA', abbreviation: 'AK' },\r\n{ name: 'AMERICAN SAMOA', abbreviation: 'AS' },\r\n{ name: 'ARIZONA', abbreviation: 'AZ' },\r\n{ name: 'ARKANSAS', abbreviation: 'AR' },\r\n{ name: 'CALIFORNIA', abbreviation: 'CA' },\r\n{ name: 'COLORADO', abbreviation: 'CO' },\r\n{ name: 'CONNECTICUT', abbreviation: 'CT' },\r\n{ name: 'DELAWARE', abbreviation: 'DE' },\r\n{ name: 'DISTRICT OF COLUMBIA', abbreviation: 'DC' },\r\n{ name: 'FEDERATED STATES OF MICRONESIA', abbreviation: 'FM' },\r\n{ name: 'FLORIDA', abbreviation: 'FL' },\r\n{ name: 'GEORGIA', abbreviation: 'GA' },\r\n{ name: 'GUAM', abbreviation: 'GU' },\r\n{ name: 'HAWAII', abbreviation: 'HI' },\r\n{ name: 'IDAHO', abbreviation: 'ID' },\r\n{ name: 'ILLINOIS', abbreviation: 'IL' },\r\n{ name: 'INDIANA', abbreviation: 'IN' },\r\n{ name: 'IOWA', abbreviation: 'IA' },\r\n{ name: 'KANSAS', abbreviation: 'KS' },\r\n{ name: 'KENTUCKY', abbreviation: 'KY' },\r\n{ name: 'LOUISIANA', abbreviation: 'LA' },\r\n{ name: 'MAINE', abbreviation: 'ME' },\r\n{ name: 'MARSHALL ISLANDS', abbreviation: 'MH' },\r\n{ name: 'MARYLAND', abbreviation: 'MD' },\r\n{ name: 'MASSACHUSETTS', abbreviation: 'MA' },\r\n{ name: 'MICHIGAN', abbreviation: 'MI' },\r\n{ name: 'MINNESOTA', abbreviation: 'MN' },\r\n{ name: 'MISSISSIPPI', abbreviation: 'MS' },\r\n{ name: 'MISSOURI', abbreviation: 'MO' },\r\n{ name: 'MONTANA', abbreviation: 'MT' },\r\n{ name: 'NEBRASKA', abbreviation: 'NE' },\r\n{ name: 'NEVADA', abbreviation: 'NV' },\r\n{ name: 'NEW HAMPSHIRE', abbreviation: 'NH' },\r\n{ name: 'NEW JERSEY', abbreviation: 'NJ' },\r\n{ name: 'NEW MEXICO', abbreviation: 'NM' },\r\n{ name: 'NEW YORK', abbreviation: 'NY' },\r\n{ name: 'NORTH CAROLINA', abbreviation: 'NC' },\r\n{ name: 'NORTH DAKOTA', abbreviation: 'ND' },\r\n{ name: 'NORTHERN MARIANA ISLANDS', abbreviation: 'MP' },\r\n{ name: 'OHIO', abbreviation: 'OH' },\r\n{ name: 'OKLAHOMA', abbreviation: 'OK' },\r\n{ name: 'OREGON', abbreviation: 'OR' },\r\n{ name: 'PALAU', abbreviation: 'PW' },\r\n{ name: 'PENNSYLVANIA', abbreviation: 'PA' },\r\n{ name: 'PUERTO RICO', abbreviation: 'PR' },\r\n{ name: 'RHODE ISLAND', abbreviation: 'RI' },\r\n{ name: 'SOUTH CAROLINA', abbreviation: 'SC' },\r\n{ name: 'SOUTH DAKOTA', abbreviation: 'SD' },\r\n{ name: 'TENNESSEE', abbreviation: 'TN' },\r\n{ name: 'TEXAS', abbreviation: 'TX' },\r\n{ name: 'UTAH', abbreviation: 'UT' },\r\n{ name: 'VERMONT', abbreviation: 'VT' },\r\n{ name: 'VIRGIN ISLANDS', abbreviation: 'VI' },\r\n{ name: 'VIRGINIA', abbreviation: 'VA' },\r\n{ name: 'WASHINGTON', abbreviation: 'WA' },\r\n{ name: 'WEST VIRGINIA', abbreviation: 'WV' },\r\n{ name: 'WISCONSIN', abbreviation: 'WI' },\r\n{ name: 'WYOMING', abbreviation: 'WY' }\r\n];\nString.prototype.getTime = function () {\r\n var dateString = this;\r\n var date = dateString.split(\"/\");\r\n // month in JS is index in array of 12 months. Transform the month number to the index.\r\n var month = parseInt(date[0]) - 1;\r\n return (new Date(date[2], month, date[1])).getTime();\r\n};\r\n\r\nString.prototype.getPositiveAmount = function () {\r\n var amountString = this;\r\n var amount = parseFloat(amountString);\r\n if(amount < 0) {\r\n amount = Math.abs(amount);\r\n }\r\n return amount.toString();\r\n};\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.headers['Authorization'] = token;\r\n }\r\n return config;\r\n }\r\n }\r\n })\r\n .factory('httpInterceptor', ['$q', '$injector', 'RequestService', function ($q, $injector, RequestService) {\r\n function saveEmptyParametersOf(request) {\r\n if (request.params && angular.isObject(request.params)) {\r\n var keys = Object.keys(request.params);\r\n angular.forEach(keys, function (item) {\r\n var value = request.params[item];\r\n if (value === null || angular.isUndefined(value)) {\r\n // assign null or undefined properties with empty string - \r\n // in that case empty params are included into the url.\r\n request.params[item] = '';\r\n }\r\n });\r\n }\r\n }\r\n\r\n function notAuthenticatedRequest(url) {\r\n //if url starts with null it means localStorage.getItem('ApiUrl') is null \r\n //that means it is not authenticated user\r\n var result = url.startsWith('null');\r\n return result;\r\n }\r\n\r\n function isZeroStatusResponse(response) {\r\n var result = response.status == 0\r\n && (!response.config.timeout || response.config.timeout.status != 499) //499 - client cancelled request, it is initialized in RequestService.abort().\r\n && !notAuthenticatedRequest(response.config.url);\r\n return result;\r\n }\r\n\r\n function pingProvidersApi(fnCallback) {\r\n $.ajax({\r\n url: DeploymentSettings.providersServiceUrl.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 var reload = function(state, newUrl) {\r\n newUrl = newUrl ? newUrl : '';\r\n // i use window.location here instead of state.go because i want to force BROWSER \r\n // to reload the whole page and get source code updates from our web server.\r\n // note: state.current.url returns not full relative url, for example, for \r\n // the view \"TopMenuLayout.SignUpPropertyManager.Step2\" it returns \"/SignUpPropertyManagerStep2\"\r\n // instead of \"#/SignUpPropertyManager/SignUpPropertyManagerStep2\"\r\n var indexOfIndex = window.location.href.indexOf('index.html');\r\n var newLocation = window.location.href;\r\n if (indexOfIndex > 0) {\r\n newLocation = newLocation.substr(0, indexOfIndex);\r\n }\r\n else {\r\n var relativeUrl = state.href(state.current.name);\r\n var indexOfRelativeUrl = newLocation.indexOf(relativeUrl);\r\n if (indexOfRelativeUrl > 0) {\r\n newLocation = newLocation.substr(0, indexOfRelativeUrl);\r\n }\r\n }\r\n if (utilli.isAdmin) {\r\n var indexOfAdmin = newLocation.indexOf('Admin/');\r\n if (indexOfAdmin > 0) {\r\n newLocation = newLocation.substr(0, indexOfAdmin);\r\n }\r\n }\r\n utilli.setWindowLocation(newLocation + newUrl);\r\n }\r\n\r\n //find web api url that match with current request url\r\n //for example the current request url is https://apidev.utilli.com/hc/api/System/Check\r\n //we get the https://apidev.utilli.com/hc/api/ as result\r\n var getServiceProviderUrl = function (requestUrl) {\r\n var deferred = $q.defer();\r\n\r\n $.ajax({\r\n url: DeploymentSettings.providersServiceUrl + 'Providers/GetAllProviders',\r\n method: 'GET'\r\n })\r\n .done(function (providers) {\r\n if (!providers || providers.length == 0) {\r\n deferred.reject(\"We cannot get providers list from web api providers.\");\r\n return;\r\n }\r\n var providerInfo = _.find(providers, function(provider){ \r\n return requestUrl.indexOf(provider.ApiUrl) !== -1; \r\n });\r\n\r\n deferred.resolve(providerInfo);\r\n })\r\n .fail(function (e) {\r\n deferred.reject(e);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n var responseInterceptor = {\r\n request: function (request) {\r\n if (notAuthenticatedRequest(request.url)) {\r\n RequestService.forcedAbort(request);\r\n utilli.clearLocalStorage();\r\n var stateService = $injector.get('$state');\r\n stateService.goToSignIn(true);\r\n return request;\r\n }\r\n if (request.url.indexOf(\".html\") != -1 && !$injector.get('$templateCache').get(request.url))\r\n request.url += DeploymentSettings.currentVersion;\r\n RequestService.add(request);\r\n saveEmptyParametersOf(request);\r\n return request;\r\n },\r\n response: function (response) {\r\n\r\n // if generation was not changed on the server the value of 'ValidGeneration' header is 'Valid'.\r\n // Otherwise header is 'NotValid'. If header is null then generation was not checked on the server.\r\n var header = response.headers('ValidGeneration');\r\n if (header != null && header !== 'Valid') {\r\n var modalService = $injector.get('ModalServiceExt');\r\n modalService.showMessage(\r\n utilli._t('Notification'), \r\n utilli._t('Your session has expired. You must login again to continue.'), \r\n function () {\r\n var state = $injector.get('$state');\r\n if (isMobileOrRipple()) {\r\n state.goToSignIn();\r\n return response;\r\n }\r\n console.log('Redirect to login page because security token generation is obsolete.');\r\n RequestService.abort();\r\n utilli.clearLocalStorage();\r\n reload(state);\r\n return response;\r\n }\r\n );\r\n }\r\n\r\n return response;\r\n },\r\n responseError: function (response) {\r\n\r\n var stateService = $injector.get('$state');\r\n\r\n // 401 error code is thrown when user is not authorized (token is wrong or expired).\r\n if (response.status == 401) {\r\n var modalService = $injector.get('ModalServiceExt');\r\n modalService.showMessage(utilli._t('Notification'), utilli._t('You are not logged in or your session has expired. Please login to continue.'), function () {\r\n console.log('Redirect to login page because security token is not valid.');\r\n RequestService.abort();\r\n\r\n //Yuriy Sokha: I want this redirect to always work. It is required for Bot Authorization.\r\n 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. Please refresh to continue.\"), \r\n function () {\r\n var state = $injector.get('$state');\r\n if (isMobileOrRipple()) {\r\n localStorage.setItem('forcedUpdateMobile', true);\r\n reload(state, 'UpdateMobile.html');\r\n return response;\r\n }\r\n console.log('Refreshing because page is outdated.');\r\n RequestService.abort();\r\n reload(state);\r\n return response;\r\n }\r\n );\r\n //}, 100);\r\n }\r\n }\r\n\r\n // 503 error code is thrown when maintenance is required.\r\n if (response.status == 503) {\r\n console.log('Redirect to maintenance page.');\r\n RequestService.abort();\r\n stateService.go('Maintenance');\r\n return response;\r\n }\r\n\r\n if(isZeroStatusResponse(response))\r\n {\r\n var usSpinnerService = $injector.get('usSpinnerService');\r\n getServiceProviderUrl(response.config.url)\r\n .then(function(providerInfo) {\r\n if (!providerInfo.IsAvailable) {\r\n console.log('Redirect to maintenance page.');\r\n usSpinnerService.stop('spinner-1');\r\n usSpinnerService.stop('spinner-admin');\r\n RequestService.abort();\r\n stateService.go('Maintenance');\r\n }\r\n }, function (e) {\r\n console.log(e);\r\n pingProvidersApi(function () {\r\n usSpinnerService.stop('spinner-1');\r\n usSpinnerService.stop('spinner-admin');\r\n stateService.go('NoConnection');\r\n });\r\n });\r\n\r\n }\r\n\r\n return $q.reject(response);\r\n }\r\n }\r\n\r\n return responseInterceptor;\r\n }\r\n ])\r\n .config(['$compileProvider', '$stateProvider', '$urlRouterProvider', '$stickyStateProvider', '$httpProvider',\r\n 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 var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n var url = utilli.isAdmin ? '/Customer/:userId/:contractAccountNumber/:propertyManager/' + stateName\r\n : '/' + stateName;\r\n $stateProvider.state(layout + '.' + stateName, {\r\n url: url,\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: pagesPath + 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: pagesPath + 'Pages/' + mainFolder + '/' + stateName + '.html',\r\n controller: stateName + 'Controller'\r\n }\r\n },\r\n params: params\r\n });\r\n }\r\n\r\n var registerStateWithCommonHeader = function (stateName, params, parentFolder) {\r\n var layout = utilli.isAdmin ? 'AdminMainLayout.Customer.CustomerLayout' : 'MainLayout';\r\n registerForLayoutStateWithCommonHeader(stateName, params, layout, parentFolder);\r\n };\r\n\r\n var registerForTopMenuLayout = function (stateName, params) {\r\n registerForLayoutStateWithCommonHeader(stateName, params, 'TopMenuLayout');\r\n };\r\n\r\n var registerForgotPasswordRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotPassword', {\r\n url: '/ForgotPassword',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotPassword/ForgotPasswordHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotPassword/ForgotPassword.html',\r\n controller: 'ForgotPasswordController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPassword.Step1', {\r\n url: '/ForgotPasswordStep1',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPassword/Step1.html',\r\n controller: 'ForgotPasswordStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPassword.Step2', {\r\n url: '/ForgotPasswordStep2',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPassword/Step2.html',\r\n controller: 'ForgotPasswordStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPassword.Success', {\r\n url: '/ForgotPasswordSuccess',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPassword/Success.html'\r\n }\r\n }\r\n });\r\n }\r\n\r\n var registerForgotPasswordByEmailRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotPasswordByEmail', {\r\n url: '/ForgotPasswordByEmail',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/ForgotPasswordByEmailHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/ForgotPasswordByEmail.html',\r\n controller: 'ForgotPasswordByEmailController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPasswordByEmail.Step1', {\r\n url: '/ForgotPasswordByEmailStep1/?from',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/Step1.html',\r\n controller: 'ForgotPasswordByEmailStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotPasswordByEmail.Success', {\r\n url: '/ForgotPasswordByEmailSuccess',\r\n views: {\r\n \"ForgotPasswordSteps\": {\r\n templateUrl: 'Pages/ForgotPasswordByEmail/Success.html',\r\n controller: 'ForgotPasswordByEmailSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n var registerForgotUserIdRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotUserId', {\r\n url: '/ForgotUserId',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotUserId/ForgotUserIdHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotUserId/ForgotUserId.html',\r\n controller: 'ForgotUserIdController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserId.Step1', {\r\n url: '/ForgotUserIdStep1',\r\n views: {\r\n \"ForgotUserIdSteps\": {\r\n templateUrl: 'Pages/ForgotUserId/Step1.html',\r\n controller: 'ForgotUserIdStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserId.Step2', {\r\n url: '/ForgotUserIdStep2',\r\n views: {\r\n \"ForgotUserIdSteps\": {\r\n templateUrl: 'Pages/ForgotUserId/Step2.html',\r\n controller: 'ForgotUserIdStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserId.Success', {\r\n url: '/ForgotUserIdSuccess',\r\n views: {\r\n \"ForgotUserIdSteps\": {\r\n templateUrl: 'Pages/ForgotUserId/Success.html',\r\n controller: 'ForgotUserIdSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n var registerForgotUserIdByEmailRoutes = function () {\r\n $stateProvider.state('TopMenuLayout.ForgotUserIdByEmail', {\r\n url: '/ForgotUserIdByEmail',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/ForgotUserIdByEmailHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/ForgotUserIdByEmail.html',\r\n controller: 'ForgotUserIdByEmailController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserIdByEmail.Step1', {\r\n url: '/Step1/?from',\r\n views: {\r\n \"ForgotUserIdByEmailSteps\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/Step1.html',\r\n controller: 'ForgotUserIdByEmailStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.ForgotUserIdByEmail.Success', {\r\n url: '/Success',\r\n views: {\r\n \"ForgotUserIdByEmailSteps\": {\r\n templateUrl: 'Pages/ForgotUserIdByEmail/Success.html',\r\n controller: 'ForgotUserIdByEmailSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (!utilli.isAdmin) {\r\n $stateProvider.state('TopMenuLayout', {\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/TopMenuLayout.html'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Languages', {\r\n url: '/WelcomeLanguages',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Languages/Languages.html',\r\n controller: 'LanguagesController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('MainLayout', {\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/MainLayout.html',\r\n controller: 'MainLayoutController'\r\n }\r\n }\r\n });\r\n }\r\n registerStateWithCommonHeader('Dashboard');\r\n registerStateWithCommonHeader('PayNow', ['AccountNumber']);//we use this url in TaksRunner\r\n registerStateWithCommonHeader('InstallmentPlan');\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', 'donationParam']);\r\n registerStateWithCommonHeader('EnrollCardMessage', ['Id']);\r\n registerStateWithCommonHeader('EnrollBankAccountMessage', ['Id']);\r\n registerStateWithCommonHeader('UnenrollCardMessage', ['Id']);\r\n registerStateWithCommonHeader('UnenrollBankAccountMessage', ['Id']);\r\n registerStateWithCommonHeader('Profile');\r\n registerStateWithCommonHeader('MobilePhoneConfirmation', ['forProgramEnrollments', 'forProgramEnrollmentsLearnMore', 'phoneNumber']);\r\n registerStateWithCommonHeader('Avatars', ['forAgent', 'forAssistant', 'forPropertyManager']);\r\n registerStateWithCommonHeader('OutageCenter');\r\n registerStateWithCommonHeader('OutageMap');\r\n registerStateWithCommonHeader('TurnOffMap');\r\n registerStateWithCommonHeader('OutageList');\r\n registerStateWithCommonHeader('OutageSafety');\r\n registerStateWithCommonHeader('OutageHistory');\r\n registerStateWithCommonHeader('ReportOutage');\r\n registerStateWithCommonHeader('OpenOutageReport', ['Id', 'mode']);\r\n registerStateWithCommonHeader('MeterData');\r\n registerForTopMenuLayout('TermsAndConditions');//we use this url in TaksRunner\r\n registerForTopMenuLayout('SystemInfo');\r\n registerStateWithCommonHeader('AboutUs');\r\n registerStateWithCommonHeader('EnergyEfficiency');\r\n registerStateWithCommonHeader('Languages');\r\n\r\n registerStateWithCommonHeader('WorkCenters', ['redirectIfSingle']);\r\n registerStateWithCommonHeader('LookUp');\r\n registerStateWithCommonHeader('LookUpLog');\r\n registerStateWithCommonHeader('PaymentHistory');\r\n registerStateWithCommonHeader('WorkOrders');\r\n //registerStateWithCommonHeader('WorkOrder', ['contractAccountNumber', 'orderNumber']);\r\n\r\n $stateProvider.state('MainLayout.TurnOffQuickPay', {\r\n // parent: 'MainLayout',\r\n url: '/QuickPay',\r\n views:\r\n {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/QuickPay/Step2.html',\r\n controller: 'QuickPayStep2Controller'\r\n }\r\n }\r\n });\r\n\r\n //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('Billing', 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 utilli.isPropertyManagerApp()\r\n ? '/WelcomeMain/?from' \r\n : '/?from';\r\n }\r\n\r\n function registerWelcomeRoutes() {\r\n $stateProvider.state('TopMenuLayout.WelcomeAlexa', {\r\n url: '/WelcomeAlexa',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/WelcomeAlexa/WelcomeAlexa.html',\r\n controller: 'WelcomeAlexaController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.Welcome', {\r\n url: getMainRootRoute(),\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Welcome/Welcome.html',\r\n controller: 'WelcomeController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.Welcome.SignIn.Providers', {\r\n url: '/Providers',\r\n\t\t\t\t// for not mobile sign in we also need login,passwd to use it on common portals (like portalqa.utilli.com)\r\n params: { signInParams: { from: null, login: null, passwd: null } },\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerSignUpPropertyManagersRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager', {\r\n url: '/SignUpPropertyManager',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/SignUpHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/SignUp.html',\r\n controller: 'SignUpPropertyManagerController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Step1', {\r\n url: '/SignUpPropertyManagerStep1/:email',\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Step1.html',\r\n controller: 'SignUpPropertyManagerStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Step2', {\r\n url: '/SignUpPropertyManagerStep2',\r\n params: { email: null },\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Step2.html',\r\n controller: 'SignUpPropertyManagerStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Step3', {\r\n url: '/SignUpPropertyManagerStep3',\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Step3.html',\r\n controller: 'SignUpPropertyManagerStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpPropertyManager.Success', {\r\n url: '/SignUpPropertyManagerSuccess',\r\n views: {\r\n \"SignUpPropertyManagerSteps\": {\r\n templateUrl: 'Pages/PropertyManagers/SignUp/Success.html',\r\n controller: 'SignUpPropertyManagerSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getPropertyManagerRootRoute () {\r\n return utilli.isPropertyManagerApp() \r\n ? '/?from' \r\n : '/WelcomePropertyManager/?from';\r\n }\r\n\r\n function registerWelcomePropertyManagersRoutes() {\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager', {\r\n url: getPropertyManagerRootRoute(),// we use this url in email sending service\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/PropertyManagers/Welcome/Welcome.html',\r\n controller: 'WelcomePropertyManagerController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n }\r\n );\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomePropertyManager.SignIn.Providers', {\r\n url: '/Providers?from',\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerAgentsRoutes() {\r\n registerWelcomeAgentsRoutes();\r\n registerSignUpAgentsRoutes();\r\n registerStateWithCommonHeader('Search', null, 'Agents');\r\n registerStateWithCommonHeader('AgentProfile', null, 'Agents');\r\n registerStateWithCommonHeader('SearchHistory', null, 'Agents');\r\n registerStateWithCommonHeader('SettlementProperty', ['AccountNumber', 'Address'], 'Agents');\r\n }\r\n\r\n function registerSignUpAgentsRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignUpAgent', {\r\n url: '/SignUpAgent',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/Agents/SignUp/SignUpHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Agents/SignUp/SignUp.html',\r\n controller: 'SignUpAgentController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Step1', {\r\n url: '/SignUpAgentStep1',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Step1.html',\r\n controller: 'SignUpAgentStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Step2', {\r\n url: '/SignUpAgentStep2',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Step2.html',\r\n controller: 'SignUpAgentStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Step3', {\r\n url: '/SignUpAgentStep3',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Step3.html',\r\n controller: 'SignUpAgentStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAgent.Success', {\r\n url: '/SignUpAgentSuccess',\r\n views: {\r\n \"SignUpAgentSteps\": {\r\n templateUrl: 'Pages/Agents/SignUp/Success.html',\r\n controller: 'SignUpAgentSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerWelcomeAgentsRoutes() {\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent', {\r\n url: '/WelcomeAgent',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Agents/Welcome/Welcome.html',\r\n controller: 'WelcomeAgentController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAgent.SignIn.Providers', {\r\n url: '/Providers?from',\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n registerAgentsRoutes();\r\n\r\n\r\n function registerAssistantsRoutes() {\r\n registerWelcomeAssistantsRoutes();\r\n registerSignUpAssistantsRoutes();\r\n registerStateWithCommonHeader('AssistantSearch', null, 'Assistants');\r\n registerStateWithCommonHeader('AssistantProfile', null, 'Assistants');\r\n registerStateWithCommonHeader('Delinquents', null, 'Assistants');\r\n registerStateWithCommonHeader('AssistantSearchHistory', null, 'Assistants');\r\n }\r\n\r\n function registerSignUpAssistantsRoutes() {\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant', {\r\n url: '/SignUpAssistant',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/Assistants/SignUp/SignUpHeader.html'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Assistants/SignUp/SignUp.html',\r\n controller: 'SignUpAssistantController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Step1', {\r\n url: '/SignUpAssistantStep1',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Step1.html',\r\n controller: 'SignUpAssistantStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Step2', {\r\n url: '/SignUpAssistantStep2',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Step2.html',\r\n controller: 'SignUpAssistantStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Step3', {\r\n url: '/SignUpAssistantStep3',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Step3.html',\r\n controller: 'SignUpAssistantStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUpAssistant.Success', {\r\n url: '/SignUpAssistantSuccess',\r\n views: {\r\n \"SignUpAssistantSteps\": {\r\n templateUrl: 'Pages/Assistants/SignUp/Success.html',\r\n controller: 'SignUpAssistantSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function registerWelcomeAssistantsRoutes() {\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant', {\r\n url: '/WelcomeAssistant',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/Assistants/Welcome/Welcome.html',\r\n controller: 'WelcomeAssistantController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant.SignIn', {\r\n sticky: true,\r\n dsr: true,\r\n views: {\r\n \"SignIn\": {\r\n templateUrl: 'Pages/SignIn/SignInPart.html',\r\n controller: 'SignInPartController'\r\n },\r\n \"footer\": {\r\n templateUrl: 'Pages/WelcomeFooter/WelcomeFooter.html',\r\n controller: 'WelcomeFooterController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant.SignIn.Credentials', {\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Credentials.html',\r\n controller: 'CredentialsController'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.WelcomeAssistant.SignIn.Providers', {\r\n url: '/Providers?from',\r\n views: {\r\n \"SignInSteps\": {\r\n templateUrl: 'Pages/SignIn/Providers.html',\r\n controller: 'ProvidersController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n registerAssistantsRoutes();\r\n\r\n function registerWelcomeMobileRoutes() {\r\n $stateProvider.state('WelcomeMobile', {\r\n url: '/',\r\n views: {\r\n \"body-view\": {\r\n templateUrl: 'Pages/WelcomeMobile/WelcomeMobile.html',\r\n controller: 'WelcomeMobileController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n $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', //we use this url in EmailService templates\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Step1.html',\r\n controller: 'SignUpStep1Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUp.Step2', {\r\n url: '/SignUpStep2',\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Step2.html',\r\n controller: 'SignUpStep2Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUp.Step3', {\r\n url: '/SignUpStep3',\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Step3.html',\r\n controller: 'SignUpStep3Controller'\r\n }\r\n }\r\n });\r\n $stateProvider.state('TopMenuLayout.SignUp.Success', {\r\n url: '/SignUpSuccess',\r\n views: {\r\n \"SignUpSteps\": {\r\n templateUrl: 'Pages/SignUp/Success.html',\r\n controller: 'SignUpSuccessController'\r\n }\r\n }\r\n });\r\n }\r\n\r\n //registerForTopMenuLayout('Maintenance');\r\n\r\n $stateProvider.state('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 controller: 'QuickPayHeaderController'\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?accountNumber',\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.TurnOffMap', {\r\n url: '/TurnOffMap',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/FieldServiceEngineer/TurnOffMap/TurnOffMap.html',\r\n controller: 'TurnOffMapController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OutageList', {\r\n url: '/OutageListSignedOut?anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OutageList/OutageList.html',\r\n controller: 'OutageListController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OpenOutageReport', {\r\n url: '/OpenOutageSignedOut?Id&mode&anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OpenOutageReport/OpenOutageReport.html',\r\n controller: 'OpenOutageReportController'\r\n }\r\n }\r\n });\r\n\r\n $stateProvider.state('TopMenuLayout.OutageSafety', {\r\n url: '/OutageSafetySignedOut?anonymous',\r\n views: {\r\n \"top-menu\": {\r\n templateUrl: 'Pages/CommonHeader/CommonHeader.html',\r\n controller: 'CommonHeaderController'\r\n },\r\n \"main-content\": {\r\n templateUrl: 'Pages/OutageSafety/OutageSafety.html',\r\n controller: 'OutageSafetyController'\r\n }\r\n }\r\n });\r\n }])\r\n .config(['$provide', function ($provide) {\r\n // add fixedFinally to all $q promises https://stackoverflow.com/a/17889426/292787\r\n $provide.decorator('$q', [\"$delegate\", function ($delegate) {\r\n var promisePatcher = function (promise){\r\n promise.fixedFinally = function (fn) {\r\n return promise['finally'](fn);\r\n };\r\n // then also should return fixed object\r\n var originalThen = promise.then;\r\n promise.then = function () {\r\n var self = this;\r\n var originalThenResult = originalThen.apply(self, arguments);\r\n originalThenResult.fixedFinally = function (fn) {\r\n return originalThenResult['finally'](fn);\r\n };\r\n return originalThenResult;\r\n };\r\n }\r\n\r\n var originalDefer = $delegate.defer;\r\n $delegate.defer = function () {\r\n var deferred = originalDefer();\r\n promisePatcher(deferred.promise);\r\n return deferred;\r\n };\r\n // apply the patch also to $q.resolve()\r\n var originalResolve = $delegate.resolve;\r\n $delegate.resolve = function(){\r\n var self = this;\r\n var resolvedPromise = originalResolve.apply(self, arguments);\r\n promisePatcher(resolvedPromise);\r\n return resolvedPromise;\r\n }\r\n return $delegate;\r\n }]);\r\n \r\n $provide.decorator('$http', [\"$delegate\", function ($delegate) {\r\n var $http = $delegate;\r\n\r\n // status === 0 - means that request was cancelled.\r\n // requests cancelling happens when we move from one page to another.\r\n // if a request was cancelled then we skip error handling to avoid modal \r\n // pop-ups with messages after user already moved to another page.\r\n var skippingErrorStatusCodeHandling = 0;\r\n\r\n // \"finally\" may not work in old android browsers, because \"finally\" was a reserved keyword in javascript.\r\n // here i add wrapper method 'fixedFinally' to be used instead of 'finally'\r\n function fixFinally(promise){\r\n if (!promise || !promise['then']) // if it's not a promise then just return whatever it is\r\n return promise;\r\n promise.fixedFinally = function (fn) {\r\n return promise['finally'](fn);\r\n };\r\n return promise;\r\n }\r\n\r\n /** adds method apiThen in addition to regular then */\r\n function addApiThen(ajaxPromise){\r\n /** same as regular 'then' but with built-in error handling */\r\n ajaxPromise['apiThen'] = function(regularArguments, errorHandler){\r\n if (typeof regularArguments !== 'Array'){\r\n regularArguments = [regularArguments];\r\n }\r\n // errorHandler can be either ModalServiceExt or $scope.errors\r\n var scopeErrors = errorHandler.showAjaxError ? null : errorHandler;\r\n var ModalServiceExt = errorHandler.showAjaxError ? errorHandler : null;\r\n return ajaxPromise.then(function(response){\r\n // if $scope.errors is passed then check ApiResponse for errors and return Data\r\n if (scopeErrors)\r\n scopeErrors.length = 0;\r\n if (!response.data.Errors || !response.data.Errors.length)\r\n return regularArguments[0](response.data.Data);\r\n if (scopeErrors){\r\n _.forEach(response.data.Errors, function(item){\r\n scopeErrors.push(item);\r\n });\r\n }\r\n else{\r\n ModalServiceExt.showError(response.data.Errors[0]);\r\n }\r\n }, function(error) {\r\n if (ModalServiceExt){\r\n ModalServiceExt.showAjaxError(error);\r\n }\r\n else{\r\n console.error(error);\r\n scopeErrors.push(utilli.errors.serverErrorMessage);\r\n }\r\n if (regularArguments.length > 1)\r\n regularArguments[1](error);\r\n });\r\n };\r\n }\r\n \r\n // ajaxPromise - a promise returned by $http or a shortcut like $http.get, $http.post etc\r\n var fixHttpPromise = function (ajaxPromise) {\r\n // fix the deprecated method 'error'\r\n var originalErrorMethod = ajaxPromise['error'];\r\n ajaxPromise['error'] = function utilliErrorWrapper() {\r\n if (arguments.length === 0)\r\n return originalErrorMethod.apply(ajaxPromise, arguments);\r\n var originalErrorHandler = arguments[0];\r\n var errorHandlerWrapper = function () {\r\n if (arguments.length > 1 && arguments[1] === skippingErrorStatusCodeHandling)\r\n return null;\r\n return originalErrorHandler.apply(originalErrorHandler, arguments);\r\n };\r\n return originalErrorMethod.apply(ajaxPromise, [errorHandlerWrapper]);\r\n }\r\n // fix the method 'then' of the ajax promise\r\n var originalThenMethod = ajaxPromise['then'];\r\n ajaxPromise['then'] = function utilliThenWrapper() {\r\n // if error handler method is not specified in 'then'.\r\n if (arguments.length === 1){\r\n return fixFinally(originalThenMethod.apply(ajaxPromise, arguments));\r\n }\r\n // if both success and error handlers are specified\r\n var thenSuccessHandler = arguments[0];\r\n var originalThenErrorHandler = arguments[1];\r\n var thenErrorHandlerWrapper = function () {\r\n if (arguments.length == 1 && arguments[0].status === skippingErrorStatusCodeHandling)\r\n return null;\r\n return fixFinally(originalThenErrorHandler.apply(originalThenErrorHandler, arguments));\r\n };\r\n return fixFinally(originalThenMethod.apply(ajaxPromise, [thenSuccessHandler, thenErrorHandlerWrapper]));\r\n };\r\n addApiThen(ajaxPromise);\r\n return ajaxPromise;\r\n }\r\n\r\n // apply the fix to the function $http itself to handle such calls like $http({url: url, method: \"GET\"})...\r\n var wrapper = function () {\r\n var promise = $http.apply($http, arguments);\r\n return fixHttpPromise(promise);\r\n };\r\n\r\n // apply the fix to all shortcuts: $http.get, $http.head, $http.post, $http.put, $http.delete, $http.jsonp, $http.patch\r\n Object.keys($http).filter(function (key) {\r\n return (typeof $http[key] === 'function');\r\n }).forEach(function (key) {\r\n wrapper[key] = function () {\r\n var promise = $http[key].apply($http, arguments);\r\n return fixHttpPromise(promise);\r\n };\r\n });\r\n return wrapper;\r\n }]);\r\n }])\r\n .config([\r\n '$httpProvider', function ($httpProvider) {\r\n // see http://stackoverflow.com/a/20276775\r\n // and also http://www.bennadel.com/blog/2615-posting-form-data-with-http-in-angularjs.htm\r\n // Use x-www-form-urlencoded Content-Type\r\n $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';\r\n\r\n /**\r\n * The workhorse; converts an object to x-www-form-urlencoded serialization.\r\n * @param {Object} obj\r\n * @return {String}\r\n */\r\n var param = function (obj) {\r\n var query = '', name, value, fullSubName, subName, subValue, innerObj, i;\r\n\r\n for (name in obj) {\r\n value = obj[name];\r\n\r\n if (value instanceof Array) {\r\n for (i = 0; i < value.length; ++i) {\r\n subValue = value[i];\r\n fullSubName = name + '[' + i + ']';\r\n innerObj = {};\r\n innerObj[fullSubName] = subValue;\r\n query += param(innerObj) + '&';\r\n }\r\n } else if (value instanceof Object) {\r\n for (subName in value) {\r\n subValue = value[subName];\r\n fullSubName = name + '[' + subName + ']';\r\n innerObj = {};\r\n innerObj[fullSubName] = subValue;\r\n query += param(innerObj) + '&';\r\n }\r\n } else if (value !== undefined && value !== null)\r\n query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';\r\n }\r\n\r\n return query.length ? query.substr(0, query.length - 1) : query;\r\n };\r\n\r\n // Override $http service's default transformRequest\r\n $httpProvider.defaults.transformRequest = [\r\n function (data) {\r\n return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;\r\n }\r\n ];\r\n }\r\n ])\r\n .run(['$rootScope', '$state', '$http', '$q', '$window', '$location', '$document', 'RequestService', 'CheckVersionService',\r\n 'ServiceProvidersService', 'ServerCacheService', 'ModalServiceExt', '$resource', 'productTourService',\r\n function ($rootScope, $state, $http, $q, $window, $location, $document, RequestService, CheckVersionService,\r\n ServiceProvidersService, ServerCacheService, ModalServiceExt, $resource, productTourService) {\r\n\r\n var offline = localStorage.getItem('offline')\r\n if (offline === \"1\" && window.location.href.indexOf(\"Maintenance\") == -1)\r\n {\r\n $state.go('Maintenance'); \r\n }\r\n utilli.registerGoogleAnalytics($window, $rootScope, $location);\r\n\r\n $document.bind('keyup', function(e) {\r\n $rootScope.$broadcast('keyup', e);\r\n });\r\n\r\n //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\r\n if (DeploymentSettings.providersGroupShortName === 'wgl')\r\n $http.get('../Images/Wgl-logo.png');\r\n else \r\n $http.get('../Images/Utilli-logo.png');\r\n }\r\n else {\r\n\r\n if (DeploymentSettings.providersGroupShortName === 'wgl')\r\n $http.get('Images/Wgl-logo.png');\r\n else \r\n $http.get('Images/Utilli-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.hasAssistantRole())\r\n $state.goToAssistantsWelcome(params);\r\n else if (utilli.hasPropertyManagerRole() || utilli.isPropertyManagerApp())\r\n $state.goToPropertyManagersWelcome(params);\r\n else\r\n $state.go('TopMenuLayout.Welcome', params, { reload: true });\r\n }\r\n };\r\n\r\n $state.goToAgentsWelcome = function (params) {\r\n $state.go('TopMenuLayout.WelcomeAgent', params, { reload: true });\r\n }\r\n\r\n $state.goToAssistantsWelcome = function (params) {\r\n $state.go('TopMenuLayout.WelcomeAssistant', params, { reload: true });\r\n }\r\n\r\n $state.goToPropertyManagersWelcome = function (params) {\r\n $state.go('TopMenuLayout.WelcomePropertyManager', params, { reload: true });\r\n }\r\n\r\n /**\r\n * Changes current state to 'SignIn'.\r\n * @param {bool} withRedirect When true then it remembers the current state and \r\n * will redirect to it after login\r\n */\r\n $state.goToSignIn = function (withRedirect) {\r\n if (withRedirect){\r\n console.log('redirect from ' + this.current.name);\r\n }\r\n // note: this.params.from may already exist if we redirected the user explicitly to sign in.\r\n // it may happen for example if the user comes to the PayNow page by a direct link from email.\r\n // in this case if he is not logged in then we redirect him explicitly from PayNow to SignIn\r\n // so that he will land on SignIn.\r\n var redirectedFrom = withRedirect && !this.params.from // if from already exists then don't replace it\r\n ? { from: JSON.stringify({ stateName: this.current.name, stateParams: this.params }) }\r\n : null;\r\n if (isMobileOrRipple()) {\r\n if (utilli.isPropertyManagerApp())\r\n $state.goToPropertyManagersWelcome(redirectedFrom);\r\n else\r\n $state.go('TopMenuLayout.SignIn.Credentials', redirectedFrom);\r\n } else {\r\n // if add a reload then it loads child states\r\n // but looses current child states\r\n if (utilli.isPropertyManagerApp())\r\n $state.goToPropertyManagersWelcome(redirectedFrom);\r\n else\r\n $state.go('TopMenuLayout.Welcome', redirectedFrom, { reload: true });\r\n }\r\n };\r\n\r\n $state.goToSignUp = function () {\r\n if (isMobileOrRipple() && utilli.isPropertyManagerApp()) {\r\n $state.go('TopMenuLayout.SignUpPropertyManager.Step1');\r\n } else {\r\n // if add a reload then it loads child states\r\n // but looses current child states\r\n $state.go('TopMenuLayout.SignUp.Step1');\r\n }\r\n }\r\n\r\n $state.goToForgotPassword = function () {\r\n if (isMobileOrRipple() && utilli.isPropertyManagerApp()) {\r\n $state.go('TopMenuLayout.ForgotPasswordByEmail.Step1');\r\n } else {\r\n $state.go('TopMenuLayout.ForgotPassword.Step1');\r\n }\r\n }\r\n\r\n $state.goToForgotUserID = function () {\r\n if (isMobileOrRipple() && utilli.isPropertyManagerApp()) {\r\n $state.go('TopMenuLayout.ForgotUserIdByEmail.Step1');\r\n } else {\r\n $state.go('TopMenuLayout.ForgotUserId.Step1');\r\n }\r\n }\r\n\r\n $state.goToSignInWithRedirectTo = function (to) {\r\n\r\n var redirectTo = to ? { from: JSON.stringify({ stateName: to }) } : null;\r\n\r\n if (isMobileOrRipple()) {\r\n $state.go('TopMenuLayout.SignIn.Credentials', redirectTo);\r\n } else {\r\n // if add a reload then it loads child states\r\n // but looses current child states\r\n $state.go('TopMenuLayout.Welcome', redirectTo, { reload: true });\r\n }\r\n };\r\n\r\n $state.includesChild = function (childStateName) {\r\n return $state.current.name.indexOf(childStateName) >= 0;\r\n }\r\n\r\n $state.goFromWelcomeTo = function (stateName, params) {\r\n if (isMobileOrRipple()) {\r\n return $state.go('TopMenuLayout.' + stateName, params);\r\n } else {\r\n return $state.go('TopMenuLayout.Welcome.' + stateName, params);\r\n }\r\n };\r\n $state.goRelativeTo = function (parentName, childName, params) {\r\n var parentPos = $state.current.name.indexOf(parentName);\r\n if (parentPos < 0)\r\n return $state;\r\n\r\n var topRoute = $state.current.name.slice(0, parentPos);\r\n return $state.go(topRoute + parentName + '.' + childName, params);\r\n };\r\n\r\n 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: \"GET\",\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 .directive('ngBindHtmlDynamic', [\"$compile\", function($compile) {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n link: function (scope, element, attrs) {\r\n scope.$watch(attrs.ngBindHtmlDynamic, function(html) {\r\n element[0].innerHTML = html;\r\n $compile(element.contents())(scope);\r\n });\r\n }\r\n };\r\n }])\r\n // 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($scope._t('Confirmation'));\r\n\r\n $scope.forProgramEnrollments = $stateParams.forProgramEnrollments;\r\n $scope.forProgramEnrollmentsLearnMore = $stateParams.forProgramEnrollmentsLearnMore;\r\n\r\n $scope.phoneNumberMask = Config.phoneNumberMask;\r\n var countryCode = utilli.getCountryPhoneNumberCode();\r\n $scope.confirmationCodeMask = \"9999\";\r\n $scope.phoneNumber = $stateParams.phoneNumber;\r\n\r\n $scope.verificationCodeRequested = false;\r\n $scope.canRequestVerificationCode = true;\r\n\r\n (function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/StaticData/GetPhoneNumberConfirmationDisclamer',\r\n method: 'GET'\r\n }).success(function (data) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.html = $sce.trustAsHtml(data);\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors = [ $scope._t('Server error. Try again later.') ];\r\n });\r\n })();\r\n\r\n $scope.timeout = 15;\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n\r\n var tickTimer = function () {\r\n if ($scope.timeout != 0) {\r\n $scope.timeout--;\r\n $timeout(tickTimer, 1000);\r\n } else {\r\n $scope.canRequestVerificationCode = true;\r\n }\r\n\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n if ($scope.timeoutStr.length < 2) {\r\n $scope.timeoutStr = '0' + $scope.timeoutStr;\r\n }\r\n }\r\n\r\n $scope.sendVerificationCode = function () {\r\n $scope.errors = [];\r\n if (validatePhoneNumber()) {\r\n $scope.canRequestVerificationCode = false;\r\n\r\n $scope.timeout = 15;\r\n $scope.timeoutStr = '' + $scope.timeout;\r\n\r\n $timeout(tickTimer, 1000);\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/Profile/GenerateNewPhoneConfirmationCode';\r\n var requestData = {\r\n phoneNumber: countryCode + $scope.phoneNumber\r\n };\r\n utilli.addUserName($state, requestData);\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params:requestData\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n $scope.errors = data.Errors;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n $scope.verificationCodeRequested = true;\r\n }).error(function () {\r\n $scope.errors = [$scope._t('Server error. Try again later.')];\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n\r\n $scope.confirmPhone = function () {\r\n $scope.errors = [];\r\n if (validateConfirmationCode()) {\r\n var url = localStorage.getItem('ApiUrl') + 'api/Profile/ConfirmPhoneNumber';\r\n usSpinnerService.spin('spinner-1');\r\n var requestData = {\r\n phoneNumber: countryCode + $scope.phoneNumber,\r\n code: $scope.confirmationCode\r\n }\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n url: url,\r\n method: 'GET',\r\n params: requestData\r\n }).success(function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n $scope.errors = data.Errors;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n } else {\r\n NotificationBoxService.setSubscribeSmsVisibilityServerFlag(false);\r\n var maskedPhone = getMaskedPhoneNumberValue(countryCode + $scope.phoneNumber);\r\n var popupMessage = $scope._t('Your phone number') + ' ' + maskedPhone + ' ' + $scope._t('has been successfully verified for Utilli SMS notifications.');\r\n ModalServiceExt.showMessage($scope._t('SMS Notifications'), popupMessage, function() {\r\n if ($scope.forProgramEnrollments)\r\n $state.goMainLayout('ProgramEnrolments');\r\n else if ($scope.forProgramEnrollmentsLearnMore)\r\n $state.goMainLayout('SmsNotificationsLearnMore');\r\n else\r\n $state.goMainLayout('Profile');\r\n });\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function () {\r\n $scope.errors = [ $scope._t('Server error. Try again later.') ];\r\n usSpinnerService.spin('spinner-1');\r\n });\r\n }\r\n }\r\n\r\n function validatePhoneNumber() {\r\n var valid = true;\r\n $scope.phoneNumberError = false;\r\n\r\n if (!$scope.phoneNumber) {\r\n $scope.phoneNumberError = true;\r\n valid = false;\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n function validateConfirmationCode() {\r\n var valid = true;\r\n $scope.confirmationCodeError = false;\r\n\r\n if (!$scope.confirmationCode) {\r\n $scope.confirmationCodeError = true;\r\n valid = false;\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n $scope.back = function () {\r\n if ($scope.forProgramEnrollments)\r\n $state.goMainLayout('ProgramEnrolments');\r\n else if ($scope.forProgramEnrollmentsLearnMore)\r\n $state.goMainLayout('SmsNotificationsLearnMore');\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n NotificationBoxService.setTemporarilyHide(false);\r\n });\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('TermsAndConditionsController', ['$scope', '$http', '$sce', 'usSpinnerService',\r\n 'ServiceProvidersService', 'CommonHeaderService',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, $sce, usSpinnerService, ServiceProvidersService, CommonHeaderService) {\r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n CommonHeaderService.setUpBackButton(_t('Terms and Conditions'), true);\r\n $scope.loadContent = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function(providerData) {\r\n var provider = providerData;\r\n var url = provider.ApiUrl + 'api/StaticData/GetTermsAndConditions';\r\n $http({\r\n url: url,\r\n method: 'GET'\r\n }).success(function(data) {\r\n $scope.html = $sce.trustAsHtml(data);\r\n\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors = [{ key: 'Error', Message: utilli.errors.serverErrorMessage }];\r\n });\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors = [{ key: 'Error', Message: utilli.errors.serverErrorMessage }];\r\n }\r\n );\r\n }\r\n}]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('SystemInfoController', [\r\n '$scope', '$http', 'usSpinnerService', 'ServiceProvidersService', 'CommonHeaderService', 'ModalServiceExt',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $http, usSpinnerService, ServiceProvidersService, CommonHeaderService, ModalServiceExt) {\r\n // ReSharper restore InconsistentNaming\r\n CommonHeaderService.setUp();\r\n\r\n usSpinnerService.spin(\"spinner-1\");\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function(providerData) {\r\n var provider = providerData;\r\n\r\n $http({\r\n method: 'GET',\r\n url: provider.ApiUrl + 'api/System/GetDbInfo'\r\n }).success(function(resp) {\r\n usSpinnerService.stop('spinner-1');\r\n if (!resp || !resp.Data) {\r\n ModalServiceExt.showInfo(\"No response.\");\r\n return;\r\n }\r\n\r\n $scope.dbInfo = resp.Data;\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Unexpected error.\");\r\n });\r\n\r\n $scope.applyMigrations = function() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n method: 'POST',\r\n url: provider.ApiUrl + 'api/System/UpdateDb'\r\n }).success(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Success.\");\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(\"Unexpected error.\");\r\n });\r\n };\r\n });\r\n }\r\n ]);\n///
\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: 'https://bot.utilli.com/api/messages/LogOn',\r\n method: \"GET\",\r\n params: dataobj\r\n }).success(function () {\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\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.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('BILL & PAYMENT HISTORY'));\r\n $scope.currentTab = 'BillsList';\r\n $scope.isPayNowButtonVisible = !utilli.hasAgentRole();\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', '$rootScope', '$http', 'BillsService', '$state', 'OpenFileService',\r\n 'GridService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, BillsService, $state, OpenFileService, GridService, ModalServiceExt) {\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#billsGrid\"));\r\n\r\n $(window).resize(function() {\r\n gridResizeFunc($scope.billsKendoGrid);\r\n });\r\n $rootScope.$on('subscribe-notification-hide', function (event, args) {\r\n // gridResizeFunc($scope.billsKendoGrid);\r\n $scope.billsKendoGrid.dataSource.read();\r\n $scope.billsKendoGrid.refresh();\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: 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 accountNumber: accountNumber,\r\n skip: (params.page - 1) * params.pageSize,\r\n pageSize: params.pageSize,\r\n withTotalCount: true,\r\n });\r\n var url = localStorage.getItem('ApiUrl') + 'api/Bills/GetBillInfoPage';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.usersKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\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 () { gridResizeFunc($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() { gridResizeFunc($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: \"
#: PaidStatusTranslated #\",\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', '$rootScope', '$http', 'BillsService', 'GridService',\r\n 'CommonDataService', 'ModalServiceExt', 'PaymentHistoryService', '$state',\r\n function ($scope, $rootScope, $http, BillsService, GridService, CommonDataService,\r\n ModalServiceExt, PaymentHistoryService, $state) {\r\n var gridResizeFunc = GridService.getGridResizeFunc($(\"#paymentsGrid\"));\r\n $(window).resize(function () {\r\n gridResizeFunc($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 $rootScope.$on('subscribe-notification-hide', function (event, args) {\r\n // gridResizeFunc($scope.paymentsKendoGrid);\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 hidden: utilli.isHc()\r\n }, {\r\n title: $scope._t('Check/Conf. #'),\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: 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 accountNumber: accountNumber,\r\n skip: (params.page - 1) * params.pageSize,\r\n pageSize: params.pageSize,\r\n withTotalCount: true\r\n });\r\n var url = localStorage.getItem('ApiUrl') + 'api/PaymentHistory/GetPaymentsPage';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.usersKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\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 () { gridResizeFunc($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: gridResizeFunc,\r\n columns: columns\r\n }\r\n });\r\n }])\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('DashboardController', ['$scope', 'usSpinnerService', '$timeout', 'CommonDataService', \r\n '$q', 'ModalService', 'ModalServiceExt', 'LeftMenuService', '$state', 'CommonHeaderService', \r\n 'CustomerInfoDataService', 'DueReminderService', 'UnitsService', 'productTourService', 'TimeService',\r\n function ($scope, usSpinnerService, $timeout,\r\n// ReSharper disable InconsistentNaming\r\n CommonDataService, $q, ModalService, ModalServiceExt, LeftMenuService, $state,\r\n CommonHeaderService, CustomerInfoDataService, DueReminderService, UnitsService, productTourService,\r\n TimeService) {\r\n // ReSharper restore InconsistentNaming\r\n $scope.units = UnitsService;\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.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('Service is unavailable now. Try again later.'));\r\n });\r\n }\r\n\r\n $scope.emiOption = function ()\r\n {\r\n $state.goMainLayout('InstallmentPlan');\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 $scope.EnableInstallmentPlan = utilli.notAgentOrAssistant() && commonData.EnableInstallmentPlan;\r\n },\r\n function () {\r\n ModalServiceExt.showError($scope._t('Service is unavailable now. Try again later.'));\r\n });\r\n\r\n $scope.isEmiOptionVisible = function(){\r\n // EMI Option button should not be visible if balance is negative. negative balance means that user\r\n // has paid in ahead (for resources than he hasn't yet consumed). Installment Plan program makes\r\n // sense only if the user owe a lot of money to the company and has troubles to pay them all in one time\r\n return $scope.EnableInstallmentPlan && $scope.customerInfo.userinfo.TotalOpenBalance > 0;\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 (utilli.hasAssistantRole()){\r\n LeftMenuService.setContractAccountInfo(customerInfoData);\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(err) {\r\n ModalServiceExt.showError(err);\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() && !utilli.hasAssistantRole() \r\n && $scope.customerInfo.userinfo.Tour \r\n && !isMobileOrRipple()) // turn off for mobile for now because there are issues with positioning GNIS-2793\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 $scope.showDisconnectionPending = false;\r\n $scope.accountStatuses = [];\r\n\r\n $scope.LastPaymentAmount = customerInfo.userinfo.LastPaymentAmount == null\r\n ? null\r\n : getPositiveAmountString(customerInfo.userinfo.LastPaymentAmount);\r\n $scope.LastPaymentDate = TimeService.parseISOLocalDate(customerInfo.userinfo.LastPaymentDate);\r\n\r\n try {\r\n $scope.customerInfo.dueDate = TimeService.parseISOLocalDate(customerInfo.userinfo.DueDate);\r\n if ($scope.customerInfo.userinfo.IsDisconnected) {\r\n $scope.showDisconnected = true;\r\n }\r\n else if ($scope.customerInfo.userinfo.IsAccountDisconnectionPending) {\r\n $scope.showDisconnectionPending = true;\r\n }\r\n else if($scope.showDueDate && $scope.customerInfo.dueDate < utilli.getDateWithoutTime(new Date())) {\r\n $scope.showPastDue = true;\r\n }\r\n $scope.accountStatuses = utilli.fillAccountStatuses($scope.customerInfo.account);\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 $scope.isHc = utilli.isHc();\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 CommonDataService.getCommonData().then(function (commonData) {\r\n $scope.SupportPhone = commonData.SupportPhone;\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 //todo: need to be tested (closing popup by Esc pressing)\r\n // $scope.$on('keyup', function (event, e) {\r\n // if (e.which == 27) {\r\n // $element.modal('hide').on('hidden.bs.modal', function () {\r\n // close();\r\n // });\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.adjustPhoneNumber($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\nangular.module('utilliApp')\r\n .controller('BillingController', ['$scope', '$http', '$window', 'usSpinnerService', '$state',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', '$timeout',\r\n function ($scope, $http, $window, usSpinnerService, $state, \r\n // ReSharper disable InconsistentNaming\r\n LeftMenuService, CommonHeaderService, ModalServiceExt,\r\n // ReSharper restore InconsistentNaming\r\n $timeout) {\r\n\r\n // ReSharper disable once InconsistentNaming\r\n var _t = $scope._t;\r\n CommonHeaderService.setUp(_t('Billing'));\r\n LeftMenuService.setCurrentTab('Billing');\r\n CommonHeaderService.setUpBackButton($scope._t('Billing'));\r\n\r\n $scope.autoPayEnabled = true;\r\n $scope.reminderEnabled = true;\r\n $scope.confirmationEnabled = true;\r\n\r\n $scope.reminderSms = false;\r\n $scope.reminderEmail = false;\r\n $scope.confirmationSms = false;\r\n $scope.confirmationEmail = false;\r\n\r\n $scope.accountBalance = '-'\r\n $scope.paymentHistory = [];\r\n\r\n $scope.settings = utilli;\r\n $scope.requestQueue = 0;\r\n\r\n loadData();\r\n\r\n $scope.getPoListLabel = function (paymentOption) { \r\n if(paymentOption.PaymentType == utilli.paymentTypes.card)\r\n return 'credit card **** ' + paymentOption.Info;\r\n else\r\n return 'check **** ' + paymentOption.Info;\r\n }\r\n\r\n $scope.toogleAutoPay = function () {\r\n $scope.autoPayEnabled = !$scope.autoPayEnabled;\r\n $scope.saveAutopaySettings();\r\n }\r\n\r\n $scope.toogleReminder = function () {\r\n $scope.reminderEnabled = !$scope.reminderEnabled;\r\n $scope.saveAutopaySettings();\r\n }\r\n\r\n $scope.toogleConfirmation = function () {\r\n $scope.confirmationEnabled = !$scope.confirmationEnabled;\r\n $scope.saveAutopaySettings();\r\n }\r\n\r\n $scope.goToPaymentHistory = function () { \r\n $state.goMainLayout('BillsAndPayments');\r\n }\r\n\r\n $scope.goToPayNow = function () {\r\n $state.goMainLayout('PayNow');\r\n }\r\n\r\n $scope.goToPaymentOptionEdit = function (id, paymentType) { \r\n if (paymentType == utilli.paymentTypes.card)\r\n $state.goMainLayout('Card', id);\r\n else if (paymentType == utilli.paymentTypes.card)\r\n $state.goMainLayout('BankAccount', id);\r\n else\r\n $state.goMainLayout('PaymentOptions');\r\n }\r\n\r\n $scope.goToPaymentOptions = function () { \r\n $state.goMainLayout('PaymentOptions');\r\n }\r\n\r\n $scope.saveAutopaySettings = function () {\r\n $scope.savingStatus = 'saving';\r\n $scope.requestQueue ++;\r\n $timeout(function () {\r\n if($scope.requestQueue > 1) {\r\n $scope.requestQueue--;\r\n }\r\n else if($scope.requestQueue == 1) {\r\n $scope.requestQueue--;\r\n $scope.savingStatus = null;\r\n }\r\n }, 1000)\r\n }\r\n\r\n function loadData() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/PmBilling/GetBillingInfo/',\r\n method: \"GET\"\r\n }).success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function() {\r\n $scope.paymentHistory = response.Data.PaymentHistory;\r\n $scope.accountBalance = response.Data.AccountBalance;\r\n \r\n $scope.reminderSms = response.Data.ReminderSetting == utilli.notificationTypes.sms || response.Data.ReminderSetting == utilli.notificationTypes.smsAndEmail;\r\n $scope.reminderEmail = response.Data.ReminderSetting == utilli.notificationTypes.email || response.Data.ReminderSetting == utilli.notificationTypes.smsAndEmail;\r\n $scope.confirmationSms = response.Data.ConfirmationSetting == utilli.notificationTypes.sms || response.Data.ReminderSetting == utilli.notificationTypes.smsAndEmail;\r\n $scope.confirmationEmail = response.Data.ConfirmationSetting == utilli.notificationTypes.email || response.Data.ReminderSetting == utilli.notificationTypes.smsAndEmail;\r\n\r\n $scope.paymentMethods = response.Data.PaymentOptions;\r\n });\r\n }).error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.push({ Message: $scope._t(\"Server is unavailable, please try again later.\") });\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 = $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\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 }\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 url = utilli.getFileUrlWithToken(response.Data);\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 url = utilli.getFileUrlWithToken(response.Data);\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 = utilli.formatCurrency(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 url = utilli.getFileUrlWithToken(response.Data);\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 url = utilli.getFileUrlWithToken(response.Data);\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 = $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 = utilli.formatCurrency(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 }\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 uom: $scope.units.selectedUnitsType.name,\r\n meterNumber: $scope.currentMeter,\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 url = utilli.getFileUrlWithToken(response.Data);\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 url = utilli.getFileUrlWithToken(response.Data);\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('Consumption') + ': ' + 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 \r\n $scope.isIosMobile = isMobileOrRipple() && iOS();\r\n \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 successfully 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 successfully 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 successfully 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 successfully 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(\"Automobile 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 successfully 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 var url = utilli.getFileUrlWithToken(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.getFileUrlWithToken(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 parameters.saveSearch = true;\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 && response.Data.length > 0) {\r\n $scope.searchResults = _.filter(response.Data, function(dataItem) { \r\n return dataItem.MeterStatus != utilli.hcMeterStatuses.inActive; \r\n });\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 (searchResult) {\r\n //searchResult.AccountNumber, searchResult.UtilityType, searchResult.ServiceAddress\r\n var accountNumber = searchResult.AccountNumber, utilityType = searchResult.UtilityType,\r\n address = searchResult.ServiceAddress;\r\n\r\n ModalServiceExt.showYesNoMessage(_t('Property settlement'), _t('Is this property going to settlement?'),\r\n // 'Yes' was clicked\r\n function () {\r\n $state.goMainLayout('SettlementProperty',\r\n {\r\n AccountNumber: accountNumber,\r\n Address: address\r\n });\r\n },\r\n // 'No' was clicked\r\n function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Agents/NoSettlement',\r\n method: 'POST',\r\n data: {\r\n contractAccountNumber: accountNumber,\r\n addressLine: address\r\n }\r\n }).apiThen(\r\n function () {\r\n goToAccountDashboard(accountNumber, utilityType);\r\n }, \r\n ModalServiceExt\r\n )\r\n .fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\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, saveSearch: false };\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 && response.Data.length > 0) {\r\n dataItem.meterStatus = response.Data[0].MeterStatus;\r\n \r\n if(dataItem.meterStatus == utilli.hcMeterStatuses.inActive) {\r\n ModalServiceExt.showError(\"Contract Account \" + dataItem.AccountNumber\r\n + \" is Inactive\");\r\n return;\r\n }\r\n\r\n askUser(dataItem);\r\n }\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 if(dataItem.meterStatus == utilli.hcMeterStatuses.inActive) {\r\n ModalServiceExt.showError(\"Contract Account \" + dataItem.AccountNumber \r\n +\" is Inactive\");\r\n }\r\n else {\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 }\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 \r\n $scope.isPasswdValid = function () { \r\n $scope.passwdErrors = utilli.validatePassword($scope.Model.password, $scope.Model.userName, $scope.passRequirements,\r\n $scope.paswdMinLength, null, $scope.minUserIdLength);\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 $scope.checkLoginInfoFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n var isPasswdValid = $scope.isPasswdValid();\r\n if (!$scope.formUserInfo.$valid || !isPasswdValid) {\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 $rootScope.SecureData = {\r\n userNameOrEmail: ''\r\n };\r\n\r\n $rootScope.SecureData.userNameOrEmail = $.trim($scope.Model.email);\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 $rootScope.SecureData = {\r\n userNameOrEmail: ''\r\n };\r\n \r\n\t\t\t$rootScope.SecureData.userNameOrEmail = $.trim($scope.Model.email);\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\r\n $scope.userEmail = $rootScope.SecureData.userNameOrEmail;\r\n\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 LeftMenuService.changeAccount();\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('WelcomeAssistantController', ['$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.WelcomeAssistant.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\nangular.module('utilliApp').controller('WelcomeAlexaController', \r\n ['$state', '$scope', '$http', 'ServiceProvidersService', 'usSpinnerService', 'ModalServiceExt', '$location',\r\n function ($state, $scope, $http, ServiceProvidersService, usSpinnerService, ModalServiceExt, $location) {\r\n var _t = $scope._t;\r\n $scope.errors = [];\r\n $scope.login = '';\r\n $scope.password = '';\r\n var queryParams = $location.search();\r\n if (!queryParams.state)\r\n $scope.errors.push(_t(\"Parameter 'state' is missing.\"));\r\n if (!queryParams.redirect_uri)\r\n $scope.errors.push(_t(\"Parameter 'redirect_uri' is missing.\"));\r\n if ($scope.errors.length)\r\n return;\r\n\r\n var apiUrlAsync = ServiceProvidersService.getProviderApiUrl();\r\n\r\n $scope.submit = function () {\r\n $scope.form.$submitted = true;\r\n if (!$scope.form.$valid)\r\n return;\r\n usSpinnerService.spin('spinner-1');\r\n apiUrlAsync.then(function (apiUrl) {\r\n return $http({\r\n url: apiUrl + 'api/Account/AlexaLogin',\r\n method: 'POST',\r\n params: { userNameOrEmail: $scope.login, password: $scope.password }\r\n }).apiThen(function (data) {\r\n utilli.setWindowLocation(queryParams.redirect_uri + '&state=' + queryParams.state + '&access_token=' \r\n + data.SecurityToken);\r\n }, $scope.errors);\r\n }).fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n $scope.togglePassword = function (pswId, iconId) {\r\n utilli.togglePasswordVisibility(pswId, iconId);\r\n };\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('DelinquentsController', ['$scope', '$rootScope', '$http', '$window', '$timeout', 'usSpinnerService', '$state', '$stateParams',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt', 'avatarsService', \r\n function ($scope, $rootScope, $http, $window, $timeout, usSpinnerService, $state, $stateParams, LeftMenuService, CommonHeaderService, ModalServiceExt, avatarsService) {\r\n var _t = $scope._t;\r\n CommonHeaderService.setUp(_t('Delinquents List'));\r\n LeftMenuService.setCurrentTab('Delinquents');\r\n\r\n $scope.delinquents = null;\r\n\r\n $scope.sortSettings = {\r\n balance: null,\r\n fullName: null\r\n };\r\n \r\n loadData();\r\n\r\n $scope.sortBy = function (parameter) {\r\n var sortSetting = $scope.sortSettings[parameter];\r\n if (sortSetting == null) {\r\n $scope.sortSettings.balance = null;\r\n $scope.sortSettings.fullName = null;\r\n $scope.sortSettings[parameter] = \"asc\";\r\n }\r\n else{\r\n $scope.sortSettings.balance = null;\r\n $scope.sortSettings.fullName = null;\r\n $scope.sortSettings[parameter] = sortSetting == \"desc\" \r\n ? \"asc\" \r\n : \"desc\";\r\n }\r\n loadData(getRequestParams());\r\n }\r\n\r\n function getRequestParams () {\r\n var sortParam = $scope.sortSettings.fullName || $scope.sortSettings.balance \r\n ? $scope.sortSettings\r\n : null;\r\n var searchParam = $scope.searchBy ? $scope.searchBy : null;\r\n var result = { \r\n sortBy: sortParam,\r\n searchBy: searchParam\r\n };\r\n return result;\r\n }\r\n \r\n $scope.view = function (accountNumber, utilityType) {\r\n LeftMenuService.selectContractAccount(accountNumber);\r\n }\r\n\r\n $scope.pay = function (accountNumber, utilityType) {\r\n LeftMenuService.selectContractAccount(accountNumber, \"PayNow\");\r\n }\r\n\r\n $scope.search = function () {\r\n loadData(getRequestParams());\r\n }\r\n\r\n function loadData (parameters) {\r\n var url = localStorage.getItem('ApiUrl') + 'api/Assistant/GetDelinquents/';\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: url,\r\n method: \"POST\",\r\n data: parameters\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt,\r\n function () {\r\n $scope.delinquents = response.Data;\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.resetSearch = function () {\r\n $scope.searchBy = null;\r\n loadData();\r\n }\r\n\r\n var goTo = function (accountNumber, utilityType, state) {\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(state);\r\n\r\n $timeout(function () {\r\n $rootScope.showSlideAnimation = false;\r\n }, 300);\r\n };\r\n }]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('AssistantSearchController', ['$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('AssistantSearch');\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 parameters.saveSearch = false;\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 goTo = function (accountNumber, utilityType, state) {\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(state);\r\n\r\n $timeout(function () {\r\n $rootScope.showSlideAnimation = false;\r\n }, 300);\r\n };\r\n\r\n $scope.view = function (accountNumber, utilityType) {\r\n LeftMenuService.selectContractAccount(accountNumber);\r\n }\r\n\r\n $scope.pay = function (accountNumber, utilityType) {\r\n goTo(accountNumber, utilityType, \"PayNow\");\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('AssistantSearchHistoryController', ['$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('AssistantSearchHistory');\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.view = function (dataItem) {\r\n LeftMenuService.selectContractAccount(dataItem.AccountNumber);\r\n }\r\n });\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('SignUpAssistantController', ['$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('SignUpAssistantStep1Controller', ['$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 assistant registration process?'), function () {\r\n $state.go('TopMenuLayout.WelcomeAssistant', 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('SignUpAssistant', '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('SignUpAssistantStep2Controller', ['$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('SignUpAssistant', '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/Assistant/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('SignUpAssistant', '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('SignUpAssistantStep3Controller', ['$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('SignUpAssistant', '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 $rootScope.SecureData.userNameOrEmail = $.trim($scope.Model.email);\r\n\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/Assistant/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('SignUpAssistant', '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('SignUpAssistantSuccessController', ['$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\r\n $scope.userEmail = $rootScope.SecureData.userNameOrEmail;\r\n usSpinnerService.stop('spinner-1');\r\n\r\n $scope.SuccessOk = function () {\r\n $state.go('TopMenuLayout.WelcomeAssistant', null, { reload: true });\r\n }\r\n });\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('AssistantProfileController', ['$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 Assistant Profile'));\r\n LeftMenuService.setCurrentTab('AssistantProfile');\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/Assistant/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', { forAssistant: 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/Assistant/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 $scope.enableLanguagePack = utilli.isLanguagePackEnabled();\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 'CommonDataService',\r\n function ($http, $rootScope, $q, usSpinnerService, $state, DueReminderService, CommonDataService) {\r\n var svc = {};\r\n svc.services = [];\r\n svc.errors = {};\r\n svc.showResentVerificationEmailField = false;\r\n\r\n svc.resetErrors = function() {\r\n svc.errors.errorFromServerReturned = false;\r\n svc.errors.serverErrorInformation = null;\r\n svc.errors.serverErrors = null;\r\n svc.errors.showServerErrors = false;\r\n svc.showResentVerificationEmailField = false;\r\n }\r\n\r\n function getFromPart(fromAddress) {\r\n if (utilli.isDebug)\r\n console.log('redirection from SignInService to Admin portal page ' + fromAddress);\r\n\r\n var redirectedFrom = JSON.parse(fromAddress);\r\n var fromPart = redirectedFrom.stateName\r\n\r\n if (redirectedFrom.stateParams) {\r\n _.each(redirectedFrom.stateParams, function (param) {\r\n fromPart += '/' + param;\r\n });\r\n }\r\n\r\n return fromPart;\r\n }\r\n\r\n function redirect(state, defaulState) {\r\n var redirectTo = JSON.parse(state);\r\n // We need this check for scenario when user tried to enter admin portal by direct url in browser without loging in.\r\n // After this user will be redirected to sign in page with 'from' part in the url. But after being redirected to 'sign in' page \r\n // user desided to log in as regular user (not admin). \r\n // In this case 'from' state does not exist for user portal and we should ignore it.\r\n var checkState = $state.get(redirectTo.stateName);\r\n if (checkState) {\r\n if (utilli.isDebug)\r\n console.log('redirection from SignInService to ' + state);\r\n $state.go(redirectTo.stateName, redirectTo.stateParams);\r\n }\r\n else {\r\n $state.goMainLayout(defaulState);\r\n }\r\n }\r\n\r\n function _getCurrentProviderName () { \r\n var serviceProviderName = localStorage.getItem('ServiceProviderName');\r\n if(!utilli.checkDefinedValue(serviceProviderName))\r\n return null;\r\n for (var providerName in Config.providers){\r\n var provider = Config.providers[providerName];\r\n if (provider.Name && provider.Name == serviceProviderName)\r\n return providerName;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Sets on the scope touchIdAvailable field\r\n * @param {angularJs scope} scope \r\n */\r\n svc.setIsTouchIdAvailable = function(scope){\r\n try {\r\n if (isMobileOrRipple()){\r\n if (isAndroid()) {\r\n FingerprintAuth.isAvailable(isAvailableSuccess, isAvailableError);\r\n } else if (iOS()) {\r\n window.plugins.touchid.isAvailable(isAvailableSuccess, isAvailableError);\r\n }\r\n }\r\n }\r\n catch (e) {\r\n console.error('Failed to check if finger print API is available: ' + JSON.stringify(e));\r\n }\r\n\r\n function isAvailableSuccess(result) {\r\n console.log(\"FingerprintAuth available: \" + JSON.stringify(result));\r\n if (isAndroid()) {\r\n scope.touchIdAvailable = result.isAvailable && result.hasEnrolledFingerprints;\r\n }\r\n else if (iOS()) {\r\n scope.touchIdAvailable = true;\r\n }\r\n }\r\n\r\n function isAvailableError(message) {\r\n console.log(\"isAvailableError(): \" + message);\r\n scope.touchIdAvailable = false;\r\n }\r\n }\r\n\r\n svc.signIn = function (login, passwd, apiUrl, serviceProviderName, fromAddress, \r\n isTouchIdAvailable, touchIdRefreshToken) {\r\n var result = $q.defer();\r\n usSpinnerService.spin('spinner-1');\r\n var parameters = {\r\n userNameOrEmail: $.trim(login),\r\n password: $.trim(passwd),\r\n client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal,\r\n mobilePlatform: isMobileOrRipple() ? utilli.getPlatformName() : '',\r\n rememberMe: false,\r\n mobileDeviceToken: isMobileOrRipple() ? utilli.getDeviceToken() : '',\r\n isTouchIdAvailable: isTouchIdAvailable ? true : false,\r\n touchIdRefreshToken: touchIdRefreshToken\r\n };\r\n\r\n $http.post(apiUrl + 'api/Account/LogOn/', parameters)\r\n .success(function (response) {\r\n if (!response) {\r\n var errorMessage = $rootScope._t(\"Server error. Try again later.\");\r\n result.reject(errorMessage);\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = errorMessage;\r\n }\r\n else if (response.ERROR_LIST.length > 0) {\r\n svc.errors.showServerErrors = true;\r\n svc.errors.serverErrors = response.ERROR_LIST;\r\n if (response.ERROR_LIST[0].key == \"IncompleteRegistrationError\"){\r\n svc.showResentVerificationEmailField = true;\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n $rootScope.contactPhoneNumber = commonData.SupportPhone;\r\n $rootScope.workingHours = commonData.WorkingHours;\r\n $rootScope.billingEmailTo = commonData.BillingEmailTo;\r\n $rootScope.serviceProviderName = commonData.CompanyName;\r\n result.reject(response.ERROR_LIST[0].Message);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return;// return because the spinner must spin until common data is received\r\n }\r\n else {\r\n svc.showResentVerificationEmailField = false;\r\n }\r\n result.reject(response.ERROR_LIST[0].Message);\r\n }\r\n else if (response.Valid != 1) {\r\n var errorMessage = $rootScope._t(\"We cannot check your credentials. Please try again later.\");\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = errorMessage;\r\n result.reject(errorMessage);\r\n }\r\n else {\r\n result.resolve();\r\n svc.errors.errorFromServerReturned = false;\r\n svc.errors.showServerErrors = false;\r\n\r\n if (isTouchIdAvailable){\r\n localStorage.setItem('touchIdData', JSON.stringify({\r\n lastApiUrl: apiUrl,\r\n lastServiceProviderName: serviceProviderName,\r\n refreshToken: response.TouchIdRefreshToken\r\n }));\r\n }\r\n localStorage.setItem('SecurityToken', response.SecurityToken);\r\n localStorage.setItem('ApiUrl', apiUrl);\r\n localStorage.setItem('ServiceProviderName', serviceProviderName);\r\n localStorage.setItem('language', response.Language);\r\n\r\n if (!DeploymentSettings.currentServiceProvider) \r\n DeploymentSettings.currentServiceProvider = _getCurrentProviderName();\r\n\r\n if (!isMobileOrRipple() && response.IsAdmin) {\r\n // 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.hasAssistantRole())\r\n $state.goMainLayout('AssistantSearch');\r\n else if (utilli.hasFieldServiceEngineerRole())\r\n $state.goMainLayout('WorkCenters');\r\n else if (utilli.hasPropertyManagerRole()) {\r\n localStorage.setItem('showEsScoreInfoPopup', 'true');\r\n if (fromAddress) {\r\n redirect(fromAddress, 'PropertyList');\r\n } else {\r\n $state.goMainLayout('PropertyList');\r\n }\r\n }\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (e) {\r\n var errorMessage = $rootScope._t(\"Server error. Try again later.\");\r\n result.reject(errorMessage);\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = errorMessage;\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return result.promise;\r\n };\r\n\r\n svc.resendVerificationEmail = function (login, passwd, apiUrl, serviceProviderName) {\r\n usSpinnerService.spin('spinner-1');\r\n var parameters = {\r\n userNameOrEmail: $.trim(login),\r\n password: $.trim(passwd),\r\n };\r\n $http({\r\n url: apiUrl + 'api/Account/SendChallengeEmail/',\r\n method: \"POST\",\r\n params: parameters\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (e) {\r\n svc.errors.errorFromServerReturned = true;\r\n svc.errors.serverErrorInformation = $rootScope._t(\"Server error. Try again later.\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n svc.showResendVerificationEmail = function () {\r\n return svc.showResentVerificationEmailField;\r\n }\r\n\r\n return svc;\r\n }]);\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('SignInPartController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.setUp();\r\n $rootScope.errorFromServerReturned = false;\r\n $rootScope.showServerErrors = false;\r\n $rootScope.serverErrorInformation = '';\r\n $rootScope.serverErrors = [];\r\n\r\n $scope.back = function() {\r\n $state.go('Welcome');\r\n };\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('CredentialsController', ['$scope', '$state', '$http', 'usSpinnerService', 'SignInService', \r\n '$stateParams', 'CommonHeaderService', 'CheckVersionService', '$q',\r\n function ($scope, $state, $http, usSpinnerService, SignInService, $stateParams, CommonHeaderService,\r\n CheckVersionService, $q) {\r\n var touchIdClientId = \"UtilliTouchIdClientId\";\r\n $scope.touchIdAvailable = false;\r\n SignInService.setIsTouchIdAvailable($scope);\r\n $scope.hasTouchIdData = localStorage.getItem('touchIdData') != null;\r\n\r\n $scope.loginWithTouchId = function () {\r\n if (!isMobileOrRipple())\r\n return;\r\n if (isAndroid()) {\r\n FingerprintAuth.encrypt({ clientId: touchIdClientId }, fingerPrintSuccess, fingerPrintError);\r\n } else if (iOS()) {\r\n window.plugins.touchid.verifyFingerprint(\r\n 'Scan your fingerprint please', // this will be shown in the native scanner popup\r\n fingerPrintSuccess, fingerPrintError\r\n );\r\n }\r\n }\r\n\r\n function fingerPrintSuccess() {\r\n var touchIdDataString = localStorage.getItem('touchIdData');\r\n var touchIdData = touchIdDataString == null ? null : JSON.parse(touchIdDataString);\r\n SignInService.signIn(null, null,\r\n touchIdData.lastApiUrl,\r\n touchIdData.lastServiceProviderName,\r\n $stateParams.from, $scope.touchIdAvailable, touchIdData.refreshToken);\r\n }\r\n\r\n function fingerPrintError(error) {\r\n console.log(\"FingerprintAuth Error: \" + error);\r\n }\r\n \r\n var offline = localStorage.getItem('offline')\r\n console.log(\"Offline\"+offline);\r\n if (offline === \"1\" && window.location.href.indexOf(\"Maintenance\") == -1)\r\n {\r\n usSpinnerService.stop('spinner-1');\r\n $state.go('Maintenance'); \r\n }\r\n\r\n var checkVersionPromise = CheckVersionService.checkVersion();\r\n checkVersionPromise.then(function (res) {\r\n var offline = localStorage.getItem('offline')\r\n console.log(\"Offline\"+offline);\r\n console.log(window.location.href.indexOf(\"Maintenance\"))\r\n if (offline === \"1\" && window.location.href.indexOf(\"Maintenance\") == -1)\r\n {\r\n usSpinnerService.stop('spinner-1');\r\n $state.go('Maintenance'); \r\n }\r\n });\r\n // var offline = localStorage.getItem('offline')\r\n // console.log(\"Offline\"+offline);\r\n // if (offline === \"1\")\r\n // {\r\n // $state.go('Maintenance'); \r\n // }\r\n \r\n localStorage.removeItem('ServiceProviderName');\r\n\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.stepName = 'Login';\r\n $scope.errors = SignInService.errors;\r\n $scope.showResentVerificationEmail = function () {\r\n return SignInService.showResendVerificationEmail();\r\n }\r\n $scope.showResentVerificationEmailDone = false;\r\n\r\n var _lastLoginWithRequiredEmail;\r\n\r\n $scope.togglePassword = function (pswId, iconId) {\r\n utilli.togglePasswordVisibility(pswId, iconId);\r\n }\r\n\r\n $scope.$watch('credentials.login', function () {\r\n if ($scope.emailRequired)\r\n $scope.emailRequired = false;\r\n if (_lastLoginWithRequiredEmail != undefined && $scope.credentials.login == _lastLoginWithRequiredEmail)\r\n $scope.emailRequired = true;\r\n });\r\n\r\n if (!$scope.credentials) {\r\n $scope.credentials = {};\r\n if (Config.debug) {\r\n $scope.credentials.login = 'testUser';\r\n $scope.credentials.email = 'max.suhinin+63@gmail.com';\r\n $scope.credentials.password = 'online123';\r\n }\r\n }\r\n\r\n var gotoAfterVersionChecking = function (state, params) {\r\n usSpinnerService.spin('spinner-1');\r\n checkVersionPromise.then(function () {\r\n $state.go(state, params);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n $scope.goToForgotPassword = function () {\r\n var state = '';\r\n var params = null;\r\n if ($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 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, $scope.touchIdAvailable);\r\n }\r\n else\r\n {\r\n SignInService.services = copyServices;\r\n $state.goFromWelcomeTo('SignIn.Providers', {\r\n signInParams: {\r\n from: $stateParams.from,\r\n login: $scope.credentials.login,\r\n passwd: $scope.credentials.password\r\n }\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n var checkProvidersPromise = checkServiceProviders();\r\n $q.all([checkVersionPromise, checkProvidersPromise]).then(function (data) {\r\n var checkVersionResult = data[0];\r\n var checkProvidersSuccess = data[1];\r\n if (CheckVersionService.isVersionCorrect(checkVersionResult)) {\r\n if (checkProvidersSuccess) {\r\n loginByProvider();\r\n }\r\n }\r\n else if (CheckVersionService.isVersionWrong(checkVersionResult)) {\r\n $state.go('UpdateApp');\r\n }\r\n else {\r\n $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 if(DeploymentSettings.providersGroupShortName == Config.wglProvidersGroupShortName )\r\n providersApiUrl = \"https://apistaging.utilli.com/wgl-providers/api/\";\r\n else if (DeploymentSettings.providersGroupShortName == Config.hcProvidersGroupShortName)\r\n providersApiUrl = \"https://apistaging.utilli.com/hc-providers/api/\";\r\n else if (DeploymentSettings.providersGroupShortName == Config.pxProvidersGroupShortName)\r\n providersApiUrl = \"https://apistaging.utilli.com/px-providers/api/\";\r\n else\r\n providersApiUrl = \"https://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($scope._t(\"Login name\") + \" '\" + login.login + \"' \" + $scope._t(\"is not registered.\"));\r\n deferred.reject($scope._t(\"Login name\") + \" '\" + login.login + \"' \" + $scope._t(\"is not registered.\"));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n SignInService.services = data;\r\n usSpinnerService.stop('spinner-1');\r\n deferred.resolve(data);\r\n }\r\n ).error(function () {\r\n setError(\"Server error. Try again later.\");\r\n deferred.reject(\"Server error. Try again later.\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function loginByProvider() {\r\n // if it's a regular portal then we should use only the provider that is relevant for the current portal\r\n if (!!DeploymentSettings.currentServiceProvider) {\r\n var currentServiceProvider = DeploymentSettings.currentServiceProvider;\r\n var currentProviderName = Config.providers[currentServiceProvider].Name;\r\n var providersFiltered = $.grep(SignInService.services, function (item) {\r\n return item.Name == currentProviderName;\r\n });\r\n if (!providersFiltered || providersFiltered.length !== 1) {\r\n setError($scope._t(\"Login name\") + \" '\" + $scope.credentials.login + \"' \" + $scope._t(\"is not registered.\"));\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n if (SignInService.services && SignInService.services.length == 1 \r\n && !SignInService.services[0].IsAvailable) {\r\n \r\n usSpinnerService.stop('spinner-1');\r\n $state.go('Maintenance'); \r\n return;\r\n }\r\n SignInService.signIn($scope.credentials.login,\r\n $scope.credentials.password,\r\n providersFiltered[0].ApiUrl,\r\n providersFiltered[0].Name,\r\n $stateParams.from, $scope.touchIdAvailable);\r\n return;\r\n }\r\n // if we are here then it's not a regular portal. it's either mobile/ripple or common portal (like portal.utilli.com).\r\n // and at least one result is found.\r\n // if it is only one result then just try login, since it's the case when\r\n // on mobile for a given user id we have only one user.\r\n // there is no need to ask into which service provider he wants to login\r\n if (SignInService.services.length == 1) {\r\n\r\n SignInService.signIn($scope.credentials.login,\r\n $scope.credentials.password,\r\n SignInService.services[0].ApiUrl,\r\n SignInService.services[0].Name,\r\n $stateParams.from, $scope.touchIdAvailable);\r\n return;\r\n }\r\n // if we are here then there are more than one users for different companies\r\n // if they all are registered using the same email then just go to the page\r\n // where this user can select company into which he wants to login\r\n if (!isEmailRequired(SignInService.services)) {\r\n usSpinnerService.stop('spinner-1');\r\n $state.goFromWelcomeTo('SignIn.Providers', {\r\n signInParams: {\r\n from: $stateParams.from,\r\n login: $scope.credentials.login,\r\n passwd: $scope.credentials.password\r\n }\r\n });\r\n }\r\n // if we are here then there are at least 2 emails for one userid\r\n // this can be a case when 2 users choosed one userid independently during\r\n // registration on portals where we don't check uniqueness of the userid\r\n // across all portals. hence we need to ask this user to specify his email\r\n // so that we will be able to identify his company.\r\n // idea is that such userid collisions will be very rare all not happen.\r\n // and if they happen then for such users it will be more convenient to login\r\n // using email\r\n $scope.credentials.email = '';\r\n $scope.emailRequired = true;\r\n _lastLoginWithRequiredEmail = $scope.credentials.login;\r\n usSpinnerService.stop('spinner-1');// stop the spinner to allow user to enter email\r\n }\r\n\r\n function isEmailRequired(data) {\r\n if (_.any(data, function (item) { return !item.IsAvailable })) {\r\n return true;\r\n }\r\n //if all email is the same we return false\r\n var email = data[0].UserData.Email;\r\n for (var i = 1; i < data.length; i++) {\r\n if (data[i].UserData.Email.toUpperCase() === email.toUpperCase())\r\n continue;\r\n else \r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n ]).directive('capsLock', function () {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attr) {\r\n\r\n scope.capsLockFlags = [];\r\n scope.resetCapsLockFlags = function() {\r\n scope.capsLockFlags.forEach(function(item) {\r\n scope[item] = false;\r\n });\r\n }\r\n\r\n // If element lost focus - hide warning\r\n element.bind('blur', function(e) {\r\n scope.resetCapsLockFlags();\r\n });\r\n\r\n element.bind('keypress', function(e) {\r\n // If letter is from a to z, set false\r\n if (e.which >= 97 && e.which <= 122) {\r\n scope.resetCapsLockFlags();\r\n scope.$apply();\r\n }\r\n // If letter from A to Z and shift is not on, set true\r\n else if (e.which >= 65 && e.which <= 90 && !e.shiftKey) {\r\n scope[attr.capsLock] = true;\r\n if (!scope.capsLockFlags.includes(attr.capsLock))\r\n scope.capsLockFlags.push(attr.capsLock);\r\n scope.$apply();\r\n }\r\n });\r\n\r\n element.bind('keydown', function(e) {\r\n if (e.which === 20) {\r\n scope.resetCapsLockFlags();\r\n scope.$apply();\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('ProvidersController', ['$scope', 'SignInService', '$state', '$stateParams',\r\n function ($scope, SignInService, $state, $stateParams) {\r\n $scope.stepName = 'Select Service Provider';\r\n $scope.services = SignInService.services;\r\n var selectedService = -1;\r\n $scope.touchIdAvailable = false;\r\n SignInService.setIsTouchIdAvailable($scope);\r\n\r\n $scope.radioClick = function(index)\r\n {\r\n if (selectedService >= 0)\r\n {\r\n $('#service' + selectedService).removeClass('service-active');\r\n $(\"input[name='radio\" + selectedService + \"']\").prop('checked', false);\r\n }\r\n\r\n $('#service' + index).addClass('service-active');\r\n $(\"input[name='radio\" + index + \"']\").prop('checked', true);\r\n selectedService = index;\r\n var provider = SignInService.services[selectedService];\r\n SignInService.signIn($stateParams.signInParams.login,\r\n $stateParams.signInParams.passwd,\r\n provider.ApiUrl,\r\n provider.Name,\r\n $stateParams.signInParams.from, \r\n $scope.touchIdAvailable).\r\n then(function () { }, function (error) {\r\n $scope.error = error;\r\n resetErrors();\r\n });\r\n }\r\n\r\n function resetErrors() {\r\n SignInService.errors.errorFromServerReturned = false;\r\n SignInService.errors.showServerErrors = false;\r\n SignInService.errors.serverErrorInformation = '';\r\n SignInService.errors.serverErrors = [];\r\n }\r\n\r\n $scope.back = function () {\r\n $state.goFromWelcomeTo('SignIn.Credentials');\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('SignUpController', ['$scope', '$state', 'CommonHeaderService', 'RegistrationInfoService', '$stateParams',\r\n function ($scope, $state, CommonHeaderService, RegistrationInfoService, $stateParams) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n\r\n tryToInitRegistrationInfoService();\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n function tryToInitRegistrationInfoService(){\r\n RegistrationInfoService.userInfo.accountnumber = $stateParams.accountnumber;\r\n RegistrationInfoService.userInfo.zip = $stateParams.zip;\r\n RegistrationInfoService.userInfo.token = $stateParams.token;\r\n RegistrationInfoService.userInfo.customerfullname = $stateParams.customerfullname;\r\n }\r\n }])\r\n.controller('SignUpStep1Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'usSpinnerService', 'ServiceProvidersService', '$stateParams', 'CheckVersionService', '$q', 'RegistrationInfoService',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService, ServiceProvidersService,\r\n $stateParams, CheckVersionService, $q, RegistrationInfoService) {\r\n\r\n utilli.fixSelectElementForMobile();\r\n\r\n var checkVersionPromise = CheckVersionService.checkVersion();\r\n $scope.accountMaxLength = Config.contractAccountMaxLength;\r\n $scope.providers = [];\r\n $scope.provider = {};\r\n $scope.errors = [];\r\n $scope.isProviderListVisible = false;\r\n\r\n getProviderInfo();\r\n\r\n $scope.initForm = function () {\r\n var isDataExist = RegistrationInfoService.userInfo.accountnumber != undefined \r\n && RegistrationInfoService.userInfo.zip != undefined\r\n && RegistrationInfoService.userInfo.customerfullname != undefined;\r\n if (isDataExist) {\r\n $scope.AccountNumber = RegistrationInfoService.userInfo.accountnumber;\r\n $scope.ZipCode = RegistrationInfoService.userInfo.zip;\r\n $scope.FullName = RegistrationInfoService.userInfo.customerfullname;\r\n }\r\n };\r\n\r\n $scope.submit = function () {\r\n ServiceProvidersService.setCurrentProvider($scope.provider);\r\n usSpinnerService.spin(\"spinner-1\");\r\n $moduleServices.hideKeyboard();\r\n\r\n if (!$scope.formAccountInfo.$valid) {\r\n $scope.submitted = true;\r\n usSpinnerService.stop(\"spinner-1\");\r\n return;\r\n }\r\n\r\n $rootScope.serviceUrl = $scope.provider.ApiUrl + 'api/Registration/Register/';\r\n $rootScope.webServicesUrl = $scope.provider.ApiUrl;\r\n var checkAccountInfoPromise = checkAccountInfo();\r\n\r\n $q.all([checkVersionPromise, checkAccountInfoPromise]).then(function (data) {\r\n var checkVersionResult = data[0];\r\n var checkAccountInfoResult = data[1];\r\n if (CheckVersionService.isVersionCorrect(checkVersionResult)) {\r\n if (checkAccountInfoResult) {\r\n RegistrationInfoService.userInfo.accountnumber = $.trim($scope.AccountNumber);\r\n RegistrationInfoService.userInfo.zip = $.trim($scope.ZipCode);\r\n RegistrationInfoService.userInfo.customerfullname = $.trim($scope.FullName);\r\n RegistrationInfoService.userInfo.token = $scope.token;\r\n $state.goRelativeTo('SignUp', 'Step2');\r\n }\r\n }\r\n else if (CheckVersionService.isVersionWrong(checkVersionResult)) {\r\n $state.go('UpdateApp');\r\n }\r\n else {\r\n $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 getProviderInfo () { \r\n usSpinnerService.spin(\"spinner-1\");\r\n if (!DeploymentSettings.currentServiceProvider) {\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(allProviders) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.isProviderListVisible = allProviders.length > 1;\r\n $scope.providers = allProviders;\r\n $scope.provider = allProviders[0];\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n else {\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.provider = providerData;\r\n },\r\n function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n }\r\n\r\n function checkAccountInfo() {\r\n var deferred = $q.defer();\r\n var data = {\r\n AccountNumber: $scope.AccountNumber,\r\n ZipCode: $scope.ZipCode,\r\n FullName: $scope.FullName,\r\n Step: 1,\r\n Client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal\r\n }\r\n $http({\r\n url: $rootScope.serviceUrl,\r\n method: \"POST\",\r\n data: data\r\n }).success(function (response) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n if (response) {\r\n if (response.Errors != null && response.Errors.length > 0) {\r\n $scope.errors = response.Errors;\r\n deferred.resolve(false);\r\n }\r\n else {\r\n $scope.token = response.Token;\r\n $scope.AccountNumber = response.NonLegacyAccount;\r\n $scope.serviceProvider = $scope.provider;\r\n deferred.resolve(true);\r\n }\r\n }\r\n else {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n deferred.resolve(false);\r\n }\r\n }).error(function () {\r\n deferred.reject();\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop(\"spinner-1\");\r\n });\r\n return deferred.promise;\r\n }\r\n }])\r\n.controller('SignUpStep2Controller', ['$scope', '$rootScope', '$http', '$state', 'CommonDataService', \r\n 'usSpinnerService', '$stateParams', 'ServiceProvidersService', 'RegistrationInfoService', '$q',\r\n // ReSharper disable InconsistentNaming\r\n function ($scope, $rootScope, $http, $state, CommonDataService, usSpinnerService, $stateParams,\r\n ServiceProvidersService, RegistrationInfoService,$q) {\r\n \r\n var _t = $scope._t;\r\n // ReSharper restore InconsistentNaming\r\n\r\n if ($stateParams.email) {\r\n $scope.Email = $stateParams.email;\r\n $scope.Email2 = $stateParams.email;\r\n }\r\n\r\n var loadingText = _t('Loading...');\r\n $scope.errors = [];\r\n $scope.passRequirements = [{ Value: loadingText }];\r\n $scope.SecurityQuestions = [loadingText];\r\n $scope.SecurityQuestion = loadingText;\r\n\r\n init();\r\n initForm();\r\n\r\n utilli.fixSelectElementForMobile();\r\n\r\n $scope.isUserDataCorrect = function () { \r\n var result = !$scope.formAccountInfo.UserID.$error.required && \r\n !$scope.formAccountInfo.UserID.$error.pattern && \r\n !$scope.formAccountInfo.Email.$error.required &&\r\n !$scope.formAccountInfo.SecurityAnswer.$error.required &&\r\n !$scope.formAccountInfo.SecurityAnswer.$error.pattern &&\r\n $scope.UserID.length >= $scope.minUserIdLength;\r\n return result;\r\n }\r\n\r\n $scope.isPasswdValid = function () { \r\n $scope.passwdErrors = utilli.validatePassword($scope.Password, $scope.UserID, $scope.passRequirements, $scope.paswdMinLength, null, $scope.minUserIdLength);\r\n $scope.passwordsNotMatch = $scope.Password && $scope.Password !== $scope.ConfirmPassword \r\n ? $scope._t('Passwords do not match.')\r\n : null;\r\n var result = $scope.passwdErrors.length == 0 && !$scope.passwordsNotMatch;\r\n return result;\r\n }\r\n\r\n $scope.submit = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $scope.errors = [];\r\n \r\n var isUserDataCorrect = $scope.isUserDataCorrect();\r\n var isPasswdValid = $scope.isPasswdValid();\r\n\r\n if (!$scope.formAccountInfo.$valid || !isUserDataCorrect || !isPasswdValid) {\r\n $scope.errors.push(utilli.errors.validationErorrsMessage);\r\n utilli.scrollTop();\r\n $scope.submitted = true;\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n \r\n var data = {\r\n AccountNumber: RegistrationInfoService.userInfo.accountnumber,\r\n ZipCode: RegistrationInfoService.userInfo.zip,\r\n Token: RegistrationInfoService.userInfo.token,\r\n UserName: $.trim($scope.UserID),\r\n Email: $.trim($scope.Email.toLowerCase()),\r\n Password: $scope.Password,\r\n ConfirmPassword: $scope.ConfirmPassword,\r\n SecurityQuestion1: $scope.SecurityQuestion,\r\n SecurityAnswer1: $scope.SecurityAnswer,\r\n Client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal,\r\n Step: 2\r\n }\r\n\r\n $http({\r\n url: $rootScope.serviceUrl,\r\n method: \"POST\",\r\n data: data\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.Errors != null && response.Errors.length > 0) {\r\n $scope.errors = response.Errors;\r\n }\r\n else {\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData($rootScope.webServicesUrl, true)\r\n .then(function () {\r\n RegistrationInfoService.userInfo.token = response.Token;\r\n RegistrationInfoService.userInfo.user = $.trim($scope.UserID);\r\n RegistrationInfoService.userInfo.email = $.trim($scope.Email.toLowerCase());\r\n RegistrationInfoService.userInfo.psw = $scope.Password;\r\n RegistrationInfoService.userInfo.question = $scope.SecurityQuestion;\r\n RegistrationInfoService.userInfo.answer = $scope.SecurityAnswer;\r\n $state.goRelativeTo('SignUp', 'Step3');\r\n usSpinnerService.stop('spinner-1');\r\n }, function () {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }\r\n else {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n function initForm() {\r\n $scope.UserID = RegistrationInfoService.userInfo.user;\r\n $scope.Email = RegistrationInfoService.userInfo.email;\r\n $scope.Email2 = RegistrationInfoService.userInfo.email;\r\n $scope.SecurityAnswer = RegistrationInfoService.userInfo.answer;\r\n $scope.SecurityQuestion = RegistrationInfoService.userInfo.question;\r\n };\r\n\r\n function init () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n ServiceProvidersService.getCurrentProvider().then(\r\n function (providerData) {\r\n $rootScope.webServicesUrl = providerData.ApiUrl;\r\n $rootScope.serviceUrl = providerData.ApiUrl + 'api/Registration/Register/';\r\n CommonDataService.getCommonData($rootScope.webServicesUrl)\r\n .then(function(data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.paswdMinLength = data.PasswordLength;\r\n $scope.passRequirements = data.PasswordRequirements;\r\n $scope.minUserIdLength = data.MinUserIdLength;\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n \r\n $http.get(providerData.ApiUrl + 'api/StaticData/GetSecurityQuestions/')\r\n .then(function(resp) {\r\n var sequrityQeuestions = JSON.parse(resp.data);\r\n $scope.SecurityQuestions = sequrityQeuestions;\r\n $scope.SecurityQuestion = RegistrationInfoService.userInfo.question \r\n ? RegistrationInfoService.userInfo.question\r\n : $scope.SecurityQuestions[0];\r\n },\r\n function() {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n },\r\n function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n }])\r\n.controller('SignUpStep3Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams', 'moduleServices',\r\n 'usSpinnerService', '$sce', 'RegistrationInfoService',\r\n function ($scope, $rootScope, $http, $state, $stateParams, $moduleServices, usSpinnerService, $sce,\r\n RegistrationInfoService) {\r\n \r\n $scope.errors = [];\r\n $scope.emailNotificationsAccepted = true;\r\n\r\n $scope.loadTermsAndConditions = function () {\r\n if($rootScope.webServicesUrl)\r\n getTermsAndConditions($rootScope.webServicesUrl);\r\n else\r\n $state.go('TopMenuLayout.SignUp.Step1');\r\n }\r\n\r\n function getTermsAndConditions(baseUrl) { \r\n usSpinnerService.spin(\"spinner-1\");\r\n $http({\r\n url: baseUrl + 'api/StaticData/GetTermsAndConditions',\r\n method: 'GET'\r\n }).success(function(data) {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.html = $sce.trustAsHtml(data);\r\n }).error(function() {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n\r\n $scope.TermAndConditionsFormSubmit = function () {\r\n usSpinnerService.spin(\"spinner-1\");\r\n $moduleServices.hideKeyboard();\r\n checkTermAndConditionsFormSubmit();\r\n };\r\n\r\n function checkTermAndConditionsFormSubmit() {\r\n\r\n var language = localStorage.getItem('language');\r\n if (!language)\r\n language = 'en';\r\n\r\n var data = {\r\n AccountNumber: RegistrationInfoService.userInfo.accountnumber,\r\n ZipCode: RegistrationInfoService.userInfo.zip,\r\n Fullname: RegistrationInfoService.userInfo.customerfullname,\r\n UserName: RegistrationInfoService.userInfo.user,\r\n Email: RegistrationInfoService.userInfo.email,\r\n Password: RegistrationInfoService.userInfo.psw,\r\n SecurityQuestion1: RegistrationInfoService.userInfo.question,\r\n SecurityAnswer1: RegistrationInfoService.userInfo.answer,\r\n Token: RegistrationInfoService.userInfo.token,\r\n TermsAndConditions: $scope.termsAccepted,\r\n EmailNotificationsAccepted: $scope.emailNotificationsAccepted,\r\n Language: language,\r\n Client: isMobileOrRipple() ? utilli.clientEnum.mobileApp : utilli.clientEnum.portal,\r\n Step: 3\r\n };\r\n\r\n $http({\r\n url: $rootScope.serviceUrl,\r\n method: \"POST\",\r\n data: data\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.Errors && response.Errors.length > 0) \r\n $scope.errors = response.Errors;\r\n else \r\n $state.goRelativeTo('SignUp', 'Success');\r\n }\r\n else {\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop(\"spinner-1\");\r\n }).error(function () {\r\n usSpinnerService.stop(\"spinner-1\");\r\n $scope.errors.push(utilli.errors.serverErrorMessage);\r\n });\r\n }\r\n }])\r\n.controller('SignUpSuccessController', ['$scope', '$rootScope', 'CommonDataService', \r\n 'usSpinnerService', '$state',\r\n function ($scope, $rootScope, CommonDataService, usSpinnerService, $state) {\r\n $scope.errors = [];\r\n CommonDataService.getCommonData($rootScope.webServicesUrl)\r\n .then(function (commonData) {\r\n $scope.companyNameLong = commonData.CompanyNameLong;\r\n $scope.companyNameLongWithoutTrailingPeriod = commonData.CompanyNameLongWithoutTrailingPeriod;\r\n $scope.helpEmail = commonData.CompanyHelpEmail;\r\n usSpinnerService.stop('spinner-1');\r\n\r\n $scope.SuccessOk = function () {\r\n $state.goToWelcome();\r\n }\r\n });\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.controller('QuickPayController', ['$scope', '$state', 'CommonHeaderService',\r\n function ($scope, $state, CommonHeaderService) {\r\n var offline = localStorage.getItem('offline')\r\n if (offline === \"1\" && window.location.href.indexOf(\"Maintenance\") == -1)\r\n {\r\n $state.go('Maintenance'); \r\n }\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('QuickPayHeaderController', ['$scope', '$state', 'ServiceProvidersService',\r\n function ($scope, $state, ServiceProvidersService) {\r\n \r\n var firebaseWebPushService;\r\n var apiUrl;\r\n\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n apiUrl = providerData.ApiUrl;\r\n\r\n if(utilli.isFirefox) {\r\n firebaseWebPushService = createFirebaseWebPushService(providerData.ApiUrl);\r\n } \r\n })\r\n .catch(function(){\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.isWebPushBellBoxVisible = function () {\r\n var result = (utilli.isFirefox && Notification.permission == \"default\")\r\n || (utilli.isSafari \r\n && 'safari' in window \r\n && 'pushNotification' in window.safari\r\n && utilli.getSafariPushNotificationPermissionData().permission === 'default');\r\n \r\n return result;\r\n };\r\n\r\n $scope.askPermissionsForWebPush = function () { \r\n if(utilli.isFirefox && !firebaseWebPushService) {\r\n firebaseWebPushService.subscribe($scope);\r\n }\r\n else if ('safari' in window && 'pushNotification' in window.safari) {\r\n utilli.checkSafariRemotePermission($scope, apiUrl, $state.params.accountNumber);\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', '$location', '$http', 'usSpinnerService', 'LeftMenuService',\r\n 'CommonDataService', '$q', 'ServiceProvidersService', 'ModalServiceExt', 'PaymentVerificationService', '$window',\r\n function ($scope, $timeout, $state, $location, $http, usSpinnerService, LeftMenuService, CommonDataService, $q, \r\n ServiceProvidersService, ModalServiceExt, PaymentVerificationService, $window) {\r\n var browser = $window.navigator.userAgent;\r\n\r\n LeftMenuService.setCurrentTab('QuickPay');\r\n //CommonHeaderService.setUpBackButton('Quick Pay');\r\n \r\n $scope.showLoading = true;\r\n\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 $scope.isPayNowEnabled = false;\r\n $scope.isPayNowBtnText = 'Next';\r\n $scope.velocityFee = '';\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 $scope.IsSuccessful = true;\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 function tryInitPageByUrlParams() {\r\n var accountNumber = $state.params.accountNumber;\r\n if(accountNumber) {\r\n $scope.radioSearchType = 'searchByAccount';\r\n $scope.accountNumber = accountNumber;\r\n find();\r\n }\r\n $scope.showLoading = false;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(function (providerData) {\r\n\r\n apiUrl = providerData.ApiUrl;\r\n utilli.resolveServiceProviderApiDeffered(apiUrl);\r\n CommonDataService.getCommonData(apiUrl).then(function (commonData) {\r\n usSpinnerService.stop('spinner-1');\r\n \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 = false;\r\n\r\n if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n $scope.quickPayValidationCaption = _t('Customer Number');\r\n }\r\n \r\n tryInitPageByUrlParams();\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n }\r\n );\r\n },\r\n function(e) {\r\n utilli.rejectServiceProviderApiDeffered();\r\n usSpinnerService.stop('spinner-1');\r\n console.log(e);\r\n ModalServiceExt.showServerError();\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 function loadAccountInfo () { \r\n alert('not implemented');\r\n }\r\n\r\n function resetPayBtn()\r\n {\r\n $scope.isPayNowBtnText = 'Next';\r\n $scope.isPayNowEnabled = false;\r\n $scope.velocityFee = '';\r\n }\r\n\r\n function getVelocityFee(newAmount, type) {\r\n var payAmount = utilli.parsePositiveFloat(newAmount);\r\n if (payAmount <= 0) {\r\n return;\r\n }\r\n \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: apiUrl + 'api/Payment/GetVelocityFee',\r\n\r\n method: \"GET\",\r\n params: { Card: $scope.cardNumber, Amount: $scope.amountDue, \r\n AccountNumber: $scope.accountNumber, Type: type }\r\n }).success(function (res) {\r\n $scope.velocityFee = res.PPIFeeValue;\r\n $scope.isPayNowEnabled = true;\r\n $scope.isPayNowBtnText = 'Pay Now'\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function (res) {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function getSavedInvoiceNumber(contractAccountNumber) {\r\n var deviceInfo = getSavedDeviceInfo(contractAccountNumber);\r\n return deviceInfo ? deviceInfo.invoiceNumber : '';\r\n }\r\n\r\n function getSavedDeviceToken(contractAccountNumber) {\r\n var deviceInfo = getSavedDeviceInfo(contractAccountNumber);\r\n return deviceInfo ? deviceInfo.deviceToken : '';\r\n }\r\n\r\n var deviceInfoKey = 'quick-pay-device-infos';\r\n\r\n function getSavedDeviceInfo(contractAccountNumber) {\r\n try {\r\n var deviceInfosJson = localStorage.getItem(deviceInfoKey);\r\n if (!deviceInfosJson)\r\n return null;\r\n var deviceInfos = JSON.parse(deviceInfosJson);\r\n return deviceInfos ? deviceInfos[contractAccountNumber] : null;\r\n }\r\n catch (e) {\r\n console.error('failed to get deviceInfo. ' + e);\r\n return null;\r\n }\r\n }\r\n\r\n function saveDeviceInfo(contractAccountNumber, invoiceNumber, deviceToken) {\r\n var savedInvoiceNumbers = {};\r\n try {\r\n var savedInvoiceNumbersString = localStorage.getItem(deviceInfoKey);\r\n if (savedInvoiceNumbersString)\r\n savedInvoiceNumbers = JSON.parse(savedInvoiceNumbersString);\r\n } catch (e) {\r\n console.error('failed to save device info. ' + e);\r\n }\r\n savedInvoiceNumbers[contractAccountNumber] = { invoiceNumber: invoiceNumber, deviceToken: deviceToken };\r\n localStorage.setItem(deviceInfoKey, JSON.stringify(savedInvoiceNumbers));\r\n }\r\n\r\n $scope.clear = function () {\r\n $scope.findResultVisible = false;\r\n // $scope.accountNumber = '';\r\n $scope.houseNumber = '';\r\n $scope.streetName = '';\r\n $scope.appartment = '';\r\n $scope.state = '';\r\n $scope.zip = '';\r\n $scope.informationMessage = '';\r\n $scope.invoiceNumber = '';\r\n $scope.invoiceNumberError = false;\r\n $scope.isInformationMessageShown = false;\r\n $scope.errorFromServerReturned = false;\r\n $scope.isPaymentInfoAgreeBank = false;\r\n $scope.isPaymentInfoAgreeCard = false;\r\n };\r\n\r\n $scope.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 function find () {\r\n $scope.findResultVisible = false;\r\n $scope.amountDue = '';\r\n $scope.amountDueDisabled = '';\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.find = find;\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.amountDueDisabled = $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'), \r\n $scope._t('Your account is currently disconnected. After making the payment please contact Customer Service at')\r\n + ' ' \r\n + $scope.convFeeInfo.SupportPhoneNumber);\r\n }\r\n } 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.invoiceNumber = getSavedInvoiceNumber($scope.currentAccount.AccountNumber);\r\n $scope.updateConvinienceFee();\r\n }\r\n\r\n $scope.selectPayByBankAccount = function () {\r\n $scope.stepName = 'payByBankAccount';\r\n $scope.updateConvinienceFee();\r\n }\r\n\r\n $scope.formatTotalAmount = function () {\r\n if ($scope.amountDue == undefined) {\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n\r\n if (isNaN(parseFloat($scope.amountDue))) {\r\n $scope.amountDue = '';\r\n $scope.totalAmount = '';\r\n return;\r\n }\r\n $scope.amountDue = $scope.formatDecimal(parseFloat($scope.amountDue));\r\n }\r\n\r\n $scope.cancelPayment = function () {\r\n $scope.bankAccountFormSubmitted = false;\r\n $scope.cardFormSubmitted = false;\r\n $scope.clear();\r\n $scope.clearPaymentSettings();\r\n resetPayBtn();\r\n $scope.stepName = 'selectPaymentOption';\r\n }\r\n\r\n $scope.payNow = function () {\r\n $scope.stepName = 'processingPayment';\r\n usSpinnerService.spin('spinner-1');\r\n $scope.$apply();\r\n $timeout(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.stepName = 'paymentResult';\r\n }, 3000);\r\n }\r\n\r\n function validateInvoiceNumber() {\r\n var deferred = $q.defer();\r\n\r\n if (utilli.isAdmin) {\r\n deferred.resolve(true);\r\n return deferred.promise;\r\n }\r\n\r\n var requestParams = {};\r\n var requestUrl = '';\r\n var deviceToken = getSavedDeviceToken($scope.currentAccount.AccountNumber);\r\n\r\n if ($scope.quickPayValidationType == 'InvoiceNumber') {\r\n requestParams = { \r\n accountNum: $scope.currentAccount.AccountNumber, \r\n invoiceNum: $scope.invoiceNumber, \r\n deviceToken: deviceToken \r\n };\r\n requestUrl = 'api/Payment/IsInvoiceValid';\r\n }\r\n else if ($scope.quickPayValidationType == 'BusinessPartnerNumber') {\r\n requestParams = { \r\n accountNum: $scope.currentAccount.AccountNumber,\r\n businessPartnerNum: $scope.invoiceNumber,\r\n deviceToken: deviceToken\r\n };\r\n requestUrl = 'api/Payment/IsBusinessPartnerValid';\r\n }\r\n\r\n $http({\r\n url: apiUrl + requestUrl,\r\n method: \"GET\",\r\n params: requestParams\r\n }).success(function(response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n alert(response.Errors[0]);\r\n deferred.reject(false);\r\n } else {\r\n var deviceToken = response.Data;\r\n var isValid = deviceToken != 'invalid';\r\n if (isValid)\r\n saveDeviceInfo($scope.currentAccount.AccountNumber, $scope.invoiceNumber, response.Data);\r\n else\r\n saveDeviceInfo($scope.currentAccount.AccountNumber, '', '');\r\n deferred.resolve(isValid);\r\n }\r\n }).error(function() {\r\n alert($scope._t('Server error. Try again later.'));\r\n deferred.resolve(false);\r\n });\r\n\r\n\r\n return deferred.promise;\r\n }\r\n\r\n $scope.payNowCard = function () {\r\n\r\n if ($scope.payCardAccount_form.cardNumber.$error.ccNumber ||\r\n $scope.payCardAccount_form.amountDue.$error.pattern) {\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 return;\r\n }\r\n\r\n var postPayment = 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 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 dueAmount: $scope.amountDueDisabled,\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 Browser: browser,\r\n ConvenienceFee: $scope.velocityFee\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.IsSuccessful = jsondata.IsSuccessful;\r\n resetPayBtn();\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n }).error(function (data) {\r\n var jsondata = data;\r\n $scope.paymwntResult = jsondata.Message;\r\n $scope.IsSuccessful = jsondata.IsSuccessful;\r\n $scope.stepName = 'paymentResult';\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n if ($scope.isPayNowEnabled)\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n PaymentVerificationService.verifyPaymentInfo($scope.amountDue, function(){\r\n usSpinnerService.spin('spinner-1');// spin it again because it could be stopped in verifyPaymentInfo\r\n validateInvoiceNumber().then(postPayment);\r\n });\r\n }\r\n else\r\n {\r\n getVelocityFee($scope.amountDue, \"1\")\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.bankRoutingNumber == $scope.bankCheckingAccountNumber)\r\n ) {\r\n return;\r\n }\r\n\r\n if ($scope.isPayNowEnabled) {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n PaymentVerificationService.verifyPaymentInfo($scope.amountDue, function () {\r\n usSpinnerService.spin('spinner-1');// spin it again because it could be stopped in verifyPaymentInfo\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 else {\r\n getVelocityFee($scope.amountDue, \"3\")\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 dueAmount: $scope.amountDueDisabled,\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 Browser: browser,\r\n ConvenienceFee: $scope.velocityFee\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.IsSuccessful = jsondata.IsSuccessful;\r\n resetPayBtn();\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.IsSuccessful = data.IsSuccessful;\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 $scope.IsSuccessful = true;\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 $state.go('TopMenuLayout.SignUp.Step1', { \r\n accountnumber: $scope.currentAccount.AccountNumber, \r\n customerfullname: $scope.currentAccount.CustomerFullName, \r\n zip: $scope.currentAccount.Zip.substring(0, 5) \r\n });\r\n }\r\n\r\n}]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.factory('moduleServices',\r\n [\"$rootScope\", function ($rootScope) {\r\n return {\r\n hideKeyboard: function () {\r\n //hide keyboard\r\n document.activeElement.blur();\r\n //$(\"input\").blur(); Yuriy Sokha: with operation leads to error in brouser console; todo\r\n },\r\n\r\n setError: function (message) {\r\n $rootScope.errors = [{ Message: message }];\r\n },\r\n\r\n setErrors: function (errors) {\r\n $rootScope.errors = errors;\r\n }\r\n };\r\n }]);\r\n\r\napp.controller('ForgotUserIdController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n $rootScope.SecureData = {\r\n userNameOrEmail: ''\r\n };\r\n $rootScope.serviceUrl = '';\r\n }]);\r\n\r\napp.controller('ForgotUserIdStep1Controller', ['$scope', '$rootScope', '$http', '$state', 'moduleServices',\r\n 'ServiceProvidersService', 'usSpinnerService',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, ServiceProvidersService, usSpinnerService) {\r\n\r\n // this hack fixes a select element behavior in mobile (changing selected options).\r\n var allSelectElements = document.getElementsByTagName('select');\r\n for (var i = 0; i < allSelectElements.length; i++) {\r\n allSelectElements[i].addEventListener('touchstart', function (e) {\r\n //This is the important line\r\n e.stopPropagation();\r\n }, false);\r\n }\r\n\r\n $scope.showCsrLink = DeploymentSettings.currentServiceProvider != Config.hcProviderName;\r\n $scope.providers = [];\r\n $scope.provider = {};\r\n $rootScope.errors = [];\r\n\r\n $scope.isProviderListVisible = !DeploymentSettings.currentServiceProvider;\r\n if ($scope.isProviderListVisible) {\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(allProviders) {\r\n $scope.providers = allProviders;\r\n $scope.provider = allProviders[0];\r\n },\r\n function() {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n else{\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(\r\n function(providerData){\r\n $scope.provider = providerData;\r\n },\r\n function(){\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n\r\n $scope.CheckUserInfoFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmCheckUserInfo.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $rootScope.serviceUrl = $scope.provider.ApiUrl;\r\n $rootScope.appUrl = $scope.provider.ApiUrl;\r\n $rootScope.SecureData.userNameOrEmail = $.trim($scope.Email);\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $http({\r\n url: $rootScope.serviceUrl + 'api/Account/CheckForgotUserIdStep1/',\r\n method: \"GET\",\r\n params: {\r\n email: $.trim($scope.Email),\r\n zip: $.trim($scope.ZipCode)\r\n }\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.ERROR_LIST && response.ERROR_LIST.length > 0) {\r\n $moduleServices.setErrors(response.ERROR_LIST);\r\n } else {\r\n $rootScope.SecurityQuestion = response.SecurityQuestions[0].Message;\r\n $state.go('^.Step2');\r\n }\r\n } else {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\r\n\r\napp.controller('ForgotUserIdStep2Controller', ['$scope', '$rootScope', '$http', '$state',\r\n 'moduleServices', 'usSpinnerService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService, ModalServiceExt) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n $rootScope.errors = [];\r\n\r\n $scope.SecurityQuestion = $rootScope.SecurityQuestion;\r\n $scope.CheckSecurityAnswerFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmSecurityAnswer.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $rootScope.errors = [];\r\n $http({\r\n url: $rootScope.serviceUrl + 'api/Account/CheckForgotUserIdStep2/',\r\n method: \"GET\",\r\n params: {\r\n email: $rootScope.SecureData.userNameOrEmail,\r\n securityAnswer: $.trim($scope.SecurityAnswer)\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.HasErrors) {\r\n $rootScope.errors = [{Message: response.Errors[0]}];\r\n return;\r\n }\r\n\r\n $state.go('^.Success');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\r\n\r\napp.controller('ForgotUserIdSuccessController', ['$scope', '$rootScope', 'CommonDataService', 'usSpinnerService',\r\n '$http', 'moduleServices',\r\n function ($scope, $rootScope, CommonDataService, usSpinnerService, $http, $moduleServices) {\r\n $rootScope.errors = [];\r\n usSpinnerService.spin('spinner-1');\r\n CommonDataService.getCommonData($rootScope.appUrl, true)\r\n .then(function (commonData) {\r\n $scope.contactPhoneNumber = commonData.SupportPhone;\r\n $scope.workingHours = commonData.WorkingHours;\r\n $scope.billingEmailTo = commonData.BillingEmailTo;\r\n $scope.serviceProviderName = commonData.CompanyName;\r\n $scope.billingDepartment = commonData.BillingDepartment;\r\n usSpinnerService.stop('spinner-1');\r\n }, function () {\r\n $moduleServices.setError(\"utilli.errors.serverErrorMessage\");\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }]);\n'use strict';\r\nvar app = angular.module('utilliApp');\r\n\r\napp.directive(\"repeatPassword\",\r\n function() {\r\n return {\r\n require: \"ngModel\",\r\n link: function (scope, elem, attrs, ctrl) {\r\n var otherInput = elem.inheritedData(\"$formController\")[attrs.repeatPassword];\r\n\r\n ctrl.$parsers.push(function (value) {\r\n if (value === otherInput.$viewValue) {\r\n ctrl.$setValidity(\"confirm\", true);\r\n return value;\r\n }\r\n ctrl.$setValidity(\"confirm\", false);\r\n });\r\n\r\n otherInput.$parsers.push(function (value) {\r\n ctrl.$setValidity(\"confirm\", value === ctrl.$viewValue);\r\n return value;\r\n });\r\n }\r\n };\r\n });\r\n\r\napp.factory('moduleServices',\r\n [\"$rootScope\", function ($rootScope) {\r\n return {\r\n hideKeyboard: function () {\r\n //hide keyboard\r\n document.activeElement.blur();\r\n //$(\"input\").blur(); Yuriy Sokha: with operation leads to error in brouser console; todo\r\n },\r\n\r\n setError: function (message) {\r\n $rootScope.errors = [{Message: message}];\r\n },\r\n\r\n setErrors: function (errors) {\r\n $rootScope.errors = errors;\r\n }\r\n };\r\n }]);\r\n\r\napp.controller('ForgotPasswordController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.cancel = function () {\r\n $state.goToWelcome();\r\n };\r\n\r\n $scope.goToCsr = function (){\r\n $state.go('ForgotPasswordCsr');\r\n }\r\n\r\n $scope.SecureData = {\r\n userNameOrEmail: '',\r\n zipCode: '',\r\n pstrAccountNumber: '',\r\n securityAnswer: '',\r\n password: '',\r\n confirmpassword: '',\r\n actionEvent: 'ForgotPassword'\r\n };\r\n\r\n $rootScope.serviceUrl = '';\r\n $rootScope.webServicesUrl = '';\r\n }]);\r\n\r\napp.controller('ForgotPasswordStep1Controller', ['$scope', '$rootScope', '$http', '$state',\r\n 'moduleServices', 'ServiceProvidersService', 'usSpinnerService',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, ServiceProvidersService, usSpinnerService) {\r\n\r\n // this hack fixes a select element behavior in mobile (changing selected options).\r\n var allSelectElements = document.getElementsByTagName('select');\r\n for (var i = 0; i < allSelectElements.length; i++) {\r\n allSelectElements[i].addEventListener('touchstart', function (e) {\r\n //This is the important line\r\n e.stopPropagation();\r\n }, false);\r\n }\r\n\r\n $scope.showCsrLink = DeploymentSettings.currentServiceProvider != Config.hcProviderName;\r\n $scope.providers = [];\r\n $scope.provider = {};\r\n $rootScope.errors = [];\r\n $scope.isProviderListVisible = !DeploymentSettings.currentServiceProvider;\r\n if ($scope.isProviderListVisible) {\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function(allProviders){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.providers = allProviders;\r\n $scope.provider = allProviders[0];\r\n },\r\n function(){\r\n usSpinnerService.stop('spinner-1');\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n else{\r\n usSpinnerService.spin('spinner-1');\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(\r\n function(providerData){\r\n usSpinnerService.stop('spinner-1');\r\n $scope.provider = providerData;\r\n },\r\n function(){\r\n usSpinnerService.stop('spinner-1');\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n );\r\n }\r\n\r\n $scope.CheckUserInfoFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmCheckUserInfo.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $rootScope.webServicesUrl = $scope.provider.ApiUrl;\r\n $scope.SecureData.userNameOrEmail = $.trim($scope.SecureData.userNameOrEmail);\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/Account/CheckForgotPasswordStep1/',\r\n method: \"GET\",\r\n params: {\r\n userNameOrEmail: $.trim($scope.SecureData.userNameOrEmail),\r\n zip: $.trim($scope.SecureData.zipCode)\r\n }\r\n }).success(function (response) {\r\n if (response) {\r\n if (response.ERROR_LIST && response.ERROR_LIST.length > 0) {\r\n $moduleServices.setErrors(response.ERROR_LIST);\r\n } else {\r\n $scope.SecureData.securityQuestion = response.SecurityQuestions[0].Message;\r\n\r\n $state.go('^.Step2');\r\n }\r\n } else {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\r\n\r\napp.controller('ForgotPasswordStep2Controller', ['$scope', '$rootScope', '$http', '$state',\r\n 'moduleServices', 'usSpinnerService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, $state, $moduleServices, usSpinnerService, ModalServiceExt) {\r\n\r\n usSpinnerService.stop('spinner-1');\r\n $rootScope.errors = [];\r\n\r\n $scope.CheckSecurityAnswerFormSubmit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmSecurityAnswer.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n $rootScope.errors = [];\r\n usSpinnerService.spin('spinner-1');\r\n $scope.SecureData.securityAnswer = $.trim($scope.SecureData.securityAnswer);\r\n forgotPasswordValidation();\r\n };\r\n\r\n function forgotPasswordValidation() {\r\n $http({\r\n url: $rootScope.webServicesUrl + 'api/Account/CheckForgotPasswordStep2/',\r\n method: \"GET\",\r\n params: {\r\n userNameOrEmail: $scope.SecureData.userNameOrEmail,\r\n securityAnswer: $scope.SecureData.securityAnswer\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n return;\r\n }\r\n\r\n $state.go('^.Success');\r\n }).error(function () {\r\n $moduleServices.setError(utilli.errors.serverErrorMessage);\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('ForgotPasswordByEmailController', ['$scope', '$rootScope', '$window', '$state', 'CommonHeaderService',\r\n function ($scope, $rootScope, $window, $state, CommonHeaderService) {\r\n CommonHeaderService.hideMenuToggleButton();\r\n $scope.model = {\r\n from: '',\r\n userId: '',\r\n securityQuestion: '',\r\n securityAnswer: '',\r\n provider: {}\r\n };\r\n\r\n $scope.cancel = function () {\r\n if ($scope.model.from)\r\n $state.go($scope.model.from);\r\n else\r\n $state.goToWelcome();\r\n };\r\n}])\r\n.controller('ForgotPasswordByEmailStep1Controller', ['$scope', '$rootScope', '$http', '$state', '$stateParams',\r\n 'ServiceProvidersService', 'moduleServices', 'ModalServiceExt', 'usSpinnerService',\r\n function ($scope, $rootScope, $http, $state, $stateParams, ServiceProvidersService, $moduleServices, ModalServiceExt, usSpinnerService) {\r\n\r\n $scope.model.from = $stateParams.from;\r\n\r\n if (!DeploymentSettings.currentServiceProvider) {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n ServiceProvidersService.getProviders()\r\n .then(\r\n function (allProviders) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.providers = allProviders;\r\n $scope.model.provider = allProviders[0];\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n } else {\r\n ServiceProvidersService.getCurrentProvider()\r\n .then(\r\n function (providerData) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.model.provider = providerData;\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n \r\n $scope.submit = function () {\r\n $moduleServices.hideKeyboard();\r\n if (!$scope.frmCheckUserInfo.$valid) {\r\n $scope.submitted = true;\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: $scope.model.provider.ApiUrl + 'api/Account/CheckForgotPasswordByEmail/',\r\n method: \"GET\",\r\n params: {\r\n userName: $.trim($scope.UserId),\r\n email: $.trim($scope.Email)\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n $scope.model.userId = $scope.UserId;\r\n $scope.model.securityQuestion = response.Data;\r\n $state.go('TopMenuLayout.ForgotPasswordByEmail.Success');\r\n }\r\n \r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n };\r\n}])\r\n.controller('ForgotPasswordByEmailSuccessController', ['$scope', '$state', function ($scope, $state) {\r\n $scope.goToWelcome = function () {\r\n if ($scope.model.from)\r\n $state.go($scope.model.from);\r\n else\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.getProvider(Config.currentServiceProvider)\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(\"Avg. 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(\"Avg. 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 var resizeAction = function () {\r\n $scope.createAllCharts($scope.data);\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', resizeAction);\r\n }\r\n } else {\r\n ModalServiceExt.showError($scope._t(\"Error occurred during consumption retrieval.\"));\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.$on(\"$destroy\", function () {\r\n angular.element($window).off('resize', resizeAction);\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 successfully 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 successfully 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 successfully 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.isHc = utilli.isHc();\r\n\r\n $scope.units = UnitsService;\r\n $scope.config = Config;\r\n if ($state.current.name == 'MainLayout.Usage') {\r\n LeftMenuService.setCurrentTab('Usage');\r\n }\r\n CommonHeaderService.setUpNotificationButton();\r\n $scope.isExportToExcelButtonVisible = !isMobileOrRipple();\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 var 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 getGraph();\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 startSpin();\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: { }\r\n }).success(function (response) {\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n stopSpin();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n var url = utilli.getFileUrlWithToken(response.Data);\r\n utilli.downloadFile(url, \"Payments.xlsx\");\r\n }\r\n stopSpin();\r\n }).error(function (error) {\r\n stopSpin();\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n $scope.getGreenButtonData = function () {\r\n var apiUrl = localStorage.getItem('ApiUrl') + 'api/Consumption/GenerateGreenButtonData/'\r\n + '?AccountNumber=' + localStorage.getItem('CurrentAccountNumber');\r\n startSpin();\r\n $http({\r\n url: apiUrl,\r\n method: \"GET\",\r\n params: {}\r\n }).success(function (response) {\r\n if (response == undefined || response.HasErrors == undefined) {\r\n ModalServiceExt.showServerError();\r\n stopSpin();\r\n return;\r\n }\r\n if (response.HasErrors) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n }\r\n else {\r\n var url = utilli.getFileUrlWithToken(response.Data);\r\n utilli.downloadFile(url, \"Payments.xlsx\");\r\n }\r\n stopSpin();\r\n }).error(function (error) {\r\n stopSpin();\r\n ModalServiceExt.showError(error.Message);\r\n });\r\n }\r\n\r\n /***\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.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 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 consumption retrieval.\"));\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 for (var i = 0; i < tableData.length; i++) {\r\n var reading = tableData[i];\r\n // add item in the table under the chart\r\n var tableDataItem = _.find($scope.tableData, function(item) { return item.date == reading.ReadingDateForTable });\r\n if (tableDataItem) {\r\n tableDataItem.consumption += reading.Consumption;\r\n tableDataItem.registers = tableDataItem.registers || [ { \r\n registerNum: tableDataItem.registerNum, \r\n consumption: tableDataItem.consumption} ];\r\n tableDataItem.registers.push({\r\n registerNum: reading.RegisterNumber,\r\n consumption: reading.Consumption\r\n });\r\n } else {\r\n tableDataItem = {};\r\n tableDataItem.date = reading.ReadingDateForTable;\r\n tableDataItem.amountString = utilli.formatCurrency(reading.Amount);\r\n tableDataItem.registerNum = reading.RegisterNumber;\r\n tableDataItem.consumption = reading.Consumption;\r\n tableDataItem.averageMonthlyTemperature = reading.MonthAverageTemperature;\r\n if (tableDataItem.averageMonthlyTemperature == \"-99\") {\r\n tableDataItem.averageMonthlyTemperature = \"\";\r\n reading.AverageMonthlyTemperature = null;\r\n }\r\n tableDataItem.unit = reading.Unit;\r\n // insert tableDataItem to the beginning of the array because elements were sorted by ReadingDate desc.\r\n $scope.tableData.unshift(tableDataItem);\r\n }\r\n }\r\n\r\n $scope.createChart();\r\n };\r\n\r\n $scope.getConsumptionString = function(consumptionHistoryItem){\r\n var selectedFraction = Config.getConsumptionUnitFraction($scope.units.selectedUnitsType.name);\r\n var sourceFraction = Config.getConsumptionUnitFraction(consumptionHistoryItem.unit)\r\n var number = consumptionHistoryItem.consumption * selectedFraction / sourceFraction;\r\n return utilli.formatNumber(number);\r\n }\r\n\r\n /**\r\n * converts consumption units for the graph data\r\n * (for example ccf -> gallons)\r\n * @param graphPoints points for the chart\r\n * @param targetUnitsType target type of the consumption units\r\n * @param sourceUnitsType source type of the consumption units\r\n * @returns {Array|*} cloned graphPoints with converted consumption values\r\n */\r\n function convertUnits(graphPoints, targetUnitsType, sourceUnitsType) {\r\n var consumptionUnits = $scope.units.currentUnits;\r\n var targetFraction = consumptionUnits[targetUnitsType];\r\n var sourceFraction = consumptionUnits[sourceUnitsType];\r\n var coefficient = targetFraction / sourceFraction;\r\n var graphData = $.map(graphPoints, function (item) {\r\n var clone = $.extend({}, item);\r\n var stringFixed = (clone.Consumption * coefficient).toFixed(2);\r\n clone.Consumption = parseFloat(stringFixed);\r\n clone.Unit = targetUnitsType;\r\n return clone;\r\n });\r\n return graphData;\r\n }\r\n\r\n var convertChartUnits = function(graphPoints){\r\n if (!$scope.graphPoints || $scope.graphPoints.length === 0)\r\n return [];\r\n var unitsType = $scope.units.getSelectedUnitsTypeName();\r\n var sourceUnitsType = $scope.graphPoints[0].Unit;\r\n return convertUnits(graphPoints, unitsType, sourceUnitsType);\r\n }\r\n\r\n var buildSeries = function(){\r\n var result = [\r\n {\r\n name: _t('Consumption'),\r\n data: [],\r\n tooltip: {\r\n headerFormat: '',\r\n pointFormatter: function (){\r\n return '
' + this.unit + ': ' + utilli.formatNumber(this.y) +'';\r\n }\r\n },\r\n yAxis: 1\r\n },\r\n {\r\n type: 'spline',\r\n name: _t('Amount'),\r\n data: [],\r\n tooltip: {\r\n pointFormatter: function () {\r\n return utilli.formatCurrency(this.y);\r\n },\r\n headerFormat: ''\r\n }\r\n }\r\n ];\r\n if(!$scope.isHc) {\r\n result.push({\r\n type: 'spline',\r\n name: _t('Average Temperature'),\r\n data: [],\r\n tooltip: {\r\n pointFormat: '{point.y}F (' + _t('Range') + ': {point.low}F-{point.high}F)',\r\n headerFormat: ''\r\n },\r\n yAxis: 2\r\n });\r\n result.push({\r\n name: _t('Temperature Range'),\r\n type: 'errorbar',\r\n data: [],\r\n enableMouseTracking: false,\r\n yAxis: 2\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n var buildChart = function (series) {\r\n $scope.chart = Highcharts.chart('chart', {\r\n credits: {\r\n enabled: false\r\n },\r\n 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.formatCurrency(this.value);\r\n }\r\n },\r\n title: {\r\n text: _t('Amount')\r\n },\r\n min: 0\r\n }, {\r\n 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 exporting: {\r\n enabled: false\r\n },\r\n series: series\r\n });\r\n }\r\n\r\n /**\r\n * plots the chart using data points from the $scope\r\n */\r\n $scope.createChart = function() {\r\n var graphData = convertChartUnits($scope.graphPoints);\r\n \r\n var consumptionReadingIndex = 0;\r\n var amountIndex = 1;\r\n var averageTemperatureIndex = 2;\r\n var temperatureRangeIndex = 3;\r\n\r\n var series = buildSeries();\r\n\r\n var categories = [];\r\n\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 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 if(!$scope.isHc) {\r\n series[averageTemperatureIndex].data.push({\r\n name: item.ReadingDateForGraphCategory,\r\n y: item.MonthAverageTemperature,\r\n low: item.MonthMinTemperature,\r\n high: item.MonthMaxTemperature\r\n });\r\n\r\n series[temperatureRangeIndex].data.push({\r\n name: item.ReadingDateForGraphCategory,\r\n low: item.MonthMinTemperature,\r\n high: item.MonthMaxTemperature\r\n });\r\n }\r\n });\r\n\r\n buildChart(series);\r\n }\r\n\r\n var startSpin = function () {\r\n usSpinnerService.spin('spinner-1');\r\n };\r\n\r\n var stopSpin = function () {\r\n usSpinnerService.stop('spinner-1');\r\n };\r\n\r\n setTimeout(function () {\r\n // render chart after left menu. otherwise the width of the chart will be calculated wrong\r\n 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').service('PaymentVerificationService', ['CommonDataService', 'ModalServiceExt',\r\n 'usSpinnerService',\r\n function (CommonDataService, ModalServiceExt, usSpinnerService) {\r\n var _t = utilli._t;\r\n var svc = {};\r\n /** checks that payment amount is not beyond max limit */\r\n svc.verifyPaymentInfo = function (amount, callback) {\r\n CommonDataService.getCommonData().then(function (data) {\r\n if (amount > data.MaxPaymentAmount) {\r\n if (data.CanConfirmMaxPaymentAmount) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showYesNoMessage(_t(\"Please Confirm\"), data.MaxPaymentAmountWarningText, callback);\r\n }\r\n else {\r\n ModalServiceExt.showError(data.MaxPaymentAmountErrorText);\r\n }\r\n }\r\n else {\r\n if (callback)\r\n callback();\r\n }\r\n });\r\n };\r\n return svc;\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 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/Utilli-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 var specialCharacktersRegexp = /^[a-zA-Z0-9 '.&-]{1,}$/;\r\n\r\n $scope.nameValid = true;\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 if($scope.name && !specialCharacktersRegexp.test($scope.name))\r\n {\r\n $scope.nameValid = 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('PaymentHistoryItemController', ['$scope', function ($scope) {\r\n // $scope._t is used in PaymentHistoryItem.html\r\n $scope._t = utilli._t;\r\n\r\n $scope.isHc = utilli.isHc();\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: 'PaymentHistoryItemController'\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', 'ModalServiceExt',\r\nfunction ($scope, $http, $state, $stateParams, usSpinnerService, CommonDataService, ServiceProvidersService,\r\n ModalServiceExt) {\r\n var _t = $scope._t;\r\n $scope.isLoading = true;\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 validateToken();\r\n }, function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n });\r\n },\r\n function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n });\r\n\r\n function validateToken () {\r\n \r\n usSpinnerService.spin('spinner-1');\r\n\r\n var url = apiUrl + 'api/User/ValidateToken';\r\n var requestData = {\r\n Token: $stateParams.token\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 $scope.isLoading = false;\r\n }\r\n }).error(function () {\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n \r\n $scope.errors = {};\r\n\r\n if (!$stateParams.token) {\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n return;\r\n }\r\n\r\n $scope.model = {};\r\n $scope.model.newPassword = '';\r\n $scope.model.confirmNewPassword = '';\r\n\r\n resetErrors();\r\n\r\n $scope.passRequirements = [$scope._t('Loading...')];\r\n\r\n $scope.changePassword = function () {\r\n resetErrors();\r\n\r\n if (!validate()) {\r\n utilli.scrollTop();\r\n return;\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var url = apiUrl + 'api/User/ResetPassword';\r\n var requestData = {\r\n Token: $stateParams.token,\r\n NewPassword: $scope.model.newPassword,\r\n ConfirmPassword: $scope.model.confirmNewPassword\r\n };\r\n\r\n $http({\r\n url: url,\r\n method: 'POST',\r\n data: requestData\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (data.Errors != null && data.Errors.length > 0)\r\n $scope.errors.serverErrors = data.Errors;\r\n else {\r\n ModalServiceExt.showInfo(_t('Password was successfully changed.'), function () {\r\n if (utilli.hasAgentRole($stateParams.token)){\r\n $state.goToAgentsWelcome();\r\n }\r\n else{\r\n $state.goToWelcome();\r\n }\r\n });\r\n }\r\n }).error(function () {\r\n $scope.errors.serverErrors = [$scope._t(\"Service is unavailable now. Try again later.\")];\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n \r\n };\r\n\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 = new Date();\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.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 $scope.goTo = function(state, params) {\r\n $state.goMainLayout(state, params || {}, { reload: state });\r\n }\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 successfully enrolled.\");\r\n else\r\n ModalServiceExt.showInfo(\"Program is successfully 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 $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 successfully 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 usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollSmsNotifications',\r\n method: 'POST',\r\n params: utilli.addUserName($state)\r\n }).success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n loadSettings();\r\n });\r\n }).error(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 $scope.unenrollEmailNotifications = function () {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollEmailNotifications',\r\n method: 'POST',\r\n params: utilli.addUserName($state)\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n loadSettings();\r\n });\r\n }).error(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 $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 successfully 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 enrollRoundUpDonation(!$scope.programs.Donation.IsEnrolled);\r\n }\r\n\r\n function enrollRoundUpDonation (setEnrolled) {\r\n var params = {\r\n contractAccountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n setEnrolled: setEnrolled\r\n };\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 usSpinnerService.stop('spinner-1');\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 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('Program Information'));\r\n\r\n function loadSettings(withoutCache){\r\n usSpinnerService.spin('spinner-1');\r\n ProgramEnrollmentsSettings\r\n .getSettings('Donation', withoutCache)\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 loadSettings(false);\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 successfully 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 enrollRoundUpDonation(!$scope.program.IsEnrolled);\r\n }\r\n\r\n function enrollRoundUpDonation (setEnrolled) {\r\n var params = {\r\n contractAccountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n setEnrolled: setEnrolled\r\n };\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 usSpinnerService.stop('spinner-1');\r\n utilli.handleAjaxResponse(response, ModalServiceExt, function () {\r\n loadSettings(true);\r\n });\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('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('Program Info'));\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 $scope.goTo = function(state, params) {\r\n $state.goMainLayout(state, params || {}, { reload: state });\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 params: utilli.addUserName($state)\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 have successfully enrolled'));\r\n } else {\r\n sendRequest(\r\n localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollSmsNotifications',\r\n $scope._t('You have successfully 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', '$state',\r\n function($http, $q, ModalServiceExt, $state) {\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: utilli.addUserName($state, { caNumber: localStorage.getItem('CurrentAccountNumber') })\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('Program Info'));\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 have successfully enrolled'));\r\n } else {\r\n sendRequest(\r\n localStorage.getItem('ApiUrl') + 'api/ProgramEnrollments/UnenrollEmailNotifications',\r\n $scope._t('You have successfully 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 params: utilli.addUserName($state)\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 successfully 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 $scope.isIosMobile = isMobileOrRipple() && iOS();\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 successfully 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 successfully 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 $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 $scope.screen = $window.screen;\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 if (item.param === 'donation' && $stateParams.donationParam === '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' && $stateParams.donationParam !== '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', '$sce',\r\n function ($scope, $rootScope, $state, $http, avatarsService, $window, usSpinnerService, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, CommonDataService, NotificationBoxService, $sce)\r\n {\r\n var _t = $scope._t;\r\n LeftMenuService.setCurrentTab('Profile');\r\n\r\n // i save original phone number (that was before the user did any updates on the page) in this variable\r\n // to be able to detect if the user has changed the phone number. because if he has changed it then we need\r\n // to inform him that form SMS subscription he needs to confirm his phone number again.\r\n var originalPhoneNumber = '';\r\n $scope.customerPrefUrl = '';\r\n $scope.enableVerifyDiv = false;\r\n $scope.otpError = false;\r\n $scope.otp = '';\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.otpErrors = [];\r\n $scope.enableLanguagePack = utilli.isLanguagePackEnabled();\r\n $scope.isAdmin = utilli.hasAdminOrCsrRole();\r\n\r\n var currentUser = localStorage.getItem('current_user');\r\n\r\n CommonDataService.getCommonData().then(function (data) {\r\n $scope.mailingAddressDisabled = !data.EnableMailingAddress;\r\n $scope.EnableProfileNameChange = data.EnableProfileNameChange;\r\n $scope.BillingEmailTo = data.BillingEmailTo;\r\n $scope.FullCustomerServiceInfo = data.FullCustomerServiceInfo;\r\n $scope.EnableSmsPayments = data.EnableSmsPayments;\r\n $scope.isPoBoxEnabled = data.IsPoBoxEnabled;\r\n $scope.phoneNumberSubscriptionText = data.EnableSmsPayments \r\n ? _t('Register to receive SMS notifications and make bill payments using mobile phone:')\r\n : _t('Register to receive SMS notifications:');\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 addOtpErrors(errors) {\r\n $.merge($scope.otpErrors, 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 function clearOtpErrors() {\r\n $scope.otpErrors = [];\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 originalPhoneNumber = data.AccountData.PrimaryPhoneNumber;\r\n // save full name to check if it's changed because we need to show a message to the user that \r\n // if he logs out then he will be locked.\r\n $scope.initialFullName = data.AccountData.FirstAndLastNameOrCompanyName;\r\n $scope.profile.PrimaryPhoneNumber = utilli.adjustPhoneNumber($scope.profile.PrimaryPhoneNumber);\r\n\r\n avatarsService.setCurrentAvatar(apiUrl + data.AvatarURL);\r\n usSpinnerService.stop('spinner-1');\r\n $scope.getCustomerPrefLink();\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.getCustomerPrefLink = 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/GetPreferenceLink/',\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 $scope.customerPrefUrl = $sce.trustAsResourceUrl(data.Url);\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.onIframeLoad = function(obj) {\r\n console.log(obj.toString())\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 $scope.getProfileData();\r\n };\r\n\r\n $scope.toUserInfo = function () {\r\n $scope.accountInfoActive = false;\r\n resetErrors();\r\n $scope.getProfileData();\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.openCustomerPrefUrl = function () {\r\n window.open($scope.customerPrefUrl, '_blank');\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 clearOtpErrors();\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.nameError = 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 $scope.otpError = false;\r\n };\r\n function updateProfileData (){\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 = postData.PrimaryPhoneNumber == null \r\n ? null : 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 $scope.enableVerifyDiv = false;\r\n var message = $scope._t('Your profile has been saved.');\r\n if ($scope.initialFullName.toUpperCase() != $scope.profile.FirstAndLastNameOrCompanyName.toUpperCase()){\r\n message += \" \" + $scope._t('Once you log off your account will be locked for back office '\r\n + 'processing, please allow 24 hours before logging back on. If you have any '\r\n + 'payments that are due now, please ensure that you make them prior to logging off. If '\r\n + 'your account is still locked after 24 hours, please contact Customer Service at '\r\n + '%supportEmail% or %fullCustomerServiceInfo%')\r\n .replace('%supportEmail%', $scope.BillingEmailTo)\r\n .replace('%fullCustomerServiceInfo%', $scope.FullCustomerServiceInfo);\r\n }\r\n ModalServiceExt.showInfo(message);\r\n }\r\n if ($scope.profile.PrimaryPhoneNumber !== \"\")\r\n NotificationBoxService.setSubscribeSmsVisibilityServerFlag(false);\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 $scope.save = function (validatePhone) {\r\n resetErrors();\r\n //\r\n // function updateProfileData (){\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 = postData.PrimaryPhoneNumber == null \r\n // ? null : 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 // $scope.enableVerifyDiv = false;\r\n // var message = $scope._t('Your profile has been saved.');\r\n // if ($scope.initialFullName.toUpperCase() != $scope.profile.FirstAndLastNameOrCompanyName.toUpperCase()){\r\n // message += \" \" + $scope._t('Once you log off your account will be locked for back office '\r\n // + 'processing, please allow 24 hours before logging back on. If you have any '\r\n // + 'payments that are due now, please ensure that you make them prior to logging off. If '\r\n // + 'your account is still locked after 24 hours, please contact Customer Service at '\r\n // + '%supportEmail% or %fullCustomerServiceInfo%')\r\n // .replace('%supportEmail%', $scope.BillingEmailTo)\r\n // .replace('%fullCustomerServiceInfo%', $scope.FullCustomerServiceInfo);\r\n // }\r\n // ModalServiceExt.showInfo(message);\r\n // }\r\n // if ($scope.profile.PrimaryPhoneNumber !== \"\")\r\n // NotificationBoxService.setSubscribeSmsVisibilityServerFlag(false);\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 // var valid = validate(validatePhone);\r\n // if (!valid) {\r\n // addUserInfoError(utilli.errors.validationErorrsMessage);\r\n // utilli.scrollTop();\r\n // return;\r\n // }\r\n\r\n function sendEmailOtp (){\r\n // if (!$scope.otp) {\r\n // $scope.otpError = true;\r\n // valid = false;\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 = postData.PrimaryPhoneNumber == null \r\n ? null : countryCode + postData.PrimaryPhoneNumber;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Profile/SendEmailOtp/',\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 if (data.Result)\r\n {\r\n if (data.Result == \"allowed\")\r\n {\r\n updateProfileData();\r\n }\r\n else\r\n {\r\n var message = $scope._t(data.Result);\r\n ModalServiceExt.showInfo(message);\r\n $scope.enableVerifyDiv = true;\r\n }\r\n }\r\n else\r\n {\r\n var message = $scope._t('Saved successfully.');\r\n ModalServiceExt.showInfo(message);\r\n }\r\n }\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 if (!utilli.arePhoneNumbersEqual(originalPhoneNumber, $scope.profile.PrimaryPhoneNumber) && \r\n $scope.profile.SubscribeForSmsNotification == '1') {\r\n var noCallback = function () {\r\n // do nothing\r\n };\r\n ModalServiceExt.showYesNoMessage(_t('Warning'), _t('Since you changed your phone number we must unregister you from SMS notifications. You will need to register for SMS notifications with the updated phone number. Do you want to continue?'),\r\n function () {\r\n $scope.profile.SubscribeForSmsNotification = '0';\r\n updateProfileData();\r\n }, noCallback, false, noCallback);\r\n }\r\n else {\r\n // updateProfileData();\r\n sendEmailOtp();\r\n }\r\n };\r\n\r\n $scope.verify = function () {\r\n resetErrors();\r\n function verifyEmailOtp (){\r\n if (!$scope.otp) {\r\n $scope.otpError = true;\r\n valid = false;\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var requestData = { accountNumber: accountNumber, username: $scope.profile.userId, otp: $scope.otp };\r\n $http({\r\n url: apiUrl + 'api/Profile/VerifyEmailOtp/',\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 addOtpErrors(data.Errors);\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n else if (data.Result == \"success\")\r\n {\r\n usSpinnerService.stop('spinner-1');\r\n updateProfileData();\r\n }\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 // function updateProfileData (){\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 = postData.PrimaryPhoneNumber == null \r\n // ? null : 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 // $scope.enableVerifyDiv = false;\r\n // var message = $scope._t('Your profile has been saved.');\r\n // if ($scope.initialFullName.toUpperCase() != $scope.profile.FirstAndLastNameOrCompanyName.toUpperCase()){\r\n // message += \" \" + $scope._t('Once you log off your account will be locked for back office '\r\n // + 'processing, please allow 24 hours before logging back on. If you have any '\r\n // + 'payments that are due now, please ensure that you make them prior to logging off. If '\r\n // + 'your account is still locked after 24 hours, please contact Customer Service at '\r\n // + '%supportEmail% or %fullCustomerServiceInfo%')\r\n // .replace('%supportEmail%', $scope.BillingEmailTo)\r\n // .replace('%fullCustomerServiceInfo%', $scope.FullCustomerServiceInfo);\r\n // }\r\n // ModalServiceExt.showInfo(message);\r\n // }\r\n // if ($scope.profile.PrimaryPhoneNumber !== \"\")\r\n // NotificationBoxService.setSubscribeSmsVisibilityServerFlag(false);\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 verifyEmailOtp();\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 var noCallback = function(){\r\n $scope.profile.SubscribeForSmsNotification = '0';\r\n }\r\n ModalServiceExt.showYesNoMessage(_t('Confirm Phone Number'), \r\n _t('To subscribe for SMS notifications you need to confirm your phone number. Do you want to continue?'), \r\n function(){\r\n $state.goMainLayout('MobilePhoneConfirmation', { phoneNumber: $scope.profile.PrimaryPhoneNumber });\r\n },\r\n noCallback, false, noCallback\r\n );\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 function validate(validatePhone) {\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 Full Name is editable (for example, Howard County)\r\n if ($scope.EnableProfileNameChange && !$scope.profile.FirstAndLastNameOrCompanyName) {\r\n $scope.nameError = true;\r\n valid = false;\r\n }\r\n\r\n if (validatePhone && !$scope.profile.PrimaryPhoneNumber){\r\n $scope.phoneNumberError = true;\r\n valid = false;\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 // in HC PoBox is not used and house number is not required\r\n if ($scope.isPoBoxEnabled){\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 else {\r\n // but in street name in HC is required!\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.profile.City) {\r\n $scope.cityError = true;\r\n valid = false;\r\n } else {\r\n // todo: moved to server side to unify validation, for PCI DSS fix\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 // todo: moved to server side to unify validation, for PCI DSS fix\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 var _t = $scope._t;\r\n \r\n CommonHeaderService.setUpBackButton(_t('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.forAssistant)\r\n result = 'AssistantProfile';\r\n else if ($stateParams.forPropertyManager)\r\n result = 'PropertyManagerProfile';\r\n return result;\r\n }\r\n }])\r\n app.directive('iframeSetDimensionsOnload', [\"$window\", function($window) {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n \r\n var contentMinWidth = 1200;\r\n \r\n element.on('load', setSizeWithZoom());\r\n \r\n angular.element($window).bind('resize', function() {\r\n setSizeWithZoom();\r\n scope.$digest();\r\n });\r\n \r\n function setSize() {\r\n var iFrameWidth = element[0].contentWindow.parent.document.body.offsetWidth;\r\n var iFrameHeight = element[0].contentWindow.parent.document.body.offsetHeight;\r\n element.css('width', iFrameWidth + 'px');\r\n element.css('height', iFrameHeight + 'px');\r\n }\r\n \r\n function setSizeWithZoom() {\r\n if (element[0].contentWindow) {\r\n var iFrameWidth = element[0].contentWindow.parent.document.body.offsetWidth;\r\n var iFrameHeight = element[0].contentWindow.parent.document.body.offsetHeight;\r\n\r\n var scale = iFrameWidth / contentMinWidth;\r\n scale = scale > 1 ? 1 : scale;\r\n var zoom = 1 / scale;\r\n\r\n // element.css('width', '100%');\r\n element.css('height', iFrameHeight + 'px');\r\n // element.css('-webkit-transform', 'scale(' + scale + ')');\r\n // element.css('-ms-transform', 'scale(' + scale + ')');\r\n // element.css('transform', 'scale(' + scale + ')');\r\n // element.css('zoom', zoom);\r\n }\r\n }\r\n }\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', '$interval', '$state', 'LeftMenuService', 'CommonHeaderService',\r\n '$http', 'ModalServiceExt', 'usSpinnerService', '$timeout', '$stateParams', 'ServiceProvidersService', 'OutagesService',\r\n function ($scope, $interval, $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 $scope.isRootDetailsVisible = false;\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 //getWorkCenters();\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 //getWorkCenters();\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 var updateWorkCentersPositionstimerId;\r\n\r\n function getWorkCenters() {\r\n\r\n var url = apiUrl + 'api/TurnOffService/GetWorkCentersForMap/';\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.workCentersMarkers = [];\r\n\r\n $scope.workCenters = result.Data;\r\n $scope.workCenters.forEach(function (workCenter, index) {\r\n\r\n var location = { lat: workCenter.Latitude, lng: workCenter.Longitude };\r\n var marker = new google.maps.Marker({\r\n map: $scope.map,\r\n position: location,\r\n title: workCenter.Id\r\n });\r\n var icon = OutagesService.common.getWorkCenterIcon(2);\r\n marker.setIcon(icon);\r\n marker.addListener('click', function () {\r\n workCentrClicked(marker, workCenter);\r\n });\r\n $scope.workCentersMarkers.push({ mapMarker: marker, workCenter: workCenter });\r\n\r\n if (index === $scope.workCenters.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 //updateWorkCentersPositionstimerId = setInterval(updateWorkCentersPositions, 1000);\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 var directionsService = new google.maps.DirectionsService();\r\n var directionsDisplay = new google.maps.DirectionsRenderer();\r\n directionsDisplay.setMap($scope.map);\r\n\r\n $scope.resizeMap = true;\r\n function calcRoute(start, end) {\r\n //var start = 'chicago, il';\r\n //var end = 'st louis, mo';\r\n var request = {\r\n origin: start,\r\n destination: end,\r\n travelMode: 'DRIVING'\r\n };\r\n directionsService.route(request, function (result, status) {\r\n if (status == 'OK') {\r\n directionsDisplay.setOptions({ suppressMarkers: true, preserveViewport: !$scope.resizeMap });\r\n directionsDisplay.setDirections(result);\r\n //console.log(result);\r\n var distance = result.routes[0].legs[0].distance.text;\r\n var duration = result.routes[0].legs[0].duration.text;\r\n $scope.routeDistance = distance;\r\n $scope.routeDuration = duration;\r\n $scope.$apply();\r\n\r\n $scope.resizeMap = false;\r\n }\r\n });\r\n }\r\n\r\n $scope.refreshEstimation = function () {\r\n calcRoute(workCenterMarker.position, orderMarker.position);\r\n }\r\n\r\n var orderMarker = null;\r\n var workCenterMarker = null;\r\n\r\n function getWorkOrderInfo() {\r\n var url = apiUrl + 'api/TurnOffService/GetWorkOrderInfo/';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\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 $scope.isRootDetailsVisible = false;\r\n return;\r\n }\r\n\r\n if (result.Data == null || result.Data.length === 0) {\r\n adjustSize();\r\n directionsDisplay.setDirections({ routes: [] });\r\n // usSpinnerService.stop('spinner-1');\r\n $scope.isRootDetailsVisible = false;\r\n $scope.resizeMap = true;\r\n if (orderMarker != null) {\r\n orderMarker.setMap(null);\r\n }\r\n if (workCenterMarker != null) {\r\n workCenterMarker.setMap(null);\r\n }\r\n return;\r\n }\r\n\r\n var workCenterInfo = result.Data;\r\n\r\n var orderLocation = { lat: workCenterInfo.CurrentWorkOrderLatitude, lng: workCenterInfo.CurrentWorkOrderLongitude };\r\n var workCenterLocation = { lat: workCenterInfo.Latitude, lng: workCenterInfo.Longitude };\r\n\r\n if (orderMarker == null) {\r\n orderMarker = new google.maps.Marker({\r\n map: $scope.map,\r\n position: orderLocation,\r\n title: workCenterInfo.Id\r\n });\r\n var workOrderIcon = OutagesService.common.getWorkOrderIcon(0);\r\n orderMarker.setIcon(workOrderIcon);\r\n orderMarker.addListener('click', function () {\r\n //workOrderClicked(marker, workCenter);\r\n });\r\n }\r\n\r\n if (workCenterMarker == null) {\r\n workCenterMarker = new google.maps.Marker({\r\n map: $scope.map,\r\n position: workCenterLocation,\r\n title: workCenterInfo.Id\r\n });\r\n\r\n var workCenterIcon = OutagesService.common.getWorkCenterIcon(2);\r\n workCenterMarker.setIcon(workCenterIcon);\r\n workCenterMarker.addListener('click', function () {\r\n //workCenterClicked(marker, workCenter);\r\n });\r\n\r\n //getWorkOrderInfoMin();\r\n }\r\n\r\n if (!$scope.isRootDetailsVisible && workCenterMarker != null && orderMarker!= null ) {\r\n orderMarker.setMap($scope.map);\r\n orderMarker.setPosition(orderLocation);\r\n workCenterMarker.setMap($scope.map);\r\n workCenterMarker.setPosition(workCenterLocation);\r\n calcRoute(workCenterMarker.position, orderMarker.position);\r\n }\r\n\r\n $scope.isRootDetailsVisible = true;\r\n //usSpinnerService.stop('spinner-1');\r\n\r\n// updateWorkCentersPositionstimerId = setInterval(updateWorkCentersPositions, 1000);\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 if (!$scope.anonymous) {\r\n var getWorkOrderInfoInterval = $interval(getWorkOrderInfo, 2000);\r\n }\r\n\r\n var prevPosition = null;\r\n\r\n function getWorkOrderInfoMin() {\r\n var url = apiUrl + 'api/TurnOffService/GetWorkOrderInfo/';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n }\r\n }).success(function (result) {\r\n\r\n if (result.Errors && result.Errors.length > 0) {\r\n adjustSize();\r\n $scope.isRootDetailsVisible = false;\r\n return;\r\n }\r\n\r\n if (result.Data == null || result.Data.length === 0) {\r\n //return;\r\n //adjustSize();\r\n directionsDisplay.setDirections({ routes: [] });\r\n // usSpinnerService.stop('spinner-1');\r\n $scope.isRootDetailsVisible = false;\r\n $scope.resizeMap = true;\r\n if (orderMarker != null) {\r\n orderMarker.setMap(null);\r\n }\r\n if (workCenterMarker != null) {\r\n workCenterMarker.setMap(null);\r\n }\r\n //getWorkOrderInfoInterval = $interval(getWorkOrderInfo, 2000);\r\n setTimeout(getWorkOrderInfoMin, 1000);\r\n //$interval.cancel(getWorkOrderInfoInterval);\r\n return;\r\n }\r\n\r\n var workCenterInfo = result.Data;\r\n var workCenterLocation = { lat: workCenterInfo.Latitude, lng: workCenterInfo.Longitude };\r\n \r\n if (prevPosition != null) {\r\n //\r\n workCenterMarker.setPosition(prevPosition);\r\n prevPosition = workCenterLocation;\r\n moveMarkerAnimation(workCenterMarker, workCenterLocation);\r\n //calcRoute(workCenterMarker.position, orderMarker.position);\r\n }\r\n else\r\n {\r\n $scope.resizeMap = true;\r\n //calcRoute(workCenterMarker.position, orderMarker.position);\r\n prevPosition = workCenterLocation;\r\n //workCenterMarker.setPosition(workCenterLocation);\r\n setTimeout(getWorkOrderInfoMin, 1000);\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\r\n if (!$scope.anonymous) {\r\n getWorkOrderInfo();\r\n getWorkOrderInfoMin();\r\n }\r\n //$scope.resizeMap = false;\r\n \r\n //var getWorkOrderInfoIntervalMin = $interval(getWorkOrderInfoMin, 1000);\r\n\r\n\r\n\r\n var updateWorkCentersPositions = function () {\r\n var url = apiUrl + 'api/TurnOffService/GetWorkCenterCoordinates/';\r\n $scope.workCentersMarkers.forEach(function (workCenterMarker, index) {\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n id: workCenterMarker.workCenter.Id\r\n }\r\n }).success(function (result) {\r\n workCenterMarker.mapMarker.setPosition(new google.maps.LatLng(result.Data.Latitude, result.Data.Longitude));\r\n\r\n }).error(function () {\r\n //clearTimeout(updateWorkCentersPositionstimerId);\r\n });\r\n\r\n //workCenterMarker.workCenter.Latitude += 0.0001\r\n //workCenterMarker.mapMarker.setPosition(new google.maps.LatLng(workCenterMarker.workCenter.Latitude, workCenterMarker.workCenter.Longitude));\r\n })\r\n }\r\n\r\n var numDeltas = 1000;\r\n var delay = 4; //milliseconds\r\n var i = 0;\r\n var deltaLat;\r\n var deltaLng;\r\n var currentLat;\r\n var currentLong;\r\n var markerAnimation;\r\n\r\n function moveMarkerAnimation(marker, newPosition) {\r\n i = 0;\r\n //var deltaLat = (result[0] - position[0]) / numDeltas;\r\n //var deltaLng = (result[1] - position[1]) / numDeltas;\r\n currentLat = marker.position.lat();\r\n currentLong = marker.position.lng();\r\n markerAnimation = marker;\r\n deltaLat = (newPosition.lat - marker.position.lat()) / numDeltas;\r\n deltaLng = (newPosition.lng - marker.position.lng()) / numDeltas;\r\n moveMarker();\r\n //map.setCenter({\r\n // lat: marker.position.lat(),\r\n // lng: marker.position.lng()\r\n //})\r\n }\r\n\r\n function moveMarker() {\r\n currentLat += deltaLat;\r\n currentLong += deltaLng;\r\n\r\n //currentLat = 50;\r\n //currentLong = 50;\r\n var latlng = new google.maps.LatLng(currentLat, currentLong);\r\n //marker.setTitle(\"Latitude:\" + position[0] + \" | Longitude:\" + position[1]);\r\n markerAnimation.setPosition(latlng);\r\n if (i != numDeltas) {\r\n i++;\r\n setTimeout(moveMarker, delay);\r\n }\r\n else\r\n {\r\n getWorkOrderInfoMin();\r\n }\r\n }\r\n\r\n //var updateWorkCentersPositionsInterval = $interval(updateWorkCentersPositions, 10000);\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n if (!$scope.anonymous) {\r\n $interval.cancel(getWorkOrderInfoInterval);\r\n }\r\n //$interval.cancel(updateWorkCentersPositionsInterval);\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 function workCenterClicked(marker, workCenter) {\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('TurnOffMapController', ['$scope', '$interval', '$state', 'LeftMenuService', 'CommonHeaderService',\r\n '$http', 'ModalServiceExt', 'usSpinnerService', '$timeout', '$stateParams', 'ServiceProvidersService', 'OutagesService',\r\n function ($scope, $interval, $state, LeftMenuService, CommonHeaderService,\r\n $http, ModalServiceExt, usSpinnerService, $timeout, $stateParams, ServiceProvidersService, OutagesService) {\r\n LeftMenuService.setCurrentTab('TurnOffMap');\r\n CommonHeaderService.setUpBackButton($scope._t('TurnOff Map'), true);\r\n\r\n $scope.anonymous = $stateParams.anonymous;\r\n $scope.isRootDetailsVisible = false;\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 var directionsService = new google.maps.DirectionsService();\r\n var directionsDisplay = new google.maps.DirectionsRenderer();\r\n directionsDisplay.setMap($scope.map);\r\n\r\n function calcRoute(start, end) {\r\n //var start = 'chicago, il';\r\n //var end = 'st louis, mo';\r\n var request = {\r\n origin: start,\r\n destination: end,\r\n travelMode: 'DRIVING'\r\n };\r\n directionsService.route(request, function (result, status) {\r\n if (status == 'OK') {\r\n directionsDisplay.setDirections(result);\r\n console.log(result);\r\n }\r\n });\r\n }\r\n\r\n function calcRouteFromCurrentPosition(end) {\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(function (position) {\r\n \r\n var start = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);\r\n var request = {\r\n origin: start,\r\n destination: end,\r\n travelMode: 'DRIVING'\r\n };\r\n directionsService.route(request, function (result, status) {\r\n if (status == 'OK') {\r\n directionsDisplay.setMap($scope.map);\r\n directionsDisplay.setOptions({ suppressMarkers: true, preserveViewport: !$scope.resizeMap });\r\n directionsDisplay.setDirections(result);\r\n var distance = result.routes[0].legs[0].distance.text;\r\n var duration = result.routes[0].legs[0].duration.text;\r\n $scope.routeDistance = distance;\r\n $scope.routeDuration = duration;\r\n $scope.$apply();\r\n\r\n $scope.resizeMap = false;\r\n }\r\n });\r\n\r\n }, function () {\r\n var i = 1;\r\n //handleLocationError(true, infoWindow, map.getCenter());\r\n });\r\n } else {\r\n var i = 2;\r\n // Browser doesn't support Geolocation\r\n //handleLocationError(false, infoWindow, map.getCenter());\r\n }\r\n }\r\n\r\n //calcRoute();\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 getWorkCenters();\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 getWorkCenters();\r\n }\r\n\r\n var currentPositionMarker;\r\n\r\n function updateCurrentPosition() {\r\n if (currentPositionMarker == undefined) return;\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(function (position) {\r\n currentPositionMarker.setPosition(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));\r\n }, function () {\r\n //handleLocationError(true, infoWindow, map.getCenter());\r\n var i = 1;\r\n });\r\n } else {\r\n var i = 2;\r\n // Browser doesn't support Geolocation\r\n // handleLocationError(false, infoWindow, map.getCenter());\r\n }\r\n }\r\n\r\n function setCurrentPosition()\r\n {\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(function (position) {\r\n var pos = {\r\n lat: position.coords.latitude,\r\n lng: position.coords.longitude\r\n };\r\n $scope.map.setCenter(pos);\r\n\r\n //currentPositionMarker = new google.maps.Marker({\r\n // map: $scope.map,\r\n // position: pos,\r\n // title: \"current position\"\r\n //});\r\n //var icon = OutagesService.common.getWorkCenterIcon(2);\r\n //var icon = $scope.getIcon(2);\r\n //currentPositionMarker.setIcon(icon);\r\n //setInterval(updateCurrentPosition, 1000);\r\n\r\n //var start = 'chicago, il';\r\n\r\n // var start = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);\r\n //var start = new google.maps.LatLng(38.967576, -77.077550);\r\n //var end = 'st louis, mo';\r\n //var request = {\r\n // origin: start,\r\n // destination: end,\r\n // travelMode: 'DRIVING'\r\n //};\r\n //directionsService.route(request, function (result, status) {\r\n // if (status == 'OK') {\r\n // directionsDisplay.setDirections(result);\r\n // }\r\n //});\r\n\r\n }, function () {\r\n var i = 1;\r\n //handleLocationError(true, infoWindow, map.getCenter());\r\n });\r\n } else {\r\n var i = 2;\r\n // Browser doesn't support Geolocation\r\n //handleLocationError(false, infoWindow, map.getCenter());\r\n }\r\n\r\n }\r\n\r\n setCurrentPosition();\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 var updateWorkCentersPositionstimerId;\r\n\r\n function getWorkCenters() {\r\n\r\n var url = apiUrl + 'api/TurnOffService/GetWorkCentersForMap/';\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.workCentersMarkers = [];\r\n\r\n $scope.workCenters = result.Data;\r\n\r\n $scope.workCenters.forEach(function (workCenter, index) {\r\n\r\n var location = { lat: workCenter.Latitude, lng: workCenter.Longitude };\r\n var marker = new google.maps.Marker({\r\n map: $scope.map,\r\n position: location,\r\n title: workCenter.Id\r\n });\r\n var icon = OutagesService.common.getWorkCenterIcon(2);\r\n marker.setIcon(icon);\r\n marker.addListener('click', function () {\r\n workCentrClicked(marker, workCenter);\r\n });\r\n $scope.workCentersMarkers.push({ mapMarker: marker, workCenter: workCenter });\r\n\r\n if (index === $scope.workCenters.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 //updateWorkCentersPositionstimerId = setInterval(updateWorkCentersPositions, 1000);\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\r\n $scope.resizeMap = true;\r\n var updateWorkCentersPositions = function () {\r\n var url = apiUrl + 'api/TurnOffService/GetWorkCenterCoordinates/';\r\n $scope.workCentersMarkers.forEach(function (workCenterMarker, index) {\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n id: workCenterMarker.workCenter.Id\r\n }\r\n }).success(function (result) {\r\n workCenterMarker.mapMarker.setPosition(new google.maps.LatLng(result.Data.Latitude, result.Data.Longitude));\r\n\r\n }).error(function () {\r\n // clearTimeout(updateWorkCentersPositionstimerId);\r\n });\r\n\r\n if ($scope.workOrder != null) {\r\n calcRouteFromCurrentPosition($scope.workOrder.mapMarker.position);\r\n }\r\n //workCenterMarker.workCenter.Latitude += 0.0001\r\n //workCenterMarker.mapMarker.setPosition(new google.maps.LatLng(workCenterMarker.workCenter.Latitude, workCenterMarker.workCenter.Longitude));\r\n })\r\n }\r\n\r\n var updateWorkCentersPositionsInterval = $interval(updateWorkCentersPositions, 10000);\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n //$interval.cancel(getWorkOrderInfoInterval);\r\n $interval.cancel(updateWorkCentersPositionsInterval);\r\n });\r\n\r\n $scope.workOrderSelected = function () {\r\n workOrderClicked($scope.workOrder);\r\n }\r\n\r\n $scope.workOrdersMarkers = [];\r\n\r\n function getWorkOrders() {\r\n usSpinnerService.spin('spinner-1');\r\n var dataRequest = { centers: '', after:\"0\", count: 100 };\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/TurnOffService/GetWorkOrdersForMap/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n } else {\r\n\r\n \r\n\r\n $scope.workOrders = response.Data;\r\n\r\n $scope.workOrders.forEach(function (workOrder, index) {\r\n\r\n\r\n geocoder.geocode({ 'address': workOrder.ServiceAddress }, 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 location = { lat:latitude, lng: longitude };\r\n var marker = new google.maps.Marker({\r\n map: $scope.map,\r\n position: location,\r\n title: workOrder.Id\r\n });\r\n var icon = OutagesService.common.getWorkOrderIcon(0);\r\n marker.setIcon(icon);\r\n var workOrderItem = { mapMarker: marker, workOrder: workOrder };\r\n marker.addListener('click', function () {\r\n workOrderClicked(workOrderItem);\r\n });\r\n $scope.workOrdersMarkers.push(workOrderItem);\r\n\r\n } else {\r\n usSpinnerService.stop('spinner-admin');\r\n ModalServiceExt.showError($scope._t('Can not get address coordinates.'));\r\n }\r\n });\r\n });\r\n \r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n }\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n })['finally'](function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n getWorkOrders();\r\n\r\n $scope.isOrderSelected = false;\r\n $scope.pickupOrder = function() {\r\n usSpinnerService.spin('spinner-1');\r\n if ($scope.workOrder == null) return;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/TurnOffService/PickupWorkOrder/',\r\n method: \"POST\",\r\n params: {\r\n workOrderId: $scope.workOrder.workOrder.Number,\r\n workCenterId: 1,\r\n workOrderLatitude: $scope.workOrder.mapMarker.position.lat(),\r\n workOrderLongitude: $scope.workOrder.mapMarker.position.lng(),\r\n workOrderServiceAddress: $scope.workOrder.workOrder.ServiceAddress,\r\n contractAccountNumber: $scope.workOrder.workOrder.AccountNumber\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n workOrderClicked($scope.workOrder);\r\n $scope.isOrderSelected = true;\r\n //$scope.isRootDetailsVisible = true;\r\n }\r\n\r\n $scope.stopOrder = function () {\r\n usSpinnerService.spin('spinner-1');\r\n if ($scope.workOrder == null) return;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/TurnOffService/StopWorkOrder/',\r\n method: \"POST\",\r\n params: {\r\n workCenterId: 1,\r\n }\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n\r\n $scope.workOrder = null;\r\n //directionsDisplay.setMap(null);\r\n directionsDisplay.setDirections({ routes: [] });\r\n $scope.isOrderSelected = false;\r\n\r\n //$scope.isRootDetailsVisible = false;\r\n }\r\n\r\n function workOrderClicked(workOrderItem) {\r\n\r\n usSpinnerService.spin('spinner-1');\r\n $scope.resizeMap = true;\r\n $scope.isRootDetailsVisible = true;\r\n $scope.workOrder = workOrderItem;\r\n $scope.map.setCenter(workOrderItem.mapMarker.getPosition());\r\n calcRouteFromCurrentPosition(workOrderItem.mapMarker.position);\r\n usSpinnerService.stop('spinner-1');\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 function workCenterClicked(marker, workCenter) {\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 $scope.isRootDetailsVisible = true;\r\n $scope.workOrder = null;\r\n $scope.map.setCenter(marker.getPosition());\r\n calcRouteFromCurrentPosition(new google.maps.LatLng(outage.Coordinate.Latitude, outage.Coordinate.Longitude));\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 function workCenterClicked(marker, workCenter) {\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 if($scope.isMobileOrRipple)\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 if($scope.isMobileOrRipple){\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 }\r\n else {\r\n usSpinnerService.stop('spinner-1'); \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 var geocoder = new google.maps.Geocoder();\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 // https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse\r\n var latlng = {lat: geoLocation.Latitude, lng: geoLocation.Longitude};\r\n geocoder.geocode({'location': latlng}, function(results, status) {\r\n if (status === 'OK') {\r\n if (results[0]) {\r\n function getAddressComponent(address_components, type){\r\n return _.find(address_components, function (component) { \r\n return _.any(component.types, function (t) { return t == type; } ); \r\n }).long_name;\r\n }\r\n var street_number = getAddressComponent(results[0].address_components, \"street_number\");\r\n var route = getAddressComponent(results[0].address_components, \"route\");\r\n var locality = getAddressComponent(results[0].address_components, \"locality\");\r\n var postal_code = getAddressComponent(results[0].address_components, \"postal_code\");\r\n var administrative_area_level_1 = getAddressComponent(results[0].address_components, \"administrative_area_level_1\");\r\n data.Address = {\r\n HouseNumber: street_number,\r\n AddressLine: route,\r\n City: locality,\r\n State: administrative_area_level_1,\r\n Zip: postal_code\r\n };\r\n sendReport(data);\r\n } else {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError($scope._t('No results found.'));\r\n }\r\n } else {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError($scope._t('Cannot get address by coordinates.'));\r\n }\r\n });\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 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 successfully 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 successfully 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($scope._t('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().then(function(commonData) {\r\n var grid = $('#readsGrid').data('kendoGrid');\r\n if (!commonData.EnablePaymentDispute) {\r\n utilli.hideColumnByTitle(grid, $scope._t('Dispute'));\r\n }\r\n $scope.isEditMeterReadingEnabled = commonData.EnableAddDeleteMeterRead;\r\n if (!commonData.EnableAddDeleteMeterRead) {\r\n utilli.hideColumnByTitle(grid, $scope._t('Delete'));\r\n }\r\n },\r\n function() {\r\n ModalServiceExt.showServerError();\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 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 usSpinnerService.spin('spinner-1');\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 usSpinnerService.stop('spinner-1');\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 usSpinnerService.stop('spinner-1');\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', '$rootScope', '$http', 'BillsService', '$state', 'OpenFileService', 'GridService',\r\n function ($scope, $rootScope, $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 $rootScope.$on('subscribe-notification-hide', function (event, args) {\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 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 meterNumber: $scope.$parent.meterNum,\r\n accountNumber: accountNumber,\r\n skip: (params.page - 1) * params.pageSize,\r\n pageSize: params.pageSize,\r\n withTotalCount: true,\r\n });\r\n var url = localStorage.getItem('ApiUrl') + 'api/Consumption/GetConsumptionGraphPageAllReadings';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n readsGridResizeFunc($scope.usersKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\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 resizable: 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 };\r\n $scope.mainGridOptions.columns.push({\r\n field: \"DateOfReading\",\r\n title: $scope._t(\"Date\"),\r\n template: \"
#: DateString #\"\r\n });\r\n $scope.mainGridOptions.columns.push({\r\n field: \"Days\",\r\n title: $scope._t(\"Days\"),\r\n template: \"
#: Days #\"\r\n });\r\n if (DeploymentSettings.currentServiceProvider != Config.hcProviderName) {\r\n $scope.mainGridOptions.columns.push({\r\n field: \"Cost\",\r\n title: $scope._t(\"Cost\"),\r\n template: \"
#: utilli.formatCurrency(Cost) #\"\r\n });\r\n }\r\n $scope.mainGridOptions.columns.push({\r\n field: \"RegisterNum\",\r\n title: $scope._t(\"Register\"),\r\n template: \"
#: RegisterNum #\"\r\n });\r\n $scope.mainGridOptions.columns.push({\r\n field: \"RunningMeterReading\",\r\n title: $scope._t(\"Meter Reading\"),\r\n template: \"
#: RunningMeterReading #\"\r\n });\r\n $scope.mainGridOptions.columns.push({\r\n field: \"Consumption\",\r\n title: $scope._t(\"Usage\"),\r\n template: \"
#: Consumption #\"\r\n });\r\n $scope.mainGridOptions.columns.push({\r\n field: \"UnitsOfMeasure\",\r\n title: $scope._t(\"Units\"),\r\n template: \"
#: UnitOfMeasure #\"\r\n });\r\n if (DeploymentSettings.currentServiceProvider != Config.hcProviderName) {\r\n $scope.mainGridOptions.columns.push({\r\n field: \"DailyAverageString\",\r\n title: $scope._t(\"Daily Average\"),\r\n template: \"
#: DailyAverageString #\"\r\n });\r\n }\r\n $scope.mainGridOptions.columns.push({\r\n field: \"\",\r\n title: $scope._t(\"Dispute\"),\r\n template: \"
\",\r\n sortable: false,\r\n });\r\n $scope.mainGridOptions.columns.push({\r\n field: \"\",\r\n title: $scope._t(\"Delete\"),\r\n template: \"# if ( CanBeDeleted ) { #
delete> # } #\",\r\n sortable: false,\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', \r\n 'CommonDataService', 'usSpinnerService', 'LeftMenuService', 'CommonHeaderService', 'GetAccountsService', \r\n 'ModalServiceExt', 'AccountListService', 'CustomerInfoDataService', 'TimeService',\r\n function ($scope, $rootScope, $window, $http, $state, $stateParams, CommonDataService, usSpinnerService, \r\n LeftMenuService, CommonHeaderService, GetAccountsService, ModalServiceExt, AccountListService,\r\n CustomerInfoDataService, TimeService) {\r\n\r\n LeftMenuService.setCurrentTab('PayNow');\r\n CommonHeaderService.setUpBackButton($scope._t('Pay Now'));\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 var token = localStorage.getItem('SecurityToken');\r\n if (!token) {\r\n // if user clicks on make payment button in an email and he is not logged in then silently redirect to welcome\r\n // to avoid pop-up saying that session has expired.\r\n $state.goToSignIn(true);\r\n }\r\n $scope.agreed = false;\r\n $scope.isFeeEnabled = false;\r\n $scope.isCashOnly = false;\r\n\r\n if($stateParams.AccountNumber)\r\n {\r\n localStorage.setItem('CurrentAccountNumber', $stateParams.AccountNumber);\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 function getFeeInfo() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/GetConvFeeInfo/',\r\n method: \"GET\",\r\n params: { accountNumber: localStorage.getItem('CurrentAccountNumber') }\r\n })\r\n .then(function (res) {\r\n var data = res.data;\r\n $scope.feeInformation = data.FeeInfoTextAchAndCard;\r\n $scope.isFeeEnabled = false;\r\n $scope.isCashOnly = data.IsCashOnly;\r\n $scope.isDirectDebitInProcess = data.IsDirectDebitInProgress;\r\n $scope.isCashOnlyInformation = data.IsCashOnlyInformation;\r\n if (data.IsCashOnly || data.IsDirectDebitInProgress) {\r\n return CommonDataService.getCommonData().then(function(data) {\r\n $scope.FullCustomerServiceInfo = data.FullCustomerServiceInfo;\r\n });\r\n }\r\n }, ModalServiceExt.showAjaxError)\r\n .fixedFinally(function(){\r\n usSpinnerService.stop('spinner-1');\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 CustomerInfoDataService.getCustomerInfoData()\r\n .then(\r\n function(customerInfo) {\r\n if (!customerInfo) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n localStorage.setItem('CurrentUtilityType', customerInfo.account.UtilliType);\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 $scope.showDisconnectionPending = false;\r\n $scope.accountStatuses = [];\r\n\r\n $scope.LastPaymentAmount = customerInfo.userinfo.LastPaymentAmount == null\r\n ? null\r\n : getPositiveAmountString(customerInfo.userinfo.LastPaymentAmount);\r\n $scope.LastPaymentDate = TimeService.parseISOLocalDate(customerInfo.userinfo.LastPaymentDate);\r\n try {\r\n $scope.customerInfo.dueDate = TimeService.parseISOLocalDate(customerInfo.userinfo.DueDate);\r\n if ($scope.customerInfo.userinfo.IsDisconnected) {\r\n $scope.showDisconnected = true;\r\n }\r\n else if ($scope.customerInfo.userinfo.IsAccountDisconnectionPending) {\r\n $scope.showDisconnectionPending = true;\r\n }\r\n else if($scope.showDueDate && $scope.customerInfo.dueDate < utilli.getDateWithoutTime(new Date())) {\r\n $scope.showPastDue = true;\r\n }\r\n $scope.accountStatuses = utilli.fillAccountStatuses($scope.customerInfo.account);\r\n } catch (ex) {\r\n console.log(ex);\r\n }\r\n },\r\n function(err) {\r\n ModalServiceExt.showError(err);\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 function checkContractAccount(caNumber) {\r\n usSpinnerService.spin('spinner-1');\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\nangular.module('utilliApp').controller('InstallmentPlanController', ['$scope', '$http', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'CommonHeaderService', 'ModalServiceExt',\r\n function ($scope, $http, $state, usSpinnerService, LeftMenuService, CommonHeaderService, ModalServiceExt) {\r\n CommonHeaderService.setUpBackButton($scope._t('Installment Plans'));\r\n LeftMenuService.setCurrentTab('PaymentOptions');\r\n var _t = $scope._t;\r\n\r\n $scope.startDate = new Date();\r\n $scope.installmentNumber = 6;\r\n\r\n initPicker();\r\n function initPicker() {\r\n $scope.dpOptions = utilli.datePickerOptions;\r\n $scope.altInputFormats = ['M!/d!/yyyy'];\r\n $scope.format = 'shortDate';\r\n }\r\n\r\n function loadPlanTypes() {\r\n $scope.isLoading = true;\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/InstallmentPlan/GetInstallmentPlanTypes/',\r\n method: \"GET\"\r\n })\r\n .apiThen(function (data) {\r\n $scope.planTypes = data;\r\n $scope.planTypeId = $scope.planTypeId ? $scope.planTypeId : data[0].Id;\r\n }, ModalServiceExt)\r\n .fixedFinally(function () {\r\n $scope.isLoading = false;\r\n });\r\n }\r\n loadPlanTypes();\r\n\r\n function loadCurrentPlan() {\r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/InstallmentPlan/GetInstallmentPlan',\r\n method: 'GET',\r\n params: { contractAccountNumber: localStorage.getItem('CurrentAccountNumber') }\r\n })\r\n .apiThen(function (data) {\r\n $scope.readOnly = data.length;\r\n data.forEach(function (element) {\r\n element.InstallmentAmountString = \"$\" + element.InstallmentAmount;\r\n element.OpenAmountString = element.OpenAmount === 0\r\n ? \"—\" : \"$\" + element.OpenAmount;\r\n });\r\n $scope.planItems = data;\r\n }, ModalServiceExt)\r\n .fixedFinally(function () {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n loadCurrentPlan();\r\n\r\n $scope.cancel = function () {\r\n $window.history.back();\r\n };\r\n\r\n $scope.enroll = function () {\r\n $scope.form.$submitted = true;\r\n var utc = new Date().toJSON().slice(0,10).replace(/-/g,'/');\r\n $scope.today = new Date(utc);\r\n if ($scope.startDate < $scope.today)\r\n {\r\n $scope.form.$valid = false;\r\n return;\r\n }\r\n if (!$scope.form.$valid)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var x = $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/InstallmentPlan/Enroll',\r\n method: 'POST',\r\n data: {\r\n contractAccountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n planTypeId: $scope.planTypeId,\r\n installmentNumber: $scope.installmentNumber,\r\n startDate: $scope.startDate.toUTCString()\r\n }\r\n }).apiThen(function () {\r\n }, ModalServiceExt\r\n ).then(loadCurrentPlan, function(){\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n $scope.unEnroll = 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 $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/InstallmentPlan/Unenroll',\r\n method: 'POST',\r\n params: { contractAccountNumber: localStorage.getItem('CurrentAccountNumber') }\r\n }).apiThen(function () {\r\n }, ModalServiceExt\r\n ).then(loadCurrentPlan, function(){\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n }]);\n'use strict';\r\n\r\nangular.module('utilliApp')\r\n .controller('PayByCardController', ['$scope', '$http', '$state', '$window', '$timeout',\r\n '$stateParams', 'usSpinnerService', 'LeftMenuService', 'ModalServiceExt', 'CommonHeaderService',\r\n 'CommonDataService', '$q', 'PaymentVerificationService',\r\n function ($scope, $http, $state, $window, $timeout, $stateParams,usSpinnerService, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, CommonDataService, $q, PaymentVerificationService) {\r\n LeftMenuService.setCurrentTab('PayByCard');\r\n CommonHeaderService.setUpCancelButton();\r\n var browser = $window.navigator.userAgent;\r\n\r\n $scope.isDonationEnabled = false;\r\n $scope.isPayNowEnabled = false;\r\n $scope.isPayNowBtnText = 'Next';\r\n $scope.velocityFee = '';\r\n $scope.oneTimeDonationAmount = 1.00;\r\n $scope.donateRadio = \"false\";\r\n $scope.enrollRadio = \"false\";\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.isIosMobile = isMobileOrRipple() && iOS();\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.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 $scope.amount = '';\r\n\r\n $scope.minimumPaymentAmountToAllowDonation = 0;\r\n\r\n function getAmount() {\r\n var amount = parseFloat($scope.amount);\r\n return amount;\r\n }\r\n\r\n function getDonationAmount() {\r\n var amount = parseFloat($scope.oneTimeDonationAmount);\r\n return amount;\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.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.goDonationFaq = function () {\r\n $state.goMainLayout('Faqs', { donationParam: 'true' });\r\n }\r\n\r\n $scope.back = function ()\r\n {\r\n $state.goMainLayout('PayNow');\r\n }\r\n\r\n $scope.updateConvenienceFee = function (amountToPay) {\r\n var payAmount = utilli.parsePositiveFloat(amountToPay);\r\n if (payAmount === 0) {\r\n $scope.totalAmount = '';\r\n $scope.convenienceFee = ''; // because fee may be some percentage from amount\r\n return;\r\n }\r\n\r\n var fee = 0;\r\n if ($scope.isFeeEnabled) {\r\n var feeInfo = $scope.convFeeInfo;\r\n if (feeInfo == null) return;\r\n if (feeInfo.FeeType == \"percent\") {\r\n fee = amountToPay / 100 * feeInfo.FeeAmount;\r\n } else if (feeInfo.FeeType == \"flat\") {\r\n fee = feeInfo.FeeAmount;\r\n }\r\n }\r\n $scope.convenienceFee = $scope.formatDecimal(fee);\r\n\r\n var donation = 0;\r\n if ($scope.isDonationEnabled && $scope.donateRadio == \"true\") {\r\n donation = utilli.parsePositiveFloat($scope.oneTimeDonationAmount);\r\n }\r\n\r\n $scope.totalAmount = $scope.formatDecimal(payAmount + fee + donation);\r\n }\r\n\r\n $scope.savedCardChanged = function () {\r\n setCurrentSavedCardAttributes();\r\n }\r\n\r\n $scope.useSavedCardChanged = function () {\r\n if ($scope.useSavedCard) {\r\n $scope.currentSavedCard = $scope.savedCards[0];\r\n for (var i = 0; i < $scope.savedCards.length; i++) {\r\n var cardInfo = $scope.savedCards[i];\r\n if (cardInfo.card.IsPrimary) {\r\n $scope.currentSavedCard = cardInfo;\r\n break;\r\n }\r\n }\r\n\r\n setCurrentSavedCardAttributes();\r\n } else {\r\n $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 var init = function () {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n var commonDataRequest = CommonDataService.getCommonData();\r\n var setCommonData = function (commonData) {\r\n $scope.showSchedulePayment = commonData.EnablePaymentScheduling;\r\n $scope.enableSaveBankAccounts = commonData.EnableSaveBankAccounts;\r\n $scope.enableSaveCreditCards = commonData.EnableSaveCards;\r\n $scope.isFeeEnabled = false;\r\n };\r\n\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var savedCardsRequestParams = { accountNumber: accountNumber };\r\n utilli.addUserName($state, savedCardsRequestParams);\r\n var savedCardsRequest = $http({\r\n url: apiUrl + 'api/ProfileCardManage/GetUserCards',\r\n method: \"GET\",\r\n params: savedCardsRequestParams\r\n });\r\n function setSavedCards(data) {\r\n if (data == null || data.length == 0) {\r\n $scope.useSavedCard = false;\r\n $scope.savedCardsVisible = false;\r\n return;\r\n }\r\n $scope.useSavedCard = true;\r\n $scope.savedCardsVisible = true;\r\n\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 var feeInfoRequest = $http({\r\n url: apiUrl + 'api/Payment/GetConvFeeInfo/',\r\n method: \"GET\",\r\n params: { accountNumber: accountNumber }\r\n });\r\n var setFeeInfo = function(data){\r\n if (data) {\r\n $scope.convFeeInfo = data;\r\n $scope.updateConvenienceFee($scope.amount);\r\n }\r\n }\r\n\r\n var profileRequestParams = { accountNumber: accountNumber };\r\n utilli.addUserName($state, profileRequestParams);\r\n var profileRequest = $http({\r\n url: apiUrl + 'api/Profile/GetProfile/',\r\n method: \"GET\",\r\n params: profileRequestParams\r\n });\r\n var setProfileData = function (data){\r\n if (data.Errors && data.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n\r\n $scope.profile = data.AccountData;\r\n $scope.isDonationEnabled = !data.AccountData.IsRoundUpEnrolled;\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\r\n var customerInfoRequestParams = { contractAccountNumber: accountNumber };\r\n utilli.addUserName($state, customerInfoRequestParams);\r\n var customerInfoRequest = $http({\r\n url: apiUrl + 'api/Customer/GetCustomerInfo/',\r\n method: \"GET\",\r\n params: customerInfoRequestParams\r\n });\r\n var setCustomerInfo = function (data) {\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.contractAccountNumber = data.account.AccountNumber;\r\n $scope.amount = data.userinfo.TotalOpenBalance > 0 ? $scope.formatDecimal(data.userinfo.TotalOpenBalance) : \"0.00\";\r\n\r\n $scope.minimumPaymentAmountToAllowDonation = data.userinfo.TotalOpenBalance > 0 ? data.userinfo.TotalOpenBalance : 0;\r\n\r\n $scope.updateConvenienceFee($scope.amount);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n };\r\n }\r\n\r\n $q.all([commonDataRequest, savedCardsRequest, feeInfoRequest, profileRequest, customerInfoRequest])\r\n .then(\r\n function(data){\r\n usSpinnerService.stop('spinner-1');\r\n setCommonData(data[0]);\r\n setSavedCards(data[1].data);\r\n setFeeInfo(data[2].data);\r\n setProfileData(data[3].data);\r\n setCustomerInfo(data[4].data);\r\n }\r\n )\r\n .catch(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\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 init();\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 // amount validation\r\n $scope.amountError = parseFloat($scope.amount) <= 0;\r\n\r\n if (!$scope.amountError && getDonationAmount() > 0 && getAmount() < $scope.minimumPaymentAmountToAllowDonation)\r\n {\r\n $scope.amountError = true;\r\n ModalServiceExt.showError('You need to pay at least amount due to make donation.');\r\n }\r\n\r\n if ($scope.amount == '' || $scope.amount == undefined)\r\n $scope.amountEmptyError = true;\r\n else\r\n $scope.amountEmptyError = false;\r\n\r\n // donation amount validation\r\n if ($scope.donateRadio == \"true\"){\r\n var donation = utilli.parsePositiveFloat($scope.oneTimeDonationAmount);\r\n $scope.oneTimeDonationAmountError = donation === 0;\r\n } else {\r\n $scope.oneTimeDonationAmountError = 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.amountEmptyError\r\n || $scope.amountError) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n $scope.makePaymentApi = function () {\r\n $scope.errors = [];\r\n if ($scope.scheduleButtonClicked && $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 if (!validateFormData()) {\r\n $scope.errors = [{ Message: utilli.errors.validationErorrsMessage }];\r\n return;\r\n }\r\n if ($scope.isPayNowEnabled) {\r\n utilli.scrollTop();\r\n usSpinnerService.spin('spinner-1');\r\n PaymentVerificationService.verifyPaymentInfo(getAmount(), function () {\r\n if ($scope.useSavedCard)\r\n payBySavedCard()\r\n else\r\n payByNewCard()\r\n });\r\n }\r\n else {\r\n getVelocityFee($scope.totalAmount);\r\n }\r\n }\r\n\r\n function payByNewCard () {\r\n var expDate = formExpiryDate();\r\n var dataRequest = {\r\n ContractAccountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n CardNumber: $scope.cardNumber,\r\n Amount: getAmount(),\r\n CardholderName: $scope.nameOnCard,\r\n ExpirationDate: expDate,\r\n Email: $scope.email,\r\n PhoneNumber: utilli.getFullPhoneNumber($scope.phoneNumber),\r\n SaveThisCard: $scope.saveThisCard,\r\n EnrollInRoundUp: $scope.enrollRadio == \"true\",\r\n DoOneTimeDonation: $scope.donationRadio == \"true\",\r\n OneTimeDonationAmount: getDonationAmount(),\r\n Browser: browser,\r\n ConvenienceFee: parseFloat($scope.velocityFee),\r\n };\r\n utilli.addUserName($state, dataRequest);\r\n usSpinnerService.spin('spinner-1');\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 usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function payBySavedCard () {\r\n var payDataRequest = {\r\n Card: $scope.currentSavedCard.card,\r\n AccountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n Amount: getAmount(),\r\n Email: $scope.email,\r\n PhoneNumber: utilli.getFullPhoneNumber($scope.phoneNumber),\r\n userId: $stateParams.userId,\r\n EnrollInRoundUp: $scope.enrollRadio == \"true\",\r\n DoOneTimeDonation: $scope.donationRadio == \"true\",\r\n OneTimeDonationAmount: getDonationAmount(),\r\n Browser: browser\r\n };\r\n\r\n usSpinnerService.spin('spinner-1');\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 usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n }\r\n\r\n function resetPayBtn()\r\n {\r\n $scope.isPayNowBtnText = 'Next';\r\n $scope.isPayNowEnabled = false;\r\n $scope.velocityFee = '';\r\n }\r\n\r\n function getVelocityFee(newAmount) {\r\n var payAmount = utilli.parsePositiveFloat(newAmount);\r\n if (payAmount <= 0) {\r\n return;\r\n }\r\n \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/GetVelocityFee/',\r\n method: \"GET\",\r\n params: { Card: $scope.cardNumber , Amount: getAmount(), \r\n AccountNumber: localStorage.getItem('CurrentAccountNumber'), Type: \"1\" }\r\n })\r\n .then(function (res) {\r\n $scope.velocityFee = res.data.PPIFeeValue;\r\n $scope.isPayNowEnabled = true;\r\n $scope.isPayNowBtnText = 'Pay Now'\r\n }, ModalServiceExt.showAjaxError)\r\n .fixedFinally(function(){\r\n usSpinnerService.stop('spinner-1');\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.isPayNowEnabled = false;\r\n $scope.isPayNowBtnText = 'Next'\r\n usSpinnerService.stop('spinner-1');\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('cardNumber', function (newValue, oldValue) {\r\n resetPayBtn();\r\n });\r\n\r\n $scope.$watch('amount', function (newValue, oldValue) {\r\n $scope.updateConvenienceFee(parseFloat($scope.amount));\r\n resetPayBtn();\r\n\r\n if (parseFloat($scope.amount) <= 0)\r\n $scope.amountError = true;\r\n else\r\n $scope.amountError = false;\r\n\r\n if ($scope.amount == '' || $scope.amount == undefined)\r\n $scope.amountEmptyError = true;\r\n else\r\n $scope.amountEmptyError = false;\r\n });\r\n\r\n $scope.$watch('oneTimeDonationAmount', function (newValue, oldValue) {\r\n if ($scope.donateRadio == \"true\") {\r\n resetPayBtn();\r\n $scope.updateConvenienceFee(parseFloat($scope.amount));\r\n $scope.oneTimeDonationAmountError = utilli.parsePositiveFloat($scope.oneTimeDonationAmount) === 0;\r\n }\r\n else {\r\n $scope.oneTimeDonationAmountError = false;\r\n }\r\n });\r\n\r\n $scope.$watch('donateRadio', function (newValue, oldValue) {\r\n resetPayBtn();\r\n $scope.updateConvenienceFee(parseFloat($scope.amount));\r\n if (newValue == 'false') {\r\n $scope.oneTimeDonationAmount = '';\r\n $scope.oneTimeDonationAmountError = false;\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 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 // from Ibrahim A. :// this is now a no-op, we've disabled card scanning entirely since the card.io plugin we use is outdated and no longer works\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 $scope.donateYesClick = function () {\r\n $scope.oneTimeDonationAmount = \"1.00\";\r\n }\r\n\r\n }\r\n ])\r\n .directive('numericonly', function () { \r\n return { \r\n require: 'ngModel', \r\n link: function (scope, element, attr, ngModelCtrl) { \r\n function fromUser(text) { \r\n var transformedInput = text.replace(/[^0-9.]/g, ''); \r\n if (transformedInput !== text) { \r\n ngModelCtrl.$setViewValue(transformedInput); \r\n ngModelCtrl.$render(); \r\n } \r\n return transformedInput; \r\n } \r\n ngModelCtrl.$parsers.push(fromUser); \r\n } \r\n }; \r\n }); \r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('PayByCheckController', ['$scope', '$http', '$state', '$window',\r\n '$stateParams', 'PayByCheckService', '$timeout', 'usSpinnerService', 'LeftMenuService', \r\n 'ModalServiceExt', 'CommonHeaderService', 'CommonDataService', '$q', 'PaymentVerificationService',\r\nfunction ($scope, $http, $state, $window, $stateParams, PayByCheckService, $timeout,\r\n usSpinnerService, LeftMenuService, ModalServiceExt, CommonHeaderService, CommonDataService, $q,\r\n PaymentVerificationService) {\r\n\r\n LeftMenuService.setCurrentTab('PayByCheck');\r\n CommonHeaderService.setUpCancelButton();\r\n\r\n $scope.isIosMobile = isMobileOrRipple() && iOS();\r\n \r\n $scope.isDonationEnabled = true;\r\n $scope.isPayNowEnabled = false;\r\n $scope.isPayNowBtnText = 'Next';\r\n $scope.velocityFee = '';\r\n $scope.oneTimeDonationAmount = 0.00;\r\n $scope.donateRadio = \"false\";\r\n $scope.enrollRadio = \"false\";\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.enableEnrollBankAccount = false;\r\n $scope.enrollThisBankAccount = false;\r\n $scope.isAssistant = utilli.hasAssistantRole(localStorage.getItem('SecurityToken'));\r\n $scope.isDirectDebitInProgress = 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 $scope.model.accountNumber = '';\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 $scope.minimumPaymentAmountToAllowDonation = 0;\r\n\r\n initPicker();\r\n\r\n $scope.useSavedAccountClicked = function ()\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 if(!$scope.isDirectDebitInProgress)\r\n {\r\n $scope.enableEnrollBankAccount = true;\r\n }\r\n }\r\n }\r\n $scope.back = function ()\r\n {\r\n $state.goMainLayout('PayNow');\r\n }\r\n\r\n $scope.goDirectDebitFaq = function () {\r\n $state.goMainLayout('Faqs', { directDebitParam: 'true' });\r\n }\r\n\r\n $scope.getEnrollMessage = function () {\r\n \r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetEnrollMessageForOneTimePayment';\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 }).error(function () {\r\n });\r\n }\r\n\r\n $scope.enrollInDirectDebitChanged = function()\r\n {\r\n if($scope.enrollThisBankAccount) {\r\n $scope.saveThisBankAccount = $scope.enrollThisBankAccount;\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 }\r\n\r\n $scope.goDirectDebitFaq = function () {\r\n $state.goMainLayout('Faqs', { directDebitParam: 'true' });\r\n }\r\n\r\n $scope.getEnrollMessage = function () {\r\n \r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var url = localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetEnrollMessageForOneTimePayment';\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 }).error(function () {\r\n });\r\n }\r\n\r\n $scope.enrollInDirectDebitChanged = function()\r\n {\r\n if($scope.enrollThisBankAccount) {\r\n $scope.saveThisBankAccount = $scope.enrollThisBankAccount;\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 }\r\n\r\n function setCurrentSavedBankAccountAttributes()\r\n {\r\n $scope.model.bankRoutingNumber = $scope.currentSavedAccount.bankAccount.RoutingNumber;\r\n $scope.model.checkingAccountNumber = $scope.currentSavedAccount.shortTitle;\r\n $scope.model.reenterCheckingAccountNumber = $scope.currentSavedAccount.shortTitle;\r\n $scope.model.nameOnAccount = $scope.currentSavedAccount.bankAccount.NameOnAccount;\r\n\r\n if(!$scope.isDirectDebitInProgress && $scope.currentSavedAccount.bankAccount.IsEnrolled)\r\n {\r\n $scope.enableEnrollBankAccount = false;\r\n }\r\n\r\n if(!$scope.isDirectDebitInProgress && !$scope.currentSavedAccount.bankAccount.IsEnrolled)\r\n {\r\n $scope.enableEnrollBankAccount = true;\r\n }\r\n }\r\n\r\n function resetPayBtn() {\r\n $scope.isPayNowBtnText = 'Next';\r\n $scope.isPayNowEnabled = false;\r\n $scope.velocityFee = '';\r\n }\r\n\r\n function getVelocityFee(newAmount) {\r\n var payAmount = utilli.parsePositiveFloat(newAmount);\r\n if (payAmount <= 0) {\r\n return;\r\n }\r\n \r\n usSpinnerService.spin('spinner-1');\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Payment/GetVelocityFee/',\r\n method: \"GET\",\r\n params: { Card: \" \", Amount: payAmount, \r\n AccountNumber: localStorage.getItem('CurrentAccountNumber'), Type: \"3\" }\r\n })\r\n .then(function (res) {\r\n $scope.velocityFee = res.data.PPIFeeValue;\r\n $scope.isPayNowEnabled = true;\r\n $scope.isPayNowBtnText = 'Pay Now'\r\n }, ModalServiceExt.showAjaxError)\r\n .fixedFinally(function(){\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n function setSavedAccounts(data)\r\n {\r\n var foundPrimary = false;\r\n $scope.enableEnrollBankAccount = true;\r\n\r\n for (var i = 0; i < data.length; i++)\r\n {\r\n var bankAccount = data[i];\r\n\r\n var enrolledInfo = '';\r\n\r\n if(bankAccount.IsEnrolled)\r\n {\r\n enrolledInfo = 'Enrolled in Direct Debit'\r\n }\r\n else\r\n {\r\n enrolledInfo = 'Not enrolled in Direct Debit'\r\n }\r\n\r\n var accountInfo = { \r\n title: $scope._t('Account ending with') + ' ' + bankAccount.BankAccountNumber + ' ' + enrolledInfo,\r\n shortTitle: $scope._t('Account ending with') + ' ' + bankAccount.BankAccountNumber,\r\n bankAccount: bankAccount \r\n };\r\n\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 if(bankAccount.IsDirectDebitInProgress)\r\n {\r\n $scope.isDirectDebitInProgress = true;\r\n $scope.enableEnrollBankAccount = false;\r\n }\r\n }\r\n\r\n if (!foundPrimary)\r\n $scope.currentSavedAccount = $scope.savedAccounts[0];\r\n\r\n if($scope.isAssistant)\r\n {\r\n $scope.enableEnrollBankAccount = false;\r\n } \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 init()\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.getEnrollMessage();\r\n\r\n var commonDataRequest = CommonDataService.getCommonData();\r\n var setCommonData = function (commonData) {\r\n $scope.showSchedulePayment = commonData.EnablePaymentScheduling;\r\n $scope.enableSaveBankAccounts = commonData.EnableSaveBankAccounts;\r\n $scope.enableSaveCreditCards = commonData.EnableSaveCards;\r\n $scope.isFeeEnabled = false;\r\n };\r\n \r\n var contractAccountNumber = localStorage.getItem('CurrentAccountNumber');\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n\r\n var customerInfoRequestParams = { contractAccountNumber: contractAccountNumber };\r\n utilli.addUserName($state, customerInfoRequestParams);\r\n var customerInfoRequest = $http({\r\n url: apiUrl + 'api/Customer/GetCustomerInfo/',\r\n method: \"GET\",\r\n params: customerInfoRequestParams\r\n });\r\n var setCustomerInfo = function (data) {\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 currentAccountData = data;\r\n $scope.model.accountNumber = currentAccountData.account.AccountNumber;\r\n $scope.model.payAmount = $scope.formatDecimal(Math.max(currentAccountData.userinfo.TotalOpenBalance, 0));\r\n\r\n $scope.minimumPaymentAmountToAllowDonation = Math.max(currentAccountData.userinfo.TotalOpenBalance, 0);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n };\r\n };\r\n\r\n var profileRequestParams = { accountNumber: contractAccountNumber };\r\n utilli.addUserName($state, profileRequestParams);\r\n var profileRequest = $http({\r\n url: apiUrl + 'api/Profile/GetProfile/',\r\n method: \"GET\",\r\n params: profileRequestParams\r\n });\r\n var setProfileData = function (data) {\r\n if (data.Errors && data.Errors.length > 0) {\r\n ModalServiceExt.showServerError();\r\n return;\r\n }\r\n $scope.profile = data.AccountData;\r\n $scope.isDonationEnabled = !data.AccountData.IsRoundUpEnrolled;\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 $scope.model.email = $scope.profile.Email;\r\n };\r\n\r\n var bankAccountsRequestParams = { accountNumber: contractAccountNumber };\r\n utilli.addUserName($state, bankAccountsRequestParams);\r\n var bankAccountsRequest = $http({\r\n url: apiUrl + 'api/ProfileBankAccountManage/GetBankAccounts',\r\n method: \"GET\",\r\n params: bankAccountsRequestParams\r\n });\r\n var setBankAccounts = 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 };\r\n\r\n var feeInfoRequestParams = {\r\n accountNumber: contractAccountNumber\r\n };\r\n var feeInfoRequest = $http({\r\n url: apiUrl + 'api/Payment/GetConvFeeInfo/',\r\n method: \"GET\",\r\n params: feeInfoRequestParams\r\n });\r\n var setFeeInfo = function (data) {\r\n var jsondata = data;\r\n if (jsondata) {\r\n $scope.convFeeInfo = jsondata;\r\n $scope.updateAmounts();\r\n }\r\n };\r\n\r\n $q.all([commonDataRequest, customerInfoRequest, profileRequest, bankAccountsRequest, feeInfoRequest])\r\n .then(\r\n function(data){\r\n usSpinnerService.stop('spinner-1');\r\n setCommonData(data[0]);\r\n setCustomerInfo(data[1].data);\r\n setProfileData(data[2].data);\r\n setBankAccounts(data[3].data);\r\n setFeeInfo(data[4].data);\r\n }\r\n )\r\n .catch(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\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 init();\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.goDonationFaq = function () {\r\n $state.goMainLayout('Faqs', { donationParam: 'true' });\r\n }\r\n\r\n $scope.$watch('model.payAmount', function () {\r\n $scope.updateAmounts();\r\n $scope.amountError = utilli.parsePositiveFloat($scope.model.payAmount) === 0;\r\n resetPayBtn();\r\n });\r\n\r\n $scope.$watch('oneTimeDonationAmount', function (newValue, oldValue) {\r\n if ($scope.donateRadio == \"true\") {\r\n resetPayBtn();\r\n $scope.updateAmounts();\r\n $scope.oneTimeDonationAmountError = utilli.parsePositiveFloat($scope.oneTimeDonationAmount) === 0;\r\n }\r\n else {\r\n $scope.oneTimeDonationAmountError = false;\r\n }\r\n });\r\n\r\n $scope.$watch('donateRadio', function (newValue, oldValue) {\r\n $scope.updateAmounts();\r\n resetPayBtn();\r\n if (newValue == 'false') {\r\n $scope.oneTimeDonationAmount = '';\r\n $scope.oneTimeDonationAmountError = false;\r\n }\r\n });\r\n\r\n $scope.updateAmounts = function (amountToPay) {\r\n var payAmount = utilli.parsePositiveFloat($scope.model.payAmount);\r\n if (payAmount === 0) {\r\n $scope.model.totalAmount = '';\r\n $scope.model.convenienceFee = ''; // because fee may be some percentage from amount\r\n return;\r\n }\r\n\r\n var fee = 0;\r\n if ($scope.isFeeEnabled) {\r\n var feeInfo = $scope.convFeeInfo;\r\n if (feeInfo == null) return;\r\n if (feeInfo.FeeTypeAch == \"percent\") {\r\n fee = payAmount / 100 * feeInfo.FeeAmountAch;\r\n } else if (feeInfo.FeeTypeAch == \"flat\") {\r\n fee = feeInfo.FeeAmountAch;\r\n }\r\n }\r\n $scope.model.convenienceFee = $scope.formatDecimal(fee);\r\n\r\n var donation = 0;\r\n if ($scope.isDonationEnabled && $scope.donateRadio == \"true\") {\r\n donation = utilli.parsePositiveFloat($scope.oneTimeDonationAmount);\r\n }\r\n\r\n $scope.model.totalAmount = $scope.formatDecimal(payAmount + fee + donation);\r\n }\r\n\r\n $scope.model = $.extend({}, $scope.model, PayByCheckService.model); // restore form data\r\n\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 $scope.amountError = utilli.parsePositiveFloat($scope.model.payAmount) === 0;\r\n if ($scope.amountError) {\r\n result = false;\r\n }\r\n\r\n if (!$scope.amountError && parseFloat($scope.oneTimeDonationAmount) > 0 && utilli.parsePositiveFloat($scope.model.payAmount) < $scope.minimumPaymentAmountToAllowDonation) {\r\n result = false;\r\n ModalServiceExt.showError('You need to pay at least amount due to make donation.');\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\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 if ($scope.isPayNowEnabled) {\r\n utilli.scrollTop();\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 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 userId: $stateParams.userId\r\n };\r\n }\r\n else {\r\n apiUrl += 'api/Payment/PayByCheck';\r\n requestData = getFormData($('form[name=\"payForm\"]'));\r\n requestData.saveThisBankAccount = $scope.saveThisBankAccount;\r\n }\r\n requestData.EnrollInRoundUp = $scope.enrollRadio == \"true\";\r\n requestData.DoOneTimeDonation = $scope.donationRadio == \"true\";\r\n requestData.OneTimeDonationAmount = parseFloat($scope.oneTimeDonationAmount);\r\n requestData.ConvenienceFee = parseFloat($scope.velocityFee);\r\n requestData.EnrollInDirectDebit = $scope.enrollThisBankAccount;\r\n\r\n\r\n /** sends payment info to the server */\r\n var postPayment = function () {\r\n usSpinnerService.spin('spinner-1');\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 PayByCheckService.paymentConfirmation = response.Message;\r\n usSpinnerService.stop('spinner-1');\r\n\r\n $state.goMainLayout('PayByCheckConfirmation');\r\n }\r\n else {\r\n $scope.errors.push({ Message: response.Message });\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 usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(data);\r\n });\r\n }\r\n usSpinnerService.spin('spinner-1');\r\n PaymentVerificationService.verifyPaymentInfo(requestData.AmountToPay, postPayment);\r\n }\r\n else {\r\n getVelocityFee($scope.model.totalAmount);\r\n }\r\n };\r\n\r\n $scope.donateYesClick = function () {\r\n $scope.oneTimeDonationAmount = \"1.00\";\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.directive('numericonly', function () { \r\n return { \r\n require: 'ngModel', \r\n link: function (scope, element, attr, ngModelCtrl) { \r\n function fromUser(text) { \r\n var transformedInput = text.replace(/[^0-9.]/g, ''); \r\n if (transformedInput !== text) { \r\n ngModelCtrl.$setViewValue(transformedInput); \r\n ngModelCtrl.$render(); \r\n } \r\n return transformedInput; \r\n } \r\n ngModelCtrl.$parsers.push(fromUser); \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/Direct Debit'));\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 var params = { accountNumber: localStorage.getItem('CurrentAccountNumber') };\r\n utilli.addUserName($state, params);\r\n $http.get(\r\n localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetPaymentOptions',\r\n { params: params })\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', 'ModalService', 'CommonHeaderService', \r\n function ($scope, $http, $q, $rootScope, $window, $state, usSpinnerService, LeftMenuService, ModalServiceExt, ModalService, 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 EnrollmentType: '1'\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 // for HC we don't allow users to enroll a new BA in DD if DD is already in progress\r\n if (utilli.isHc() && response.Data && response.Data.IsDirectDebitInProgress) {\r\n stopSpin();\r\n $state.goMainLayout('PaymentOptions');\r\n return;\r\n }\r\n ModalServiceExt.showInfo(_t('Bank account information successfully stored'), function () {\r\n if ($scope.BankAccount.EnrollmentType == '2')\r\n {\r\n $http.get(localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetBankAccountSapIdByBankAccountAndRoutingNumber',\r\n {\r\n params: {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n bankAccountNumber: $scope.BankAccount.BankAccountNumber,\r\n routingNumber: $scope.BankAccount.RoutingNumber\r\n }\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 } else if (response.Data != null) {\r\n var sapBankId = response.Data;\r\n $state.goMainLayout('EnrollBankAccountMessage', { Id: sapBankId });\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 else \r\n {\r\n $state.goMainLayout('PaymentOptions');\r\n }\r\n });\r\n // ModalServiceExt.showYesNoMessage(\r\n // $scope._t('Enroll in Direct Debit'), \r\n // $scope._t('Do you want to enroll this bank account in the Direct Debit Program?'), \r\n // function () {\r\n // debugger\r\n // $http.get(localStorage.getItem('ApiUrl') + 'api/DirectDebit/GetBankAccountSapIdByBankAccountAndRoutingNumber',\r\n // {\r\n // params: {\r\n // accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n // bankAccountNumber: $scope.BankAccount.BankAccountNumber,\r\n // routingNumber: $scope.BankAccount.RoutingNumber\r\n // }\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 // } else if (response.Data != null) {\r\n // var sapBankId = response.Data;\r\n // $state.goMainLayout('EnrollBankAccountMessage', { Id: sapBankId });\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 // function(){ $state.goMainLayout('PaymentOptions'); },\r\n // true,\r\n // function(){ $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 utilli.addUserName($state, requestData);\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 // from Ibrahim A. :// this is now a no-op, we've disabled card scanning entirely since the card.io plugin we use is outdated and no longer works\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 var _t = $scope._t;\r\n\r\n LeftMenuService.setCurrentTab('BankAccount');\r\n CommonHeaderService.setUpBackButton($scope._t('Bank Account'));\r\n\r\n $scope.enableDirectDebit = false;\r\n $scope.isAssistant = utilli.hasAssistantRole(localStorage.getItem('SecurityToken'));\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.toggleEnrollment = function () {\r\n if (utilli.isHc() && $scope.BankAccount.IsDirectDebitInProgress) {\r\n ModalServiceExt.showError(_t(\"Unsuccessful! Reason: direct debit is pending.\"));\r\n return;\r\n }\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 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($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 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 $scope.isAssistant = utilli.hasAssistantRole(localStorage.getItem('SecurityToken'));\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 var deleteRequest = {\r\n id: $scope.Card.Id,\r\n accountNumber: localStorage.getItem('CurrentAccountNumber')\r\n };\r\n utilli.addUserName($state, deleteRequest);\r\n $http.post(localStorage.getItem('ApiUrl') + 'api/ProfileCardManage/DeleteSavedCard', deleteRequest)\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 var params = {\r\n accountNumber: localStorage.getItem('CurrentAccountNumber'),\r\n cardId: $stateParams.Id\r\n };\r\n utilli.addUserName($state, params);\r\n $http.get(localStorage.getItem('ApiUrl') + 'api/ProfileCardManage/GetCreditCard', {\r\n params: params\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', 'CheckVersionService',\r\n function ($scope, $http, $state, $q, usSpinnerService, $window, $timeout, ServiceProvidersService, $sce,\r\n CheckVersionService) {\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 $scope.check();\r\n }\r\n\r\n function getContactPhones(serviceProvider) {\r\n usSpinnerService.spin('spinner-1');\r\n var url = DeploymentSettings.providersServiceUrl\r\n + 'StaticData/GetContactPhonesHtml/?serviceProvider='\r\n + serviceProvider;\r\n $http({\r\n url: url\r\n }).success(function (data) {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.contactsInfo = $sce.trustAsHtml(data);\r\n $scope.phoneLoaded = true;\r\n $scope.hasContacts = true;\r\n $scope.isLoading = false;\r\n }).error(function () {\r\n usSpinnerService.stop('spinner-1');\r\n $scope.failedAttempt = true;\r\n $scope.isLoading = false;\r\n $scope.hasContacts = false;\r\n });\r\n }\r\n\r\n $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 // if we are running in a phone then we might not have ApiUrl because the user hasn't ever login yet.\r\n // hence we need to use providersApiUrl to check for maintenance. but providers web api we can't put \r\n // on maintenance using AppOffline.htm approach because we need it to be working to get support phone\r\n // number. hence we change compatible version to '-2' in UtilliConfig.json for providers web api\r\n // and catch it here.\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $http.get(DeploymentSettings.providersServiceUrl + \"Version/IsProvidersWebApiOnMaintenance\")\r\n .then(function (result) {\r\n if (!result.data){\r\n $state.goToSignIn();\r\n }\r\n }).fixedFinally(function() {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n return;\r\n }\r\n else if (url) {\r\n usSpinnerService.spin('spinner-1');\r\n 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 usSpinnerService.stop('spinner-1');\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 }).catch(function (error) {\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: 'GET'\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 localStorage.removeItem(\"offline\");\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 if (!utilli.isPropertyManagerApp()) \r\n $state.goMainLayout('Dashboard');\r\n else \r\n $state.goMainLayout('PropertyStackedDashboard');\r\n\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', 'OpenFileService',\r\nfunction ($scope, $http, $q, $rootScope, $window, usSpinnerService, $state, LeftMenuService,\r\n ModalServiceExt, CommonHeaderService, $sce, OpenFileService) {\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.openPdf = function(filePath){\r\n usSpinnerService.spin('spinner-1');\r\n OpenFileService.openPdf(filePath).catch(function(err){ \r\n ModalServiceExt.showError(err);\r\n }).fixedFinally(function(){\r\n usSpinnerService.stop('spinner-1');\r\n });\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 var _t = $scope._t; \r\n LeftMenuService.setCurrentTab('ProgramEnrolments');\r\n CommonHeaderService.setUpBackButton(_t('Donation History'));\r\n\r\n var apiUrl = localStorage.getItem('ApiUrl');\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n $scope.years = [''];\r\n $scope.year = $scope.years[0];\r\n $scope.donations = null;\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 usSpinnerService.stop('spinner-1');\r\n if (result.Errors && result.Errors.length > 0) {\r\n ModalServiceExt.showError(result.Errors[0]);\r\n return;\r\n }\r\n $scope.donations = result.Data;\r\n $scope.years = [];\r\n _.each($scope.donations, function (item) {\r\n var year = new Date(Date.parse(item.Date)).getFullYear();\r\n if (!_.contains($scope.years, year)) {\r\n $scope.years.push(year);\r\n }\r\n });\r\n //$scope.years.push('');\r\n $scope.year = $scope.years[0];\r\n $scope.yearChanged();\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(\"Document 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: 70\r\n },\r\n {\r\n field: \"Donation\",\r\n title: $scope._t(\"Donation\"),\r\n template: \"#= kendo.toString(Donation, 'C') #\",\r\n width: 50\r\n },\r\n {\r\n field: \"Status\",\r\n title: $scope._t(\"Status\"),\r\n template: \"#= TranslatedStatus #\",\r\n width: 50\r\n }\r\n ]\r\n }\r\n \r\n $scope.yearChanged = function() {\r\n if ($scope.year === ''){\r\n $scope.donationsKendoGrid.dataSource.data($scope.donations);\r\n return;\r\n }\r\n var selectedYearDonations = _.filter($scope.donations, function (item) {\r\n var year = new Date(Date.parse(item.Date)).getFullYear();\r\n return year == $scope.year;\r\n });\r\n $scope.donationsKendoGrid.dataSource.data(selectedYearDonations);\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 usSpinnerService.spin('spinner-1');\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 usSpinnerService.stop('spinner-1');\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 successfully sent to') + ' ' + result.Data + '.');\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 successfully 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 have successfully 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(true);\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', '$rootScope', '$q', \r\n function (ModalService, $window, $rootScope, $q) {\r\n var messagesQueue = [];\r\n\r\n var iconError = 'icon-exclamation-triangle';\r\n var iconInfo = 'icon-info-circle';\r\n var iconQuestion = 'icon-question-circle';\r\n var iconWarning = 'icon-exclamation-circle';\r\n\r\n var messageTypes = {\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, closedCallback) {\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, closedCallback) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showYesNoMessageTask(title, message, yesCallback, noCallback, needHideCloseButton, closedCallback);\r\n }\r\n\r\n this._showYesNoMessageTask = function (title, message, yesCallback, noCallback, needHideCloseButton, closedCallback) {\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.iconClass = iconQuestion;\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 (closedCallback) {\r\n closedCallback();\r\n }\r\n if (closeModal)\r\n closeModal();\r\n processQueue(message, messageTypes.yesNo);\r\n });\r\n\r\n modal.scope.$on('keyup', function (event, e) {\r\n if (e.which == 27) {\r\n modal.element.modal('hide');\r\n }\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, iconClass) {\r\n if (!message)\r\n return;\r\n var that = this;\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.iconClass = iconClass ? iconClass : iconInfo;\r\n $scope.title = title;\r\n $scope.message = message;\r\n $scope.backdrop = that._isBackdropStatic ? \"static\" : true;\r\n $scope.close = function () { };\r\n }]\r\n }).then(function (modal) {\r\n //modal.element.modal();\r\n modal.element.modal({backdrop: that._isBackdropStatic ? \"static\" : true });\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 modal.scope.$on('keyup', function (event, e) {\r\n if (e.which == 27) {\r\n modal.element.modal('hide');\r\n }\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.ok))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.ok,\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._showOkMessageTask(utilli._t('Error'), message, closedCallback, iconError);\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 (error) {\r\n if (error)\r\n console.error(error);\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.ok))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.ok,\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._showOkMessageTask(utilli._t('Error'), message, closedCallback, iconError);\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.ok))\r\n return;\r\n else\r\n addMessageToQueue(message, messageTypes.ok,\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._showOkMessageTask(utilli._t('Error'), message, closedCallback, iconError);\r\n };\r\n \r\n this.showInfo = function (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._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._showOkMessageTask(utilli._t('Info'), message, closedCallback, iconInfo);\r\n };\r\n\r\n this.showMessage = 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, iconInfo) });\r\n\r\n if (messagesQueue.length === 1)\r\n that._showOkMessageTask(title, message, closedCallback, iconInfo);\r\n }\r\n\r\n this.showLoginRequired = function (title, message, loginCallback, registerCallback) {\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 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.iconClass = iconWarning;\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 modal.scope.$on('keyup', function (event, e) {\r\n if (e.which == 27) {\r\n modal.element.modal('hide');\r\n }\r\n })\r\n });\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', 'ModalServiceExt', 'NotificationBoxService',\r\n '$rootScope', '$timeout',\r\n function ($http, $state, $q, ModalServiceExt, NotificationBoxService, $rootScope, $timeout) {\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 // Assistants:\r\n Delinquents: { isVisible: true },\r\n AssistantSearch: { isVisible: true },\r\n AssistantSearchHistory: { isVisible: true },\r\n AssistantProfile: { isVisible: true },\r\n AssistantDisconnections: { 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 // Turn Off:\r\n WorkCenters: { isVisible: true },\r\n WorkOrders: { isVisible: true },\r\n TurnOffMap: { isVisible: true },\r\n LookUp: { isVisible: true },\r\n LookUpLog: { isVisible: true },\r\n //QuickPay: { isVisible: true },\r\n PaymentHistory: { isVisible: true },\r\n };\r\n\r\n var saveAsPrimaryAccount = function (userNameId) {\r\n var deferred = $q.defer();\r\n // i removed spinner here because i think that it's not necessary here and because it interferes\r\n // with spinners started in other places (a page may start its own spinner but here it will be turned off)\r\n // in general i think that we shouldn't start spinners in LeftMenuService. if spinner is really necessary\r\n // here then it's better to rewrite the code to return promise, start spinner in the page controller code,\r\n // launch the method of LeftMenuService and stop the spinner in 'than' method of the returned promise.\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 return deferred.promise;\r\n }\r\n\r\n function saveContractAccountNumberInSearchHistory(contractAccountNumber){\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/Agents/SaveSearchHistory/',\r\n method: \"POST\",\r\n params: { contractAccountNumber: contractAccountNumber }\r\n });\r\n }\r\n\r\n var leftMenuService = {\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 loadTop3SearchHistoryItems(leftMenuService);\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 contractAccounts: [],\r\n findContractAccount: function (contractAccountNumber) {\r\n var self = this;\r\n return _.find(self.contractAccounts, function (item) {\r\n return item.contractAccountNumber === contractAccountNumber;\r\n });\r\n },\r\n isLoadingSearchHistory: true,\r\n selectContractAccount: function (contractAccountNumber, state) {\r\n var self = this;\r\n var contractAccountIndex = _.findIndex(self.contractAccounts, function (item) {\r\n return item.contractAccountNumber === contractAccountNumber;\r\n });\r\n if (contractAccountIndex < 0) {\r\n saveContractAccountNumberInSearchHistory(contractAccountNumber);\r\n self.contractAccounts.unshift({\r\n contractAccountNumber: contractAccountNumber\r\n });\r\n }\r\n if (self.contractAccounts.length > 3) {\r\n self.contractAccounts.pop();\r\n }\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 ? state : \"Dashboard\", {}, { reload: state });\r\n\r\n var currentContractAccountNumber = localStorage.getItem('CurrentAccountNumber');\r\n // don't collapse if we click on menu items within the same contract account\r\n if (currentContractAccountNumber === contractAccountNumber)\r\n return;\r\n if (currentContractAccountNumber) {\r\n $('#menuItem-' + currentContractAccountNumber).collapse('hide');\r\n }\r\n localStorage.setItem('CurrentAccountNumber', contractAccountNumber);\r\n $timeout(function () {\r\n $('#menuItem-' + contractAccountNumber).collapse('show');\r\n }, 100);\r\n },\r\n setContractAccountInfo: function (contractAccountInfo) {\r\n var self = this;\r\n var contractAccount = self.findContractAccount(contractAccountInfo.account.AccountNumber);\r\n // if menu item is not loaded from search history then add it\r\n if (!contractAccount){\r\n contractAccount = { contractAccountNumber: contractAccountInfo.account.AccountNumber};\r\n self.contractAccounts.push(contractAccount);\r\n }\r\n contractAccount.ServiceAddress = contractAccountInfo.account.ServiceAddress;\r\n contractAccount.CustomerFullName = contractAccountInfo.account.CustomerFullName;\r\n // take only HouseNumber and StreetName but skip everything else that goes after first comma.\r\n // for example, \"8574 N HIGH ST, MINERAL CITY, OH, 44656\" -> \"8574 N HIGH ST\"\r\n var addressParts = contractAccount.ServiceAddress.split(',');\r\n contractAccount.addressString = addressParts.length > 0 ? addressParts[0] : contractAccount.ServiceAddress;\r\n },\r\n isActive: function (contractAccountNumber, state) {\r\n var self = this;\r\n return self.currentTab === state && contractAccountNumber == localStorage.getItem('CurrentAccountNumber');\r\n },\r\n goToForAccount: function (contractAccountNumber, state) {\r\n var self = this;\r\n\r\n },\r\n changeAccount: function (accountNumber) {\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 var isAgent = utilli.hasAgentRole();\r\n if (isAgent || utilli.hasPropertyManagerRole() || utilli.hasAssistantRole()) {\r\n // i removed spinner here. see comments in saveAsPrimaryAccount\r\n //usSpinnerService.spin('spinner-1');\r\n var isAssistant = utilli.hasAssistantRole();\r\n var url = isAgent || isAssistant ? apiUrl + 'api/Agents/GetProfile'\r\n : apiUrl + 'api/PropertyManagers/GetProfile';\r\n requestData = {};\r\n utilli.addUserName($state, requestData);\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: { userName: $state.params.userId }\r\n }).success(function (data) {\r\n var userData = isAgent || isAssistant ? 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 ModalServiceExt.showMessage(utilli.serverErrorMessage);\r\n });\r\n }\r\n else 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 // 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(\r\n data.AccountData.PrimaryPhoneNumber === \"\");\r\n }\r\n }).error(function (data) {\r\n console.log(data);\r\n });\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\r\n var isTop3MenuItemLoaded = false;\r\n function loadTop3SearchHistoryItems(leftMenuService) {\r\n // run it only once per page load and only for assistants\r\n if (isTop3MenuItemLoaded || !utilli.hasAssistantRole())\r\n return;\r\n isTop3MenuItemLoaded = true;\r\n leftMenuService.isLoadingSearchHistory = true;\r\n $http.get(localStorage.getItem('ApiUrl') + 'api/Agents/GetSearchHistory/', {\r\n params: {\r\n filter: \"\", group: \"\", page: 1, pageSize: 3, sort: \"\"\r\n }\r\n })\r\n .success(function (data) {\r\n leftMenuService.isLoadingSearchHistory = false;\r\n if (!data || !data.Data || !data.Data.PageData)\r\n return;\r\n leftMenuService.contractAccounts = [];\r\n data.Data.PageData.forEach(function(searchHistoryItem) {\r\n var contractAccount = leftMenuService.findContractAccount(searchHistoryItem.AccountNumber);\r\n // menu item may already exist, for example if it was set from dashboard with other info\r\n if (contractAccount)\r\n return;\r\n contractAccount = {\r\n contractAccountNumber: searchHistoryItem.AccountNumber\r\n };\r\n var address = searchHistoryItem.Address;\r\n // take only HouseNumber and StreetName but skip everything else that goes after first comma.\r\n // for example, \"8574 N HIGH ST, MINERAL CITY, OH, 44656\" -> \"8574 N HIGH ST\"\r\n var addressParts = address.split(',');\r\n contractAccount.addressString = addressParts.length > 0 ? addressParts[0] : address;\r\n leftMenuService.contractAccounts.push(contractAccount);\r\n });\r\n // if current page is related to contract account (sub menu) then we need expand it.\r\n if (leftMenuService.currentTab === 'Dashboard' \r\n || leftMenuService.currentTab === 'BillsAndPayments') {\r\n var menuItemId = '#menuItem-' + localStorage.getItem('CurrentAccountNumber');\r\n // timeout is required here because menu items are not rendered yet\r\n $timeout(function(){\r\n var menuElement = $(menuItemId);\r\n menuElement.collapse();\r\n }, 0);\r\n }\r\n })\r\n .error(function () {\r\n leftMenuService.isLoadingSearchHistory = false;\r\n });\r\n }\r\n\r\n return leftMenuService;\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', ['$rootScope', '$http', '$state', 'ModalServiceExt', function ($rootScope, $http, $state, ModalServiceExt) {\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 // if (utilli.hasAssistantRole())\r\n // return false;\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 $rootScope.$broadcast('subscribe-notification-hide');\r\n saveSettings(settings);\r\n },\r\n\r\n stopReminding: function () {\r\n $http({\r\n method: 'POST',\r\n url: localStorage.getItem('ApiUrl') + 'api/User/StopRemindingSmsSubscription',\r\n data: { '': $state.params.userId }\r\n }).success(function (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showEror(response.Errors[0]);\r\n return;\r\n }\r\n\r\n var settings = getSettings();\r\n settings.SmsSubscribeNotification.isVisibleByUser = false;\r\n settings.SmsSubscribeNotification.isVisibleByServer = false;\r\n saveSettings(settings);\r\n }).error(function (error) {\r\n console.log(error);\r\n ModalServiceExt.showServerError();\r\n });\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', '$q', 'ModalServiceExt', 'usSpinnerService',\r\n function ($http, $q, ModalServiceExt, usSpinnerService) {\r\n var _t = utilli._t;\r\n\r\n var openBill = function (billNumber, accountNumber)\r\n {\r\n usSpinnerService.spin('spinner-1');\r\n var billTab;\r\n if (!isMobileOrRipple()) {\r\n billTab = window.open(\"about:blank\", \"_blank\");\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 openPdf(billUrl, billNumber, billTab).catch(function(err){ \r\n ModalServiceExt.showError(err); \r\n }).fixedFinally(function(){\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n else {\r\n if (billTab)\r\n billTab.close();\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showInfo(_t(\"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 apiUrl = apiUrl ? apiUrl : localStorage.getItem('ApiUrl');\r\n var url = apiUrl + 'api/Bills/GetUnderstandMyBill';\r\n usSpinnerService.spin('spinner-1');\r\n openPdf(url, 'understandYourBill').catch(function(err){ \r\n ModalServiceExt.showError(err);\r\n }).fixedFinally(function(){\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n /**\r\n * Opens a PDF on any platform.\r\n * @param {string} url Path to the file - it can be either http:// or https:// or file://\r\n * @param {*} fileName optional. name of the file. it's relevant if the user will decide to save the file.\r\n * @param {*} billTab optional. for bills we can first check if the bill exists and if it doesn't exist then \r\n * show a message. but we do it using ajax request. and the problem is that we can't run window.open from ajax\r\n * callback because browser will complain and show a notification to the user that the page tries to open new\r\n * tabs. we don't want this notification. the workaround we found is to open the new tab before starting ajax\r\n * request and if bill doesn't exist then close the tab. if the bill exist then we update URL of the already\r\n * opened tab.\r\n */\r\n function openPdf(url, fileName, billTab){\r\n if (!isMobileOrRipple()) {\r\n if (billTab){\r\n billTab.location = url;\r\n }\r\n else {\r\n window.open(url, '_blank');\r\n }\r\n return $q.resolve();\r\n }\r\n else if (isAndroid()) {\r\n return androidOpenPdf(url, fileName);\r\n }\r\n else {// iOS\r\n // window.open stopped to work. \r\n // see: https://github.com/apache/cordova-ios/issues/898#issuecomment-643697420\r\n cordova.InAppBrowser.open(url, \"_system\");\r\n return $q.resolve();\r\n }\r\n }\r\n\r\n /** opens pdf file using cordova plugin for android */\r\n function androidOpenPdf(url, fileName) {\r\n var deferred = $q.defer();\r\n if(!cordova.plugins.fileOpener2) {\r\n var message = _t('Current version of application doesn\\'t support this functionality. You need to update your app!');\r\n ModalServiceExt.showError(message);\r\n usSpinnerService.stop('spinner-1');\r\n deferred.reject(message);\r\n return deferred.promise;\r\n }\r\n checkPermissions()\r\n .then(function (status) {\r\n if(!status.hasPermission)\r\n return askPermissions();\r\n return Promise.resolve(true);\r\n }, function (e) {\r\n console.error(e);\r\n deferred.reject(e);\r\n })\r\n .then(function (hasStoragePermissions) { \r\n if(!hasStoragePermissions) {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showError(_t(\"You don't have permission to access this feature\"));\r\n return;\r\n }\r\n var requestFileSystemSuccessFn = function (dirEntry) {\r\n // if there is no fileName specified then try to get it from url\r\n fileName = fileName ? fileName :\r\n url.substring(url.lastIndexOf('/') + 1, url.lastIndexOf('.pdf'));\r\n var targetFilePath = dirEntry.toURL() + fileName + \".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.error(\"Error downloading PDF from URL: \" + url);\r\n console.error(\"Error code = \" + errorCodeDesc + \", http_status = \" + error.http_status \r\n + \", source = \" + error.source + \", target = \" + error.target + \", body = \" + error.body);\r\n deferred.reject(\"There was an error while downloading the file. Please try again.\");\r\n };\r\n var downloadSuccessFn = function (entry) {\r\n cordova.plugins.fileOpener2.open(\r\n entry.toURL(),\r\n 'application/pdf',\r\n {\r\n error : function(e) {\r\n console.error(e);\r\n deferred.reject(\"There was an error while downloading the file. Please try again.\");\r\n },\r\n success : function () {\r\n deferred.resolve();\r\n console.log('file opened successfully');\r\n }\r\n }\r\n );\r\n };\r\n fileTransfer.download(url, targetFilePath, downloadSuccessFn, downloadErrorFn, true);\r\n }\r\n var requestFileSystemErrorFn = function (error) {\r\n deferred.reject(\"There was an error while reaching to the file system. Code = \" + error.code);\r\n }\r\n var androidDownloadsPath = cordova.file.externalRootDirectory + \"Download/\";\r\n window.resolveLocalFileSystemURL(androidDownloadsPath, requestFileSystemSuccessFn, requestFileSystemErrorFn);\r\n },function (e) {\r\n deferred.reject(e);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function checkPermissions () {\r\n var deferred = $q.defer();\r\n var androidVersionOfApiLevel23 = 6;\r\n if(device.version.split('.')[0] < androidVersionOfApiLevel23)\r\n {\r\n deferred.resolve({\r\n hasPermission: true\r\n });\r\n return deferred.promise;\r\n }\r\n var permissions = cordova.plugins.permissions;\r\n var successCallback = function (status) {\r\n console.log(status);\r\n deferred.resolve(status);\r\n };\r\n var errorCallback = function () {\r\n var errorMessage = 'Storage permission is not turned on';\r\n ModalServiceExt.showError(_t('Storage permission is not turned on')); \r\n console.warn(errorMessage);\r\n deferred.reject(errorMessage);\r\n }\r\n permissions.checkPermission(permissions.WRITE_EXTERNAL_STORAGE, successCallback, errorCallback);\r\n return deferred.promise;\r\n }\r\n\r\n function askPermissions () {\r\n var deferred = $q.defer();\r\n var permissions = cordova.plugins.permissions;\r\n var successCallback = function (status) {\r\n console.log(status);\r\n deferred.resolve(status.hasPermission);\r\n };\r\n var errorCallback = function () {\r\n var errorMessage = 'Storage permission is not turned on';\r\n ModalServiceExt.showError(_t('Storage permission is not turned on')); \r\n console.warn(errorMessage);\r\n deferred.reject(errorMessage);\r\n }\r\n permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, successCallback, errorCallback);\r\n return deferred.promise;\r\n }\r\n\r\n return {\r\n openBill: openBill,\r\n openUnderstandBillFile: openUnderstandBillFile,\r\n openPdf: openPdf\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 var currentProvider = null;\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 () {\r\n return currentProvider \r\n ? $q.resolve(currentProvider) \r\n : this.getProvider(DeploymentSettings.currentServiceProvider);\r\n },\r\n setCurrentProvider: function (provider){\r\n currentProvider = provider;\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 if (result == \"maintenance\")\r\n {\r\n localStorage.setItem(\"offline\", \"1\");\r\n }\r\n else\r\n {\r\n localStorage.removeItem(\"offline\");\r\n }\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 && !utilli.hasAgentRole() && !utilli.hasPropertyManagerRole())\r\n $state.goToWelcome();\r\n else\r\n this.showInsect = false;\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(\"Cannot 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 var getLocalDate = function (dateAsString) {\r\n var result = new Date(Date.parse(dateAsString));\r\n return result;\r\n }\r\n\r\n //parse date as date in local time zone\r\n function parseISOLocalDate(s) {\r\n var b = s.split(/\\D/);\r\n return new Date(b[0], b[1]-1, b[2], b[3], b[4], b[5]);\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 parseISOLocalDate: parseISOLocalDate\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\r\n getWorkCenterIcon: function (truckType) {\r\n var preffix = utilli.isAdmin ? '../' : '';\r\n if (truckType === 0) // Unverified\r\n return preffix + 'Images/map-markers/truck3.png';\r\n if (truckType === 1) // Verified\r\n return preffix + 'Images/map-markers/bluetruck.png';\r\n if (truckType === 2) // In Progress\r\n return preffix + 'Images/map-markers/bluetrucktransparent.png';\r\n\r\n return preffix + 'Images/map-markers/truck3.png';\r\n },\r\n\r\n getWorkOrderIcon: function (orderType) {\r\n var preffix = utilli.isAdmin ? '../' : '';\r\n if (orderType === 0) // Unverified\r\n return preffix + 'Images/map-markers/workorder32.png';\r\n if (orderType === 1) // Verified\r\n return preffix + 'Images/map-markers/workorder32.png';\r\n if (orderType === 2) // In Progress\r\n return preffix + 'Images/map-markers/workorder32.png';\r\n\r\n return preffix + 'Images/map-markers/workorder32.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 LeftMenuService.changeAccount(acc.AccountNumber);\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 to 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 to 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 }]);\nangular.module('utilliApp')\r\n .service('RegistrationInfoService', function() {\r\n var userInfo = {\r\n accountnumber: \"\",\r\n zip: \"\",\r\n customerfullname: \"\",\r\n token: \"\"\r\n }\r\n \r\n return {\r\n userInfo: userInfo\r\n };\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: { \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, { search: $scope.searchingText });\r\n var url = localStorage.getItem('ApiUrl') + 'api/CommonData/GetNotificationViewedStatusesNames';\r\n $http.get(url, { params: params })\r\n .success(function (data) {\r\n options.success(data);\r\n gridResizeFunc($scope.usersKendoGrid);\r\n })\r\n .error(function () {\r\n options.error();\r\n });\r\n } \r\n },\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 //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 };\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 account.IsAccountDisconnectionPending = data.IsAccountDisconnectionPending;\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 }\r\n\r\n function showPastDueInternal(account) {\r\n if (showDueDateInternal(account))\r\n return new Date(account.dueDateTicks) < utilli.getDateWithoutTime();\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 && !account.IsAccountDisconnectionPending && 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', '$interval', '$rootScope', '$http', 'LeftMenuService', '$window', '$state',\r\n 'CommonDataService', 'RequestService', 'usSpinnerService', 'ModalServiceExt', '$timeout',\r\n function ($scope, $interval, $rootScope, $http, LeftMenuService, $window, $state, CommonDataService,\r\n RequestService, usSpinnerService, ModalServiceExt, $timeout) {\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 LeftMenuService.changeAccount(accountNumber);\r\n\r\n $scope.leftMenu = LeftMenuService;\r\n $scope.isMenuLoaded = false;\r\n $scope.signOut = LeftMenuService.signOut;\r\n $scope.isAdmin = utilli.isAdmin;\r\n $scope.isPx = utilli.isPx();\r\n\r\n $rootScope.$on('profile-updated', function (event, args) {\r\n var accountNumber = localStorage.getItem('CurrentAccountNumber');\r\n LeftMenuService.changeAccount(accountNumber);\r\n })\r\n\r\n $scope.goTo = function (state, contractAccountNumber) {\r\n \r\n // NB!!!: this goTo is for unusual cases such as customer view in admin or for assistants where we\r\n // change current contract account when the user clicks on the left menu item.\r\n // for regular navigation we use ng-href because this way it's possible to open pages in separate tab\r\n // by ctrl+click or middle mouse button click.\r\n\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 RequestService.abort();\r\n // contractAccountNumber is not empty for second level menu items in assistants\r\n if (contractAccountNumber){\r\n LeftMenuService.selectContractAccount(contractAccountNumber, state);\r\n // return because state.go happens in LeftMenuService.selectContractAccount\r\n return;\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) \r\n // and we will have tricky issues with wrong data.\r\n $state.goMainLayout(state, {}, { reload: state });\r\n } else {\r\n $state.goMainLayout(state, {}, { reload: state });\r\n }\r\n };\r\n\r\n var mapping = {\r\n 'AccountList': '#account-manager-menu-items',\r\n 'Profile': '#account-manager-menu-items',\r\n 'ChangePassword': '#account-manager-menu-items',\r\n\r\n 'PayNow': '#bill-payment-menu-items',\r\n 'PaymentOptions': '#bill-payment-menu-items',\r\n 'BillsAndPayments': '#bill-payment-menu-items',\r\n\r\n 'Messages': '#notifications-menu-items',\r\n 'Preferences': '#notifications-menu-items',\r\n\r\n 'ReportOutage': '#outage-center-menu-items',\r\n 'OutageMap': '#outage-center-menu-items',\r\n 'OutageList': '#outage-center-menu-items',\r\n 'OutageCenter': '#outage-center-menu-items',\r\n\r\n 'MeterData': '#service-center-menu-items',\r\n 'MoveService': '#service-center-menu-items',\r\n 'CancelService': '#service-center-menu-items',\r\n }\r\n\r\n var expandCurrentMenuItem = function () {\r\n var menuElement;\r\n // don't expand for sub-menu-items for assistants because we do it right after loading\r\n // top 3 search history items in LeftMenuService.loadTop3SearchHistoryItems\r\n if (utilli.hasAssistantRole() && (LeftMenuService.currentTab === 'Dashboard' \r\n || LeftMenuService.currentTab === 'BillsAndPayments')) {\r\n return;\r\n }\r\n menuElement = $(mapping[LeftMenuService.currentTab]);\r\n menuElement.collapse();\r\n };\r\n // includeContentLoaded here because left menu is loaded via ngInclude\r\n $scope.$on('$includeContentLoaded', function(){\r\n // nest function here for easy debug\r\n expandCurrentMenuItem(); \r\n });\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.hasAssistantRole())\r\n $scope.menuTemplate = utilli.isAdmin ? '../Pages/Assistants/LeftMenu.html' : 'Pages/Assistants/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 if (utilli.hasFieldServiceEngineerRole()) {\r\n $scope.menuTemplate = utilli.isAdmin ? '../Pages/FieldServiceEngineer/LeftMenu.html' : 'Pages/FieldServiceEngineer/LeftMenu.html';\r\n\r\n // todo: remove the code below from left menu. and make sure that it doesn't lead to errors in console for regular users\r\n // var sendCurrentPositionToServer = function ()\r\n // {\r\n // navigator.geolocation.getCurrentPosition(function (location) {\r\n // console.log(location.coords.latitude);\r\n // console.log(location.coords.longitude);\r\n // console.log(location.coords.accuracy);\r\n\r\n // $http({\r\n // url: localStorage.getItem('ApiUrl') + 'api/TurnOffService/ReportCoordinates/',\r\n // method: \"POST\",\r\n // params: {\r\n // Id: 1,\r\n // Longitude: location.coords.longitude,\r\n // Latitude: location.coords.latitude\r\n // }\r\n // }).success(function (response) {\r\n // }).error(function () {\r\n // });\r\n // });\r\n // }\r\n // var updateWorkCentersPositionsInterval = $interval(sendCurrentPositionToServer, 1500);\r\n //setInterval(sendCurrentPositionToServer, 5000);\r\n }\r\n else\r\n $scope.menuTemplate = utilli.isAdmin ? '../Pages/LeftMenu.html' : 'Pages/LeftMenu.html';\r\n }\r\n\r\n // $scope.$on(\"$destroy\", function () {\r\n // $interval.cancel(updateWorkCentersPositionsInterval);\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('Profile');\r\n }\r\n\r\n $scope.stopReminding = function () {\r\n NotificationBoxService.stopReminding();\r\n $scope.subscribeSmsNotificationFlag = false;\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\r\n LeftMenuService.setCurrentTab('EnergyEfficiency');\r\n CommonHeaderService.setUpBackButton($scope._t('Insights'));\r\n\r\n $scope.needEnergyCost = DeploymentSettings.currentServiceProvider != Config.hcProviderName;\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(\"Avg. 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(\"Avg. 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 exporting: {\r\n enabled: false\r\n },\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(\"Avg. 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(\"Avg. 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 exporting: {\r\n enabled: false\r\n },\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 exporting: {\r\n enabled: false\r\n },\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 exporting: {\r\n enabled: false\r\n },\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 exporting: {\r\n enabled: false\r\n },\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 exporting: {\r\n enabled: false\r\n },\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 // exporting: {\r\n // enabled: false\r\n // },\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 try{\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 catch (e) {\r\n ModalServiceExt.showError($scope._t(\"An unexpected error occurred. Please try again later.\"));\r\n console.log(e);\r\n }\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 var onResizeAction = function() {\r\n $scope.createAllCharts($scope.data);\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.isConsumptionsExist = !!$scope.data.SameYearNewPeriod;\r\n if($scope.isConsumptionsExist)\r\n $scope.createAllCharts($scope.data);\r\n $(window).bind('resize', onResizeAction);\r\n }\r\n } else {\r\n ModalServiceExt.showError($scope._t(\"Error occurred during consumption retrieval.\"));\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 $scope.$on(\"$destroy\", function () {\r\n angular.element($window).off('resize', onResizeAction);\r\n });\r\n\r\n}]);\nangular.module('utilliApp')\r\n .service('WorkCentersService', [\"$http\", \"$q\", \"$state\", function ($http, $q, $state) {\r\n\r\n var workCenters = [];\r\n\r\n var getWorkCenters = function () {\r\n return workCenters;\r\n }\r\n\r\n var setWorkCenters = function (centers) {\r\n workCenters = centers;\r\n }\r\n\r\n var add = function (center) {\r\n workCenters.push(center);\r\n }\r\n\r\n var exists = function (center) {\r\n if (!center)\r\n return false;\r\n\r\n var index = _.findIndex(workCenters, { Id: center.Id, CompanyCode: center.CompanyCode });\r\n if (index === -1)\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n var remove = function (center) {\r\n if (!center)\r\n return;\r\n\r\n var index = _.findIndex(workCenters, { Id: center.Id, CompanyCode: center.CompanyCode });\r\n if (index === -1)\r\n return;\r\n\r\n workCenters.splice(index, 1);\r\n }\r\n\r\n var reset = function () {\r\n workCenters = [];\r\n }\r\n\r\n var empty = function () {\r\n return workCenters.length === 0;\r\n }\r\n\r\n return {\r\n getWorkCenters: getWorkCenters,\r\n setWorkCenters: setWorkCenters,\r\n add: add,\r\n exists: exists,\r\n remove: remove,\r\n empty: empty,\r\n reset: reset\r\n };\r\n\r\n }]);\nangular.module('utilliApp')\r\n .service('LookUpLogService', [\"$http\", \"$q\", \"$state\", function ($http, $q, $state) {\r\n var _looUpLogKey = \"lookUpLog\";\r\n var _buffer = {};\r\n\r\n function addLogItem(accNumber, discDoc, serialNum, woNumber) {\r\n var log = JSON.parse(localStorage.getItem(_looUpLogKey)) || []\r\n var newItem = {\r\n date: new Date(),\r\n accNumber: accNumber,\r\n discDoc: discDoc,\r\n serialNum: serialNum,\r\n woNumber: woNumber\r\n }\r\n log.push(newItem);\r\n localStorage.setItem(_looUpLogKey, JSON.stringify(log));\r\n }\r\n\r\n var getAllItems = function () {\r\n var result = JSON.parse(localStorage.getItem(_looUpLogKey)) || [];\r\n _.each(result, function (i) {\r\n i.date = kendo.parseDate(i.date);\r\n });\r\n return result;\r\n }\r\n\r\n var pushOutBuffer = function () {\r\n var result = _buffer;\r\n buffer = undefined;\r\n return result;\r\n }\r\n\r\n var popToBuffer = function (lookUpLogItem) {\r\n _buffer = lookUpLogItem;\r\n }\r\n\r\n return {\r\n addLogItem: addLogItem,\r\n getAllItems: getAllItems,\r\n popToBuffer: popToBuffer,\r\n pushOutBuffer: pushOutBuffer\r\n };\r\n\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('WorkCentersController', ['$scope', '$rootScope', '$http', '$timeout', '$window',\r\n 'usSpinnerService', 'LeftMenuService', '$state', 'GetAccountsService', '$stateParams', 'CommonHeaderService',\r\n 'ModalServiceExt', 'WorkCentersService',\r\n function ($scope, $rootScope, $http, $timeout, $window, usSpinnerService, LeftMenuService, $state,\r\n GetAccountsService, $stateParams, CommonHeaderService, ModalServiceExt, WorkCentersService) {\r\n\r\n LeftMenuService.setCurrentTab('WorkCenters');\r\n CommonHeaderService.setUpBackButton('Work Centers');\r\n\r\n $scope.errors = [];\r\n $scope.accountDataList = {};\r\n\r\n $scope.showWorkOrders = function() {\r\n $state.goMainLayout(\"WorkOrders\");\r\n }\r\n\r\n $scope.showCurrentWorkOrders = function (workCenter) {\r\n WorkCentersService.reset();\r\n WorkCentersService.add(workCenter);\r\n workCenter.selected = true;\r\n $state.goMainLayout(\"WorkOrders\");\r\n }\r\n\r\n $scope.selectWorkCenter = function (workCenter) {\r\n if (WorkCentersService.exists(workCenter)) {\r\n WorkCentersService.remove(workCenter);\r\n workCenter.selected = false;\r\n return;\r\n }\r\n\r\n WorkCentersService.add(workCenter);\r\n workCenter.selected = true;\r\n }\r\n\r\n $scope.getWorkCenters = function () {\r\n usSpinnerService.spin('spinner-1');\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/TurnOffService/GetWorkCenterList/',\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.Errors && jsondata.Errors.length > 0) {\r\n\r\n ModalServiceExt.showError(jsondata.Errors[0]);\r\n } else {\r\n $scope.workCentersList = data.Data;\r\n\r\n for (var i = 0; i < $scope.workCentersList.length; i++) {\r\n if (WorkCentersService.exists($scope.workCentersList[i])) {\r\n $scope.workCentersList[i].selected = true;\r\n }\r\n }\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\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.$watch(\"workCentersList\", function (value) {\r\n var val = value || null;\r\n if (val)\r\n $timeout(function () {\r\n $scope.hasScroll = hasScroll();\r\n });\r\n });\r\n\r\n function hasScroll() {\r\n var innerHeight = $('.AccountList').height();\r\n var mainHeight = $('.work-centers-list').height();\r\n var result = innerHeight >= mainHeight;\r\n return result;\r\n }\r\n }])\r\n;\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('LookUpController', ['$scope', '$rootScope', '$http', 'usSpinnerService', 'LeftMenuService',\r\n '$state', 'CommonHeaderService', 'ModalServiceExt', 'LookUpLogService',\r\n function ($scope, $rootScope, $http, usSpinnerService, LeftMenuService, $state,\r\n CommonHeaderService, ModalServiceExt, LookUpLogService) {\r\n\r\n LeftMenuService.setCurrentTab('LookUp');\r\n CommonHeaderService.setUpBackButton('Look Up');\r\n\r\n initForm();\r\n\r\n $scope.lookup = function () {\r\n $scope.submitted = true;\r\n if (!($scope.accNumber || $scope.discDoc || $scope.serialNumber || $scope.woNumber))\r\n return;\r\n LookUpLogService.addLogItem($scope.accNumber, $scope.discDoc, $scope.serialNum, $scope.woNumber);\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/TurnOffService/LookUp';\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: {\r\n accountNumber: $scope.accNumber,\r\n discDocument: $scope.discDoc,\r\n serialNumber: $scope.serialNumber,\r\n woNumber: $scope.woNumber\r\n }\r\n }).success(function (response) {\r\n if (response.HasErrors) {\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 if(!response.Data)\r\n {\r\n ModalServiceExt.showInfo(\"Work orders not found.\");\r\n }\r\n //todo: goto work order/work orders page\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 function addLogItem() {\r\n var log = JSON.parse(localStorage.getItem(Config.looUpLogKey)) || []\r\n var newItem = {\r\n date: new Date(),\r\n accNumber: $scope.accNumber,\r\n discDoc: $scope.discDoc,\r\n serialNum: $scope.serialNum,\r\n woNumber: $scope.woNumber\r\n }\r\n log.push(newItem);\r\n localStorage.setItem(Config.looUpLogKey, JSON.stringify(log));\r\n }\r\n\r\n function initForm() {\r\n var lookUpLogRecord = LookUpLogService.pushOutBuffer();\r\n if (!lookUpLogRecord)\r\n return;\r\n $scope.accNumber = lookUpLogRecord.accNumber;\r\n $scope.discDoc = lookUpLogRecord.discDoc;\r\n $scope.serialNum = lookUpLogRecord.serialNum;\r\n $scope.woNumber = lookUpLogRecord.woNumber;\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('LookUpLogController', ['$scope', '$rootScope', '$window', '$http', 'usSpinnerService', 'LeftMenuService',\r\n '$state', 'CommonHeaderService', 'ModalServiceExt', 'LookUpLogService',\r\n function ($scope, $rootScope, $window, $http, usSpinnerService, LeftMenuService, $state,\r\n CommonHeaderService, ModalServiceExt, LookUpLogService) {\r\n\r\n LeftMenuService.setCurrentTab('LookUpLog');\r\n CommonHeaderService.setUpBackButton('Look Up Log');\r\n\r\n $scope.log = LookUpLogService.getAllItems().reverse();\r\n\r\n $scope.formatDate = function (date) {\r\n var result = $window.kendo.toString(date, \"yyyy-M-dd hh:mm:ss\");\r\n return result;\r\n }\r\n\r\n $scope.goToLookUp = function (lookUpLogItem) {\r\n LookUpLogService.popToBuffer(lookUpLogItem);\r\n $state.goMainLayout('LookUp');\r\n }\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n .controller('PaymentHistoryController', ['$scope', '$rootScope', '$http', 'usSpinnerService', 'LeftMenuService',\r\n '$state', 'CommonHeaderService', 'ModalServiceExt',\r\n function ($scope, $rootScope, $http, usSpinnerService, LeftMenuService, $state,\r\n CommonHeaderService, ModalServiceExt) {\r\n\r\n LeftMenuService.setCurrentTab('PaymentHistory');\r\n CommonHeaderService.setUpBackButton('Payment History');\r\n\r\n $scope.paymentsLoading = false;\r\n $scope.payments = [];\r\n //$scope.before = 9007199254740991;\r\n $scope.before = 0;\r\n\r\n $scope.endOfDataReached = false; // fix for bug: http://stackoverflow.com/questions/23666712/nginfinitescroll-loadmore-method-gets-called-on-every-mouse-scroll\r\n\r\n $scope.getPayments = function () {\r\n if ($scope.paymentsLoading) return;\r\n $scope.paymentsLoading = true;\r\n\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var url = localStorage.getItem('ApiUrl') + 'api/TurnOffService/GetPaymentList';\r\n var dataRequest = { before: $scope.before, count: 10 };\r\n\r\n $http({\r\n method: 'GET',\r\n url: url,\r\n params: dataRequest\r\n }).success(function (response) {\r\n\r\n if (response.HasErrors) {\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(!response.Data)\r\n {\r\n ModalServiceExt.showInfo(\"Payments not found.\");\r\n }\r\n\r\n //$scope.payments = response.Data;\r\n\r\n if (response.Data.length == 0) {\r\n $scope.paymentsLoading = false;\r\n $scope.endOfDataReached = true; // fix for a bug: http://stackoverflow.com/questions/23666712/nginfinitescroll-loadmore-method-gets-called-on-every-mouse-scroll\r\n usSpinnerService.stop('spinner-1');\r\n return;\r\n }\r\n\r\n for (var i = 0; i < response.Data.length; i++) {\r\n $scope.payments.push(response.Data[i]);\r\n }\r\n $scope.before = $scope.payments[$scope.payments.length - 1].Id;\r\n\r\n $scope.paymentsLoading = false;\r\n usSpinnerService.stop('spinner-1');\r\n }\r\n\r\n }).error(function () {\r\n $scope.paymentsLoading = false;\r\n ModalServiceExt.showServerError();\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n }\r\n\r\n\r\n }]);\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('WorkOrderController',\r\n[\r\n '$scope', '$rootScope', '$http', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'CommonHeaderService', '$stateParams', 'ModalServiceExt',\r\n function($scope,\r\n $rootScope,\r\n $http,\r\n $state,\r\n usSpinnerService,\r\n LeftMenuService,\r\n CommonHeaderService,\r\n $stateParams,\r\n ModalServiceExt) {\r\n\r\n CommonHeaderService.setUpBackButton('Work Order');\r\n\r\n function applyServiceAddressElement() {\r\n var element = document.getElementById('serviceAddress');\r\n\r\n var height = element.scrollHeight + (element.offsetHeight - element.clientHeight);\r\n element.style.height = height + \"px\";\r\n }\r\n\r\n usSpinnerService.spin('spinner-1');\r\n var dataRequest = {\r\n contractAccountNumber: $stateParams.contractAccountNumber,\r\n orderNumber: $stateParams.orderNumber\r\n };\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/TurnOffService/GetWorkOrder/',\r\n method: \"GET\",\r\n params: dataRequest\r\n })\r\n .success(function(response) {\r\n usSpinnerService.stop('spinner-1');\r\n if (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n } else {\r\n $scope.order = response.Data;\r\n setTimeout(function() { applyServiceAddressElement(); }, 10);\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n }\r\n })\r\n .error(function() {\r\n usSpinnerService.stop('spinner-1');\r\n ModalServiceExt.showServerError();\r\n });\r\n\r\n $scope.payNow = function() {\r\n localStorage.setItem('CurrentAccountNumber', $scope.order.AccountNumber);\r\n $state.goMainLayout('PayNow');\r\n }\r\n }\r\n]);\r\n\n'use strict';\r\nangular.module('utilliApp')\r\n.controller('WorkOrdersController', ['$scope', '$rootScope', '$http', '$state', 'usSpinnerService',\r\n 'LeftMenuService', 'CommonHeaderService', 'WorkCentersService', 'ModalServiceExt',\r\nfunction ($scope, $rootScope, $http, $state, usSpinnerService, LeftMenuService, CommonHeaderService,\r\n WorkCentersService, ModalServiceExt) {\r\n LeftMenuService.setCurrentTab('WorkOrders');\r\n CommonHeaderService.setUpBackButton('Work Orders');\r\n\r\n if (WorkCentersService.empty())\r\n {\r\n $scope.goToWorkCenters = function () {\r\n $state.goMainLayout('WorkCenters');\r\n }\r\n\r\n $scope.errorMessage = 'You should select Work Centers.';\r\n return;\r\n }\r\n\r\n $scope.orders = [];\r\n $scope.ordersLoading = false;\r\n $scope.endOfDataReached = false;\r\n $scope.loadOrdersAfter = 0;\r\n\r\n $scope.getOrders = function () {\r\n\r\n if ($scope.ordersLoading)\r\n return;\r\n\r\n usSpinnerService.spin('spinner-1');\r\n\r\n $scope.ordersLoading = true;\r\n var pageSize = 20;\r\n var workCenters = WorkCentersService.getWorkCenters();\r\n var requestObjects = [];\r\n workCenters.forEach(function (item) {\r\n requestObjects.push({ Id: item.Id, CompanyCode: item.CompanyCode, Name: item.Name, Plant: item.Plant });\r\n });\r\n\r\n var jsonCenters = JSON.stringify(requestObjects);\r\n\r\n var dataRequest = { centers: jsonCenters, after: $scope.loadOrdersAfter, count: pageSize };\r\n $http({\r\n url: localStorage.getItem('ApiUrl') + 'api/TurnOffService/GetWorkOrders/',\r\n method: \"GET\",\r\n params: dataRequest\r\n }).success(function (response) {\r\n usSpinnerService.stop('spinner-1');\r\n\r\n if (response) {\r\n if (response.Errors && response.Errors.length > 0) {\r\n ModalServiceExt.showError(response.Errors[0]);\r\n } else {\r\n $scope.handleOrders(response.Data);\r\n if (response.Data.length < pageSize) {\r\n $scope.ordersLoading = false;\r\n $scope.endOfDataReached = true; // fix for a bug: http://stackoverflow.com/questions/23666712/nginfinitescroll-loadmore-method-gets-called-on-every-mouse-scroll\r\n }\r\n }\r\n } else {\r\n ModalServiceExt.showServerError();\r\n }\r\n }).error(function () {\r\n ModalServiceExt.showServerError();\r\n })['finally'](function() {\r\n usSpinnerService.stop('spinner-1');\r\n });\r\n };\r\n\r\n $scope.handleOrders = function (orders) {\r\n if (!orders) {\r\n $scope.ordersLoading = false;\r\n return;\r\n }\r\n\r\n for (var i = 0; i < orders.length; i++)\r\n $scope.orders.push(orders[i]);\r\n\r\n if ($scope.orders[$scope.orders.length - 1] != undefined)\r\n $scope.loadOrdersAfter = $scope.orders[$scope.orders.length - 1].Number;\r\n $scope.ordersLoading = false;\r\n\r\n };\r\n\r\n $scope.openOrderDetails = function (order)\r\n {\r\n $state.goMainLayout('WorkOrder', { contractAccountNumber: order.AccountNumber, orderNumber: order.Number });\r\n }\r\n}]);"],"names":["window","location","origin","protocol","hostname","port","String","prototype","startsWith","searchString","position","this","substr","length","endsWith","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","toFixed","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","Assistant","PropertyManager","CSR","CSRAdmin","FieldServiceEngineer","SystemUser","DataExporter","scrollTop","scrollBottom","delay","setTimeout","each","index","scrollHeight","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","getFileUrlWithToken","token","hasAdminOrCsrRole","payload","getPayload","some","role","isSafari","isFirefox","setWindowLocation","goesToDefaultPage","$state","setApiUrl","goToAdmin","adminUrl","getAdminUrl","hasPropertyManagerRole","goMainLayout","hasAgentRole","hasFieldServiceEngineerRole","indexOfIndex","pathname","hasRole","hasAssistantRole","notAgentOrAssistant","result","hasDataExporterRole","hasAdminRole","hasCsrAdminRole","hasSuperAdminRole","r","isDemo","DeploymentSettings","deploymentEnvironment","getCurrentUserName","encoded","atob","getFullPhoneNumber","maskPhoneNumber","registerGoogleAnalytics","win","rootScope","isMobile","ga","cookieFlags","currentServiceProvider","$on","event","relativeUrl","path","localizationDictionary","enableLanguagePack","providers","EnableLanguagePack","registerLocalization","resource","setItem","changeLanguage","_t","localized","callback","filePath","currentVersion","get","errors","serverErrorMessage","validationErorrsMessage","urlPrefixKendoLib","getScript","kendo","culture","languages","wgl","name","abbreviation","px","gni","demo","hc","getCountryPhoneNumberCode","datePickerOptions","formatYear","startingDay","showWeeks","isAuthorized","getApplicationService","serviceName","angular","element","querySelector","injector","mobilePlatforms","unknown","android","iOs","windowsPhone","getPlatformName","formatNumber","num","toLocaleString","maximumFractionDigits","formatCurrency","minimumFractionDigits","trimFloat2","localStorageItemNotNull","parsePositiveFloat","parsed","propertyRefreshTimeout","getCurrentProviderConfigValue","defaultValue","getHelpEmail","getSupportPhoneNumber","isPropertyManagerApp","providersGroupShortName","toUpperCase","isPx","isHc","adjustPhoneNumber","phoneNumber","phoneNumberLengthWithoutCountryCode","countryCodeLength","fixSelectElementForMobile","allSelectElements","addEventListener","e","stopPropagation","clientEnum","mobileApp","portal","pm","meterErrorCodes","serviceAddressMismatch","getStateNameWithoutLayout","fullStateName","togglePasswordVisibility","pswId","iconId","elemPassword","attr","toggleClass","getStringForComparison","source","replace","notificationTypes","sms","email","smsAndEmail","paymentTypes","card","check","hideColumnByTitle","grid","fieldName","columns","title","hideColumn","arePhoneNumbersEqual","phone1","phone2","emptyAccountStatus","fillAccountStatuses","accountInfo","Tax","CheckStatus","HardshipIndicator","MeterStatus","MeterStatusDescription","CashOnlyCustomer","getDateWithoutTime","dateTime","setHours","hcMeterStatuses","notInstalled","installedRelevantToTech","allocatedToInstallation","meterDisconnected","inActive","active","getSafariPushNotificationPermissionData","safari","pushNotification","permission","checkSafariRemotePermission","$scope","accountNumber","pd","checkFn","permissionData","requestPermission","$apply","_currentServiceProviderDeffered","jQuery","Deferred","resolveServiceProviderApiDeffered","resolve","rejectServiceProviderApiDeffered","reject","getServiceProviderApiDeffered","promise","getUrlParameter","p","parameterName","pageUrl","hash","substring","urlVariables","decodeURIComponent","handleOrientationChange","onorientationchange","allInputCssSelectors","is","fixHeight","allInputAndSelectCssSelectors","getTopMenu","getBottomMenu","labels","scrollToElement","id","append","height","scrollIntoView","topMenuHeight","resetHeightFix","on","css","top","version","Debug","serverErrorMsg","consumptionUnits","Water","CCF","Gallons","Electricity","kWh","Gas","MCF","Therms","getCurrentConsumptionUnits","utilliType","getConsumptionUnitFraction","unitsType","enableBillDownload","smallConvenienceFee","largeConvenienceFee","largeConvenienceFeeBorder","ccNumberMask","contractAccountMaxLength","zipCodeRegexp","emailPattern","maxMetersOnStackedDashboard","wglProviderName","hcProviderName","pxProviderName","Neo","Name","SiteName","HelpEmail","EnablePhoneNumbersOnLoginPage","EnableOutageMap","Orwell","Ewst","Wgl","EnablePropertyManagerLink","SupportPhoneNumber","Px","Bangor","Frontier","Hc","DemoProvider","SapDemoProvider","appUrls","winPhone","wglProvidersGroupShortName","hcProvidersGroupShortName","pxProvidersGroupShortName","states","date","month","parseInt","getPositiveAmount","toString","module","factory","request","config","clientVersion","withoutAuthentication","headers","$q","$injector","RequestService","notAuthenticatedRequest","reload","newUrl","indexOfAdmin","newLocation","current","indexOfRelativeUrl","forcedAbort","goToSignIn","add","keys","isObject","forEach","isUndefined","saveEmptyParametersOf","header","showMessage","abort","responseError","usSpinnerService","requestUrl","deferred","stateService","status","go","timeout","isZeroStatusResponse","defer","ajax","providersServiceUrl","method","done","providerInfo","provider","ApiUrl","fail","then","IsAvailable","stop","fnCallback","$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","signInParams","from","login","SignUpAgentSteps","SignUpAssistantSteps","ForgotPasswordSteps","ForgotUserIdSteps","ForgotUserIdByEmailSteps","SignUpSteps","QuickPay","QuickPaySteps","$provide","decorator","$delegate","promisePatcher","fixedFinally","fn","originalThen","originalThenResult","apply","originalDefer","originalResolve","resolvedPromise","$http","fixFinally","fixHttpPromise","ajaxPromise","originalErrorMethod","originalErrorHandler","originalThenMethod","originalThenErrorHandler","regularArguments","errorHandler","scopeErrors","showAjaxError","Data","error","addApiThen","wrapper","filter","defaults","post","param","obj","subName","subValue","innerObj","query","encodeURIComponent","transformRequest","run","$rootScope","$window","$location","$document","CheckVersionService","ServiceProvidersService","ServerCacheService","$resource","productTourService","lastLocationChangeTimestamp","itemNotNull","isProtectedPage","toState","bind","$broadcast","clearServerCache","extendedSplashScreen","FastClick","attach","actualLocation","clear","$watch","toParams","fromState","isTourActive","pauseTour","isAccountDataValid","preventDefault","options","propertyManager","contractAccountNumber","goTopMenuLayout","goToWelcome","goToAgentsWelcome","goToAssistantsWelcome","goToPropertyManagersWelcome","withRedirect","redirectedFrom","stringify","stateParams","goToSignUp","goToForgotPassword","goToForgotUserID","goToSignInWithRedirectTo","to","redirectTo","includesChild","childStateName","goFromWelcomeTo","goRelativeTo","parentName","childName","parentPos","topRoute","checkVersion","isVersionWrong","isVersionCorrect","getProviderApiUrl","success","directive","$compile","restrict","scope","attrs","ngBindHtmlDynamic","html","innerHTML","contents","fixNumberFormat","Number","keyup","trim","oldValue","keydown","keyCode","focusout","$timeout","placeholder","CommonHeaderService","HeaderServiceFactory","getHeaderSerivce","$stateParams","$sce","validateToken","isAgent","isPropertyManager","welcomePath","spin","getProvider","providerData","verificationToken","trustAsHtml","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","resp","dbInfo","showInfo","applyMigrations","checkVersionPromise","goToWithVersionChecking","botLogin","dataobj","userNameOrEmail","credentials","channelId","search","fromId","svc","getGridResizeFunc","gridElement","bottomSpace","kendoGrid","table","contentContainerHeight","innerHeight","containerOtherElemententsHeight","getBoundingClientRect","otherElements","children","not","otherElementsHeight","outerHeight","contentContainerHeightWithoutTopElements","heightOf10Rows","_data","clientHeight","floor","minHeight","extendPaymentItem","paymentItem","isPaymentCancelationEnabled","PaymentDescription","PaymentAmount","paymentDateUnix","PaymentDate","checkOrConfirmationNumber","PaymentConfirmationNumber","canCancelPayment","now","setDate","getDate","controlTime","getCanCancelPayment","cancelPayment","AccountNumber","PaymentId","billsService","CommonDataService","PaymentHistoryService","setCurrentTab","currentTab","isPayNowButtonVisible","viewDetails","bill","setCurrentBill","showSlideAnimation","billNumber","BillNumber","billAmountClass","billItem","PaidStatus","billsHistoryInfoForScrolling","billsInfoForScrolling","billsInfoBusy","billsLoadedCount","billsInfoEndReached","billsHistoryInfoBusy","paymentsLoaded","billsHistoryInfoEndReached","getBillsInfoScrolling","dataRequest","skip","pageSize","withTotalCount","IsGettingDashboardInfo","ErrorList","acceptBillsInfoScrolling","Bills","getBillsHistoryInfoScrolling","getCommonData","commonData","EnablePaymentCancelation","jsondata","acceptBillsHistoryInfoScrolling","GetPaymentHistoricBills","splice","BillsService","OpenFileService","GridService","gridResizeFunc","resize","billsKendoGrid","args","dataSource","read","refresh","understandMyBill","openUnderstandBillFile","makePayment","managePaymentOptions","viewBill","openBill","mainGridOptions","transport","transports","webapi","prefix","parameterMap","extend","page","usersKendoGrid","schema","total","serverPaging","sortable","pageable","pageSizes","buttonCount","serverFiltering","serverSorting","dataBound","field","width","paymentsKendoGrid","hidden","ModalService","CustomerInfoDataService","DueReminderService","UnitsService","TimeService","units","setUpNotificationButton","customerInfo","account","loading","showProductTour","userinfo","Tour","startTour","showDueReminder","isReminderShown","markAsShown","DateDiff","TotalOpenBalance","IsDisconnected","showModal","modal","close","ServiceAddress","CustomerFullName","LastPaymentDate","LastPaymentAmount","dashboardInfo","payNow","emiOption","getUtilityImage","showRefundButton","EnablePaymentRefund","EnableInstallmentPlan","isEmiOptionVisible","requestRefund","GetDashboardInfo","getCustomerInfoData","customerInfoData","setContractAccountInfo","ERROR_LIST","UtilliType","updateUnits","showDueDate","DueDate","showPastDue","showDisconnected","showDisconnectionPending","accountStatuses","parseISOLocalDate","dueDate","IsAccountDisconnectionPending","ex","acceptDashboardData","err","$element","getCachedData","SupportPhone","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","changeAvatar","forPropertyManager","autoPayEnabled","reminderEnabled","confirmationEnabled","reminderSms","reminderEmail","confirmationSms","confirmationEmail","accountBalance","paymentHistory","settings","requestQueue","PaymentHistory","AccountBalance","ReminderSetting","ConfirmationSetting","paymentMethods","PaymentOptions","getPoListLabel","paymentOption","PaymentType","Info","toogleAutoPay","saveAutopaySettings","toogleReminder","toogleConfirmation","goToPaymentHistory","goToPayNow","goToPaymentOptionEdit","paymentType","goToPaymentOptions","savingStatus","$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","type","colorCount","exporting","enabled","text","subtitle","xAxis","categories","tickmarkPlacement","rotation","yAxis","formatter","tooltip","valueSuffix","plotOptions","area","stacking","lineColor","lineWidth","marker","credits","consumptionData","setSelectedUnitsIfEmpty","Uom","coefficient","getCoefficient","tableData","TableData","shift","clone","Consumption","ConsumptionString","AvgConsumption","AvgConsumptionString","Unit","Year","Month","MeterConsumptions","meterColor","MeterNumber","stringFixed","Consumptions","convertedConsumption","Dates","fillChartData","Highcharts","propertyId","enableIndividualMeters","EnablePropertyManagersDashboardIndividualMeters","urlForConumptions","backToBarGraph","getExcelData","uom","getGreenButtonData","refreshScore","groupName","delegatingUser","DelegatingUser","delegatingUserPhone","DelegatingUserPhone","delegatingUserEmail","DelegatingUserEmail","NumberOfProperties","PropertiesCount","pointFormat","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","isIosMobile","headerText","currentYear","getFullYear","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","inputField","toJson","propertyFieldSettings","dateString","itemNum","setting","currentAsOf","valueSpecified","currentAsOfSpecified","temporary","temporarySpecified","getPropertyUsage","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","gp","selectedPropertyToAdd","availableProperties","all","propertyFromTheList","catch","authorizations","fixScore","score","getAuthorizations","scrollingBusy","authorizationsCompleted","view","sendInvitation","exportData","authorizationsKendoGrid","gridOptions","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","saveSearch","searchResults","dataItem","companyName","isSearchResultVisible","isRequiredFilled","searchForm","$error","pattern","houseNumber","street","zipCode","unitApt","HouseNoSupplement","onHouseNumberChange","splited","byAccountNumber","byAddress","isZipCodeValid","askAboutSettlementProperty","searchResult","utilityType","UtilityType","addressLine","apiThen","goToAccountDashboard","getTimeZone","timeZoneShift","convertDate","usersUrl","searchHistoryKenoGrid","meterStatus","goToOverview","askUser","settlementDate","dpOptions","altInputFormats","datepickerPopup","opened","propertyAddress","settlementPropertyForm","firstAndLastName","firstLastName","mailingAddress","toUTCString","SecureData","userEmail","changeAccount","forAgent","apiUrlAsync","queryParams","redirect_uri","SecurityToken","togglePassword","getRequestParams","sortSettings","fullName","balance","loadData","delinquents","parameter","sortSetting","selectContractAccount","pay","resetSearch","forAssistant","languageParams","currentLanguage","goToLanguages","redirect","defaulState","isDebug","services","showResentVerificationEmailField","resetErrors","errorFromServerReturned","serverErrorInformation","serverErrors","showServerErrors","setIsTouchIdAvailable","FingerprintAuth","isAvailable","isAvailableSuccess","isAvailableError","plugins","touchid","touchIdAvailable","hasEnrolledFingerprints","message","signIn","fromAddress","isTouchIdAvailable","touchIdRefreshToken","mobilePlatform","rememberMe","mobileDeviceToken","getDeviceToken","contactPhoneNumber","workingHours","WorkingHours","billingEmailTo","BillingEmailTo","CompanyName","Valid","errorMessage","lastApiUrl","lastServiceProviderName","refreshToken","TouchIdRefreshToken","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","fingerPrintSuccess","touchIdDataString","touchIdData","fingerPrintError","hasTouchIdData","loginWithTouchId","encrypt","clientId","verifyFingerprint","offline","_lastLoginWithRequiredEmail","res","stepName","showResentVerificationEmail","showResentVerificationEmailDone","emailRequired","debug","gotoAfterVersionChecking","goToForgotUserId","backVisible","resentVerificationEmail","copyServices","loginForm","isMaintenance","any","emailError","checkProvidersPromise","providersApiUrl","checkServiceProviders","checkVersionResult","checkProvidersSuccess","isEmailRequired","loginByProvider","capsLockFlags","resetCapsLockFlags","which","shiftKey","capsLock","includes","selectedService","radioClick","removeClass","prop","addClass","RegistrationInfoService","userInfo","accountnumber","customerfullname","initForm","ZipCode","FullName","setCurrentProvider","formAccountInfo","checkAccountInfoPromise","Step","Client","Token","NonLegacyAccount","serviceProvider","checkAccountInfoResult","Email2","Value","question","UserID","user","SecurityAnswer","answer","isUserDataCorrect","required","Password","ConfirmPassword","SecurityQuestion1","SecurityAnswer1","psw","emailNotificationsAccepted","baseUrl","Fullname","TermsAndConditions","termsAccepted","EmailNotificationsAccepted","checkTermAndConditionsFormSubmit","firebaseWebPushService","createFirebaseWebPushService","isWebPushBellBoxVisible","Notification","askPermissionsForWebPush","subscribe","goToStep2","PaymentVerificationService","browser","showLoading","imagesPath","resetPayBtn","isPayNowBtnText","isPayNowEnabled","velocityFee","getVelocityFee","newAmount","Card","cardNumber","amountDue","PPIFeeValue","streetName","onlyNumbers","firstLastNamePattern","IsSuccessful","quickPayValidationType","quickPayValidationCaption","isFeeEnabled","LargeConvenienceFeeBorder","SmallConvenienceFee","LargeConvenienceFee","paymentInfoText","FeeInformation","commomData","isBankAccountPaymentsEnabled","IsBankAccountPaymentsEnabled","isCreditCardCvvEnabled","IsCreditCardCvvEnabled","isCreditCardBillingAddressEnabled","IsCreditCardBillingAddressEnabled","QuickPayValidationType","radioSearchType","deviceInfoKey","getSavedDeviceInfo","deviceInfosJson","deviceInfos","saveDeviceInfo","deviceToken","savedInvoiceNumbers","savedInvoiceNumbersString","findResultVisible","amountDueDisabled","informationMessage","isInformationMessageShown","showProceedAnyway","outputSearchType","searchRequest","streetNumber","apartmentNumber","appartment","findResultList","validateInvoiceNumber","deviceInfo","currentAccount","accountNum","invoiceNum","businessPartnerNum","isValid","alert","invoiceNumberError","isPaymentInfoAgreeBank","isPaymentInfoAgreeCard","clearAccountSearch","clearAddressSearch","iKnowAccountNumberClick","iKnowServiceAddressClick","selectAccount","clearPaymentSettings","getConvFeeInfo","TotalOpenBallance","updateConvinienceFee","totalAmount","formatDecimal","convinienceFee","formatTotalAmount","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","postPayment","payCardAccount_form","ccNumber","$invalid","ccExpMonth","ccExpYear","ccExp","$type","proceededWithoutSearch","selectedCompany","companyCode","CompanyCode","paymentObject","amountToPay","dueAmount","expirationDateYear","expirationDateMonth","Browser","ConvenienceFee","PaymentPage","paymentResult","paymwntResult","verifyPaymentInfo","payNowBankAccount","payBankAccount_form","selectedCompanyOption","requestResult","routingNumber","routNumError","nameOnAccount","checkingAccountNumber","bankAccountPay","paymentOk","viewurl","proceedToRegistration","activeElement","blur","setErrors","showCsrLink","CheckUserInfoFormSubmit","frmCheckUserInfo","appUrl","CheckSecurityAnswerFormSubmit","frmSecurityAnswer","billingDepartment","BillingDepartment","require","elem","ctrl","otherInput","inheritedData","repeatPassword","$parsers","goToCsr","pstrAccountNumber","confirmpassword","actionEvent","model","UserId","userMessage","recipients","availableOptions","selectedOption","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","resizeAction","graphType","graphTypeConsumption","meterNum","consumptionType","off","totalNumberOfMeters","numberOfErrors","authorized","propertyPrimaryFunctionName","numberOfMeters","NumberOfMeters","NumberOfErrors","propTypeNames","editPropertyOverview","editPropertyDetails","editMeters","submitAuth","showChartLoading","isExportToExcelButtonVisible","getGraph","currentAccountNumber","graphPageJson","hideLoading","isFirstGraphLoad","PageData","setSelectedUnits","processGraphData","pointsTotalCount","Count","graphPoints","convertChartUnits","reading","tableDataItem","ReadingDateForTable","consumption","registers","registerNum","RegisterNumber","amountString","averageMonthlyTemperature","MonthAverageTemperature","AverageMonthlyTemperature","createChart","startSpin","stopSpin","getConsumptionString","consumptionHistoryItem","selectedFraction","sourceFraction","number","targetUnitsType","sourceUnitsType","currentUnits","convertUnits","getSelectedUnitsTypeName","graphData","pointFormatter","ReadingDateForGraphCategory","buildChart","dropDownItems","unitsTypeName","updateProperties","existingPropertyList","areTherePropertiesInProgress","existingProperty","ep","IsSyncInProcess","EnergyStarScore","CurrentConsumption","withoutDelegated","reloadPropertylist","isLoading","checkApiResponseError","catchAjaxError","updateProperty","freshProperty","GetPropertyStatus","selectedMeters","selectedIds","MeterIds","reloadFinishCallback","reloadProperty","MaxPaymentAmount","CanConfirmMaxPaymentAmount","MaxPaymentAmountWarningText","MaxPaymentAmountErrorText","AccountListService","showDueDateInternal","TotalBalance","showPastDueInternal","dueDateTicks","AddAccount","accountDataList","DeleteAccount","newPrimaryAccount","currentPrimaryAccount","getNewPrimaryAccount","acc","changeContractAccount","GoToAccountList","GetAccountsList","getAccounts","Accounts","getTotalBalanceClass","getAccountBalanceClass","getDueDateClass","buttonMessage","busy","getLogo","getLogoText","getText","tryPing","d","UpdateApp","specialCharacktersRegexp","nameValid","addAccount","dataObj","accountEmptyError","accountFormatError","zipEmptyError","zipFormatError","fullNameEmptyError","validated","Messages","transclude","paymentHistoryItem","newPasswordEmpty","passwordsDontMatch","newPasswordLength","newPasswordNoDigits","newPasswordNoLetters","newPasswordNoSpecialSymbols","pswSameAsUserNameError","newPassword","confirmNewPassword","changePassword","validate","NewPassword","SuccessMessage","logoutRequired","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","houseNumberPOBoxEmptyError","houseNumberPOBoxFilledError","invalidHouseNumberError","invalidPOBoxError","streetError","oddStreetError","cityError","invalidCityError","stateError","invalidStateError","zipError","regexp","forwardingAddress","stopServiceDate","ProgramEnrollmentsSettings","loadSettings","getSettings","programs","getStateRef","learnMore","programName","enrollEBilling","toggleProgramEnrollment","programEnrollmentsType","eBilling","EBilling","IsEnrolled","enrollAutoPay","showNotImplemented","goDonationHistory","enrollBudgetBillingAction","budgetBillingLearnMore","budgetBillingAction","BudgetBilling","budgetBilling","unenrollSmsNotifications","unenrollEmailNotifications","goDonationProgramEnrollment","setEnrolled","enrollRoundUpDonation","Donation","withoutCache","toggleEnrollment","sendRequest","enrollOrUnenroll","_cachedData","donation","autoPay","programType","caNumber","settingName","goToStep1","checkSettings","RoundUpEnabled","FixedAmountEnabled","PercentageEnabled","isDataLoaded","donationPreference","fixedAmountEnrollForm","percentageEnrollmentForm","ChangePasswordPasswordRequirements","currentPassword","isButtonPressed","CurrentPassword","loadFAQ","faqContent","loadSystemInfo","responseData","serverInfo","errorData","serverAddress","screen","toHtml","htmlCode","checkFaq","directDebitParam","donationParam","processFaq","closest","downloadManual","$last","$eval","repeatDone","$parse","ngBindHtml","avatar","getCurrentAvatar","getAvatars","avatars","setAvatars","originalPhoneNumber","customerPrefUrl","enableVerifyDiv","otpError","otp","accountInfoActive","mailingAddressDisabled","userInfoErrors","accountInfoErrors","otpErrors","addAccountError","addUserInfoError","addAccountErrors","merge","addUserInfoErrors","invalidEmailError","nameError","updateProfileData","profile","PrimaryPhoneNumber","initialFullName","FirstAndLastNameOrCompanyName","FullCustomerServiceInfo","EnableMailingAddress","EnableProfileNameChange","EnableSmsPayments","isPoBoxEnabled","IsPoBoxEnabled","phoneNumberSubscriptionText","getProfileData","AccountData","AvatarURL","getCustomerPrefLink","trustAsResourceUrl","Url","onIframeLoad","dashboard","toAccountInfo","toUserInfo","getUserInfoClasses","getAccountInfoClasses","openCustomerPrefUrl","validatePhone","SubscribeForSmsNotification","Result","sendEmailOtp","username","verifyEmailOtp","subscribeYes","SubscribeForEmailNotification","subscribeNo","phoneSubscribeYes","phoneSubscribeNo","changePhoneNumber","selectedImage","loadAvatars","imageUrl","selectAvatar","avatarData","getBackStateName","setSizeWithZoom","iFrameHeight","scale","contentWindow","iFrameWidth","offsetWidth","offsetHeight","$digest","outageMapDescription","outageListDescription","outageSafetyDescription","outageHistoryDescription","getOutagesStatistic","reportsCount","avgRestorationHours","AverageRestorationTime","Hours","hoursAbbreviation","avgRestorationMins","Minutes","minutesAbbreviation","outageMap","outageList","outageSafety","outageHistory","$interval","OutagesService","isRootDetailsVisible","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","directionsService","DirectionsService","directionsDisplay","DirectionsRenderer","calcRoute","start","end","destination","travelMode","route","setOptions","suppressMarkers","preserveViewport","resizeMap","setDirections","distance","routes","legs","duration","routeDistance","routeDuration","setMap","refreshEstimation","workCenterMarker","orderMarker","getWorkOrderInfoInterval","getWorkOrderInfo","workCenterInfo","orderLocation","CurrentWorkOrderLatitude","CurrentWorkOrderLongitude","workCenterLocation","workOrderIcon","common","getWorkOrderIcon","workCenterIcon","getWorkCenterIcon","setPosition","prevPosition","getWorkOrderInfoMin","newPosition","currentLat","currentLong","markerAnimation","deltaLat","numDeltas","deltaLng","moveMarker","latlng","CreatedOn","reverse","init","currentOutage","mapElement","closeOutageDetails","closeDetails","selectedOutage","panelClicked","big","handleClick","small","previous","disablePrevious","addressClicked","addDomListener","getCenter","trigger","reportOutage","showLoginRequired","getStatusIcon","geocoder","calcRouteFromCurrentPosition","geolocation","getCurrentPosition","coords","latitude","longitude","workOrder","getWorkCenters","workCentersMarkers","workCenters","workCenter","workCentrClicked","mapMarker","pos","updateWorkCentersPositionsInterval","workOrderClicked","workOrderItem","workOrderSelected","workOrdersMarkers","centers","after","workOrders","geocode","results","GeocoderStatus","OK","googleLocation","geometry","isOrderSelected","pickupOrder","workOrderId","workCenterId","workOrderLatitude","workOrderLongitude","workOrderServiceAddress","stopOrder","outageReportDataService","outageMyLocationService","getUtillityTypes","translated","utillityTypes","selectedLocation","problemDescription","descriptionEmptyError","houseNumberEmptyError","streetEmptyError","cityEmptyError","stateEmptyError","invalidZipError","street2","wrongLocation","collectDataAndSend","geoLocation","UtillityType","selectedUtillityType","OutageLocation","ContractAccount","Description","image","getAddressComponent","address_components","component","types","t","long_name","street_number","locality","postal_code","administrative_area_level_1","sendReport","serviceAddress","getAddress","isLocationServiceTurnOff","getEmptyData","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","latLng","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","EnableAddDeleteMeterRead","disputeCollection","MeterNum","RefreshScrollingList","sendDispute","disputeMeterRead","readingValue","registerValue","postMeterReading","registerNumber","meterReadValue","formSubmitted","useMeterData","jsonObject","jsonMeterNumIs","isMultipleMeters","setCurrentMeter","meterOptions","fillMeterOptions","meterInfo","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","feeInformation","FeeInfoTextAchAndCard","isCashOnly","IsCashOnly","isDirectDebitInProcess","IsDirectDebitInProgress","isCashOnlyInformation","IsCashOnlyInformation","agreed","getCurrentContractAccount","findWhere","updateAgreed","payByCard","payByCheck","loadCurrentPlan","readOnly","InstallmentAmountString","InstallmentAmount","OpenAmountString","OpenAmount","planItems","startDate","installmentNumber","planTypes","planTypeId","enroll","utc","toJSON","today","unEnroll","setUpCancelButton","getAmount","getDonationAmount","oneTimeDonationAmount","setCurrentSavedCardAttributes","currentSavedCard","HolderName","ExpMonth","ExpYear","isDonationEnabled","donateRadio","enrollRadio","savedCards","useSavedCard","savedCardsVisible","saveThisCard","enableSaveBankAccounts","enableSaveCreditCards","paymentResultData","isResultShowing","minimumPaymentAmountToAllowDonation","requestSchedulePayment","paymentDate","scheduleDate","availablePaymentTypes","goDonationFaq","updateConvenienceFee","payAmount","convenienceFee","fee","feeInfo","savedCardChanged","useSavedCardChanged","cardInfo","IsPrimary","commonDataRequest","savedCardsRequestParams","savedCardsRequest","feeInfoRequest","profileRequestParams","profileRequest","customerInfoRequestParams","customerInfoRequest","showSchedulePayment","EnablePaymentScheduling","EnableSaveBankAccounts","EnableSaveCards","foundPrimary","LastPart","setSavedCards","setFeeInfo","IsRoundUpEnrolled","setProfileData","setCustomerInfo","tomorrow","okAfterSuccessfulPayment","dateRegex","handlePaymentSuccess","acceptBillsData","makePaymentApi","scheduleButtonClicked","amountError","amountEmptyError","oneTimeDonationAmountError","pay_form","payDataRequest","EnrollInRoundUp","DoOneTimeDonation","donationRadio","OneTimeDonationAmount","expDate","expiryYear","expiryMonth","formExpiryDate","ContractAccountNumber","CardNumber","CardholderName","ExpirationDate","SaveThisCard","paymentResultMessage","acceptPaymentResultData","scanCreditCard","donateYesClick","ngModelCtrl","transformedInput","$setViewValue","$render","PayByCheckService","setCurrentSavedBankAccountAttributes","currentSavedAccount","bankAccount","RoutingNumber","shortTitle","reenterCheckingAccountNumber","NameOnAccount","isDirectDebitInProgress","enableEnrollBankAccount","savedAccountsVisible","useSavedBankAccount","savedAccounts","saveThisBankAccount","enrollThisBankAccount","isAssistant","useSavedAccountClicked","useSavedAccountChanged","bankAccountInfo","goDirectDebitFaq","getEnrollMessage","enrollMessage","enrollInDirectDebitChanged","savedAccountChanged","setBankAccounts","enrolledInfo","BankAccountNumber","setSavedAccounts","bankAccountsRequestParams","bankAccountsRequest","currentAccountData","updateAmounts","datepicker","autoclose","minServiceAppointmentDate","todayHighlight","payForm","confirmCheckingAccount","bankAccountId","AmountToPay","BankRoutingNumber","CheckingAccountNumber","EnrollInDirectDebit","paymentConfirmation","repeatAccount","getPaymentOptions","addBa","addCard","toCard","toBankAccount","isOverdue","year","nowDate","nowMonth","getMonth","nowYear","BankAccount","AccountType","EnrollmentType","baDialog","bankAccountNumber","accountType","sapBankId","holderName","isPrimary","enrolled","expMonth","expYear","addCardDialog","expirationDate","cardHolderName","showUnexpectedError","deleteBankAccount","enableDirectDebit","baId","EnableSavedBankAccountsInDirectDebitGrid","initBa","togglePrimaryBankAccount","showDeleteConfirmation","WasEnrolled","wasEnrolled","deleteCard","deleteRequest","cardId","EnableSavedCreditCardsInDirectDebitGrid","initCard","togglePrimaryCard","unenrollMessage","optionId","wasUnenrolled","unenroll","intervalId","getContactPhones","contactsInfo","phoneLoaded","hasContacts","failedAttempt","makeChecking","clearInterval","shortGroupName","shortName","getProviderNamesFor","initProviders","setInterval","providerChanged","aboutUsHtml","openPdf","years","donations","contains","yearChanged","selectedYearDonations","donationsKendoGrid","emailReport","infoHtmlCode","enrollStep","billingData","viewBillingHistory","saveLanguage","selectLanguage","currentBill","getCurrentBill","cache","securityToken","currentProperty","getCurrentProperty","setCurrentProperty","messagesQueue","iconError","iconInfo","messageTypes","addMessageToQueue","typeMessage","showModalCallback","messageType","processQueue","without","removeMessage","isMessagesQueueContains","Service","isBackdropStatic","_isBackdropStatic","withStaticBackdrop","yesCallback","needHideCloseButton","closedCallback","that","_showYesNoMessageTask","_getYesNoTemplateUrl","iconClass","needToHide","action","_showOkMessageTask","_getSimpleOkTemplateUrl","backdrop","_showErrorTask","_showServerErrorTask","_showUnexpectedErrorTask","_showInfoTask","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","Delinquents","AssistantSearch","AssistantSearchHistory","AssistantProfile","AssistantDisconnections","MyPropertyGroups","MyProperties","PropertyManagerProfile","Authorizations","SharedAccounts","WorkCenters","WorkOrders","TurnOffMap","LookUp","LookUpLog","leftMenuService","isMenuItemVisible","menuItem","currentMenu","setFull","tab","isTop3MenuItemLoaded","isLoadingSearchHistory","sort","menuItemId","contractAccounts","searchHistoryItem","findContractAccount","addressParts","addressString","collapse","loadTop3SearchHistoryItems","firstAndLastNameOrCompanyName","saveContractAccountNumberInSearchHistory","currentContractAccountNumber","contractAccountInfo","isActive","goToForAccount","self","notCancelled","userNameId","signOut","resetSmsSubscribeNotification","notifyObservers","observerCallbacks","tempVisibility","defaultNotificationBoxSettings","SmsSubscribeNotification","isVisibleByServer","isVisibleByUser","saveSettings","registerObserverCallback","isSmsSubscribeNotificationVisible","hideSmsSubscribeNotification","stopReminding","showEror","flag","isTemporarilyHidden","billTab","fileOpener2","device","hasPermission","permissions","checkPermission","WRITE_EXTERNAL_STORAGE","warn","checkPermissions","Promise","hasStoragePermissions","androidDownloadsPath","file","externalRootDirectory","resolveLocalFileSystemURL","dirEntry","lastIndexOf","targetFilePath","toURL","FileTransfer","errorCodeDesc","http_status","androidOpenPdf","InAppBrowser","Exists","BillPdfUrl","isCached","cachedData","currentProvider","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","s","b","redirectToUserNotifications","_currentOutage","_selectedOutages","_callBack","callBack","setCurrent","displayImage","setCurrentById","preffix","truckType","orderType","outageImage","adjustImageSize","hasClass","nextOutage","allInfoShown","previousOutage","imageElement","bottom","panelCollapse","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","tourClosed","nextStep","refreshBubblePosition","getCurrTour","unregisterHelper","startTourInternal","sessionStorage","stepInt","showSkip","notificationLog","isBusy","endReached","notificationsLoadedCount","notificationsForScrolling","getNotifications","notifications","acceptNotifications","setViewed","notification","IsViewed","notificationsKendoGrid","notificationsUrl","extra","operators","string","startswith","eq","neq","ui","kendoDateTimePicker","timeFormat","kendoDropDownList","dataTextField","dataValueField","searchingText","optionLabel","GoToAccountDashboard","IsAccountDisconnected","redirectIfSingle","isBalanceLoaded","enablePropertyManagerLink","isSsoLinkVisible","menuTemplate","leftMenu","isMenuLoaded","checkAccess","mapping","PayNow","Preferences","ReportOutage","OutageMap","OutageList","EnableCancelService","EnableMoveService","EnableMeterDataPage","EnableEnergyEfficiencyPage","EnableProgramEnrolments","hideSubscribeSmsNotification","subscribeSmsNotificationFlag","goToSubscribe","needEnergyCost","showInLegend","onResizeAction","isConsumptionsExist","setWorkCenters","exists","reset","_buffer","addLogItem","accNumber","discDoc","serialNum","woNumber","newItem","getAllItems","popToBuffer","lookUpLogItem","pushOutBuffer","buffer","WorkCentersService","showWorkOrders","showCurrentWorkOrders","selected","selectWorkCenter","workCentersList","hasScroll","LookUpLogService","lookUpLogRecord","lookup","serialNumber","discDocument","formatDate","goToLookUp","paymentsLoading","payments","before","endOfDataReached","getPayments","orderNumber","order","goToWorkCenters","orders","ordersLoading","loadOrdersAfter","getOrders","requestObjects","Plant","handleOrders","openOrderDetails"],"mappings":"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"}