{"version":3,"sources":["application.js","component/timeout-notification.component.js","component/watch-accessibility.component.js","constant/app-info.constant.js","constant/defaults.constant.js","controller/Income.controller.js","controller/bank-details.controller.js","controller/contact-details.controller.js","controller/employment.controller.js","controller/memorable-word.controller.js","controller/overdraft.controller.js","controller/personal-details.controller.js","controller/preamble.controller.js","controller/progress.controller.js","controller/registration.controller.js","controller/resume.controller.js","controller/rewards.controller.js","controller/switching.controller.js","controller/unsubscribe.controller.js","directive/blur-currency.directive.js","directive/date-field-group.directive.js","directive/debit-card-validation.directive.js","directive/expiry-date-field.directive.js","directive/sortcode-field.directive.js","directive/sticky-header.directive.js","factory/bank-details.factory.js","factory/contact.factory.js","factory/employment.factory.js","factory/http-interceptor.factory.js","factory/income.factory.js","factory/memorable-word.factory.js","factory/overdraft.factory.js","factory/personal.factory.js","factory/registration.factory.js","factory/resume.factory.js","factory/rewards.factory.js","factory/session.factory.js","factory/switching.factory.js","factory/unsubscribe.factory.js","filter/address-results.filter.js","filter/analytics-detail-form-field.filter.js","filter/analytics-form-field.filter.js","filter/bank-details.filter.js","filter/date-of-birth-object.filter.js","filter/date-of-birth.filter.js","filter/employment-data.filter.js","filter/form-errors.filter.js","filter/income-data.filter.js","filter/mmyy.filter.js","filter/registration-data.filter.js","filter/resume-data.filter.js","filter/resume-point.filter.js","filter/switching-dates.filter.js","filter/switching-validation.filter.js","filter/switching.data.filter.js","service/analytics-data.service.js","service/analytics.service.js","service/bank-details.service.js","service/contact.service.js","service/data-model.service.js","service/employment.service.js","service/income.service.js","service/interval-amount.service.js","service/memorable-word.service.js","service/moment.service.js","service/overdraft.service.js","service/personal.service.js","service/preamble.service.js","service/registration.service.js","service/resume.service.js","service/rewards.service.js","service/switching.service.js","service/timeout.service.js","service/unsubscribe.service.js","value/user-data.value.js","templates.js"],"names":["angular","window","config","$compileProvider","$logProvider","$stateProvider","$locationProvider","$urlRouterProvider","$httpProvider","$interpolateProvider","debugInfoEnabled","debugEnabled","interceptors","push","defaults","withCredentials","timeout","startSymbol","endSymbol","otherwise","state","url","controller","templateUrl","params","secure","html5Mode","hashPrefix","run","$log","$rootScope","$sessionStorage","timeoutService","appInfo","info","VERSION","BUILD","debug","version","full","codeName","put","stateChangeStartWatcher","$on","event","toState","name","cancelTimeout","isInSession","resetTimer","stateChangeSuccesstWatcher","focussed","forEach","getElementsByTagName","item","focus","destroyWatcher","module","$state","$interval","analyticsService","clearInterval","cancel","countdownInterval","zero","num","toString","startCountdown","vm","notifications","expirationTime","serverExpiry","minutes","seconds","time","APPLICATION_TIMEOUT_BUFFER","focusObj","getElementById","Math","floor","timeRemaining","max","timeoutProgress","width","this","APPLICATION_TIMEOUT","expirationBuffer","displayModal","applicationExpired","resettingTimer","then","error","status","resumeApplication","notifyWatcher","notification","switchState","go","reload","isFatal","type","trackCustomEvent","linkTrackVars","linkTrackEvents","events","endSession","$onDestroy","component","handleKeyboardEvent","e","keyCode","which","isLetter","metaKey","ctrlKey","altKey","shiftKey","body","removeClass","ignoredKeys","indexOf","kps","activeEgg","addClass","length","currentKeys","firstEggKey","split","substr","$document","handleMouseEvent","element","on","constant","API_BASE_PATH","APPLICANT_MIN_AGE","APPLICANT_MAX_AGE","PREV_ADDRESS_REQUIRED_YEARS","HIDE_RETIRMENT_AGE","MAX_EMPLOYMENT_YEARS","MIN_EMPLOYMENT_AGE_YEARS","MAX_BANK_ACCOUNT_YEARS","OVERDRAFT_AMOUNT_MIN","OVERDRAFT_AMOUNT_MAX","MSN_BASE_PATH","MSN_IMG_EXT","MSN_COOKIE_PATH","UEPAD_COUNTRIES","code","PREVIOUS_NAME","title","firstName","middleName","surname","EMPTY_ADDRESS","address1","address2","address3","address4","postcode","BASE_ANALYTICS","adoCategory","adoProducts","BASE_TRACKING_EVENT","prop27","eVar31","BASE_TRACKING_FORM_ERRORS","eVar35","list1","BASE_TRACKING_SERVER_ERRORS","JOURNEY_STATES","analytics","adoPageName","adoEvents","progress","IncomeController","incomeService","overdraftService","dataModelService","intervalAmountService","clearRetirementAge","primary","showRetirementAge","userData","retirementAge","secondary","checkIncomeValues","data","checkValues","applicant","isUndefined","interactions","incomeBeforeTax","incomeAfterTax","invalidIncomeAfterTax","invalidIncomeNonZero","annualIncomeBeforeTax","calculateYearlyValue","incomeBeforeTaxInterval","monthlyIncomeAfterTax","calculateMonthlyValue","incomeAfterTaxInterval","isJointApplication","calculateIncome","monthlyIncome","totalIncome","isDefined","current","overdraft","isProspectRetired","prospect","getUserDetails","employmentStatus","showRetirementAgeForProspect","getApplicantAge","hasFormError","serverError","isSubmitting","prospectsEligibleForOverdraft","isOver18","age","primaryAge","getFirstName","invalidRetirement","getModelData","userDataSwitching","trackFormElement","trackFormInteraction","submitUserData","form","notificationsOr","overdraftPreviousValue","switch","$valid","trackFormErrors","$broadcast","invalidIncome","trackEvent","updateModel","addRoute","finishFormTracking","submitIncomeDetails","tmpData","getBlankModelData","overdraftAmount","submitOverdraftDetails","trackServerError","checkRetirementAge","parseInt","incomeDataHandler","newVal","startFormTracking","incomeDataWatcher","$watch","bind","BankDetailsController","momentService","bankDetailsService","futureDate","dateBeforeDob","hasDateError","overMaxYears","reset","copy","$applyAsync","accountOpened","month","year","existingCurrentAccount","checkTimeWithAccount","timeWithAccount","startMonth","startYear","calculateAddressTime","isMonthBeforeDob","getDateOfBirth","trackFormErrorList","years","timeAccountHeld","submitBankDetails","ContactDetailsController","contactService","applicantNotifications","prevAddressRequired","currentAddress","postcodeValid","loadingPostcode","addressSelected","addressResults","bfpoAddress","addressDateBeforeDob","serverWait","manualEntry","hasAddressError","previousAddress","addressDateBeforeCurrent","clearAddress","addressType","yearsAtAddress","monthsAtAddress","address","addressStartMonth","addressStartYear","residentialStatus","isPrevAddressRequired","daysAtAddress","calculateTimeAtAddress","timeAtAddress","calculatePreviousAddressTime","months","days","checkAddressStatus","checkProspectAddress","isValid","findAddress","success","response","premisesNames","checkPostcode","postcodeLookup","replace","manual","toUpperCase","selectAddress","addressResponseIsValid","getAddress","checkTimeAtAddress","invalidAddress","mobileNumber","phoneNumber","submitContactDetails","EmploymentController","employmentService","checkTimeWithEmployer","timeWithEmployer","ageAtEmployment","timeAtEmployer","calculateAgeAtDate","calculateEmploymentTime","changeStatus","$setPristine","$setUntouched","submitEmploymentDetails","MemorableWordController","$window","memorableWordService","fscs","msn","submitMemorableWord","uaid","addAnalyticsData","adoUaid","updateView","clearDataModel","open","history","OverdraftController","$timeout","calculateOutgoings","updateUserDataWithProspectsOutgoings","mortgageOrRent","mortgageOrRentInterval","councilTax","councilTaxInterval","utilityBills","utilityBillsInterval","telecoms","tvAndBroadband","tvAndBroadbandInterval","mobilePhone","mobilePhoneInterval","other","livingCosts","livingCostsInterval","maxOverdraft","overdraftIncrement","skipOverdraft","updateAmount","increment","oldAmount","newAmount","invalidOutgoings","getTotalOutgoings","getTotalOutgoingsForProspect","outgoings","checkOutgoings","totalMonthlyOutgoings","totalMonthlyIncome","checkUserInput","min","ceil","outgoingsDataHandler","currentOverdraftAmount","outgoingsDataWatcher","PersonalDetailsController","personalService","showGender","userDetails","updateGender","gender","applicantName","resetDependents","dependents","resetUsCitizen","value","taxDetails","usCitizen","resetUsTaxResidency","usTaxNumber","usTaxResident","resetOtherCountry","otherCountry","resetAdditionalCountry","additionalCountry","resetIslands","keep","resetNiNumber","resetIslandsCountry","niNumber","islandsCountry","resetFatca","option","taxResOutsideUKOrUSCit","islandsTaxResident","submitPersonalDetails","PreambleController","preambleService","validResidence","cashMinderLink","chooseApplicationType","userChoices","accountType","jointConsent","acceptTerms","animateScroll","lookupEUPAD","isFound","residence","i","len","initServerComms","getMSN","ProgressController","getProgress","stateName","stateItem","filter","skipPage","accountNumber","hasRequestedOverdraft","getPrevioustate","uuid","index","currentSection","focusInterval","totalProgress","backEnabled","versionInfo","updateFocus","attemptCount","getElementsByClassName","attr","stateSuccessWatcher","toParams","fromState","fromParams","goBack","scrollTo","formErrorWatcher","RegistrationController","$localStorage","registrationService","resumeService","primaryApplicantAgeError","secondaryApplicantAgeError","existingApplicant","sendingEmail","emailSendError","resumeRequested","addPreviousNameOption","resetPreviousNames","prevName","previousNames","removePreviousName","previousName","splice","resumeEmail","valid","emailAddress","request","resetExistingEmail","checkExistingEmail","submitRegistration","prospectDataHandler","calcAge","dateOfBirth","prospectDataWatcher","ResumeController","requestResumeEmail","isLoading","invalidEmail","authenticateDateOfBirth","authenticate","dateOfBirthError","accountLocked","resumePoint","isValidating","validationError","get","resumeSubmit","check","RewardsController","rewardsService","noUserChoice","resetForm","keepType","optIn","rewardsType","submitRewardsOptions","SwitchingController","$q","switchingService","checkSwitchEligibility","eligibility","switchingAllowed","switchingEligibility","submitSwitchingDetails","validateError","isLoadingDates","availableSwitchDates","isoverDraft","switchDate","partial","useExistingDetails","accountToSwitch","sortcode","validateAccount","resetExistingAccount","jointAccount","primaryApplicantAccount","secondaryApplicantAccount","isSwitching","switching","fullSwitch","transferDate","resetDebitCard","debitCard","pan","expiry","resolve","reject","skipSwitching","partialAllPayments","partialSomePayments","resetPartial","confirmAccount","acceptSwitchDate","getSwitchingDates","UnsubscribeController","unsubscribeService","isWorking","callUnsubscribe","blurCurrency","$filter","link","scope","el","attrs","ngModelCtrl","formatter","parseFloat","$setValidity","formattedValue","val","$setViewValue","$set","$formatters","restrict","require","directive","dateFieldGroup","checkNumberKey","checkFocus","day","$digest","checkTabbing","isTabbing","maxVal","parsedValue","isNaN","inputs","find","selectionStart","Date","getFullYear","label","hasError","formError","debitCardValidation","ngModel","update","inputPan","join","$parsers","unshift","luhnChk","undefined","$evalAsync","arr","ccNum","bit","sum","charAt","Boolean","expiryDateField","checkExpiry","now","monthNum","yearNum","getMonth","updateExpiry","inputExpiryDate","sortcodeField","stickyHeader","checkScroll","pageYOffset","bankDetails","$resource","factory","contact","save","method","lookupPostcode","fetchAddress","employment","httpInterceptor","$injector","extend","responseError","hasStoredData","notify","income","memorableWord","personal","registration","resume","emailCheck","rewards","session","start","cache","keepAlive","logout","unsubscribe","addressResultsFilter","street","streetName","district","town","additionalInformation","additionalInfo","analyticsDetailFormFieldFilter","result","analyticsFormFieldFilter","field","parsed","parsedName","isString","$name","shift","bankDetailsFilter","inputValues","dateOfBirthObject","parsedDob","date","isObject","getDate","employmentDataFilter","cleanModel","tmpStatus","tmpRetirement","applicants","seBusinessNature","formErrorsFilter","$error","errorsArr","required","$invalid","pattern","incomeData","mmyyFilter","registrationData","parsedPrimaryDob","parsedSecondaryDob","resumeData","personalDetails","agreement","journey","visitedIndexes","resumeIndex","uid","j","lenJ","apply","switchingDates","getLongDate","switchingValidation","switchingDataFilter","parseExpiry","analyticsDataService","getBaseAnalyticData","section","getAnalyticsData","formTrackingData","getIncomeAnalytics","modelData","analyticsObj","adoIncomeBefore","adoIncomeBeforePeriod","adoIncomeAfter","adoIncomeAfterPeriod","adoRetirementAge","adoOverdraft","adoAccountType","adoCountry","adoAge","adoPreviousName","adoPostcode","adoTown","adoPropertyTime","adoResidentialStatus","adoMarketing","marketingOptions","email","post","sms","telephone","thirdParty","adoMaritalStatus","maritalStatus","adoDependents","adoNationality","nationality","adoTaxUs","adoCitizenUS","adoTaxResident","adoForeignTaxResident","adoEmploymentStatus","adoJobTitle","jobTitle","adoMortgage","adoMortgagePeriod","adoCouncilTax","adoCouncilTaxPeriod","adoUtility","adoUtilityPeriod","adoTvTel","adoTvTelPeriod","adoMob","adoMobPeriod","adoLiving","adoLivingPeriod","adoRewardsType","adoChosenCharity","chosenCharity","adoExistingCurrentAccount","adoSwitch","adoSwitchChoice","copiedTrackingData","service","$location","tealium","tealiumData","configureViewData","tmpUdo","currentData","manualData","setViewIdMap","trackAnalyticsEvent","$s","s","tl","hasOwnProperty","eVar30","eVar26","view","getUdo","errorList","route","adoURL","absUrl","lastIndexOf","premises","postCode","premisesName","getStoredData","updateSession","Object","keys","getFullModelData","endpoint","returnObject","checkResumeData","remove","empty","getAccountType","warn","calculateAge","returnObj","storedData","contactDetails","checkUserData","interval","calculatedValue","moment","preciseDiff","d1","d2","m1","m2","isBefore","yDiff","mDiff","dDiff","daysInLastFullMonth","subtract","daysInMonth","dob","diff","Number","momentDob","currentAddressMonth","currentAddressYear","previousAddressMonth","previousAddressYear","format","$cookies","filtered","calculatedAge","switchType","resetTimers","mainTimer","expiredTimer","expiryTriggered","warningTriggered","getTime","sessionTimeoutMinutes","emptyIncomeInteractions","emptyOverdraftInteractions","emptyPersonalDetailsApplicant","emptyPersonalInteractionsApplicant","emptyRegistrationApplicant","emptyMarketingOptions","emptyAddress","contactDetailsInteractions","isActive","sameAddressAsPrimary","employersName","preContract","rollNumber","acceptPartialOption","partialSwitchTransfer","existingDebitCard","word","$templateCache","$inject"],"mappings":"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","file":"application.min.js","sourcesContent":["(function (angular, window) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @private\r\n *\r\n * @name config\r\n * @description\r\n * Main application config method\r\n *\r\n * @ngInject\r\n */\r\n function config($compileProvider, $logProvider, $stateProvider, $locationProvider, $urlRouterProvider, $httpProvider, $interpolateProvider) {\r\n\r\n // Disable debug classes | angular.reloadWithDebugInfo(); in console to enable\r\n $compileProvider.debugInfoEnabled(false);\r\n\r\n // Disable debug level log messages\r\n $logProvider.debugEnabled(false);\r\n\r\n // Intercept all $http response errors with httpInterceptor factory.\r\n $httpProvider.interceptors.push('httpInterceptor');\r\n\r\n // Include session cookies\r\n $httpProvider.defaults.withCredentials = true;\r\n\r\n // Set default timeout - NOTE: This is also set in the httpInterceptor.\r\n $httpProvider.defaults.timeout = 30000;\r\n\r\n // Reconfigure the AngularJS binding syntax to avoid conflicting with Handlebars.\r\n $interpolateProvider.startSymbol('{[{').endSymbol('}]}');\r\n\r\n // Re-route unavailable paths to home\r\n $urlRouterProvider.otherwise('/');\r\n\r\n // Configure states\r\n $stateProvider\r\n .state('start', {\r\n url: '/',\r\n controller: 'PreambleController as preamble',\r\n templateUrl: 'views/preamble'\r\n })\r\n .state('registration', {\r\n url: '/registration',\r\n controller: 'RegistrationController as registration',\r\n templateUrl: 'views/registration'\r\n })\r\n .state('contactDetails', {\r\n url: '/contact-details',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'ContactDetailsController as contactDetails',\r\n templateUrl: 'views/contactDetails'\r\n })\r\n .state('personalDetails', {\r\n url: '/personal-details',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'PersonalDetailsController as personal',\r\n templateUrl: 'views/personalDetails'\r\n })\r\n .state('employment', {\r\n url: '/employment',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'EmploymentController as employment',\r\n templateUrl: 'views/employment'\r\n })\r\n .state('income', {\r\n url: '/income',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'IncomeController as income',\r\n templateUrl: 'views/income'\r\n })\r\n .state('overdraft', {\r\n url: '/overdraft',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'OverdraftController as overdraft',\r\n templateUrl: 'views/overdraft'\r\n })\r\n .state('bankDetails', {\r\n url: '/bank-details',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'BankDetailsController as bankDetails',\r\n templateUrl: 'views/bankDetails'\r\n })\r\n .state('switching', {\r\n url: '/switching',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'SwitchingController as switching',\r\n templateUrl: 'views/switching'\r\n })\r\n .state('memorableWord', {\r\n url: '/memorable-word',\r\n params: {\r\n secure: true\r\n },\r\n controller: 'MemorableWordController as memorableWord',\r\n templateUrl: 'views/memorableWord'\r\n })\r\n .state('resume', {\r\n url: '/resume?uuid',\r\n controller: 'ResumeController as resumeCtrl',\r\n templateUrl: 'views/resume?UUID'\r\n })\r\n .state('unsubscribe', {\r\n url: '/unsubscribe/:uuid',\r\n controller: 'UnsubscribeController as unsubscribe',\r\n templateUrl: 'views/unsubscribe'\r\n });\r\n\r\n // Hashbang mode\r\n $locationProvider.html5Mode(false);\r\n $locationProvider.hashPrefix('!');\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * @name run\r\n * @description\r\n * Main application run method\r\n *\r\n * @ngInject\r\n */\r\n function run($log, $rootScope, $sessionStorage, timeoutService, appInfo) {\r\n\r\n $log.info('ntb-fe v' + appInfo.VERSION + ' (' + appInfo.BUILD + ')');\r\n $log.debug('AngularJS v' + angular.version.full, '(' + angular.version.codeName + ')');\r\n\r\n $sessionStorage.put('ntb-fe-info', appInfo);\r\n\r\n var stateChangeStartWatcher = $rootScope.$on('$stateChangeStart', function (event, toState) {\r\n\r\n if (toState.name === 'resume') {\r\n timeoutService.cancelTimeout();\r\n } else if ((toState.params && toState.params.secure) || timeoutService.isInSession) {\r\n $log.debug('State changed to ' + toState.name + ',', 'resetting timers.');\r\n timeoutService.resetTimer();\r\n }\r\n }),\r\n stateChangeSuccesstWatcher = $rootScope.$on('$viewContentLoaded', function () {\r\n\r\n var focussed = false;\r\n\r\n angular.forEach(window['document'].getElementsByTagName('h1'), function(item) {\r\n if (!focussed) {\r\n focussed = true;\r\n item.focus();\r\n }\r\n });\r\n\r\n }),\r\n destroyWatcher = $rootScope.$on('$destroy', function () {\r\n stateChangeStartWatcher();\r\n stateChangeSuccesstWatcher();\r\n destroyWatcher();\r\n });\r\n }\r\n\r\n /**\r\n * @ngdoc interface\r\n *\r\n * @name ntb-fe\r\n * @description\r\n * New To Bank Front-end\r\n *\r\n * Front end application for the co-operative bank \"New to Bank\" project by {@link http://www.radicalcompany.com Radical Company}.\r\n */\r\n angular\r\n .module('ntb-fe', ['ngAnimate', 'ngAria', 'ngCookies', 'ngMessages', 'ngResource', 'ngTouch', 'ngSanitize', 'ui.router', 'ng.deviceDetector', 'swxLocalStorage', 'swxSessionStorage', 'TealiumHelper', 'TealiumHelper.directive'])\r\n .config(config)\r\n .run(run);\r\n\r\n})(window.angular, window);","(function (angular, window) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ntb-fe.component:timeoutNotification\r\n * @description\r\n * **Component**\r\n * Timeout notification directive controller\r\n *\r\n * @restrict E\r\n * @requires ntb-fe.constant:defaults\r\n * @requires ntb-fe.service:timeoutService\r\n *\r\n * @ngInject\r\n */\r\n function controller($log, $rootScope, $state, $interval, defaults, timeoutService, analyticsService) {\r\n\r\n /* jshint validthis: true */\r\n var vm = this,\r\n countdownInterval;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc property\r\n * @name vm.notifications\r\n * @propertyOf ntb-fe.component:timeoutNotification\r\n * @description\r\n * Main controller notifications available to $scope.\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n expirationTime: defaults.APPLICATION_TIMEOUT,\r\n expirationBuffer: defaults.APPLICATION_TIMEOUT_BUFFER,\r\n timeRemaining: zero(defaults.APPLICATION_TIMEOUT_BUFFER) + ':00',\r\n displayModal: false,\r\n applicationExpired: false,\r\n timeoutProgress: {width: '100%'},\r\n resettingTimer: false\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name vm.resetTimer\r\n * @propertyOf ntb-fe.component:timeoutNotification\r\n * @description\r\n * Reset expiration timers\r\n */\r\n vm.resetTimer = function () {\r\n\r\n vm.notifications.resettingTimer = true;\r\n\r\n timeoutService.resetTimer().then(function () {\r\n clearInterval();\r\n vm.notifications.resettingTimer = false;\r\n vm.notifications.displayModal = false;\r\n }, function (error) {\r\n $log.error('ERROR RESETTING TIMER', error);\r\n if (error.status === 401) {\r\n $log.debug('401 returned; application expired', error);\r\n vm.notifications.resettingTimer = false;\r\n vm.notifications.applicationExpired = true;\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name vm.resumeApplication\r\n * @propertyOf ntb-fe.component:timeoutNotification\r\n * @description\r\n * End session and resume the application\r\n */\r\n vm.resumeApplication = function () {\r\n vm.notifications.displayModal = false;\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n function clearInterval() {\r\n $interval.cancel(countdownInterval);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function zero(num) {\r\n return num < 10 ? '0' + num : num.toString();\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function startCountdown() {\r\n\r\n vm.notifications.expirationTime = timeoutService.serverExpiry;\r\n\r\n var time = defaults.APPLICATION_TIMEOUT_BUFFER * 60,\r\n minutes,\r\n seconds,\r\n focusObj = window['document'].getElementById('timeout_title');\r\n\r\n if (focusObj && focusObj.focus) {\r\n focusObj.focus();\r\n }\r\n\r\n countdownInterval = $interval(function () {\r\n time -= 1;\r\n minutes = Math.floor((time / 60) % 60);\r\n seconds = Math.floor(time % 60);\r\n vm.notifications.timeRemaining = zero(Math.max(0, minutes)) + ':' + zero(Math.max(0, seconds));\r\n vm.notifications.timeoutProgress.width = +Math.floor((time / (defaults.APPLICATION_TIMEOUT_BUFFER * 60)) * 100) + '%';\r\n }, 1000);\r\n }\r\n\r\n // IIFE init\r\n (function () {\r\n\r\n $log.debug('Timeout component listening...');\r\n\r\n var notifyWatcher = $rootScope.$on('applicationTimeoutNotifier', function (event, notification) {\r\n\r\n var isFatal = notification.type === 'fatal';\r\n\r\n vm.notifications.displayModal = true;\r\n vm.notifications.applicationExpired = isFatal;\r\n\r\n $log.debug('Timeout component notified:', notification.type);\r\n\r\n clearInterval();\r\n\r\n analyticsService.trackCustomEvent({\r\n linkTrackVars: 'events',\r\n linkTrackEvents: isFatal? 'event50' : 'event53',\r\n events: isFatal? 'event50' : 'event53'\r\n }, isFatal? 'App Locked' : 'App Timeout');\r\n\r\n function switchState() {\r\n $state.go('resume', {}, { reload: true });\r\n }\r\n\r\n if (notification.type !== 'fatal') {\r\n startCountdown();\r\n } else {\r\n\r\n var focusObj = window['document'].getElementById('locked_title');\r\n if (focusObj && focusObj.focus) {\r\n focusObj.focus();\r\n }\r\n\r\n timeoutService.endSession().then(switchState, switchState);\r\n }\r\n });\r\n\r\n vm.$onDestroy = function () {\r\n notifyWatcher();\r\n };\r\n\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .component('timeoutNotification', {\r\n controller: controller,\r\n templateUrl: 'timeout-notification.template.html'\r\n });\r\n\r\n})(window.angular, window);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n // Default (Konami) keycode\r\n var activeEgg = '38,38,40,40,37,39,37,39,98,97',\r\n ignoredKeys = [16],\r\n kps = [],\r\n body;\r\n\r\n /* jshint maxcomplexity: 13 */\r\n function handleKeyboardEvent(e) {\r\n\r\n var keyCode = e.which,\r\n isLetter = keyCode >= 65 && keyCode <= 90;\r\n\r\n if (e.type === 'keydown' && !e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey) {\r\n if (keyCode === 9) {\r\n body.removeClass('no-outline');\r\n }\r\n }\r\n\r\n if (e.type === 'keyup') {\r\n\r\n if (isLetter && !e.shiftKey) {\r\n keyCode = keyCode + 32;\r\n }\r\n\r\n if (ignoredKeys.indexOf(keyCode) === -1) {\r\n kps.push(keyCode);\r\n }\r\n\r\n if (kps.toString().indexOf(activeEgg) >= 0) {\r\n kps = [];\r\n body.addClass('greyscale');\r\n return;\r\n }\r\n\r\n if (kps.length > 8) {\r\n\r\n var currentKeys = kps.toString(),\r\n firstEggKey = activeEgg.split(',')[0];\r\n\r\n if (!firstEggKey || currentKeys.indexOf(firstEggKey) === -1) {\r\n kps = [];\r\n return;\r\n }\r\n\r\n currentKeys = currentKeys.substr(currentKeys.indexOf(firstEggKey));\r\n if (currentKeys.length > activeEgg.length) {\r\n kps = [];\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ntb-fe.component:watchAccessibility\r\n * @description\r\n * **Component**\r\n *\r\n * Watches for keyboard or mouse input and sets class on BODY.\r\n *\r\n * @restrict E\r\n *\r\n * @ngInject\r\n */\r\n function controller($document) {\r\n body = angular.element($document[0].body);\r\n\r\n function handleMouseEvent() {\r\n body.addClass('no-outline');\r\n }\r\n\r\n $document.on('keydown', handleKeyboardEvent);\r\n $document.on('keyup', handleKeyboardEvent);\r\n $document.on('mousedown', handleMouseEvent);\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .component('watchAccessibility', {\r\n controller: controller\r\n });\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc object\r\n * @name ntb-fe.constant:appInfo\r\n * @description\r\n * Application information Constant.\r\n *\r\n * Holds application version and build numbers.\r\n *\r\n * @example\r\n * *appInfo* is injectable as value\r\n *
\r\n     *     function myService(appInfo) {\r\n     *         console.info('Version:', appInfo.VERSION, 'Build:', appInfo.BUILD);\r\n     *     }\r\n     * 
\r\n */\r\n var appInfo = {\r\n VERSION: '@@version',\r\n BUILD : '@@build'\r\n };\r\n\r\n angular\r\n .module('ntb-fe')\r\n .constant('appInfo', appInfo);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc object\r\n * @name ntb-fe.constant:defaults\r\n * @description\r\n * Default constant values to be used within the main ntb-fe application\r\n *\r\n * Configurable options subject to possible change\r\n *\r\n * @example\r\n * *defaults* is injectable as constant\r\n *
\r\n     *    function myFactory($resource, defaults) {\r\n     *        return $resource(defaults.API_BASE_PATH + 'some_endpoint');\r\n     *    }\r\n     * 
\r\n */\r\n var defaults = {\r\n API_BASE_PATH: './api/',\r\n APPLICANT_MIN_AGE: 16,\r\n APPLICANT_MAX_AGE: 110,\r\n APPLICATION_TIMEOUT: 10,\r\n APPLICATION_TIMEOUT_BUFFER: 1,\r\n PREV_ADDRESS_REQUIRED_YEARS: 3,\r\n HIDE_RETIRMENT_AGE: 50,\r\n MAX_EMPLOYMENT_YEARS: 99,\r\n MIN_EMPLOYMENT_AGE_YEARS: 14,\r\n MAX_BANK_ACCOUNT_YEARS: 99,\r\n OVERDRAFT_AMOUNT_MIN: 100,\r\n OVERDRAFT_AMOUNT_MAX: 5000,\r\n MSN_BASE_PATH: 'https://www.co-operativebank.co.uk/assets/images/bank/msns/',\r\n MSN_IMG_EXT: '.png',\r\n MSN_COOKIE_PATH: 'msnCurrentAccount',\r\n UEPAD_COUNTRIES: [\r\n { code: 'GB', name: 'United Kingdom' }\r\n ],\r\n PREVIOUS_NAME: {\r\n title: void 0,\r\n firstName: void 0,\r\n middleName: void 0,\r\n surname: void 0\r\n },\r\n EMPTY_ADDRESS: {\r\n address1: '',\r\n address2: '',\r\n address3: '',\r\n address4: '',\r\n postcode: ''\r\n },\r\n BASE_ANALYTICS: {\r\n adoCategory: 'Current Accounts',\r\n adoProducts: 'Current Account'\r\n },\r\n BASE_TRACKING_EVENT: {\r\n linkTrackVars: 'prop27,eVar31,events',\r\n linkTrackEvents: 'event18',\r\n prop27: void 0,\r\n eVar31: void 0,\r\n events: 'event18'\r\n },\r\n BASE_TRACKING_FORM_ERRORS: {\r\n linkTrackVars: 'list1,eVar35,prop2,events',\r\n linkTrackEvents: 'event21',\r\n eVar35: void 0,\r\n list1: void 0,\r\n events: 'event21'\r\n },\r\n BASE_TRACKING_SERVER_ERRORS: {\r\n linkTrackVars: 'eVar26,events',\r\n linkTrackEvents: 'event9',\r\n events: 'event9'\r\n },\r\n JOURNEY_STATES: [\r\n {\r\n name: 'start',\r\n analytics: {\r\n adoPageName: 'bank>ntb>application',\r\n adoEvents: 'event36'\r\n },\r\n progress: 1\r\n },\r\n {\r\n name: 'registration',\r\n analytics: {\r\n adoPageName: 'bank>ntb>get started',\r\n adoEvents: 'event37'\r\n },\r\n progress: 2\r\n },\r\n {\r\n name: 'contactDetails',\r\n analytics: {\r\n adoPageName: 'bank>ntb>contact details',\r\n adoEvents: 'event38'\r\n },\r\n progress: 3\r\n },\r\n {\r\n name: 'personalDetails',\r\n analytics: {\r\n adoPageName: 'bank>ntb>personal details',\r\n adoEvents: 'event40'\r\n },\r\n progress: 4\r\n },\r\n {\r\n name: 'employment',\r\n analytics: {\r\n adoPageName: 'bank>ntb>employment',\r\n adoEvents: 'event41'\r\n },\r\n progress: 5\r\n },\r\n {\r\n name: 'income',\r\n analytics: {\r\n adoPageName: 'bank>ntb>income',\r\n adoEvents: 'event42'\r\n },\r\n progress: 6\r\n },\r\n {\r\n name: 'overdraft',\r\n analytics: {\r\n adoPageName: 'bank>ntb>overdraft',\r\n adoEvents: 'event43'\r\n },\r\n progress: 6\r\n },\r\n {\r\n name: 'bankDetails',\r\n analytics: {\r\n adoPageName: 'bank>ntb>bank details',\r\n adoEvents: 'event45'\r\n },\r\n progress: 7\r\n },\r\n {\r\n name: 'switching',\r\n analytics: {\r\n adoPageName: 'bank>ntb>switching',\r\n adoEvents: 'event46'\r\n },\r\n progress: 8\r\n },\r\n {\r\n name: 'memorableWord',\r\n analytics: {\r\n adoPageName: 'bank>ntb>almost finished',\r\n adoEvents: 'event47'\r\n },\r\n progress: 9\r\n }\r\n ]\r\n };\r\n\r\n angular\r\n .module('ntb-fe')\r\n .constant('defaults', defaults);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:incomeService\r\n * @requires ntb-fe.service:dataModelService\r\n * @requires ntb-fe.service:intervalAmountService\r\n *\r\n * @name ntb-fe.controller:IncomeController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *IncomeController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'IncomeController as contact'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function IncomeController($rootScope, $state, incomeService, overdraftService, dataModelService, intervalAmountService, analyticsService, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:IncomeController\r\n * @name ntb-fe.controller:IncomeController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:IncomeController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError: false,\r\n serverError : false,\r\n isSubmitting: false,\r\n isJointApplication: dataModelService.isJointApplication(),\r\n prospectsEligibleForOverdraft : allProspectsEligible(),\r\n totalIncome: 0,\r\n primary: {\r\n firstName: dataModelService.getFirstName('primary'),\r\n showRetirementAge: showRetirementAgeForProspect('primary'),\r\n invalidRetirement: false,\r\n invalidIncomeAfterTax: false,\r\n invalidIncomeNonZero: false\r\n },\r\n secondary: {\r\n firstName: dataModelService.isJointApplication() ? dataModelService.getFirstName('secondary') : '',\r\n showRetirementAge: dataModelService.isJointApplication() ? showRetirementAgeForProspect('secondary') : void 0,\r\n invalidRetirement: false,\r\n invalidIncomeAfterTax: false,\r\n invalidIncomeNonZero: false\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:IncomeController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('income');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('income');\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:IncomeController\r\n * @name vm.userDataSwitiching\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('switching');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n\t\t vm.userDataSwitching = dataModelService.getModelData('switching');\r\n\t\t\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n function clearRetirementAge() {\r\n if (!vm.notifications.primary.showRetirementAge) {\r\n vm.userData.primary.retirementAge = void 0;\r\n }\r\n\r\n if (vm.userData.secondary && !vm.notifications.secondary.showRetirementAge) {\r\n vm.userData.secondary.retirementAge = void 0;\r\n }\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:IncomeController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function(form) {\r\n //logic for overdraft true/false\r\n if(angular.isUndefined(vm.userData.overdraftPreviousValue)){ \r\n if(vm.userData.overdraft){ \r\n vm.userDataSwitching.interactions.switch = false; \r\n }\r\n } else\r\n { \r\n if(vm.userData.overdraft){\r\n vm.userDataSwitching.interactions.switch = false;\r\n } else { \r\n if(vm.userData.overdraftPreviousValue){\r\n vm.userDataSwitching.interactions.switch = void 0;\r\n }\r\n }\r\n }\r\n \r\n vm.userData.overdraftPreviousValue = vm.userData.overdraft;\r\n\r\n function notificationsOr(name) {\r\n return vm.notifications.primary[name] || vm.notifications.secondary[name];\r\n }\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n // Income\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n var invalidRetirement = vm.userData.overdraft && notificationsOr('invalidRetirement'),\r\n invalidIncome = notificationsOr('invalidIncomeAfterTax') || notificationsOr('invalidIncomeNonZero');\r\n\r\n if (invalidRetirement || invalidIncome) {\r\n return;\r\n }\r\n\r\n // Track overdraft application\r\n if (angular.isDefined(vm.userData.overdraft)) {\r\n analyticsService.trackEvent('NTB - Overdraft ' + vm.userData.overdraft, 'NTB - Overdraft');\r\n }\r\n\r\n clearRetirementAge();\r\n\r\n // Income & outgoings - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.serverError = false;\r\n\t\t\t\r\n\r\n dataModelService.updateModel('income', vm.userData);\r\n analyticsService.addRoute(vm.userData.overdraft ? 'overdraft' : 'bankDetails');\r\n analyticsService.finishFormTracking();\r\n\r\n incomeService.submitIncomeDetails(vm.userData)\r\n .then(function() {\r\n\r\n // Ensure that no overdraft data is retained if the user returns to this screen and selects \"No\"...\r\n if (!vm.userData.overdraft) {\r\n\r\n var tmpData = dataModelService.getBlankModelData('overdraft');\r\n tmpData.overdraftAmount = 0;\r\n dataModelService.updateModel('overdraft', tmpData);\r\n overdraftService.submitOverdraftDetails(tmpData)\r\n .then(function() {\r\n $state.go(vm.userData.overdraft ? 'overdraft' : 'bankDetails');\r\n }, function() {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n });\r\n\r\n } else {\r\n $state.go(vm.userData.overdraft ? 'overdraft' : 'bankDetails');\r\n }\r\n\r\n }, function(error) {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitIncomeDetails: ' + error.status);\r\n });\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n */\r\n vm.checkRetirementAge = function(applicant) {\r\n var age = dataModelService.getApplicantAge(applicant),\r\n retirementAge = parseInt(vm.userData[applicant].retirementAge, 10);\r\n\r\n vm.notifications[applicant].invalidRetirement = retirementAge < age;\r\n };\r\n\r\n /**\r\n *\r\n * @param data\r\n */\r\n function checkIncomeValues(data) {\r\n\r\n function checkValues(applicant) {\r\n\r\n if (angular.isUndefined(data.interactions[applicant].incomeBeforeTax) || angular.isUndefined(data.interactions[applicant].incomeAfterTax)) {\r\n vm.notifications[applicant].invalidIncomeAfterTax = false;\r\n vm.notifications[applicant].invalidIncomeNonZero = false;\r\n return;\r\n }\r\n\r\n var annualIncomeBeforeTax = intervalAmountService.calculateYearlyValue(data.interactions[applicant].incomeBeforeTax, data.interactions[applicant].incomeBeforeTaxInterval),\r\n monthlyIncomeAfterTax = intervalAmountService.calculateMonthlyValue(data.interactions[applicant].incomeAfterTax, data.interactions[applicant].incomeAfterTaxInterval);\r\n\r\n vm.notifications[applicant].invalidIncomeAfterTax = (annualIncomeBeforeTax > 0 && monthlyIncomeAfterTax > (annualIncomeBeforeTax / 12)) || (annualIncomeBeforeTax > 0 && monthlyIncomeAfterTax === 0);\r\n vm.notifications[applicant].invalidIncomeNonZero = annualIncomeBeforeTax === 0 && monthlyIncomeAfterTax > 0;\r\n }\r\n\r\n checkValues('primary');\r\n\r\n if (vm.notifications.isJointApplication) {\r\n checkValues('secondary');\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Object} data Updated model data\r\n */\r\n function calculateIncome(data) {\r\n if (!data.primary || angular.isUndefined(data.interactions.primary.incomeAfterTax)) {\r\n return;\r\n }\r\n vm.userData.interactions.primary.monthlyIncome = vm.notifications.totalIncome = intervalAmountService.calculateMonthlyValue(data.interactions.primary.incomeAfterTax, data.interactions.primary.incomeAfterTaxInterval);\r\n\r\n if (vm.notifications.isJointApplication && angular.isDefined(data.interactions.secondary.incomeAfterTax)) {\r\n vm.userData.interactions.secondary.monthlyIncome = intervalAmountService.calculateMonthlyValue(data.interactions.secondary.incomeAfterTax, data.interactions.secondary.incomeAfterTaxInterval);\r\n\r\n vm.notifications.totalIncome += vm.userData.interactions.secondary.monthlyIncome;\r\n }\r\n\r\n var current = vm.userData.overdraft;\r\n\r\n if (vm.notifications.totalIncome === 0) {\r\n vm.userData.overdraft = false;\r\n } else {\r\n vm.userData.overdraft = current;\r\n }\r\n }\r\n\r\n function isProspectRetired(prospect) {\r\n return dataModelService.getUserDetails(prospect).employmentStatus === 'Retired';\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} prospect Prospect (primary|secondary)\r\n * @returns {Boolean} Is the prospect required to input their retirement age\r\n */\r\n function showRetirementAgeForProspect(prospect) {\r\n return dataModelService.getApplicantAge(prospect) >= defaults.HIDE_RETIRMENT_AGE && !isProspectRetired(prospect);\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Boolean} Are both prospects over 18 and not retired\r\n */\r\n function allProspectsEligible() {\r\n\r\n function isOver18(age) {\r\n return age >= 18;\r\n }\r\n\r\n var primaryAge = dataModelService.getApplicantAge('primary');\r\n if (dataModelService.isJointApplication()) {\r\n return isOver18(primaryAge) && isOver18(dataModelService.getApplicantAge('secondary'));\r\n } else {\r\n return isOver18(primaryAge);\r\n }\r\n }\r\n\r\n // IIFE init\r\n (function() {\r\n\r\n analyticsService.startFormTracking();\r\n\r\n function incomeDataHandler(newVal) {\r\n calculateIncome(newVal);\r\n checkIncomeValues(newVal);\r\n }\r\n\r\n var incomeDataWatcher = $rootScope.$watch(angular.bind(vm, function() {\r\n return vm.userData;\r\n }), incomeDataHandler, true);\r\n\r\n $rootScope.$on('$destroy', function() {\r\n incomeDataWatcher();\r\n });\r\n\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('IncomeController', IncomeController);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:momentService\r\n * @requires ntb-fe.service:bankDetailsService\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:BankDetailsController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *BankDetailsController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'BankDetailsController as bankDetails'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function BankDetailsController($log, $state, $rootScope, momentService, bankDetailsService, dataModelService, analyticsService, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:BankDetailsController\r\n * @name ntb-fe.controller:BankDetailsController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:BankDetailsController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError : false,\r\n serverError : false,\r\n isSubmitting : false,\r\n futureDate : false,\r\n dateBeforeDob: false,\r\n hasDateError : false,\r\n overMaxYears : false,\r\n firstName : dataModelService.getFirstName('primary')\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:BankDetailsController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('bankDetails');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('bankDetails');\r\n\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:BankDetailsController\r\n * @name vm.reset\r\n * @description\r\n * Reset the user input data\r\n *\r\n * @example\r\n *
\r\n         *     \r\n         * 
\r\n *\r\n * @type {Function}\r\n */\r\n vm.reset = function() {\r\n var tmpData = dataModelService.getBlankModelData('bankDetails');\r\n vm.userData = angular.copy(tmpData);\r\n\r\n $rootScope.$applyAsync(function() {\r\n vm.notifications.hasDateError = false;\r\n vm.userData.interactions.accountOpened.month = void 0;\r\n vm.userData.interactions.accountOpened.year = void 0;\r\n vm.userData.interactions.existingCurrentAccount = false;\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:BankDetailsController\r\n * @name vm.checkTimeWithAccount\r\n * @description\r\n * Check time with account\r\n *\r\n * @example\r\n *
\r\n         *     \r\n         * 
\r\n *\r\n * @type {Function}\r\n */\r\n vm.checkTimeWithAccount = function() {\r\n\r\n $log.debug('checkTimeWithAccount:', vm.userData.interactions.accountOpened);\r\n\r\n var startMonth = vm.userData.interactions.accountOpened.month,\r\n startYear = vm.userData.interactions.accountOpened.year,\r\n timeWithAccount;\r\n\r\n if (!startMonth || !startYear) {\r\n return;\r\n }\r\n\r\n vm.notifications.hasDateError = false;\r\n timeWithAccount = momentService.calculateAddressTime(startMonth, startYear);\r\n\r\n // Bank details controller \r\n vm.notifications.futureDate = vm.notifications.hasDateError = !timeWithAccount;\r\n vm.notifications.dateBeforeDob = false;\r\n vm.notifications.overMaxYears = false;\r\n\r\n if (momentService.isMonthBeforeDob(dataModelService.getDateOfBirth('primary'), startMonth, startYear)) {\r\n vm.notifications.hasDateError = true;\r\n vm.notifications.dateBeforeDob = true;\r\n analyticsService.trackFormErrorList('dateBeforeDob');\r\n }\r\n\r\n if (!timeWithAccount) {\r\n vm.notifications.hasDateError = true;\r\n analyticsService.trackFormErrorList('hasDateError');\r\n return;\r\n }\r\n\r\n if (timeWithAccount.years > defaults.MAX_BANK_ACCOUNT_YEARS) {\r\n vm.notifications.hasDateError = true;\r\n vm.notifications.overMaxYears = true;\r\n }\r\n\r\n vm.userData.timeAccountHeld = timeWithAccount;\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:BankDetailsController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function(form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n if (vm.notifications.hasFormError || vm.notifications.hasDateError) {\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n }\r\n // Bank details form errors\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // bankDetails - CPD Ignore\r\n vm.notifications.serverError = false;\r\n vm.notifications.isSubmitting = true;\r\n\r\n // Check dates\r\n vm.checkTimeWithAccount();\r\n\r\n if (vm.notifications.hasDateError) {\r\n vm.notifications.isSubmitting = false;\r\n return;\r\n }\r\n\r\n dataModelService.updateModel('bankDetails', vm.userData);\r\n analyticsService.addRoute(vm.userData.interactions.existingCurrentAccount ? 'switching' : 'memorable-word');\r\n analyticsService.finishFormTracking();\r\n\r\n bankDetailsService.submitBankDetails(vm.userData)\r\n .then(function() {\r\n $state.go(vm.userData.interactions.existingCurrentAccount ? 'switching' : 'memorableWord');\r\n }, function(error) {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitBankDetails: ' + error.status);\r\n });\r\n };\r\n\r\n (function() {\r\n analyticsService.startFormTracking();\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('BankDetailsController', BankDetailsController);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:momentService\r\n * @requires ntb-fe.service:contactService\r\n * @requires ntb-fe.service:momentService\r\n * @requires ntb-fe.service:dataModelService\r\n * @requires ntb-fe.constant:defaults\r\n *\r\n * @name ntb-fe.controller:ContactDetailsController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *ContactDetailsController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'ContactDetailsController as contact'\r\n     * 
\r\n *data\r\n * @ngInject\r\n */\r\n function ContactDetailsController($log, $rootScope, $state, momentService, contactService, dataModelService, analyticsService, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ContactDetailsController\r\n * @name ntb-fe.controller:ContactDetailsController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ContactDetailsController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError: false,\r\n serverError: false,\r\n hasDateError: false,\r\n isSubmitting: false,\r\n isJointApplication: dataModelService.isJointApplication(),\r\n primary: applicantNotifications('primary'),\r\n secondary: dataModelService.isJointApplication() ? applicantNotifications('secondary') : void 0\r\n };\r\n\r\n /**\r\n *\r\n * @param {Object} item Form item\r\n */\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function applicantNotifications(applicant) {\r\n return {\r\n firstName: dataModelService.getFirstName(applicant),\r\n prevAddressRequired: false,\r\n currentAddress: {\r\n postcodeValid: void 0,\r\n loadingPostcode: false,\r\n addressSelected: false,\r\n addressResults: void 0,\r\n futureDate: false,\r\n bfpoAddress: false,\r\n addressDateBeforeDob: false,\r\n serverWait: false,\r\n manualEntry: false,\r\n hasAddressError: false\r\n },\r\n previousAddress: {\r\n postcodeValid: void 0,\r\n loadingPostcode: false,\r\n addressSelected: false,\r\n addressResults: void 0,\r\n addressDateBeforeCurrent: false,\r\n serverWait: false,\r\n manualEntry: false,\r\n hasAddressError: false\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ContactDetailsController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('contactDetails');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('contactDetails');\r\n\r\n /**\r\n * @private\r\n * @param {String} prospect Prospect primary|secondary\r\n * @param {String} addressType Address Type currentAddress|previousAddress\r\n */\r\n function clearAddress(prospect, addressType) {\r\n\r\n // Rebuild broken or null Objects\r\n vm.userData[prospect][addressType] = vm.userData[prospect][addressType] || {};\r\n vm.userData.interactions[prospect][addressType] = vm.userData.interactions[prospect][addressType] || {};\r\n vm.notifications[prospect][addressType] = vm.notifications[prospect][addressType] || {};\r\n\r\n // Populate\r\n vm.userData[prospect][addressType].yearsAtAddress = void 0;\r\n vm.userData[prospect][addressType].monthsAtAddress = void 0;\r\n vm.userData[prospect][addressType].address = void 0;\r\n\r\n vm.userData.interactions[prospect][addressType].addressStartMonth = void 0;\r\n vm.userData.interactions[prospect][addressType].addressStartYear = void 0;\r\n vm.userData.interactions[prospect][addressType].addressSelected = false;\r\n vm.userData.interactions[prospect][addressType].manualEntry = false;\r\n\r\n vm.notifications[prospect][addressType].addressResults = void 0;\r\n vm.notifications[prospect][addressType].loadingPostcode = false;\r\n\r\n if (addressType === 'currentAddress') {\r\n\r\n // Reconstruct\r\n if (!vm.userData.interactions[prospect].previousAddress) {\r\n vm.userData.interactions[prospect].previousAddress = {};\r\n }\r\n\r\n vm.userData[prospect].residentialStatus = void 0;\r\n vm.notifications[prospect].prevAddressRequired = false;\r\n vm.userData.interactions[prospect].previousAddress.postcode = void 0;\r\n\r\n clearAddress(prospect, 'previousAddress');\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param isValid\r\n * @param prospect\r\n * @param addressType\r\n */\r\n vm.findAddress = function (isValid, prospect, addressType) {\r\n\r\n vm.notifications[prospect][addressType].postcodeValid = isValid;\r\n vm.notifications[prospect][addressType].hasAddressError = false;\r\n\r\n vm.notifications.hasFormError = !isValid;\r\n\r\n if (vm.notifications.hasFormError) {\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrorList(prospect + '_' + addressType + '_tmp_postcode');\r\n }\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications[prospect][addressType].loadingPostcode) {\r\n return;\r\n }\r\n\r\n // Reconstruct\r\n if (!vm.userData[prospect][addressType]) {\r\n vm.userData[prospect][addressType] = {};\r\n }\r\n\r\n clearAddress(prospect, addressType);\r\n\r\n // Check for BFPO Address\r\n vm.checkPostcode(prospect, addressType);\r\n\r\n if (vm.notifications[prospect][addressType].bfpoAddress) {\r\n return;\r\n }\r\n\r\n vm.notifications[prospect][addressType].loadingPostcode = true;\r\n vm.notifications[prospect][addressType].serverWait = false;\r\n\r\n function success(response) {\r\n vm.userData.interactions[prospect][addressType].manualEntry = !response.premisesNames.length;\r\n vm.notifications[prospect][addressType].addressResults = response;\r\n vm.notifications[prospect][addressType].loadingPostcode = false;\r\n }\r\n\r\n function error(error) {\r\n\r\n analyticsService.trackServerError('postcodeLookup: ' + error.status);\r\n\r\n vm.notifications[prospect][addressType].loadingPostcode = false;\r\n\r\n if (error.status && error.status === 429) {\r\n vm.notifications[prospect][addressType].serverWait = true;\r\n return;\r\n }\r\n\r\n vm.notifications[prospect][addressType].serverWait = false;\r\n vm.userData.interactions[prospect][addressType].manualEntry = true;\r\n }\r\n\r\n contactService.postcodeLookup(vm.userData.interactions[prospect][addressType].postcode.replace(/\\s+/g, '')).then(success, error);\r\n analyticsService.trackEvent('Prod>CA - ' + prospect + ' ' + addressType + ' Find', 'Find Address');\r\n };\r\n\r\n /**\r\n *\r\n * @param prospect\r\n * @param addressType\r\n * @param manual\r\n */\r\n vm.checkPostcode = function(prospect, addressType, manual) {\r\n if (addressType === 'currentAddress' && prospect === 'primary' && vm.notifications[prospect] && vm.notifications[prospect][addressType]) {\r\n if (manual) {\r\n vm.notifications[prospect][addressType].bfpoAddress = vm.userData[prospect][addressType].address.postcode.toUpperCase().indexOf('BF') !== -1;\r\n } else {\r\n vm.notifications[prospect][addressType].bfpoAddress = vm.userData.interactions[prospect][addressType].postcode.toUpperCase().indexOf('BF') !== -1;\r\n }\r\n }\r\n\r\n if (vm.notifications[prospect][addressType].bfpoAddress && !manual) {\r\n vm.manualEntry(prospect, addressType);\r\n }\r\n };\r\n\r\n /**\r\n *\r\n * @param prospect\r\n * @param addressType\r\n * @param name\r\n */\r\n vm.selectAddress = function (prospect, addressType, name) {\r\n\r\n vm.notifications[prospect][addressType].hasAddressError = false;\r\n\r\n vm.userData[prospect][addressType].address = void 0;\r\n vm.notifications[prospect][addressType].addressResults = void 0;\r\n vm.userData.interactions[prospect][addressType].manualEntry = false;\r\n\r\n /**\r\n * Determine if the response for the address is valid.\r\n *\r\n * @param {Object} response\r\n *\r\n * @return {Boolean}\r\n */\r\n function addressResponseIsValid(response) {\r\n return response.address1 !== '' && response.address2 !== '' && response.postcode !== '';\r\n }\r\n\r\n function success(response) {\r\n vm.userData[prospect][addressType].address = response;\r\n\r\n var isValid = addressResponseIsValid(response);\r\n\r\n // update props based on validity of response\r\n vm.userData.interactions[prospect][addressType].addressSelected = isValid;\r\n vm.userData.interactions[prospect][addressType].manualEntry = ! isValid;\r\n }\r\n\r\n function error(error) {\r\n vm.userData.interactions[prospect][addressType].addressSelected = false;\r\n analyticsService.trackServerError('selectAddress: ' + error.status);\r\n }\r\n\r\n contactService.getAddress(vm.userData.interactions[prospect][addressType].postcode.replace(/\\s+/g, '').toUpperCase(), name).then(success, error);\r\n };\r\n\r\n /**\r\n *\r\n * @param prospect\r\n * @param addressType\r\n */\r\n vm.manualEntry = function (prospect, addressType) {\r\n vm.notifications[prospect][addressType].hasAddressError = false;\r\n\r\n clearAddress(prospect, addressType);\r\n vm.userData.interactions[prospect][addressType].manualEntry = true;\r\n\r\n analyticsService.trackEvent('Prod>CA - ' + prospect + ' ' + addressType + ' Manual', 'Manual Address');\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n function isPrevAddressRequired(applicant) {\r\n\r\n vm.notifications[applicant].prevAddressRequired = false;\r\n\r\n if (vm.userData[applicant].currentAddress.yearsAtAddress) {\r\n vm.notifications[applicant].prevAddressRequired = vm.userData[applicant].currentAddress.yearsAtAddress < defaults.PREV_ADDRESS_REQUIRED_YEARS;\r\n } else if (vm.userData[applicant].currentAddress.monthsAtAddress || vm.userData[applicant].currentAddress.daysAtAddress) {\r\n vm.notifications[applicant].prevAddressRequired = true;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function calculateTimeAtAddress(prospect, addressType) {\r\n\r\n /* jshint maxcomplexity: 9 */\r\n\r\n var startMonth = vm.userData.interactions[prospect][addressType].addressStartMonth,\r\n startYear = vm.userData.interactions[prospect][addressType].addressStartYear,\r\n timeAtAddress;\r\n\r\n // Reset time at address\r\n vm.userData[prospect][addressType].yearsAtAddress = void 0;\r\n vm.userData[prospect][addressType].monthsAtAddress = void 0;\r\n vm.userData[prospect][addressType].daysAtAddress = void 0;\r\n\r\n if (addressType === 'currentAddress') {\r\n timeAtAddress = momentService.calculateAddressTime(startMonth, startYear);\r\n } else {\r\n timeAtAddress = momentService.calculatePreviousAddressTime(vm.userData.interactions[prospect].currentAddress.addressStartMonth, vm.userData.interactions[prospect].currentAddress.addressStartYear, startMonth, startYear);\r\n }\r\n\r\n vm.notifications.hasDateError = !timeAtAddress || ((!timeAtAddress.years || timeAtAddress.years < 0) && (!timeAtAddress.months || timeAtAddress.months < 0) && (!timeAtAddress.days || timeAtAddress.days < 0));\r\n\r\n if (addressType !== 'currentAddress') {\r\n vm.notifications[prospect][addressType].addressDateBeforeCurrent = vm.notifications.hasDateError;\r\n } else {\r\n vm.notifications[prospect][addressType].futureDate = vm.notifications.hasDateError;\r\n }\r\n\r\n if (vm.notifications.hasDateError) {\r\n return;\r\n }\r\n\r\n vm.notifications[prospect][addressType].futureDate = false;\r\n vm.notifications[prospect][addressType].addressDateBeforeDob = false;\r\n\r\n if (momentService.isMonthBeforeDob(dataModelService.getDateOfBirth(prospect), startMonth, startYear)) {\r\n vm.notifications.hasDateError = true;\r\n vm.notifications[prospect][addressType].addressDateBeforeDob = true;\r\n }\r\n\r\n return timeAtAddress;\r\n }\r\n\r\n /**\r\n *\r\n * @param prospect\r\n * @param addressType\r\n */\r\n vm.checkTimeAtAddress = function (prospect, addressType) {\r\n\r\n var startMonth = vm.userData.interactions[prospect][addressType].addressStartMonth,\r\n startYear = vm.userData.interactions[prospect][addressType].addressStartYear;\r\n\r\n if (!startMonth || !startYear) {\r\n return;\r\n }\r\n\r\n if (!vm.userData[prospect][addressType]) {\r\n vm.userData[prospect][addressType] = {};\r\n }\r\n\r\n var timeAtAddress = calculateTimeAtAddress(prospect, addressType);\r\n\r\n vm.userData[prospect][addressType].yearsAtAddress = void 0;\r\n vm.userData[prospect][addressType].monthsAtAddress = void 0;\r\n vm.userData[prospect][addressType].daysAtAddress = void 0;\r\n\r\n if (timeAtAddress) {\r\n vm.userData[prospect][addressType].yearsAtAddress = timeAtAddress.years;\r\n vm.userData[prospect][addressType].monthsAtAddress = timeAtAddress.months;\r\n vm.userData[prospect][addressType].daysAtAddress = timeAtAddress.days;\r\n }\r\n\r\n if (addressType === 'currentAddress') {\r\n\r\n isPrevAddressRequired(prospect);\r\n\r\n if (vm.notifications[prospect].prevAddressRequired) {\r\n vm.checkTimeAtAddress(prospect, 'previousAddress');\r\n return;\r\n }\r\n\r\n vm.userData[prospect].previousAddress = void 0;\r\n vm.userData.interactions[prospect].previousAddress.addressSelected = false;\r\n vm.userData.interactions[prospect].previousAddress.addressStartMonth = void 0;\r\n vm.userData.interactions[prospect].previousAddress.addressStartYear = void 0;\r\n vm.userData.interactions[prospect].previousAddress.postcode = void 0;\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:ContactDetailsController\r\n * @name checkAddressStatus\r\n * @description\r\n * Ensures that the user has completed all address fields by forcing manual entry flag on incomplete address entries.\r\n *\r\n * @returns {Boolean} Valid\r\n * @type {Function}\r\n */\r\n function checkAddressStatus() {\r\n\r\n var isValid = true;\r\n\r\n function checkProspectAddress(prospect) {\r\n\r\n if (!vm.userData.interactions[prospect].currentAddress.addressSelected && !vm.userData.interactions[prospect].currentAddress.manualEntry) {\r\n vm.notifications[prospect].currentAddress.hasAddressError = true;\r\n isValid = false;\r\n }\r\n\r\n if (vm.notifications[prospect].prevAddressRequired && !vm.userData.interactions[prospect].previousAddress.addressSelected && !vm.userData.interactions[prospect].previousAddress.manualEntry) {\r\n vm.notifications[prospect].previousAddress.hasAddressError = true;\r\n isValid = false;\r\n }\r\n }\r\n\r\n // Check primary prospect\r\n checkProspectAddress('primary');\r\n\r\n // Check secondary prospect\r\n if (vm.notifications.isJointApplication) {\r\n checkProspectAddress('secondary');\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:ContactDetailsController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
$filter\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function (form) {\r\n\r\n var invalidAddress = !checkAddressStatus();\r\n\r\n vm.notifications.hasFormError = !form.$valid || invalidAddress;\r\n\r\n if (vm.notifications.hasFormError || vm.notifications.hasDateError) {\r\n\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n }\r\n\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // Catch address finder ENTER key to prevent server error.\r\n if (!vm.userData.primary.mobileNumber && !vm.userData.primary.phoneNumber) {\r\n return;\r\n }\r\n\r\n dataModelService.updateModel('contactDetails', vm.userData);\r\n analyticsService.addRoute('personal-details');\r\n analyticsService.finishFormTracking();\r\n\r\n vm.notifications.serverError = false;\r\n vm.notifications.isSubmitting = true;\r\n\r\n contactService.submitContactDetails(vm.userData)\r\n .then(function () {\r\n $state.go('personalDetails');\r\n }, function (error) {\r\n $log.error(error);\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitContactDetails: ' + error.status);\r\n });\r\n };\r\n\r\n // IIFE init\r\n (function () {\r\n\r\n analyticsService.startFormTracking();\r\n\r\n isPrevAddressRequired('primary');\r\n\r\n if (vm.notifications.isJointApplication) {\r\n isPrevAddressRequired('secondary');\r\n }\r\n\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('ContactDetailsController', ContactDetailsController);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:employmentService\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:EmploymentController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *EmploymentController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'EmploymentController as contact'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function EmploymentController($log, $state, $rootScope, momentService, employmentService, dataModelService, analyticsService, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:EmploymentController\r\n * @name ntb-fe.controller:EmploymentController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:EmploymentController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError : false,\r\n serverError : false,\r\n isSubmitting : false,\r\n isJointApplication: dataModelService.isJointApplication(),\r\n hasDateError : false,\r\n primary : {\r\n firstName : dataModelService.getFirstName('primary'),\r\n futureDate : false,\r\n dateBeforeDob : false,\r\n overMaxYears : false\r\n },\r\n secondary : {\r\n firstName : dataModelService.isJointApplication() ? dataModelService.getFirstName('secondary') : ''\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:EmploymentController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('employment');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('employment');\r\n\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * \r\n */\r\n vm.checkTimeWithEmployer = function(applicant) {\r\n\r\n // $log.debug('checkTimeWithAccount:', vm.userData.interactions[applicant].timeAtEmployer);\r\n\r\n var startMonth = vm.userData.interactions[applicant].timeAtEmployer.month,\r\n startYear = vm.userData.interactions[applicant].timeAtEmployer.year,\r\n timeWithEmployer,\r\n ageAtEmployment;\r\n\r\n if (!startMonth || !startYear) {\r\n return;\r\n }\r\n\r\n ageAtEmployment = momentService.calculateAgeAtDate(dataModelService.getDateOfBirth(applicant), startMonth, startYear);\r\n\r\n vm.notifications.hasDateError = false;\r\n timeWithEmployer = momentService.calculateEmploymentTime(startMonth, startYear);\r\n\r\n vm.notifications[applicant].futureDate = vm.notifications.hasDateError = !timeWithEmployer;\r\n vm.notifications[applicant].dateBeforeDob = false;\r\n vm.notifications[applicant].overMaxYears = false;\r\n\r\n if (momentService.isMonthBeforeDob(dataModelService.getDateOfBirth(applicant), startMonth, startYear)) {\r\n vm.notifications.hasDateError = true;\r\n vm.notifications[applicant].dateBeforeDob = true;\r\n }\r\n\r\n if (!timeWithEmployer) {\r\n vm.notifications.hasDateError = true;\r\n return;\r\n }\r\n\r\n $log.debug('AGE AT START OF EMPLOYMENT:', ageAtEmployment);\r\n\r\n if (timeWithEmployer.years > defaults.MAX_EMPLOYMENT_YEARS || ageAtEmployment.years < defaults.MIN_EMPLOYMENT_AGE_YEARS) {\r\n vm.notifications.hasDateError = true;\r\n vm.notifications[applicant].overMaxYears = true;\r\n }\r\n\r\n vm.userData[applicant].timeAtEmployer = timeWithEmployer;\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n * @param form\r\n */\r\n vm.changeStatus = function(applicant, form) {\r\n\r\n var tmpData = dataModelService.getBlankModelData('employment');\r\n tmpData[applicant].status = vm.userData[applicant].status;\r\n\r\n vm.userData.interactions[applicant] = angular.copy(tmpData.interactions[applicant]);\r\n vm.userData[applicant] = angular.copy(tmpData[applicant]);\r\n\r\n if (applicant === 'primary') {\r\n vm.userData.interactions[applicant].timeAtEmployer.month = void 0;\r\n vm.userData.interactions[applicant].timeAtEmployer.year = void 0;\r\n vm.userData[applicant].timeAtEmployer.months = void 0;\r\n vm.userData[applicant].timeAtEmployer.years = void 0;\r\n }\r\n\r\n // The model is not syncing correctly without triggering a digest\r\n $rootScope.$applyAsync(function() {\r\n if (form) {\r\n form.$setPristine();\r\n form.$setUntouched();\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:EmploymentController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function(form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n // Employment\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // Employment - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.hasDateError = false;\r\n vm.notifications.serverError = false;\r\n\r\n // Check dates\r\n vm.checkTimeWithEmployer('primary');\r\n\r\n if (vm.notifications.hasDateError) {\r\n vm.notifications.isSubmitting = false;\r\n return;\r\n }\r\n\r\n if (vm.notifications.hasDateError) {\r\n vm.notifications.isSubmitting = false;\r\n return;\r\n }\r\n\r\n dataModelService.updateModel('employment', vm.userData);\r\n analyticsService.addRoute('income');\r\n analyticsService.finishFormTracking();\r\n\r\n employmentService.submitEmploymentDetails(vm.userData)\r\n .then(function() {\r\n $state.go('income');\r\n }, function(error) {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitEmploymentDetails: ' + error.status);\r\n });\r\n };\r\n\r\n // IIFE init\r\n (function() {\r\n analyticsService.startFormTracking();\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('EmploymentController', EmploymentController);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:memorableWordService\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:MemorableWordController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *MemorableWordController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'MemorableWordController as contact'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function MemorableWordController($log, $window, $rootScope, memorableWordService, dataModelService, analyticsService, timeoutService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:MemorableWordController\r\n * @name ntb-fe.controller:MemorableWordController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:MemorableWordController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError : false,\r\n serverError : false,\r\n isJointApplication: dataModelService.isJointApplication(),\r\n isSubmitting : false,\r\n primary : {\r\n firstName: dataModelService.getFirstName('primary')\r\n },\r\n secondary : {\r\n firstName: dataModelService.isJointApplication() ? dataModelService.getFirstName('secondary') : ''\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:MemorableWordController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('memorableWord');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('memorableWord');\r\n\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:MemorableWordController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function(form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n // Memorable Word\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // Memorable word - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.serverError = false;\r\n\r\n // Accept terms\r\n vm.userData.fscs = true;\r\n\r\n dataModelService.updateModel('memorableWord', vm.userData);\r\n analyticsService.finishFormTracking();\r\n\r\n var msn = dataModelService.getModelData('registration').msn;\r\n\r\n memorableWordService.submitMemorableWord(vm.userData)\r\n .then(function(response) {\r\n\r\n $log.debug('APPLICATION COMPLETE UAID:', response.uaid);\r\n\r\n // Manually update the analytics here\r\n analyticsService.addAnalyticsData({\r\n 'adoUaid': response.uaid\r\n });\r\n analyticsService.updateView('memorableWord');\r\n\r\n // Redirect after digest\r\n $rootScope.$applyAsync(function() {\r\n\r\n // Clear timers and session\r\n timeoutService.isInSession = false;\r\n timeoutService.cancelTimeout();\r\n\r\n // Clear data model\r\n dataModelService.clearDataModel();\r\n\r\n $window.open('http://www.co-operativebank.co.uk/currentaccounts/currentaccount/confirmation?id=' + response.uaid + (msn ? '&media=' + msn : '') + '&er=NTB', '_self');\r\n });\r\n\r\n }, function(error) {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitMemorableWord: ' + error.status);\r\n });\r\n };\r\n\r\n (function() {\r\n analyticsService.startFormTracking();\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('MemorableWordController', MemorableWordController);\r\n\r\n})(window.angular, window, history);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:overdraftService\r\n * @requires ntb-fe.service:dataModelService\r\n * @requires ntb-fe.service:intervalAmountService\r\n * @requires ntb-fe.constant:defaults\r\n *\r\n * @name ntb-fe.controller:OverdraftController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *OverdraftController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'OverdraftController as contact'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function OverdraftController($log, $rootScope, $state, $timeout, overdraftService, dataModelService, intervalAmountService, analyticsService, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:OverdraftController\r\n * @name ntb-fe.controller:OverdraftController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:OverdraftController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError : false,\r\n serverError : false,\r\n isSubmitting : false,\r\n isJointApplication: dataModelService.isJointApplication(),\r\n monthlyIncome: parseInt(dataModelService.getUserDetails('primary').monthlyIncome, 10) + (dataModelService.isJointApplication() ? parseInt(dataModelService.getUserDetails('secondary').monthlyIncome, 10) : 0),\r\n maxOverdraft: 5000,\r\n overdraftIncrement : 20,\r\n primary : {\r\n firstName : dataModelService.getFirstName('primary')\r\n },\r\n secondary : {\r\n firstName : dataModelService.isJointApplication() ? dataModelService.getFirstName('secondary') : ''\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:OverdraftController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('overdraft');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('overdraft');\r\n\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n *\r\n */\r\n vm.skipOverdraft = function() {\r\n var tmpData = dataModelService.getBlankModelData('overdraft');\r\n vm.userData = tmpData;\r\n vm.userData.interactions = tmpData.interactions;\r\n vm.userData.overdraftAmount = 0;\r\n\r\n // Submit the userData to ensure B/E is up-to-date\r\n $rootScope.$applyAsync(function() {\r\n vm.submitUserData({ $valid: true });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:OverdraftController\r\n * @name vm.updateAmount\r\n * @description\r\n * Update the amount +- supplied increment\r\n *\r\n * @param {Integer} increment by which the amount should be increased (negative value to decrease)\r\n *\r\n * @type {Function}\r\n */\r\n vm.updateAmount = function(increment) {\r\n var oldAmount = parseInt(vm.userData.overdraftAmount, 10),\r\n newAmount = oldAmount + increment;\r\n\r\n if (newAmount >= defaults.OVERDRAFT_AMOUNT_MIN && newAmount <= vm.notifications.maxOverdraft) {\r\n vm.userData.overdraftAmount = newAmount;\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:OverdraftController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function(form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n if (vm.notifications.hasFormError || vm.notifications.invalidOutgoings) {\r\n\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n }\r\n\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // Overdraft - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.serverError = false;\r\n\r\n dataModelService.updateModel('overdraft', vm.userData);\r\n analyticsService.addRoute('bankDetails');\r\n analyticsService.finishFormTracking();\r\n\r\n overdraftService.submitOverdraftDetails(vm.userData)\r\n .then(function() {\r\n $state.go('bankDetails');\r\n }, function(error) {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitOverdraftDetails: ' + error.status);\r\n });\r\n };\r\n\r\n /**\r\n *\r\n * @returns {*}\r\n */\r\n vm.getTotalOutgoings = function() {\r\n\r\n function getTotalOutgoingsForProspect(prospect) {\r\n var data = vm.userData[prospect];\r\n return data.mortgageOrRent + data.councilTax + data.utilityBills + data.telecoms + data.mobilePhone + data.other;\r\n }\r\n calculateOutgoings(vm.userData);\r\n\r\n var outgoings = getTotalOutgoingsForProspect('primary') || 0;\r\n\r\n if (vm.notifications.isJointApplication) {\r\n outgoings += getTotalOutgoingsForProspect('secondary') || 0;\r\n }\r\n\r\n return outgoings;\r\n };\r\n\r\n /**\r\n *\r\n */\r\n vm.checkOutgoings = function() {\r\n\r\n var totalMonthlyOutgoings = vm.getTotalOutgoings(),\r\n totalMonthlyIncome = dataModelService.getUserDetails('primary').monthlyIncome || 0;\r\n\r\n if (vm.notifications.isJointApplication) {\r\n totalMonthlyIncome += dataModelService.getUserDetails('secondary').monthlyIncome || 0;\r\n }\r\n\r\n $log.info('vm.checkOutgoings:', totalMonthlyOutgoings, 'income:', totalMonthlyIncome);\r\n\r\n vm.notifications.invalidOutgoings = totalMonthlyOutgoings > totalMonthlyIncome;\r\n };\r\n\r\n /**\r\n *\r\n */\r\n vm.checkUserInput = function() {\r\n vm.userData.overdraftAmount = Math.max(100, Math.min(5000, Math.ceil(vm.userData.overdraftAmount / 20) * 20));\r\n };\r\n\r\n /**\r\n * @private\r\n * @param {Object} data Updated model data\r\n */\r\n function calculateOutgoings(data) {\r\n function updateUserDataWithProspectsOutgoings(prospect) {\r\n vm.userData[prospect].mortgageOrRent = intervalAmountService.calculateMonthlyValue(data.interactions[prospect].mortgageOrRent, data.interactions[prospect].mortgageOrRentInterval);\r\n vm.userData[prospect].councilTax = intervalAmountService.calculateMonthlyValue(data.interactions[prospect].councilTax, data.interactions[prospect].councilTaxInterval);\r\n vm.userData[prospect].utilityBills = intervalAmountService.calculateMonthlyValue(data.interactions[prospect].utilityBills, data.interactions[prospect].utilityBillsInterval);\r\n vm.userData[prospect].telecoms = intervalAmountService.calculateMonthlyValue(data.interactions[prospect].tvAndBroadband, data.interactions[prospect].tvAndBroadbandInterval);\r\n vm.userData[prospect].mobilePhone = intervalAmountService.calculateMonthlyValue(data.interactions[prospect].mobilePhone, data.interactions[prospect].mobilePhoneInterval);\r\n vm.userData[prospect].other = intervalAmountService.calculateMonthlyValue(data.interactions[prospect].livingCosts, data.interactions[prospect].livingCostsInterval);\r\n }\r\n\r\n // $log.debug('Data:', data);\r\n\r\n updateUserDataWithProspectsOutgoings('primary');\r\n if (vm.notifications.isJointApplication) {\r\n updateUserDataWithProspectsOutgoings('secondary');\r\n }\r\n }\r\n\r\n // IIFE init\r\n (function() {\r\n\r\n $log.debug('Overdraft userData:', vm.notifications);\r\n\r\n analyticsService.startFormTracking();\r\n\r\n var currentOverdraftAmount = Math.max(100, parseInt(vm.userData.overdraftAmount, 10));\r\n \r\n vm.userData.overdraftAmount += 1;\r\n $timeout(function() {\r\n vm.userData.overdraftAmount = currentOverdraftAmount;\r\n }, 50);\r\n\r\n function outgoingsDataHandler(newVal) {\r\n calculateOutgoings(newVal);\r\n }\r\n\r\n var outgoingsDataWatcher = $rootScope.$watch(angular.bind(vm, function() {\r\n return vm.userData;\r\n }), outgoingsDataHandler, true);\r\n\r\n // Init check\r\n vm.checkOutgoings();\r\n\r\n $rootScope.$on('$destroy', function() {\r\n outgoingsDataWatcher();\r\n });\r\n\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('OverdraftController', OverdraftController);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:personalService\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:PersonalDetailsController\r\n * @description\r\n * Personal details controller\r\n *\r\n * @example\r\n * *PersonalDetailsController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'PersonalDetailsController as contact'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function PersonalDetailsController($log, $state, $rootScope, personalService, dataModelService, analyticsService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:PersonalDetailsController\r\n * @name ntb-fe.controller:PersonalDetailsController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:PersonalDetailsController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError: false,\r\n serverError: false,\r\n isSubmitting: false,\r\n isJointApplication: dataModelService.isJointApplication(),\r\n showGender: {\r\n primary: showGender('primary'),\r\n secondary: dataModelService.isJointApplication() ? showGender('secondary') : false\r\n },\r\n applicantName: {\r\n primary: dataModelService.getFirstName('primary'),\r\n secondary: dataModelService.isJointApplication() ? dataModelService.getFirstName('secondary') : ''\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * @param applicant\r\n * @returns {boolean}\r\n */\r\n function showGender(applicant) {\r\n var userDetails = dataModelService.getUserDetails(applicant);\r\n return userDetails.title === 'Dr' || userDetails.title === 'Prof' || userDetails.title === 'Mx';\r\n }\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:PersonalDetailsController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('personalDetails');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('personalDetails');\r\n\r\n /**\r\n *\r\n * @param item\r\n */\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n */\r\n vm.resetDependents = function (applicant) {\r\n vm.userData[applicant].dependents = void 0;\r\n $rootScope.$applyAsync(function () {\r\n vm.userData[applicant].dependents = void 0;\r\n });\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n * @param value\r\n */\r\n vm.resetUsCitizen = function (applicant, value) {\r\n /* Are you a US citizen? */\r\n if (vm.userData[applicant] && vm.userData[applicant].taxDetails) {\r\n vm.userData[applicant].taxDetails.usCitizen = angular.isDefined(value) ? value : void 0;\r\n }\r\n vm.resetUsTaxResidency(applicant);\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n */\r\n vm.resetUsTaxResidency = function (applicant, value) {\r\n /* Are you resident in the USA for tax purposes? */\r\n if (vm.userData[applicant] && vm.userData[applicant].taxDetails) {\r\n vm.userData[applicant].taxDetails.usTaxNumber = void 0;\r\n vm.userData[applicant].taxDetails.usTaxResident = angular.isDefined(value) ? value : void 0;\r\n }\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n */\r\n vm.resetOtherCountry = function (applicant, value) {\r\n /* Are you a resident for tax purposes in any other country? */\r\n if (vm.userData[applicant] && vm.userData[applicant].taxDetails) {\r\n vm.userData[applicant].taxDetails.otherCountry = void 0;\r\n }\r\n if (vm.userData.interactions[applicant]) {\r\n vm.userData.interactions[applicant].otherCountry = angular.isDefined(value) ? value : void 0;\r\n }\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n */\r\n vm.resetAdditionalCountry = function (applicant, value) {\r\n /* Are you a resident for tax purposes in any additional country? */\r\n if (vm.userData[applicant] && vm.userData[applicant].taxDetails) {\r\n vm.userData[applicant].taxDetails.additionalCountry = void 0;\r\n }\r\n if (vm.userData.interactions[applicant]) {\r\n vm.userData.interactions[applicant].additionalCountry = angular.isDefined(value) ? value : void 0;\r\n }\r\n };\r\n\r\n /*\r\n *\r\n * @param applicant\r\n * * @param {Boolean} keep Keep country selection\r\n */\r\n vm.resetIslands = function (applicant, keep) {\r\n\r\n $log.debug('Reset islands:', applicant, keep, vm.userData);\r\n\r\n /* Are you a resident for tax purposes in Gibraltar, Guernsey Jersey or the Isle of Man? */\r\n vm.resetNiNumber(applicant);\r\n if (!keep) {\r\n vm.resetIslandsCountry(applicant);\r\n }\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n */\r\n vm.resetNiNumber = function (applicant) {\r\n if (vm.userData[applicant] && vm.userData[applicant].taxDetails) {\r\n vm.userData[applicant].taxDetails.niNumber = '';\r\n }\r\n };\r\n\r\n /**\r\n *\r\n * @param {String} applicant Primary|Secondary\r\n */\r\n vm.resetIslandsCountry = function (applicant) {\r\n\r\n if (vm.userData[applicant] && vm.userData[applicant].taxDetails) {\r\n vm.userData[applicant].taxDetails.islandsCountry = void 0;\r\n vm.resetOtherCountry(applicant);\r\n }\r\n };\r\n\r\n /**\r\n *\r\n * @param applicant\r\n * @param option\r\n */\r\n vm.resetFatca = function (applicant, option) {\r\n vm.resetUsCitizen(applicant);\r\n vm.resetOtherCountry(applicant);\r\n vm.resetAdditionalCountry(applicant);\r\n vm.resetIslands(applicant);\r\n\r\n vm.userData[applicant].taxDetails.taxResOutsideUKOrUSCit = void 0;\r\n vm.userData[applicant].taxDetails.islandsTaxResident = void 0;\r\n\r\n if (angular.isDefined(option)) {\r\n vm.userData[applicant].taxDetails.taxResOutsideUKOrUSCit = option;\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * @param applicant\r\n */\r\n function updateGender(applicant) {\r\n var userDetails = dataModelService.getUserDetails(applicant);\r\n\r\n switch (userDetails.title) {\r\n case 'Mr':\r\n vm.userData[applicant].gender = 'M';\r\n break;\r\n case 'Miss':\r\n case 'Mrs':\r\n case 'Ms':\r\n vm.userData[applicant].gender = 'F';\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:PersonalDetailsController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function (form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n // Personal Details\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n updateGender('primary');\r\n\r\n if (vm.notifications.isJointApplication) {\r\n updateGender('secondary');\r\n }\r\n\r\n // Personal details - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.serverError = false;\r\n\r\n dataModelService.updateModel('personalDetails', vm.userData);\r\n analyticsService.addRoute('employment');\r\n analyticsService.finishFormTracking();\r\n\r\n personalService.submitPersonalDetails(vm.userData)\r\n .then(function () {\r\n $state.go('employment');\r\n }, function (error) {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitPersonalDetails: ' + error.status);\r\n });\r\n };\r\n\r\n // IIFE init\r\n (function() {\r\n analyticsService.startFormTracking();\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('PersonalDetailsController', PersonalDetailsController);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:PreambleController\r\n * @description\r\n * Preamble controller\r\n *\r\n * @example\r\n * *PreambleController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'PreambleController as preamble'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function PreambleController($log, $window, $rootScope, $state, preambleService, dataModelService, analyticsService, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:PreambleController\r\n * @name ntb-fe.controller:PreambleController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:PreambleController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n *

Some Error message

\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n serverError: false,\r\n hasFormError: false,\r\n isSubmitting: false,\r\n msn: void 0,\r\n validResidence: void 0\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:PreambleController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('registration');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('registration');\r\n\r\n /**\r\n *\r\n * @param item\r\n */\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n *\r\n */\r\n vm.cashMinderLink = function() {\r\n $window.open('http://www.co-operativebank.co.uk/currentaccounts/cashminder');\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:PreambleController\r\n * @name vm.chooseApplicationType\r\n * @description\r\n * Handles the user selected application type\r\n *\r\n * @param {String} type Account type selection: *'sole' | 'joint'*\r\n *\r\n * @example\r\n *
\r\n         *     \r\n         * 
\r\n *\r\n * @type {Function}\r\n */\r\n vm.chooseApplicationType = function(type) {\r\n\r\n if (vm.userData.userChoices.accountType !== type) {\r\n vm.userData.userChoices.jointConsent = false;\r\n vm.userData.userChoices.acceptTerms = false;\r\n vm.userData.userChoices.fscs = false;\r\n }\r\n\r\n if (!vm.userData.userChoices.accountType) {\r\n window.animateScroll('preamble_anchor_1', 1000, 500);\r\n }\r\n\r\n vm.userData.userChoices.accountType = type;\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:PreambleController\r\n * @name vm.lookupEUPAD\r\n * @description\r\n *\r\n *\r\n * @param {String} applicant Current applicant\r\n *\r\n * @type {Function}\r\n */\r\n vm.lookupEUPAD = function(applicant) {\r\n\r\n var isFound = void 0;\r\n\r\n if (vm.userData.interactions[applicant].residence) {\r\n\r\n isFound = false;\r\n\r\n for (var i = 0, len = defaults.UEPAD_COUNTRIES.length; i < len; i ++) {\r\n if (vm.userData.interactions[applicant].residence === defaults.UEPAD_COUNTRIES[i].code) {\r\n isFound = true;\r\n }\r\n }\r\n }\r\n\r\n vm.notifications.validResidence = isFound;\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:PreambleController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Form submitted\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function(form) {\r\n\r\n vm.notifications.serverError = false;\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n if (!form.$valid) {\r\n analyticsService.trackFormErrors(form);\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // Preamble - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n\r\n dataModelService.updateModel('registration', vm.userData);\r\n analyticsService.addRoute('registration');\r\n analyticsService.finishFormTracking();\r\n\r\n preambleService.initServerComms().then(function() {\r\n $state.go('registration');\r\n }, function(error) {\r\n $log.error(error);\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('initServerComms: ' + error.status);\r\n });\r\n };\r\n\r\n (function() {\r\n analyticsService.startFormTracking();\r\n\r\n if (angular.isUndefined(vm.userData.msn)) {\r\n vm.userData.msn = preambleService.getMSN();\r\n }\r\n\r\n if (vm.userData.msn) {\r\n vm.notifications.msn = defaults.MSN_BASE_PATH + vm.userData.msn + defaults.MSN_IMG_EXT;\r\n }\r\n\r\n if (vm.userData.interactions && vm.userData.interactions.primary.residence) {\r\n vm.lookupEUPAD('primary');\r\n }\r\n\r\n if (vm.userData.interactions && vm.userData.interactions.secondary && vm.userData.interactions.secondary.residence) {\r\n vm.lookupEUPAD('secondary');\r\n }\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('PreambleController', PreambleController);\r\n\r\n})(window.angular);","(function(angular, window) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc controller\r\n * @name ntb-fe.controller:ProgressController\r\n * @description\r\n * Progress controller\r\n *\r\n * Responds to the *ui.router* event *$stateChangeSuccess* and updates the progress based on the current state name\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @example\r\n * *ProgressController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'ProgressController as progress'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function ProgressController($log, $rootScope, $state, $interval, dataModelService, analyticsService, defaults, appInfo) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ProgressController\r\n * @this Scope\r\n * @name vm\r\n * @description\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this,\r\n currentSection,\r\n focusInterval;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ProgressController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n progress : 0,\r\n totalProgress: defaults.JOURNEY_STATES.length - 1, // Minus overdraft and application complete\r\n backEnabled: false,\r\n versionInfo: 'JDI ntb-fe v' + appInfo.VERSION + ' (' + appInfo.BUILD + ')'\r\n };\r\n\r\n /**\r\n * @private\r\n * @param {String} stateName State name\r\n * @returns {Number} Progress / 100\r\n */\r\n function getProgress(stateName) {\r\n var stateItem = defaults.JOURNEY_STATES.filter(function(item) {\r\n return item.name === stateName;\r\n });\r\n\r\n return stateItem.length ? stateItem[0].progress : 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} name State name\r\n * @returns {boolean} Should the page be skipped\r\n */\r\n\r\n function skipPage(name) {\r\n switch(name) {\r\n case 'switching':\r\n if (!dataModelService.getUserDetails('primary').accountNumber) {\r\n return true;\r\n }\r\n break;\r\n case 'overdraft':\r\n if (!dataModelService.hasRequestedOverdraft()) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} stateName State name\r\n * @returns {String} Previous State name\r\n */\r\n function getPrevioustate(stateName) {\r\n\r\n if (stateName === 'resume' && !$state.params.uuid) {\r\n return defaults.JOURNEY_STATES[0].name;\r\n }\r\n\r\n var index = 0;\r\n\r\n for (var i = 0, len = defaults.JOURNEY_STATES.length; i < len; i ++) {\r\n if (defaults.JOURNEY_STATES[i].name === stateName) {\r\n index = i;\r\n }\r\n }\r\n\r\n if (skipPage(defaults.JOURNEY_STATES[index - 1].name)) {\r\n return defaults.JOURNEY_STATES[index - 2].name;\r\n }\r\n\r\n return defaults.JOURNEY_STATES[index - 1].name;\r\n }\r\n\r\n /**\r\n * @private\r\n * @description\r\n * IIFE init method.\r\n *\r\n * @type {Function}\r\n */\r\n (function() {\r\n\r\n function updateFocus() {\r\n\r\n var attemptCount = 0;\r\n\r\n focusInterval = $interval(function() {\r\n\r\n var focusObj = window['document'].getElementsByClassName('has-form-error');\r\n if (focusObj && focusObj.focus) {\r\n focusObj.attr('tabIndex', -1).focus();\r\n $interval.cancel(focusInterval);\r\n }\r\n\r\n if (attemptCount === 10) {\r\n $interval.cancel(focusInterval);\r\n }\r\n\r\n attemptCount++;\r\n\r\n }, 500);\r\n }\r\n\r\n /**\r\n *\r\n */\r\n var stateSuccessWatcher = $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {\r\n\r\n currentSection = toState.name;\r\n\r\n $log.debug('Previous State:', fromState.name, 'params:', fromParams);\r\n $log.debug('Current State:', currentSection, 'params:', toParams);\r\n\r\n vm.notifications.progress = getProgress(currentSection);\r\n vm.notifications.backEnabled = currentSection !== 'start' && !$state.params.uuid;\r\n\r\n vm.goBack = function() {\r\n $state.go(getPrevioustate(currentSection));\r\n };\r\n\r\n $rootScope.$applyAsync(function() {\r\n window.scrollTo(0, 0);\r\n });\r\n\r\n analyticsService.updateView(toState.name);\r\n\r\n }),\r\n formErrorWatcher = $rootScope.$on('hasFormError', function() {\r\n $rootScope.$applyAsync(function() {\r\n window.scrollTo(0, 0);\r\n updateFocus();\r\n });\r\n }),\r\n destroyWatcher = $rootScope.$on('$destroy', function() {\r\n $log.debug('ProgressController: Destroy watchers');\r\n stateSuccessWatcher();\r\n formErrorWatcher();\r\n destroyWatcher();\r\n });\r\n\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('ProgressController', ProgressController);\r\n\r\n})(window.angular, window);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @requires ntb-fe.service:dataModelService\r\n * @requires ntb-fe.service:registrationService\r\n * @requires ntb-fe.service:resumeService\r\n *\r\n * @name ntb-fe.controller:RegistrationController\r\n * @description\r\n * Preamble controller\r\n *\r\n * @example\r\n * *RegistrationController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'RegistrationController as registration'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function RegistrationController($log, $rootScope, $state, $localStorage, defaults, dataModelService, registrationService, resumeService, analyticsService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:RegistrationController\r\n * @name ntb-fe.controller:RegistrationController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:RegistrationController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications model to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError : false,\r\n serverError : false,\r\n primaryApplicantAgeError : false,\r\n secondaryApplicantAgeError: false,\r\n existingApplicant : false,\r\n sendingEmail : false,\r\n emailSendError : false,\r\n resumeRequested : false,\r\n isSubmitting : false\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:RegistrationController\r\n * @name vm.userData\r\n * @description\r\n * User data model to be passed to DOM and updated with user input/selections\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('registration');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('registration');\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:RegistrationController\r\n * @name vm.addPreviousNameOption\r\n * @description\r\n * Submits the user data to *registrationService* and handles the response\r\n *\r\n * @param {String} applicant Primary or secondary applicant\r\n * @param {Boolean} reset Reset previous names before adding the new option\r\n *\r\n * @example\r\n *
\r\n         *     \r\n         * 
\r\n */\r\n vm.addPreviousNameOption = function(applicant, reset) {\r\n\r\n if (reset) {\r\n vm.resetPreviousNames(applicant);\r\n }\r\n\r\n var prevName = angular.copy(defaults.PREVIOUS_NAME, {});\r\n prevName.title = vm.userData[applicant].title;\r\n prevName.firstName = vm.userData[applicant].firstName;\r\n prevName.middleName = vm.userData[applicant].middleName;\r\n prevName.surname = vm.userData[applicant].surname;\r\n\r\n vm.userData[applicant].previousNames.push(prevName);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:RegistrationController\r\n * @name vm.resetPreviousNames\r\n * @description\r\n * Clears all applicant previous names\r\n *\r\n * @param {String} applicant Primary or secondary applicant\r\n *\r\n * @example\r\n *
\r\n         *     \r\n         * 
\r\n */\r\n vm.resetPreviousNames = function(applicant) {\r\n vm.userData[applicant].previousNames = [];\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:RegistrationController\r\n * @name vm.removePreviousName\r\n * @description\r\n * Removes the selected applicant previous name\r\n *\r\n * @param {String} applicant Primary or secondary applicant\r\n * @param {Number} index Chosen primary or secondary applicant Array index\r\n *\r\n * @example\r\n *
\r\n         *     \r\n         * 
\r\n */\r\n vm.removePreviousName = function(applicant, index) {\r\n\r\n // Switch to 'No previous name(s)'\r\n if (vm.userData[applicant].previousNames.length === 1) {\r\n vm.userData.interactions[applicant].previousName = false;\r\n }\r\n\r\n vm.userData[applicant].previousNames.splice(index, 1);\r\n };\r\n\r\n /**\r\n *\r\n * @param item\r\n */\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:RegistrationController\r\n * @name vm.checkEmail\r\n * @description\r\n * Passes the user's email address to the BE to determine if there's an existing application for this user\r\n *\r\n * @param {Boolean} valid Is the supplied email valid\r\n */\r\n vm.resumeEmail = function(valid) {\r\n\r\n if (!valid || vm.notifications.sendingEmail) {\r\n return;\r\n }\r\n\r\n analyticsService.trackEvent('NTB - Email Me', 'NTB - Email Me');\r\n $localStorage.put('emailAddress', vm.userData.primary.emailAddress);\r\n\r\n vm.notifications.sendingEmail = true;\r\n\r\n resumeService.request(vm.userData.primary.emailAddress).then(function() {\r\n vm.notifications.sendingEmail = false;\r\n vm.notifications.emailSendError = false;\r\n vm.notifications.resumeRequested = true;\r\n }, function(error) {\r\n $log.error(error);\r\n vm.notifications.sendingEmail = false;\r\n vm.notifications.emailSendError = true;\r\n vm.notifications.resumeRequested = false;\r\n });\r\n };\r\n\r\n vm.resetExistingEmail = function() {\r\n vm.notifications.existingApplicant = false;\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:RegistrationController\r\n * @name vm.submitUserData\r\n * @description\r\n * Submits the user data to *registrationService* and handles the response\r\n *\r\n * @param {Object} form Form submitted\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n */\r\n vm.submitUserData = function(form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid || vm.notifications.primaryApplicantAgeError || vm.notifications.secondaryApplicantAgeError;\r\n\r\n // Registration\r\n if (vm.notifications.hasFormError) {\r\n\r\n if (!form.$valid) {\r\n analyticsService.trackFormErrors(form);\r\n }\r\n\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.serverError = false;\r\n\r\n resumeService.checkExistingEmail(vm.userData.primary.emailAddress).then(function(response) {\r\n\r\n vm.notifications.existingApplicant = response;\r\n\r\n if (vm.notifications.existingApplicant) {\r\n vm.notifications.isSubmitting = false;\r\n return;\r\n }\r\n\r\n // Registration - CPD Ignore\r\n $localStorage.put('emailAddress', vm.userData.primary.emailAddress);\r\n\r\n dataModelService.updateModel('registration', vm.userData);\r\n analyticsService.addRoute('contact-details');\r\n analyticsService.finishFormTracking();\r\n\r\n registrationService.submitRegistration(vm.userData)\r\n .then(function() {\r\n $state.go('contactDetails');\r\n }, function(error) {\r\n $log.error('RegistrationController:', error);\r\n vm.notifications.serverError = true;\r\n vm.notifications.isSubmitting = false;\r\n analyticsService.trackServerError('submitRegistration: ' + error.status);\r\n });\r\n\r\n }, function(error) {\r\n vm.notifications.serverError = true;\r\n vm.notifications.isSubmitting = false;\r\n analyticsService.trackServerError('checkExistingEmail: ' + error.status);\r\n });\r\n };\r\n\r\n // IIFE init\r\n (function() {\r\n\r\n analyticsService.startFormTracking();\r\n\r\n function prospectDataHandler(newVal) {\r\n\r\n vm.notifications.primaryApplicantAgeError = registrationService.calcAge(newVal.primary.dateOfBirth);\r\n\r\n if (newVal.secondary && newVal.secondary.dateOfBirth) {\r\n vm.notifications.secondaryApplicantAgeError = registrationService.calcAge(newVal.secondary.dateOfBirth);\r\n }\r\n }\r\n\r\n var prospectDataWatcher = $rootScope.$watch(angular.bind(vm, function() {\r\n return vm.userData;\r\n }), prospectDataHandler, true);\r\n\r\n $rootScope.$on('$destroy', function() {\r\n prospectDataWatcher();\r\n });\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('RegistrationController', RegistrationController);\r\n\r\n})(window.angular);\r\n","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:resumeService\r\n * @requires ntb-fe.service:timeoutService\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:ResumeController\r\n * @description\r\n * Resume application controller\r\n *\r\n * @example\r\n * *ResumeController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'ResumeController as resumeCtrl'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function ResumeController($log, $rootScope, $state, $localStorage, resumeService, timeoutService, dataModelService, analyticsService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ResumeController\r\n * @name ntb-fe.controller:ResumeController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ResumeController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n isValidating : false,\r\n isLoading : false,\r\n hasFormError : false,\r\n serverError : false,\r\n invalidEmail : false,\r\n emailSendError : false,\r\n validationError : false,\r\n dateOfBirthError: false,\r\n accountLocked : false,\r\n uuid : !!$state.params.uuid,\r\n resumeRequested : false\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:ResumeController\r\n * @name vm.notifications\r\n * @description\r\n * User data object - passed to DOM and B/E\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = {\r\n emailAddress: $localStorage.get('emailAddress') || '',\r\n uuid : $state.params.uuid,\r\n dateOfBirth : void 0\r\n };\r\n\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n function requestResumeEmail() {\r\n\r\n if (vm.notifications.isLoading) {\r\n return;\r\n }\r\n\r\n analyticsService.trackEvent('NTB - Email Submit', 'NTB - Email Submit');\r\n\r\n // Store the user's email address in session storage\r\n $localStorage.put('emailAddress', vm.userData.emailAddress);\r\n analyticsService.finishFormTracking();\r\n\r\n vm.notifications.serverError = false;\r\n vm.notifications.isLoading = true;\r\n\r\n resumeService.request(vm.userData.emailAddress)\r\n .then(function() {\r\n vm.notifications.invalidEmail = false;\r\n vm.notifications.isLoading = false;\r\n vm.notifications.emailSendError = false;\r\n vm.notifications.resumeRequested = true;\r\n }, function(error) {\r\n\r\n if (error.status === 400) {\r\n vm.notifications.invalidEmail = true;\r\n vm.notifications.emailSendError = false;\r\n analyticsService.trackServerError('requestResumeEmail: INVALID EMAIL');\r\n } else {\r\n vm.notifications.invalidEmail = false;\r\n vm.notifications.emailSendError = true;\r\n analyticsService.trackServerError('requestResumeEmail: ' + error.status);\r\n }\r\n\r\n vm.notifications.isLoading = false;\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function authenticateDateOfBirth() {\r\n\r\n if (vm.notifications.isLoading) {\r\n return;\r\n }\r\n\r\n vm.notifications.serverError = false;\r\n vm.notifications.isLoading = true;\r\n\r\n analyticsService.finishFormTracking();\r\n\r\n resumeService.authenticate(vm.userData)\r\n .then(function() {\r\n\r\n vm.notifications.dateOfBirthError = false;\r\n vm.notifications.accountLocked = false;\r\n \r\n $state.go(dataModelService.resumePoint);\r\n\r\n }, function(error) {\r\n vm.notifications.isLoading = false;\r\n\r\n if (error.status === 401) {\r\n vm.notifications.dateOfBirthError = true;\r\n analyticsService.trackServerError('authenticateDateOfBirth: DOB INCORRECT');\r\n return;\r\n } else if (error.status === 400) {\r\n vm.notifications.accountLocked = true;\r\n analyticsService.trackServerError('authenticateDateOfBirth: ACCOUNT LOCKED');\r\n return;\r\n }\r\n\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('authenticateDateOfBirth: ' + error.status);\r\n });\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:ResumeController\r\n * @name vm.resumeSubmit\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Boolean} valid Submitted form *$valid* flag\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.resumeSubmit = function(isValid) {\r\n\r\n // Update the form error notification\r\n vm.notifications.hasFormError = !isValid;\r\n\r\n analyticsService.finishFormTracking();\r\n\r\n // Resume\r\n if (!isValid) {\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n\r\n if (!vm.notifications.uuid) {\r\n requestResumeEmail();\r\n } else {\r\n authenticateDateOfBirth();\r\n }\r\n };\r\n\r\n // IIFE Init\r\n (function() {\r\n\r\n analyticsService.startFormTracking();\r\n\r\n // Clear the data model now\r\n dataModelService.clearDataModel();\r\n\r\n if (!vm.notifications.uuid) {\r\n timeoutService.endSession().then(function() {\r\n $log.debug('END SESSION');\r\n });\r\n return;\r\n }\r\n\r\n vm.notifications.isValidating = true;\r\n\r\n resumeService.check($state.params.uuid)\r\n .then(function(response) {\r\n vm.notifications.isValidating = false;\r\n vm.notifications.validationError = false;\r\n\r\n $log.debug(response);\r\n }, function(error) {\r\n vm.notifications.isValidating = false;\r\n vm.notifications.validationError = true;\r\n vm.notifications.uuid = false;\r\n\r\n analyticsService.trackServerError('check UUID: ' + error.status);\r\n $log.error(error);\r\n });\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('ResumeController', ResumeController);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:rewardsService\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:RewardsController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *RewardsController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'RewardsController as contact'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function RewardsController($state, $rootScope, rewardsService, dataModelService, analyticsService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:RewardsController\r\n * @name ntb-fe.controller:RewardsController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:RewardsController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError: false,\r\n serverError : false,\r\n isSubmitting: false,\r\n noUserChoice: false,\r\n isJointApplication: dataModelService.isJointApplication(),\r\n secondary : {\r\n firstName : dataModelService.isJointApplication() ? dataModelService.getFirstName('secondary') : ''\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:RewardsController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     vm.userData = dataModelService.getModelData('rewards');\r\n         * 
\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('rewards');\r\n\r\n vm.trackFormElement = function(item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n *\r\n */\r\n vm.resetForm = function(keepType, value) {\r\n vm.userData = angular.copy(dataModelService.getBlankModelData('rewards'));\r\n $rootScope.$applyAsync(function() {\r\n vm.userData.optIn = false;\r\n\r\n if (keepType) {\r\n vm.notifications.noUserChoice = false;\r\n vm.userData.optIn = true;\r\n vm.userData.rewardsType = value;\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:RewardsController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function(form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid || (!vm.userData.rewardsType && vm.userData.optIn);\r\n\r\n vm.notifications.noUserChoice = !vm.userData.rewardsType && vm.userData.optIn;\r\n\r\n // Rewards\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // Rewards - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.serverError = false;\r\n\r\n if (angular.isDefined(vm.userData.rewardsType)) {\r\n analyticsService.trackEvent('NTB - Rewards ' + vm.userData.rewardsType, 'NTB - Rewards');\r\n }\r\n\r\n dataModelService.updateModel('rewards', vm.userData);\r\n analyticsService.addRoute('bank-details');\r\n analyticsService.finishFormTracking();\r\n\r\n rewardsService.submitRewardsOptions(vm.userData)\r\n .then(function() {\r\n $state.go('bankDetails');\r\n }, function(error) {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitRewardsOptions: ' + error.status);\r\n });\r\n };\r\n\r\n (function() {\r\n analyticsService.startFormTracking();\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('RewardsController', RewardsController);\r\n\r\n})(window.angular);\r\n","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:switchingService\r\n * @requires ntb-fe.service:dataModelService\r\n *\r\n * @name ntb-fe.controller:SwitchingController\r\n * @description\r\n * Contact details controller\r\n *\r\n * @example\r\n * *SwitchingController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'SwitchingController as contact'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function SwitchingController($log, $rootScope, $state, $q, switchingService, dataModelService, analyticsService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:SwitchingController\r\n * @name ntb-fe.controller:SwitchingController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:SwitchingController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n hasFormError: false,\r\n serverError: false,\r\n validateError: false,\r\n serverWait: false,\r\n isSubmitting: false,\r\n isValidating: false,\r\n isLoadingDates: false,\r\n switchingAllowed: void 0, // Boolean\r\n switchingEligibility: void 0, // String\r\n availableSwitchDates: {},\r\n userDetails: dataModelService.getUserDetails('primary'),\r\n isJointApplication: dataModelService.isJointApplication(),\r\n\t\t\tisoverDraft : dataModelService.hasRequestedOverdraft(),\r\n switchDate: {\r\n full: void 0, // String\r\n partial: void 0 // String\r\n },\r\n secondary: {\r\n firstName: dataModelService.isJointApplication() ? dataModelService.getFirstName('secondary') : ''\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:SwitchingController\r\n * @name vm.userData\r\n * @description\r\n * User input data to be passed to and handled by the DOM\r\n *\r\n * @type {Object}\r\n */\r\n vm.userData = dataModelService.getModelData('switching');\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.trackFormElement\r\n * @description\r\n * Track form element\r\n *\r\n * @type {Function}\r\n */\r\n vm.trackFormElement = function (item) {\r\n analyticsService.trackFormInteraction(item);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.useExistingDetails\r\n * @description\r\n *\r\n *\r\n * @type {Function}\r\n */\r\n vm.useExistingDetails = function () {\r\n vm.userData.accountToSwitch = {\r\n accountNumber: vm.notifications.userDetails.accountNumber,\r\n sortcode: vm.notifications.userDetails.sortcode\r\n };\r\n\r\n vm.validateAccount();\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.manualEntry\r\n * @description\r\n *\r\n *\r\n * @type {Function}\r\n */\r\n vm.manualEntry = function () {\r\n\r\n vm.notifications.switchingAllowed = void 0;\r\n vm.notifications.switchingEligibility = void 0;\r\n\r\n $log.debug('MANUAL: ', vm.notifications);\r\n\r\n vm.userData.accountToSwitch = {\r\n accountNumber: vm.notifications.userDetails.accountNumber,\r\n sortcode: vm.notifications.userDetails.sortcode\r\n };\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.resetExistingAccount\r\n * @description\r\n * Reset the existing account type\r\n *\r\n * @type {Function}\r\n */\r\n vm.resetExistingAccount = function (type, value) {\r\n switch (type) {\r\n case 'joint':\r\n vm.userData.accountToSwitch.jointAccount = value;\r\n vm.userData.accountToSwitch.primaryApplicantAccount = void 0;\r\n vm.userData.accountToSwitch.secondaryApplicantAccount = void 0;\r\n break;\r\n case 'primary':\r\n vm.userData.accountToSwitch.primaryApplicantAccount = value;\r\n vm.userData.accountToSwitch.secondaryApplicantAccount = void 0;\r\n break;\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.resetForm\r\n * @description\r\n * Reset the form data with option to keep switch type\r\n *\r\n * @type {Function}\r\n */\r\n vm.resetForm = function (keepType, value) {\r\n var tmpData = dataModelService.getBlankModelData('switching'),\r\n isSwitching = vm.userData.interactions.switch;\r\n vm.userData = angular.copy(tmpData);\r\n vm.userData.interactions = angular.copy(tmpData.interactions);\r\n vm.userData.switching = false;\r\n vm.notifications.switchingAllowed = void 0;\r\n vm.notifications.switchingEligibility = void 0;\r\n vm.notifications.validateError = false;\r\n vm.userData.accountToSwitch.jointAccount = void 0;\r\n vm.userData.accountToSwitch.primaryApplicantAccount = void 0;\r\n vm.userData.accountToSwitch.secondaryApplicantAccount = void 0;\r\n\r\n if (keepType) {\r\n vm.userData.interactions.switch = isSwitching;\r\n vm.userData.switching = true;\r\n vm.userData.fullSwitch = value;\r\n\r\n // Set transfer date to first partial switch date\r\n if (value === false) {\r\n vm.userData.transferDate = vm.notifications.switchDate.partial;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.resetDebitCard\r\n * @description\r\n * Reset the debit card data\r\n *\r\n * @type {Function}\r\n */\r\n vm.resetDebitCard = function (applicant) {\r\n if (!vm.userData.debitCard) {\r\n vm.userData.debitCard = {};\r\n }\r\n vm.userData.debitCard[applicant] = {\r\n pan: void 0,\r\n expiry: void 0\r\n };\r\n };\r\n\r\n /**\r\n * @private\r\n * @param eligibility\r\n */\r\n function checkSwitchEligibility(eligibility) {\r\n\r\n $log.debug('VALIDATE ELIGIBILITY:', eligibility);\r\n\r\n vm.notifications.switchingAllowed = angular.isDefined(eligibility) && eligibility !== 'N';\r\n vm.notifications.switchingEligibility = eligibility;\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.validateAccount\r\n * @description\r\n * Passes the user's current bank details to the service in order to validate if the account is eligible to switch and handles the response\r\n *\r\n * @type {Function}\r\n */\r\n vm.validateAccount = function () {\r\n\r\n vm.notifications.isValidating = true;\r\n vm.notifications.serverWait = false;\r\n vm.notifications.validateError = false;\r\n\r\n return $q(function (resolve, reject) {\r\n switchingService.validateAccount(vm.userData.accountToSwitch).then(function (response) {\r\n\r\n checkSwitchEligibility(response.switchingEligibility);\r\n vm.notifications.isValidating = false;\r\n resolve(response);\r\n\r\n }, function (error) {\r\n\r\n vm.notifications.isValidating = false;\r\n\r\n if (error.status && error.status === 429) {\r\n vm.notifications.serverWait = true;\r\n } else {\r\n vm.notifications.validateError = true;\r\n }\r\n\r\n analyticsService.trackServerError('validateAccount: ' + error.status);\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.skipSwitching\r\n * @description\r\n * Skip switching\r\n *\r\n * @type {Function}\r\n */\r\n vm.skipSwitching = function () {\r\n vm.resetForm();\r\n vm.userData.fullSwitch = void 0;\r\n vm.userData.partialAllPayments = void 0;\r\n vm.userData.partialSomePayments = void 0;\r\n vm.userData.interactions.switch = false;\r\n vm.submitUserData({$valid: true});\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.resetPartial\r\n * @description\r\n * Reset partial payments option\r\n *\r\n * @type {Function}\r\n */\r\n vm.resetPartial = function () {\r\n vm.userData.partialSomePayments = void 0;\r\n vm.userData.interactions.confirmAccount = void 0;\r\n vm.notifications.switchingAllowed = void 0;\r\n vm.notifications.switchingEligibility = void 0;\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.acceptSwitchDate\r\n * @description\r\n * Accept the switch date\r\n *\r\n * @type {Function}\r\n */\r\n vm.acceptSwitchDate = function (type) {\r\n vm.userData.transferDate = vm.notifications.switchDate[type];\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.controller:SwitchingController\r\n * @name vm.submitUserData\r\n * @description\r\n * Passes the user input data to the service and handles the response\r\n *\r\n * @param {Object} form Submitted form\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Function}\r\n */\r\n vm.submitUserData = function (form) {\r\n\r\n vm.notifications.hasFormError = !form.$valid;\r\n\r\n // Switching\r\n if (vm.notifications.hasFormError) {\r\n analyticsService.trackFormErrors(form);\r\n $rootScope.$broadcast('hasFormError');\r\n return;\r\n }\r\n if (vm.notifications.isSubmitting) {\r\n return;\r\n }\r\n\r\n // Switching - CPD Ignore\r\n vm.notifications.isSubmitting = true;\r\n vm.notifications.serverError = false;\r\n\r\n // Remove secondary debit card if not joint application\r\n if (!vm.notifications.isJointApplication && vm.userData.debitCard && vm.userData.debitCard.secondary) {\r\n delete vm.userData.debitCard.secondary;\r\n }\r\n\r\n dataModelService.updateModel('switching', vm.userData);\r\n analyticsService.addRoute('memorable-word');\r\n analyticsService.finishFormTracking();\r\n\r\n if (angular.isDefined(vm.userData.accountToSwitch.sortcode)) {\r\n\r\n // Re-validate the account details to catch if they have been modified\r\n vm.validateAccount().then(function (response) {\r\n\r\n if (response.switchingEligibility === 'N') {\r\n vm.notifications.isSubmitting = false;\r\n return;\r\n }\r\n\r\n submitUserData();\r\n }, function () {\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n });\r\n\r\n } else {\r\n submitUserData();\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n function submitUserData() {\r\n switchingService.submitSwitchingDetails(vm.userData)\r\n .then(function () {\r\n $state.go('memorableWord');\r\n }, function (error) {\r\n $log.error('SwitchingController - submitSwitchingDetails:', error);\r\n vm.notifications.isSubmitting = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('submitSwitchingDetails: ' + error.status);\r\n });\r\n }\r\n\r\n // IIFE init\r\n (function () {\r\n\r\n analyticsService.startFormTracking();\r\n\r\n // Recheck the validation on return/resume\r\n if (angular.isDefined(vm.userData.interactions.confirmAccount)) {\r\n vm.validateAccount();\r\n }\r\n\r\n function getSwitchingDates(type) {\r\n\r\n vm.notifications.isLoadingDates = true;\r\n vm.notifications.availableSwitchDates = {};\r\n\r\n switchingService.getSwitchingDates(type)\r\n .then(function (response) {\r\n\r\n vm.notifications.availableSwitchDates[type] = response;\r\n vm.notifications.isLoadingDates = false;\r\n vm.notifications.serverError = false;\r\n\r\n if (response.length) {\r\n vm.notifications.switchDate[type] = response[0];\r\n }\r\n\r\n }, function (error) {\r\n\r\n $log.error('getSwitchingDates:', error);\r\n\r\n vm.notifications.availableSwitchDates[type] = [];\r\n vm.notifications.isLoadingDates = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('getSwitchingDates: ' + error.status);\r\n });\r\n }\r\n\r\n getSwitchingDates('full');\r\n getSwitchingDates('partial');\r\n\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('SwitchingController', SwitchingController);\r\n\r\n})(window.angular);\r\n","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc controller\r\n *\r\n * @requires ntb-fe.service:unsubscribeService\r\n * @requires ntb-fe.service:analyticsService\r\n *\r\n * @name ntb-fe.controller:UnsubscribeController\r\n * @description\r\n * Unsubscribe controller\r\n *\r\n * @example\r\n * *BankDetailsController* should be used with the {@link http://toddmotto.com/digging-into-angulars-controller-as-syntax/ Controller as} syntax\r\n *
\r\n     *     controller: 'BankDetailsController as bankDetails'\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function UnsubscribeController($state, unsubscribeService, analyticsService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:UnsubscribeController\r\n * @name ntb-fe.controller:UnsubscribeController.vm\r\n * @description\r\n * Using *controller as* syntax\r\n * Verbose *this* to expose Controller to DOM\r\n *\r\n * @type {Object}\r\n */\r\n var vm = this;\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.controller:UnsubscribeController\r\n * @name vm.notifications\r\n * @description\r\n * Notifications to be passed to and handled by the DOM\r\n *\r\n * @example\r\n *
\r\n         *     
\r\n * ...\r\n *
\r\n *
\r\n *\r\n * @type {Object}\r\n */\r\n vm.notifications = {\r\n serverError: false,\r\n isWorking: true\r\n };\r\n\r\n // IIFE init\r\n (function () {\r\n\r\n // Immediately call the unsubscribe service with the UUID\r\n unsubscribeService.callUnsubscribe($state.params.uuid).then(function() {\r\n vm.notifications.isWorking = false;\r\n }, function(error) {\r\n vm.notifications.isWorking = false;\r\n vm.notifications.serverError = true;\r\n analyticsService.trackServerError('callUnsubscribe: ' + error.status);\r\n });\r\n\r\n })();\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .controller('UnsubscribeController', UnsubscribeController);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ntb-fe.directive:blurCurrency\r\n * @description\r\n * Reformats inputted String 1234 to £1,234 etc.\r\n *\r\n * @restrict A\r\n *\r\n * @ngInject\r\n *\r\n * @returns {Object} Directive\r\n */\r\n function blurCurrency($filter) {\r\n\r\n function link(scope, el, attrs, ngModelCtrl) {\r\n\r\n function formatter(value) {\r\n\r\n if (angular.isUndefined(value)) {\r\n return void 0;\r\n }\r\n\r\n value = parseFloat(value.toString().replace(/[^0-9._-]/g, ''));\r\n\r\n if (attrs.max) {\r\n value = parseFloat(value.toString().substr(0, parseInt(attrs.max, 10)));\r\n }\r\n\r\n ngModelCtrl.$setValidity('negative', parseInt(value, 10) >= 0);\r\n\r\n var formattedValue = $filter('currency')(value, '£', 0);\r\n el.val(formattedValue);\r\n\r\n ngModelCtrl.$setViewValue(value);\r\n return formattedValue;\r\n }\r\n\r\n attrs.$set('ngTrim', 'false');\r\n ngModelCtrl.$formatters.push(formatter);\r\n\r\n el.on('keydown', function() {\r\n ngModelCtrl.$setValidity('negative', true);\r\n });\r\n\r\n el.on('blur keyup', function(event) {\r\n // Allow arrow key movement\r\n if (event.keyCode !== 37 && event.keyCode !== 39) {\r\n formatter(el.val());\r\n }\r\n });\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n link : link\r\n };\r\n }\r\n\r\n angular.module('ntb-fe')\r\n .directive('blurCurrency', blurCurrency);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ntb-fe.directive:dateFieldGroup\r\n * @description\r\n * Controls the date field group\r\n *\r\n * @restrict A\r\n *\r\n * @ngInject\r\n *\r\n * @returns {Object} Directive\r\n */\r\n function dateFieldGroup($rootScope, analyticsService) {\r\n\r\n function link(scope, element) {\r\n\r\n var inputs = element.find('input'),\r\n day = angular.element(inputs[0]),\r\n month = angular.element(inputs[1]),\r\n year = angular.element(inputs[2]),\r\n isTabbing = false;\r\n\r\n /**\r\n * @private\r\n * @param keyCode\r\n * @returns {Boolean} Boolean\r\n */\r\n function checkNumberKey(keyCode) {\r\n return keyCode && ((keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105));\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function checkFocus(type) {\r\n if (day.val().length === 0 && month.val().length === 0 && year.val().length === 0) {\r\n day[0].focus();\r\n scope.form[scope.applicant + '_dob' + type].$setUntouched();\r\n scope.$digest();\r\n // Trigger a full digest to ensure validation is correct now.\r\n $rootScope.$digest();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function checkTabbing(event) {\r\n if (angular.isDefined(event.keyCode)) {\r\n isTabbing = event.keyCode === 9;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param value\r\n * @param num\r\n * @returns {String} String representation of numerical input\r\n */\r\n function maxVal(value, num) {\r\n var zero = value.toString().substr(0, 1) === '0',\r\n parsedValue;\r\n\r\n value = parseFloat(value.toString().replace(/[^0-9._-]/g, ''));\r\n parsedValue = value > num ? '' : value;\r\n\r\n return isNaN(parsedValue) ? '' : zero ? '0' + (parsedValue ? parsedValue.toString() : '') : parsedValue.toString();\r\n }\r\n\r\n /**\r\n * DAY inout field\r\n */\r\n day.on('keyup keydown focus', function(event) {\r\n\r\n checkTabbing(event);\r\n\r\n if (isTabbing) {\r\n return;\r\n }\r\n\r\n switch (event.type) {\r\n case 'keyup':\r\n if (event.keyCode !== 37 && event.keyCode !== 39 && event.keyCode !== 8) {\r\n day.val(maxVal(day.val(), 31));\r\n if (checkNumberKey(event.keyCode) && day.val().length === 2) {\r\n month[0].focus();\r\n }\r\n }\r\n break;\r\n case 'keydown':\r\n if (event.keyCode === 39 && day[0].selectionStart === 2) {\r\n month[0].focus();\r\n }\r\n break;\r\n case 'focus':\r\n analyticsService.trackFormInteraction('dob_day');\r\n break;\r\n }\r\n });\r\n\r\n /**\r\n * MONTH input field\r\n */\r\n month.on('keyup keydown focus', function(event) {\r\n\r\n checkTabbing(event);\r\n\r\n if (isTabbing) {\r\n return;\r\n }\r\n\r\n switch (event.type) {\r\n case 'keyup':\r\n if (event.keyCode !== 37 && event.keyCode !== 39 && event.keyCode !== 8) {\r\n month.val(maxVal(month.val(), 12));\r\n if (checkNumberKey(event.keyCode) && month.val().length === 2) {\r\n year[0].focus();\r\n }\r\n }\r\n break;\r\n case 'keydown':\r\n if ((event.keyCode === 8 && month.val().length === 0) || (event.keyCode === 37 && month[0].selectionStart === 0)) {\r\n day[0].focus();\r\n }\r\n if (event.keyCode === 39 && month[0].selectionStart === 2) {\r\n year[0].focus();\r\n }\r\n break;\r\n case 'focus':\r\n checkFocus('Month');\r\n analyticsService.trackFormInteraction('dob_month');\r\n break;\r\n }\r\n });\r\n\r\n /**\r\n * YEAR input field\r\n */\r\n year.on('keyup keydown focus', function(event) {\r\n\r\n checkTabbing(event);\r\n\r\n if (isTabbing) {\r\n return;\r\n }\r\n\r\n switch (event.type) {\r\n case 'keyup':\r\n if (event.keyCode !== 37 && event.keyCode !== 39 && event.keyCode !== 8) {\r\n year.val(maxVal(year.val(), new Date().getFullYear()));\r\n }\r\n break;\r\n case 'keydown':\r\n if ((event.keyCode === 8 && year.val().length === 0) || (event.keyCode === 37 && year[0].selectionStart === 0)) {\r\n month[0].focus();\r\n }\r\n break;\r\n case 'focus':\r\n checkFocus('Year');\r\n analyticsService.trackFormInteraction('dob_year');\r\n break;\r\n }\r\n });\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n applicant: '@',\r\n label: '@',\r\n hasError: '=',\r\n formError: '=',\r\n form: '=',\r\n dateOfBirth: '='\r\n },\r\n link: link,\r\n templateUrl: 'date-field-group.template.html'\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .directive('dateFieldGroup', dateFieldGroup);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ntb-fe.directive:debitCardValidation\r\n * @description\r\n * Validates a debit card number (PAN) against the Luhn algorithm\r\n *\r\n * @restrict A\r\n *\r\n * @ngInject\r\n *\r\n * @returns {Object} Directive\r\n */\r\n function debitCardValidation() {\r\n\r\n // Luhn algorithm check\r\n var luhnChk = (function (arr) {\r\n return function (ccNum) {\r\n\r\n if (!ccNum) {\r\n return;\r\n }\r\n\r\n ccNum = ccNum.replace(/\\s/g, '');\r\n\r\n var len = ccNum.length,\r\n bit = 1,\r\n sum = 0,\r\n val;\r\n\r\n while (len) {\r\n val = parseInt(ccNum.charAt(--len), 10);\r\n /* jshint bitwise: false */\r\n sum += (bit ^= 1) ? arr[val] : val;\r\n /* jshint bitwise: true */\r\n }\r\n\r\n return Boolean(ccNum.length >= 12 && sum && sum % 10 === 0);\r\n };\r\n }([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]));\r\n\r\n function link(scope, element, attr, ngModel) {\r\n\r\n ngModel.$parsers.unshift(function(value) {\r\n var valid = luhnChk(value);\r\n ngModel.$setValidity('luhn', valid);\r\n return valid ? value : undefined;\r\n });\r\n\r\n ngModel.$formatters.unshift(function(value) {\r\n ngModel.$setValidity('luhn', luhnChk(value));\r\n return value;\r\n });\r\n\r\n function update(scope, event) {\r\n\r\n // Remove user-input formatting\r\n var inputPan = element.val().replace(/[\\/-]/g, '').split('');\r\n\r\n if (inputPan[4] && inputPan[4] !== ' ') {\r\n inputPan.splice(4, 0, ' ');\r\n }\r\n if (inputPan[9] && inputPan[9] !== ' ') {\r\n inputPan.splice(9, 0, ' ');\r\n }\r\n if (inputPan[14] && inputPan[14] !== ' ') {\r\n inputPan.splice(14, 0, ' ');\r\n }\r\n\r\n // Numerical KeyCodes only for PAN\r\n if (event && event.keyCode) {\r\n element.val(inputPan.join(''));\r\n ngModel.$setViewValue(inputPan.join(''));\r\n }\r\n }\r\n\r\n element.on('blur change keyup', function(event) {\r\n // Update after digest\r\n scope.$evalAsync(update, event);\r\n });\r\n update();\r\n }\r\n \r\n return {\r\n restrict : 'A',\r\n require : '^ngModel',\r\n link : link\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .directive('debitCardValidation', debitCardValidation);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ntb-fe.directive:dateField\r\n * @description\r\n * Reformats inputted date to DD/MM/YYYY as a String\r\n *\r\n * @restrict E\r\n *\r\n * @ngInject\r\n *\r\n * @returns {Object} Directive\r\n */\r\n function expiryDateField() {\r\n\r\n function checkExpiry(value) {\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n value = value.split('/');\r\n\r\n var now = new Date(),\r\n monthNum = parseInt(value[0], 10),\r\n yearNum = (Math.floor(now.getFullYear() /100) * 100) + parseInt(value[1], 10);\r\n\r\n return monthNum <= 12 && (yearNum > now.getFullYear()) || (yearNum === now.getFullYear() && monthNum >= (now.getMonth() + 1));\r\n }\r\n\r\n function link(scope, element, attrs, ngModel) {\r\n\r\n function updateExpiry(scope, event) {\r\n\r\n // Remove user-input formatting for expiry date\r\n var inputExpiryDate = element.val().replace(/[\\/-]/g, '').split('');\r\n\r\n if (inputExpiryDate[2]) {\r\n inputExpiryDate.splice(2, 0, '/');\r\n }\r\n\r\n // Numerical KeyCodes only for expiry date\r\n if (event && event.keyCode && ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105))) {\r\n element.val(inputExpiryDate.join(''));\r\n ngModel.$setViewValue(inputExpiryDate.join(''));\r\n }\r\n }\r\n\r\n element.on('blur change keyup', function(event) {\r\n scope.$evalAsync(updateExpiry, event);\r\n });\r\n updateExpiry();\r\n\r\n ngModel.$parsers.unshift(function(value) {\r\n var valid = checkExpiry(value);\r\n ngModel.$setValidity('expired', valid);\r\n return valid ? value : undefined;\r\n });\r\n\r\n ngModel.$formatters.unshift(function(value) {\r\n ngModel.$setValidity('expired', checkExpiry(value));\r\n return value;\r\n });\r\n }\r\n\r\n return {\r\n restrict : 'A',\r\n require : '^ngModel',\r\n link : link\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .directive('expiryDateField', expiryDateField);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ntb-fe.directive:dateField\r\n * @description\r\n * Reformats inputted date to DD/MM/YYYY as a String\r\n *\r\n * @restrict E\r\n *\r\n * @ngInject\r\n *\r\n * @returns {Object} Directive\r\n */\r\n function sortcodeField($filter) {\r\n\r\n function link(scope, element, attrs, ngModel) {\r\n\r\n function update(scope, event) {\r\n\r\n // Numerical KeyCodes only\r\n if (event && event.keyCode && ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105))) {\r\n var parsedValue = $filter('bankDetailsFilter')({ sortcode: element.val() }).sortcode;\r\n element.val(parsedValue);\r\n ngModel.$setViewValue(parsedValue);\r\n }\r\n }\r\n\r\n element.on('blur change keyup', function(event) {\r\n scope.$evalAsync(update, event);\r\n });\r\n update(scope, { keyCode: 49 });\r\n }\r\n\r\n return {\r\n restrict : 'A',\r\n require : '^ngModel',\r\n link : link\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .directive('sortcodeField', sortcodeField);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngInject\r\n */\r\n function stickyHeader($window) {\r\n\r\n function link(scope, el, attrs, ngModelCtrl) {\r\n\r\n scope.checkScroll = function(pageYOffset) {\r\n if (pageYOffset >= 90) {\r\n ngModelCtrl.$setViewValue(true);\r\n } else {\r\n ngModelCtrl.$setViewValue(false);\r\n }\r\n };\r\n\r\n angular.element($window).bind('scroll', function () {\r\n scope.checkScroll(this.pageYOffset);\r\n });\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n scope: '=',\r\n link : link\r\n };\r\n }\r\n\r\n angular.module('ntb-fe')\r\n .directive('stickyHeader', stickyHeader);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:bankDetails\r\n * @description\r\n * **Factory**\r\n *\r\n * Bank details factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     bankDetails.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function bankDetails($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/bank-details');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('bankDetails', bankDetails);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:contact\r\n * @description\r\n * **Factory**\r\n *\r\n * User contact factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     contact.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function contact($resource, defaults) {\r\n return $resource('unused', null, {\r\n save : {\r\n method: 'POST',\r\n url : defaults.API_BASE_PATH + 'secure/contact-details'\r\n },\r\n lookupPostcode: {\r\n method: 'GET',\r\n url: defaults.API_BASE_PATH + 'premises/:postcode'\r\n },\r\n fetchAddress: {\r\n method: 'POST',\r\n url: defaults.API_BASE_PATH + 'address'\r\n }\r\n });\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('contact', contact);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:employment\r\n * @description\r\n * **Factory**\r\n *\r\n * Employment details factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     employment.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function employment($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/employment');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('employment', employment);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:httpInterceptor\r\n * @description\r\n * **Factory**\r\n *\r\n * Includes Authentication header for all requests.\r\n *\r\n * Intercepts all $http error responses.\r\n *\r\n * @return {object} responseError function\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     $httpProvider.interceptors.push('httpInterceptor');\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function httpInterceptor($q, $injector, dataModelService) {\r\n return {\r\n request: function(config) {\r\n\r\n // Default timeout\r\n config.timeout = 30000;\r\n\r\n var copy = angular.extend({}, config);\r\n\r\n if (copy.method === 'POST' && !dataModelService.isJointApplication() && copy.data) {\r\n\r\n if (copy.data.secondary) {\r\n copy.data.secondary = void 0;\r\n delete copy.data.secondary;\r\n }\r\n if (copy.data.interactions && copy.data.interactions.secondary) {\r\n copy.data.interactions.secondary = void 0;\r\n delete copy.data.interactions.secondary;\r\n }\r\n }\r\n\r\n return(copy);\r\n },\r\n responseError: function(error) {\r\n\r\n var state = $injector.get('$state');\r\n\r\n if (error.status === 401 && state.current.name !== 'resume') {\r\n if (dataModelService.hasStoredData()) {\r\n state.go('resume', {}, { notify: true, reload: true });\r\n } else {\r\n state.go('start', {}, { notify: true, reload: true });\r\n }\r\n }\r\n\r\n return $q.reject(error);\r\n }\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('httpInterceptor', httpInterceptor);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:income\r\n * @description\r\n * **Factory**\r\n *\r\n * Personal details factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     income.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function income($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/income');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('income', income);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:memorableName\r\n * @description\r\n * **Factory**\r\n *\r\n * Memorable word factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     memorableName.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function memorableWord($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/memorable-word');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('memorableWord', memorableWord);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:overdraft\r\n * @description\r\n * **Factory**\r\n *\r\n * Overdraft factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     overdraft.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function overdraft($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/overdraft');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('overdraft', overdraft);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:personal\r\n * @description\r\n * **Factory**\r\n *\r\n * Personal details factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     personal.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function personal($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/personal-details');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('personal', personal);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:registration\r\n * @description\r\n * **Factory**\r\n *\r\n * User registration factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     registration.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function registration($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'registration');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('registration', registration);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:resume\r\n * @description\r\n * **Factory**\r\n *\r\n * Bank details factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     rewards.authenticate({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function resume($resource, defaults) {\r\n return $resource('unused', { uuid: '@uuid' }, {\r\n emailCheck: {\r\n method: 'POST',\r\n url: defaults.API_BASE_PATH + 'email/check'\r\n },\r\n request: {\r\n method: 'POST',\r\n url: defaults.API_BASE_PATH + 'resume/request'\r\n },\r\n check: {\r\n method: 'GET',\r\n url: defaults.API_BASE_PATH + 'resume/check/:uuid'\r\n },\r\n authenticate: {\r\n method: 'POST',\r\n url: defaults.API_BASE_PATH + 'resume/authenticate'\r\n }\r\n });\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('resume', resume);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:rewards\r\n * @description\r\n * **Factory**\r\n *\r\n * Bank details factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     rewards.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function rewards($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/rewards');\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('rewards', rewards);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:session\r\n * @description\r\n * Session factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n *\r\n * @ngInject\r\n */\r\n function session($resource, defaults) {\r\n\r\n return $resource('unused', null, {\r\n start: {\r\n method: 'GET',\r\n cache: false,\r\n url: defaults.API_BASE_PATH + 'init'\r\n },\r\n keepAlive: {\r\n method: 'GET',\r\n cache: false,\r\n url: defaults.API_BASE_PATH + 'secure/session/keepalive?:time'\r\n },\r\n logout: {\r\n method: 'GET',\r\n cache: false,\r\n url: defaults.API_BASE_PATH + 'secure/session/logout'\r\n }\r\n });\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('session', session);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:switching\r\n * @description\r\n * **Factory**\r\n *\r\n * Bank details factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     switching.save({}, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function switching($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'secure/switching', null, {\r\n validateAccount : {\r\n method: 'POST',\r\n url : defaults.API_BASE_PATH + 'secure/switching/validation'\r\n },\r\n getSwitchingDates: {\r\n method: 'GET',\r\n url: defaults.API_BASE_PATH + 'secure/switching/:switchType/dates'\r\n }\r\n });\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('switching', switching);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.factory:unsubscribe\r\n * @description\r\n * **Factory**\r\n *\r\n * Unsubscribe factory\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n * @return {Object} ngResource instance\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     unsubscribe.save({ uuid: 12345678 }, function(response) {\r\n     *         ...\r\n     *     }, function(error) {\r\n     *         ...\r\n     *     });\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function unsubscribe($resource, defaults) {\r\n return $resource(defaults.API_BASE_PATH + 'unsubscribe/:uuid', { uuid:'@uuid' });\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .factory('unsubscribe', unsubscribe);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n * @name ntb-fe.filter:addressResultsFilter\r\n * @description\r\n * Address lookup results filter\r\n *\r\n * @return {Function} Filter method\r\n *\r\n * @example\r\n *
\r\n     *     $filter('addressResultsFilter')(response);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function addressResultsFilter() {\r\n\r\n return function(response) {\r\n\r\n var street = response.streetName,\r\n district = response.district,\r\n town = response.town,\r\n additionalInformation = [];\r\n\r\n if (street && street.length) {\r\n additionalInformation.push(street);\r\n }\r\n if (district && district.length) {\r\n additionalInformation.push(district);\r\n }\r\n if (town && town.length) {\r\n additionalInformation.push(town);\r\n }\r\n\r\n response.additionalInfo = ' ' + additionalInformation.join(', ');\r\n return response;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('addressResultsFilter', addressResultsFilter);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n *\r\n * @returns {Function}\r\n * @ngInject\r\n */\r\n function analyticsDetailFormFieldFilter() {\r\n return function (data) {\r\n var result = [];\r\n for (var i = 0, len = data.length; i < len; i++) {\r\n result.push((i + 1).toString() + ':' + data[i]);\r\n }\r\n return result.join(',');\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('analyticsDetailFormFieldFilter', analyticsDetailFormFieldFilter);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n *\r\n * @param dataModelService\r\n * @returns {Function}\r\n *\r\n * @ngInject\r\n */\r\n function analyticsFormFieldFilter(dataModelService) {\r\n return function(field) {\r\n\r\n var isJointApplication = dataModelService.isJointApplication(),\r\n parsed,\r\n parsedName;\r\n\r\n if (angular.isString(field)) {\r\n parsed = field.split('_');\r\n parsedName = field;\r\n } else {\r\n parsed = field.$name.split('_');\r\n parsedName = field.$name;\r\n }\r\n\r\n if (parsed.length > 1 && parsed[0] === 'primary') {\r\n parsed.shift();\r\n parsedName = (isJointApplication ? 'p_' : '') + parsed.join('_');\r\n }\r\n if (parsed.length > 1 && parsed[0] === 'secondary') {\r\n parsed.shift();\r\n parsedName = (isJointApplication ? 's_' : '') + parsed.join('_');\r\n }\r\n\r\n return parsedName;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('analyticsFormFieldFilter', analyticsFormFieldFilter);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n function bankDetailsFilter() {\r\n return function(userData) {\r\n var copy = angular.copy(userData);\r\n if (copy && copy.sortcode) {\r\n var inputValues = copy.sortcode.replace(/[\\/-]/g, '').split('');\r\n\r\n if (inputValues[2] && inputValues[2] !== '-') {\r\n inputValues.splice(2, 0, '-');\r\n }\r\n if (inputValues[5] && inputValues[5] !== '-') {\r\n inputValues.splice(5, 0, '-');\r\n }\r\n copy.sortcode = inputValues.join('');\r\n }\r\n return copy;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('bankDetailsFilter', bankDetailsFilter);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:dateOfBirth\r\n * @description\r\n * Corrects the user input date of birth as date Object or String and returns (DD/MM/YYYY)\r\n *\r\n * @example\r\n *
\r\n     *     $filter('dateOfBirth')(date);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function dateOfBirthObject($filter) {\r\n\r\n return function(dateOfBirth) {\r\n var parsedDob = $filter('dateOfBirth')(dateOfBirth).split('/');\r\n\r\n return {\r\n day: parseInt(parsedDob[0], 10),\r\n month: parseInt(parsedDob[1], 10),\r\n year: parseInt(parsedDob[2], 10)\r\n };\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('dateOfBirthObject', dateOfBirthObject);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:dateOfBirth\r\n * @description\r\n * Corrects the user input date of birth as date Object or String and returns (DD/MM/YYYY)\r\n *\r\n * @example\r\n *
\r\n     *     $filter('dateOfBirth')(date);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function dateOfBirth() {\r\n\r\n function zero(num) {\r\n return parseInt(num, 10) < 10 ? '0' + parseInt(num, 10).toString() : parseInt(num, 10).toString();\r\n }\r\n\r\n return function(date) {\r\n\r\n if (date && angular.isObject(date)) {\r\n if (date.day && date.month && date.year) {\r\n return zero(date.day) + '/' + zero(date.month) + '/' + date.year;\r\n }\r\n else if (date instanceof Date) {\r\n return zero(date.getDate()) + '/' + zero(date.getMonth() + 1) + '/' + date.getFullYear();\r\n }\r\n }\r\n\r\n if (date && angular.isString(date)) {\r\n return date.replace(/-/g, '/');\r\n }\r\n\r\n return '';\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('dateOfBirth', dateOfBirth);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:employmentDataFilter\r\n * @description\r\n * Filters the employment userData\r\n *\r\n * @example\r\n *
\r\n     *     $filter('dateOfBirth')(date);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function employmentDataFilter() {\r\n \r\n return function(tmpData, cleanModel) {\r\n\r\n for (var i = 0, applicants = ['primary', 'secondary'], tmpStatus, tmpRetirement, len = applicants.length; i < len; i ++) {\r\n\r\n tmpRetirement = void 0;\r\n\r\n if (tmpData[applicants[i]] && tmpData[applicants[i]].status && (tmpData[applicants[i]].status === 'HousePerson' || tmpData[applicants[i]].status === 'Student' || tmpData[applicants[i]].status === 'Unemployed' || tmpData[applicants[i]].status === 'Retired')) {\r\n tmpStatus = tmpData[applicants[i]].status;\r\n\r\n tmpData[applicants[i]] = angular.extend({}, cleanModel[applicants[i]]);\r\n tmpData[applicants[i]].status = tmpStatus;\r\n }\r\n\r\n if (tmpData[applicants[i]].retirementAge && tmpData[applicants[i]].status !== 'Retired') {\r\n tmpRetirement = tmpData[applicants[i]].retirementAge;\r\n }\r\n\r\n tmpData[applicants[i]].retirementAge = tmpRetirement;\r\n\r\n if (tmpData[applicants[i]] && tmpData[applicants[i]].status && tmpData[applicants[i]].status !== 'SelfEmployed') {\r\n tmpData[applicants[i]].seBusinessNature = void 0;\r\n }\r\n }\r\n\r\n return angular.extend({}, tmpData);\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('employmentDataFilter', employmentDataFilter);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:formErrorsFilter\r\n * @description\r\n * Parses the\r\n *\r\n * @example\r\n *
\r\n     *     $filter('dateOfBirth')(date);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function formErrorsFilter($log) {\r\n return function (form) {\r\n\r\n if (!form || form.$valid || !form.$error) {\r\n $log.debug('INVALID FORM');\r\n return '';\r\n }\r\n\r\n var errorsArr = [];\r\n\r\n angular.forEach(form.$error.required, function(field) {\r\n if (field.$invalid){\r\n errorsArr.push(field.$name + '_empty');\r\n }\r\n });\r\n\r\n angular.forEach(form.$error.pattern, function(field) {\r\n if (field.$invalid){\r\n errorsArr.push(field.$name + '_invalid');\r\n }\r\n });\r\n\r\n return errorsArr.join(',');\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('formErrorsFilter', formErrorsFilter);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n *\r\n * @param incomeService\r\n * @returns {Function}\r\n *\r\n * @ngInject\r\n */\r\n function incomeData(intervalAmountService) {\r\n return function(data) {\r\n if (data && data.primary) {\r\n data.primary.incomeBeforeTax = intervalAmountService.calculateYearlyValue(data.interactions.primary.incomeBeforeTax, data.interactions.primary.incomeBeforeTaxInterval);\r\n data.primary.incomeAfterTax = intervalAmountService.calculateMonthlyValue(data.interactions.primary.incomeAfterTax, data.interactions.primary.incomeAfterTaxInterval);\r\n\r\n if (data.interactions.secondary && data.interactions.secondary.incomeBeforeTax) {\r\n data.secondary.incomeBeforeTax = intervalAmountService.calculateYearlyValue(data.interactions.secondary.incomeBeforeTax, data.interactions.secondary.incomeBeforeTaxInterval);\r\n data.secondary.incomeAfterTax = intervalAmountService.calculateMonthlyValue(data.interactions.secondary.incomeAfterTax, data.interactions.secondary.incomeAfterTaxInterval);\r\n }\r\n }\r\n return data;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('incomeData', incomeData);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:mmyyFilter\r\n * @description\r\n * Corrects the user input date of birth as date Object or String and returns (DD/MM/YYYY)\r\n *\r\n * @example\r\n *
\r\n     *     $filter('mmyyFilter')(date);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function mmyyFilter() {\r\n\r\n function zero(num) {\r\n return parseInt(num, 10) < 10 ? '0' + parseInt(num, 10).toString() : num.toString();\r\n }\r\n\r\n return function(date) {\r\n return !date || !date.year ? '' : zero(date.month + 1) + '/' + date.year.substr(2);\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('mmyyFilter', mmyyFilter);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:registrationData\r\n * @description\r\n * Removes secondary applicant from payload if redundant.\r\n *\r\n * @example\r\n *
\r\n     *     $filter('registrationData')(data);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function registrationData($filter) {\r\n\r\n return function(data) {\r\n var copy = angular.copy(data, {}),\r\n parsedPrimaryDob,\r\n parsedSecondaryDob;\r\n\r\n if (copy.secondary && !copy.secondary.title) {\r\n delete copy.secondary;\r\n }\r\n\r\n if (copy.primary && copy.primary.dateOfBirth) {\r\n parsedPrimaryDob = $filter('dateOfBirth')(copy.primary.dateOfBirth).split('/');\r\n\r\n copy.primary.dateOfBirth = {\r\n day: parseInt(parsedPrimaryDob[0], 10),\r\n month: parseInt(parsedPrimaryDob[1], 10),\r\n year: parseInt(parsedPrimaryDob[2], 10)\r\n };\r\n }\r\n\r\n if (copy.secondary && copy.secondary.dateOfBirth) {\r\n parsedSecondaryDob = $filter('dateOfBirth')(copy.secondary.dateOfBirth).split('/');\r\n\r\n copy.secondary.dateOfBirth = {\r\n day: parseInt(parsedSecondaryDob[0], 10),\r\n month: parseInt(parsedSecondaryDob[1], 10),\r\n year: parseInt(parsedSecondaryDob[2], 10)\r\n };\r\n }\r\n\r\n return copy;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('registrationData', registrationData);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:resumePoint\r\n * @description\r\n * Determines the resume point\r\n *\r\n * @example\r\n *
\r\n     *     $filter('dateOfBirth')(date);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function resumeData($log) {\r\n\r\n function zero(num) {\r\n return parseInt(num, 10) ? parseInt(num, 10) < 10 ? '0' + parseInt(num, 10).toString() : parseInt(num, 10).toString() : void 0;\r\n }\r\n\r\n return function(resumeData) {\r\n\r\n if (resumeData.registration && resumeData.registration.primary && resumeData.registration.primary.dateOfBirth) {\r\n resumeData.registration.primary.dateOfBirth.day = zero(resumeData.registration.primary.dateOfBirth.day);\r\n resumeData.registration.primary.dateOfBirth.month = zero(resumeData.registration.primary.dateOfBirth.month);\r\n }\r\n\r\n if (resumeData.registration && resumeData.registration.secondary && resumeData.registration.secondary.dateOfBirth) {\r\n resumeData.registration.secondary.dateOfBirth.day = zero(resumeData.registration.secondary.dateOfBirth.day);\r\n resumeData.registration.secondary.dateOfBirth.month = zero(resumeData.registration.secondary.dateOfBirth.month);\r\n }\r\n\r\n if (resumeData.switching && resumeData.switching.interactions && resumeData.switching.interactions.acceptSwitchDate) {\r\n resumeData.switching.interactions.acceptSwitchDate = void 0;\r\n }\r\n\r\n if (resumeData.personalDetails && resumeData.personalDetails.primary && resumeData.personalDetails.primary.dependents) {\r\n resumeData.personalDetails.primary.dependents = resumeData.personalDetails.primary.dependents.toString();\r\n }\r\n\r\n if (resumeData.switching && resumeData.switching.transferDate) {\r\n resumeData.switching.transferDate = void 0;\r\n }\r\n\r\n if (resumeData.switching && resumeData.switching.interactions && resumeData.switching.interactions.agreement) {\r\n resumeData.switching.interactions.agreement = void 0;\r\n }\r\n\r\n $log.debug('Resume data:', resumeData);\r\n\r\n return angular.copy(resumeData, {});\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('resumeData', resumeData);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n *\r\n * @name ntb-fe.filter:resumePoint\r\n * @description\r\n * Determines the resume point\r\n *\r\n * @example\r\n *
\r\n     *     $filter('dateOfBirth')(date);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function resumePoint($log, defaults) {\r\n\r\n return function(data) {\r\n var journey = defaults.JOURNEY_STATES,\r\n visitedIndexes = [],\r\n resumeIndex = 0,\r\n resumePoint;\r\n\r\n for (var i in data) {\r\n if (data[i].uid && data[i].uid !== '') {\r\n\r\n for (var j = 0, lenJ = journey.length; j < lenJ; j ++) {\r\n if (journey[j].name === data[i].uid) {\r\n visitedIndexes.push(j);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (visitedIndexes.length) {\r\n resumeIndex = Math.max.apply(0, visitedIndexes) + 1;\r\n }\r\n\r\n resumePoint = journey[resumeIndex].name;\r\n\r\n if (resumePoint === journey[journey.length - 1].name) {\r\n resumePoint = journey[resumeIndex - 1].name;\r\n }\r\n\r\n $log.debug('resumePoint filter: Resuming to', resumePoint);\r\n\r\n return resumePoint;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('resumePoint', resumePoint);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n *\r\n * @param momentService\r\n * @returns {Function}\r\n *\r\n * @ngInject\r\n */\r\n function switchingDates(momentService) {\r\n\r\n return function(date) {\r\n return momentService.getLongDate(date);\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('switchingDates', switchingDates);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * @ngdoc filter\r\n * @name ntb-fe.filter:switchingValidation\r\n * @description\r\n * Switching validation filter\r\n *\r\n * @return {Function} Filter method\r\n *\r\n * @example\r\n *
\r\n     *     $filter('switchingValidation')(data);\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function switchingValidation() {\r\n\r\n return function(userData) {\r\n var copy = angular.copy(userData);\r\n if (angular.isDefined(copy.sortcode)) {\r\n copy.sortcode = copy.sortcode.replace(/-/g, '');\r\n }\r\n return copy;\r\n };\r\n\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('switchingValidation', switchingValidation);\r\n\r\n})(window.angular);","(function (angular) {\r\n\r\n 'use strict';\r\n\r\n function switchingDataFilter() {\r\n return function(userData) {\r\n\r\n var copy = angular.copy(userData);\r\n\r\n function parseExpiry(expiry) {\r\n var inputExpiryDate = expiry.replace(/[\\/-]/g, '').split('');\r\n\r\n if (inputExpiryDate[2]) {\r\n inputExpiryDate.splice(2, 0, '/');\r\n }\r\n\r\n return inputExpiryDate.join('');\r\n }\r\n\r\n if (copy && copy.debitCard) {\r\n if (copy.debitCard.primary && copy.debitCard.primary.expiry) {\r\n copy.debitCard.primary.expiry = parseExpiry(copy.debitCard.primary.expiry);\r\n }\r\n if (copy.debitCard.secondary && copy.debitCard.secondary.expiry) {\r\n copy.debitCard.secondary.expiry = parseExpiry(copy.debitCard.secondary.expiry);\r\n }\r\n }\r\n\r\n return copy;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .filter('switchingDataFilter', switchingDataFilter);\r\n\r\n})(window.angular);","(function() {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:analyticsDataService\r\n * @description\r\n *\r\n * Analytics service\r\n *\r\n * @requires ntb-fe.service:dataModelService\r\n * @requires ntb-fe.constant:defaults\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(analyticsDataService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function analyticsDataService($log, $state, $filter, dataModelService, defaults) {\r\n\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @private\r\n * @param section\r\n * @returns {*}\r\n */\r\n function getBaseAnalyticData(section) {\r\n\r\n if (section === 'resume') {\r\n return {\r\n adoPageName: 'bank>ntb>resume'\r\n };\r\n }\r\n if (section === 'unsubscribe') {\r\n return {\r\n adoPageName: 'bank>ntb>email unsubscribe'\r\n };\r\n }\r\n\r\n var stateItem = defaults.JOURNEY_STATES.filter(function (item) {\r\n return item.name === section;\r\n });\r\n\r\n return angular.isDefined(stateItem[0]) ? angular.copy(stateItem[0].analytics) : void 0;\r\n }\r\n\r\n /**\r\n * @param {String} section Current view/section\r\n * @param {Array} formTrackingData Form racking data form main analytics service\r\n * @returns {Object}\r\n */\r\n service.getAnalyticsData = function (section, formTrackingData) {\r\n\r\n /* jshint maxcomplexity: 19 */\r\n\r\n var modelData,\r\n analyticsObj = {};\r\n \r\n function getIncomeAnalytics() {\r\n modelData = dataModelService.getModelData('income');\r\n analyticsObj = {\r\n 'adoIncomeBefore': modelData.interactions.primary.incomeBeforeTax,\r\n 'adoIncomeBeforePeriod': modelData.interactions.primary.incomeBeforeTaxInterval,\r\n 'adoIncomeAfter': modelData.interactions.primary.incomeAfterTax,\r\n 'adoIncomeAfterPeriod': modelData.interactions.primary.incomeAfterTaxInterval,\r\n 'adoRetirementAge': modelData.primary.retirementAge || 'NOT REQUIRED',\r\n 'adoOverdraft': modelData.overdraft\r\n };\r\n }\r\n\r\n switch (section) {\r\n case 'resume':\r\n analyticsObj = {\r\n 'adoUaid': $state.params.uuid\r\n };\r\n break;\r\n case 'start':\r\n // EMPTY\r\n break;\r\n case 'registration':\r\n modelData = dataModelService.getModelData('registration');\r\n analyticsObj = {\r\n 'adoAccountType': modelData.userChoices.accountType === 'sole' ? 'Sole Account' : 'Joint Account',\r\n 'adoCountry': modelData.interactions.primary.residence\r\n };\r\n break;\r\n case 'contactDetails':\r\n modelData = dataModelService.getModelData('registration');\r\n analyticsObj = {\r\n 'adoAge': dataModelService.getApplicantAge('primary'),\r\n 'adoPreviousName': modelData.primary.previousNames && modelData.primary.previousNames.length ? modelData.primary.previousNames[0].firstName + ' ' + modelData.primary.previousNames[0].surname : 'No Previous Name'\r\n };\r\n break;\r\n case 'personalDetails':\r\n modelData = dataModelService.getModelData('contactDetails');\r\n\r\n if (angular.isUndefined(modelData.primary.currentAddress.address)) {\r\n break;\r\n }\r\n\r\n analyticsObj = {\r\n 'adoPostcode': modelData.primary.currentAddress.address.postcode,\r\n 'adoTown': modelData.primary.currentAddress.address.address4,\r\n 'adoPropertyTime': modelData.primary.currentAddress.yearsAtAddress + ' years, ' + modelData.primary.currentAddress.monthsAtAddress + ' months',\r\n 'adoResidentialStatus': modelData.primary.residentialStatus,\r\n 'adoMarketing': 'email: ' + modelData.primary.marketingOptions.email + ', post: ' + modelData.primary.marketingOptions.post + ', sms: ' + modelData.primary.marketingOptions.sms + ', telephone: ' + modelData.primary.marketingOptions.telephone + ', other: ' + modelData.primary.marketingOptions.thirdParty\r\n };\r\n break;\r\n case 'employment':\r\n modelData = dataModelService.getModelData('personalDetails');\r\n analyticsObj = {\r\n 'adoMaritalStatus': modelData.primary.maritalStatus,\r\n 'adoDependents': modelData.primary.dependents,\r\n 'adoNationality': modelData.primary.nationality,\r\n 'adoTaxUs': modelData.primary.taxDetails.usTaxResident,\r\n 'adoCitizenUS': modelData.primary.taxDetails.usCitizen,\r\n 'adoTaxResident': modelData.primary.taxDetails.taxResOutsideUKOrUSCit,\r\n 'adoForeignTaxResident': modelData.primary.taxDetails.islandsTaxResident\r\n };\r\n break;\r\n case 'income':\r\n modelData = dataModelService.getModelData('employment');\r\n analyticsObj = {\r\n 'adoEmploymentStatus': modelData.primary.status,\r\n 'adoJobTitle': modelData.primary.jobTitle\r\n };\r\n break;\r\n case 'overdraft':\r\n\r\n getIncomeAnalytics();\r\n\r\n break;\r\n case 'rewards':\r\n\r\n if (dataModelService.hasRequestedOverdraft()) {\r\n modelData = dataModelService.getModelData('overdraft');\r\n analyticsObj = {\r\n 'adoMortgage': modelData.interactions.primary.mortgageOrRent,\r\n 'adoMortgagePeriod': modelData.interactions.primary.mortgageOrRentInterval,\r\n 'adoCouncilTax': modelData.interactions.primary.councilTax,\r\n 'adoCouncilTaxPeriod': modelData.interactions.primary.councilTaxInterval,\r\n 'adoUtility': modelData.interactions.primary.utilityBills,\r\n 'adoUtilityPeriod': modelData.interactions.primary.utilityBillsInterval,\r\n 'adoTvTel': modelData.interactions.primary.tvAndBroadband,\r\n 'adoTvTelPeriod': modelData.interactions.primary.tvAndBroadbandInterval,\r\n 'adoMob': modelData.interactions.primary.mobilePhone,\r\n 'adoMobPeriod': modelData.interactions.primary.mobilePhoneInterval,\r\n 'adoLiving': modelData.interactions.primary.livingCosts,\r\n 'adoLivingPeriod': modelData.interactions.primary.livingCostsInterval,\r\n 'adoOverdraft': modelData.overdraftAmount\r\n };\r\n } else {\r\n\r\n getIncomeAnalytics();\r\n\r\n }\r\n break;\r\n case 'bankDetails':\r\n modelData = dataModelService.getModelData('rewards');\r\n analyticsObj = {\r\n 'adoRewardsType': modelData.rewardsType,\r\n 'adoChosenCharity': modelData.chosenCharity\r\n };\r\n break;\r\n case 'switching':\r\n modelData = dataModelService.getModelData('bankDetails');\r\n analyticsObj = {\r\n 'adoExistingCurrentAccount': modelData.interactions.existingCurrentAccount\r\n };\r\n break;\r\n case 'memorableWord':\r\n modelData = dataModelService.getModelData('switching');\r\n analyticsObj = {\r\n 'adoSwitch': !!modelData.switching,\r\n 'adoSwitchChoice': modelData.switching ? modelData.fullSwitch ? 'Full' : 'Partial' : 'No Switch'\r\n };\r\n break;\r\n }\r\n\r\n var copiedTrackingData = angular.copy(formTrackingData);\r\n analyticsObj['adoFormField'] = copiedTrackingData.join('>');\r\n analyticsObj['adoDetailFormField'] = $filter('analyticsDetailFormFieldFilter')(copiedTrackingData);\r\n\r\n $log.info('We are including for', section, '-', analyticsObj);\r\n\r\n return angular.extend({}, getBaseAnalyticData(section), defaults.BASE_ANALYTICS, analyticsObj);\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('analyticsDataService', analyticsDataService);\r\n\r\n})(window.angular);","(function (angular, window) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:analyticsService\r\n * @description\r\n *\r\n * Analytics service\r\n *\r\n * @requires ntb-fe.constant:defaults\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(analyticsService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function analyticsService($log, $rootScope, $filter, $location, analyticsDataService, defaults, tealium, tealiumData) {\r\n\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n *\r\n * @type {Object}\r\n */\r\n service.formTrackingData = [];\r\n service.currentSection = 'start';\r\n service.manualData = {};\r\n\r\n /**\r\n * @private\r\n */\r\n function configureViewData(section) {\r\n var tmpUdo = {},\r\n currentData = analyticsDataService.getAnalyticsData(section, service.formTrackingData);\r\n\r\n angular.extend(currentData, angular.copy(service.manualData));\r\n\r\n tmpUdo[section] = function () {\r\n return currentData;\r\n };\r\n\r\n tealium.setViewIdMap(tmpUdo);\r\n service.manualData = {};\r\n }\r\n\r\n /**\r\n *\r\n * @param data\r\n * @param item\r\n */\r\n function trackAnalyticsEvent(data, item) {\r\n var $s = window.s;\r\n\r\n if ($s && $s.tl) {\r\n angular.extend($s, data);\r\n $log.info('Tracking:', $s);\r\n\r\n $s.tl(true, 'o', item);\r\n\r\n // Clear data added to $s\r\n $rootScope.$applyAsync(function() {\r\n for (var i in data) {\r\n if ($s.hasOwnProperty(i)) {\r\n $log.info('Deleting from $s:', i);\r\n delete $s[i];\r\n }\r\n }\r\n });\r\n\r\n } else {\r\n $log.debug('High-level tracking currently unavailable');\r\n }\r\n }\r\n\r\n /**\r\n *\r\n */\r\n service.startFormTracking = function () {\r\n service.formTrackingData = [];\r\n };\r\n\r\n /**\r\n *\r\n * @param field\r\n */\r\n service.trackFormInteraction = function (field) {\r\n service.formTrackingData.push($filter('analyticsFormFieldFilter')(field));\r\n\r\n $log.debug('analyticsService.trackFormInteraction', service.formTrackingData);\r\n };\r\n\r\n /**\r\n * Track the last form interaction and route\r\n */\r\n service.finishFormTracking = function () {\r\n\r\n trackAnalyticsEvent({\r\n linkTrackVars: 'eVar30,events',\r\n linkTrackEvents: 'event17',\r\n eVar30: service.formTrackingData[service.formTrackingData.length - 1],\r\n events: 'event17'\r\n }, 'Last Field');\r\n };\r\n\r\n /**\r\n * Track server errors\r\n * @param {String} error Error\r\n */\r\n service.trackServerError = function (error) {\r\n $log.error('analyticsService.trackServerError:', error);\r\n trackAnalyticsEvent(angular.extend({}, defaults.BASE_TRACKING_SERVER_ERRORS, {\r\n eVar26: error || 'Unknown Error'\r\n }), 'Server Side Error');\r\n };\r\n\r\n /**\r\n * Update the view\r\n * @param {String} section Current application view/state\r\n */\r\n service.updateView = function (section) {\r\n\r\n if (!section) {\r\n return;\r\n }\r\n\r\n service.currentSection = section;\r\n\r\n $log.debug('analyticsService - Update view:', section);\r\n\r\n configureViewData(section);\r\n tealium.view(section);\r\n\r\n $log.info('analyticsService - Tealium udo:', tealiumData.getUdo(section));\r\n };\r\n\r\n /**\r\n * Track errors in a form\r\n * @param {Object} form Form Object\r\n */\r\n service.trackFormErrors = function (form) {\r\n service.trackFormErrorList($filter('formErrorsFilter')(form));\r\n };\r\n\r\n /**\r\n *\r\n * @param {String} errorList List of errors as String\r\n */\r\n service.trackFormErrorList = function (errorList) {\r\n trackAnalyticsEvent(angular.extend({}, defaults.BASE_TRACKING_FORM_ERRORS, {\r\n eVar35: errorList,\r\n list1: errorList\r\n }), 'Form Error');\r\n };\r\n\r\n /**\r\n * Track (a default) event\r\n * @param {String} event Event String to be passed to Adobe Analytics via window.s\r\n * @param {String} item name of item currently being tracked\r\n */\r\n service.trackEvent = function (event, item) {\r\n trackAnalyticsEvent(angular.extend({}, defaults.BASE_TRACKING_EVENT, {\r\n prop27: event,\r\n eVar31: event\r\n }), item);\r\n };\r\n\r\n /**\r\n * Track a custom event\r\n * @param {Object} event A complete event Object to be passed to Adobe Analytics via window.s\r\n * @param {String} item name of item currently being tracked\r\n */\r\n service.trackCustomEvent = function (event, item) {\r\n trackAnalyticsEvent(event, item);\r\n };\r\n\r\n /**\r\n * Add analytics data\r\n * @param {Object} data Manual data to be added\r\n */\r\n service.addAnalyticsData = function(data) {\r\n $log.info('We are adding:', data);\r\n service.manualData = angular.extend({}, service.manualData, data);\r\n };\r\n\r\n /**\r\n *\r\n * @param route\r\n */\r\n service.addRoute = function (route) {\r\n service.addAnalyticsData({\r\n 'adoURL': $location.absUrl().substr(0, $location.absUrl().lastIndexOf('/') + 1) + route\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('analyticsService', analyticsService);\r\n\r\n})(window.angular, window);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:bankDetailsService\r\n * @description\r\n *\r\n * Bank details service\r\n *\r\n * @requires ntb-fe.factory:bankDetails\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(bankDetailsService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function bankDetailsService($q, $filter, bankDetails) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:bankDetailsService\r\n * @name ntb-fe.service:bankDetailsService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:bankDetailsService\r\n * @name service.submitContactDetails\r\n * @description\r\n * Submit the userData Object via the contact factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitBankDetails = function(userData) {\r\n\r\n return $q(function(resolve, reject) {\r\n bankDetails.save($filter('bankDetailsFilter')(userData), function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('bankDetailsService', bankDetailsService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:contactService\r\n * @description\r\n *\r\n * Contact details service\r\n *\r\n * @param {Object} $filter $filter\r\n * @requires ntb-fe.factory:contact\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(contactService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function contactService($q, $filter, contact) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:contactService\r\n * @name ntb-fe.service:contactService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:contactService\r\n * @name service.submitContactDetails\r\n * @description\r\n * Submit the userData Object via the contact factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitContactDetails = function(userData) {\r\n\r\n return $q(function(resolve, reject) {\r\n contact.save(userData, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @private\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:contactService\r\n * @name service.postcodeLookup\r\n * @description\r\n * Get a list of premises based on postcode\r\n *\r\n * @param {String} postcode Postcode\r\n *\r\n * @type {Object}\r\n */\r\n service.postcodeLookup = function(postcode) {\r\n\r\n return $q(function(resolve, reject) {\r\n contact.lookupPostcode({ postcode: postcode }, function(response) {\r\n resolve($filter('addressResultsFilter')(response));\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @private\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:contactService\r\n * @name getAddress\r\n * @description\r\n * Get an address based on postcode and premises name\r\n *\r\n * @param {String} postcode Postcode\r\n * @param {String} premises Premises\r\n *\r\n * @type {Object}\r\n */\r\n service.getAddress = function(postcode, premises) {\r\n\r\n return $q(function(resolve, reject) {\r\n contact.fetchAddress({\r\n postCode: postcode,\r\n premisesName: premises\r\n }, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('contactService', contactService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:dataModelService\r\n * @description\r\n * Data model service\r\n *\r\n * @requires ntb-fe.service:momentService\r\n * @requires ntb-fe.value:userData\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(dataModelService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function dataModelService($log, $filter, $sessionStorage, momentService, userData) {\r\n\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n *\r\n * @type {string}\r\n */\r\n service.resumePoint = 'start';\r\n\r\n /**\r\n *\r\n * @returns {*}\r\n */\r\n function getStoredData() {\r\n return $sessionStorage.get('dataStore') || {};\r\n }\r\n\r\n /**\r\n *\r\n * @returns {boolean}\r\n */\r\n service.hasStoredData = function() {\r\n return Object.keys(getStoredData()).length !== 0;\r\n };\r\n\r\n /**\r\n *\r\n * @returns {Object} Data model Object\r\n */\r\n service.getFullModelData = function() {\r\n return angular.copy(service.hasStoredData() ? getStoredData() : userData);\r\n };\r\n\r\n /**\r\n *\r\n * @param {String} endpoint Endpoint\r\n * @returns {Object} Data model Object\r\n */\r\n service.getModelData = function(endpoint) {\r\n\r\n var returnObject,\r\n tmpData = angular.extend({}, userData[endpoint]);\r\n\r\n if (getStoredData()[endpoint] && getStoredData()[endpoint].uid) {\r\n returnObject = angular.extend({}, getStoredData()[endpoint]);\r\n } else {\r\n returnObject = angular.extend({}, userData[endpoint]);\r\n }\r\n\r\n if (service.isJointApplication()) {\r\n if (angular.isDefined(tmpData.secondary) && angular.isUndefined(returnObject.secondary)) {\r\n returnObject.secondary = tmpData.secondary;\r\n }\r\n\r\n if (tmpData.interactions && angular.isDefined(tmpData.interactions.secondary) && returnObject.interactions && angular.isUndefined(returnObject.interactions.secondary)) {\r\n returnObject.interactions.secondary = tmpData.interactions.secondary;\r\n }\r\n }\r\n\r\n return returnObject;\r\n };\r\n\r\n /**\r\n *\r\n * @param endpoint\r\n */\r\n service.getBlankModelData = function(endpoint) {\r\n return angular.copy(userData[endpoint]);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name checkResumeData\r\n * @description\r\n * Check the resume data from B/E and update the model\r\n *\r\n * @param {Object} resumeData Resume data from B/E\r\n */\r\n service.checkResumeData = function(resumeData) {\r\n service.resumePoint = $filter('resumePoint')(resumeData);\r\n updateSession($filter('resumeData')(resumeData));\r\n $log.debug('Checking resume data:', resumeData, 'Resume point:', service.resumePoint);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name clearDataModel\r\n * @description\r\n * Clear the data model\r\n */\r\n service.clearDataModel = function() {\r\n $sessionStorage.remove('dataStore');\r\n $sessionStorage.remove('preambleChoices');\r\n $sessionStorage.empty();\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name getAccountType\r\n * @description\r\n * Get the account type [sole|joint]\r\n *\r\n * @returns {String} Account type selected [sole|joint]\r\n */\r\n service.getAccountType = function() {\r\n try {\r\n return getStoredData().registration.userChoices.accountType;\r\n }\r\n catch(e) {\r\n $log.warn('dataModelService: ACCOUNT TYPE NOT SET');\r\n return 'ERROR';\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name hasRequestedOverdraft\r\n * @description\r\n * Get a flag indicating whether the prospect has requested an overdraft\r\n *\r\n * @returns {Boolean} true if the prospect has requested an overdraft\r\n */\r\n service.hasRequestedOverdraft = function() {\r\n try {\r\n return getStoredData().income.overdraft;\r\n }\r\n catch(e) {\r\n $log.warn('dataModelService: INCOME');\r\n return 'ERROR';\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name isJointApplication\r\n * @description\r\n * Is the application a joint application\r\n *\r\n * @returns {Boolean} Account type is 'joint'\r\n */\r\n service.isJointApplication = function() {\r\n return service.getAccountType() === 'joint';\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name getFirstName\r\n * @description\r\n * Get the applicant firstName\r\n *\r\n * @param {String} applicant Applicant [primary|secondary]\r\n * @returns {String} Applicant firstName\r\n */\r\n service.getFirstName = function(applicant) {\r\n try {\r\n return getStoredData().registration[applicant].firstName;\r\n }\r\n catch(e) {\r\n $log.warn('dataModelService: ' + applicant.toUpperCase() + ' APPLICANT FIRST NAME NOT SET');\r\n return 'ERROR';\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name getDateOfBirth\r\n * @description\r\n * Get the applicant Date of birth\r\n *\r\n * @param {String} applicant Applicant [primary|secondary]\r\n * @returns {String} Applicant date of birth\r\n */\r\n service.getDateOfBirth = function(applicant) {\r\n try {\r\n return $filter('dateOfBirth')(getStoredData().registration[applicant].dateOfBirth);\r\n }\r\n catch(e) {\r\n $log.warn('dataModelService: APPLICANT DOB NOT SET');\r\n return 'ERROR';\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name getApplicantAge\r\n * @description\r\n * Get the applicant age\r\n *\r\n * @param {String} applicant Applicant [primary|secondary]\r\n * @returns {Number} Applicant age\r\n */\r\n service.getApplicantAge = function(applicant) {\r\n return momentService.calculateAge(service.getDateOfBirth(applicant));\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:dataModelService\r\n * @name getUserDetails\r\n * @description\r\n * Get the applicant name and address\r\n *\r\n * @param {String} applicant Applicant [primary|secondary]\r\n * @returns {Object} Applicant user details\r\n */\r\n service.getUserDetails = function(applicant) {\r\n var returnObj = {},\r\n storedData = getStoredData();\r\n\r\n try {\r\n returnObj.title = storedData.registration[applicant].title;\r\n returnObj.firstName = storedData.registration[applicant].firstName;\r\n returnObj.surname = storedData.registration[applicant].surname;\r\n returnObj.address = storedData.contactDetails[applicant].currentAddress.address;\r\n returnObj.age = service.getApplicantAge(applicant);\r\n returnObj.employmentStatus = storedData.employment[applicant].status;\r\n returnObj.monthlyIncome = storedData.income.interactions[applicant].monthlyIncome;\r\n\r\n if (applicant === 'primary') {\r\n returnObj.accountNumber = storedData.bankDetails.accountNumber;\r\n returnObj.sortcode = storedData.bankDetails.sortcode;\r\n }\r\n\r\n } catch(e) {\r\n $log.debug('Unable to retrieve all user data for', applicant, 'applicant.');\r\n }\r\n\r\n $log.debug('Retrieve all user data for', applicant, 'applicant.', returnObj);\r\n\r\n return returnObj;\r\n };\r\n\r\n /**\r\n *\r\n * @param endpoint\r\n * @param data\r\n */\r\n service.updateModel = function(endpoint, data) {\r\n\r\n var keys = Object.keys(data),\r\n storedData = getStoredData();\r\n\r\n if (angular.isUndefined(storedData[endpoint])) {\r\n storedData[endpoint] = data;\r\n } else {\r\n for (var i = 0, len = keys.length; i < len; i ++) {\r\n storedData[endpoint][keys[i]] = data[keys[i]];\r\n }\r\n }\r\n\r\n $log.info('dataModelService: updateModel for ' + endpoint + ':', storedData);\r\n\r\n updateSession(storedData);\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n function updateSession(data) {\r\n $sessionStorage.put('dataStore', data);\r\n $log.debug('Updated user data in session:', $sessionStorage.get('dataStore'));\r\n }\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('dataModelService', dataModelService);\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:employmentService\r\n * @description\r\n *\r\n * Employment details service\r\n *\r\n * @requires ntb-fe.factory:employment\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(employmentService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function employmentService($q, $filter, employment, dataModelService) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:employmentService\r\n * @name ntb-fe.service:employmentService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n *\r\n * @param tmpData\r\n * @returns {Object}\r\n */\r\n service.checkUserData = function(tmpData) {\r\n return $filter('employmentDataFilter')(tmpData, dataModelService.getBlankModelData('employment'));\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:employmentService\r\n * @name service.submitEmploymentDetails\r\n * @description\r\n * Submit the cleanModel Object via the personal factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitEmploymentDetails = function(data) {\r\n return $q(function(resolve, reject) {\r\n employment.save(data, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('employmentService', employmentService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:incomeService\r\n * @description\r\n *\r\n * Income details service\r\n *\r\n * @requires ntb-fe.factory:income\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(incomeService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function incomeService($q, $filter, income) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:incomeService\r\n * @name ntb-fe.service:incomeService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:incomeService\r\n * @name service.submitIncomeDetails\r\n * @description\r\n * Submit the userData Object via the income factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitIncomeDetails = function(userData) {\r\n\r\n return $q(function(resolve, reject) {\r\n income.save($filter('incomeData')(angular.copy(userData)), function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('incomeService', incomeService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:intervalAmountService\r\n * @description\r\n *\r\n * Interval Amount Service\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(intervalAmountService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function intervalAmountService() {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:intervalAmountService\r\n * @name ntb-fe.service:intervalAmountService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:intervalAmountService\r\n * @name service.calculateMonthlyValue\r\n * @description\r\n * Calculates the monthly value based on the supplied interval\r\n *\r\n * @param {Number} value Value to be calculated\r\n * @param {String} interval Interval [Weekly|Monthly|Yearly]\r\n *\r\n * @returns {Number} Calculated Monthly value\r\n */\r\n service.calculateMonthlyValue = function(value, interval) {\r\n\r\n var calculatedValue = parseInt(value, 10);\r\n\r\n if (!calculatedValue) {\r\n return 0;\r\n }\r\n\r\n switch(interval) {\r\n case 'Weekly':\r\n calculatedValue = calculatedValue * 52 / 12;\r\n break;\r\n case 'Four Weekly':\r\n calculatedValue = (calculatedValue / 4) * 52 / 12;\r\n break;\r\n case 'Yearly':\r\n calculatedValue = calculatedValue / 12;\r\n break;\r\n }\r\n\r\n return calculatedValue;\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:intervalAmountService\r\n * @name service.calculateYearlyValue\r\n * @description\r\n * Calculates the yearly value based on the supplied interval\r\n *\r\n * @param {Number} value Value to be calculated\r\n * @param {String} interval Interval [Weekly|Monthly|Yearly]\r\n *\r\n * @returns {Number} Calculated Yearly value\r\n */\r\n service.calculateYearlyValue = function(value, interval) {\r\n\r\n var calculatedValue = parseInt(value, 10);\r\n\r\n if (!calculatedValue) {\r\n return 0;\r\n }\r\n\r\n switch(interval) {\r\n case 'Weekly':\r\n calculatedValue = calculatedValue * 52;\r\n break;\r\n case 'Four Weekly':\r\n calculatedValue = (calculatedValue / 4) * 52;\r\n break;\r\n case 'Monthly':\r\n calculatedValue = calculatedValue * 12;\r\n break;\r\n }\r\n\r\n return calculatedValue;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('intervalAmountService', intervalAmountService);\r\n\r\n})(window.angular, window.moment);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:memorableWordService\r\n * @description\r\n *\r\n * memorable Word service\r\n *\r\n * @requires ntb-fe.factory:memorableWord\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(memorableWordService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function memorableWordService($q, memorableWord) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:memorableWordService\r\n * @name ntb-fe.service:memorableWordService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:memorableWordService\r\n * @name service.submitMemorableWord\r\n * @description\r\n * Submit the userData Object via the contact factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitMemorableWord = function(userData) {\r\n\r\n return $q(function(resolve, reject) {\r\n memorableWord.save(userData, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('memorableWordService', memorableWordService);\r\n\r\n})(window.angular);","(function(angular, moment) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:momentService\r\n * @description\r\n *\r\n * Moment service\r\n * Provides and interface between AngularJS and moment.js\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(momentService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function momentService() {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:momentService\r\n * @name ntb-fe.service:momentService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * Modified version of Rob Dawson's preciseDiff:\r\n * @see https://github.com/codebox/moment-precise-range\r\n *\r\n * @param d1\r\n * @param d2\r\n * @returns {*}\r\n */\r\n service.preciseDiff = function(d1, d2) {\r\n\r\n var m1 = moment(d1),\r\n m2 = moment(d2);\r\n\r\n // Ensure that the calculated date is NOT before the chosen date\r\n if (m2.isBefore(m1)) {\r\n return void 0;\r\n }\r\n\r\n var yDiff = m2.year() - m1.year(),\r\n mDiff = m2.month() - m1.month(),\r\n dDiff = m2.date() - m1.date();\r\n\r\n if (dDiff < 0) {\r\n var daysInLastFullMonth = moment(m2.year() + '-' + (m2.month() + 1), 'YYYY-MM').subtract(1, 'M').daysInMonth();\r\n if (daysInLastFullMonth < m1.date()) { // 31/01 -> 2/03\r\n dDiff = daysInLastFullMonth + dDiff + (m1.date() - daysInLastFullMonth);\r\n } else {\r\n dDiff = daysInLastFullMonth + dDiff;\r\n }\r\n mDiff--;\r\n }\r\n\r\n if (mDiff < 0) {\r\n mDiff = 12 + mDiff;\r\n yDiff--;\r\n }\r\n\r\n return {\r\n years : yDiff,\r\n months: mDiff,\r\n days : dDiff\r\n };\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:momentService\r\n * @name service.calculateAge\r\n * @description\r\n * Calculate the applicant age based on supplied DOB\r\n *\r\n * @param {String} dob Date of birth s DD/MM/YYYY\r\n * @returns {Number} Age in years\r\n */\r\n service.calculateAge = function(dob) {\r\n return moment().diff(moment(dob, 'DD/MM/YYYY'), 'years');\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:momentService\r\n * @name service.calculateAgeAtDate\r\n * @description\r\n * Calculate the applicant age at a certain date based on supplied DOB and Month, Year\r\n *\r\n * @param {String} dob Date of birth as String (DD/MM/YYYY)\r\n * @param {Number} month Month\r\n * @param {Number} year Year\r\n * @returns {Object} Age at date\r\n */\r\n service.calculateAgeAtDate = function(dob, month, year) {\r\n return service.preciseDiff(moment(dob, 'DD/MM/YYYY'), moment([Number(year), Number(month), 1]));\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:momentService\r\n * @name service.isMonthBeforeDob\r\n * @description\r\n * Is the supplied month\r\n *\r\n * @param {Object} dob Date of birth Object\r\n * @param {String} month Month\r\n * @param {String} year Year\r\n * @returns {Boolean} isMonthBeforeDob\r\n */\r\n service.isMonthBeforeDob = function(dob, month, year) {\r\n var momentDob = moment(dob, 'DD/MM/YYYY'),\r\n monthNum = parseInt(month, 10),\r\n yearNum = parseInt(year, 10);\r\n return (yearNum < momentDob.year()) || (yearNum === momentDob.year() && monthNum < momentDob.month());\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:momentService\r\n * @name service.calculateAddressTime\r\n * @description\r\n * Calculate the time at address based on supplied month and year\r\n *\r\n * @param {String} month Month\r\n * @param {String} year Year\r\n * @returns {Object} Years and months at address\r\n */\r\n service.calculateAddressTime = function(month, year) {\r\n return service.preciseDiff(moment([Number(year), Number(month), 1]), moment());\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:momentService\r\n * @name service.calculatePreviousAddressTime\r\n * @description\r\n * Calculate the time at the previous address address based on supplied month and year of both addresses\r\n *\r\n * @param {String} currentAddressMonth Month\r\n * @param {String} currentAddressYear Year\r\n * @param {String} previousAddressMonth Month\r\n * @param {String} previousAddressYear Year\r\n * @returns {Object} Years and months at address\r\n */\r\n service.calculatePreviousAddressTime = function(currentAddressMonth, currentAddressYear, previousAddressMonth, previousAddressYear) {\r\n return service.preciseDiff(moment([Number(previousAddressYear), Number(previousAddressMonth), 1]), moment([Number(currentAddressYear), Number(currentAddressMonth), 1]));\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:momentService\r\n * @name service.calculateEmploymentTime\r\n * @description\r\n * Calculate the time at employment based on supplied month and year\r\n *\r\n * @param {String} month Month\r\n * @param {String} year Year\r\n * @returns {Object} Years and months at address\r\n */\r\n service.calculateEmploymentTime = function(month, year) {\r\n return service.preciseDiff(moment([Number(year), Number(month), 1]), moment());\r\n };\r\n\r\n /**\r\n *\r\n * @param date\r\n */\r\n service.getLongDate = function(date) {\r\n return moment(date, 'DD/MM/YYYY').format('Do MMMM YYYY');\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('momentService', momentService);\r\n\r\n})(window.angular, window.moment);\r\n","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:overdraftService\r\n * @description\r\n *\r\n * Overdraft service\r\n *\r\n * @requires ntb-fe.factory:overdraft\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(overdraftService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function overdraftService($q, overdraft) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:overdraftService\r\n * @name ntb-fe.service:overdraftService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:overdraftService\r\n * @name service.submitOverdraftDetails\r\n * @description\r\n * Submit the userData Object via the overdraft factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from overdraft factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitOverdraftDetails = function(userData) {\r\n return $q(function(resolve, reject) {\r\n overdraft.save(userData, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('overdraftService', overdraftService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:personalService\r\n * @description\r\n *\r\n * Personal details service\r\n *\r\n * @requires ntb-fe.factory:personal\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(personalService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function personalService($q, personal) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:personalService\r\n * @name ntb-fe.service:personalService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:personalService\r\n * @name service.submitPersonalDetails\r\n * @description\r\n * Submit the userData Object via the personal factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitPersonalDetails = function(userData) {\r\n\r\n return $q(function(resolve, reject) {\r\n personal.save(userData, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('personalService', personalService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:preambleService\r\n * @description\r\n *\r\n * Preamble service\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(preambleService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function preambleService($q, $cookies, session, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:preambleService\r\n * @name ntb-fe.service:bankDetailsService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:preambleService\r\n * @name service.getMSN\r\n * @description\r\n * Get the MSN from the cookie via ngCookies\r\n *\r\n * @return {String} MSN\r\n */\r\n service.getMSN = function () {\r\n return $cookies.get(defaults.MSN_COOKIE_PATH);\r\n\r\n /*\r\n return $q(function(resolve) {\r\n $http({\r\n method: 'GET',\r\n url: defaults.MSN_BASE_PATH + $cookies.get(defaults.MSN_COOKIE_PATH) + defaults.MSN_IMG_EXT\r\n }).then(function successCallback() {\r\n resolve(defaults.MSN_BASE_PATH + $cookies.get(defaults.MSN_COOKIE_PATH) + defaults.MSN_IMG_EXT);\r\n }, function errorCallback() {\r\n resolve('PATH_TO_LOCAL_BLANK_IMAGE'); // @TODO\r\n });\r\n });\r\n */\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:preambleService\r\n * @name service.initServerComms\r\n * @description\r\n * Initialise the server comms\r\n *\r\n * @return {String} MSN\r\n */\r\n service.initServerComms = function () {\r\n return $q(function(resolve, reject) {\r\n session.start(null, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('preambleService', preambleService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:registrationService\r\n * @description\r\n *\r\n * User registration service\r\n *\r\n * @requires ntb-fe.factory:registration\r\n * @requires ntb-fe.filter:registrationData\r\n * @requires ntb-fe.service:momentService\r\n * @requires ntb-fe.constant:defaults\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(registrationService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function registrationService($q, $filter, momentService, registration, defaults) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:registrationService\r\n * @name ntb-fe.service:registrationService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:registrationService\r\n * @name service.submitregistration\r\n * @description\r\n * Submit the userData Object via the registration factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitRegistration = function(userData) {\r\n\r\n return $q(function(resolve, reject) {\r\n registration.save(userData, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:registrationService\r\n * @name service.calcAge\r\n * @description\r\n * Calculate the applicant age based on DOB\r\n *\r\n * @type {Object}\r\n */\r\n service.calcAge = function(dob) {\r\n\r\n var filtered = $filter('dateOfBirth')(dob);\r\n\r\n if (filtered.length === 10) {\r\n var calculatedAge = momentService.calculateAge(filtered);\r\n return !calculatedAge ? 'ERROR' : calculatedAge < defaults.APPLICANT_MIN_AGE ? 'UNDER' : calculatedAge > defaults.APPLICANT_MAX_AGE ? 'OVER' : false;\r\n }\r\n\r\n return false;\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('registrationService', registrationService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:resumeService\r\n * @description\r\n *\r\n * Resume service\r\n *\r\n * @require ntb-fe.applicantLogin\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(resumeService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function resumeService($log, $q, $filter, dataModelService, resume) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:resumeService\r\n *\r\n * @name service\r\n * @description\r\n * Verbose 'this' as service\r\n *\r\n * @type {resumeService}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:resumeService\r\n * @name service.request\r\n * @description\r\n * Resume UUID check request\r\n *\r\n * @param {Object} email Email address\r\n */\r\n service.request = function(email) {\r\n\r\n return $q(function(resolve, reject) {\r\n resume.request({}, { email: email }, function() {\r\n resolve();\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:resumeService\r\n * @name service.check\r\n * @description\r\n * Resume UUID check request\r\n *\r\n * @param {Object} uuid Resume UUID\r\n */\r\n service.check = function(uuid) {\r\n\r\n return $q(function(resolve, reject) {\r\n resume.check({}, { uuid: uuid }, function() {\r\n resolve();\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:resumeService\r\n * @name service.authenticate\r\n * @description\r\n * Authenticate the user\r\n *\r\n * @param {Object} userData User data\r\n */\r\n service.authenticate = function(userData) {\r\n\r\n var copy = angular.copy(userData, {});\r\n copy.dateOfBirth = $filter('dateOfBirthObject')(copy.dateOfBirth);\r\n\r\n $log.debug('authenticate:', copy);\r\n\r\n return $q(function(resolve, reject) {\r\n resume.authenticate({}, copy, function(response) {\r\n dataModelService.checkResumeData(response);\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:resumeService\r\n * @name checkExistingEmail\r\n * @description\r\n * Check for existing application based on supplied email address\r\n *\r\n * @param {String} emailAddress User data Object\r\n */\r\n service.checkExistingEmail = function(emailAddress) {\r\n\r\n return $q(function(resolve, reject) {\r\n resume.emailCheck({}, { emailAddress: emailAddress }, function(response) {\r\n resolve(response.status === 'ACTIVE_APPLICATION');\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('resumeService', resumeService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:rewardsService\r\n * @description\r\n *\r\n * Rewards service\r\n *\r\n * @requires ntb-fe.factory:rewards\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(rewardsService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function rewardsService($q, rewards) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:rewardsService\r\n * @name ntb-fe.service:rewardsService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:rewardsService\r\n * @name service.submitRewardsOptions\r\n * @description\r\n * Submit the userData Object via the contact factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitRewardsOptions = function(userData) {\r\n\r\n return $q(function(resolve, reject) {\r\n rewards.save(userData, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('rewardsService', rewardsService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:switchingService\r\n * @description\r\n *\r\n * Switching service\r\n *\r\n * @requires ntb-fe.factory:switching\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(switchingService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function switchingService($q, $filter, switching) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:switchingService\r\n * @name ntb-fe.service:switchingService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:switchingService\r\n * @name service.getSwitchingDates\r\n * @description\r\n * Get a list of valid switching dates based on switch type ('full' | 'partial')\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.getSwitchingDates = function(switchType) {\r\n return $q(function(resolve, reject) {\r\n switching.getSwitchingDates({ switchType: switchType }, function(response) {\r\n resolve(response.switchingDates);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:switchingService\r\n * @name service.validateAccount\r\n * @description\r\n * Validate the user account to ensure it is able to switch\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.validateAccount = function(userData) {\r\n return $q(function(resolve, reject) {\r\n switching.validateAccount($filter('switchingValidation')(userData), function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:switchingService\r\n * @name service.submitContactDetails\r\n * @description\r\n * Submit the userData Object via the contact factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.submitSwitchingDetails = function(userData) {\r\n return $q(function(resolve, reject) {\r\n switching.save($filter('switchingDataFilter')(userData), function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('switchingService', switchingService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:timeoutService\r\n * @description\r\n *\r\n * Contact details service\r\n *\r\n * @requires ntb-fe.service:dataModelService\r\n * @requires ntb-fe.constant:defaults\r\n * @requires ntb-fe.factory:session\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(timeoutService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function timeoutService($log, $q, $rootScope, $timeout, dataModelService, defaults, session) {\r\n\r\n /* jshint validthis: true */\r\n var service = this,\r\n /* jshint validthis: false */\r\n mainTimer,\r\n expiredTimer;\r\n\r\n // Use init default\r\n service.serverExpiry = defaults.APPLICATION_TIMEOUT;\r\n\r\n // In session flag\r\n service.isInSession = false;\r\n\r\n /**\r\n * @private\r\n */\r\n function resetTimers() {\r\n // $log.debug('timeoutService: Reset timers');\r\n $timeout.cancel(mainTimer);\r\n $timeout.cancel(expiredTimer);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function expiryTriggered() {\r\n\r\n dataModelService.clearDataModel();\r\n\r\n // $log.debug('timeoutService: Expiry triggered.');\r\n resetTimers();\r\n $rootScope.$broadcast('applicationTimeoutNotifier', { type: 'fatal' });\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function warningTriggered() {\r\n // $log.info('timeoutService: Warning triggered.');\r\n resetTimers();\r\n $rootScope.$broadcast('applicationTimeoutNotifier', { type: 'warning' });\r\n expiredTimer = $timeout(expiryTriggered, (defaults.APPLICATION_TIMEOUT_BUFFER * 60 * 1000));\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:timeoutService\r\n * @name service.endSession\r\n * @description\r\n * End the current session\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from session factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.endSession = function() {\r\n\r\n service.isInSession = false;\r\n\r\n return $q(function(resolve, reject) {\r\n session.logout(null, function() {\r\n resolve();\r\n }, function() {\r\n reject();\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:timeoutService\r\n * @name service.cancelTimeout\r\n * @description\r\n * Reset all timers\r\n *\r\n * @type {Object}\r\n */\r\n service.cancelTimeout = function() {\r\n resetTimers();\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:timeoutService\r\n * @name service.resetTimer\r\n * @description\r\n * Reset the timers and ping the BE to keep alive\r\n *\r\n * @type {Object}\r\n */\r\n service.resetTimer = function() {\r\n\r\n // $log.info('timeoutService: ', mainTimer ? 'Resetting timers.' : 'Starting timers at ' + service.serverExpiry + ' minutes.');\r\n\r\n return $q(function(resolve, reject) {\r\n\r\n session.keepAlive({ time: new Date().getTime() }, function(response) {\r\n\r\n // Get server timeout and minus 1.\r\n service.serverExpiry = parseInt(response.sessionTimeoutMinutes, 10);\r\n\r\n resetTimers();\r\n\r\n service.isInSession = true;\r\n\r\n $log.info('timeoutService: Reset warning timer for', service.serverExpiry - defaults.APPLICATION_TIMEOUT_BUFFER, 'minutes.');\r\n\r\n mainTimer = $timeout(warningTriggered, (service.serverExpiry * 60 * 1000) - (defaults.APPLICATION_TIMEOUT_BUFFER * 60 * 1000));\r\n\r\n resolve();\r\n\r\n }, function(error) {\r\n $log.error('timeoutService: keepAlive error:', error);\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('timeoutService', timeoutService);\r\n\r\n})(window.angular);","(function(angular) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc service\r\n * @name ntb-fe.service:unsubscribeService\r\n * @description\r\n *\r\n * Unsubscribe service\r\n *\r\n * @requires ntb-fe.factory:unsubscribe\r\n *\r\n * @example\r\n *\r\n *
\r\n     *     function SomeController(unsubscribeService) {\r\n     *\r\n     *     }\r\n     * 
\r\n *\r\n * @ngInject\r\n */\r\n function unsubscribeService($q, unsubscribe) {\r\n\r\n /**\r\n * @ngdoc property\r\n * @propertyOf ntb-fe.service:unsubscribeService\r\n * @name ntb-fe.service:unsubscribeService.service\r\n * @description\r\n * Verbose *this* to expose as service\r\n *\r\n * @type {Object}\r\n */\r\n /* jshint validthis: true */\r\n var service = this;\r\n /* jshint validthis: false */\r\n\r\n /**\r\n * @ngdoc method\r\n * @methodOf ntb-fe.service:unsubscribeService\r\n * @name service.callUnsubscribe\r\n * @description\r\n * Unsubscribe from emails via the unsubscribe factory and handle the response\r\n *\r\n * Uses *$q* to return a promise which is resolved or rejected based on response from registration factory.\r\n *\r\n * @type {Object}\r\n */\r\n service.callUnsubscribe = function(uuid) {\r\n return $q(function(resolve, reject) {\r\n unsubscribe.save({ uuid: uuid }, function(response) {\r\n resolve(response);\r\n }, function(error) {\r\n reject(error);\r\n });\r\n });\r\n };\r\n }\r\n\r\n angular\r\n .module('ntb-fe')\r\n .service('unsubscribeService', unsubscribeService);\r\n\r\n})(window.angular);","(function (angular)\r\n{\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @ngdoc object\r\n * @name ntb-fe.value:userData\r\n * @description\r\n * User data model Value Object.\r\n *\r\n * Holds ALL user data AND is used as MODEL.\r\n *\r\n * @example\r\n * *userData* is injectable as Value Object\r\n *
\r\n     *     function myService(userData) {\r\n     *\r\n     *     }\r\n     * 
\r\n */\r\n var userData = {\r\n isActive: false,\r\n registration: {\r\n uid: 'registration',\r\n msn: void 0,\r\n userChoices: {\r\n accountType: void 0,\r\n jointConsent: false\r\n },\r\n primary: emptyRegistrationApplicant (),\r\n secondary: emptyRegistrationApplicant (),\r\n interactions: {\r\n primary: {\r\n previousName: void 0,\r\n residence: void 0\r\n },\r\n secondary: {\r\n previousName: void 0,\r\n residence: void 0\r\n }\r\n }\r\n },\r\n contactDetails: {\r\n uid: 'contactDetails',\r\n primary: {\r\n residentialStatus: void 0,\r\n currentAddress: {\r\n address: emptyAddress (),\r\n yearsAtAddress: void 0,\r\n monthsAtAddress: void 0\r\n },\r\n previousAddress: {\r\n address: emptyAddress ()\r\n },\r\n mobileNumber: void 0,\r\n phoneNumber: void 0,\r\n marketingOptions: emptyMarketingOptions ()\r\n },\r\n secondary: {\r\n currentAddress: {\r\n address: emptyAddress (),\r\n yearsAtAddress: void 0,\r\n monthsAtAddress: void 0\r\n },\r\n previousAddress: {\r\n address: emptyAddress ()\r\n },\r\n mobileNumber: void 0,\r\n phoneNumber: void 0,\r\n marketingOptions: emptyMarketingOptions ()\r\n },\r\n interactions: {\r\n primary: {\r\n currentAddress: contactDetailsInteractions (),\r\n previousAddress: contactDetailsInteractions ()\r\n },\r\n secondary: {\r\n currentAddress: contactDetailsInteractions (),\r\n previousAddress: contactDetailsInteractions ()\r\n },\r\n sameAddressAsPrimary: void 0\r\n }\r\n },\r\n personalDetails: {\r\n uid: 'personalDetails',\r\n primary: emptyPersonalDetailsApplicant (),\r\n secondary: emptyPersonalDetailsApplicant (),\r\n interactions: {\r\n primary: emptyPersonalInteractionsApplicant (),\r\n secondary: emptyPersonalInteractionsApplicant ()\r\n }\r\n },\r\n employment: {\r\n uid: 'employment',\r\n primary: {\r\n status: void 0,\r\n jobTitle: void 0,\r\n timeAtEmployer: {\r\n months: void 0,\r\n years: void 0\r\n },\r\n seBusinessNature: void 0,\r\n employersName: void 0\r\n },\r\n secondary: {\r\n status: void 0\r\n },\r\n interactions: {\r\n primary: {\r\n timeAtEmployer: {\r\n month: void 0,\r\n year: void 0\r\n }\r\n }\r\n }\r\n },\r\n income: {\r\n uid: 'income',\r\n overdraft: void 0,\r\n overdraftPreviousValue: void 0,\r\n primary: {\r\n incomeBeforeTax: void 0,\r\n incomeAfterTax: void 0,\r\n retirementAge: void 0\r\n },\r\n secondary: {\r\n incomeBeforeTax: void 0,\r\n incomeAfterTax: void 0,\r\n retirementAge: void 0\r\n },\r\n interactions: {\r\n primary: emptyIncomeInteractions(),\r\n secondary: emptyIncomeInteractions()\r\n }\r\n },\r\n overdraft: {\r\n uid: 'overdraft',\r\n preContract: false,\r\n overdraftAmount: 100,\r\n primary: {\r\n\r\n },\r\n secondary: {\r\n\r\n },\r\n interactions: {\r\n primary: emptyOverdraftInteractions(),\r\n secondary: emptyOverdraftInteractions()\r\n }\r\n },\r\n bankDetails: {\r\n uid: 'bankDetails',\r\n accountNumber: void 0,\r\n rollNumber: void 0,\r\n sortcode: void 0,\r\n timeAccountHeld: {\r\n months: void 0,\r\n years: void 0\r\n },\r\n interactions: {\r\n existingCurrentAccount: void 0,\r\n accountOpened: {\r\n month: void 0,\r\n year: void 0\r\n }\r\n }\r\n },\r\n switching: {\r\n uid: 'switching',\r\n switching: void 0,\r\n fullSwitch: void 0,\r\n transferDate: void 0,\r\n partialAllPayments: void 0,\r\n partialSomePayments: void 0,\r\n debitCard: {\r\n primary: {\r\n pan: '',\r\n expiry: ''\r\n },\r\n secondary: {\r\n pan: '',\r\n expiry: ''\r\n }\r\n },\r\n accountToSwitch: {\r\n jointAccount: void 0,\r\n primaryApplicantAccount: void 0,\r\n secondaryApplicantAccount: void 0,\r\n accountNumber: void 0,\r\n sortcode: void 0\r\n },\r\n interactions: {\r\n switch: void 0,\r\n confirmAccount: void 0,\r\n acceptPartialOption: void 0,\r\n acceptSwitchDate: void 0,\r\n partialSwitchTransfer: void 0,\r\n agreement: void 0,\r\n primary: {\r\n existingDebitCard: void 0\r\n },\r\n secondary: {\r\n existingDebitCard: void 0\r\n }\r\n }\r\n },\r\n memorableWord: {\r\n uid: 'memorableWord',\r\n fscs: false,\r\n acceptTerms: false,\r\n primary: {\r\n word: void 0\r\n },\r\n secondary: {\r\n word: void 0\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function emptyIncomeInteractions() {\r\n return {\r\n incomeBeforeTax: void 0,\r\n incomeBeforeTaxInterval: 'Yearly',\r\n incomeAfterTax: void 0,\r\n incomeAfterTaxInterval: 'Monthly',\r\n monthlyIncome: 0\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function emptyOverdraftInteractions() {\r\n return {\r\n mortgageOrRent: void 0,\r\n mortgageOrRentInterval: 'Monthly',\r\n councilTax: void 0,\r\n councilTaxInterval: 'Monthly',\r\n utilityBills: void 0,\r\n utilityBillsInterval: 'Monthly',\r\n tvAndBroadband: void 0,\r\n tvAndBroadbandInterval: 'Monthly',\r\n mobilePhone: void 0,\r\n mobilePhoneInterval: 'Monthly',\r\n livingCosts: void 0,\r\n livingCostsInterval: 'Monthly'\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function emptyPersonalDetailsApplicant ()\r\n {\r\n return {\r\n gender: void 0,\r\n maritalStatus: void 0,\r\n dependents: void 0,\r\n nationality: void 0,\r\n taxDetails: {\r\n taxResOutsideUKOrUSCit: void 0,\r\n usCitizen: void 0,\r\n usTaxResident: void 0,\r\n islandsTaxResident: void 0,\r\n usTaxNumber: '',\r\n niNumber: '',\r\n islandsCountry: '',\r\n otherCountry: void 0,\r\n additionalCountry: ''\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function emptyPersonalInteractionsApplicant ()\r\n {\r\n return {\r\n dependents: void 0,\r\n otherCountry: void 0,\r\n additionalCountry: void 0\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function emptyRegistrationApplicant ()\r\n {\r\n return {\r\n title: void 0,\r\n firstName: void 0,\r\n middleName: void 0,\r\n surname: void 0,\r\n emailAddress: void 0,\r\n dateOfBirth: {\r\n day: void 0,\r\n month: void 0,\r\n year: void 0\r\n },\r\n previousNames: []\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function emptyMarketingOptions ()\r\n {\r\n return {\r\n email: void 0,\r\n post: void 0,\r\n sms: void 0,\r\n telephone: void 0,\r\n thirdParty: void 0\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function emptyAddress ()\r\n {\r\n return {\r\n address1: '',\r\n address2: '',\r\n address3: '',\r\n address4: '',\r\n postcode: ''\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {Object}\r\n */\r\n function contactDetailsInteractions ()\r\n {\r\n return {\r\n postcode: void 0,\r\n manualEntry: false,\r\n addressStartYear: void 0,\r\n addressStartMonth: void 0\r\n };\r\n }\r\n\r\n angular\r\n .module ('ntb-fe')\r\n .value ('userData', userData);\r\n\r\n}) (window.angular);\r\n","(function(){'use strict';'use strict'; function run($templateCache) {$templateCache.put('date-field-group.template.html','
\\r\\n {[{::label}]}\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n /\\r\\n \\r\\n \\r\\n \\r\\n /\\r\\n \\r\\n \\r\\n
\\r\\n
');\n$templateCache.put('timeout-notification.template.html','
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n

Application timeout

\\r\\n\\r\\n

Your application has been inactive for minutes\\r\\n
\\r\\n and will timeout in .

\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n

Application locked

\\r\\n\\r\\n

For your security we have saved your application and ended the session.

\\r\\n\\r\\n

 

\\r\\n\\r\\n

You can request a link to resume via email. We will use the email address that was saved in your application.

\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
');} run.$inject = ['$templateCache']; angular.module('ntb-fe').run(run);})();"]}