{"version":3,"sources":["scripts/app.js"],"names":["UsagechartmonthlyController","$state","genericService","$filter","commonService","$mdDialog","$rootScope","authService","$window","showDateRangeError","alert","clickOutsideToClose","onComplete","$broadcast","onRemoving","title","textContent","ariaLabel","ok","multiple","show","showNoSelectedServiceError","validateMaxInquire","start","end","diff","Math","abs","dataChart","data","key","bar","values","dataArray","map","series","d","x","y","filterServices","service","Type","filterServicesForGraphs","services","filteredServices","i","length","Description","toUpperCase","push","flip","vm","flipped","CheckIsPortalEnabled","document","getElementById","serviceController","usageController","this","waterUOM","AccountService","accountServiceSelected","calendarEvent","memberSep","chart","options","type","height","margin","top","right","bottom","left","bars","forceY","forceX","bars2","color","xAxis","axisLabel","rotateLabels","tickFormat","dx","x2Axis","d3","time","format","Date","showMaxMin","y1Axis","axisLabelDistance","y2Axis","y3Axis","y4Axis","focusEnable","showLegend","useInteractiveGuideline","tooltip","contentGenerator","e","graph","UsageRequest","SearchDetails","TypeService","api","chartHeight","dateLocale","dateLocaleByMonth","dtOptions","dom","paging","autoWidth","responsive","scroller","processing","info","hideme","isClicked","isSingleService","maxDate","getFullYear","getMonth","MemberNo","params","id","ModUsageRequest","Model","RoleType","adminAuthentication","roleType","AdminUsername","userName","progress","activated","searchServices","statusMessage","ID","IdType","StartDate","EndDate","Device","DeviceType","HardwareId","IsPPM","IsCostEnable","closeChart","updateWithData","getSelectedServiceText","undefined","getServiceDetails","rootscopeLoading","get","then","pl","Services","selectServiceFlip","select","style","errorPl","handleError","ReloadChart","enddate","itemSelected","MemberSep","angular","copy","setDate","getDate","FrecuencyMode","post","response","statusIdField","parseFloat","totalEnergyField","exist","some","item","totalEnergyGalField","totalEnergyFT3Field","$inject","module","controller","UsagechartdailyController","dateLocaleByDay","Intl","DateTimeFormat","resolvedOptions","timeZone","includes","dailyTimeStanpField","UsagechartintervalController","initializeChart","config","$stateProvider","$translatePartialLoaderProvider","msApiProvider","msNavigationServiceProvider","state","abstract","url","views","content@app","templateUrl","bodyClass","authorizedRoles","CID","resolve","EntitiesValidators","ProfileContext","EntityValidators","GetEntityValidators","CCValidators","BankDraftContext","getValidators","ECValidators","checkSmartAppConfig","loadSmartAppConfig","PaymentContext","getPaymentValidators","addPart","register","PaymentReceiptController","detail","extend","closeDialog","cancel","PaymentProfileController","PaymentDetailService","$timeout","$element","$scope","BlurInput","elementId","element","isAdmin","value","disabled","GetSaveProfileLabel","action","hasPaymentProfile","paymentType","fetchProfile","PaymentType","label","EditInput","maskedInput","onfocus","focus","saveProfileEnabled","Parameters","ThirdParameters","THIRDPARM_3","PaymentDetailData","getPaymentDetail","setProfileDetail","ProfileDetail","setPaymentProfile","paymentContext","paymentAmount","AccountServicesObject","totalPaymentAmount","confirmDelete","confirm","GetNumberCCType","typeName","typeNumber","GetNameCCType","baseClass","tempCardProfile","dateLocaleExpDate","NameSuffixes","getCCValidation","getECValidation","ECheckProfile","CreditCardProfile","AccountServices","DeviceDetails","ModFetchProfile","setProfile","Prof","RoutingNumberPattern","regexp","test","blurInput","getSaveProfileLabel","editInput","GetNameSuffixes","GetLookUpList","PopulateProfile","MaxPaymentAmount","AdditionalSettings","MaxCreditCardPayment","MaxECheckPayment","BankAccountNumber","CreditCardInfo","hasChanges","ExpirationDate","CCExpYear","toActualYear","CCExpMonth","ZipCode","CCZipCode","replace","ZipCodeExtension","substr","CardType","SaveProfile","ECheckZipCode","AccountName","nullToBlank","FirstName","MiddleName","LastName","Suffix","$","trigger","errorpl","hide","UpdateBankAccountName","GetCCTypeDesc","cctype","result","checkHasChanges","tempExpMonth","toString","padLeft","tempExpYear","toTwoDigitsYear","cardExpMonth","cardExpYear","CardName","CCNumber","UpdateProfile","pType","isValid","CreditCardDetails","Number","Name","ExpirationMonth","ExpirationYear","Address1","CCAddress1","Address2","City","CCCity","State","CCState","CVV","CCVerifCode","deleteProfile","continueDeleteProfile","console","log","validateErrorForm","editableForm","$setSubmitted","equals","$error","factory","PaymentProfileData","String","prototype","toMask","slice","len","charac","Array","join","actualYear","dataYear","substring","setPaymentDetail","obj","getPaymentProfile","PaymentDetailController","$mdMedia","paymentData","$interval","calculateIEPad","multiplier","__this","ieCss","CloseDialog","LoadForm","FourthParameters","FOURTHPARM_62","PastDueOn","CalculatePPMPayment","CalculateConvFee","balanceWidth","getNumericColumnWidth","pastDueWidth","total","forEach","PPMPaymentNeeded","SubTotal","PaymentDetails","totalAmount","AccountDetail","getAccountDetails","loadConvenienceFee","deviceDetails","ReCalculateConvFee","isPaymentProcessing","model","paymentDetailLoading","forLoading","isCalculating","PayBill","accountNumber","getProfileData","RoutingNumber","showAlert","StopPaymentProcessState","showValidation","showConfirm","convenienceFee","toFixed","objData","Accounts","getAccounts","getProfileDetail","ECheckDetails","paymentLabel","payBill","PaymentResult","ApprovalCode","showReceipt","Status","messages","ev","parent","body","targetEvent","AccountDetails","isByService","locals","fullscreen","customFullscreen","validateKey","objectId","keyCode","isValidProfile","getSelectedService","BudgetLevelized","showNote","CCParameters","profileURL","loadForm","calculateConvFee","reCalculateConvFee","applyChange","PaymentAmountChanged","UsagechartsController","$mdSidenav","toggleSidenav","sidenavId","toggle","switchItem","selectedItem","menuItems","UsageController","DTOptionsBuilder","$sce","$log","LoadRecordsBills","promiseGet_bills","BillHistory","sBillMoYr","BillDate","ConstructDate","eBillMoYr","error","CheckPPMStatus","promiseGet","BillMoYr","curYear","alertDialog","content","querySelector","CheckEDelinquentEnabled","smartAppConfig","ConfigId","EDelinquentEnabled","Value","curMon","getMaxDate","ReloadRecords","LoadRecordsByDateRangeBills","startDate","endDate","startYear","sYear","dateFrom","endYear","eYear","dateTo","dateToday","yearToday","tYear","dateNow","order","columnDefs","targets","responsivePriority","ViewPDF","billdate","suffix","isLoading","parseInt","MbrSep","pdfResult","successFlag","DisplayMessage","pdfBytes","byteCharacters","atob","byteNumbers","charCodeAt","byteArray","Uint8Array","actualPdfFile","Blob","fileURL","URL","createObjectURL","window","navigator","msSaveOrOpenBlob","open","trustAsResourceUrl","ServicesController","$http","SetSmartAppConfig","ProfileStat","BillHistStat","PaymentHistStat","UsageGraphStat","EbillEnabled","AlertsEnabled","CCDraftsEnabled","BankDraftsEnabled","DepositsEnabled","LevelizedBillEnabled","BudgetBillEnabled","ccDraft","go","bankDraft","getSettings","Response","ShowConvCCFlag","ShowConvECFlag","promiseGetConfig","GetSettings","SelectedAccount","accountsList","hasAlert","$on","event","tabIndex","ServiceDetailsController","$cacheFactory","confirmMessage","OkButton","text","command","LoadRecordsServ","authentication","isCalled","httpCache","remove","serviceBase","Service","BillCode","ppmLabel","ppmMinPayment","RephrasePPMPaymentLabel","language","emptyTable","roundupBill","RoundUpBill","roundupBillContent","param98","COOPPARM_98","status","RoundupBillingProcess","roundupOptOutMessage","PayType","current","reload","roundupOptInMessage","newLabel","roundupInformation","zeroRecords","displayMessage","roundupBillingProcess","$httpProvider","defaults","headers","ProfileController","aaNotify","CancelForm","Form","_Form","$aaFormExtensions","$reset","resp","$editMode","stateCounter","saveCounter","errorClose","CheckNotify","CheckSave","CheckState","CloseNotify","CheckStrNo","street","POBoxExist","EditForm","form","ErrorList","name","innerText","EvaluateParam35","param35","InternetParameters","INT_COOPPARM_35","FormatPhone","phoneNo","newValue","FormatValues","homePhone","formatPhone","businessPhone","OtherPhoneNumber","cellPhoneNumber","pagerNumber","faxNumber","zip","formatZipCode","dirpref","getAbbrev","dirsuf","FormatZipCode","zipCode","GetAbbreviation","abbrev","fieldId","firstChild","nextSibling","GetKeyCode","$event","GetMemberSep","GetAccountProfile","formatValues","$resetChanged","p","Abbreviation","stateDataList","streetDataList","nameSufDataList","dirCardinalsDataList","ReformatPhone","input","digits","ReformatZipCode","area","route","RemoveMaskAttributes","validations","mask","SaveForm","trimValues","ModifiedModel","SaveAccountProfile","toLowerCase","SetFocus","ElementID","elemId","TrimValues","Validators","isSave","initForm","saveChanges","cancelForm","editForm","closeNotify","checkNotify","checkState","checkSave","checkStrNo","errorList","getKeyCode","reformatPhone","reformatZipCode","removeMask","setFocus","$watchGroup","$resource","Find","AccountsProfilesURL","Save","put","entityName","jsonModelName","EntitiesValidatorsURL","lookUpType","PPMHistoryController","AlertDialog","Filter","lowestDate","GetMoYr","highestDate","setMonth","filteredPPMAcctHistory","PPMAcctHistory","itemDate","SystemDate","splice","curDate","ReformatDate","date","day","month","year","mo","yr","LoadRecordsPPMAcctHistory","InvertPPMValues","PPMAccountHistory","isCollapsed","j","Transactions","transaction","PPMAccount","PaymentNotice","eDateMoYr","ReloadPPMRecords","accountHistory","Charges","Payment","Adjustment","Reconciliation","Balance","ShowDetails","detailsDialog","dtOption","dtOptionsDetails","showHelp","sortClass","sortList","toggleDetails","ShowHelp","htmlContent","SortClass","column","object","isModalShown","sort2","sort","className","Column","Reverse","SortList","ToggleDetails","sortable","selectedTransactions","windowWidth","innerWidth","filter","showDetails","PPMServiceHistoryController","UsageChartController","updateChart","PaymentHistoryController","LoadRecords","PaymentHistory","TransNbr","displayTrans","TransAmt","Amount","amountWidth","LoadRecordsByDateRange","ordering","BankDraftController","$stateParams","FirstMemberSep","CheckValidStatus","ValidStatus","CheckPortalBusinessRules","Message","PortalBusinessRules","draftURL","MonthsVerify","PBRules","PortalBusinessRulesList","NotQualifiedMessage","ModPBRules","promisePost","PassedBusinessRules","LoadExistingCCDraft","LoadExistingBankDraft","replaceAll","DraftCode","PrintCode","LoadData","HasExisting","search","split","Delete","Submit","SubmitBankDraft","Edit","reset","CCNumberMasked","BankName","mode","CCDetails","Acct","DueDate","CCDraftDetails","Account","Mode","removeAll","ModCCDraftDetails","GetBankName","ECDetails","AccountType","GetValidators","isForAuth","PaymentController","PortalSettings","PortalParameters","loadPaymentService","PPMPaymentLabel","defineObject","dueDate","calculateTotalAmount","FOURTHPARM_38","showChecks","EcheckStat","CreditCardStat","showPaymentScreen","CheckCreditBalance","balanceHasMillion","pastDueHasMillion","paymentDialog","GetCheckCode","checkCode","simpleAlertDialog","message","buttonLabel","answer","SelectedIndex","CalculateTotalPPMPaymentNeeded","accountServices","membserSep","checkCreditBalance","setCCValidation","setECValidation","paymentProgress","isOpen","account","totalPPMPaymentNeeded","isBelowThreshold","SmartAppConfig","calculateTotalPPMPaymentNeeded","rephrasePPMPaymentLabel","DefineObject","source","schema","HideChecks","ShowChecks","toggleAll","_this","index","array","checkStatus","allServices","CalculateTotalAmount","cameFromToggle","AmountByAccount","AmountByAccountDisplay","PastDueByAccount","PastDueByAccountDisplay","TotalAmount","TotalAmountDisplay","Selected","PastDue","totalAmountDisplay","totalPastDue","totalPastDueDisplay","GetSelectedService","memberNo","hideChecks","GetAccountDetails","GetAccounts","LoadConvenienceFee","PaymentAmount","AccountStatus","PaymentInput","CustomerID","CompanyName","EMail","ModPaymentInput","paymentController","DeviceDetail","ConvFee","ModConvFee","LoadConvFee","ConvenienceFee","PayAmount","GetPaymentValidators","GetSmartAppConfig","DeleteProfile","display","getSmartAppConfig","CCValidation","ECValidation","Decrypt","Encrypt","DepositsController","serviceUrl","serviceUrlExt","depositDetails","init","consumerDepositWidth","otherDepositWidth","depositDetailsExt","dtInstance","width","filterable","DelinquentController","LoadBillingPreference","ENotificationDetails","Email1_c","Email1","Email2_c","Email2","BindBillingMethod","Code2","BillingPreferenceDesc","IsMatch","IsMatch2","ModENotificationDetails","BillMethod","desc","preventUnsavedPrompt","cleanUpFunc","SaveBillingPreference","theForm","$valid","NotificationType","promisePut","Result","CheckIfMatch","email","email_c","emailNo","ContactUsController","LoadSmartAppSettings","configserviceController","LoadOffices","showProgress","hideProgress","Offices","SelectedOffice","Telephone","FormatPhoneNumber","template","BillPreferenceController","Code1","SubscriptionDetailsController","subscriptionDetails","cid","getSubscriptionDetails","gotoAlertDetails","AlertsController","GetCriterias","alerts","temp","ListItems","Listitem","alert01","AlertId","selectedCriteria1","Criteria","alert12","selectedCriteria6","IsSubscriptionDetailsChanged","isChanged","oldSubscriptionDetails","Email","Mobile","ProviderId","PadLeftAlertIds","RemovePadLeftAlertIds","removePadLeft","SetCriterias","providerDetails","selectedMobileProvider","providerID","isNewEmail","enableFlag","isTextSelected","isEmailSelected","textsSelected","EmailsSelected","hideConfirmEmail","mobilePattern","emailPattern","subsDetails","JSON","parse","PopulateAlertDetails","LowBalThreshold","EnableFlag","providersList","addModifyAlertDetails","requestUrl","confirmEmail","updateAlertType","isEmail","alertType","AlertType","textFlag","charAt","emailFlag","newAlertType","onTextSelected","onEmailSelected","updateAlertDetails","isNumberKey","evt","theEvent","which","fromCharCode","regex","returnValue","preventDefault","BudgetLevelizedController","LevelizedEnabled","CheckIfAllServicesAreEnrolled","nbrOfServices","nbrOfActiveServices","nbrOfActiveServicesEnrolled","nbrOfActiveServicesNotEnrolled","countEn","countEx","countIn","BillingType","EnrolledServices","IsCollapsed","ExcludedActiveServices","ExcludedInactiveServices","HasExcludedService","Enrolled","NoActiveService","confirmRemove","BillTypeDesc","InitData","ReviewMonth","trim","COOPPARM_150","code","Code","BeginDate","AnnTranFlag","ModBudgetLevelized","Remove","AccountsController","AccountIndexing","accountList","count","PPM","gotoProductDetail","accountName","serviceAddress","isPPM","mbrNo","accountStatus","address","showAdminToolbar","Username","CustomerIDNumber","CId","completeAccounts","Count","initComplete","searchBox","find","on","target","draw","FilterStatus","searchFields","selectedSearchField","CustomizePortalController","customerListMethod","testing","searchKey","testCustomers","balance","customers","searchCustomers","_selectedSearchField","searchUrl","encodeURIComponent","simulateAccount","CustomerListController","$anchorScroll","$location","ChangeEmailConfirmation","user","UserName","NewEmailConfirmed","EmailConfirmed","dialogContent","GetDialogContent","confirmDialog","changeEmailConfirmation","records","indexOf","CheckScrollbar","divHeight","clientHeight","winHeight","hasScroll","DeleteUser","CustomerId","deleteUser","confirmButtonLabel","GetPages","totalpages","pages","accountTypes","customerSearchPattern","isLimited","selectedAccountType","titlePage","recordLengths","selectedPage","selectedRecordsLength","totalCount","getPortalAccounts","filterAccountType","setIsLimited","unshift","ceil","goTop","hash","setNavigationItems","ResetForm","ResetPage","pad","displayError","SearchOnKeyPress","unlockUser","DialogController","unlockAccount","ActionController","okDialog","err","goFirst","goLast","goNext","goPrevious","CustomerContext","$q","GetCustomerByAccountNo","acctNo","deferred","defer","promise","controllerMethod","res","reject","ChatTabController","msApi","toggleChat","contact","chatActive","replyMessage","chat","scrollToBottomOfChat","reply","dialog","who","speed","chatDialog","animate","scrollTop","scrollHeight","request","contacts","MsWidgetController","isFlippable","toggleClass","isDefined","flippable","msWidgetDirective","restrict","scope","transclude","compile","tElement","addClass","iElement","iAttrs","MsWidgetCtrl","transcludeFn","clone","empty","append","msWidgetFrontDirective","require","flipWidget","msWidgetBackDirective","directive","MsStepperController","registerMainForm","mainForm","registerStep","step","stepNumber","steps","stepTitle","a","b","setupSteps","setCurrentStep","currentStepNumber","resetForm","$setPristine","$setUntouched","gotoFirstStep","isStepNumberValid","gotoStep","isStepHidden","gotoPreviousStep","s","gotoNextStep","gotoLastStep","isFirstStep","isLastStep","isStepCurrent","isStepDisabled","isStepValid","isStepOptional","optionalStep","hideStep","filterHiddenStep","isUndefined","isFormValid","currentStep","msStepperDirective","priority","bindToController","ctrls","FormCtrl","MsStepperCtrl","msStepperStepDirective","MsTimelineController","setScrollEl","scrollEl","getScrollEl","msTimelineDirective","msTimeline","loadMore","MsTimelineCtrl","onScroll","threshold","loadMoreEl","position","unregisterOnScroll","removeClass","registerOnScroll","off","msTimelineItemDirective","args","cardEl","testForImage","itemLoaded","testForVisibility","imgEl","itemInViewport","itemReadyWatcher","$watch","old","msSidenavHelperDirective","link","MdSidenavCtrl","isLockedOpen","msSplashScreenDirective","$animate","splashScreenRemoveEvent","leave","MsShortcutsController","$cookies","$document","msNavigationService","loadShortcuts","shortcuts","results","resultsLoading","populateResults","flatNavigation","getFlatNavigation","uisref","query","lowercase","hasShortcut","_id","selectedResultIndex","fromJson","icon","weight","children","_path","toJson","saveShortcuts","success","addShortcut","removeShortcut","handleResultClick","absorbEvent","handleKeydown","keys","ensureSelectedResultIsVisible","handleMouseenter","ignoreMouseEvents","temporarilyIgnoreMouseEvents","mouseEventIgnoreTimeout","resultsEl","selectedItemEl","outerHeight","queryOptions","debounce","sortableOptions","ghostClass","forceFallback","fallbackClass","onSort","msShortcutsDirective","MsSearchBarController","collapsed","onSearchEvaluated","$parent","$eval","onSearch","isArray","isPromise","isNull","expand","onExpand","isFunction","collapse","onCollapse","onResultClick","msSearchBarDirective","inputEl","bodyEl","msScrollConfigProvider","configuration","defaultConfiguration","wheelSpeed","wheelPropagation","swipePropagation","minScrollbarLength","maxScrollbarLength","useBothWheelAxes","useKeyboard","suppressScrollX","suppressScrollY","scrollXMarginOffset","scrollYMarginOffset","stopPropagationOnClick","$get","getConfig","msScrollDirective","msScrollConfig","msUtils","fuseConfig","isMobile","updateScrollbar","PerfectScrollbar","update","msScroll","initialize","prop","destroy","provider","msResponsiveTableDirective","wrapper","after","msRandomClassDirective","msRandomClass","randomClass","floor","random","saveItem","path","isString","parts","_findOrCreateParent","updateItem","_getUiSref","isNumber","deleteItem","navigation","sortByWeight","_byWeight","pop","createParent","stateParams","isObject","injector","clearNavigation","navigationScope","setActiveItem","node","activeItem","getActiveItem","getNavigation","root","_flattenNavigation","setNavigationScope","setFolded","folded","getFolded","setFoldedOpen","foldedOpen","getFoldedOpen","toggleFolded","flatNav","navToPush","concat","MsNavigationController","$transitions","toggleHorizontalMobileMenu","msNavigationDirective","setFoldExpander","$emit","removeFoldCollapser","foldExpanderEl","onFoldExpanderHover","setFoldCollapser","foldCollapserEl","onFoldCollapserHover","sidenav","onStart","transition","close","MsNavigationNodeController","hasChildren","group","collapsable","$evalAsync","givenPathParts","activePathParts","onSuccess","toggleCollapsed","collapseEl","offsetHeight","animateHeightClass","css","expandEl","visibility","getClass","isHidden","hidden","goToState","isActive","stateName","msNavigationNodeDirective","MsNavigationNodeCtrl","msNavigationItemDirective","msNavigationHorizontalDirective","MsNavigationHorizontalNodeController","$transition","msNavigationHorizontalNodeDirective","MsNavigationHorizontalNodeCtrl","msNavigationHorizontalItemDirective","onClick","msInfoBarDirective","removeInfoBar","$destroy","msMasonryController","defaultOpts","watchContainerResize","waitImagesLoaded","callback","imagesLoaded","imgLoad","container","oldValue","reLayout","containerPos","getBoundingClientRect","updateColumnOptions","items","referenceArr","apply","columnCount","xPos","yPos","columnWidth","refTop","min","round","transform","reLayoutTimeout","reLayoutDebounce","md","sm","xs","msMasonry","attributes","pre","msMasonryItem","newVal","oldVal","msMaterialColorPickerController","$mdColorPalette","$mdMenu","fuseGenerator","activateHueSelection","palette","hues","selectedPalette","selectedHues","selectColor","hue","updateSelectedColor","updateModel","removeColor","selectedColor","class","setSelectedColor","modelCtrl","$viewValue","msModelType","bgColorValue","rgba","palettes","fgColorValue","contrast","$selectedColor","$setViewValue","msMaterialColorPicker","ngModel","attrs","controllers","ctrl","el","nodeType","replaceWith","msNavFoldService","setFoldable","foldable","isNavFoldedOpen","toggleFold","openFolded","closeFolded","msNavIsFoldedDirective","isFoldedOpen","isFolded","fold","unfold","sidenavEl","openOverlay","closeOverlay","msNavIsFolded","MsNavController","isDisabled","disable","enable","setToggleItem","toggleItems","getLockedItems","lockedItems","setLockedItem","clearLockedItems","msNavDirective","$mdComponentRegistry","stateChangeSuccessEvent","when","msNavTitleDirective","msNavButtonDirective","msNavToggleDirective","tAttrs","attr","MsNavCtrl","isExpanded","elementToExpand","classes","expandAnimation","expanded","elementToCollapse","collapseAnimation","links","states","regExp","locked","lockedItem","currentState","shouldExpand","MsFormWizardController","registerForm","forms","previousStep","selectedIndex","nextStep","firstStep","lastStep","totalSteps","currentStepInvalid","$invalid","previousStepInvalid","formsIncomplete","msFormWizardDirective","msFormWizardFormDirective","formCtrl","MsFormWizardCtrl","msDatepickerFixConfigProvider","formatter","val","parser","offset","moment","utcOffset","add","msDatepickerFix","msDatepickerFixConfig","elem","$formatters","$parsers","$compile","userAgent","browsers","chrome","safari","firefox","keyAccepted","dynamicClass","controllerAs","msCardDirective","templatePath","card","cardTemplateLoaded","aaUiSelect2","aaUiListBox","listFunction","required","ngDisabled","aaValMsg","removeAttr","contents","matches","replacement","cryptoFieldDirective","$parse","tElem","maskedValue","inputType","inputName","$$parent","ClearValue","cryptoField","field","number","fieldKey","fieldIv","decrypted","encrypted","assign","bind","ele","$dirty","currentTarget","MsThemeOptionsController","fuseTheming","setActiveTheme","themeName","updateLayoutMode","layoutMode","updateLayoutStyle","layoutStyle","location","themes","msThemeOptions","panelOpen","toggleOptionsPanel","closeOptionsPanel","openOptionsPanel","backdropEl","fuseThemingProvider","setRegisteredPalettes","_registeredPalettes","registeredPalettes","setRegisteredThemes","_registeredThemes","registeredThemes","invoke","_$cookies","getRegisteredPalettes","getRegisteredThemes","list","warn","active","theme","setThemesList","themeList","$mdThemingProvider","fusePalettes","fuseThemes","customTheme","getObject","alwaysWatchTheme","definePalette","primaryPalette","primary","accentPalette","accent","warnPalette","backgroundPalette","background","_PALETTES","_THEMES","default","hue-1","hue-2","hue-3","pink","teal","constant","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastDarkColors","contrastStrongLightColors","fuseGeneratorService","generate","registeredTheme","colors","colorType","colorTypeName","levels","contrast1","contrast2","contrast3","contrast4","hue1","hue2","hue3","processAndStoreThemes","styleVars","colorTypes","colorLevelName","colorName","ucfirst","render","_themes","selectedTheme","cssTemplate","RegExp","Object","matched","headEl","styleEl","html","_contrastLevel","contrastLevel","applyContrast","contrastLevels","white","1","2","3","4","black","string","exists","detectBrowser","searchString","dataString","dataProp","versionSearchString","versionSearch","identity","subString","searchVersion","browserInfo","browserData","vendor","opera","osData","platform","browser","version","appVersion","os","guidGenerator","S4","mobileDetect","mobile","toggleInArray","MobileDetect","setBaseUrl","baseUrl","getBaseUrl","getApiObject","resource","paramDefaults","actions","parameters","actionParts","method","apiObject","resourceObject","apiResolverService","resourceParts","l","ret","prefix","_ref","isDate","getUTCFullYear","getUTCMonth","getUTCDate","_passesLuhnCheck","routing","checksumTotal","checksumMod","$set","elm","$validators","abaRoutingMinLength","abaRoutingMaxLength","abaRoutingInternal","abaRouting","abaRegex","run","editableOptions","$provide","decorator","$delegate","_Validate","_ValidateWatch","paymentsValidate","validateFn","ModelValue","$modelValue","validCardType","$setValidity","valid","arguments","Cards","Common","__indexOf","_luhnCheck","num","digit","odd","sum","reverse","_validators","cvc","ref","ref1","paymentsTypeModel","typeModel","call","fromType","cvcLength","clearCard","$card","fromNumber","luhn","currentTime","parseExpiry","currMonth","currYear","returnStatement","typeModelValid","isTypeValid","paymentsTypeModelValid","INT_COOPPARM_1","INT_COOPPARM_2","INT_COOPPARM_3","INT_COOPPARM_4","types","errstr","_formats","_hasTextSelected","$target","selection","createRange","_formatCardNumber","re","upperLength","meta","defaultInputFormat","inputFormat","_restrictCardNumber","_formatBackCardNumber","_getFormattedCardNumber","groups","global","match","exec","shift","_reFormatCardNumber","setTimeout","_parseCardNumber","_formatCVC","_restrictExpiry","_formatExpiry","_formatForwardExpiry","_formatForwardSlash","slash","_formatBackExpiry","_parseExpiry","expiry","_getFormattedExpiry","getCaretPosition","selectionStart","moveStart","setCaretPosition","pos","offsetWidth","setSelectionRange","createTextRange","range","moveEnd","NumberToString","oldModelValue","isNaN","newModelValue","newPos","StringToNumber","aaFormExtensions","funcName","onNavigateAwayStrategy","onNavigateAwayStrategies","rootFormScope","rootForm","$injector","beforeUnload","$changed","confirmationMessage","preventLeavingUnsaved","loginRequired","deRegisterEventListener","isLoggedIn","abort","loadingProgress","compareValue","notEqualToValue","check","isSame","$observe","$$rawModelValue","str","msRequireNumbers","msRequireSpecialChars","msRequireCapitalLetter","msRequireSmallLetter","hljsDirective","$interpolate","codeElement","lines","line","firstLineWhitespace","startingWhitespaceRegex","highlightedCode","hljs","highlight","lang","shouldInterpolate","contentParent","myLatlng","google","maps","LatLng","mapOptions","center","zoom","mapTypeId","MapTypeId","ROADMAP","Map","addDomListener","customerSearch","selectedField","$locale","toNumber","currencyStr","toNumberRegex","decimalSep","NUMBER_FORMATS","DECIMAL_SEP","filterFunc","newViewValue","compareField","validate","v","filterByTags","tags","filtered","every","tag","tagExists","itemTag","filterSingleByTags","itemTags","filterByPropIds","parameter","ids","filterByIds","toTrustedFilter","trustAsHtml","htmlToPlainTextFilter","nospaceFilter","humanizeDocFilter","doc","$1","altDate","now","fromNow","calendar","main@","content@app.pages_auth_login","content@app.LoginValidationError","Validator","getEntityValidators","ngAuthSettings","apiServiceBaseUri","tokenManagerServiceFactory","_getRefreshTokens","_deleteRefreshTokens","tokenid","deleteRefreshTokens","getRefreshTokens","cache","objId","possibleNull","withComma","getIndexOfPropertyValue","useProperty","$mdToast","getParameterByName","href","decodeURIComponent","convFeeController","GenerateKeys","phoneNumber","iv","Key","CryptoJS","enc","Utf8","IV","encryptedText","AES","encrypt","keySize","CBC","padding","Pkcs7","decrypt","customMessage","errors","error_description","error_uri","modelState","forceLoad","promiseGetLocations","utilityOffices","closeNotifier","loadAccountDetails","hideDelay","showPasswordHelp","viewPDF","mbrsep","eType","eData","serviceURL","cancelButtonLabel","formatDate","m","character","actualText","adjustment","minimumWidth","max","create","userRole","userId","localStorageService","Session","Idle","urlBase64Decode","output","getClaimsFromToken","authData","encoded","token","onDeviceReady","_getSettings","_getEntityValidators","_showFloatingLogin","loginDialogIsDisplayed","escapeToClose","authServiceFactory","requestSettings","_isAdmin","_customerUserName","_authentication","isAuth","useRefreshTokens","staySignedIn","_adminAuthentication","getAuthorizationData","_isLoggedIn","_saveRegistration","registration","_forgotPassword","_lockoutUser","loginData","Password","_changePassword","_changeUserName","_changeEmail","_resendEmail","_resetPassword","_forgotUserName","_validateUserCode","_resetPasswordEncode","_confirmEmailEncode","_login","clientId","clientSecret","Content-Type","set","access_token","refreshToken","refresh_token","encryptedUsername","previousUserName","watch","_setNavigationItems","_logOut","isLogOutPressed","customerUserName","unwatch","_fillAuthData","authUserData","customerId","_refreshToken","_unlockAccount","addEventListener","refreshed","isAuthenticated","isAuthorized","forCustomer","forAdmin","showMenu","promiseGetAcct","weigth","_changeEmailConfirmation","_checkIsPortalEnabled","task","isPortalEnabled","FOURTHPARM_54","isPortalAdmin","_deleteUser","saveRegistration","changePassword","changeUserName","changeEmail","resendEmail","resetPassword","forgotPassword","lockoutUser","login","logOut","fillAuthData","forgotUserName","validateUserCode","resetPasswordEncode","confirmEmailEncode","showFloatingLogin","authInterceptorServiceFactory","_request","Authorization","_responseError","rejection","_retryHttpRequest","resumeState","responseError","content@app.pages_auth_reset-user","ResetUserController","AUTH_EVENTS","ValidateUserCodeViewModel","UID","Purpose","ResetPasswordBindingModel","showForm","notification","ValidateCode","uid","ResetPassword","UserID","Token","ResetUserForm","$rollbackViewValue","fuseConfigProvider","fuseConfiguration","disableCustomScrollbars","disableMdInkRippleOnMobile","disableCustomScrollbarsOnMobile","configName","setConfig","configValue","content@app.pages_auth_reset-password","ResetPasswordController","content@app.pages_auth_register","SignUpValidators","RegisterContext","RegisterController","retrySignUp","signUp","fixAccountNumber","currentLength","customer","AccountNumber","ValidateBillAmount","validation","BillAmount","ValidatePhoneNumber","PNumber","CheckAccountNumber","accountNo","isNewApplicant","savedSuccessfully","limit","retries","checkAccountNumber","accountNumberPattern","Clear","Validate","TimeZone","clear","showBillAmountHelp","SignUpValidation","getSignUpValidation","PasswordMasked","ConfirmPasswordMasked","EmailMasked","UsernameMasked","ConfirmEmailMasked","content@app.pages_utility_location","LocationController","Latitude","Longitude","createMarker","CenterOnMe","setCenter","infoWindowTemplate","OfficeTypeDesc","FullAddress","infowindow","InfoWindow","marker","Marker","addListener","setContent","ofc","selectOffice","componentID","LoginController","failedAttempt","accessFailed","LoadPortalVersion","portalVersion","Version","lockoutMessage","confirmAccountChange","shownAsDialog","lockoutValue","levelUser","emailConfirmed","resetNotification","accountChanged","loginForm","usernameE","continueLogin","loginSuccess","EvalErrorWebAPi","loginFailed","valLocation","confirmedLoc","onbeforeunload","onExit","goToCreateAccount","goToForgotPassword","goToForgotUsername","showSimpleToast","isSuccess","content@app.pages_auth_forgotUserName","ForgotUserNameController","ForgotUserNameViewModel","ValidateUserName","forgotUserNameForm","content@app.pages_auth_forgot-password","ForgotPasswordController","Flip","forgetPasswordMessage","ForgotPassword","forgotPasswordForm","FPData","username","isUserExists","showRetry","HideProgress","Retry","ShowProgress","retry","content@app.pages_utility_contact","ContactController","content@app.pages_auth_confirmChangeEmail","ConfirmChangeEmailController","ConfirmEmailViewModel","ConfirmUser","ErrMessage","encodeURI","ErrorMessage","content@app.pages_auth_confirm-user","ConfirmUserController","ResendActivationEmailViewEmail","UserId","errPage","retryConfirm","content@app.pages_auth_changePassword","changePasswordController","GoBackToAccountsList","ChangePasswordBindingModel","OldPassword","NewPassword","ConfirmPassword","OldPasswordValidate","content@app.pages_auth_changeUserName","ChangeUserNameController","DisplaySuccessMessage","ChangeUserNameBindingModel","OldUserName","succeeded","showUserNameHelp","content@app.pages_auth_changeEmail","ChangeEmailController","ChangeEmail","utilityContact","SendLocation","ChangeEmailBindingModel","UtilityNumber","OnExit","OfficeType","phone","EmailAddress","OldEmail","NewEmail","ConfirmEmail","content@app.pages_auth_adminLogin","AdminLoginController","GoToState","ModifyProgramsProperties","programs","showLoginError","showVersions","setCurrentUser","isFirstLogin","ToolbarController","$translate","userStatus","userStatusOptions","session","selectedLanguage","languages","preferredLanguage","setUserStatus","logout","changeLanguage","use","toggleMsNavigationFolded","searchResultClick","OpenMenu","$mdOpenMenu","en","translation","flag","es","tr","openMenu","AdminToolbarController","QuickPanelController","settings","notify","cloud","retro","activities","events","notes","NavigationController","msScrollOptions","MainController","AUTH_ROLES","userRoles","auth","targetScope","$id","splashScreenIsRemoved","runBlock","htmlClass","$ariaProvider","$logProvider","$translateProvider","debugEnabled","useLoader","urlTemplate","useSanitizeValueStrategy","tabindex","pageValidation","next","to","prevSimulatedAcctNo","absUrl","network","online","onLine","showWarning","hasOpenDialogCnt","defaultErrorHandler","stateChangeStartEvent","toParams","targetState","loggedIn","sessionRole","onError","networkConnectionStatusIndicatorTimer","$apply","routeConfig","$urlRouterProvider","$locationProvider","html5Mode","otherwise","layouts","verticalNavigation","main","toolbar","admin_toolbar","verticalNavigationFullwidthToolbar","verticalNavigationFullwidthToolbar2","horizontalNavigation","contentOnly","contentWithToolbar","toolbar@app","admin_toolbar@app","navigation@app","quickPanel@app","content@app.page_loading_failed","IndexController","currentUser","running","removeIdleTimeoutListener","removeIdleEndListener","userData","logoutSuccess","sessionTimeout","notAuthenticated","notAuthorized","all","admin","IdleProvider","KeepaliveProvider","TitleProvider","interceptors","idle","timeout","keepalive","enabled","apiService","base","normalized","$templateCache"],"mappings":"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","file":"scripts/app-7b17eb21af.js","sourcesContent":["(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.chartmonthly', ['nvd3'])\r\n .controller('UsagechartmonthlyController', ['$state', 'genericService', '$filter', 'commonService', '$mdDialog', '$rootScope', 'authService', '$window', UsagechartmonthlyController]);\r\n\r\n\r\n //.module('app.msportal')\r\n //.controller('UsageChartController', ['$state', 'genericService', '$filter', UsageChartController]);\r\n /** @ngInject\r\n * @ngdoc controller\r\n * @name MDM_ChartController\r\n * @description Controller used to interact with Usage Chart.\r\n */\r\n\r\n function UsagechartmonthlyController($state, genericService, $filter, commonService, $mdDialog, $rootScope, authService, $window) {\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n $window.document.title = \"Usage Charts - \" + document.getElementById(\"title\").title;\r\n\r\n /// Variables.\r\n var dataArray = [];\r\n var searchServices = {};\r\n var serviceController = 'Account/Services/';\r\n var usageController = 'Usage/';\r\n var vm = this;\r\n var waterUOM = \"\";\r\n\r\n /// Binding Data.\r\n vm.AccountService = {};\r\n vm.accountServiceSelected = {};\r\n vm.calendarEvent = { start: \"\", end: \"\", memberSep: \"\" };\r\n vm.chart = {\r\n options: {\r\n chart: {\r\n type: 'linePlusBarChart',\r\n height: 500,\r\n margin: {\r\n top: 30,\r\n right: 75,\r\n bottom: 70,\r\n left: 75\r\n },\r\n bars: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n bars2: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n color: ['#880000', 'darkred'],\r\n x: function (d, i) { return i },\r\n xAxis: {\r\n axisLabel: 'Date',\r\n rotateLabels: 30,\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || null;\r\n //if (dx) {\r\n // return d3.time.format('%x')(new Date(dx))\r\n //}\r\n return dx;\r\n //return null;\r\n }\r\n },\r\n x2Axis: {\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || 0;\r\n return d3.time.format('%m-%d-%Y')(new Date(dx))\r\n },\r\n showMaxMin: false\r\n },\r\n y1Axis: {\r\n axisLabel: 'kWh',\r\n tickFormat: function (d) {\r\n return d3.format('.02f')(d);\r\n },\r\n axisLabelDistance: 0\r\n },\r\n y2Axis: {\r\n axisLabel: 'Y2 Axis',\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n y3Axis: {\r\n tickFormat: function (d) {\r\n return d3.format(',f')(d);\r\n }\r\n },\r\n y4Axis: {\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n focusEnable: false,\r\n showLegend: false,\r\n useInteractiveGuideline: false,\r\n tooltip: {\r\n contentGenerator: function (key, x, y, e, graph) {\r\n if (vm.UsageRequest.SearchDetails.TypeService == \"ELECTRIC\") {\r\n return '

' + key.data.y + ' kWh (' + key.data.x + ')

';\r\n }\r\n else if (vm.UsageRequest.SearchDetails.TypeService == \"WATER\") {\r\n //return '

' + key.data.y + ' GAL (' + key.data.x + ')

';\r\n if (waterUOM === \"GAL\") {\r\n return '

' + key.data.y + ' GAL (' + key.data.x + ')

';\r\n }\r\n else {\r\n return '

' + key.data.y + ' FT3 (' + key.data.x + ')

';\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n },\r\n data: dataChart(),\r\n api: {}\r\n }\r\n vm.chartHeight = (vm.isSingleService) ? 500 : 370;\r\n vm.dateLocale = commonService.dateLocaleByMonth;\r\n vm.dtOptions = { dom: 'lrtip', paging: false, autoWidth: true, responsive: true, scroller: false, processing: true, info: false };\r\n vm.flipped = false;\r\n vm.hideme = true;\r\n vm.isClicked = false;\r\n vm.isSingleService = false;\r\n vm.maxDate = new Date((new Date()).getFullYear(), (new Date()).getMonth() + 1, 0);\r\n vm.MemberNo = $state.params.id;\r\n vm.ModUsageRequest = {\r\n Model: null,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n vm.progress = { activated: false };\r\n vm.searchServices = {};\r\n vm.services = {};\r\n vm.statusMessage = \"loading in progress!\";\r\n vm.UsageRequest = {\r\n SearchDetails:\r\n {\r\n ID: vm.calendarEvent.memberSep,\r\n //ID: \"3009001\",\r\n IdType: 0,\r\n StartDate: vm.calendarEvent.start,\r\n EndDate: vm.calendarEvent.end\r\n },\r\n Device: {\r\n DeviceType: \"\",\r\n HardwareId: \"\"\r\n },\r\n IsPPM: 0,\r\n IsCostEnable: \"0\"\r\n };\r\n\r\n\r\n /// Methods.\r\n /**\r\n * @ngdoc method\r\n * @name initializeChart\r\n * @author Juan Leon \r\n * @description Method used to set initial date parameters and update the chart.\r\n */\r\n //vm.initializeChart = function () {\r\n // vm.progress.activated = true;\r\n // dataArray = [];\r\n // vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), 1);\r\n // vm.calendarEvent.end = new Date((new Date()).getFullYear(), (new Date()).getMonth() + 1, 0);\r\n // vm.updateChart();\r\n //};\r\n /**\r\n * @ngdoc method\r\n * @name updateChart\r\n * @author Juan Leon \r\n * @description Method used to update the chart with a new data from the server.\r\n */\r\n //vm.updateChart = function () {\r\n\r\n // if (vm.calendarEvent.start > vm.calendarEvent.end) {\r\n // showDateRangeError()\r\n // return\r\n // }\r\n // vm.progress.activated = true;\r\n // $rootScope.rootscopeLoading = true;\r\n // vm.UsageRequest.SearchDetails.StartDate = angular.copy(vm.calendarEvent.start);\r\n // vm.UsageRequest.SearchDetails.EndDate = vm.calendarEvent.end;\r\n // vm.UsageRequest.SearchDetails.StartDate.setDate(vm.UsageRequest.SearchDetails.StartDate.getDate())\r\n // vm.UsageRequest.SearchDetails.ID = vm.calendarEvent.memberSep;\r\n // vm.UsageRequest.SearchDetails.FrecuencyMode = \"Monthly\";\r\n // vm.UsageRequest.SearchDetails.TypeService = \"Electric\"; // vm.searchServices.Description;\r\n\r\n\r\n // var getChartDataPost = genericService\r\n // .post(usageController, vm.UsageRequest)\r\n // .then(function (pl) {\r\n // $rootScope.rootscopeLoading = false;\r\n // vm.progress.activated = false;\r\n // var response = pl.data;\r\n\r\n // dataArray = [];\r\n\r\n // for (var i = 0; i < response.length; i++) {\r\n // dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyField)]);\r\n // //////dataArray.push([response[i].dailyTimeStanpField, parseFloat(response[i].totalEnergyField)]);\r\n // }\r\n // vm.chart.api.updateWithData(dataChart());\r\n // },\r\n // function (errorPl) {\r\n // $rootScope.rootscopeLoading = false;\r\n // commonService.handleError(errorPl);\r\n // vm.progress.activated = false;\r\n // dataArray = [];\r\n // })\r\n //};\r\n function showDateRangeError() {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Invalid Date Range')\r\n .textContent('Start Date cannot be later than End Date.')\r\n .ariaLabel('Invalid Date Range')\r\n .ok('Ok')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n function showNoSelectedServiceError() {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('No Selected Service')\r\n .textContent('Please select a service.')\r\n .ariaLabel('No Selected Service')\r\n .ok('Ok')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n function validateMaxInquire(start, end) {\r\n var diff = Math.abs(start - end) / 86400000;\r\n if (diff <= 396) {\r\n return true;\r\n }\r\n else {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Invalid Date Range')\r\n .textContent('The interval of data consulted can not be more than 13 months.')\r\n .ariaLabel('Invalid Date Range')\r\n .ok('Ok')\r\n .multiple(true)\r\n $mdDialog.show(alert);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name closeChart\r\n * @author Juan Leon \r\n * @description Method used to set close the chart screen and go to the List service screen.\r\n */\r\n vm.closeChart = function () {\r\n dataArray = [];\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), 1);\r\n vm.calendarEvent.end = new Date((new Date()).getFullYear(), (new Date()).getMonth() + 1, 0);\r\n vm.chart.api.updateWithData(dataChart());\r\n flip();\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name getSelectedServiceText\r\n * @author \r\n * @description .\r\n */\r\n vm.getSelectedServiceText = function () {\r\n\r\n if (vm.searchServices !== undefined) {\r\n return \"You have selected: Item \" + vm.searchServices;\r\n } else {\r\n return \"Please select an item\";\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name getServiceDetails\r\n * @author Juan Leon \r\n * @description Method used to bring the list of user service.\r\n */\r\n vm.getServiceDetails = function () {\r\n vm.progress.activated = true;\r\n $rootScope.rootscopeLoading = true;\r\n\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), 1);\r\n vm.calendarEvent.end = new Date((new Date()).getFullYear(), (new Date()).getMonth() + 1, 0);\r\n\r\n genericService.get(serviceController + vm.MemberNo)\r\n .then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n vm.progress.activated = false;\r\n vm.searchServices = pl.data.Services;\r\n //////searchServices = vm.searchServices;\r\n vm.searchServices = filterServicesForGraphs(vm.searchServices);\r\n vm.services = vm.searchServices;\r\n vm.AccountService.Services = $filter('filter')(pl.data.Services, filterServices);\r\n\r\n vm.isSingleService = (vm.AccountService.Services.length == 1);\r\n\r\n vm.statusMessage = \"Please select one service to check the usage by range of date.\";\r\n\r\n if (vm.isSingleService) {\r\n vm.selectServiceFlip(vm.AccountService.Services[0]);\r\n d3.select('#chart svg').style({ 'height': 500 });\r\n } else {\r\n d3.select('#chart svg').style({ 'height': 370 });\r\n }\r\n },\r\n function (errorPl) {\r\n $rootScope.rootscopeLoading = false;\r\n commonService.handleError(errorPl);\r\n vm.progress.activated = false;\r\n vm.AccountService = {};\r\n vm.flipped = false;\r\n })\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name LoadRecordsByDateRange\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n //vm.LoadRecordsByDateRange = function () {\r\n\r\n // //vm.updateChart();\r\n // vm.ReloadChart();\r\n //};\r\n \r\n /**\r\n * @ngdoc method\r\n * @name ReloadChart\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n vm.ReloadChart = function () {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n var enddate = new Date(vm.calendarEvent.end.getFullYear(), vm.calendarEvent.end.getMonth() + 1, 0);\r\n vm.calendarEvent.end = enddate;\r\n\r\n searchServices;\r\n vm.searchServices;\r\n vm.services;\r\n var itemSelected = vm.searchServices;\r\n\r\n if (vm.searchServices.MemberSep === undefined) {\r\n showNoSelectedServiceError()\r\n return\r\n }\r\n if (vm.calendarEvent.start > vm.calendarEvent.end) {\r\n showDateRangeError()\r\n return\r\n }\r\n\r\n if (!validateMaxInquire(vm.calendarEvent.start, vm.calendarEvent.end)) {\r\n return\r\n }\r\n\r\n vm.isClicked = true;\r\n vm.UsageRequest.SearchDetails.StartDate = angular.copy(vm.calendarEvent.start);\r\n vm.UsageRequest.SearchDetails.EndDate = vm.calendarEvent.end;\r\n vm.UsageRequest.SearchDetails.StartDate.setDate(vm.UsageRequest.SearchDetails.StartDate.getDate() + 1)\r\n vm.UsageRequest.SearchDetails.FrecuencyMode = \"Monthly\";\r\n vm.UsageRequest.SearchDetails.TypeService = vm.searchServices.Description;\r\n vm.UsageRequest.SearchDetails.ID = vm.searchServices.MemberSep;\r\n vm.ModUsageRequest.Model = vm.UsageRequest;\r\n vm.searchServices = vm.services;\r\n vm.searchServices = itemSelected;\r\n vm.hideme = false;\r\n vm.progress.activated = true;\r\n $rootScope.rootscopeLoading = true;\r\n var getChartDataPost = genericService.post(usageController, vm.ModUsageRequest).then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n vm.progress.activated = false;\r\n var response = pl.data;\r\n\r\n dataArray = [];\r\n\r\n if (response.length > 0) {\r\n if (vm.UsageRequest.SearchDetails.TypeService == \"ELECTRIC\") {\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyField)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"KWH\";\r\n }\r\n else if (vm.UsageRequest.SearchDetails.TypeService == \"WATER\") {\r\n var exist = response.some(function (item) {\r\n return item.totalEnergyGalField !== null && item.totalEnergyGalField !== \"\" && item.totalEnergyGalField !== \"NaN\";\r\n });\r\n\r\n if (exist) {\r\n waterUOM = \"GAL\";\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyGalField)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"GAL\";\r\n }\r\n else {\r\n waterUOM = \"FT3\";\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyFT3Field)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"FT3\";\r\n }\r\n //vm.chart.options.chart.y1Axis.axisLabel = \"GAL\";\r\n }\r\n }\r\n vm.chart.api.updateWithData(dataChart());\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n vm.progress.activated = false;\r\n dataArray = [];\r\n })\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name selectServiceFlip\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n vm.selectServiceFlip = function (accountServiceSelected) {\r\n vm.accountServiceSelected = accountServiceSelected;\r\n vm.calendarEvent.memberSep = accountServiceSelected.MemberSep;\r\n //////vm.initializeChart();\r\n flip();\r\n };\r\n\r\n\r\n /// Internal Functions.\r\n /**\r\n * @ngdoc internal function\r\n * @name dataChart\r\n * @author Juan Leon \r\n * @description Method used to format the data that the chart are going to use.\r\n **/\r\n function dataChart() {\r\n\r\n var data = [\r\n { \"key\": \"Total Energy\", \"bar\": true, \"values\": dataArray }\r\n ].map(function (series) {\r\n series.values = series.values.map(function (d) { return { x: d[0], y: d[1] } });\r\n return series;\r\n });\r\n\r\n return data;\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name filterServices\r\n * @author Juan Leon \r\n * @description Method used to filter the data of serviceAccount.\r\n **/\r\n function filterServices(service) {\r\n //return service.Type == \"00\" || service.Type == \"01\";\r\n return service.Type == \"00\";\r\n }\r\n\r\n function filterServicesForGraphs(services) {\r\n var filteredServices = [];\r\n for (var i = 0; i < services.length; i++) {\r\n if (services[i].Description.toUpperCase() == \"ELECTRIC\" || services[i].Description.toUpperCase() == \"WATER\") {\r\n filteredServices.push(services[i]);\r\n }\r\n }\r\n return filteredServices;\r\n\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name flip\r\n * @author Juan Leon \r\n * @description Method used to flip the screen to front or back.\r\n **/\r\n function flip() {\r\n vm.flipped = !vm.flipped;\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.chartdaily', ['nvd3'])\r\n .controller('UsagechartdailyController', ['$state', 'genericService', '$filter', 'commonService', '$mdDialog', '$rootScope', 'authService', '$window', UsagechartdailyController]);\r\n\r\n\r\n //.module('app.msportal')\r\n //.controller('UsageChartController', ['$state', 'genericService', '$filter', UsageChartController]);\r\n /** @ngInject\r\n * @ngdoc controller\r\n * @name MDM_ChartController\r\n * @description Controller used to interact with Usage Chart.\r\n */\r\n\r\n function UsagechartdailyController($state, genericService, $filter, commonService, $mdDialog, $rootScope, authService, $window) {\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n $window.document.title = \"Usage Charts - \" + document.getElementById(\"title\").title;\r\n\r\n /// Variables.\r\n var dataArray = [];\r\n var searchServices = {};\r\n var serviceController = 'Account/Services/';\r\n var usageController = 'Usage/';\r\n var vm = this;\r\n var waterUOM = \"\";\r\n\r\n /// Binding Data.\r\n vm.AccountService = {};\r\n vm.accountServiceSelected = {};\r\n vm.calendarEvent = { start: \"\", end: \"\", memberSep: \"\" };\r\n vm.chart = {\r\n options: {\r\n chart: {\r\n type: 'linePlusBarChart',\r\n height: 500,\r\n margin: {\r\n top: 30,\r\n right: 75,\r\n bottom: 70,\r\n left: 75\r\n },\r\n bars: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n bars2: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n color: ['#880000', 'darkred'],\r\n x: function (d, i) { return i },\r\n xAxis: {\r\n axisLabel: 'Date',\r\n rotateLabels: 30,\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || null;\r\n if (dx) {\r\n return d3.time.format('%x')(new Date(dx))\r\n }\r\n return null;\r\n }\r\n },\r\n x2Axis: {\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || 0;\r\n return d3.time.format('%m-%d-%Y')(new Date(dx))\r\n },\r\n showMaxMin: false\r\n },\r\n y1Axis: {\r\n axisLabel: 'kWh',\r\n tickFormat: function (d) {\r\n return d3.format('.02f')(d);\r\n },\r\n axisLabelDistance: 0\r\n },\r\n y2Axis: {\r\n axisLabel: 'Y2 Axis',\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n y3Axis: {\r\n tickFormat: function (d) {\r\n return d3.format(',f')(d);\r\n }\r\n },\r\n y4Axis: {\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n focusEnable: false,\r\n showLegend: false,\r\n useInteractiveGuideline: false,\r\n tooltip: {\r\n contentGenerator: function (key, x, y, e, graph) {\r\n if (vm.UsageRequest.SearchDetails.TypeService == \"ELECTRIC\") {\r\n return '

' + key.data.y + ' kWh (' + key.data.x + ')

';\r\n }\r\n else if (vm.UsageRequest.SearchDetails.TypeService == \"WATER\") {\r\n if (waterUOM === \"GAL\") {\r\n return '

' + key.data.y + ' GAL (' + key.data.x + ')

';\r\n }\r\n else {\r\n return '

' + key.data.y + ' FT3 (' + key.data.x + ')

';\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n },\r\n data: dataChart(),\r\n api: {}\r\n }\r\n vm.chartHeight = (vm.isSingleService) ? 500 : 370;\r\n vm.dateLocale = commonService.dateLocaleByDay;\r\n vm.dtOptions = { dom: 'lrtip', paging: false, autoWidth: true, responsive: true, scroller: false, processing: true, info: false };\r\n vm.flipped = false;\r\n vm.hideme = true;\r\n vm.isClicked = false;\r\n vm.isSingleService = false;\r\n vm.maxDate = new Date();\r\n vm.MemberNo = $state.params.id;\r\n vm.ModUsageRequest = {\r\n Model: null,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n vm.progress = { activated: false };\r\n vm.searchServices = {};\r\n vm.services = {};\r\n vm.statusMessage = \"loading in progress!\";\r\n vm.UsageRequest = {\r\n SearchDetails:\r\n {\r\n ID: vm.calendarEvent.memberSep,\r\n //ID: \"3009001\",\r\n IdType: 0,\r\n StartDate: vm.calendarEvent.start,\r\n EndDate: vm.calendarEvent.end\r\n },\r\n Device: {\r\n DeviceType: \"\",\r\n HardwareId: \"\"\r\n },\r\n IsPPM: 0,\r\n IsCostEnable: \"0\"\r\n };\r\n\r\n /// Methods.\r\n /**\r\n * @ngdoc method\r\n * @name initializeChart\r\n * @author Juan Leon \r\n * @description Method used to set initial date parameters and update the chart.\r\n */\r\n //vm.initializeChart = function () {\r\n // vm.progress.activated = true;\r\n // dataArray = [];\r\n // vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n // vm.calendarEvent.end = new Date();\r\n // vm.updateChart();\r\n //};\r\n /**\r\n * @ngdoc method\r\n * @name updateChart\r\n * @author Juan Leon \r\n * @description Method used to update the chart with a new data from the server.\r\n */\r\n //vm.updateChart = function () {\r\n // $rootScope.rootscopeLoading = true;\r\n // if (vm.calendarEvent.start > vm.calendarEvent.end) {\r\n // showDateRangeError()\r\n // return\r\n // }\r\n // vm.progress.activated = true;\r\n // vm.UsageRequest.SearchDetails.StartDate = angular.copy(vm.calendarEvent.start);\r\n // vm.UsageRequest.SearchDetails.EndDate = vm.calendarEvent.end;\r\n // vm.UsageRequest.SearchDetails.StartDate.setDate(vm.UsageRequest.SearchDetails.StartDate.getDate())\r\n // vm.UsageRequest.SearchDetails.ID = vm.calendarEvent.memberSep;\r\n // vm.UsageRequest.SearchDetails.FrecuencyMode = \"Daily\";\r\n // vm.UsageRequest.SearchDetails.TypeService = \"Electric\";// vm.searchServices.Description;\r\n // vm.ModUsageRequest.Model = vm.UsageRequest;\r\n\r\n // var getChartDataPost = genericService\r\n // .post(usageController, vm.ModUsageRequest)\r\n // .then(function (pl) {\r\n // $rootScope.rootscopeLoading = false;\r\n // vm.progress.activated = false;\r\n // var response = pl.data;\r\n\r\n // dataArray = [];\r\n\r\n // for (var i = 0; i < response.length; i++) {\r\n // dataArray.push([response[i].dailyTimeStanpField, parseFloat(response[i].totalEnergyField)]);\r\n // }\r\n // vm.chart.api.updateWithData(dataChart());\r\n // },\r\n // function (errorPl) {\r\n // $rootScope.rootscopeLoading = false;\r\n // commonService.handleError(errorPl);\r\n // vm.progress.activated = false;\r\n // dataArray = [];\r\n // })\r\n //};\r\n\r\n function showDateRangeError() {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Invalid Date Range')\r\n .textContent('Start Date cannot be later than End Date.')\r\n .ariaLabel('Invalid Date Range')\r\n .ok('Ok')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n function showNoSelectedServiceError() {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('No Selected Service')\r\n .textContent('Please select a service.')\r\n .ariaLabel('No Selected Service')\r\n .ok('Ok')\r\n .multiple(true)\r\n\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n \r\n function validateMaxInquire(start, end) {\r\n var diff = Math.abs(start - end) / 86400000;\r\n if (diff <= 61) {\r\n return true;\r\n }\r\n else {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Invalid Date Range')\r\n .textContent('The interval of data consulted can not be more than two months.')\r\n .ariaLabel('Invalid Date Range')\r\n .ok('Ok')\r\n .multiple(true)\r\n $mdDialog.show(alert);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name closeChart\r\n * @author Juan Leon \r\n * @description Method used to set close the chart screen and go to the List service screen.\r\n */\r\n vm.closeChart = function () {\r\n dataArray = [];\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n vm.calendarEvent.end = new Date();\r\n vm.chart.api.updateWithData(dataChart());\r\n flip();\r\n };\r\n \r\n /**\r\n * @ngdoc method\r\n * @name getSelectedServiceText\r\n * @author \r\n * @description .\r\n */\r\n vm.getSelectedServiceText = function () {\r\n\r\n if (vm.searchServices !== undefined) {\r\n return \"You have selected: Item \" + vm.searchServices;\r\n } else {\r\n return \"Please select an item\";\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name getServiceDetails\r\n * @author Juan Leon \r\n * @description Method used to bring the list of user service.\r\n */\r\n vm.getServiceDetails = function () {\r\n $rootScope.rootscopeLoading = true;\r\n vm.progress.activated = true;\r\n\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n vm.calendarEvent.end = new Date();\r\n\r\n genericService.get(serviceController + vm.MemberNo)\r\n .then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n vm.progress.activated = false;\r\n vm.searchServices = pl.data.Services;\r\n vm.searchServices = filterServicesForGraphs(vm.searchServices);\r\n searchServices = vm.searchServices;\r\n vm.services = vm.searchServices;\r\n vm.AccountService.Services = $filter('filter')(pl.data.Services, filterServices);\r\n vm.isSingleService = (vm.AccountService.Services.length == 1);\r\n vm.statusMessage = \"Please select one service to check the usage by range of date.\";\r\n\r\n if (vm.isSingleService) {\r\n vm.selectServiceFlip(vm.AccountService.Services[0]);\r\n d3.select('#chart svg').style({ 'height': 500 });\r\n } else {\r\n d3.select('#chart svg').style({ 'height': 370 });\r\n }\r\n },\r\n function (errorPl) {\r\n $rootScope.rootscopeLoading = false;\r\n commonService.handleError(errorPl);\r\n vm.progress.activated = false;\r\n vm.AccountService = {};\r\n vm.flipped = false;\r\n })\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name LoadRecordsByDateRange\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n //vm.LoadRecordsByDateRange = function () {\r\n // vm.ReloadChart();\r\n //};\r\n \r\n /**\r\n * @ngdoc method\r\n * @name ReloadChart\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n vm.ReloadChart = function () {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n searchServices;\r\n vm.searchServices;\r\n vm.services;\r\n var itemSelected = vm.searchServices;\r\n\r\n if (vm.searchServices.MemberSep === undefined) {\r\n showNoSelectedServiceError()\r\n return\r\n }\r\n if (vm.calendarEvent.start > vm.calendarEvent.end) {\r\n showDateRangeError()\r\n return\r\n }\r\n\r\n if (!validateMaxInquire(vm.calendarEvent.start, vm.calendarEvent.end)) {\r\n return\r\n }\r\n\r\n vm.isClicked = true;\r\n vm.UsageRequest.SearchDetails.StartDate = angular.copy(vm.calendarEvent.start);\r\n vm.UsageRequest.SearchDetails.EndDate = vm.calendarEvent.end;\r\n //vm.UsageRequest.SearchDetails.StartDate.setDate(\r\n // Intl.DateTimeFormat().resolvedOptions().timeZone.includes(\"America\") ? vm.UsageRequest.SearchDetails.StartDate.getDate() : vm.UsageRequest.SearchDetails.StartDate.getDate()+1\r\n //)\r\n if (Intl.DateTimeFormat().resolvedOptions().timeZone.includes(\"America\") || Intl.DateTimeFormat().resolvedOptions().timeZone.includes(\"Pacific\") || Intl.DateTimeFormat().resolvedOptions().timeZone.includes(\"Etc\") || Intl.DateTimeFormat().resolvedOptions().timeZone.includes(\"Atlantic\")) {\r\n vm.UsageRequest.SearchDetails.StartDate.setDate(vm.UsageRequest.SearchDetails.StartDate.getDate());\r\n }\r\n else {\r\n vm.UsageRequest.SearchDetails.StartDate.setDate(vm.UsageRequest.SearchDetails.StartDate.getDate() + 1);\r\n }\r\n vm.UsageRequest.SearchDetails.FrecuencyMode = \"Daily\";\r\n vm.UsageRequest.SearchDetails.TypeService = vm.searchServices.Description;\r\n vm.UsageRequest.SearchDetails.ID = vm.searchServices.MemberSep;\r\n vm.ModUsageRequest.Model = vm.UsageRequest;\r\n vm.searchServices = vm.services;\r\n vm.searchServices = itemSelected;\r\n vm.hideme = false;\r\n vm.progress.activated = true;\r\n $rootScope.rootscopeLoading = true;\r\n var getChartDataPost = genericService.post(usageController, vm.ModUsageRequest).then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n vm.progress.activated = false;\r\n var response = pl.data;\r\n dataArray = [];\r\n\r\n if (response.length > 0) {\r\n if (vm.UsageRequest.SearchDetails.TypeService == \"ELECTRIC\") {\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].dailyTimeStanpField, parseFloat(response[i].totalEnergyField)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"KWH\";\r\n }\r\n else if (vm.UsageRequest.SearchDetails.TypeService == \"WATER\") {\r\n var exist = response.some(function (item) {\r\n return !item.totalEnergyGalField.includes(\"NaN\");\r\n });\r\n\r\n if (exist) {\r\n waterUOM = \"GAL\";\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].dailyTimeStanpField, parseFloat(response[i].totalEnergyGalField)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"GAL\";\r\n }\r\n else {\r\n waterUOM = \"FT3\";\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].dailyTimeStanpField, parseFloat(response[i].totalEnergyFT3Field)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"FT3\";\r\n }\r\n }\r\n }\r\n vm.chart.api.updateWithData(dataChart());\r\n }, function (errorPl) {\r\n $rootScope.rootscopeLoading = false;\r\n commonService.handleError(errorPl);\r\n vm.progress.activated = false;\r\n dataArray = [];\r\n })\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name selectServiceFlip\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n vm.selectServiceFlip = function (accountServiceSelected) {\r\n vm.accountServiceSelected = accountServiceSelected;\r\n vm.calendarEvent.memberSep = accountServiceSelected.MemberSep;\r\n //////vm.initializeChart();\r\n flip();\r\n };\r\n\r\n\r\n\r\n /// Internal Functions.\r\n /**\r\n * @ngdoc internal function\r\n * @name dataChart\r\n * @author Juan Leon \r\n * @description Method used to format the data that the chart are going to use.\r\n **/\r\n function dataChart() {\r\n\r\n var data = [\r\n { \"key\": \"Total Energy\", \"bar\": true, \"values\": dataArray }\r\n ].map(function (series) {\r\n series.values = series.values.map(function (d) { return { x: d[0], y: d[1] } });\r\n return series;\r\n });\r\n\r\n return data;\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name filterServices\r\n * @author Juan Leon \r\n * @description Method used to filter the data of serviceAccount.\r\n **/\r\n function filterServices(service) {\r\n //return service.Type == \"00\" || service.Type == \"01\";\r\n return service.Type == \"00\";\r\n }\r\n \r\n function filterServicesForGraphs(services) {\r\n var filteredServices = [];\r\n for (var i = 0; i < services.length; i++) {\r\n if (services[i].Description.toUpperCase() == \"ELECTRIC\" || services[i].Description.toUpperCase() == \"WATER\") {\r\n filteredServices.push(services[i]);\r\n }\r\n }\r\n return filteredServices;\r\n\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name flip\r\n * @author Juan Leon \r\n * @description Method used to flip the screen to front or back.\r\n **/\r\n function flip() {\r\n vm.flipped = !vm.flipped;\r\n } \r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.chartinterval', ['nvd3'])\r\n .controller('UsagechartintervalController', ['$state', 'genericService', '$filter', 'commonService', '$mdDialog', '$rootScope', 'authService', '$window', UsagechartintervalController]);\r\n\r\n\r\n //.module('app.msportal')\r\n //.controller('UsageChartController', ['$state', 'genericService', '$filter', UsageChartController]);\r\n /** @ngInject\r\n * @ngdoc controller\r\n * @name MDM_ChartController\r\n * @description Controller used to interact with Usage Chart.\r\n */\r\n\r\n function UsagechartintervalController($state, genericService, $filter, commonService, $mdDialog, $rootScope, authService, $window) {\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n $window.document.title = \"Usage Charts - \" + document.getElementById(\"title\").title;\r\n\r\n /// Variables.\r\n var dataArray = [];\r\n var vm = this;\r\n var searchServices = {};\r\n var serviceController = 'Account/Services/';\r\n var usageController = 'Usage/';\r\n var waterUOM = \"\";\r\n\r\n /// Binding Data.\r\n vm.AccountService = {};\r\n vm.accountServiceSelected = {};\r\n vm.calendarEvent = { start: \"\", end: \"\", memberSep: \"\" };\r\n vm.chart = {\r\n options: {\r\n chart: {\r\n type: 'linePlusBarChart',\r\n height: 500,\r\n margin: {\r\n top: 30,\r\n right: 75,\r\n bottom: 70,\r\n left: 75\r\n },\r\n bars: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n bars2: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n color: ['#880000', 'darkred'],\r\n x: function (d, i) { return i },\r\n xAxis: {\r\n axisLabel: 'Hours',\r\n rotateLabels: 30,\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || null;\r\n //if (dx) {\r\n // return d3.time.format('%x')(new Date(dx))\r\n //}\r\n return dx;\r\n //return null;\r\n },\r\n },\r\n\r\n x2Axis: {\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || 0;\r\n return d3.time.format('%m-%d-%Y')(new Date(dx))\r\n },\r\n showMaxMin: false\r\n },\r\n y1Axis: {\r\n axisLabel: 'kWh',\r\n tickFormat: function (d) {\r\n return d3.format('.02f')(d);\r\n },\r\n axisLabelDistance: 0\r\n },\r\n y2Axis: {\r\n axisLabel: 'Y2 Axis',\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n y3Axis: {\r\n tickFormat: function (d) {\r\n return d3.format(',f')(d);\r\n }\r\n },\r\n y4Axis: {\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n focusEnable: false,\r\n showLegend: false,\r\n useInteractiveGuideline: false,\r\n tooltip: {\r\n contentGenerator: function (key, x, y, e, graph) {\r\n if (vm.UsageRequest.SearchDetails.TypeService == \"ELECTRIC\") {\r\n return '

' + key.data.y + ' kWh (' + key.data.x + ')

';\r\n }\r\n else if (vm.UsageRequest.SearchDetails.TypeService == \"WATER\") {\r\n //return '

' + key.data.y + ' GAL (' + key.data.x + ')

';\r\n if (waterUOM === \"GAL\") {\r\n return '

' + key.data.y + ' GAL (' + key.data.x + ')

';\r\n }\r\n else {\r\n return '

' + key.data.y + ' FT3 (' + key.data.x + ')

';\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n data: dataChart(),\r\n api: {}\r\n }\r\n vm.chartHeight = (vm.isSingleService) ? 500 : 370;\r\n vm.dateLocale = commonService.dateLocaleByDay;\r\n vm.dtOptions = { dom: 'lrtip', paging: false, autoWidth: true, responsive: true, scroller: false, processing: true, info: false };\r\n vm.flipped = false;\r\n vm.hideme = true;\r\n vm.isClicked = false;\r\n vm.isSingleService = false;\r\n vm.maxDate = new Date();\r\n vm.ModUsageRequest = {\r\n Model: null,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n vm.MemberNo = $state.params.id;\r\n vm.progress = { activated: false };\r\n vm.searchServices = {};\r\n vm.services = {};\r\n vm.statusMessage = \"loading in progress!\";\r\n vm.UsageRequest = {\r\n SearchDetails:\r\n {\r\n ID: vm.calendarEvent.memberSep,\r\n //ID: \"3009001\",\r\n IdType: 0,\r\n StartDate: vm.calendarEvent.start,\r\n EndDate: vm.calendarEvent.start + 1\r\n //////EndDate: vm.calendarEvent.end\r\n },\r\n Device: {\r\n DeviceType: \"\",\r\n HardwareId: \"\"\r\n },\r\n IsPPM: 0,\r\n IsCostEnable: \"0\"\r\n };\r\n\r\n\r\n /// Methods.\r\n /**\r\n * @ngdoc method\r\n * @name initializeChart\r\n * @author Juan Leon \r\n * @description Method used to set initial date parameters and update the chart.\r\n */\r\n vm.initializeChart = function () {\r\n vm.progress.activated = true;\r\n dataArray = [];\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n //////vm.calendarEvent.end = new Date();\r\n vm.calendarEvent.end = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() + 1);\r\n //////vm.updateChart();\r\n };\r\n /**\r\n * @ngdoc method\r\n * @name updateChart\r\n * @author Juan Leon \r\n * @description Method used to update the chart with a new data from the server.\r\n */\r\n //vm.updateChart = function () {\r\n // vm.UsageRequest.SearchDetails.StartDate = angular.copy(vm.calendarEvent.start);\r\n // vm.UsageRequest.SearchDetails.StartDate.setDate(vm.UsageRequest.SearchDetails.StartDate.getDate())\r\n // vm.UsageRequest.SearchDetails.EndDate = new Date(vm.UsageRequest.SearchDetails.StartDate.getFullYear(), vm.UsageRequest.SearchDetails.StartDate.getMonth(), vm.UsageRequest.SearchDetails.StartDate.getDate() + 1);\r\n // vm.UsageRequest.SearchDetails.ID = vm.calendarEvent.memberSep;\r\n // vm.UsageRequest.SearchDetails.FrecuencyMode = \"Interval\";\r\n // vm.UsageRequest.SearchDetails.TypeService = \"Electric\"; // vm.searchServices.Description;\r\n // vm.progress.activated = true;\r\n\r\n // var getChartDataPost = genericService\r\n // .post(usageController, vm.UsageRequest)\r\n // .then(function (pl) {\r\n // vm.progress.activated = false;\r\n // var response = pl.data;\r\n\r\n // dataArray = [];\r\n\r\n // for (var i = 0; i < response.length; i++) {\r\n // dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyField)]);\r\n // }\r\n // vm.chart.api.updateWithData(dataChart());\r\n // },\r\n // function (errorPl) {\r\n // commonService.handleError(errorPl);\r\n // vm.progress.activated = false;\r\n // dataArray = [];\r\n // })\r\n //};\r\n\r\n function showDateRangeError() {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Invalid Date Range')\r\n .textContent('Start Date cannot be later than End Date.')\r\n .ariaLabel('Invalid Date Range')\r\n .ok('Ok')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n function showNoSelectedServiceError() {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('No Selected Service')\r\n .textContent('Please select a service.')\r\n .ariaLabel('No Selected Service')\r\n .ok('Ok')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name closeChart\r\n * @author Juan Leon \r\n * @description Method used to set close the chart screen and go to the List service screen.\r\n */\r\n vm.closeChart = function () {\r\n dataArray = [];\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n vm.calendarEvent.end = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() + 1);\r\n vm.chart.api.updateWithData(dataChart());\r\n flip();\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name getSelectedServiceText\r\n * @author \r\n * @description .\r\n */\r\n vm.getSelectedServiceText = function () {\r\n\r\n if (vm.searchServices !== undefined) {\r\n return \"You have selected: Item \" + vm.searchServices;\r\n } else {\r\n return \"Please select an item\";\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name getServiceDetails\r\n * @author Juan Leon \r\n * @description Method used to bring the list of user service.\r\n */\r\n vm.getServiceDetails = function () {\r\n $rootScope.rootscopeLoading = true;\r\n vm.progress.activated = true;\r\n\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n //////vm.calendarEvent.end = new Date();\r\n vm.calendarEvent.end = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() + 1);\r\n\r\n genericService.get(serviceController + vm.MemberNo)\r\n .then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n vm.progress.activated = false;\r\n vm.searchServices = pl.data.Services;\r\n vm.searchServices = filterServicesForGraphs(vm.searchServices);\r\n searchServices = vm.searchServices;\r\n vm.services = vm.searchServices;\r\n vm.AccountService.Services = $filter('filter')(pl.data.Services, filterServices);\r\n\r\n vm.isSingleService = (vm.AccountService.Services.length == 1);\r\n\r\n vm.statusMessage = \"Please select one service to check the usage by range of date.\";\r\n\r\n if (vm.isSingleService) {\r\n vm.selectServiceFlip(vm.AccountService.Services[0]);\r\n d3.select('#chart svg').style({ 'height': 500 });\r\n } else {\r\n d3.select('#chart svg').style({ 'height': 370 });\r\n }\r\n },\r\n function (errorPl) {\r\n $rootScope.rootscopeLoading = false;\r\n commonService.handleError(errorPl);\r\n vm.progress.activated = false;\r\n vm.AccountService = {};\r\n vm.flipped = false;\r\n })\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name LoadRecordsByDateRange\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n //vm.LoadRecordsByDateRange = function () {\r\n\r\n // //vm.updateChart();\r\n // vm.ReloadChart();\r\n //};\r\n\r\n /**\r\n * @ngdoc method\r\n * @name ReloadChart\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n vm.ReloadChart = function () {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n searchServices;\r\n vm.searchServices;\r\n vm.services;\r\n var itemSelected = vm.searchServices;\r\n\r\n if (vm.searchServices.MemberSep === undefined) {\r\n showNoSelectedServiceError()\r\n return\r\n }\r\n\r\n vm.isClicked = true;\r\n vm.UsageRequest.SearchDetails.StartDate = angular.copy(vm.calendarEvent.start);\r\n vm.UsageRequest.SearchDetails.StartDate.setDate(\r\n Intl.DateTimeFormat().resolvedOptions().timeZone.includes(\"America\") ? vm.UsageRequest.SearchDetails.StartDate.getDate() : vm.UsageRequest.SearchDetails.StartDate.getDate()+1\r\n )\r\n vm.UsageRequest.SearchDetails.EndDate = new Date(vm.UsageRequest.SearchDetails.StartDate.getFullYear(), vm.UsageRequest.SearchDetails.StartDate.getMonth(), vm.UsageRequest.SearchDetails.StartDate.getDate() + 1);\r\n vm.UsageRequest.SearchDetails.FrecuencyMode = \"Interval\";\r\n vm.UsageRequest.SearchDetails.TypeService = vm.searchServices.Description;\r\n vm.UsageRequest.SearchDetails.ID = vm.searchServices.MemberSep;\r\n vm.ModUsageRequest.Model = vm.UsageRequest;\r\n vm.searchServices = vm.services;\r\n vm.searchServices = itemSelected;\r\n vm.hideme = false;\r\n vm.progress.activated = true;\r\n $rootScope.rootscopeLoading = true;\r\n var getChartDataPost = genericService.post(usageController, vm.ModUsageRequest).then(function (pl) {\r\n vm.progress.activated = false;\r\n $rootScope.rootscopeLoading = false;\r\n var response = pl.data;\r\n dataArray = [];\r\n\r\n if (response.length > 0) {\r\n if (vm.UsageRequest.SearchDetails.TypeService == \"ELECTRIC\") {\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyField)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"KWH\";\r\n }\r\n else if (vm.UsageRequest.SearchDetails.TypeService == \"WATER\") {\r\n var exist = response.some(function (item) {\r\n return item.totalEnergyGalField !== null && item.totalEnergyGalField !== \"\";\r\n });\r\n\r\n if (exist) {\r\n waterUOM = \"GAL\";\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyGalField)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"GAL\";\r\n }\r\n else {\r\n waterUOM = \"FT3\";\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].statusIdField, parseFloat(response[i].totalEnergyFT3Field)]);\r\n }\r\n vm.chart.options.chart.y1Axis.axisLabel = \"FT3\";\r\n }\r\n //vm.chart.options.chart.y1Axis.axisLabel = \"GAL\";\r\n\r\n }\r\n }\r\n\r\n\r\n vm.chart.api.updateWithData(dataChart());\r\n }, function (errorPl) {\r\n $rootScope.rootscopeLoading = false;\r\n commonService.handleError(errorPl);\r\n vm.progress.activated = false;\r\n dataArray = [];\r\n })\r\n });\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name selectServiceFlip\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n vm.selectServiceFlip = function (accountServiceSelected) {\r\n vm.accountServiceSelected = accountServiceSelected;\r\n vm.calendarEvent.memberSep = accountServiceSelected.MemberSep;\r\n //////vm.initializeChart();\r\n flip();\r\n };\r\n\r\n\r\n /// Internal Functions.\r\n /**\r\n * @ngdoc internal function\r\n * @name dataChart\r\n * @author Juan Leon \r\n * @description Method used to format the data that the chart are going to use.\r\n **/\r\n function dataChart() {\r\n\r\n var data = [\r\n { \"key\": \"Total Energy\", \"bar\": true, \"values\": dataArray }\r\n ].map(function (series) {\r\n series.values = series.values.map(function (d) { return { x: d[0], y: d[1] } });\r\n return series;\r\n });\r\n\r\n return data;\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name filterServices\r\n * @author Juan Leon \r\n * @description Method used to filter the data of serviceAccount.\r\n **/\r\n function filterServices(service) {\r\n //return service.Type == \"00\" || service.Type == \"01\";\r\n return service.Type == \"00\";\r\n }\r\n\r\n function filterServicesForGraphs(services) {\r\n var filteredServices = [];\r\n for (var i = 0; i < services.length; i++) {\r\n if (services[i].Description.toUpperCase() == \"ELECTRIC\" || services[i].Description.toUpperCase() == \"WATER\") {\r\n filteredServices.push(services[i]);\r\n }\r\n }\r\n return filteredServices;\r\n\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name flip\r\n * @author Juan Leon \r\n * @description Method used to flip the screen to front or back.\r\n **/\r\n function flip() {\r\n vm.flipped = !vm.flipped;\r\n }\r\n\r\n\r\n }\r\n})();\r\n\n(function () {\n 'use strict';\n\n angular\n .module('app.msportal',\n [\n 'flow'\n ]\n )\n .config(config);\n\n /** @ngInject */\n function config($stateProvider, $translatePartialLoaderProvider, msApiProvider, msNavigationServiceProvider) {\n // State\n $stateProvider\n .state('app.msportal', {\r\n abstract: true,\n url: '/portal'\r\n })\n .state('app.msportal.admin', {\r\n abstract: true,\n url: '/admin'\r\n })\n .state('app.msportal.admin.customers', {\r\n url: '/customers',\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/adminpages/views/customer_list/customer_list.html',\n controller: 'CustomerListController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.admin.customization', {\r\n url: '/customizePortal',\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/adminpages/views/customizePortal/customizePortal.html',\n controller: 'CustomizePortalController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n .state('app.msportal.accounts', {\r\n url: '/accounts',\n params: {\r\n CID: null\r\n },\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/accounts/accounts.html',\n controller: 'AccountsController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.subscription', {\r\n url: '/subscription-details',\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/alerts/subscription_details.html',\n controller: 'SubscriptionDetailsController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n \n .state('app.msportal.alerts', {\r\n url: '/alerts/:id',\n params: {\r\n id: null\r\n },\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/alerts/alerts.html',\n controller: 'AlertsController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.service_detail', {\r\n url: '/service-details/:id',\n params: {\r\n id: null\r\n },\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/service_details/service_details.html',\n controller: 'ServiceDetailsController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.profile', {\r\n url: '/profile/:id',\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/profile/profile.html',\n controller: \"ProfileController as vm\"\r\n }\r\n },\n resolve: {\r\n EntitiesValidators: [\"ProfileContext\", function (ProfileContext) {\r\n var EntityValidators = ProfileContext.GetEntityValidators('AccountProfileDTO', 'Model');\n return EntityValidators;\r\n }]\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.draft', {\r\n url: '/payment-drafts/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/draft/drafts.html',\n controller: \"BankDraftController as vm\"\r\n }\r\n },\n resolve: {\r\n CCValidators: [\"BankDraftContext\", function (BankDraftContext) {\r\n return BankDraftContext.getValidators('CreditCardProfileDTO', 'CreditCardProfile');\r\n }],\n ECValidators: [\"BankDraftContext\", function (BankDraftContext) {\r\n return BankDraftContext.getValidators('ECheckProfileDTO', 'ECheckProfile');\r\n }],\r\n checkSmartAppConfig: [\"commonService\", function (commonService) {\r\n return commonService.loadSmartAppConfig();\r\n }]\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n \n .state('app.msportal.payment', {\r\n url: '/payment/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n\n templateUrl: 'app/main/msportal/views/payment/payment.html',\n controller: \"PaymentController as vm\"\r\n }\r\n },\n resolve: {\r\n CCValidators: [\"PaymentContext\", function (PaymentContext) {\r\n return PaymentContext.getPaymentValidators('CreditCardProfileDTO', 'CreditCardProfile');\r\n }],\n ECValidators: [\"PaymentContext\", function (PaymentContext) {\r\n return PaymentContext.getPaymentValidators('ECheckProfileDTO', 'ECheckProfile');\r\n }],\r\n checkSmartAppConfig: [\"commonService\", function (commonService) {\r\n return commonService.loadSmartAppConfig();\r\n }]\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.deposits', {\n url: '/deposits/:id',\n params: {\r\n id: null\r\n },\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/deposits/deposits.html',\n controller: 'DepositsController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n // PPM Account HIstory\n .state('app.msportal.ppmAcctHist', {\r\n url: '/ppm-history/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/ppm_history/ppm_history.html',\r\n controller: 'PPMHistoryController'\r\n }\r\n },\n resolve: {\r\n checkSmartAppConfig: [\"commonService\", function (commonService) {\r\n return commonService.loadSmartAppConfig();\r\n }]\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n // Contact Us\n .state('app.msportal.contactUs', {\r\n url: '/contact-us/',\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/contact_us/contact_us.html',\r\n controller: 'ContactUsController'\r\n }\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n //My Usage\n .state('app.msportal.billHist', {\r\n url: '/bill-history/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/usage/usage.html',\r\n controller: 'UsageController'\r\n }\r\n },\n resolve: {\r\n checkSmartAppConfig: [\"commonService\", function (commonService) {\r\n return commonService.loadSmartAppConfig();\r\n }]\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.paymentHist', {\r\n url: '/payment-history/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/payment_history/payment_history.html',\r\n controller: 'PaymentHistoryController'\r\n }\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.usageCharts', {\r\n url: '/usage-charts/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/usage_charts/usagecharts.html',\r\n controller: 'UsagechartsController as vm'\r\n }\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n //E-Notifications\n .state('app.msportal.billTypePreference', {\r\n url: '/e-bill/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/bill_preference/bill_preference.html',\r\n controller: 'BillPreferenceController'\r\n }\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.msportal.delinquentNotice', {\r\n url: '/e-delinquent/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/delinquent/delinquent.html',\r\n controller: 'DelinquentController'\r\n }\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n //Budget/Levelized Billing\n .state('app.msportal.budget-levelized', {\r\n url: '/budget-levelized-billing/:id',\r\n params: {\r\n id: null\r\n },\r\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/msportal/views/budget_levelized/budgetLevelized.html',\n controller: \"BudgetLevelizedController as vm\"\r\n }\r\n },\n resolve: {\r\n checkSmartAppConfig: [\"commonService\", function (commonService) {\r\n return commonService.loadSmartAppConfig();\r\n }]\r\n },\r\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n ;\n\n \n // Translation\n $translatePartialLoaderProvider.addPart('app/main/msportal');\n\n // Api\n msApiProvider.register('msportal.accounts', ['app/data/msportal/accounts.json']);\n }\n})();\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('PaymentReceiptController', ['$mdDialog', 'detail', PaymentReceiptController]);\r\n\r\n /** @ngInject \r\n * @type: controller\r\n * @name: PaymentDetailController\r\n * @description: Used to control the functionality of detail payment proccess.\r\n **/\r\n function PaymentReceiptController($mdDialog, detail) {\r\n\r\n var ret = false;\r\n\r\n angular.extend(this, new function () {\r\n /// Bind Data from Payment Review\r\n this.detail = detail;\r\n this.dtOptions = { dom: 'lrtip', paging: false, responsive: false, scroller: false, processing: true, info: false, };\r\n\r\n this.closeDialog = function () {\r\n $mdDialog.cancel();\r\n };\r\n });\r\n }\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('PaymentProfileController', ['genericService', '$rootScope', 'commonService', 'PaymentDetailService', '$timeout', 'PaymentContext', '$element', 'ProfileContext', '$mdDialog', '$scope', 'authService', PaymentProfileController])\r\n .factory('PaymentDetailService', function () {\r\n this.PaymentDetailData = {};\r\n this.PaymentProfileData = {};\r\n this.isValid = function () { return this.PaymentProfileData.isValid; };\r\n\r\n String.prototype.toMask = function () {\r\n return String(\"************************\" + this.substr(this.length - 4)).slice(-16);\r\n };\r\n\r\n String.prototype.padLeft = function (len, charac) {\r\n return Array(len - this.length + 1).join(charac || \" \") + this;\r\n }\r\n\r\n String.prototype.toActualYear = function () {\r\n var actualYear = new Date().getFullYear().toString();\r\n var dataYear = this.toString();\r\n\r\n if (this.length == 2)\r\n dataYear = actualYear.substring(0, 2) + dataYear;\r\n\r\n return String(dataYear);\r\n }\r\n\r\n String.prototype.toTwoDigitsYear = function () {\r\n var dataYear = this.toString();\r\n\r\n if (this.length > 2)\r\n dataYear = dataYear.substring((dataYear.length - 2), dataYear.length);\r\n\r\n return String(dataYear);\r\n }\r\n\r\n this.getPaymentDetail = function () {\r\n return this.PaymentDetailData;\r\n };\r\n this.setPaymentDetail = function (obj) {\r\n this.PaymentDetailData = angular.copy(obj);\r\n };\r\n\r\n this.getPaymentProfile = function () {\r\n return this.PaymentProfileData;\r\n };\r\n\r\n this.setPaymentProfile = function (obj) {\r\n this.PaymentProfileData = angular.copy(obj);\r\n\r\n this.getPaymentProfile();\r\n };\r\n\r\n return this;\r\n });\r\n\r\n /** @ngInject \r\n * @type: controller\r\n * @name: PaymentProfileController\r\n * @description: Used to control the functionality of detail payment proccess.\r\n **/\r\n function PaymentProfileController(genericService, $rootScope, commonService, PaymentDetailService, $timeout, PaymentContext, $element, ProfileContext, $mdDialog, $scope, authService) {\r\n\r\n /// Assigning COOPARMND(403) to variable saveProfileEnabled\r\n $scope.saveProfileEnabled = $rootScope.Parameters.ThirdParameters.THIRDPARM_3;\r\n\r\n /// Services Binding.\r\n var PaymentDetailData = function () { return PaymentDetailService.getPaymentDetail() };\r\n var setProfileDetail = function (ProfileDetail) {\r\n PaymentDetailService.setPaymentProfile(ProfileDetail);\r\n };\r\n\r\n this.paymentContext = PaymentContext;\r\n this.paymentAmount = PaymentContext.AccountServicesObject[\"PaymentDetails\"].totalPaymentAmount;\r\n //this.paymentController = PaymentController;\r\n\r\n\r\n /// Use angular.extend to encapsulate the logic of the controller into a class.\r\n angular.extend(this, (new function () {\r\n /// Variables.\r\n var baseClass = this;\r\n var hasProfile = false;\r\n var hasChanges = false;\r\n var tempExpMonth;\r\n var tempExpYear;\r\n var cardExpMonth;\r\n var cardExpYear;\r\n\r\n this.tempCardProfile = {};\r\n\r\n /// Data Binding.\r\n this.dateLocale = commonService.dateLocaleExpDate;\r\n this.isAdmin = authService.adminAuthentication.roleType === 'Admin';\r\n this.Parameters = PaymentContext.Parameters();\r\n this.NameSuffixes = {};\r\n this.CCValidators = PaymentContext.getCCValidation();\r\n this.ECValidators = PaymentContext.getECValidation();\r\n this.ECheckProfile = {};\r\n this.CreditCardProfile = {};\r\n this.detail = function () { return PaymentDetailData(); };\r\n this.AccountServices = this.detail().AccountServices;\r\n this.DeviceDetails = { DeviceType: \"BPP\", HardwareId: \"\" };\r\n this.fetchProfile = {\r\n MemberSep: (this.AccountServices.length > 0 ? this.AccountServices[0].MemberSep : ''),\r\n DeviceDetails: this.DeviceDetails,\r\n PaymentType: (this.detail().type == 1) ? \"CC\" : \"EC\"\r\n }\r\n this.ModFetchProfile = {\r\n Model: this.fetchProfile,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n this.setProfile = function (Prof) { return setProfileDetail(Prof); };\r\n this.RoutingNumberPattern = (function () {\r\n var regexp = /^\\*?[0-9]+$/;\r\n\r\n return {\r\n test: function (value) {\r\n return regexp.test(value);\r\n }\r\n };\r\n })();\r\n\r\n\r\n /// Methods.\r\n this.blurInput = BlurInput;\r\n this.getSaveProfileLabel = GetSaveProfileLabel;\r\n this.editInput = EditInput;\r\n this.GetNameSuffixes = function () {\r\n ProfileContext.GetLookUpList(\"nameSuffixes\").get(function (data) {\r\n baseClass.NameSuffixes = data.data;\r\n });\r\n }\r\n\r\n this.PopulateProfile = function () {\r\n this.GetNameSuffixes();\r\n this.setProfile({});\r\n\r\n genericService\r\n .post('Payments/PaymentProfile/', this.ModFetchProfile)\r\n .then(function (pl) {\r\n /*if (pl.data == undefined)\r\n return;*/\r\n\r\n /*if (pl.data == undefined)\r\n return;*/\r\n\r\n if (baseClass.fetchProfile.PaymentType === \"CC\") {\r\n $rootScope.MaxPaymentAmount = pl.data.AdditionalSettings.MaxCreditCardPayment;\r\n } else if (baseClass.fetchProfile.PaymentType === \"EC\") {\r\n $rootScope.MaxPaymentAmount = pl.data.AdditionalSettings.MaxECheckPayment;\r\n }\r\n\r\n if (pl.data.BankAccountNumber || pl.data.CreditCardInfo) {\r\n $scope.hasPaymentProfile = true;\r\n $scope.hasChanges = false;\r\n\r\n switch (baseClass.fetchProfile.PaymentType) {\r\n case \"CC\":\r\n /// Set the data in profile variable.\r\n angular.copy(pl.data, baseClass.CreditCardProfile);\r\n angular.copy(pl.data, baseClass.tempCardProfile)\r\n\r\n $rootScope.MaxPaymentAmount = pl.data.AdditionalSettings.MaxCreditCardPayment;\r\n\r\n /// Extend the data object to personalize fields.\r\n angular.extend(baseClass.CreditCardProfile, new function CreditCardProfile() {\r\n this.ExpirationDate = new Date(pl.data.CreditCardInfo.CCExpYear.toActualYear(), pl.data.CreditCardInfo.CCExpMonth - 1, 1);\r\n this.ZipCode = pl.data.CreditCardInfo.CCZipCode;\r\n if (this.ZipCode.length > 5) {\r\n this.ZipCode = this.ZipCode.replace(\"-\", \"\");\r\n this.ZipCodeExtension = this.ZipCode.substr(5);\r\n //this.ZipCode = this.ZipCode.substr(0, 5);\r\n }\r\n //this.ZipCodeExtension = this.ZipCode.substr(5);\r\n this.CardType = GetNameCCType(pl.data.CardType);\r\n });\r\n // Store Credit Card Current Details into temporary variables\r\n angular.extend(baseClass.tempCardProfile, new function tempCardProfile() {\r\n this.ExpirationDate = new Date(pl.data.CreditCardInfo.CCExpYear.toActualYear(), pl.data.CreditCardInfo.CCExpMonth - 1, 1);\r\n this.ZipCode = pl.data.CreditCardInfo.CCZipCode;\r\n if (this.ZipCode.length > 5) {\r\n this.ZipCode = this.ZipCode.replace(\"-\", \"\");\r\n this.ZipCodeExtension = this.ZipCode.substr(5);\r\n }\r\n });\r\n\r\n baseClass.SaveProfile('TDC', true);\r\n\r\n break;\r\n case \"EC\":\r\n /// Set the data in profile variable.\r\n angular.copy(pl.data, baseClass.ECheckProfile);\r\n\r\n $rootScope.MaxPaymentAmount = pl.data.AdditionalSettings.MaxECheckPayment;\r\n\r\n /// Extend the data object to personalize fields.\r\n angular.extend(baseClass.ECheckProfile, new function ECheckProfile() {\r\n this.NameSuffixes = baseClass.NameSuffixes;\r\n this.ZipCode = pl.data.ECheckZipCode;\r\n if (this.ZipCode.length > 5) {\r\n this.ZipCode = this.ZipCode.replace(\"-\", \"\");\r\n this.ZipCodeExtension = this.ZipCode.substr(5);\r\n //this.ZipCode = this.ZipCode.substr(0, 5);\r\n }\r\n\r\n this.AccountName = genericService.nullToBlank(pl.data.FirstName, false) + genericService.nullToBlank(pl.data.MiddleName, false) + genericService.nullToBlank(pl.data.LastName, false) + genericService.nullToBlank(pl.data.Suffix, false);\r\n\r\n });\r\n\r\n baseClass.SaveProfile('ECard', true);\r\n\r\n break;\r\n }\r\n // Add this delay to allow the ng-models to have all data\r\n // before executing the trigger blur\r\n $timeout(function () {\r\n $('[name=\"editableForm\"]').trigger('blur');\r\n }, 200);\r\n }\r\n else {\r\n if (baseClass.fetchProfile.PaymentType == \"EC\") {\r\n baseClass.ECheckProfile.NameSuffixes = baseClass.NameSuffixes;\r\n } else {\r\n baseClass.CreditCardProfile.ExpirationDate = new Date();\r\n baseClass.tempCardProfile.ExpirationDate = new Date();\r\n }\r\n $('[name=\"hidePaymentLoading\"]').trigger('blur');\r\n }\r\n\r\n }, function (errorpl) {\r\n commonService.handleError(errorpl)\r\n $mdDialog.hide();\r\n });\r\n }\r\n\r\n this.UpdateBankAccountName = function () {\r\n this.ECheckProfile.AccountName = genericService.nullToBlank(this.ECheckProfile.FirstName, false) + genericService.nullToBlank(this.ECheckProfile.MiddleName, false) + genericService.nullToBlank(this.ECheckProfile.LastName, false) + genericService.nullToBlank(this.ECheckProfile.Suffix, false);\r\n }\r\n\r\n this.GetCCTypeDesc = function (cctype) {\r\n var result = 'that';\r\n\r\n if (cctype == 'visa') {\r\n result = 'Visa';\r\n }\r\n else if (cctype == 'mastercard') {\r\n result = 'Master Card';\r\n }\r\n else if (cctype == 'discover') {\r\n result = 'Discover';\r\n }\r\n else if (cctype == 'amex') {\r\n result = 'American Express';\r\n }\r\n\r\n return result;\r\n }\r\n this.checkHasChanges = function () {\r\n // Check if changes has been made\r\n $scope.tempExpMonth = (this.tempCardProfile.ExpirationDate === undefined) ? \"01\" : (this.tempCardProfile.ExpirationDate.getMonth() + 1).toString().padLeft(2, \"0\");\r\n $scope.tempExpYear = (this.tempCardProfile.ExpirationDate === undefined) ? ((new Date()).getFullYear() + 1).toString().toTwoDigitsYear() : this.tempCardProfile.ExpirationDate.getFullYear().toString().toTwoDigitsYear();\r\n $scope.cardExpMonth = (this.CreditCardProfile.ExpirationDate === undefined) ? \"01\" : (this.CreditCardProfile.ExpirationDate.getMonth() + 1).toString().padLeft(2, \"0\");\r\n $scope.cardExpYear = (this.CreditCardProfile.ExpirationDate === undefined) ? ((new Date()).getFullYear() + 1).toString().toTwoDigitsYear() : this.CreditCardProfile.ExpirationDate.getFullYear().toString().toTwoDigitsYear();\r\n\r\n if ((this.CreditCardProfile.CardName === this.tempCardProfile.CardName) &&\r\n (this.CreditCardProfile.CCNumber === this.tempCardProfile.CCNumber) &&\r\n (this.CreditCardProfile.ZipCode === this.tempCardProfile.ZipCode) &&\r\n ($scope.cardExpMonth === $scope.tempExpMonth) &&\r\n ($scope.cardExpYear === $scope.tempExpYear)) {\r\n this.CreditCardProfile.UpdateProfile = '0';\r\n $scope.hasChanges = false;\r\n } else {\r\n $scope.hasChanges = true;\r\n }\r\n }\r\n\r\n this.SaveProfile = function (pType, isValid) {\r\n this.checkHasChanges();\r\n switch (pType) {\r\n case 'TDC':\r\n var CreditCardDetails = {\r\n Number: (this.CreditCardProfile.CCNumber === undefined) ? 0 : this.CreditCardProfile.CCNumber,\r\n Name: (this.CreditCardProfile.CardName === undefined) ? \"\" : this.CreditCardProfile.CardName,\r\n Type: (this.CreditCardProfile.CardType === undefined) ? \"\" : GetNumberCCType(this.CreditCardProfile.CardType),\r\n ExpirationMonth: (this.CreditCardProfile.ExpirationDate === undefined) ? \"01\" : (this.CreditCardProfile.ExpirationDate.getMonth() + 1).toString().padLeft(2, \"0\"),\r\n ExpirationYear: (this.CreditCardProfile.ExpirationDate === undefined) ? ((new Date()).getFullYear() + 1).toString().toTwoDigitsYear() : this.CreditCardProfile.ExpirationDate.getFullYear().toString().toTwoDigitsYear(),\r\n ZipCode: (this.CreditCardProfile.ZipCode === undefined) ? \"\" : this.CreditCardProfile.ZipCode.substr(0, 5),\r\n ZipCodeExtension: (this.CreditCardProfile.ZipCode === undefined) ? \"\" : (this.CreditCardProfile.ZipCode.length > 5) ? this.CreditCardProfile.ZipCode.substr(6) : \"\",\r\n Address1: (this.CreditCardProfile.CCAddress1 === undefined) ? \"\" : this.CreditCardProfile.CCAddress1,\r\n Address2: \"\",\r\n City: (this.CreditCardProfile.CCCity === undefined) ? \"\" : this.CreditCardProfile.CCCity,\r\n State: (this.CreditCardProfile.CCState === undefined) ? \"\" : this.CreditCardProfile.CCState,\r\n CVV: (this.CreditCardProfile.CCVerifCode === undefined) ? \"\" : this.CreditCardProfile.CCVerifCode,\r\n UpdateProfile: (this.CreditCardProfile.UpdateProfile === undefined) ? '0' : this.CreditCardProfile.UpdateProfile,\r\n isValid: isValid\r\n };\r\n\r\n this.setProfile(CreditCardDetails);\r\n break;\r\n case 'ECard':\r\n this.ECheckProfile.isValid = isValid;\r\n this.setProfile(this.ECheckProfile);\r\n break;\r\n }\r\n }\r\n\r\n function confirmDelete() {\r\n var confirm = $mdDialog.confirm(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Delete Payment Profile')\r\n .textContent('Are you sure you want to delete this Payment Profile?')\r\n .ariaLabel('Delete Payment Profile')\r\n .ok('Yes')\r\n .cancel('No')\r\n .multiple(true);\r\n return $mdDialog.show(confirm);\r\n }\r\n\r\n this.deleteProfile = function (paymentType) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n confirmDelete().then(function () {\r\n baseClass.continueDeleteProfile(paymentType);\r\n }, function () {\r\n\r\n });\r\n });\r\n }\r\n\r\n this.continueDeleteProfile = function (paymentType) {\r\n genericService.post('Payments/PaymentProfile/Delete', this.ModFetchProfile)\r\n .then(function (pl) {\r\n $scope.hasPaymentProfile = false;\r\n\r\n if (paymentType == \"EC\") {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n clickOutsideToClose: false,\r\n title: \"Delete Payment Profile\",\r\n textContent: \"ECheck Payment Profile has been successfully deleted.\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n }\r\n else if (paymentType == \"CC\") {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n clickOutsideToClose: false,\r\n title: \"Delete Payment Profile\",\r\n textContent: \"Credit Card Payment Profile has been successfully deleted.\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n }\r\n },\r\n function (errorpl) {\r\n console.log(\"error: \" + errorpl);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * @ngdoc method\r\n * @name validateErrorForm\r\n * @author Juan Leon \r\n * @description Method used to popup a dialogbox with the detail of\r\n * the selected services that the client want to pay.\r\n **/\r\n this.validateErrorForm = function (editableForm) {\r\n editableForm.$setSubmitted();\r\n\r\n return angular.equals(editableForm.$error, {});\r\n };\r\n\r\n function GetNumberCCType(typeName) {\r\n var typeNumber;\r\n\r\n switch (typeName) {\r\n case \"visa\":\r\n typeNumber = \"01\";\r\n break;\r\n case \"mastercard\":\r\n typeNumber = \"02\";\r\n break;\r\n case \"discover\":\r\n typeNumber = \"03\";\r\n break;\r\n case \"amex\":\r\n typeNumber = \"04\";\r\n break;\r\n default:\r\n typeNumber = typeName;\r\n }\r\n\r\n return typeNumber;\r\n }\r\n function GetNameCCType(typeNumber) {\r\n var typeName;\r\n\r\n switch (typeNumber) {\r\n case \"01\":\r\n typeName = \"visa\";\r\n break;\r\n case \"02\":\r\n typeName = \"mastercard\";\r\n break;\r\n case \"03\":\r\n typeName = \"discover\";\r\n break;\r\n case \"04\":\r\n typeName = \"amex\";\r\n break;\r\n default:\r\n typeName = typeNumber;\r\n }\r\n\r\n return typeName;\r\n }\r\n\r\n }));\r\n\r\n function BlurInput(elementId) {\r\n var element = document.getElementById(elementId);\r\n if (this.isAdmin && element.value !== '') {\r\n element.disabled = true;\r\n }\r\n }\r\n function GetSaveProfileLabel() {\r\n var action = $scope.hasPaymentProfile ? \"Update\" : \"Store\";\r\n var paymentType = this.fetchProfile.PaymentType === \"CC\" ? \"Credit Card\" : \"Bank Account\";\r\n var label = action + \" \" + paymentType + \" \" + \"Information\";\r\n return label;\r\n }\r\n function EditInput(elementId) {\r\n var element = document.getElementById(elementId);\r\n var maskedInput = element.value;\r\n\r\n element.onfocus = function () { element.value = maskedInput; };\r\n element.disabled = false;\r\n element.focus();\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('PaymentDetailController', ['$mdDialog', '$state', '$mdMedia', 'paymentData', 'PaymentDetailService', 'PaymentContext', 'commonService', '$interval', '$rootScope', 'authService', PaymentDetailController]);\r\n\r\n /** @ngInject \r\n * @type: controller\r\n * @name: PaymentDetailController\r\n * @description: Used to control the functionality of detail payment proccess.\r\n **/\r\n\r\n function PaymentDetailController($mdDialog, $state, $mdMedia, paymentData, PaymentDetailService, PaymentContext, commonService, $interval, $rootScope, authService) {\r\n /// Variables\r\n var __this = this;\r\n\r\n /// Services Binding.\r\n PaymentDetailService.setPaymentDetail(paymentData);\r\n\r\n var isValidProfile = function () { return PaymentDetailService.isValid() };\r\n var getProfileDetail = function () { return PaymentDetailService.getPaymentProfile(); };\r\n var getIePad = function () { return calculateIEPad(); };\r\n\r\n /// Use angular.extend to encapsulate the logic of the controller into a class.\r\n angular.extend(this, {\r\n /// Bind Data.\r\n AccountServices: paymentData.AccountServices.getSelectedService(),\r\n BudgetLevelized: paymentData.BudgetLevelized,\r\n IsPPM: paymentData.IsPPM,\r\n showNote: paymentData.showNote,\r\n\r\n /// Configuration Data.\r\n CCParameters: PaymentContext.Parameters,\r\n dtOptions: { dom: 'lrtip', paging: false, responsive: false, scroller: false, processing: true, info: false, },\r\n customFullscreen: $mdMedia('xs') || $mdMedia('sm'),\r\n deviceDetails: { DeviceType: \"BPP\", HardwareId: \"\" },\r\n paymentType: (paymentData.type == 1 ? \"CC\" : \"EC\"),\r\n profileURL: (paymentData.type == 1) ? \"creditCard.html\" : \"eCheck.html\",\r\n title: paymentData.title,\r\n activated: false,\r\n PastDueOn: false,\r\n\r\n /// Methods.\r\n isValid: function () {\r\n return isValidProfile() && (this.AccountServices != null && this.AccountServices.PaymentDetails != null && this.AccountServices.PaymentDetails.totalAmount > 0);\r\n },\r\n isPaymentProcessing: false,\r\n paymentLabel: 'Pay Now',\r\n closeDialog: CloseDialog,\r\n loadForm: LoadForm,\r\n calculateConvFee: CalculateConvFee,\r\n reCalculateConvFee: ReCalculateConvFee,\r\n payBill: PayBill,\r\n getProfileData: function () { return getProfileDetail() },\r\n model: { paymentDetailLoading: true, isCalculating: true },\r\n ieCss: \"1px !important\",\r\n validateKey: validateKey\r\n });\r\n\r\n __this.applyChange = function () {\r\n PaymentAmountChanged();\r\n ReCalculateConvFee();\r\n }\r\n\r\n //__this.model = { paymentDetailLoading: true };\r\n /* THIS IS TO DYNAMICALLY SET THE CSS FOR IE DEPENDING ON NUMBER OF SERVICES */\r\n function calculateIEPad(multiplier) {\r\n __this.ieCss = (multiplier * 50 + 60) + \"px !important\"\r\n }\r\n /// Internal Functions.\r\n /**\r\n * @ngdoc method\r\n * @name CloseDialog\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function CloseDialog() {\r\n __this.AccountServices = [];\r\n $mdDialog.cancel();\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name LoadForm\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function LoadForm() {\r\n if ($rootScope.Parameters.FourthParameters.FOURTHPARM_62 == 1) {\r\n __this.PastDueOn = true;\r\n }\r\n CalculatePPMPayment();\r\n CalculateConvFee();\n __this.balanceWidth = commonService.getNumericColumnWidth(__this.AccountServices, \"Balance\", 0, 46.08);\r\n __this.pastDueWidth = commonService.getNumericColumnWidth(__this.AccountServices, \"PastDue\", 0, 51.55);\r\n }\r\n\r\n function CalculatePPMPayment() {\r\n if (__this.IsPPM) {\r\n\r\n var total = 0;\r\n angular.forEach(__this.AccountServices, function (service, key) {\r\n if (service.PPMPaymentNeeded !== 0 && service.PPMPaymentNeeded !== null) {\r\n service.SubTotal = service.PPMPaymentNeeded;\r\n }\r\n else if (service.PPMPaymentNeeded === 0 || service.PPMPaymentNeeded === null) {\r\n service.SubTotal = 0.00;\r\n }\r\n total += service.SubTotal;\r\n });\r\n __this.AccountServices.PaymentDetails.totalAmount = total;\r\n }\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name CalculateConvFee\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function CalculateConvFee() {\r\n var AccountDetail = __this.AccountServices.getAccountDetails();\r\n __this.AccountServices.loadConvenienceFee(AccountDetail, __this.deviceDetails, __this.paymentType);\r\n calculateIEPad(__this.AccountServices.length);\r\n }\r\n function ReCalculateConvFee(isPaymentProcessing) {\r\n __this.model.paymentDetailLoading = true;\r\n CalculateConvFee();\r\n\r\n // This checks if the calculation for conv fee is done.\r\n // Also checks if the DOM has been updated to finish loading screen.\r\n var forLoading = $interval(function () {\r\n if (!isPaymentProcessing) {\r\n __this.model.paymentDetailLoading = false;\r\n __this.model.isCalculating = false;\r\n $interval.cancel(forLoading);\r\n }\r\n }, 500);\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name PayBill\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function PayBill() {\r\n __this.isPaymentProcessing = true;\r\n __this.model.paymentDetailLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n if (__this.isValid()) {\r\n var accountNumber = (__this.getProfileData().Number) ? __this.getProfileData().Number.toMask() : __this.getProfileData().RoutingNumber.toMask();\r\n ReCalculateConvFee(__this.isPaymentProcessing = true);\r\n\r\n if (accountNumber == \"\") {\r\n showAlert('Warning', 'You must insert an account number to proceed to pay, please check your user profile data and try again.');\r\n StopPaymentProcessState();\r\n }\r\n else if (parseFloat(__this.AccountServices.PaymentDetails.totalAmount) > parseFloat($rootScope.MaxPaymentAmount)) {\r\n showValidation('Invalid Amount', 'Payment Amount should not exceed $' + $rootScope.MaxPaymentAmount);\r\n StopPaymentProcessState();\r\n }\r\n else {\r\n showConfirm(\"Confirm payment process\", (__this.AccountServices.PaymentDetails.convenienceFee == 0 ? \"\" : \"A convenience fee of $\" + __this.AccountServices.PaymentDetails.convenienceFee + \" will be added to your $\" + parseFloat(__this.AccountServices.PaymentDetails.totalAmount).toFixed(2) + \" payment amount. \") + \"Are you sure you want to pay the total amount of $\" + parseFloat(__this.AccountServices.PaymentDetails.totalPaymentAmount).toFixed(2) + \"?\").then(function () {\r\n var objData = {\r\n Accounts: __this.AccountServices.getAccounts(),\r\n PaymentDetails: __this.AccountServices.PaymentDetails,\r\n CreditCardDetails: getProfileDetail(),\r\n ECheckDetails: getProfileDetail(),\r\n DeviceDetails: __this.deviceDetails,\r\n };\r\n __this.paymentLabel = 'Processing...';\r\n PaymentContext.payBill(objData, __this.paymentType).then(function (data) {\r\n var PaymentResult = data.data;\r\n\r\n if (PaymentResult.ApprovalCode && PaymentResult.ApprovalCode.toString().replace('~~', '') != '') {\r\n $mdDialog.hide(PaymentResult.ApprovalCode);\r\n showReceipt(PaymentResult.ApprovalCode);\r\n } else {\r\n if (!PaymentResult.Status) {\r\n showAlert('Payment Failed', 'Your payment did not complete successfully. Please try again.');\r\n }\r\n else {\r\n if (PaymentResult.Status.toUpperCase() == \"FAILED\" || PaymentResult.Status.toUpperCase() == \"ERROR\") {\r\n if (__this.paymentType == 'CC') {\r\n showAlert('Payment Failed', 'Your payment did not complete successfully. Please try again.');\r\n }\r\n else {\r\n showAlert('Payment Failed', 'Unable to Process E-check Payment. Please contact the utility for assistance.');\r\n }\r\n }\r\n else {\r\n if (__this.paymentType == 'CC') {\r\n showAlert('Payment Failed', 'Your credit card was declined. Please ensure that the information is correct and try again, or enter new card information.');\r\n }\r\n else {\r\n showAlert('Payment Failed', 'Your E-Check was declined. Please ensure that the information is correct and try again, or enter new E-Check information.');\r\n }\r\n }\r\n }\r\n StopPaymentProcessState();\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n StopPaymentProcessState();\r\n });\r\n }, function () {\r\n StopPaymentProcessState();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n function showAlert(title, messages, ev) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(messages)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n .targetEvent(ev)\r\n );\r\n }\r\n\r\n function showConfirm(title, messages, ev) {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var confirm = $mdDialog.confirm(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title(title)\r\n .textContent(messages)\r\n .ariaLabel(title)\r\n .targetEvent(ev)\r\n .ok('Ok')\r\n .cancel('Cancel')\r\n .multiple(true);\r\n\r\n return $mdDialog.show(confirm);\r\n }\r\n\r\n function showValidation(title, messages, ev) {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title(title)\r\n .textContent(messages)\r\n .ariaLabel(title)\r\n .targetEvent(ev)\r\n .ok('Ok')\r\n .multiple(true);\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n function showReceipt(ApprovalCode, ev) {\r\n var data = {\r\n title: ApprovalCode,\r\n PaymentDetails: __this.AccountServices.PaymentDetails,\r\n AccountDetails: __this.AccountServices.getAccountDetails(),\r\n isByService: __this.AccountServices.isByService,\r\n };\r\n\r\n $mdDialog.show({\r\n templateUrl: 'app/main/msportal/views/payment/receipt/payment_receipt.html',\r\n controller: \"PaymentReceiptController as vm\",\r\n locals: { detail: data },\r\n fullscreen: ($mdMedia('sm') || $mdMedia('xs')) && __this.customFullscreen,\r\n parent: angular.element(document.body),\r\n targetEvent: ev,\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n });\r\n }\r\n function StopPaymentProcessState() {\r\n if (__this.model.paymentDetailLoading === true) {\r\n __this.model.paymentDetailLoading = false;\r\n }\r\n if (__this.isPaymentProcessing === true) {\r\n __this.isPaymentProcessing = false;\r\n }\r\n if (__this.paymentLabel !== 'Pay Now') {\r\n __this.paymentLabel = 'Pay Now';\r\n }\r\n }\r\n\r\n function validateKey(e, objectId) {\r\n if (e.keyCode === 13) {\r\n if (objectId == 0) {\r\n $('[name=\"byService\"]').trigger('blur');\r\n } else {\r\n $('[name=\"byAccount\"]').trigger('blur');\r\n }\r\n }\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('UsagechartsController', UsagechartsController);\r\n\r\n /** @ngInject */\r\n //function UsagechartsController() {\r\n function UsagechartsController($mdSidenav, $window) {\r\n $window.document.title = \"Usage Charts - \" + document.getElementById(\"title\").title;\r\n\r\n var vm = this;\r\n\r\n vm.menuItems = [\r\n \"Daily\",\r\n \"Monthly\",\r\n \"Interval\"\r\n ];\r\n\r\n vm.selectedItem = vm.menuItems[0];\r\n\r\n /**\r\n * Toggle sidenav\r\n *\r\n * @param sidenavId\r\n */\r\n function toggleSidenav(sidenavId) {\r\n $mdSidenav(sidenavId).toggle();\r\n }\r\n\r\n // Functions\r\n vm.switchItem = switchItem;\r\n vm.toggleSidenav = toggleSidenav;\r\n\r\n function switchItem(item) {\r\n vm.selectedItem = item;\r\n }\r\n\r\n }\r\n\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('UsageController', UsageController, function ($scope) { });\r\n\r\n\r\n /** @ngInject */\r\n function UsageController($scope, genericService, $state, DTOptionsBuilder, $mdDialog, $rootScope, $sce, $window, $log, commonService, authService) {\r\n var serviceController = 'Bills/';\n $window.document.title = \"Bill History - \" + document.getElementById(\"title\").title;\r\n $scope.BillHistory = [];\r\n $scope.MemberNo = $state.params.id;\r\n $scope.EDelinquentEnabled = '0';\r\n var curYear = new Date().getFullYear();\r\n var curMon = new Date().getMonth() + 1;\r\n $scope.getMaxDate = new Date(curYear, curMon, 0);\r\n $scope.IsPPM = false;\r\n $scope.dateLocale = commonService.dateLocaleByMonth;\r\n $scope.StartDate = new Date();\r\n $scope.EndDate = new Date();\r\n var mobileDirectory;\r\n\r\n CheckEDelinquentEnabled();\r\n CheckPPMStatus();\r\n LoadRecordsBills();\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n\r\n function LoadRecordsBills() {\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet_bills = genericService.get(serviceController + $scope.MemberNo);\r\n\r\n promiseGet_bills.then(function (pl) {\r\n $scope.BillHistory = pl.data;\r\n if ($scope.BillHistory.length > 0) {\r\n\r\n var sBillMoYr = $scope.BillHistory[$scope.BillHistory.length - 1].BillDate;\r\n $scope.StartDate = ConstructDate(sBillMoYr);\r\n var eBillMoYr = $scope.BillHistory[0].BillDate;\r\n $scope.EndDate = ConstructDate(eBillMoYr);\r\n }\n $scope.balanceWidth = commonService.getNumericColumnWidth($scope.BillHistory, \"Balance\", 0, 67);\r\n $rootScope.rootscopeLoading = false;\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Bill History', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n function CheckPPMStatus() {\r\n var promiseGet = genericService.get('Account/Services/' + $scope.MemberNo);\r\n promiseGet.then(function (pl) {\r\n\r\n if (pl.data.IsPPM === \"P\") {\r\n $scope.IsPPM = true;\r\n } else {\r\n $scope.IsPPM = false;\r\n }\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl);\r\n $log.error('failure loading Services', errorPl);\r\n })\r\n }\r\n\r\n function ConstructDate(BillMoYr) {\r\n var result = null;\r\n if (BillMoYr.substr(BillMoYr.length - 2, 2) > curYear.toString().substr(2, 2)) {\r\n result = new Date('19' + BillMoYr.substr(BillMoYr.length - 2, 2), BillMoYr.substr(0, 2) - 1, 1);\r\n }\r\n else {\r\n result = new Date('20' + BillMoYr.substr(BillMoYr.length - 2, 2), BillMoYr.substr(0, 2) - 1, 1);\r\n }\r\n return result;\r\n }\r\n\r\n\r\n function alertDialog(title, content) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n );\r\n }\r\n\r\n $scope.ReloadRecords = function () {\r\n LoadRecordsBills();\r\n }\r\n\r\n $scope.LoadRecordsByDateRangeBills = function (startDate, endDate) {\r\n if (startDate == \"\" || endDate == \"\" || !(startDate) || !(endDate)) {\r\n alertDialog('Invalid Input', 'Please enter value for both Start and End dates and Start/End Date must be less than the Date today.');\r\n }\r\n else {\r\n var startYear = startDate.getFullYear().toString();\r\n var sYear = startYear.substr(startYear.length - 2, 2);\r\n var dateFrom = sYear + ('00' + (startDate.getMonth() + 1)).slice(-2);\r\n var endYear = endDate.getFullYear().toString();\r\n var eYear = endYear.substr(endYear.length - 2, 2);\r\n var dateTo = eYear + ('00' + (endDate.getMonth() + 1)).slice(-2);\r\n\r\n var dateToday = new Date();\r\n var yearToday = dateToday.getFullYear().toString();\r\n var tYear = yearToday.substr(yearToday.length - 2, 2);\r\n var dateNow = tYear + ('00' + (dateToday.getMonth() + 1)).slice(-2);\r\n\r\n if ((dateFrom > dateTo && startYear >= endYear) || startYear > endYear) {\r\n alertDialog('Invalid Input', 'Start date must be less than the End date.');\r\n }\r\n else if (dateTo > dateNow && endYear >= yearToday) {\r\n alertDialog('Invalid Input', 'End date must be less than the Date today.');\r\n }\r\n else {\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get(serviceController + $scope.MemberNo + '/' + dateFrom + dateTo);\r\n promiseGet.then(function (pl) {\r\n $scope.BillHistory = pl.data;\r\n if ($scope.BillHistory.length <= 0) {\r\n alertDialog('No results found', 'No billing history found for the specified dates.');\r\n }\r\n $rootScope.rootscopeLoading = false;\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Bill History', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }\r\n }\r\n };\r\n\r\n $scope.dtOptions = {\r\n dom: 'Irtip',\r\n paging: false,\r\n responsive: false,\r\n scroller: false,\r\n processing: true,\r\n info: false,\r\n order: [0, 'desc'],\r\n columnDefs: [\r\n {\r\n // Target the id column\r\n targets: 0,\r\n responsivePriority: 1\r\n },\r\n {\r\n // Target the actions column\r\n targets: 3,\r\n responsivePriority: 2\r\n }],\r\n\r\n \r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n function CheckEDelinquentEnabled() {\r\n\r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n if ($rootScope.smartAppConfig[x].ConfigId == '51') {\r\n $scope.EDelinquentEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n }\r\n }\r\n\r\n $scope.ViewPDF = function (billdate, suffix) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $rootScope.rootscopeLoading = true;\r\n $scope.isLoading = true;\r\n\r\n var promiseGet = genericService.get('Bills/' + parseInt($scope.BillHistory[0].MbrSep) + suffix + '/PDF/' + billdate.replace(/\\//g, '-'));\r\n promiseGet.then(function (pl) {\r\n var pdfResult = pl.data;\r\n if (pdfResult.successFlag === false) {\r\n $scope.isLoading = false;\r\n $rootScope.rootscopeLoading = false;\r\n showAlert('Cannot Load PDF!', pdfResult.DisplayMessage);\r\n }\r\n\r\n else {\r\n if (!pdfResult.pdfBytes) {\r\n $scope.isLoading = false;\r\n $rootScope.rootscopeLoading = false;\r\n showAlert('Cannot Load PDF!', \"PDF is not yet available for the selected billdate.\");\r\n }\r\n else {\r\n // Decode the 64string\r\n var byteCharacters = atob(pdfResult.pdfBytes);\r\n // Convert to bytes\r\n var byteNumbers = new Array(byteCharacters.length);\r\n for (var i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n var byteArray = new Uint8Array(byteNumbers);\r\n\r\n // become a blob. :O\r\n var actualPdfFile = new Blob([byteArray], { type: \"application/pdf\" });\r\n var fileURL = URL.createObjectURL(actualPdfFile);\r\n $scope.isLoading = false;\r\n $rootScope.rootscopeLoading = false;\r\n\r\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\r\n window.navigator.msSaveOrOpenBlob(actualPdfFile); //FOR IE\r\n }\r\n else {\r\n window.open(fileURL);\r\n }\r\n\r\n $scope.content = $sce.trustAsResourceUrl(fileURL);\r\n }\r\n }\r\n }, function (errorPl) { //If something occured while loading the PDF\r\n $log.error('failure loading Bill History', errorPl);\r\n commonService.handleError(errorPl)\r\n })\r\n });\r\n };\r\n\r\n function showAlert(title, messages, ev) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(messages)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n .targetEvent(ev)\r\n );\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('ServicesController', ServicesController, function ($scope) { });\r\n\r\n /** @ngInject */\r\n \r\n\r\n function ServicesController($scope, genericService, $http, $state, $rootScope, authService, $log)\r\n {\r\n var __this = this;\r\n var vm = this;\r\n vm.ccDraft = ccDraft\n vm.bankDraft = bankDraft;\r\n\r\n angular.extend(this, {\r\n /// Binding Data.\r\n ProfileStat: 0,\r\n BillHistStat:0,\n PaymentHistStat: 0,\r\n UsageGraphStat: 0,\r\n EbillEnabled: 0,\r\n AlertsEnabled: 0,\r\n CCDraftsEnabled: 0,\r\n BankDraftsEnabled: 0,\r\n EDelinquentEnabled: 0,\r\n DepositsEnabled: 0,\r\n BudgetBillEnabled: 0,\r\n LevelizedBillEnabled: 0,\r\n\r\n /// Methods.\r\n GetSettings: getSettings,\r\n SetSmartAppConfig: SetSmartAppConfig,\r\n SelectedAccount: authService.accountsList,\r\n hasAlert: $rootScope.hasAlert\r\n })\r\n\r\n $rootScope.$on('setCurrentTabIndex', function (event, tabIndex) {\r\n __this.tabIndex = tabIndex;\r\n })\r\n\r\n function SetSmartAppConfig() {\r\n \r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n if ($rootScope.smartAppConfig[x].ConfigId == '52') {\r\n __this.ProfileStat = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '8') {\r\n __this.BillHistStat = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '53') {\r\n __this.PaymentHistStat = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '58') {\r\n __this.UsageGraphStat = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '50') {\r\n __this.EbillEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '51') {\r\n __this.EDelinquentEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '59') {\r\n __this.AlertsEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '87') {\r\n __this.CCDraftsEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '88') {\r\n __this.BankDraftsEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '107') {\r\n __this.DepositsEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '48') {\r\n __this.LevelizedBillEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '49') {\r\n __this.BudgetBillEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n } \r\n }\r\n function ccDraft() {\r\n $state.go('app.msportal.accounts.detail.ccDraft');\r\n }\r\n function bankDraft() {\r\n $state.go('app.msportal.accounts.detail.bankDraft');\r\n }\r\n function getSettings() {\r\n\r\n if (!$rootScope.smartAppConfig) {\r\n var promiseGet = genericService.get(\"Settings?DeviceType=WEBOS&HardwareId=\");\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.Parameters = pl.data.Response;\r\n $rootScope.Parameters['ShowConvCCFlag'] = pl.data.ShowConvCCFlag;\r\n $rootScope.Parameters['ShowConvECFlag'] = pl.data.ShowConvECFlag;\r\n\r\n var promiseGetConfig = genericService.get('SmartAppConfig/');\r\n promiseGetConfig.then(function (pl) {\r\n $rootScope.smartAppConfig = pl.data;\r\n SetSmartAppConfig();\r\n },\r\n function (errorPl) {\r\n $log.error('failure loading Offices', errorPl);\r\n })\r\n },\r\n function (errorPl) {\r\n $log.error('failure loading Settings', errorPl);\r\n })\r\n\r\n }\r\n else {\r\n SetSmartAppConfig();\r\n }\r\n }\r\n \r\n \r\n ///**\r\n // * Go to products page\r\n // */\r\n function gotoAccounts()\r\n {\r\n $state.go('app.msportal.accounts');\r\n }\r\n\r\n\r\n }\r\n})();\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('ServiceDetailsController', ServiceDetailsController)\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n\r\n /** @ngInject */\r\n function ServiceDetailsController($scope, genericService, $http, $state, DTOptionsBuilder, $log, $mdDialog, $cacheFactory, $rootScope, commonService, authService, $window) {\r\n $window.document.title = \"Service Details - \" + document.getElementById(\"title\").title;\r\n var serviceController = 'Account/Services/';\r\n var httpCache = $cacheFactory.get('$http');\r\n var roundupOptInMessage = 'Confirm your enrollment into the Round Up Billing Program. ' +\r\n 'Changes will be reflected on your next bill. You can opt-out again at any time.';\r\n var roundupOptOutMessage = 'Confirm your withdrawal from the Round Up Billing Program. ' +\r\n 'Changes will be reflected on your next bill. You can opt-in again at any time.';\r\n var __this = this;\r\n\r\n ///$scope variables\r\n $scope.roundupInformation = 'By enrolling in round up billing, all bills on this ' +\r\n 'account will be rounded to the nearest whole dollar amount. To opt-in or opt-out ' +\r\n 'of the program at any time, select the \\'Enroll in Round Up\\' or \\'Opt out of Round Up\\' hyperlinks. ' +\r\n 'Changes will be reflected on your next bill.';\r\n\r\n $scope.param98 = false;\r\n\r\n angular.extend(this, {\r\n /// Binding Data.\r\n Service: {},\r\n MemberNo: $state.params.id,\r\n IsPPM: false,\r\n PastDueOn: false,\r\n dtOptions: {\r\n dom: 'lrtip', paging: false, scroller: false, processing: true, info: false,\r\n language: {\r\n \"emptyTable\": \"Loading\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n },\r\n\r\n /// Methods.\r\n displayMessage: DisplayMessage,\r\n roundupBillingProcess: RoundupBillingProcess,\r\n LoadRecordsServ: LoadRecordsServ\r\n });\r\n\r\n // #region Functions\r\n function confirmMessage(title, content, OkButton) {\r\n\r\n var confirm = $mdDialog.confirm(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(false)\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok(OkButton)\r\n .cancel('Cancel')\r\n .multiple(true);\r\n\r\n return $mdDialog.show(confirm);\r\n }\r\n function DisplayMessage(title, text, command) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(false)\r\n .title(title)\r\n .textContent(text)\r\n .ariaLabel(title)\r\n .ok(command));\r\n }\r\n function LoadRecordsServ() {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n authService.authentication.isCalled = true;\r\n httpCache.remove($rootScope.serviceBase + \"Account/Services/\" + __this.MemberNo);\r\n\r\n genericService.get(serviceController + __this.MemberNo).then(function (pl) {\r\n __this.Service = pl.data;\r\n __this.IsPPM = pl.data.IsPPM === 'P';\r\n __this.BudgetLevelized = pl.data.BillCode;\r\n if (pl.data.ppmLabel != \"\" && pl.data.ppmMinPayment != 0) {\r\n __this.ppmLabel = RephrasePPMPaymentLabel(pl.data.ppmLabel);\r\n __this.ppmMinPayment = pl.data.ppmMinPayment;\r\n }\r\n if (pl.data.Services) {\r\n if (pl.data.Services.length < 1) {\r\n __this.dtOptions.language.emptyTable = \"No records have been found\";\r\n }\r\n }\r\n if ($rootScope.Parameters != undefined && $rootScope.Parameters.FourthParameters != undefined && $rootScope.Parameters.FourthParameters.FOURTHPARM_62 != undefined && $rootScope.Parameters.FourthParameters.FOURTHPARM_62 == 1) {\r\n __this.PastDueOn = true;\r\n }\r\n __this.roundupBill = __this.Service.RoundUpBill === '00' ? true : false;\r\n __this.roundupBillContent = __this.roundupBill === true ? 'Opt out of Round Up' : 'Enroll in Round Up';\r\n $scope.param98 = $rootScope.Parameters.Parameters.COOPPARM_98 !== 0 ? true : false;\r\n\r\n $scope.balanceWidth = commonService.getNumericColumnWidth(__this.Service.Services, \"Balance\", 0, 68);\r\n $scope.pastDueWidth = commonService.getNumericColumnWidth(__this.Service.Services, \"PastDue\", 0, 73);\r\n $rootScope.rootscopeLoading = false;\r\n }, function (errorPl) {\r\n if (errorPl) {\r\n if (errorPl.status != 500) {\r\n __this.dtOptions.language.emptyTable = \"Error loading records.\";\r\n }\r\n }\r\n commonService.handleError(errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n });\r\n }\r\n function RoundupBillingProcess() {\r\n $rootScope.rootscopeLoading = true;\r\n if (__this.roundupBill === true) {\r\n confirmMessage('Round Up Billing Opt-Out Confirmation', roundupOptOutMessage, 'OK').then(function () {\r\n __this.PayType = '01';\r\n genericService.post('Account/ModifyRoundUpBilling/' + __this.MemberNo + '/' + __this.PayType + __this.Service.Services.length).then(function (pl) {\r\n if (pl.data) {\r\n $state.go($state.current, {}, { reload: true });\r\n }\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }, function () {\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }\r\n else {\r\n confirmMessage('Round Up Billing Enrollment Confirmation', roundupOptInMessage, 'OK').then(function () {\r\n __this.PayType = '00';\r\n genericService.post('Account/ModifyRoundUpBilling/' + __this.MemberNo + '/' + __this.PayType + __this.Service.Services.length).then(function (pl) {\r\n if (pl.data) {\r\n $state.go($state.current, {}, { reload: true });\r\n }\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }, function () {\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }\r\n }\r\n function RephrasePPMPaymentLabel(label) {\r\n var newLabel = \"\";\r\n if (label == \"Min Payment to Stay connected:\") {\r\n newLabel = \"Minimum Payment to Stay Connected on Prepaid:\";\r\n } else if (label == \"Min Payment to Get Reconnected:\") {\r\n newLabel = \"Minimum Payment to Get Reconnected:\";\r\n } else if (label == \"Payment to Reach Min PPM Bal:\") {\r\n newLabel = \"Payment to Reach Minimum Prepaid Balance:\";\r\n } else if (label == \"Min Payment to Stay connected on PPM:\") {\r\n newLabel = \"Minimum Payment to Stay Connected on Prepaid:\";\r\n }\r\n return newLabel;\r\n }\r\n // #endregion Functions\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('ProfileController', ['$state', '$mdDialog', 'aaNotify', 'EntitiesValidators', '$window', '$scope', '$rootScope', 'ProfileContext', 'commonService', '$cacheFactory', 'authService', ProfileController])\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n\r\n\r\n /** @ngInject\r\n * @ngdoc controller\r\n * @name ProfileController\r\n * @requires $state\r\n * @requires $mdDialog\r\n * @requires EntitiesValidators\r\n * @requires ProfileContext\r\n * @description Controller used to interact with Account Profile screen.\r\n */\r\n function ProfileController($state, $mdDialog, aaNotify, EntitiesValidators, $window, $scope, $rootScope, ProfileContext, commonService, $cacheFactory, authService) {\r\n $window.document.title = \"Profile - \" + document.getElementById(\"title\").title;\n\n /// Variables\r\n var __this = this;\r\n var httpCache = $cacheFactory.get('$http');\r\n \r\n RemoveMaskAttributes();\r\n\r\n /// Controller Definition.\r\n angular.extend(this, {\r\n /// Binding Objects.\r\n Model: {},\r\n ModifiedModel: {},\r\n stateDataList: [],\r\n streetDataList: [],\r\n nameSufDataList: [],\r\n dirCardinalsDataList: [],\r\n Validators: EntitiesValidators.data,\r\n memberSep: \"\",\r\n Form: {\r\n isSave: false,\r\n },\r\n MemberNo: $state.params.id,\r\n keyCode: null,\r\n\r\n /// Methods.\r\n initForm: LoadForm,\r\n saveChanges: SaveForm,\r\n cancelForm: CancelForm,\r\n editForm: EditForm,\r\n closeNotify: CloseNotify,\r\n checkNotify: CheckNotify,\r\n checkState: CheckState,\r\n checkSave: CheckSave,\n checkStrNo: CheckStrNo,\r\n errorList: ErrorList,\r\n formatValues: FormatValues,\r\n formatPhone: FormatPhone,\r\n formatZipCode: FormatZipCode,\r\n getKeyCode: GetKeyCode,\r\n reformatPhone: ReformatPhone,\r\n reformatZipCode: ReformatZipCode,\r\n removeMask: RemoveMaskAttributes,\r\n setFocus: SetFocus,\r\n trimValues: TrimValues,\n getAbbrev: GetAbbreviation\r\n });\r\n $scope.errorClose = false;\n $scope.saveCounter = 0;\r\n $scope.stateCounter = 0;\n $scope.POBoxExist = false;\r\n $scope.$watchGroup(['vm.Model.dirpref', 'vm.Model.dirsuf', 'vm.Model.state'], function () {\r\n if (__this.Model.dirpref !== undefined) {\r\n GetAbbreviation(__this.Model.dirpref, 'dirpref');\r\n }\r\n if (__this.Model.dirsuf !== undefined) {\r\n GetAbbreviation(__this.Model.dirsuf, 'dirsuf');\r\n }\r\n if (__this.Model.state !== undefined) {\r\n GetAbbreviation(__this.Model.state, 'state');\r\n }\r\n });\n\r\n /// Internal Functions\n /**\r\n * @ngdoc internal function\r\n * @name CancelForm\r\n * @author Juan Leon \r\n * @param {BodyElement=form} \r\n * @description Internal Function used to cancelling the operation from the screen.\r\n */\r\n function CancelForm(Form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n var _Form = Form;\r\n _Form.$aaFormExtensions.$reset().then(\r\n function Ok(resp) {\r\n if (resp) {\r\n _Form.$editMode = false;\r\n $scope.stateCounter = 0;\r\n $scope.saveCounter = 0;\r\n $scope.errorClose = false;\r\n LoadForm(Form);\r\n }\r\n }\r\n );\r\n });\r\n }\n function CheckNotify() {\r\n $scope.errorClose = false;\r\n }\n function CheckSave() {\r\n $scope.saveCounter = 1;\r\n $scope.errorClose = false;\r\n }\n function CheckState() {\r\n $scope.stateCounter += 1;\r\n $scope.errorClose = false;\r\n }\r\n function CloseNotify() {\r\n $scope.errorClose = true;\r\n }\n function CheckStrNo(street) {\r\n street = (street.replace(/[ ,.]/g, \"\")).toUpperCase();\r\n if (street.includes(\"POBOX\")) {\r\n $scope.POBoxExist = true;\r\n }\r\n else {\r\n $scope.POBoxExist = false;\r\n }\r\n }\n function DisplayMessage(title, text, command) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .title(title)\r\n .textContent(text)\r\n .ariaLabel(title)\r\n .ok(command));\r\n }\n function EditForm(form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n form.$editMode = true\r\n });\r\n }\n function ErrorList() {\r\n var name = document.getElementById('errorLi').innerText;\r\n if (!name) {\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\n function EvaluateParam35() {\n // Exempt Portal Admin in Change Profile Request.\r\n var param35 = $rootScope.Parameters.InternetParameters.INT_COOPPARM_35;\r\n return authService.adminAuthentication.roleType === 'Admin' ? 2 : param35;\r\n }\n function FormatPhone(phoneNo) {\r\n var newValue = '';\r\n if (phoneNo === null || phoneNo.length === 0) {\r\n newValue = '';\r\n } else if (phoneNo.length <= 2) {\r\n newValue = '(' + phoneNo;\r\n } else if (phoneNo.length === 3) {\r\n newValue = '(' + phoneNo + ')';\r\n } else if (phoneNo.length > 3 && phoneNo.length <= 6) {\r\n newValue = '(' + phoneNo.substring(0, 3) + ')' + phoneNo.substring(3);\r\n } else if (phoneNo.length > 6) {\r\n newValue = '(' + phoneNo.substring(0, 3) + ')' + phoneNo.substring(3, 6) + '-' + phoneNo.substring(6);\r\n } else {\r\n newValue = model;\r\n }\r\n return newValue;\r\n }\r\n function FormatValues() {\r\n __this.Model.homePhone = __this.formatPhone(__this.Model.homePhone);\r\n __this.Model.businessPhone = __this.formatPhone(__this.Model.businessPhone);\r\n __this.Model.OtherPhoneNumber = __this.formatPhone(__this.Model.OtherPhoneNumber);\r\n __this.Model.cellPhoneNumber = __this.formatPhone(__this.Model.cellPhoneNumber);\r\n __this.Model.pagerNumber = __this.formatPhone(__this.Model.pagerNumber);\r\n __this.Model.faxNumber = __this.formatPhone(__this.Model.faxNumber);\r\n __this.Model.zip = __this.formatZipCode(__this.Model.zip);\n __this.Model.dirpref = __this.getAbbrev(__this.Model.dirpref, 'dirpref');\r\n __this.Model.dirsuf = __this.getAbbrev(__this.Model.dirsuf, 'dirsuf');\r\n __this.Model.state = __this.getAbbrev(__this.Model.state, 'state');\r\n }\r\n function FormatZipCode(zipCode) {\r\n var newValue = zipCode;\r\n if (zipCode === null) {\r\n newValue = '';\r\n } else if (zipCode.length !== 5) {\r\n if (zipCode.substring(6) === '0000') {\r\n newValue = zipCode.substring(0, 5);\r\n }\r\n }\r\n return newValue;\r\n }\n function GetAbbreviation(abbrev, id) {\r\n var fieldId = document.getElementById(id);\r\n var element = fieldId.firstChild.firstChild.firstChild.nextSibling.nextSibling.firstChild;\r\n element.textContent = abbrev;\r\n return element.textContent;\r\n }\r\n function GetKeyCode($event) {\r\n __this.keyCode = $event.keyCode;\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name CancelForm\r\n * @author Juan Leon \r\n * @description Internal Function used to load the account profile data from the back-end.\r\n */\r\n function LoadForm(Form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n var _Form = Form;\r\n $rootScope.rootscopeLoading = true;\r\n\r\n /// First it get the Member Sep.\r\n ProfileContext.GetMemberSep($state.params.id).then(function (data) {\r\n __this.memberSep = data.data.Services[0].MemberSep.replace($state.params.id, ($state.params.id + \"-\"));\r\n\r\n /// Then it find the Account Profile\r\n httpCache.remove($rootScope.serviceBase + 'AccountsProfiles/' + __this.memberSep);\r\n ProfileContext.GetAccountProfile(__this.memberSep).then(function (response) {\r\n __this.Model = response.data;\r\n __this.formatValues();\r\n __this.Model.param35 = EvaluateParam35().toString();\n CheckStrNo(__this.Model.street);\r\n _Form.$aaFormExtensions.$resetChanged();\r\n $rootScope.rootscopeLoading = false;\r\n }, function (error) {\r\n commonService.handleError(error);\r\n __this.Model = undefined;\r\n _Form.$aaFormExtensions.$resetChanged();\r\n $rootScope.rootscopeLoading = false;\r\n });\r\n }, function (error) {\r\n commonService.handleError(error);\r\n __this.memberSep = undefined;\r\n __this.Model = undefined;\r\n _Form.$aaFormExtensions.$resetChanged();\r\n $rootScope.rootscopeLoading = false;\r\n });\r\n\r\n ProfileContext.GetLookUpList(\"states\").get(function (data) {\r\n angular.forEach(data.data, function (p) {\r\n p.Name = p.Name + ' ' + p.Abbreviation;\r\n })\r\n __this.stateDataList = data.data;\r\n });\r\n\r\n ProfileContext.GetLookUpList(\"streetSuffixes\").get(function (data) {\r\n __this.streetDataList = data.data;\r\n });\r\n\r\n ProfileContext.GetLookUpList(\"nameSuffixes\").get(function (data) {\r\n __this.nameSufDataList = data.data;\r\n });\r\n\r\n ProfileContext.GetLookUpList(\"dirCardinals\").get(function (data) {\r\n __this.dirCardinalsDataList = data.data;\r\n });\r\n });\r\n }\n function ReformatPhone(phoneNo, elementId) {\r\n var input = document.getElementById(elementId);\r\n var newValue = \"\";\r\n var digits = input.value.replace('(', '').replace(')', '').replace('-', '');\r\n\r\n if (phoneNo === null || digits.length === 0) {\r\n newValue = '';\r\n }\r\n else if (digits.length === 1) {\r\n newValue = '(' + digits;\r\n }\r\n else if (digits.length === 3 && input.value.length === 4 && (__this.keyCode === 8 || __this.keyCode === 46)) {\r\n newValue = '(' + digits;\r\n }\r\n else if (digits.length === 3) {\r\n newValue = '(' + digits + ')';\r\n }\r\n else if (digits.length === 4 && input.value.length === 5) {\r\n newValue = '(' + digits.substring(0, 3) + ')' + digits.substring(3);\r\n }\r\n else if (digits.length === 6 && input.value.length === 9) {\r\n newValue = input.value.replace('-', '');\r\n }\r\n else if (digits.length === 6) {\r\n newValue = '(' + digits.substring(0, 3) + ')' + digits.substring(3, 6) + '-' + digits.substring(6);\r\n }\r\n else if (digits.length === 7 && input.value.length === 9) {\r\n newValue = '(' + digits.substring(0, 3) + ')' + digits.substring(3, 6) + '-' + digits.substring(6);\r\n }\r\n else {\r\n newValue = input.value;\r\n }\r\n\r\n phoneNo = newValue;\r\n input.value = phoneNo;\r\n }\n function ReformatZipCode(zipCode, elementId) {\r\n var input = document.getElementById(elementId);\r\n var newValue = \"\";\r\n var digits = input.value.replace(\"-\", \"\");\r\n var area = input.value.substring(0, 5);\r\n\r\n if (input.value.length === 6 && digits.length === 6) {\r\n var route = input.value.substring(5);\r\n newValue = area + '-' + route;\r\n zipCode = newValue;\r\n input.value = newValue;\r\n } else if (input.value.length === 6 && digits.length === 5 && __this.keyCode !== 189) {\r\n newValue = area;\r\n zipCode = newValue;\r\n input.value = newValue;\r\n }\r\n }\n function RemoveMaskAttributes() {\r\n EntitiesValidators.data.validations.Model.homePhone.mask = null;\r\n EntitiesValidators.data.validations.Model.businessPhone.mask = null;\r\n EntitiesValidators.data.validations.Model.OtherPhoneNumber.mask = null;\r\n EntitiesValidators.data.validations.Model.cellPhoneNumber.mask = null;\r\n EntitiesValidators.data.validations.Model.pagerNumber.mask = null;\r\n EntitiesValidators.data.validations.Model.faxNumber.mask = null;\r\n EntitiesValidators.data.validations.Model.zip.mask = null;\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name SaveForm\r\n * @author Juan Leon \r\n * @param {BodyElement=form} \r\n * @description Internal Function used to save the information from the screen to the back-end.\r\n */\r\n function SaveForm(Form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n\r\n\r\n //Form.$editMode = false;\r\n CheckStrNo(__this.Model.street);\r\n $rootScope.rootscopeLoading = true;\r\n __this.trimValues();\r\n __this.ModifiedModel = {\r\n Model: __this.Model,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n ProfileContext.SaveAccountProfile(__this.memberSep, __this.ModifiedModel).then(function (response) {\r\n\r\n var title = \"\";\r\n var text = \"\";\r\n var command = \"\";\r\n\r\n if (response.data.toLowerCase() == \"true\") {\r\n if (EvaluateParam35() === 2) {\r\n title = \"Account Profile Updated\";\r\n text = \"Your account profile has been updated!\";\r\n command = \"Ok\";\r\n }\r\n else {\r\n title = \"Changes have been Submitted\";\r\n text = \"The requested changes to your Account Profile have been submitted to the utility for review before the update is completed.\";\r\n command = \"Ok\";\r\n }\r\n\r\n Form.$editMode = false;\r\n }\r\n else {\r\n title = \"Error Updating the Account Profile\";\r\n text = \"\";\r\n command = \"Continue\";\r\n }\r\n\r\n\r\n Form.$aaFormExtensions.$resetChanged();\r\n $rootScope.rootscopeLoading = false;\r\n DisplayMessage(title, text, command);\r\n $state.reload();\r\n }, function (error) {\r\n commonService.handleError(error);\r\n $rootScope.rootscopeLoading = false;\r\n });\r\n });\r\n }\r\n function SetFocus(ElementID) {\r\n var elemId = $window.document.getElementById(ElementID);\r\n elemId.focus();\r\n }\r\n function TrimValues() {\r\n __this.Model.homePhone = __this.Model.homePhone.replace('(', '').replace(')', '').replace('-', '');\r\n __this.Model.businessPhone = __this.Model.businessPhone.replace('(', '').replace(')', '').replace('-', '');\r\n __this.Model.cellPhoneNumber = __this.Model.cellPhoneNumber.replace('(', '').replace(')', '').replace('-', '');\r\n __this.Model.OtherPhoneNumber = __this.Model.OtherPhoneNumber.replace('(', '').replace(')', '').replace('-', '');\r\n __this.Model.pagerNumber = __this.Model.pagerNumber.replace('(', '').replace(')', '').replace('-', '');\r\n __this.Model.faxNumber = __this.Model.faxNumber.replace('(', '').replace(')', '').replace('-', '');\r\n __this.Model.zip = __this.Model.zip.replace('-', '');\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .factory('ProfileContext', [\"genericService\", \"$resource\", \"authService\", '$cacheFactory', '$rootScope', ProfileContext]);\r\n\r\n /** @ngInject\r\n * @ngdoc factory\r\n * @name ProfileContext\r\n * @requires genericService\r\n * @description Factory used to interact with Account Profile back-end.\r\n */\r\n function ProfileContext(genericService, $resource, authService) {\r\n\r\n /// Variables.\r\n var AccountsProfilesURL = 'AccountsProfiles/';\r\n var EntitiesValidatorsURL = 'EntityValidators/';\r\n var serviceController = 'Account/Services/';\r\n var __this = this;\r\n\r\n /// Service Return.\r\n return {\r\n /// Methods.\r\n GetAccountProfile: Find,\r\n SaveAccountProfile: Save,\r\n GetEntityValidators: GetEntityValidators,\r\n GetLookUpList: GetLookUpList,\r\n GetMemberSep: GetMemberSep,\r\n\r\n /// Properties.\r\n AccountsProfilesURL: AccountsProfilesURL,\r\n EntitiesValidatorsURL: EntitiesValidatorsURL,\r\n };\r\n\r\n\r\n /// Internal Functions.\r\n /**\r\n * @ngdoc internal function\r\n * @name Find\r\n * @author Juan Leon \r\n * @param {String = MemberNo} Identifier Account Number.\r\n * @description Internal Function used to load the account profile data from the back-end.\r\n */\r\n function Find(MemberSep) {\r\n return genericService.get(this.AccountsProfilesURL + MemberSep);\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name Save\r\n * @author Juan Leon \r\n * @param {String = MemberSep} Identifier Account Number.\r\n * @param {String = Model} The Data to be updated in the back-end.\r\n * @description Internal Function used to save the account profile data to the back-end.\r\n */\r\n function Save(MemberSep, Model) {\r\n return genericService.put(this.AccountsProfilesURL, MemberSep, Model);\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name GetEntityValidators\r\n * @author Juan Leon \r\n * @param {String = entityName} Identifier Account Number.\r\n * @param {String = ModeljsonModelName} The Data to be updated in the back-end.\r\n * @description Internal Function used to get the Model validations.\r\n */\r\n function GetEntityValidators(entityName, jsonModelName) {\r\n return genericService.get(this.EntitiesValidatorsURL + \"?entityName=\" + entityName + \"&jsonModelName=\" + jsonModelName);\r\n }\r\n\r\n function GetLookUpList(lookUpType) {\r\n return $resource(\"app/data/msportal/\" + lookUpType + \".json\");\r\n }\r\n\r\n function GetMemberSep(MemberNo) {\r\n return genericService.get(serviceController + MemberNo)\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('PPMHistoryController', PPMHistoryController, function ($scope) { });\r\n\r\n /** @ngInject */\r\n function PPMHistoryController($scope, genericService, $state, DTOptionsBuilder, $mdDialog, $mdMedia, $rootScope, $sce, $window, $log, commonService, authService) {\r\n // Local Variables\r\n var curYear = new Date().getFullYear();\r\n var isModalShown = false;\r\n var serviceController = 'PPMAccount/';\r\n $window.document.title = \"Prepaid Account History - \" + document.getElementById(\"title\").title;\r\n // Data Binding\r\n $scope.dateLocale = commonService.dateLocaleByMonth;\r\n $scope.dtOptions = {\r\n dom: 'Irtip',\r\n paging: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n info: false,\r\n order: [0, 'desc'],\r\n columnDefs: [\r\n {\r\n targets: 0,\r\n responsivePriority: 1\r\n },\r\n {\r\n targets: -2,\r\n responsivePriority: 3\r\n },\r\n {\r\n // View History Breakdown\r\n targets: -1,\r\n responsivePriority: 2,\r\n sortable: false\r\n }],\r\n language: {\r\n \"emptyTable\": \"No Records Available\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n $scope.dtOptionsDetails = {\r\n dom: 'Irtip',\r\n paging: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n info: false,\r\n order: [0, 'asc'],\r\n columnDefs: [\r\n {\r\n // Service Details\r\n targets: 0,\r\n responsivePriority: 1\r\n },\r\n {\r\n // Balance\r\n targets: -1,\r\n responsivePriority: 2,\r\n }],\r\n language: {\r\n \"emptyTable\": \"No Records Available\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n $scope.endDate = new Date();\r\n $scope.filteredPPMAcctHistory = [];\r\n $scope.getMaxDate = new Date((new Date()).getFullYear(), (new Date()).getMonth() + 1, 0);\r\n $scope.MemberNo = $state.params.id;\r\n $scope.PPMAccount = {};\r\n $scope.PPMAcctHistory = [];\r\n $scope.selectedTransactions = [];\r\n $scope.sort = {\r\n Column: 'SystemDate',\r\n Reverse: true\r\n };\r\n $scope.startDate = new Date();\r\n $scope.windowWidth = window.innerWidth;\r\n\r\n // Function Binding\r\n $scope.alertDialog = AlertDialog;\r\n $scope.filter = Filter;\r\n $scope.ReloadPPMRecords = ReloadPPMRecords;\r\n $scope.showDetails = ShowDetails;\r\n $scope.showHelp = ShowHelp;\r\n $scope.sortClass = SortClass;\r\n $scope.sortList = SortList;\r\n $scope.toggleDetails = ToggleDetails;\r\n\r\n // Initialization\r\n LoadRecordsPPMAcctHistory();\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n\r\n // Functions\r\n function AlertDialog(title, content) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n );\r\n }\r\n function Filter() {\r\n // Get the selected Start and End Date\r\n var lowestDate = GetMoYr($scope.startDate);\r\n var highestDate = GetMoYr($scope.endDate);\r\n\r\n var maxDate = angular.copy($scope.startDate);\r\n maxDate = GetMoYr(maxDate.setMonth(maxDate.getMonth() + 11));\r\n\r\n if (lowestDate > highestDate) {\r\n AlertDialog('Invalid Date Range', 'The End Date must be later than the Start Date.');\r\n } else if (highestDate > maxDate) {\r\n AlertDialog('Invalid Date Range', 'The Interval between Start and End Date can not be more than 12 months.');\r\n } else {\r\n // Remove item from list if date not in between the start and end date.\r\n $scope.filteredPPMAcctHistory = angular.copy($scope.PPMAcctHistory);\r\n for (var i = $scope.filteredPPMAcctHistory.length - 1; i >= 0; i--) {\r\n var itemDate = $scope.filteredPPMAcctHistory[i].SystemDate;\r\n itemDate = GetMoYr(new Date(itemDate));\r\n if (itemDate < lowestDate || itemDate > highestDate) {\r\n $scope.filteredPPMAcctHistory.splice(i, 1);\r\n }\r\n }\r\n\r\n for (var i = $scope.filteredPPMAcctHistory.length - 1; i >= 0; i--) {\r\n var itemDate = $scope.filteredPPMAcctHistory[i].SystemDate;\r\n var curDate = new Date();\r\n if (itemDate > curDate) {\r\n $scope.filteredPPMAcctHistory.splice(i, 1);\r\n }\r\n }\r\n }\r\n }\r\n function ReformatDate(date) {\r\n var day = commonService.padLeft((new Date(date).getDate()).toString(), 2, '0');\r\n var month = commonService.padLeft((new Date(date).getMonth() + 1).toString(), 2, '0');\r\n var year = \"20\" + (new Date(date).getFullYear().toString().substring(2));\r\n return (new Date(year, month, day));\r\n }\r\n function GetMoYr(date) {\r\n var mo = commonService.padLeft((new Date(date).getMonth() + 1).toString(), 2, '0');\r\n var yr = new Date(date).getFullYear().toString();\r\n return yr + mo;\r\n }\r\n function LoadRecordsPPMAcctHistory() {\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get(serviceController + $scope.MemberNo);\r\n promiseGet.then(function (pl) {\r\n InvertPPMValues(pl.data.PPMAccountHistory);\r\n for (var i = 0; i < pl.data.PPMAccountHistory.length; i++) {\r\n var item = pl.data.PPMAccountHistory[i];\r\n //item.SystemDate = new Date(item.SystemDate);\r\n item.SystemDate = ReformatDate(item.SystemDate);\r\n item.isCollapsed = true;\r\n for (var j = 0; j < item.Transactions.length; j++) {\r\n var transaction = item.Transactions[j];\r\n //transaction.SystemDate = new Date(transaction.SystemDate);\r\n transaction.SystemDate = ReformatDate(transaction.SystemDate);\r\n transaction.isCollapsed = true;\r\n }\r\n }\r\n $scope.PPMAccount = pl.data;\r\n $scope.PPMAcctHistory = pl.data.PPMAccountHistory;\r\n if ($scope.PPMAcctHistory.length > 0) {\r\n $scope.PPMAccount.PaymentNotice = RephrasePPMPaymentLabel($scope.PPMAccount.PaymentNotice);\r\n var eDateMoYr = new Date();\r\n $scope.startDate = new Date(eDateMoYr);\r\n $scope.endDate = new Date(eDateMoYr);\r\n Filter();\r\n }\r\n $rootScope.rootscopeLoading = false;\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n function ReloadPPMRecords() {\r\n var eDateMoYr = $scope.PPMAcctHistory[0].SystemDate;\r\n $scope.startDate = new Date(eDateMoYr);\r\n $scope.endDate = new Date(eDateMoYr);\r\n Filter();\r\n }\r\n function RephrasePPMPaymentLabel(label) {\r\n if (label === \"Min Payment to Stay connected:\") {\r\n return \"Minimum Payment to Stay Connected on Prepaid:\";\r\n } else if (label === \"Min Payment to Get Reconnected:\") {\r\n return \"Minimum Payment to Get Reconnected:\";\r\n } else if (label === \"Payment to Reach Min PPM Bal:\") {\r\n return \"Payment to Reach Minimum Prepaid Balance:\";\r\n } else if (label === \"Min Payment to Stay connected on PPM:\") {\r\n return \"Minimum Payment to Stay Connected on Prepaid:\";\r\n } else {\r\n return label;\r\n }\r\n }\r\n function InvertPPMValues(accountHistory) {\r\n for (var i = 0; i < accountHistory.length; i++) {\r\n var item = accountHistory[i];\r\n item.Charges = item.Charges * -1;\r\n item.Payment = item.Payment * -1;\r\n item.Adjustment = item.Adjustment * -1;\r\n item.Reconciliation = item.Reconciliation * -1;\r\n item.Balance = item.Balance * -1;\r\n for (var j = 0; j < item.Transactions.length; j++) {\r\n var transaction = item.Transactions[j];\r\n transaction.Charges = transaction.Charges * -1;\r\n transaction.Payment = transaction.Payment * -1;\r\n transaction.Adjustment = transaction.Adjustment * -1;\r\n transaction.Reconciliation = transaction.Reconciliation * -1;\r\n transaction.Balance = transaction.Balance * -1;\r\n }\r\n }\r\n\r\n }\r\n function ShowDetails(item, ev) {\r\n var detailsDialog = {\r\n templateUrl: 'app/main/msportal/views/ppm_history/dailyTransactions.html',\r\n parent: angular.element(document.body),\r\n targetEvent: ev,\r\n clickOutsideToClose: true,\r\n fullscreen: ($mdMedia('sm') || $mdMedia('xs')) && ($mdMedia('xs') || $mdMedia('sm')),\r\n locals: {\r\n data: {\r\n dtOption: $scope.dtOptionsDetails,\r\n item: item,\r\n showHelp: $scope.showHelp,\r\n sortClass: $scope.sortClass,\r\n sortList: $scope.sortList,\r\n toggleDetails: $scope.toggleDetails\r\n }\r\n },\r\n controller: \"PPMServiceHistoryController\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n };\r\n $mdDialog.show(detailsDialog);\r\n }\r\n function ShowHelp(item) {\r\n if (item === 'Charges') {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Activity Help Message')\r\n .htmlContent(\r\n 'Charges Incurred/Amount Due as per Daily Usage.'\r\n )\r\n .ariaLabel('Charges Help')\r\n .ok('Close')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n }\r\n function SortClass(column) {\r\n var object = isModalShown ? $scope.sort2 : $scope.sort;\r\n var className = '';\r\n if (object.Column === column) {\r\n className = object.Reverse === false ? 'fa-sort-up' : 'fa-sort-down';\r\n } else {\r\n className = 'fa-sort';\r\n }\r\n return className;\r\n }\r\n function SortList(column) {\r\n var object = isModalShown ? $scope.sort2 : $scope.sort;\r\n if (object.Column === column) {\r\n object.Reverse = !object.Reverse;\r\n } else {\r\n object.Column = column;\r\n object.Reverse = false;\r\n }\r\n }\r\n function ToggleDetails(item) {\r\n item.isCollapsed = !item.isCollapsed;\r\n //if (window.innerWidth <= 575) {\r\n // item.isCollapsed = !item.isCollapsed;\r\n //}\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('PPMServiceHistoryController', PPMServiceHistoryController);\r\n\r\n /** @ngInject */\r\n function PPMServiceHistoryController(data, $mdDialog, $scope) {\r\n $scope.item = data.item;\r\n $scope.closeDialog = function () {\r\n $mdDialog.cancel();\r\n }\r\n $scope.dtOptionsDetails = data.dtOption;\r\n $scope.showHelp = angular.copy(data.showHelp);\r\n\r\n $scope.sortClass = SortClass;\r\n $scope.sortList = SortList;\r\n $scope.toggleDetails = ToggleDetails;\r\n\r\n $scope.sort = {\r\n Column: 'MemberSep',\r\n Reverse: false\r\n };\r\n\r\n function SortClass(column) {\r\n var object = $scope.sort;\r\n var className = '';\r\n if (object.Column === column) {\r\n className = object.Reverse === false ? 'fa-sort-up' : 'fa-sort-down';\r\n } else {\r\n className = 'fa-sort';\r\n }\r\n return className;\r\n }\r\n function SortList(column) {\r\n var object = $scope.sort;\r\n if (object.Column === column) {\r\n object.Reverse = !object.Reverse;\r\n } else {\r\n object.Column = column;\r\n object.Reverse = false;\r\n }\r\n }\r\n function ToggleDetails(item) {\r\n item.isCollapsed = !item.isCollapsed;\r\n //if (window.innerWidth <= 575) {\r\n // item.isCollapsed = !item.isCollapsed;\r\n //}\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.chart', ['nvd3'])\r\n .controller('UsageChartController', ['$state', 'genericService', '$filter', 'commonService', '$mdDialog', UsageChartController]);\r\n\r\n //.module('app.msportal')\r\n //.controller('UsageChartController', ['$state', 'genericService', '$filter', UsageChartController]);\r\n\r\n /** @ngInject\r\n * @ngdoc controller\r\n * @name MDM_ChartController\r\n * @description Controller used to interact with Usage Chart.\r\n */\r\n function UsageChartController($state, genericService, $filter, commonService, $mdDialog) {\r\n\r\n /// Variables.\r\n var vm = this;\r\n var serviceController = 'Account/Services/';\r\n var usageController = 'Usage/';\r\n var dataArray = [];\r\n\r\n\r\n /// Bindding Data.\r\n vm.AccountService = {};\r\n vm.accountServiceSelected = {};\r\n vm.MemberNo = $state.params.id;\r\n vm.progress = { activated: false };\r\n vm.calendarEvent = { start: \"\", end: \"\", memberSep: \"\" };\r\n vm.chartHeight = (vm.isSingleService) ? 500 : 370;\r\n vm.chart = {\r\n options: {\r\n chart: {\r\n type: 'linePlusBarChart',\r\n height: 500,\r\n margin: {\r\n top: 30,\r\n right: 75,\r\n bottom: 50,\r\n left: 75\r\n },\r\n bars: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n bars2: {\r\n forceY: [0]\r\n , forceX: [-0.5]\r\n },\r\n color: ['#880000', 'darkred'],\r\n x: function (d, i) { return i },\r\n xAxis: {\r\n axisLabel: 'Date',\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || null;\r\n if (dx) {\r\n return d3.time.format('%x')(new Date(dx))\r\n }\r\n return null;\r\n }\r\n },\r\n x2Axis: {\r\n tickFormat: function (d) {\r\n var dx = vm.chart.data[0].values[d] && vm.chart.data[0].values[d].x || 0;\r\n return d3.time.format('%m-%d-%Y')(new Date(dx))\r\n },\r\n showMaxMin: false\r\n },\r\n y1Axis: {\r\n axisLabel: 'kWh',\r\n tickFormat: function (d) {\r\n return d3.format(',f')(d);\r\n },\r\n axisLabelDistance: 0\r\n },\r\n y2Axis: {\r\n axisLabel: 'Y2 Axis',\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n y3Axis: {\r\n tickFormat: function (d) {\r\n return d3.format(',f')(d);\r\n }\r\n },\r\n y4Axis: {\r\n tickFormat: function (d) {\r\n return '$' + d3.format(',.2f')(d)\r\n }\r\n },\r\n focusEnable: false,\r\n showLegend: false,\r\n useInteractiveGuideline: false,\r\n tooltip: {\r\n contentGenerator: function (key, x, y, e, graph) {\r\n return '

' + key.data.y + ' kWh (' + key.data.x + ')

';\r\n }\r\n }\r\n }\r\n },\r\n data: dataChart(),\r\n api: {}\r\n }\r\n vm.dateLocale = commonService.dateLocaleByDay;\r\n vm.dtOptions = { dom: 'lrtip', paging: false, autoWidth: true, responsive: true, scroller: false, processing: true, info: false };\r\n vm.flipped = false;\r\n vm.isSingleService = false;\r\n vm.statusMessage = \"Please wait a minute until the data is finished loading!\";\r\n vm.UsageRequest = {\r\n SearchDetails:\r\n {\r\n ID: vm.calendarEvent.memberSep,\r\n //ID: \"3009001\",\r\n IdType: 0,\r\n StartDate: vm.calendarEvent.start,\r\n EndDate: vm.calendarEvent.end\r\n },\r\n Device: {\r\n DeviceType: \"\",\r\n HardwareId: \"\"\r\n },\r\n IsPPM: 0,\r\n IsCostEnable: \"0\"\r\n };\r\n\r\n /// Methods.\r\n /**\r\n * @ngdoc method\r\n * @name initializeChart\r\n * @author Juan Leon \r\n * @description Method used to set initial date parameters and update the chart.\r\n */\r\n vm.initializeChart = function () {\r\n vm.progress.activated = true;\r\n dataArray = [];\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n vm.calendarEvent.end = new Date();\r\n vm.updateChart();\r\n };\r\n /**\r\n * @ngdoc method\r\n * @name updateChart\r\n * @author Juan Leon \r\n * @description Method used to update the chart with a new data from the server.\r\n */\r\n vm.updateChart = function () {\r\n\r\n if (vm.calendarEvent.start > vm.calendarEvent.end) {\r\n showDateRangeError()\r\n return\r\n }\r\n\r\n vm.UsageRequest.SearchDetails.StartDate = angular.copy(vm.calendarEvent.start);\r\n vm.UsageRequest.SearchDetails.EndDate = vm.calendarEvent.end;\r\n vm.UsageRequest.SearchDetails.StartDate.setDate(vm.UsageRequest.SearchDetails.StartDate.getDate() + 1)\r\n vm.UsageRequest.SearchDetails.ID = vm.calendarEvent.memberSep;\r\n\r\n vm.progress.activated = true;\r\n\r\n var getChartDataPost = genericService\r\n .post(usageController, vm.UsageRequest)\r\n .then(function (pl) {\r\n vm.progress.activated = false;\r\n var response = pl.data;\r\n\r\n dataArray = [];\r\n\r\n for (var i = 0; i < response.length; i++) {\r\n dataArray.push([response[i].dailyTimeStanpField, parseFloat(response[i].totalEnergyField)]);\r\n }\r\n vm.chart.api.updateWithData(dataChart());\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl);\r\n vm.progress.activated = false;\r\n dataArray = [];\r\n })\r\n };\r\n\r\n function showDateRangeError() {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var alert = $mdDialog.alert(\r\n\t\t\t\t{\r\n\t\t\t\t clickOutsideToClose: false,\r\n\t\t\t\t onComplete: function () {\r\n\t\t\t\t $rootScope.$broadcast('msDialogIsOpened');\r\n\t\t\t\t },\r\n\t\t\t\t onRemoving: function () {\r\n\t\t\t\t $rootScope.$broadcast('msDialogIsClosed');\r\n\t\t\t\t }\r\n\t\t\t\t})\r\n\t\t\t\t .title('Invalid Date Range')\r\n\t\t\t\t .textContent('Start Date cannot be later than End Date.')\r\n\t\t\t\t .ariaLabel('Invalid Date Range')\r\n .ok('Ok')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name getServiceDetails\r\n * @author Juan Leon \r\n * @description Method used to bring the list of user service.\r\n */\r\n vm.getServiceDetails = function () {\r\n vm.progress.activated = true;\r\n\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n vm.calendarEvent.end = new Date();\r\n\r\n genericService.get(serviceController + vm.MemberNo)\r\n .then(function (pl) {\r\n vm.progress.activated = false;\r\n\r\n vm.AccountService.Services = $filter('filter')(pl.data.Services, filterServices);\r\n\r\n vm.isSingleService = (vm.AccountService.Services.length == 1);\r\n\r\n vm.statusMessage = \"Please select one service to check the usage by range of date.\";\r\n\r\n if (vm.isSingleService) {\r\n vm.selectServiceFlip(vm.AccountService.Services[0]);\r\n d3.select('#chart svg').style({ 'height': 500 });\r\n } else {\r\n d3.select('#chart svg').style({ 'height': 370 });\r\n }\r\n },\r\n function (errorPl) {\r\n vm.progress.activated = false;\r\n vm.AccountService = {};\r\n vm.flipped = false;\r\n })\r\n };\r\n /**\r\n * @ngdoc method\r\n * @name selectServiceFlip\r\n * @author Juan Leon \r\n * @description Method used to set the service selected and load the chart with new data.\r\n */\r\n vm.selectServiceFlip = function (accountServiceSelected) {\r\n vm.accountServiceSelected = accountServiceSelected;\r\n vm.calendarEvent.memberSep = accountServiceSelected.MemberSep;\r\n vm.initializeChart();\r\n flip();\r\n };\r\n /**\r\n * @ngdoc method\r\n * @name closeChart\r\n * @author Juan Leon \r\n * @description Method used to set close the chart screen and go to the List service screen.\r\n */\r\n vm.closeChart = function () {\r\n dataArray = [];\r\n vm.calendarEvent.start = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate() - 7);\r\n vm.calendarEvent.end = new Date();\r\n vm.chart.api.updateWithData(dataChart());\r\n flip();\r\n };\r\n\r\n /// Internal Functions.\r\n /**\r\n * @ngdoc internal function\r\n * @name dataChart\r\n * @author Juan Leon \r\n * @description Method used to format the data that the chart are going to use.\r\n **/\r\n function dataChart() {\r\n\r\n var data = [\r\n { \"key\": \"Total Energy\", \"bar\": true, \"values\": dataArray }\r\n ].map(function (series) {\r\n series.values = series.values.map(function (d) { return { x: d[0], y: d[1] } });\r\n return series;\r\n });\r\n\r\n return data;\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name flip\r\n * @author Juan Leon \r\n * @description Method used to flip the screen to front or back.\r\n **/\r\n function flip() {\r\n vm.flipped = !vm.flipped;\r\n }\r\n /**\r\n * @ngdoc internal function\r\n * @name filterServices\r\n * @author Juan Leon \r\n * @description Method used to filter the data of serviceAccount.\r\n **/\r\n function filterServices(service) {\r\n //return service.Type == \"00\" || service.Type == \"01\";\r\n return service.Type == \"00\";\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('PaymentHistoryController', PaymentHistoryController, function ($scope) { })\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n /** @ngInject */\r\n function PaymentHistoryController($scope, genericService, $http, $state, DTOptionsBuilder, $mdDialog, $rootScope, $log, commonService, authService, $window) {\r\n var serviceController = 'PaymentHistory/';\n $window.document.title = \"Payment History - \" + document.getElementById(\"title\").title;\n $scope.dateLocale = commonService.dateLocaleByMonth;\r\n $scope.PaymentHistory = {};\r\n $scope.MemberNo = $state.params.id;\r\n $scope.StartDate = new Date();\r\n $scope.EndDate = new Date();\r\n $scope.displayTrans = false;\r\n $scope.TransAmt = 0;\r\n\n\r\n var curYear = new Date().getFullYear();\r\n var curMon = new Date().getMonth() + 1;\r\n $scope.getMaxDate = new Date(curYear, curMon, 0);\r\n\r\n var mobileDirectory;\r\n\r\n LoadRecords();\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n\r\n function LoadRecords() {\r\n\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get(serviceController + $scope.MemberNo);\r\n //alert($scope.MemberNo);\r\n promiseGet.then(function (pl) {\r\n $scope.PaymentHistory = pl.data;\r\n if ($scope.PaymentHistory.length > 0) {\r\n var sBillMoYr = $scope.PaymentHistory[$scope.PaymentHistory.length - 1].BillMoYr;\r\n $scope.StartDate = ConstructDate(sBillMoYr);\r\n var eBillMoYr = $scope.PaymentHistory[0].BillMoYr;\r\n $scope.EndDate = ConstructDate(eBillMoYr);\r\n }\n\n for (var i = 0; i < $scope.PaymentHistory.length; i++) {\r\n if ($scope.PaymentHistory[i].TransNbr == '0210') {\r\n $scope.displayTrans = true;\r\n $scope.TransAmt = $scope.PaymentHistory[i].Amount;\r\n break;\r\n }\r\n }\r\n\r\n\n $scope.amountWidth = commonService.getNumericColumnWidth($scope.PaymentHistory, \"Amount\", 0, 71);\r\n $rootScope.rootscopeLoading = false;\r\n //alert($scope.PaymentHistory.Balance);\r\n },\r\n function (errorPl) {\r\n //alert(2);\r\n commonService.handleError(errorPl);\r\n $log.error('failure loading Payment History', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }\r\n\r\n function ConstructDate(BillMoYr) {\r\n var result = null;\r\n if (BillMoYr.substr(BillMoYr.length - 2, 2) > curYear.toString().substr(2, 2)) {\r\n result = new Date('19' + BillMoYr.substr(0, 2), BillMoYr.substr(2, 2) - 1, 1);\r\n }\r\n else {\r\n result = new Date('20' + BillMoYr.substr(0, 2), BillMoYr.substr(2, 2) - 1, 1);\r\n }\r\n return result;\r\n }\r\n\r\n function alertDialog(title, content) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n //.targetEvent(ev)\r\n );\r\n }\r\n\r\n $scope.ReloadRecords = function () {\r\n LoadRecords();\r\n }\r\n\r\n $scope.LoadRecordsByDateRange = function (startDate, endDate) {\r\n $scope.displayTrans = false;\r\n\r\n if (startDate == \"\" || endDate == \"\" || !(startDate) || !(endDate)) {\r\n alertDialog('Invalid Input', 'Please enter value for both Start and End dates and Start/End Date must be less than the Date today.');\r\n\r\n }\r\n else {\r\n var startYear = startDate.getFullYear().toString();\r\n var sYear = startYear.substr(startYear.length - 2, 2);\r\n var dateFrom = sYear + ('00' + (startDate.getMonth() + 1)).slice(-2);\r\n var endYear = endDate.getFullYear().toString();\r\n var eYear = endYear.substr(endYear.length - 2, 2);\r\n var dateTo = eYear + ('00' + (endDate.getMonth() + 1)).slice(-2);\r\n\r\n var dateToday = new Date();\r\n var yearToday = dateToday.getFullYear().toString();\r\n var tYear = yearToday.substr(yearToday.length - 2, 2);\r\n var dateNow = tYear + ('00' + (dateToday.getMonth() + 1)).slice(-2);\r\n\r\n if ((dateFrom > dateTo && startYear >= endYear) || startYear > endYear) {\r\n alertDialog('Invalid Input', 'Start date must be less than the End date.');\r\n }\r\n else if (dateTo > dateNow && endYear >= yearToday) {\r\n alertDialog('Invalid Input', 'Start/End Date must be less than the Date today.');\r\n }\r\n else {\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get(serviceController + $scope.MemberNo + '/' + dateFrom.toString() + dateTo.toString());\r\n\r\n promiseGet.then(function (pl) {\r\n $scope.PaymentHistory = pl.data;\r\n if ($scope.PaymentHistory.length <= 0) {\r\n alertDialog('No results found', 'No payment history found for the specified dates.');\r\n }\n\n for (var i = 0; i < $scope.PaymentHistory.length; i++) {\r\n if ($scope.PaymentHistory[i].TransNbr == '0210') {\r\n $scope.displayTrans = true;\r\n $scope.TransAmt = $scope.PaymentHistory[i].Amount;\r\n break;\r\n }\r\n } \r\n\r\n $rootScope.rootscopeLoading = false;\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl);\r\n $log.error('failure loading Payment History', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }\r\n }\r\n };\r\n\r\n $scope.dtOptions = {\r\n dom: 'Irtip',\r\n paging: false,\r\n //autoWidth: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n ordering: true,\r\n info: false,\r\n order: [0, 'desc']\r\n\r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('BankDraftController', BankDraftController)\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n\r\n /** @ngInject */\r\n function BankDraftController($scope, $state, genericService, $http, DTOptionsBuilder, $log, authService, $rootScope, commonService, $stateParams, BankDraftContext, CCValidators, ECValidators, $mdDialog, $cacheFactory, $window) {\r\n var serviceController = 'CCDraft/';\r\n var promiseGet;\r\n var httpCache = $cacheFactory.get('$http');\r\n $window.document.title = \"Payment Drafts - \" + document.getElementById(\"title\").title;\r\n $scope.Service = {};\r\n\r\n var vm = this;\n vm.dateLocale = commonService.dateLocaleExpDate;\r\n vm.Message = '';\r\n vm.CCValidators = CCValidators.data;\r\n vm.ECValidators = ECValidators.data;\r\n vm.Parameters = $rootScope.Parameters;\r\n vm.CreditCardProfile = {};\r\n vm.ECheckProfile = {};\r\n vm.MemberNo = $state.params.id;\r\n vm.RoleType = authService.roleType;\r\n vm.CCDraftsEnabled = 0;\r\n vm.BankDraftsEnabled = 0;\r\n vm.HasExisting = false;\r\n vm.PassedBusinessRules = false;\r\n vm.FirstMemberSep = $state.params.id + '001';\r\n vm.ValidStatus = false;\r\n\r\n SetSmartAppConfig();\r\n LoadRecordsServ();\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n\r\n String.prototype.toMask = function () {\r\n return String(\"************************\" + this.substr(this.length - 4)).slice(-16);\r\n };\r\n\r\n String.prototype.padLeft = function (len, charac) {\r\n return Array(len - this.length + 1).join(charac || \" \") + this;\r\n }\r\n\r\n String.prototype.toActualYear = function () {\r\n var actualYear = new Date().getFullYear().toString();\r\n var dataYear = this.toString();\r\n\r\n if (this.length == 2)\r\n dataYear = actualYear.substring(0, 2) + dataYear;\r\n\r\n return String(dataYear);\r\n }\r\n String.prototype.replaceAll = function (search, replace) {\r\n if (replace === undefined) {\r\n return this.toString();\r\n }\r\n return this.split(search).join(replace);\r\n }\r\n\r\n String.prototype.toTwoDigitsYear = function () {\r\n var dataYear = this.toString();\r\n\r\n if (this.length > 2)\r\n dataYear = dataYear.substring((dataYear.length - 2), dataYear.length);\r\n\r\n return String(dataYear);\r\n }\r\n\r\n function SetSmartAppConfig() {\r\n\r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n if ($rootScope.smartAppConfig[x].ConfigId == '87') {\r\n vm.CCDraftsEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '88') {\r\n vm.BankDraftsEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n }\r\n }\r\n function LoadRecordsServ() {\r\n\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get('Account/Services/' + vm.MemberNo);\r\n\r\n promiseGet.then(function (pl) {\r\n $scope.Service = pl.data;\r\n //vm.FirstMemberSep = $scope.Service.Services[0].MemberSep;\r\n for (var x = 0; x < pl.data.Services.length; x++) {\r\n if (pl.data.Services[x].Status.toUpperCase() == 'ACTIVE') {\r\n vm.FirstMemberSep = pl.data.Services[x].MemberSep;\r\n break;\r\n }\r\n }\r\n CheckValidStatus($scope.Service.Status);\r\n $rootScope.rootscopeLoading = false;\r\n\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n\r\n function CheckValidStatus(status) {\r\n ////Uncomment code once COOPPARM_621 is coded for UPN\r\n //if (vm.Parameters.FourthParameters.FOURTHPARM_21 == 1) {\r\n // if (status.toUpperCase() == 'INACTIVE' || status.toUpperCase() == 'ACTIVE') {\r\n // vm.ValidStatus = true;\r\n // }\r\n // else {\r\n // vm.ValidStatus = false;\r\n // }\r\n //}\r\n //else {\r\n if (status.toUpperCase() == 'ACTIVE') {\r\n vm.ValidStatus = true;\r\n }\r\n else {\r\n vm.ValidStatus = false;\r\n }\r\n //}\r\n }\r\n\r\n function CheckPortalBusinessRules() {\r\n vm.Message = 'This account does not meet the requirements for this option.';\r\n $rootScope.rootscopeLoading = true;\r\n\r\n var PortalBusinessRules = [];\r\n\r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n\r\n if ($rootScope.smartAppConfig[x].ConfigId == '89' && vm.draftURL != 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'ActiveAccountSince',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '90' && vm.draftURL != 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'BadChecks',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '92' && vm.draftURL != 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'CutOffs',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '94' && vm.draftURL != 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'Delinquents',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n //else if ($rootScope.smartAppConfig[x].ConfigId == '97' && vm.draftURL != 'ccDraft.html') {\r\n // PortalBusinessRules.push({\r\n // Name: 'ZeroBalance',\r\n // Value: $rootScope.smartAppConfig[x].Value.trim() == 'Y' || vm.Parameters.Parameters.COOPPARM_150 == 1 ? 'Y' : 'N',\r\n // MonthsVerify: 0\r\n // });\r\n //}\r\n //----------FOR-CC-DRAFTS----------//\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '98' && vm.draftURL == 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'ActiveAccountSince',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '99' && vm.draftURL == 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'BadChecks',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '101' && vm.draftURL == 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'CutOffs',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '103' && vm.draftURL == 'ccDraft.html') {\r\n PortalBusinessRules.push({\r\n Name: 'Delinquents',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n //else if ($rootScope.smartAppConfig[x].ConfigId == '106' && vm.draftURL == 'ccDraft.html') {\r\n // PortalBusinessRules.push({\r\n // Name: 'ZeroBalance',\r\n // Value: $rootScope.smartAppConfig[x].Value.trim() == 'Y' || vm.Parameters.Parameters.COOPPARM_150 == 1 ? 'Y' : 'N',\r\n // MonthsVerify: 0\r\n // });\r\n //}\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '108' && vm.draftURL != 'ccDraft.html') {\r\n vm.Message = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '109' && vm.draftURL == 'ccDraft.html') {\r\n vm.Message = $rootScope.smartAppConfig[x].Value;\r\n }\r\n }\r\n\r\n var PBRules = {\r\n PortalBusinessRulesList: PortalBusinessRules,\r\n MemberSep: vm.FirstMemberSep,\r\n NotQualifiedMessage: vm.Message\r\n }\r\n var ModPBRules = {\r\n Model: PBRules,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n\r\n var promisePost = genericService.post('PortalBusinessRules/' + 'CheckPortalBusinessRules', ModPBRules);\r\n\r\n promisePost.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n //alert(pl.data);\r\n if (pl.data == '\"\"') {\r\n vm.PassedBusinessRules = true;\r\n if (vm.draftURL == 'ccDraft.html') {\r\n LoadExistingCCDraft();\r\n }\r\n else {\r\n LoadExistingBankDraft();\r\n }\r\n }\r\n else {\r\n vm.PassedBusinessRules = false;\r\n vm.draftURL = '';\r\n if (pl.data == '\"This account does not meet the requirements for this option.\"') {\r\n DisplayMessage(\"Invalid Account\", vm.Message, 'OK');\r\n }\r\n else {\r\n DisplayMessage(\"Error\", pl.data.replaceAll('\"', ''), 'OK');\r\n }\r\n }\r\n\r\n },\r\n function (errorPl) {\r\n vm.PassedBusinessRules = false;\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading business rules', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n vm.LoadData = function () {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n CheckPortalBusinessRules();\r\n });\r\n }\r\n function LoadExistingBankDraft(_Form) {\r\n\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get('BankDraft/' + 'GetBankDraft?MemberSep=' + vm.MemberNo + '000&DraftCode=' + $scope.Service.DraftCode);\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n if (!!pl.data) {\r\n if (pl.data.PrintCode == '2' || pl.data.PrintCode == '3') {\r\n DisplayMessage(\"Payment Draft\", \"You have an existing credit card draft. Redirecting to credit card draft.\", 'OK');\r\n vm.draftURL = 'ccDraft.html';\r\n //LoadExistingCCDraft();\r\n vm.LoadData();\r\n }\r\n vm.HasExisting = true;\r\n vm.ECheckProfile = pl.data;\r\n }\r\n else {\r\n vm.HasExisting = false;\r\n }\r\n if (!!_Form) {\r\n _Form.$aaFormExtensions.$resetChanged();\r\n }\r\n\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n function LoadExistingCCDraft(_Form) {\r\n\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get(serviceController + 'GetCCDraft?MemberSep=' + vm.MemberNo + '000&DraftCode=' + $scope.Service.DraftCode);\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n\r\n if (!!pl.data) {\r\n if (!!pl.data.PrintCode) {\r\n DisplayMessage(\"Payment Draft\", \"You have an existing bank draft. Redirecting to bank draft.\", 'OK');\r\n vm.draftURL = 'bankDraft.html';\r\n //LoadExistingBankDraft();\r\n vm.LoadData();\r\n }\r\n else {\r\n vm.HasExisting = true;\r\n vm.CreditCardProfile = pl.data;\r\n vm.CreditCardProfile.ExpirationDate = new Date(pl.data.CreditCardInfo.CCExpYear.toActualYear() , pl.data.CreditCardInfo.CCExpMonth, 0);\r\n vm.CreditCardProfile.CardType = GetNameCCType(pl.data.CardType);\r\n vm.CreditCardProfile.ZipCode = pl.data.CreditCardInfo.CCZipCode;\r\n if (vm.CreditCardProfile.ZipCode.length > 5) {\r\n vm.CreditCardProfile.ZipCode = vm.CreditCardProfile.ZipCode.replace(\"-\", \"\");\r\n vm.CreditCardProfile.ZipCodeExtension = vm.CreditCardProfile.ZipCode.substr(5);\r\n //this.ZipCode = this.ZipCode.substr(0, 5);\r\n }\r\n }\r\n }\r\n else {\r\n vm.CreditCardProfile.ExpirationDate = new Date();\r\n vm.HasExisting = false;\r\n\r\n }\r\n if (!!_Form) {\r\n _Form.$aaFormExtensions.$resetChanged();\r\n }\r\n\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n\r\n vm.Delete = function (Form) {\r\n\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n confirmDelete().then(function () {\r\n if (vm.draftURL == 'ccDraft.html') {\r\n vm.Submit(Form, 'D');\r\n }\r\n else {\r\n vm.SubmitBankDraft(Form, 'D');\r\n }\r\n\r\n }, function () {\r\n\r\n });\r\n });\r\n }\r\n vm.Edit = function (form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n form.$editMode = true;\r\n });\r\n }\r\n vm.reset = function (form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n var _Form = form;\r\n\r\n _Form.$aaFormExtensions.$reset().then(\r\n function Ok(resp) {\r\n if (resp) {\r\n\r\n if (vm.draftURL == 'ccDraft.html') {\r\n vm.CreditCardProfile.CardName = '';\r\n vm.CreditCardProfile.CardType = '';\r\n vm.CreditCardProfile.CCNumber = '';\r\n vm.CCNumberMasked = '';\r\n vm.CreditCardProfile.CVV = '';\r\n vm.CreditCardProfile.ExpirationDate = new Date();\r\n vm.CreditCardProfile.ZipCode = '';\r\n vm.CreditCardProfile = {};\r\n LoadExistingCCDraft(_Form);\r\n }\r\n else {\r\n vm.ECheckProfile.Name = '';\r\n vm.ECheckProfile.BankAccountNumber = '';\r\n vm.ECheckProfile.RoutingNumber = '';\r\n vm.ECheckProfile.BankName = '';\r\n vm.ECheckProfile.PrintCode = '';\r\n vm.ECheckProfile = {};\r\n LoadExistingBankDraft(_Form);\r\n }\r\n _Form.$editMode = false;\r\n }\r\n }\r\n );\r\n });\r\n }\r\n vm.Submit = function (Form, mode) {\r\n var __this = this;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $rootScope.rootscopeLoading = true;\r\n var CCDetails = {\r\n Number: (__this.CreditCardProfile.CCNumber === undefined) ? 0 : __this.CreditCardProfile.CCNumber,\r\n Name: (__this.CreditCardProfile.CardName === undefined) ? \"\" : __this.CreditCardProfile.CardName,\r\n Type: (__this.CreditCardProfile.CardType === undefined) ? \"\" : GetNumberCCType(__this.CreditCardProfile.CardType),\r\n ExpirationMonth: (__this.CreditCardProfile.ExpirationDate === undefined) ? \"01\" : (__this.CreditCardProfile.ExpirationDate.getMonth() + 1).toString().padLeft(2, \"0\"),\r\n ExpirationYear: (__this.CreditCardProfile.ExpirationDate === undefined) ? ((new Date()).getFullYear() + 1).toString().toTwoDigitsYear() : __this.CreditCardProfile.ExpirationDate.getFullYear().toString().toTwoDigitsYear(),\r\n ZipCode: (__this.CreditCardProfile.ZipCode === undefined) ? \"\" : __this.CreditCardProfile.ZipCode.substr(0, 5),\r\n ZipCodeExtension: (__this.CreditCardProfile.ZipCode === undefined) ? \"\" : (__this.CreditCardProfile.ZipCode.length > 5) ? __this.CreditCardProfile.ZipCode.substr(6) : \"\",\r\n Address1: (__this.CreditCardProfile.CCAddress1 === undefined) ? \"\" : __this.CreditCardProfile.CCAddress1,\r\n Address2: \"\",\r\n City: (__this.CreditCardProfile.CCCity === undefined) ? \"\" : __this.CreditCardProfile.CCCity,\r\n State: (__this.CreditCardProfile.CCState === undefined) ? \"\" : __this.CreditCardProfile.CCState,\r\n CVV: (__this.CreditCardProfile.CVV === undefined) ? \"\" : __this.CreditCardProfile.CVV,\r\n UpdateProfile: (__this.CreditCardProfile.UpdateProfile === undefined) ? '0' : __this.CreditCardProfile.UpdateProfile\r\n };\r\n\r\n $scope.Service.Services = null;\r\n var Acct = $scope.Service;\r\n Acct.DueDate = Acct.DueDate.replaceAll('/', '');\r\n var CCDraftDetails = {\r\n Account: Acct,\r\n CreditCardDetails: CCDetails,\r\n };\r\n CCDraftDetails.Mode = mode;\r\n\r\n httpCache.removeAll();\r\n //console.log($rootScope.serviceBase + 'EntityValidators/?entityName=CreditCardProfileDTO&jsonModelName=CreditCardProfile&isForAuth=undefined');\r\n //httpCache.remove($rootScope.serviceBase + 'EntityValidators/?entityName=CreditCardProfileDTO&jsonModelName=CreditCardProfile&isForAuth=undefined');\r\n //httpCache.remove($rootScope.serviceBase + 'Account/Services/' + vm.MemberNo);\r\n // httpCache.remove($rootScope.serviceBase + 'CCDraft/' + 'GetCCDraft?MemberSep=' + vm.MemberNo + '000&DraftCode=' + $scope.Service.DraftCode);\r\n\r\n var ModCCDraftDetails = {\r\n Model: CCDraftDetails,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n\r\n var promisePost = genericService.post(serviceController + 'CreateCCDraft', ModCCDraftDetails);\r\n promisePost.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n\r\n //alert(pl.data.toString());\r\n Form.$aaFormExtensions.$resetChanged();\r\n if (pl.data.toString() != '\"Success\"') {\r\n DisplayMessage(mode == 'A' ? 'Create Failed' : mode == 'U' ? 'Update Failed' : 'Delete Failed', pl.data.toString().replaceAll('\"', ''), 'OK');\r\n }\r\n else {\r\n //LoadRecordsServ();\r\n Form.$editMode = false;\r\n if (mode == 'D') {\r\n vm.HasExisting = false;\r\n //Form.$editMode = true;\r\n vm.CreditCardProfile.CardName = '';\r\n vm.CreditCardProfile.CardType = '';\r\n vm.CreditCardProfile.CCNumber = '';\r\n vm.CCNumberMasked = '';\r\n vm.CreditCardProfile.CVV = '';\r\n vm.CreditCardProfile.ExpirationDate = new Date();\r\n vm.CreditCardProfile.ZipCode = '';\r\n vm.CreditCardProfile = {};\r\n //LoadExistingCCDraft(Form);\r\n DisplayMessage(\"Credit Card Draft Deleted\", \"Your credit card draft has been successfully deleted.\", 'OK');\r\n }\r\n else if (mode == 'U') {\r\n DisplayMessage(\"Credit Card Draft Updated\", \"Your credit card draft has been successfully updated.\", 'OK');\r\n } else {\r\n Form.$editMode = false;\r\n vm.HasExisting = true;\r\n LoadRecordsServ();\r\n DisplayMessage(\"Credit Card Draft Created\", \"Your credit card draft has been successfully created.\", 'OK');\r\n }\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n });\r\n }\r\n\r\n vm.GetBankName = function () {\r\n if (this.ECheckProfile.RoutingNumber != null) {\r\n var ECDetails = {\r\n RoutingNumber: this.ECheckProfile.RoutingNumber\r\n };\r\n\r\n $scope.Service.Services = null;\r\n var Acct = $scope.Service;\r\n Acct.DueDate = Acct.DueDate.replaceAll('/', '');\r\n\r\n var CCDraftDetails = {\r\n Account: Acct,\r\n ECheckDetails: ECDetails,\r\n };\r\n\r\n var promisePost = genericService.post('BankDraft/' + 'GetBankName', CCDraftDetails);\r\n\r\n promisePost.then(function (pl) {\r\n if (pl.data.toString() == '\"The transit number does not exist.\"') {\r\n DisplayMessage('Invalid Transit Number', pl.data.toString().replaceAll('\"', ''), 'OK');\r\n }\r\n else {\r\n vm.ECheckProfile.BankName = pl.data.toString().replaceAll('\"', '');\r\n }\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n })\r\n }\r\n }\r\n\r\n vm.SubmitBankDraft = function (Form, mode) {\r\n var __this = this;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $rootScope.rootscopeLoading = true;\r\n\r\n var ECDetails = {\r\n LastName: __this.ECheckProfile.Name,\r\n BankAccountNumber: __this.ECheckProfile.BankAccountNumber,\r\n RoutingNumber: __this.ECheckProfile.RoutingNumber,\r\n AccountType: __this.ECheckProfile.PrintCode\r\n };\r\n\r\n $scope.Service.Services = null;\r\n var Acct = $scope.Service;\r\n Acct.DueDate = Acct.DueDate.replaceAll('/', '');\r\n var CCDraftDetails = {\r\n Account: Acct,\r\n ECheckDetails: ECDetails,\r\n };\r\n CCDraftDetails.Mode = mode;\r\n\r\n httpCache.removeAll();\r\n //httpCache.remove($rootScope.serviceBase + 'EntityValidators/?entityName=ECheckProfileDTO&jsonModelName=ECheckProfile&isForAuth=undefined');\r\n //httpCache.remove($rootScope.serviceBase + 'Account/Services/' + vm.MemberNo);\r\n // httpCache.remove($rootScope.serviceBase + 'BankDraft/' + 'GetBankDraft?MemberSep=' + vm.MemberNo + '000&DraftCode=' + $scope.Service.DraftCode);\r\n var ModCCDraftDetails = {\r\n Model: CCDraftDetails,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n\r\n var promisePost = genericService.post('BankDraft/' + 'CreateBankDraft', ModCCDraftDetails);\r\n promisePost.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n Form.$aaFormExtensions.$resetChanged();\r\n if (pl.data.toString() != '\"Success\"') {\r\n DisplayMessage(mode == 'A' ? 'Create Failed' : mode == 'U' ? 'Update Failed' : 'Delete Failed', pl.data.toString().replaceAll('\"', ''), 'OK');\r\n }\r\n else {\r\n Form.$editMode = false;\r\n if (mode == 'D') {\r\n vm.HasExisting = false;\r\n Form.$editMode = false;\r\n vm.ECheckProfile.Name = '';\r\n vm.ECheckProfile.BankAccountNumber = '';\r\n vm.ECheckProfile.RoutingNumber = '';\r\n vm.ECheckProfile.BankName = '';\r\n vm.ECheckProfile.PrintCode = '';\r\n vm.ECheckProfile = {};\r\n LoadExistingBankDraft(Form);\r\n DisplayMessage(\"Bank Draft Deleted\", \"Your bank draft has been successfully deleted.\", 'OK');\r\n }\r\n else if (mode == 'U') {\r\n DisplayMessage(\"Bank Draft Updated\", \"Your bank draft has been successfully updated.\", 'OK');\r\n }\r\n else {\r\n Form.$editMode = false;\r\n vm.HasExisting = true;\r\n LoadRecordsServ();\r\n DisplayMessage(\"Bank Draft Created\", \"Your bank draft has been successfully created.\", 'OK');\r\n }\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n });\r\n }\r\n function confirmDelete() {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var confirm = $mdDialog.confirm(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Delete Draft')\r\n .textContent('Are you sure you want to delete this draft?')\r\n .ariaLabel('Delete Draft')\r\n .ok('Yes')\r\n .cancel('No')\r\n .multiple(true);\r\n\r\n return $mdDialog.show(confirm);\r\n }\r\n\r\n function DisplayMessage(title, text, command) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .title(title)\r\n .textContent(text)\r\n .ariaLabel(title)\r\n .ok(command));\r\n }\r\n function GetNumberCCType(typeName) {\r\n var typeNumber;\r\n\r\n switch (typeName) {\r\n case \"visa\":\r\n typeNumber = \"01\";\r\n break;\r\n case \"mastercard\":\r\n typeNumber = \"02\";\r\n break;\r\n case \"discover\":\r\n typeNumber = \"03\";\r\n break;\r\n case \"amex\":\r\n typeNumber = \"04\";\r\n break;\r\n default:\r\n typeNumber = typeName;\r\n }\r\n\r\n return typeNumber;\r\n }\r\n function GetNameCCType(typeNumber) {\r\n var typeName;\r\n\r\n switch (typeNumber) {\r\n case \"01\":\r\n typeName = \"visa\";\r\n break;\r\n case \"02\":\r\n typeName = \"mastercard\";\r\n break;\r\n case \"03\":\r\n typeName = \"discover\";\r\n break;\r\n case \"04\":\r\n typeName = \"amex\";\r\n break;\r\n default:\r\n typeName = typeNumber;\r\n }\r\n\r\n return typeName;\r\n }\r\n\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .factory('BankDraftContext', [\"genericService\", \"$resource\", \"authService\", '$rootScope', 'commonService', '$state', '$cacheFactory', BankDraftContext]);\r\n\r\n /** @ngInject\r\n * @ngdoc factory\r\n * @name PaymentContext\r\n * @requires genericService\r\n * @description Factory used to interact with Account Profile back-end.\r\n */\r\n function BankDraftContext(genericService, $resource, authService, $rootScope, commonService, $state, $cacheFactory) {\r\n var EntitiesValidatorsURL = 'EntityValidators/';\r\n var httpCache = $cacheFactory.get('$http');\r\n\r\n return {\r\n getValidators: GetValidators,\r\n CCNumberMasked: \"\"\r\n\r\n }\r\n\r\n function GetValidators(entityName, jsonModelName, isForAuth) {\r\n return genericService.get(EntitiesValidatorsURL + \"?entityName=\" + entityName + \"&jsonModelName=\" + jsonModelName + \"&isForAuth=\" + isForAuth);\r\n }\r\n }\r\n})();\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('PaymentController', ['genericService','PaymentContext', '$mdDialog', '$mdMedia', '$scope', '$state', 'CCValidators', 'ECValidators', '$rootScope', 'commonService', 'authService', '$window', PaymentController]);\r\n\r\n /** @ngInject\r\n * @ngdoc controller\r\n * @name PaymentController\r\n * @description Controller used to interact with Payment screen.\r\n */\r\n function PaymentController(genericService,PaymentContext, $mdDialog, $mdMedia, $scope, $state, CCValidators, ECValidators, $rootScope, commonService, authService, $window) {\r\n /// Variables.\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n var __this = this;\r\n $window.document.title = \"Payment - \" + document.getElementById(\"title\").title;\r\n PaymentContext.setCCValidation(CCValidators.data);\r\n PaymentContext.setECValidation(ECValidators.data);\r\n\r\n angular.extend(this, {\r\n EcheckStat: 0,\r\n CreditCardStat: 0,\r\n IsPPM: false,\r\n /// Bindding Data.\r\n paymentProgress: { activated: false },\r\n paymentData: { title: '', type: 1, AccountServices: [] },\r\n isOpen: false,\r\n MemberNo: $state.params.id,\r\n account: { totalPPMPaymentNeeded: 0, PPMPaymentLabel: \"\", isBelowThreshold: false },\r\n\r\n\r\n //Parameters: PortalParameters(),\r\n SmartAppConfig: {}, //PaymentContext.getSmartAppConfig().data,\r\n\r\n /// Collections and objects.\r\n AccountServices: [],\r\n\r\n /// Configuration Values.\r\n customFullscreen: $mdMedia('xs') || $mdMedia('sm'),\r\n dtOptions: {\r\n autoWidth: false, dom: 'lrtip', order: [1, 'asc'], paging: false, responsive: true, scroller: false, processing: true, info: false, language: {\r\n \"emptyTable\": \"Loading\",\r\n \"zeroRecords\": \"No matching records found\"\r\n },\r\n },\r\n\r\n /// Methods.\r\n calculateTotalPPMPaymentNeeded: CalculateTotalPPMPaymentNeeded,\r\n LoadForm: LoadForm,\r\n rephrasePPMPaymentLabel: RephrasePPMPaymentLabel,\r\n showPaymentScreen: showPaymentScreen,\r\n\r\n PortalSettings: {}, //PaymentContext.getSettings(),\r\n SetSmartAppConfig: SetSmartAppConfig\r\n });\r\n\r\n\r\n /// Internal Functions.\r\n /**\r\n * @ngdoc method\r\n * @name LoadForm\r\n * @author Juan Leon \r\n * @description Method used to Load the values needed at starting time.\r\n */\r\n function LoadForm() {\r\n /// Load data from Context.\r\n $rootScope.rootscopeLoading = true;\r\n \r\n PaymentContext.getSettings().then(function (data) {\r\n __this.PortalSettings = data;\r\n\r\n __this.Parameters = PortalParameters();\r\n }, function (error) {\r\n\r\n __this.PortalSettings = {};\r\n\r\n __this.Parameters = PortalParameters();\r\n });\r\n \r\n SetSmartAppConfig();\r\n\r\n PaymentContext.loadPaymentService($state.params.id).then(function (data) {\r\n __this.AccountServices = data.data.Services;\r\n __this.IsPPM = data.data.IsPPM === \"P\";\r\n __this.BudgetLevelized = data.data.BillCode;\r\n\r\n if (data.data.ppmLabel != \"\" && data.data.ppmMinPayment != null) {\r\n __this.PPMPaymentLabel = RephrasePPMPaymentLabel(data.data.ppmLabel);\r\n __this.PPMPaymentNeeded = data.data.ppmMinPayment;\r\n }\r\n\r\n //#region Old Logic Threshold\r\n\r\n //__this.account.totalPPMPaymentNeeded = __this.calculateTotalPPMPaymentNeeded(__this.AccountServices);\r\n\r\n //if (data.data.IsPPM == \"P\" && (__this.account.totalPPMPaymentNeeded != 0.00 && __this.account.totalPPMPaymentNeeded != null)) {\r\n // __this.account.isBelowThreshold = true;\r\n // __this.account.PPMPaymentLabel = __this.rephrasePPMPaymentLabel(__this.AccountServices[0].PPMPaymentLabel);\r\n //}\r\n //else\r\n // __this.account.isBelowThreshold = false;\r\n\r\n //#endregion\r\n\r\n\r\n //Get PPM Minimum Payment to Stay Connected, SECOND SOLUTION for MND-1251\r\n //for (var i = 0; i < __this.AccountServices.length; i++) {\r\n // //if (__this.AccountServices[i].Balance > __this.AccountServices.DisconnectThreshold) {\r\n // // __this.AccountServices[i].PPMPaymentNeeded = (__this.AccountServices[i].Balance - __this.AccountServices.DisconnectThreshold) + 0.01;\r\n // // __this.account.isBelowThreshold = true;\r\n // //}\r\n\r\n // if (__this.AccountServices[i].PPMPaymentNeeded != 0.00)\r\n // __this.account.isBelowThreshold = true;\r\n //}\r\n\r\n //__this.AccountServices[0].Balance = parseFloat(data.data.Services[0].Balance);\r\n //__this.AccountServices.PPMPaymentNeeded = parseFloat(data.data.PPMPaymentNeeded);\r\n //__this.AccountServices.Threshold = __this.AccountServices[0].Balance - (__this.AccountServices.PPMPaymentNeeded - 0.01);\r\n\r\n //console.log(__this.AccountServices[0].Balance + \" > \" + __this.AccountServices.Threshold + \" = \" + (__this.AccountServices[0].Balance - (__this.AccountServices.PPMPaymentNeeded - 0.01) == __this.AccountServices.Threshold ? true : false));\r\n\r\n for (var i = 0; i < __this.AccountServices.length; i++) {\r\n __this.AccountServices[i].MemberSep = __this.AccountServices[i].MemberSep.substr(0, __this.AccountServices[i].MemberSep.length - 3) + '-' + __this.AccountServices[i].MemberSep.substr(__this.AccountServices[i].MemberSep.length - 3);\r\n }\r\n\r\n PaymentContext.defineObject(__this.AccountServices, PaymentContext.AccountServicesObject);\r\n\r\n __this.AccountServices.PaymentDetails.dueDate = data.data.DueDate;\r\n __this.AccountServices.calculateTotalAmount();\r\n\r\n\r\n /// Enable functionality by parameters.\r\n if (__this.Parameters != undefined && __this.Parameters.FourthParameters != undefined && __this.Parameters.FourthParameters.FOURTHPARM_38 != undefined && __this.Parameters.FourthParameters.FOURTHPARM_38 == 0) {\r\n __this.AccountServices.showChecks();\r\n }\r\n $scope.balanceWidth = commonService.getNumericColumnWidth(__this.AccountServices, \"Balance\", 0, 83.92);\r\n $scope.pastDueWidth = commonService.getNumericColumnWidth(__this.AccountServices, \"PastDue\", 0, 89.6);\r\n $rootScope.rootscopeLoading = false;\r\n },\r\n function (error) {\r\n if (error) {\r\n if (error.status != 500) {\r\n __this.dtOptions.language.emptyTable = 'Unable to load records'\r\n }\r\n }\r\n\r\n $rootScope.rootscopeLoading = false;\r\n\r\n commonService.handleError(error);\r\n __this.AccountServices = undefined;\r\n $rootScope.rootscopeLoading = false;\r\n });\r\n }\r\n\r\n function SetSmartAppConfig() {\r\n\r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n if ($rootScope.smartAppConfig[x].ConfigId == '55') {\r\n __this.EcheckStat = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '54') {\r\n __this.CreditCardStat = $rootScope.smartAppConfig[x].Value;\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name showPaymentScreen\r\n * @author Juan Leon \r\n * @description Method used to popup a dialogbox with the detail of\r\n * the selected services that the client want to pay.\r\n **/\r\n function showPaymentScreen(type, ev) {\r\n $rootScope.paymentType = type;\r\n\r\n /// Creating the object with the data to be loaded in payment detail.\r\n this.paymentData = {\r\n title: (type == 'CreditCard') ? \"Credit Card\" : \"E-Check\",\r\n type: (type == 'CreditCard') ? 1 : 2,\r\n AccountServices: __this.AccountServices,\r\n BudgetLevelized: __this.BudgetLevelized,\r\n IsPPM: __this.IsPPM,\r\n showNote: CheckCreditBalance(),\r\n balanceHasMillion: $scope.balanceHasMillion,\r\n pastDueHasMillion: $scope.pastDueHasMillion\r\n }\r\n var paymentDialog = {\r\n templateUrl: 'app/main/msportal/views/payment/detail/payment_detail.html',\r\n parent: angular.element(document.body),\r\n targetEvent: ev,\r\n clickOutsideToClose: true,\r\n fullscreen: ($mdMedia('sm') || $mdMedia('xs')) && __this.customFullscreen,\r\n locals: { paymentData: __this.paymentData },\r\n controller: \"PaymentDetailController as paymentDetail\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n };\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n if (type === 'ECheck') {\r\n GetCheckCode().then(function (response) {\r\n var checkCode = response.data;\r\n $rootScope.rootscopeLoading = false;\r\n if (checkCode === \"01\") {\r\n $rootScope.rootscopeLoading = false;\r\n $mdDialog.show(commonService.simpleAlertDialog({\r\n title: \"E-Check Payment Error\",\r\n message: \"Payment with E-Check is not allowed. Contact your Utility for more information or pay with another method of payment.\",\r\n buttonLabel: \"Close\"\r\n }));\r\n return;\r\n } else {\r\n $mdDialog.show(paymentDialog).then(function (answer) {\r\n __this.SelectedIndex = 0;\r\n LoadForm();\r\n }, function () { });\r\n }\r\n }, function (error) {\r\n commonService.handleError(error);\r\n });\r\n } else {\r\n $rootScope.rootscopeLoading = false;\r\n $mdDialog.show(paymentDialog).then(function (answer) {\r\n __this.SelectedIndex = 0;\r\n LoadForm();\r\n }, function () { });\r\n }\r\n });\r\n }\r\n\r\n function PortalParameters() {\r\n var Parameters = __this.PortalSettings.data.Response;\r\n Parameters['ShowConvCCFlag'] = __this.PortalSettings.data.ShowConvCCFlag;\r\n Parameters['ShowConvECFlag'] = __this.PortalSettings.data.ShowConvECFlag;\r\n\r\n return Parameters;\r\n }\r\n\r\n\r\n function CalculateTotalPPMPaymentNeeded(accountServices) {\r\n var total = 0;\r\n angular.forEach(accountServices, function (service, key) {\r\n total += service.PPMPaymentNeeded;\r\n });\r\n return total;\r\n }\r\n function RephrasePPMPaymentLabel(label) {\r\n var newLabel = \"\";\r\n if (label == \"Min Payment to Stay connected:\") {\r\n newLabel = \"Minimum Payment to Stay Connected on Prepaid:\";\r\n } else if (label == \"Min Payment to Get Reconnected:\") {\r\n newLabel = \"Minimum Payment to Get Reconnected:\";\r\n } else if (label == \"Payment to Reach Min PPM Bal:\") {\r\n newLabel = \"Payment to Reach Minimum Prepaid Balance:\";\r\n } else if (label == \"Min Payment to Stay connected on PPM:\") {\r\n newLabel = \"Minimum Payment to Stay Connected on Prepaid:\";\r\n }\r\n return newLabel;\r\n }\r\n\r\n function GetCheckCode() {\r\n var membserSep = __this.AccountServices.length > 0 ? __this.AccountServices[0].MemberSep : '';\r\n return genericService.post('Payments/CheckCode/' + membserSep);\r\n }\r\n\r\n function CheckCreditBalance() {\r\n if (__this.AccountServices.isByService) {\r\n return (__this.AccountServices.checkCreditBalance());\r\n }\r\n else {\r\n var services = __this.AccountServices;\r\n for (var i = 0; i < services.length; i++) {\r\n if (services[i].Balance < 0) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .factory('PaymentContext', [\"genericService\", \"$resource\", \"authService\", '$rootScope', 'commonService', '$state', '$cacheFactory', PaymentContext]);\r\n\r\n /** @ngInject\r\n * @ngdoc factory\r\n * @name PaymentContext\r\n * @requires genericService\r\n * @description Factory used to interact with Account Profile back-end.\r\n */\r\n function PaymentContext(genericService, $resource, authService, $rootScope, commonService, $state, $cacheFactory) {\r\n var serviceController = 'Account/Services/';\r\n var paymentController = 'Payments/';\r\n var EntitiesValidatorsURL = 'EntityValidators/';\r\n var __this = this;\r\n var httpCache = $cacheFactory.get('$http');\r\n var MemberNo = '';\r\n\r\n this.getPaymentDetail = function () {\r\n return this.PaymentDetailData;\r\n };\r\n this.setPaymentDetail = function (obj) {\r\n this.PaymentDetailData = angular.copy(obj);\r\n };\r\n\r\n return {\r\n Parameters: function () { return $rootScope.Parameters },\r\n smartAppConfig: function () { return $rootScope.smartAppConfig },\r\n loadPaymentService: LoadRecordsServ,\r\n defineObject: DefineObject,\r\n payBill: PayBill,\r\n getPaymentValidators: GetPaymentValidators,\r\n getSettings: GetSettings,\r\n getSmartAppConfig: GetSmartAppConfig,\r\n CCValidation: {},\r\n ECValidation: {},\r\n getCCValidation: function () {\r\n return this.CCValidation;\r\n },\r\n setCCValidation: function (obj) {\r\n this.CCValidation = angular.copy(obj);\r\n },\r\n\r\n getECValidation: function () {\r\n return this.ECValidation;\r\n },\r\n setECValidation: function (obj) {\r\n this.ECValidation = angular.copy(obj);\r\n },\r\n\r\n Decrypt: commonService.Decrypt,\r\n Encrypt: commonService.Encrypt,\r\n\r\n AccountServicesObject: {\r\n /// Bindings.\r\n isByService: false,\r\n allServices: false,\r\n memberNo: $state.params.id,\r\n PaymentDetails: {\r\n totalAmount: 0,\r\n convenienceFee: 0,\r\n totalPaymentAmount: 0,\r\n dueDate: '',\n totalAmountDisplay: 0,\r\n },\r\n\r\n /// Methods.\r\n calculateTotalAmount: CalculateTotalAmount,\r\n hideChecks: HideChecks,\r\n showChecks: ShowChecks,\r\n toggleAll: toggleAll,\r\n getSelectedService: GetSelectedService,\r\n getAccountDetails: GetAccountDetails,\r\n getAccounts: GetAccounts,\r\n loadConvenienceFee: LoadConvenienceFee,\r\n payBill: PayBill,\n checkCreditBalance: CheckCreditBalance,\r\n },\r\n deleteProfile: DeleteProfile\r\n }\r\n\r\n /// Internal functions.\r\n\r\n /**\r\n * @ngdoc API method\r\n * @name DefineObject\r\n * @author Juan Leon \r\n * @description Method used to get all the payment information from REST\r\n * services and then bind the data with the local variables.\r\n **/\r\n function DefineObject(source, schema) {\r\n angular.extend(source, schema);\r\n }\r\n /**\r\n * @ngdoc API method\r\n * @name LoadRecordsServ\r\n * @author Juan Leon \r\n * @description Method used to get all the payment information from REST\r\n * services and then bind the data with the local variables.\r\n **/\r\n function LoadRecordsServ(MemberNo) {\r\n return genericService.get(serviceController + MemberNo);\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name HideChecks\r\n * @author Juan Leon \r\n * @description Method used to hide checkboxes.\r\n **/\r\n function HideChecks() {\r\n this.isByService = false;\r\n this.calculateTotalAmount();\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name ShowChecks\r\n * @author Juan Leon \r\n * @description Method used to show checkboxes.\r\n **/\r\n function ShowChecks() {\r\n this.isByService = true;\r\n this.calculateTotalAmount();\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name toggleAll\r\n * @author Juan Leon \r\n * @description Method used to collective selection of checkbox controls in user interface.\r\n */\r\n function toggleAll() {\r\n var _this = this;\r\n\r\n this.forEach(function (element, index, array) {\r\n element.checkStatus = !_this.allServices;\r\n });\r\n\r\n this.calculateTotalAmount(true);\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name CalculateTotalAmount\r\n * @author Juan Leon \r\n * @description Method used to hide checkboxes.\r\n **/\r\n function CalculateTotalAmount(cameFromToggle) {\r\n var AmountByAccount = 0;\n var AmountByAccountDisplay = 0;\n var PastDueByAccount = 0;\n var PastDueByAccountDisplay = 0;\r\n var TotalAmount = 0;\n var TotalAmountDisplay = 0;\n var TotalPastDueDisplay = 0;\r\n var Selected = 0;\r\n var _this = this;\n _this.PastDueOn = false;\n\n if ($rootScope.Parameters.FourthParameters.FOURTHPARM_62 == 1) {\n _this.PastDueOn = true;\r\n }\r\n\r\n this.forEach(function (element, index, array) {\r\n\r\n // It always calculate the total of services in account even if not selected in order to compare with the selected.\r\n if (element.Balance > 0) {\n AmountByAccount += parseFloat(element.Balance);\n if (_this.PastDueOn) {\n PastDueByAccount += parseFloat(element.PastDue);\r\n }\n }\n //It is use to display total amount due in payment screen\n AmountByAccountDisplay += parseFloat(element.Balance);\n if (_this.PastDueOn) {\n PastDueByAccountDisplay += parseFloat(element.PastDue);\r\n }\r\n // It is used to create a second balance field for be changed, without changing the actual balance value.\r\n if (element.SubTotal == null) {\r\n element.SubTotal = angular.copy(element.Balance);\r\n }\r\n\r\n if (_this.isByService) {\r\n // It takes the selected services only.\r\n if (element.checkStatus) {\r\n Selected++;\r\n TotalAmount += parseFloat(element.SubTotal);\n TotalAmountDisplay += parseFloat(element.Balance);\r\n }\r\n }\r\n });\r\n\r\n // Validate if the totalAmount is by Service or by Account calculated.\r\n this.PaymentDetails.totalAmount = (this.isByService) ? parseFloat(TotalAmount).toFixed(2) : parseFloat(AmountByAccount).toFixed(2);\r\n this.PaymentDetails.totalAmountDisplay = (this.isByService) ? parseFloat(TotalAmountDisplay).toFixed(2) : parseFloat(AmountByAccountDisplay).toFixed(2);\n if (_this.PastDueOn) {\n this.PaymentDetails.totalPastDue = parseFloat(PastDueByAccount).toFixed(2);\r\n this.PaymentDetails.totalPastDueDisplay = parseFloat(PastDueByAccountDisplay).toFixed(2);\r\n }\n if (!cameFromToggle)\r\n this.allServices = (Selected == this.length);\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name GetSelectedService\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function GetSelectedService() {\r\n var _this = this;\r\n var AccountServices = [];\r\n\r\n this.forEach(function (element, index, array) {\r\n if (_this.isByService) {\r\n //if (element.Balance > 0 && element.checkStatus) {\r\n if (element.checkStatus) {\r\n if (element.Balance < 0) {\r\n element.SubTotal = 0;\r\n }\r\n AccountServices.push(element);\n\r\n }\r\n }\r\n else {\r\n if (element.Balance < 0) {\r\n element.SubTotal = 0;\r\n }\r\n AccountServices.push(element);\r\n //}\r\n }\r\n });\r\n\r\n AccountServices = angular.copy(AccountServices);\r\n\r\n DefineObject(AccountServices, {\r\n /// Bindings.\r\n isByService: false,\r\n allServices: false,\r\n memberNo: $state.params.id,\r\n PaymentDetails: {\r\n totalAmount: 0,\r\n convenienceFee: 0,\r\n totalPaymentAmount: 0,\r\n dueDate: '',\n AmountByAccountDisplay: 0,\n totalAmountDisplay: 0,\r\n },\r\n\r\n /// Methods.\r\n calculateTotalAmount: CalculateTotalAmount,\r\n hideChecks: HideChecks,\r\n showChecks: ShowChecks,\r\n toggleAll: toggleAll,\r\n getSelectedService: GetSelectedService,\r\n getAccountDetails: GetAccountDetails,\r\n getAccounts: GetAccounts,\r\n loadConvenienceFee: LoadConvenienceFee,\r\n payBill: PayBill,\r\n });\r\n\r\n AccountServices.isByService = this.isByService;\r\n AccountServices.allServices = this.allServices;\r\n AccountServices.PaymentDetails = angular.copy(this.PaymentDetails);\r\n AccountServices.PaymentDetails.convenienceFee = 0.0;\r\n AccountServices.PaymentDetails.totalPaymentAmount = 0.0;\r\n\r\n return AccountServices;\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name GetAccountDetails\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function GetAccountDetails() {\r\n var AccountDetails = [];\r\n\r\n if (this.isByService) {\r\n this.forEach(function (element, index, array) {\r\n if (!element.SubTotal) {\r\n element.SubTotal = 0;\r\n }\r\n AccountDetails.push({\r\n Amount: (element.SubTotal >= 0 ? element.SubTotal : 0),\r\n //Account: element.MemberSep.replace('-', ''),\r\n Account: element.MemberSep,\r\n })\r\n });\r\n }\r\n else {\r\n if (!this.PaymentDetails.totalAmount || this.PaymentDetails.totalAmount < 0) {\r\n this.PaymentDetails.totalAmount = 0;\r\n }\r\n AccountDetails.push({\r\n Amount: this.PaymentDetails.totalAmount,\r\n Account: this[0].MemberSep.substring(0, 8),\r\n })\r\n }\r\n\r\n return AccountDetails;\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name GetAccountDetails\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function GetAccounts() {\r\n var Accounts = [];\r\n\r\n if (this.isByService) {\r\n this.forEach(function (element, index, array) {\r\n Accounts.push({\r\n MemberSep: element.MemberSep.replace('-', ''),\r\n Balance: parseFloat(element.Balance).toFixed(2),\r\n Status: element.Status.substring(0, 1),\r\n PaymentAmount: parseFloat(element.SubTotal).toFixed(2),\r\n });\r\n });\r\n }\r\n else {\r\n var AccountStatus;\r\n\r\n this.some(function (element, index, array) {\r\n AccountStatus = element.Status.toUpperCase();\r\n return element.Status.toUpperCase() === 'ACTIVE';\r\n });\r\n\r\n Accounts.push({\r\n MemberSep: this[0].MemberSep.substring(0, 8) + \"-000\",\r\n Balance: parseFloat(this.PaymentDetails.totalAmount).toFixed(2),\r\n Status: AccountStatus.substring(0, 1),\r\n PaymentAmount: parseFloat(this.PaymentDetails.totalAmount).toFixed(2),\r\n });\r\n }\r\n\r\n return Accounts;\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name PayBill\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function PayBill(PaymentInput, PaymentType) {\r\n\r\n //Commented by Rovie 2/22/2017 (MND-946)\r\n //if (PaymentType == 'CC') {\r\n // PaymentInput.CreditCardDetails.UpdateProfile = (PaymentInput.CreditCardDetails.UpdateProfile ? 1 : 0);\r\n\r\n // alert(\"Payment Input Update Profile: \" + PaymentInput.CreditCardDetails.UpdateProfile);\r\n //}\r\n //else {\r\n MemberNo = PaymentInput.Accounts[0].MemberSep.substr(0, 8);\r\n httpCache.remove($rootScope.serviceBase + serviceController + MemberNo);\r\n httpCache.remove($rootScope.serviceBase + 'Accounts/' + authService.authentication.CustomerID);\r\n\r\n if (PaymentType == \"EC\") {\r\n //TODO: ECHECK PAYMENT\r\n\r\n //Commented by Rovie 2/22/2017 (MND-946)\r\n //PaymentInput.ECheckDetails.UpdateProfile = (PaymentInput.ECheckDetails.UpdateProfile ? 1 : 0);\r\n PaymentInput.ECheckDetails.ZipCode = !PaymentInput.ECheckDetails.ZipCode ? '00000' : PaymentInput.ECheckDetails.ZipCode.substr(0, 5);\r\n if (!PaymentInput.ECheckDetails.MiddleName) {\r\n PaymentInput.ECheckDetails.MiddleName = genericService.nullToBlank(PaymentInput.ECheckDetails.MiddleName, false);\r\n }\r\n if (!PaymentInput.ECheckDetails.Suffix) {\r\n PaymentInput.ECheckDetails.Suffix = genericService.nullToBlank(PaymentInput.ECheckDetails.Suffix, false);\r\n }\r\n if (!PaymentInput.ECheckDetails.CompanyName) {\r\n PaymentInput.ECheckDetails.CompanyName = genericService.nullToBlank(PaymentInput.ECheckDetails.CompanyName, false);\r\n }\r\n if (!PaymentInput.ECheckDetails.EMail) {\r\n PaymentInput.ECheckDetails.EMail = genericService.nullToBlank(PaymentInput.ECheckDetails.EMail, false);\r\n }\r\n if (!PaymentInput.ECheckDetails.Address2) {\r\n PaymentInput.ECheckDetails.Address2 = genericService.nullToBlank(PaymentInput.ECheckDetails.Address2, false);\r\n }\r\n\r\n }\r\n\r\n ////Stringify the Object before encrypting\r\n //var strPaymentInput = JSON.stringify(PaymentInput);\r\n //var EncryptedText = commonService.Encrypt(strPaymentInput, $rootScope.CryptData.Key, $rootScope.CryptData.IV);\r\n\r\n //return genericService.post(paymentController, { EncryptedText: EncryptedText, Key: $rootScope.CryptData.Key, IV: $rootScope.CryptData.IV });\r\n\r\n var ModPaymentInput = {\n Model: PaymentInput,\n RoleType: authService.adminAuthentication.roleType,\n AdminUsername: authService.adminAuthentication.userName\n };\r\n return genericService.post(paymentController, ModPaymentInput);\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name LoadConvenienceFee\r\n * @author Juan Leon \r\n * @description Method used to get the data from the principal data.\r\n */\r\n function LoadConvenienceFee(AccountDetail, DeviceDetail, PaymentType) {\r\n var _this = this;\r\n\n var ConvFee = {\n AccountDetails: AccountDetail,\n DeviceDetails: DeviceDetail,\n PaymentType: PaymentType\n };\n var ModConvFee = {\n Model: ConvFee,\n RoleType: authService.adminAuthentication.roleType,\n AdminUsername: authService.adminAuthentication.userName\n };\r\n commonService.LoadConvFee(ModConvFee).then(function (data) {\r\n\r\n _this.PaymentDetails.convenienceFee = data.data.ConvenienceFee;\r\n\r\n if (_this.isByService) {\r\n _this.PaymentDetails.totalAmount = parseFloat(data.data.TotalAmount).toFixed(2);\n }\r\n\r\n _this.PaymentDetails.totalPaymentAmount = parseFloat(data.data.PayAmount).toFixed(2);\r\n }, function (errorPl) {\n\r\n });\r\n }\r\n\r\n\r\n /**\r\n * @ngdoc internal function\r\n * @name GetPaymentValidators\r\n * @author Juan Leon \r\n * @param {String = entityName} Identifier Account Number.\r\n * @param {String = ModeljsonModelName} The Data to be updated in the back-end.\r\n * @description Internal Function used to get the Model validations.\r\n */\r\n function GetPaymentValidators(entityName, jsonModelName) {\r\n return genericService.get(EntitiesValidatorsURL + \"?entityName=\" + entityName + \"&jsonModelName=\" + jsonModelName);\r\n }\r\n\r\n function GetSettings() {\r\n return genericService.get(\"Settings?DeviceType=WEBOS&HardwareId=\");\r\n }\r\n\r\n function GetSmartAppConfig() {\r\n return genericService.get('SmartAppConfig/');\r\n }\r\n\r\n function DeleteProfile(paymentType) {\r\n if (paymentType == 'EC') {\r\n\r\n } else { //paymentType = CC\r\n\r\n }\r\n }\n\n function CheckCreditBalance() {\r\n var display = false;\r\n if (this.isByService) {\r\n this.forEach(function (element, index, array) {\r\n if (element.checkStatus) {\r\n if (element.Balance < 0) {\r\n display = true;\r\n }\r\n }\r\n });\r\n }\r\n return display;\r\n }\r\n }\r\n})();\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('DepositsController', ['genericService', 'authService', '$mdDialog', '$state', '$rootScope', 'commonService', '$window', DepositsController]);\r\n\r\n function DepositsController(genericService, authService, $mdDialog, $state, $rootScope, commonService, $window) {\r\n var vm = this;\r\n var serviceUrl = \"MemberDeposit/\";\r\n var serviceUrlExt = 'Account/Services/';\r\n $window.document.title = \"Deposits - \" + document.getElementById(\"title\").title;\r\n vm.account = $state.params.id;\r\n vm.depositDetails = {};\r\n\r\n vm.init = function () {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n genericService.get(serviceUrl + vm.account).then(function (pl) {\r\n vm.depositDetails = pl.data;\r\n vm.consumerDepositWidth = commonService.getNumericColumnWidth(vm.depositDetails, \"ConsumerDeposit\", 0, 113.6);\r\n vm.otherDepositWidth = commonService.getNumericColumnWidth(vm.depositDetails, \"OtherDeposit\", 0, 86.4);\r\n\r\n for (var i = 0; i < vm.depositDetails.length; i++) {\r\n vm.depositDetails[i].MemberSep = vm.depositDetails[i].MemberSep.substr(0, vm.depositDetails[i].MemberSep.length - 3) + '-' + vm.depositDetails[i].MemberSep.substr(vm.depositDetails[i].MemberSep.length - 3);\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading deposits', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n genericService.get(serviceUrlExt + vm.account).then(function (pl) {\r\n vm.depositDetailsExt = pl.data;\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading deposits', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n });\r\n }\r\n\r\n vm.dtInstance = {};\r\n\r\n vm.dtOptions = {\r\n //dom: '<\"top\"f>rt<\"bottom\"<\"left\"<\"length\"l>><\"right\"<\"info\"i><\"pagination\"p>>>', \r\n dom: 'Irtip',\r\n paging: false,\r\n autoWidth: false,\r\n responsive: true,\r\n scroller: true,\r\n processing: true,\r\n info: false, //Displays \"Showing 1 to 2 of 2 entries\"\r\n columnDefs: [\r\n {\r\n // Customer ID\r\n targets: 0,\r\n responsivePriority: 1,\r\n width: '10px'\r\n },\r\n {\r\n // Target the actions column\r\n targets: 8,\r\n responsivePriority: 1,\r\n filterable: false,\r\n sortable: false\r\n }\r\n\r\n ],\r\n language: {\r\n \"emptyTable\": \"No records available\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n }; //dtOptions\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('DelinquentController', DelinquentController)\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n\r\n /** @ngInject */\r\n function DelinquentController($scope, genericService, $http, $state, DTOptionsBuilder, $log, $rootScope, $mdDialog, commonService, $cacheFactory, authService, $window) {\r\n var serviceController = 'Account/Services/';\r\n var httpCache = $cacheFactory.get('$http');\r\n $window.document.title = \"E-Delinquent - \" + document.getElementById(\"title\").title;\r\n $scope.Service = {};\r\n $scope.MemberNo = $state.params.id;\r\n $scope.BillingPreferenceDesc = '';\r\n $scope.IsMatch = true;\r\n $scope.IsMatch2 = true;\r\n $scope.Email1_c = '';\r\n $scope.Email2_c = '';\r\n var HardwareId = '';\r\n $scope.ENotificationDetails = [];\r\n $scope.ModENotificationDetails = {};\r\n $scope.BillMethod = [\r\n { id: '00', desc: 'Paper' },\r\n { id: '01', desc: 'E-Delinquent' },\r\n { id: '02', desc: 'Paper & E-Delinquent' }];\r\n $scope.preventUnsavedPrompt = 'You have unsaved changes in your delinquent notice. Discard your changes?';\r\n\r\n LoadRecordsServ();\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n\r\n function LoadRecordsServ() {\r\n\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get(serviceController + $scope.MemberNo);\r\n\r\n promiseGet.then(function (pl) {\r\n $scope.Service = pl.data;\r\n LoadBillingPreference();\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services in delinquent notice', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n\r\n function LoadBillingPreference() {\r\n httpCache.remove($rootScope.serviceBase + 'BillingPreference/' + $scope.Service.Services[0].MemberSep + '/');\r\n var promiseGet = genericService.get('BillingPreference/' + $scope.Service.Services[0].MemberSep + '/' + HardwareId);\r\n\r\n promiseGet.then(function (pl) {\r\n $scope.ENotificationDetails = pl.data;\r\n $scope.Email1_c = $scope.ENotificationDetails.Email1;\r\n $scope.Email2_c = $scope.ENotificationDetails.Email2;\r\n $rootScope.rootscopeLoading = false;\r\n BindBillingMethod();\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading delinquent notice', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n function BindBillingMethod() {\r\n if ($scope.ENotificationDetails.Code2 == '01') {\r\n $scope.BillingPreferenceDesc = 'E-Delinquent';\r\n }\r\n else if ($scope.ENotificationDetails.Code2 == '02') {\r\n $scope.BillingPreferenceDesc = 'Paper & E-Delinquent';\r\n }\r\n else {\r\n $scope.ENotificationDetails.Code2 = '00';\r\n $scope.BillingPreferenceDesc = 'Paper';\r\n }\r\n }\r\n var cleanUpFunc = $rootScope.$on('refreshENotifications', function (event) {\r\n LoadBillingPreference();\r\n });\r\n\r\n $scope.$on('$destroy', function () {\r\n cleanUpFunc();\r\n });\r\n //TODO: Change alerts to a more presentable dialog\r\n $scope.SaveBillingPreference = function (theForm) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n if (theForm.$valid && $scope.IsMatch2 && $scope.IsMatch) {\r\n $rootScope.rootscopeLoading = true;\r\n $scope.ENotificationDetails.MemberSep = $scope.Service.Services[0].MemberSep;\r\n $scope.ENotificationDetails.NotificationType = 'E-Delinquent';\r\n\r\n httpCache.remove($rootScope.serviceBase + 'BillingPreference/' + $scope.Service.Services[0].MemberSep + '/');\r\n $scope.ModENotificationDetails = {\r\n Model: $scope.ENotificationDetails,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n var promisePut = genericService.put('BillingPreference/', $scope.Service.Services[0].MemberSep, $scope.ModENotificationDetails);\r\n\r\n promisePut.then(function (pl) {\r\n if (pl.data.Edit) {\r\n alertDialog('Save Failed', pl.data.Edit);\r\n }\r\n else {\r\n alertDialog('Save Successful', pl.data.Result);\r\n }\r\n\r\n theForm.$aaFormExtensions.$resetChanged();\r\n $rootScope.rootscopeLoading = false;\r\n $state.reload();\r\n },\r\n function (errorPl) {\r\n $log.error('failure updating delinquent notice', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n alertDialog('Update failed', 'Failed to update delinquent notice.');\r\n })\r\n }\r\n else {\r\n alertDialog('Invalid Input', 'Please correct your inputs with red labels and try again.');\r\n }\r\n });\r\n }\r\n $scope.CheckIfMatch = function (email, email_c, emailNo) {\r\n if (email && email_c) {\r\n if (email.toUpperCase() == email_c.toUpperCase()) {\r\n if (emailNo == 1) {\r\n $scope.IsMatch = true;\r\n }\r\n else {\r\n $scope.IsMatch2 = true;\r\n }\r\n\r\n return\r\n }\r\n } else if (!email && !email_c) {\r\n if (emailNo == 1) {\r\n $scope.IsMatch = true;\r\n }\r\n else {\r\n $scope.IsMatch2 = true;\r\n }\r\n\r\n return\r\n }\r\n\r\n if (emailNo == 1) {\r\n $scope.IsMatch = false;\r\n }\r\n else {\r\n $scope.IsMatch2 = false;\r\n }\r\n }\r\n\r\n function alertDialog(title, content) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n //.targetEvent(ev)\r\n );\r\n }\r\n\r\n $scope.dtOptions = {\r\n dom: 'Irtip',\r\n paging: false,\r\n //autoWidth: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n info: false\r\n\r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('ContactUsController', ['genericService', 'commonService', 'authService', '$mdDialog', '$state', '$rootScope', '$scope', '$timeout', '$interval', '$window', ContactUsController]);\r\n\r\n function ContactUsController(genericService, commonService, authService, $mdDialog, $state, $rootScope, $scope, $timeout, $interval, $window) {\r\n //alert(\"Contacts...\");\r\n var serviceController = 'OfficeLocation/';\r\n $scope.Offices = [];\r\n $window.document.title = \"Contact Us - \" + document.getElementById(\"title\").title;\r\n LoadSmartAppSettings();\r\n LoadOffices();\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n\r\n //$scope.activated = false;\r\n\r\n function LoadSmartAppSettings() {\r\n var configserviceController = 'SmartAppConfig/';\r\n var promiseGet = genericService.get(configserviceController);\r\n $rootScope.smartAppConfig = {};\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.smartAppConfig = pl.data;\r\n },\r\n function (errorPl) {\r\n console.log('failure loading Offices', errorPl);\r\n })\r\n\r\n }\r\n\r\n function LoadOffices() {\r\n var promiseGet = genericService.get(serviceController);\r\n showProgress();\r\n\r\n promiseGet.then(function (pl) {\r\n hideProgress();\r\n if (!pl.data) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n title: '! No office locations and contact details retrieved.',\r\n template: '',\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n }\r\n else {\r\n $scope.Offices = pl.data;\r\n $scope.SelectedOffice = $scope.Offices[0];\r\n for (var i = 0; i < $scope.Offices.length; i++) {\r\n $scope.Offices[i].Telephone = commonService.FormatPhoneNumber($scope.Offices[i].Telephone);\r\n }\r\n }\r\n\r\n }, function (errorPl) {\r\n hideProgress();\r\n console.log('failure loading Offices', errorPl);\r\n })\r\n }\r\n\r\n /// showProgress: Method used to show the progress bar\r\n function showProgress() {\r\n $scope.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n function hideProgress() {\r\n $scope.activated = false;\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('BillPreferenceController', BillPreferenceController)\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n\r\n /** @ngInject */\r\n function BillPreferenceController($scope, genericService, $http, $state, DTOptionsBuilder, $log, $rootScope, $mdDialog, commonService, $cacheFactory, authService, $window) {\r\n var serviceController = 'Account/Services/';\r\n var httpCache = $cacheFactory.get('$http');\r\n $window.document.title = \"E-Bill - \" + document.getElementById(\"title\").title;\r\n $scope.Service = {};\r\n $scope.MemberNo = $state.params.id;\r\n $scope.BillingPreferenceDesc = '';\r\n $scope.IsMatch = true;\r\n $scope.IsMatch2 = true;\r\n $scope.Email1_c = '';\r\n $scope.Email2_c = '';\r\n var HardwareId = '';\r\n $scope.ENotificationDetails = [];\r\n $scope.ModENotificationDetails = {};\r\n $scope.BillMethod = [\r\n { id: '00', desc: 'Paper' },\r\n { id: '01', desc: 'E-Bill' },\r\n { id: '02', desc: 'Paper & E-Bill' }];\r\n $scope.preventUnsavedPrompt = 'You have unsaved changes in your billing preferences. Discard your changes?';\r\n\r\n LoadRecordsServ()\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n\r\n function LoadRecordsServ() {\r\n\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get(serviceController + $scope.MemberNo);\r\n\r\n promiseGet.then(function (pl) {\r\n $scope.Service = pl.data;\r\n LoadBillingPreference();\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services from billing preference', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n\r\n function LoadBillingPreference() {\r\n httpCache.remove($rootScope.serviceBase + 'BillingPreference/' + $scope.Service.Services[0].MemberSep + '/');\r\n var promiseGet = genericService.get('BillingPreference/' + $scope.Service.Services[0].MemberSep + '/' + HardwareId);\r\n\r\n promiseGet.then(function (pl) {\r\n $scope.ENotificationDetails = pl.data;\r\n $scope.Email1_c = $scope.ENotificationDetails.Email1;\r\n $scope.Email2_c = $scope.ENotificationDetails.Email2;\r\n $rootScope.rootscopeLoading = false;\r\n BindBillingMethod();\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading billing preference', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n function BindBillingMethod() {\r\n if ($scope.ENotificationDetails.Code1 == '01') {\r\n $scope.BillingPreferenceDesc = 'E-Bill';\r\n }\r\n else if ($scope.ENotificationDetails.Code1 == '02') {\r\n $scope.BillingPreferenceDesc = 'Paper & E-Bill';\r\n }\r\n else {\r\n $scope.ENotificationDetails.Code1 = '00';\r\n $scope.BillingPreferenceDesc = 'Paper';\r\n }\r\n }\r\n\r\n var cleanUpFunc = $rootScope.$on('refreshENotifications', function (event) {\r\n LoadBillingPreference();\r\n });\r\n $scope.$on('$destroy', function () {\r\n cleanUpFunc();\r\n });\r\n\r\n $scope.SaveBillingPreference = function (theForm) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n if (theForm.$valid && $scope.IsMatch2 && $scope.IsMatch) {\r\n $rootScope.rootscopeLoading = true;\r\n $scope.ENotificationDetails.MemberSep = $scope.Service.Services[0].MemberSep;\r\n $scope.ENotificationDetails.NotificationType = 'E-Bill';\r\n\r\n httpCache.remove($rootScope.serviceBase + 'BillingPreference/' + $scope.Service.Services[0].MemberSep + '/');\r\n $scope.ModENotificationDetails = {\r\n Model: $scope.ENotificationDetails,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n var promisePut = genericService.put('BillingPreference/', $scope.Service.Services[0].MemberSep, $scope.ModENotificationDetails);\r\n\r\n promisePut.then(function (pl) {\r\n if (pl.data.Edit) {\r\n alertDialog('Save Failed', pl.data.Edit);\r\n }\r\n else {\r\n alertDialog('Save Successful', pl.data.Result);\r\n //$rootScope.$broadcast('refreshENotifications');\r\n }\r\n\r\n theForm.$aaFormExtensions.$resetChanged();\r\n $rootScope.rootscopeLoading = false;\n $state.reload();\r\n },\r\n function (errorPl) {\r\n $log.error('failure updating billing preference', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n alertDialog('Update failed', 'Failed to update billing preference.');\r\n })\r\n }\r\n else {\r\n //alert('Please correct your inputs with red labels and try again');\r\n alertDialog('Invalid Input', 'Please correct your inputs with red labels and try again.');\r\n }\r\n });\r\n }\r\n $scope.CheckIfMatch = function (email, email_c, emailNo) {\r\n if (email && email_c) {\r\n if (email.toUpperCase() == email_c.toUpperCase()) {\r\n if (emailNo == 1) {\r\n $scope.IsMatch = true;\r\n }\r\n else {\r\n $scope.IsMatch2 = true;\r\n }\r\n\r\n return\r\n }\r\n } else if (!email && !email_c) {\r\n if (emailNo == 1) {\r\n $scope.IsMatch = true;\r\n }\r\n else {\r\n $scope.IsMatch2 = true;\r\n }\r\n\r\n return\r\n }\r\n\r\n if (emailNo == 1) {\r\n $scope.IsMatch = false;\r\n }\r\n else {\r\n $scope.IsMatch2 = false;\r\n }\r\n }\r\n\r\n function alertDialog(title, content) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n //.targetEvent(ev)\r\n );\r\n }\r\n\r\n $scope.dtOptions = {\r\n dom: 'Irtip',\r\n paging: false,\r\n //autoWidth: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n info: false\r\n\r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('SubscriptionDetailsController', ['genericService', 'authService', '$mdDialog', '$state', '$rootScope', '$window', SubscriptionDetailsController]);\r\n\r\n function SubscriptionDetailsController(genericService, authService, $mdDialog, $state, $rootScope, $window) {\r\n var vm = this;\r\n var serviceUrl = \"Alerts/GetSubscriptionDetailsList/\";\r\n $window.document.title = \"Alerts & Reminders - \" + document.getElementById(\"title\").title;\r\n vm.accountsList = authService.accountsList;\r\n vm.subscriptionDetails = {};\r\n var cid = authService.authentication.CustomerID;\r\n\r\n vm.getSubscriptionDetails = function () {\r\n genericService.get(serviceUrl + cid)\r\n .then(function (pl) {\r\n if (pl.data) {\r\n vm.subscriptionDetails = pl.data;\r\n }\r\n },\r\n function (errorpl) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n clickOutsideToClose: false,\r\n title: \"\",\r\n textContent: \"Cannot get Subscription Details List.\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n });\r\n }\r\n\r\n vm.gotoAlertDetails = function (account) {\r\n $state.go('app.msportal.alerts', { account: account });\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('AlertsController', ['$filter', 'genericService', 'authService', '$mdDialog', '$state', '$rootScope', 'commonService', '$cacheFactory', '$scope', '$window', AlertsController])\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n\r\n function AlertsController($filter, genericService, authService, $mdDialog, $state, $rootScope, commonService, $cacheFactory, $scope, $window) {\r\n var vm = this;\r\n var serviceUrl = \"Alerts/\";\r\n $window.document.title = \"Alerts & Reminders - \" + document.getElementById(\"title\").title;\r\n var CID = authService.authentication.CustomerID;\r\n var httpCache = $cacheFactory.get('$http');\r\n var oldSubscriptionDetails = {};\r\n\r\n vm.account = $state.params.id;\r\n vm.subscriptionDetails = {};\r\n vm.providerDetails = {};\r\n vm.alerts = {};\r\n //vm.confirmEmailAddr = \"\";\r\n vm.selectedMobileProvider = \"\";\r\n vm.selectedCriteria1 = \"1\";\r\n vm.selectedCriteria6 = \"1\";\r\n vm.providerID = \"\";\r\n vm.temp = {};\r\n vm.ModifiedModel = {};\r\n vm.isNewEmail = false;\r\n vm.enableFlag = false;\r\n //var original = vm.subscriptionDetails;\r\n //vm.isInactive = false;\r\n //vm.hasPreviousAlert = false;\r\n vm.isTextSelected = false;\r\n vm.isEmailSelected = false;\r\n vm.textsSelected = {};\r\n vm.EmailsSelected = {};\r\n vm.hideConfirmEmail = false;\r\n $scope.preventUnsavedPrompt = 'You have unsaved changes in your subscription and alerts service details. Discard your changes?';\r\n\r\n //METHODS\r\n function GetCriterias() {\r\n // AlertIds should be filtered by AlertId instead of array index which is not fixed.\r\n // AlertId: 1\r\n var alerts = vm.temp.ListItems.Listitem;\r\n var alert01 = $filter(\"filter\")(alerts, { AlertId: '01' })[0];\r\n if (alert01) {\r\n vm.selectedCriteria1 = alert01.Criteria !== \"\" ? alert01.Criteria : \"1\";\r\n }\r\n // AlertId: 12\r\n var alert12 = $filter(\"filter\")(alerts, { AlertId: '12' })[0];\r\n if (alert12) {\r\n vm.selectedCriteria6 = alert12.Criteria !== \"\" ? alert12.Criteria : \"1\";\r\n }\r\n }\r\n function IsSubscriptionDetailsChanged() {\r\n var isChanged = false;\r\n if (angular.equals(oldSubscriptionDetails.Email, vm.temp.Email) &&\r\n angular.equals(oldSubscriptionDetails.Mobile, vm.temp.Mobile) &&\r\n angular.equals(oldSubscriptionDetails.ProviderId, vm.temp.ProviderId)) {\r\n isChanged = false;\r\n } else {\r\n isChanged = true;\r\n }\r\n return isChanged;\r\n }\r\n function PadLeftAlertIds(alerts) {\r\n // Add PadLeft 0 on Alert Id for better distinction on filtering.\r\n for (var i = 0; i < alerts.length; i++) {\r\n alerts[i].AlertId = commonService.padLeft(alerts[i].AlertId, 2, '0');\r\n }\r\n }\r\n function RemovePadLeftAlertIds(alerts) {\r\n // Remove PadLeft 0 on Alert Id to get the actual value.\r\n for (var i = 0; i < alerts.length; i++) {\r\n alerts[i].AlertId = commonService.removePadLeft(alerts[i].AlertId, '0');\r\n }\r\n }\r\n function SetCriterias() {\r\n // AlertIds should be filtered by AlertId instead of array index which is not fixed.\r\n // AlertId: 1\r\n var alerts = vm.temp.ListItems.Listitem;\r\n var alert01 = $filter(\"filter\")(alerts, { AlertId: '01' })[0];\r\n if (alert01) {\r\n alert01.Criteria = vm.selectedCriteria1;\r\n }\r\n // AlertId: 12\r\n var alert12 = $filter(\"filter\")(alerts, { AlertId: '12' })[0];\r\n if (alert12) {\r\n alert12.Criteria = vm.selectedCriteria6;\r\n }\r\n }\r\n\r\n vm.mobilePattern = (function () {\r\n var regexp = /^\\d{3}-\\d{3}-\\d{4}$/;\r\n\r\n return {\r\n test: function (value) {\r\n return regexp.test(value);\r\n }\r\n };\r\n })();\r\n\r\n vm.emailPattern = (function () {\r\n var regexp = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i;\r\n\r\n return {\r\n test: function (value) {\r\n return regexp.test(value);\r\n }\r\n };\r\n })();\r\n\r\n vm.reset = function (form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n var _Form = form;\r\n\r\n _Form.$aaFormExtensions.$reset().then(function Ok(resp) {\r\n if (resp) {\r\n //httpCache.remove($rootScope.serviceBase + serviceUrl + vm.account);\r\n genericService.get(serviceUrl + vm.account).then(function (pl) {\r\n if (pl.data) {\r\n var subsDetails = JSON.parse(pl.data);\r\n angular.copy(subsDetails[\"Output\"], vm.subscriptionDetails);\r\n vm.subscriptionDetails.Mobile = vm.subscriptionDetails.Mobile.split('-').join('');\r\n vm.temp = vm.subscriptionDetails;\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n $log.error('failure reset', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n\r\n vm.hideConfirmEmail = true;\r\n _Form.$editMode = false;\r\n }\r\n });\r\n });\r\n }\r\n\r\n vm.PopulateAlertDetails = function () {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n //Getting Subscription Details\r\n httpCache.remove($rootScope.serviceBase + serviceUrl + vm.account);\r\n genericService.get(serviceUrl + vm.account).then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n if (pl.data) {\r\n var subsDetails = pl.data;\r\n subsDetails.LowBalThreshold = parseFloat(subsDetails.LowBalThreshold).toFixed(2);\r\n angular.copy(subsDetails, vm.subscriptionDetails);\r\n vm.subscriptionDetails.Mobile = vm.subscriptionDetails.Mobile.split('-').join('');\r\n\r\n PadLeftAlertIds(vm.subscriptionDetails.ListItems.Listitem);\r\n\r\n vm.temp = vm.subscriptionDetails;\r\n var item = vm.subscriptionDetails.ListItems.Listitem;\r\n\r\n if (item[0].EnableFlag === 'A' || item[0].EnableFlag === 'B' || item[0].EnableFlag === 'P' || item[1].EnableFlag === 'W' ||\r\n item[1].EnableFlag === 'A' || item[1].EnableFlag === 'B' || item[1].EnableFlag === 'P' || item[2].EnableFlag === 'W' ||\r\n item[2].EnableFlag === 'A' || item[2].EnableFlag === 'B' || item[2].EnableFlag === 'P' || item[3].EnableFlag === 'W' ||\r\n item[3].EnableFlag === 'A' || item[3].EnableFlag === 'B' || item[3].EnableFlag === 'P' || item[4].EnableFlag === 'W' ||\r\n item[4].EnableFlag === 'A' || item[4].EnableFlag === 'B' || item[4].EnableFlag === 'P' || item[5].EnableFlag === 'W' ||\r\n item[5].EnableFlag === 'A' || item[5].EnableFlag === 'B' || item[5].EnableFlag === 'P' || item[6].EnableFlag === 'W') {\r\n vm.enableFlag = true;\r\n }\r\n else {\r\n vm.enableFlag = false;\r\n }\r\n\r\n GetCriterias();\r\n oldSubscriptionDetails = angular.copy(vm.temp);\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n\r\n //Getting Mobile Providers List\r\n genericService.get(serviceUrl + \"GetMobileProvidersList\").then(function (pl) {\r\n if (pl.data) {\r\n var providersList = JSON.parse(pl.data);\r\n\r\n angular.copy(providersList[\"listItems\"], vm.providerDetails);\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n });\r\n }\r\n\r\n vm.addModifyAlertDetails = function (form) {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n form.$editMode = false;\r\n var _Form = form;\r\n vm.temp.ProviderId = vm.selectedMobileProvider;\r\n\r\n SetCriterias();\r\n RemovePadLeftAlertIds(vm.temp.ListItems.Listitem);\r\n\r\n vm.temp.LowBalThreshold = parseFloat(vm.temp.LowBalThreshold);\r\n httpCache.remove($rootScope.serviceBase + serviceUrl + vm.account);\r\n vm.ModifiedModel = {\r\n Model: vm.temp,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n var requestUrl = '';\r\n var textContent = '';\r\n var title = '';\r\n if ($rootScope.Parameters.InternetParameters.INT_COOPPARM_35 === 0 && IsSubscriptionDetailsChanged() && authService.adminAuthentication.roleType !== \"Admin\") {\r\n requestUrl = \"RequestSubscriptionDetailsChange/\";\r\n textContent = \"The requested changes to your Profile have been submitted to the utility for review, you will receive a confirmation email\";\r\n title = 'Changes have been Submitted'\r\n } else {\r\n requestUrl = \"ModifySubscriptionDetails/\";\r\n textContent = \"Alerts and Reminders has been updated successfully.\";\r\n title = 'Success'\r\n }\r\n\r\n genericService.put(serviceUrl + requestUrl, vm.account, vm.ModifiedModel).then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n if (pl.data) {\r\n vm.hideConfirmEmail = true;\r\n vm.confirmEmail = '';\r\n\r\n $mdDialog.show($mdDialog.alert({\r\n clickOutsideToClose: false,\r\n title: title,\r\n textContent: textContent,\r\n ok: 'OK',\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n }));\r\n }\r\n _Form.$aaFormExtensions.$resetChanged();\r\n $state.reload();\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n });\r\n });\r\n\r\n }\r\n\r\n vm.updateAlertType = function (alert, isEmail) {\r\n var alertType = alert.AlertType;\r\n var textFlag = alertType.charAt(0);\r\n var emailFlag = alertType.charAt(1);\r\n var newAlertType = \"\";\r\n\r\n if (isEmail) {\r\n if (emailFlag == '1')\r\n newAlertType = textFlag + '0';\r\n else\r\n newAlertType = textFlag + '1';\r\n }\r\n else {\r\n if (textFlag == '1') {\r\n newAlertType = '0' + emailFlag;\r\n //vm.isTextSelected = false;\r\n }\r\n else {\r\n newAlertType = '1' + emailFlag;\r\n //vm.isTextSelected = true;\r\n }\r\n }\r\n\r\n newAlertType += alertType.substr(2, alertType.length - 2);\r\n alert.AlertType = newAlertType;\r\n }\r\n\r\n vm.onTextSelected = function () {\r\n vm.isTextSelected = false;\r\n\r\n for (var key in vm.textsSelected) {\r\n //console.log('Key -' + key + ' val- ' + vm.textsSelected[key]);\r\n if (vm.textsSelected[key]) {\r\n vm.isTextSelected = true;\r\n }\r\n }\r\n }\r\n\r\n vm.onEmailSelected = function () {\r\n vm.isEmailSelected = false;\r\n\r\n for (var key in vm.EmailsSelected) {\r\n //console.log('Key -' + key + ' val- ' + vm.EmailsSelected[key]);\r\n if (vm.EmailsSelected[key]) {\r\n vm.isEmailSelected = true;\r\n }\r\n }\r\n }\r\n\r\n vm.updateAlertDetails = function (form) {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $rootScope.rootscopeLoading = false;\r\n form.$editMode = true;\r\n vm.hideConfirmEmail = false;\r\n vm.isNewEmail = false;\r\n });\r\n }\r\n\r\n vm.dtInstance = {};\r\n\r\n vm.dtOptions = {\r\n //dom: '<\"top\"f>rt<\"bottom\"<\"left\"<\"length\"l>><\"right\"<\"info\"i><\"pagination\"p>>>', \r\n dom: 'Irtip',\r\n paging: false,\r\n autoWidth: false,\r\n responsive: true,\r\n scroller: true,\r\n processing: true,\r\n info: false, //Displays \"Showing 1 to 2 of 2 entries\"\r\n columnDefs: [\r\n {\r\n // Customer ID\r\n targets: 0,\r\n responsivePriority: 1,\r\n width: '10px'\r\n },\r\n {\r\n // Target the actions column\r\n targets: 8,\r\n responsivePriority: 1,\r\n filterable: false,\r\n sortable: false\r\n }\r\n\r\n ],\r\n language: {\r\n \"emptyTable\": \"No records available\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n }; //dtOptions\r\n\r\n vm.isNumberKey = function (evt) {\r\n var theEvent = evt || window.event;\r\n\r\n var key = theEvent.keyCode || theEvent.which;\r\n key = String.fromCharCode(key);\r\n\r\n var regex = /[-0-9]|\\./;\r\n if (!regex.test(key)) {\r\n theEvent.returnValue = false;\r\n if (theEvent.preventDefault) theEvent.preventDefault();\r\n }\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('BudgetLevelizedController', BudgetLevelizedController)\r\n .config(['$httpProvider', function ($httpProvider) {\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\r\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\r\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\r\n }]);\r\n\r\n /** @ngInject */\r\n function BudgetLevelizedController($scope, $state, genericService, $http, DTOptionsBuilder, $log, authService, $rootScope, commonService, $cacheFactory, $stateParams, $window, $mdDialog) {\r\n var serviceController = 'BudgetLevelized/';\r\n var httpCache = $cacheFactory.get('$http');\r\n var promiseGet;\r\n $window.document.title = \"Budget/Levelized Billing - \" + document.getElementById(\"title\").title;\r\n var vm = this;\r\n vm.dtOptions = {\r\n dom: 'Irtip', paging: false, scroller: false, processing: true, info: false,\r\n language: {\r\n \"emptyTable\": \"Loading\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n vm.Account = {};\r\n vm.Message = '';\r\n vm.Parameters = $rootScope.Parameters;\r\n vm.MemberNo = $state.params.id;\r\n vm.RoleType = authService.roleType;\r\n vm.Enrolled = false;\r\n vm.BillingType = '00';\r\n vm.BudgetBillEnabled = 0;\r\n vm.LevelizedEnabled = 0;\r\n vm.InitData = LoadData;\r\n vm.editForm = EditForm;\r\n vm.cancelForm = CancelForm;\r\n vm.PassedBusinessRules = true;\r\n vm.HasExcludedService = false;\r\n vm.NoActiveService = false;\r\n vm.FirstMemberSep = $state.params.id + '001';\r\n vm.ReviewMonth = '00';\r\n vm.EnrolledServices = [];\r\n vm.ExcludedActiveServices = [];\r\n vm.ExcludedInactiveServices = [];\r\n vm.preventUnsavedPrompt = 'You have unsaved changes in budget/levelized billing. Discard your changes?';\r\n\r\n function LoadData() {\r\n SetSmartAppConfig();\r\n LoadRecordsServ();\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n }\r\n\r\n String.prototype.toMask = function () {\r\n return String(\"************************\" + this.substr(this.length - 4)).slice(-16);\r\n };\r\n\r\n String.prototype.padLeft = function (len, charac) {\r\n return Array(len - this.length + 1).join(charac || \" \") + this;\r\n }\r\n\r\n String.prototype.toActualYear = function () {\r\n var actualYear = new Date().getFullYear().toString();\r\n var dataYear = this.toString();\r\n\r\n if (this.length == 2)\r\n dataYear = actualYear.substring(0, 2) + dataYear;\r\n\r\n return String(dataYear);\r\n }\r\n String.prototype.replaceAll = function (search, replace) {\r\n if (replace === undefined) {\r\n return this.toString();\r\n }\r\n return this.split(search).join(replace);\r\n }\r\n\r\n String.prototype.toTwoDigitsYear = function () {\r\n var dataYear = this.toString();\r\n\r\n if (this.length > 2)\r\n dataYear = dataYear.substring((dataYear.length - 2), dataYear.length);\r\n\r\n return String(dataYear);\r\n }\r\n\r\n function CancelForm(Form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n var _Form = Form;\r\n _Form.$aaFormExtensions.$reset().then(\r\n function Ok(resp) {\r\n if (resp) {\r\n _Form.$editMode = false;\r\n LoadData();\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n function EditForm(form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n form.$editMode = true\r\n });\r\n }\r\n\r\n function SetSmartAppConfig() {\r\n\r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n if ($rootScope.smartAppConfig[x].ConfigId == '48') {\r\n vm.LevelizedEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '49') {\r\n vm.BudgetBillEnabled = $rootScope.smartAppConfig[x].Value;\r\n }\r\n }\r\n }\r\n\r\n function LoadRecordsServ() {\r\n\r\n $rootScope.rootscopeLoading = true;\r\n var promiseGet = genericService.get('Account/Services/' + vm.MemberNo);\r\n httpCache.remove($rootScope.serviceBase + 'Account/Services/' + vm.MemberNo);\r\n\r\n promiseGet.then(function (pl) {\r\n vm.Account = pl.data;\r\n //vm.FirstMemberSep = vm.Account.Services[0].MemberSep;\r\n for (var x = 0; x < pl.data.Services.length; x++) {\r\n if (pl.data.Services[x].Status.toUpperCase() == 'ACTIVE') {\r\n vm.FirstMemberSep = pl.data.Services[x].MemberSep;\r\n break;\r\n }\r\n }\r\n CheckIfAllServicesAreEnrolled(pl.data.Services);\n vm.balanceWidth = commonService.getNumericColumnWidth(vm.Account.Services, \"Balance\", 0, 72);\r\n vm.amountWidth = commonService.getNumericColumnWidth(vm.Account.Services, \"BudgetBillAmount\", 0, 72);\r\n $rootScope.rootscopeLoading = false;\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n };\r\n\r\n function CheckIfAllServicesAreEnrolled(services) {\r\n var nbrOfServices = 0;\r\n var nbrOfInactiveServicesNotEnrolled = 0;\r\n var nbrOfActiveServices = 0;\r\n var nbrOfActiveServicesEnrolled = 0;\r\n var nbrOfActiveServicesNotEnrolled = 0;\r\n var countEn = 0;\r\n var countEx = 0;\r\n var countIn = 0;\r\n for (var x = 0; x < services.length; x++) {\r\n nbrOfServices++;\r\n if (services[x].Status.toUpperCase() == 'ACTIVE') {\r\n nbrOfActiveServices++;\r\n if (services[x].BillCode != '00') {\r\n nbrOfActiveServicesEnrolled++;\r\n vm.BillingType = services[x].BillCode;\r\n vm.EnrolledServices[countEn] = {\r\n index: countEn,\r\n data: services[x],\r\n IsCollapsed: true\r\n };\r\n countEn++;\r\n }\r\n else {\r\n nbrOfActiveServicesNotEnrolled++;\r\n vm.ExcludedActiveServices[countEx] = {\r\n index: countEx,\r\n data: services[x],\r\n IsCollapsed: true\r\n };\r\n countEx++;\r\n }\r\n }\r\n else {\r\n if (services[x].BillCode != '00') {\r\n vm.EnrolledServices[countEn] = {\r\n index: countEn,\r\n data: services[x],\r\n IsCollapsed: true\r\n };\r\n countEn++;\r\n }\r\n else {\r\n vm.ExcludedInactiveServices[countIn] = {\r\n index: countIn,\r\n data: services[x],\r\n IsCollapsed: true\r\n };\r\n countIn++;\r\n }\r\n }\r\n\r\n }\r\n if (nbrOfActiveServices <= 0 && vm.EnrolledServices.length <= 0) {\r\n vm.HasExcludedService = false;\r\n vm.Enrolled = false;\r\n vm.NoActiveService = true;\r\n }\r\n else if (nbrOfActiveServices == nbrOfActiveServicesEnrolled) {\r\n vm.HasExcludedService = false;\r\n vm.Enrolled = true;\r\n }\r\n else if (nbrOfActiveServices == nbrOfActiveServicesNotEnrolled) {\r\n vm.HasExcludedService = false;\r\n vm.Enrolled = false;\r\n }\r\n else {\r\n vm.HasExcludedService = true;\r\n vm.Enrolled = true;\r\n }\r\n //vm.CheckPortalBusinessRules();\r\n }\r\n vm.CheckPortalBusinessRules = function () {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n vm.Message = 'This account does not meet the requirements for this option.';\r\n $rootScope.rootscopeLoading = true;\r\n\r\n var PortalBusinessRules = [];\r\n\r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n\r\n if ($rootScope.smartAppConfig[x].ConfigId == '119' && vm.BillingType == '01') {\r\n PortalBusinessRules.push({\r\n Name: 'ActiveAccountSince',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '120' && vm.BillingType == '01') {\r\n PortalBusinessRules.push({\r\n Name: 'BadChecks',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '122' && vm.BillingType == '01') {\r\n PortalBusinessRules.push({\r\n Name: 'CutOffs',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '124' && vm.BillingType == '01') {\r\n PortalBusinessRules.push({\r\n Name: 'Delinquents',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '126' && vm.BillingType == '01') {\r\n PortalBusinessRules.push({\r\n Name: 'Drafts',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: 0\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '127' && vm.BillingType == '01') {\r\n PortalBusinessRules.push({\r\n Name: 'ZeroBalance',\r\n Value: $rootScope.smartAppConfig[x].Value.trim() == 'Y' || vm.Parameters.Parameters.COOPPARM_150 == 1 ? 'Y' : 'N',\r\n MonthsVerify: 0\r\n });\r\n }\r\n //----------FOR-LEVELIZED-BILLING----------//\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '110' && vm.BillingType == '02') {\r\n PortalBusinessRules.push({\r\n Name: 'ActiveAccountSince',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '111' && vm.BillingType == '02') {\r\n PortalBusinessRules.push({\r\n Name: 'BadChecks',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '113' && vm.BillingType == '02') {\r\n PortalBusinessRules.push({\r\n Name: 'CutOffs',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '115' && vm.BillingType == '02') {\r\n PortalBusinessRules.push({\r\n Name: 'Delinquents',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: $rootScope.smartAppConfig[x + 1].Value\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '117' && vm.BillingType == '02') {\r\n PortalBusinessRules.push({\r\n Name: 'Drafts',\r\n Value: $rootScope.smartAppConfig[x].Value,\r\n MonthsVerify: 0\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '118' && vm.BillingType == '02') {\r\n PortalBusinessRules.push({\r\n Name: 'ZeroBalance',\r\n Value: $rootScope.smartAppConfig[x].Value.trim() == 'Y' || vm.Parameters.Parameters.COOPPARM_150 == 1 ? 'Y' : 'N',\r\n MonthsVerify: 0\r\n });\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '129' && vm.BillingType == '01') {\r\n vm.Message = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '130' && vm.BillingType == '02') {\r\n vm.Message = $rootScope.smartAppConfig[x].Value;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '128' && vm.BillingType == '01') {\r\n vm.ReviewMonth = $rootScope.smartAppConfig[x].Value;\r\n }\r\n }\r\n\r\n var PBRules = {\r\n PortalBusinessRulesList: PortalBusinessRules,\r\n MemberSep: vm.FirstMemberSep,\r\n NotQualifiedMessage: vm.Message\r\n }\r\n var ModPBRules = {\r\n Model: PBRules,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n }\r\n\r\n\r\n var promisePost = genericService.post('PortalBusinessRules/' + 'CheckPortalBusinessRules', ModPBRules);\r\n\r\n promisePost.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n //alert(pl.data);\r\n if (pl.data == '\"\"') {\r\n vm.PassedBusinessRules = true;\r\n\r\n }\r\n else {\r\n vm.PassedBusinessRules = false;\r\n if (pl.data == '\"This account does not meet the requirements for this option.\"') {\r\n DisplayMessage(\"Invalid Account\", vm.Message, 'OK');\r\n }\r\n else {\r\n DisplayMessage(\"Error\", pl.data.replaceAll('\"', ''), 'OK');\r\n }\r\n }\r\n\r\n },\r\n function (errorPl) {\r\n vm.PassedBusinessRules = false;\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading business rules', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n });\r\n };\r\n\r\n vm.Submit = function (code, form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n form.$editMode = true;\r\n var _Form = form;\r\n $rootScope.rootscopeLoading = true;\r\n var type = code == '01' ? 'Budget Billing' : 'Levelized Billing';\r\n var BudgetLevelized = {\r\n MemberNo: vm.MemberNo,\r\n Code: code,\r\n ReviewMonth: vm.ReviewMonth,\r\n BeginDate: '',\r\n Services: vm.Account.Services,\r\n AnnTranFlag: 'A',\r\n };\r\n var ModBudgetLevelized = {\r\n Model: BudgetLevelized,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n\r\n var promisePost = genericService.post(serviceController, ModBudgetLevelized);\r\n promisePost.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n\r\n if (pl.data.toString() != '\"Success\"') {\r\n DisplayMessage('Failed', pl.data.toString().replaceAll('\"', ''), 'OK');\r\n }\r\n else {\r\n httpCache.remove($rootScope.serviceBase + serviceController + vm.MemberNo);\r\n $state.go($state.current, {}, { reload: true });\r\n LoadData();\r\n _Form.$aaFormExtensions.$resetChanged();\r\n DisplayMessage('Successful', 'Your account has been successfully enrolled to ' + type + '!', 'OK');\r\n }\r\n\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure loading Services', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n });\r\n }\r\n vm.Remove = function (form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n confirmRemove().then(function () {\r\n form.$editMode = false;\r\n var _Form = form;\r\n $rootScope.rootscopeLoading = true;\r\n var type = vm.BillingType == '01' ? 'Budget Billing' : 'Levelized Billing';\r\n var BudgetLevelized = {\r\n MemberNo: vm.MemberNo,\r\n Code: '00',\r\n ReviewMonth: '00',\r\n BeginDate: '00/00/00',\r\n Services: vm.Account.Services,\r\n AnnTranFlag: '',\r\n };\r\n var ModBudgetLevelized = {\r\n Model: BudgetLevelized,\r\n RoleType: authService.adminAuthentication.roleType,\r\n AdminUsername: authService.adminAuthentication.userName\r\n };\r\n\r\n var promisePost = genericService.post(serviceController, ModBudgetLevelized);\r\n promisePost.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n\r\n if (pl.data.toString() != '\"Success\"') {\r\n DisplayMessage('Failed', pl.data.toString().replaceAll('\"', ''), 'OK');\r\n }\r\n else {\r\n httpCache.remove($rootScope.serviceBase + serviceController + vm.MemberNo);\r\n $state.go($state.current, {}, { reload: true });\r\n LoadData();\r\n _Form.$aaFormExtensions.$resetChanged();\r\n DisplayMessage('Successful', 'Your account has been successfully removed from ' + type + '!', 'OK');\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl)\r\n $log.error('failure removing Budget/Levelized Billing', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n\r\n }, function () {\r\n\r\n });\r\n });\r\n }\r\n function confirmRemove() {\r\n\r\n var BillTypeDesc = vm.BillingType == '01' ? 'Budget Billing' : 'Levelized Billing';\r\n var title = ('Remove ' + BillTypeDesc);\r\n var content = ('Are you sure you want to remove this account from ' + BillTypeDesc + '?');\r\n var confirm = $mdDialog.confirm(\r\n {\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(false)\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok('Yes')\r\n .cancel('No')\r\n .multiple(true);\r\n\r\n return $mdDialog.show(confirm);\r\n }\r\n\r\n function DisplayMessage(title, text, command) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .clickOutsideToClose(false)\r\n .title(title)\r\n .textContent(text)\r\n .ariaLabel(title)\r\n .ok(command));\r\n }\r\n\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('AccountsController', AccountsController);\r\n\r\n /** @ngInject */\r\n function AccountsController($scope, $state, genericService, $http, DTOptionsBuilder, $log, authService, $rootScope, commonService, $stateParams, $window) {\r\n $window.document.title = \"Accounts - \" + document.getElementById(\"title\").title;\r\n\r\n /// Variables\r\n var completeAccounts = {};\r\n var promiseGet;\r\n var serviceController = 'Accounts/';\r\n var vm = this;\r\n\r\n $scope.Accounts = [];\r\n $scope.Count = -1;\r\n\r\n /// Binding Data\r\n vm.dtInstance = {};\r\n vm.dtOptions = {\r\n dom: 'Irtip',\r\n paging: false,\r\n autoWidth: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n info: false, //Displays \"Showing 1 to 2 of 2 entries\"\r\n columnDefs: [\r\n {\r\n // Target the id column\r\n targets: 0,\r\n responsivePriority: 1,\r\n width: '300px'\r\n },\r\n {\r\n // Target the actions column\r\n targets: 5,\r\n responsivePriority: 2,\r\n filterable: false\r\n },\r\n {\r\n // Target the actions column\r\n targets: 6,\r\n responsivePriority: 2,\r\n filterable: false,\r\n sortable: false\r\n }\r\n\r\n ],\r\n initComplete: function () {\r\n var api = this.api(),\r\n searchBox = angular.element('body').find('#msportal-accounts-search');\r\n\r\n // Bind an external input as a table wide search box\r\n if (searchBox.length > 0) {\r\n searchBox.on('keyup', function (event) {\r\n api.search(event.target.value).draw();\r\n });\r\n }\r\n },\r\n language: {\r\n \"emptyTable\": \"No Records Available\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n vm.FilterStatus = function (status) {\r\n $scope.Accounts = [];\r\n vm.Accounts = [];\r\n AccountIndexing(completeAccounts, status);\r\n\r\n for (var i = 0; i < $scope.Accounts.length; i++) {\r\n vm.Accounts[i] = {\r\n index: i,\r\n data: $scope.Accounts[i].data.data,\r\n IsCollapsed: true\r\n };\r\n }\r\n }\r\n vm.PastDueOn = false;\r\n vm.PPM = false;\r\n vm.RoleType = authService.roleType;\r\n vm.searchFields = ['All', 'New', 'Active', 'Inactive']\r\n vm.selectedSearchField = 'All';\r\n vm.gotoProductDetail = gotoProductDetail;\r\n\r\n /// Initialization\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n LoadRecords();\r\n\r\n\r\n /// Methods\r\n function AccountIndexing(accountList, status) {\r\n var count = 0;\r\n if (accountList && accountList.length < 1) {\r\n vm.dtOptions.language.emptyTable = \"No records were found.\";\r\n }\r\n if (accountList && accountList.length > 0) {\r\n for (var i = 0; i < accountList.length; i++) {\r\n if (accountList[i].IsPPM === 'P') {\r\n vm.PPM = true\r\n break;\r\n }\r\n }\r\n }\r\n for (var i = 0; i < accountList.length; i++) {\r\n if (accountList[i].BillCode) {\r\n vm.BudgetLevelized = true;\r\n }\r\n else {\r\n vm.BudgetLevelized = false;\r\n break;\r\n }\r\n }\r\n for (var i = 0; i < accountList.length; i++) {\r\n if (status === 'All') {\r\n $scope.Accounts[count] = {\r\n index: count,\r\n data: accountList[i],\r\n IsCollapsed: true\r\n };\r\n count++;\r\n }\r\n else if ((status === 'Active' || status === 'Active Prepaid') && (accountList[i].data.Status === 'Active' || accountList[i].data.Status === 'Active Prepaid')) {\r\n $scope.Accounts[count] = {\r\n index: count,\r\n data: accountList[i],\r\n IsCollapsed: true\r\n };\r\n count++;\r\n }\r\n else if ((status === 'Inactive' || status === 'Inactive Prepaid') && (accountList[i].data.Status === 'Inactive' || accountList[i].data.Status === 'Inactive Prepaid')) {\r\n $scope.Accounts[count] = {\r\n index: count,\r\n data: accountList[i],\r\n IsCollapsed: true\r\n };\r\n count++;\r\n }\r\n else if (status === 'New' && accountList[i].data.Status === 'New') {\r\n $scope.Accounts[count] = {\r\n index: count,\r\n data: accountList[i],\r\n IsCollapsed: true\r\n };\r\n count++;\r\n }\r\n }\r\n }\r\n /**\r\n * Go to product detail\r\n *\r\n * @param id\r\n */\r\n function gotoProductDetail(id, status, accountName, serviceAddress, isPPM) {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n //Check if account is registered in Alerts\r\n var mbrNo = id.replace(/^0+/, '') + \"000\";\r\n $rootScope.Account = id;\r\n $rootScope.accountStatus = status;\r\n $rootScope.accountName = accountName.trim();\r\n $rootScope.serviceAddress = serviceAddress.trim();\r\n $rootScope.isPPM = isPPM === \"P\";\r\n\r\n genericService.get(\"Alerts/GetAlertRegDetail/\" + mbrNo).then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n $rootScope.hasAlert = pl.data.length > 0;\r\n $state.go('app.msportal.service_detail', { id: id, name: $rootScope.accountName, address: $rootScope.serviceAddress, reload: true })\r\n }, function (errorpl) {\r\n $rootScope.rootscopeLoading = false;\r\n $state.go('app.msportal.service_detail', { id: id, name: $rootScope.accountName, address: $rootScope.serviceAddress, reload: true })\r\n });\r\n });\r\n }\r\n function LoadRecords() {\r\n if (authService.roleType == \"Admin\") {\r\n serviceController = \"Customers/\";\r\n authService.adminAuthentication.isCalled = true;\r\n if (!$stateParams.CID) {\r\n $rootScope.showAdminToolbar = true;\r\n var account = {\r\n Username: authService.authentication.userName,\r\n CustomerIDNumber: authService.authentication.CustomerID\r\n }\r\n $state.go('app.msportal.accounts', { CID: account.CustomerIDNumber });\r\n $rootScope.$broadcast('simulateAccount', account);\r\n }\r\n else {\r\n authService.authentication.CustomerID = $stateParams.CID;\r\n }\r\n }\r\n\r\n $scope.CId = authService.authentication.CustomerID;\r\n\r\n $rootScope.rootscopeLoading = true;\r\n promiseGet = genericService.get(serviceController + $scope.CId);\r\n\r\n promiseGet.then(function (pl) {\r\n\r\n $scope.Accounts = pl.data;\r\n $scope.balanceWidth = commonService.getNumericColumnWidth($scope.Accounts, \"Balance\", 0, 72);\r\n $scope.pastDueWidth = commonService.getNumericColumnWidth($scope.Accounts, \"PastDue\", 0, 77.6);\r\n completeAccounts = pl.data;\r\n AccountIndexing(pl.data, 'All');\r\n $scope.Count = $scope.Accounts.length;\r\n vm.Accounts = $scope.Accounts;\r\n if ($rootScope.Parameters != undefined && $rootScope.Parameters.FourthParameters != undefined && $rootScope.Parameters.FourthParameters.FOURTHPARM_62 != undefined && $rootScope.Parameters.FourthParameters.FOURTHPARM_62 == 1) {\r\n vm.PastDueOn = true;\r\n }\r\n $rootScope.rootscopeLoading = false;\r\n\r\n authService.accountsList = pl.data;\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n vm.dtOptions.language.emptyTable = \"Unable to retrieve records.\";\r\n $log.error('failure loading Accounts', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }\r\n\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('CustomizePortalController', ['$scope', 'genericService', 'DTOptionsBuilder', '$log', '$rootScope', 'commonService', '$timeout', '$state', CustomizePortalController]);\r\n\r\n /** @ngInject */\r\n function CustomizePortalController($scope, genericService, DTOptionsBuilder, $log, $rootScope, commonService, $timeout, $state) {\r\n var vm = this;\r\n var customerListMethod = 'Customers/'\r\n var testing = false;\r\n\r\n vm.selectedSearchField = 'Customer ID';\r\n vm.searchFields = ['Customer ID', 'Account Number', 'Name', 'Address']\r\n vm.searchKey = '';\r\n vm.testCustomers = [\r\n {\r\n id: '00012345',\r\n balance: 50.23,\r\n name: 'Tonald Drump'\r\n },\r\n {\r\n id: '00015465',\r\n balance: 60.23,\r\n name: 'Beorge Gush'\r\n },\r\n {\r\n id: '00084765',\r\n balance: 0.23,\r\n name: 'Barack Oh mama'\r\n },\r\n {\r\n id: '00074657',\r\n balance: 0.23,\r\n name: 'Let Ji'\r\n },\r\n ]; //dummy customer data\r\n vm.customers = [];\r\n\r\n vm.searchCustomers = function () {\r\n var _selectedSearchField = vm.selectedSearchField.replace(/ /g, '');\r\n //var _searchKey = vm.searchKey.replace(/ /g, '');\r\n\r\n //var searchUrl = customerListMethod + '?searchField=' + vm.selectedSearchField + '&keyword=' + encodeURIComponent(vm.searchKey);\r\n var searchUrl = customerListMethod + _selectedSearchField + '/' + encodeURIComponent(vm.searchKey);\r\n \r\n $rootScope.rootscopeLoading = true;\r\n\r\n if (testing) {\r\n $timeout(function () {\r\n vm.customers = vm.testCustomers;\r\n $rootScope.rootscopeLoading = false;\r\n }, 2000)\r\n return\r\n }\r\n\r\n vm.customers = [];\r\n\r\n var promiseGet = genericService.get(searchUrl);\r\n\r\n promiseGet.then(function (pl) {\r\n if (pl.data) {\r\n $rootScope.rootscopeLoading = false;\r\n\r\n if (pl.data.length == undefined) {\r\n vm.customers.push(pl.data);\r\n }\r\n else {\r\n vm.customers = pl.data;\r\n }\r\n\r\n if (vm.customers.length == null || vm.customers.length == 0) {\r\n vm.dtOptions.language.emptyTable = \"Search criteria did not match any record.\";\r\n }\r\n }\r\n },\r\n function (errorPl) {\r\n commonService.handleError(errorPl);\r\n vm.dtOptions.language.emptyTable = \"Unable to retrieve records.\";\r\n $log.error('failure loading Accounts', errorPl);\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n }\r\n\r\n vm.simulateAccount = function (account) {\r\n $state.go('app.msportal.accounts', { CID: account.CustomerIDNumber });\r\n $rootScope.$broadcast('simulateAccount', account);\r\n }\r\n\r\n vm.dtOptions = {\r\n //dom: '<\"top\"f>rt<\"bottom\"<\"left\"<\"length\"l>><\"right\"<\"info\"i><\"pagination\"p>>>', \r\n dom: 'Irtip',\r\n paging: false,\r\n autoWidth: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n info: false, //Displays \"Showing 1 to 2 of 2 entries\"\r\n columnDefs: [\r\n {\r\n // Customer ID\r\n targets: 0,\r\n responsivePriority: 1,\r\n width: '10px'\r\n },\r\n {\r\n // Target the actions column\r\n targets: 8,\r\n responsivePriority: 1,\r\n filterable: false,\r\n sortable: false\r\n }\r\n\r\n ],\r\n language: {\r\n \"emptyTable\": \"Use the form above to search for customer records.\",\r\n \"zeroRecords\": \"No matching records found\"\r\n }\r\n\r\n //For more options, look here: https://datatables.net/reference/option/\r\n }; //dtOptions\r\n }\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .controller('CustomerListController', ['$filter', '$scope', 'genericService', 'DTOptionsBuilder', '$log', '$mdDialog', '$rootScope', 'commonService', '$timeout', '$state', 'authService', '$window', '$cacheFactory', '$anchorScroll', '$location', CustomerListController]);\r\n\r\n /** @ngInject */\r\n function CustomerListController($filter, $scope, genericService, DTOptionsBuilder, $log, $mdDialog, $rootScope, commonService, $timeout, $state, authService, $window, $cacheFactory, $anchorScroll, $location) {\r\n $window.document.title = \"Customer List - \" + document.getElementById(\"title\").title;\r\n\r\n $rootScope.roleType = 'admin';\r\n /// Variables\r\n var customerListMethod = 'Customers'\r\n var vm = this;\r\n\r\n\r\n /// Binding Data\r\n vm.accountTypes = ['Portal Accounts', 'Non-Portal Accounts', 'All'];\r\n vm.changeEmailConfirmation = ChangeEmailConfirmation;\r\n vm.customers = [];\r\n vm.customerSearchPattern = \"9?9?9?9?9?9?9?9\";\r\n vm.deleteUser = DeleteUser;\r\n vm.display = 'false';\r\n vm.dtOptions = {\r\n //dom: '<\"top\"f>rt<\"bottom\"<\"left\"<\"length\"l>><\"right\"<\"info\"i><\"pagination\"p>>>', \r\n dom: 'Irtip',\r\n paging: false,\r\n autoWidth: false,\r\n responsive: true,\r\n scroller: false,\r\n processing: true,\r\n info: false, //Displays \"Showing 1 to 2 of 2 entries\"\r\n columnDefs: [\r\n {\r\n // Customer ID\r\n //targets: 0,\r\n targets: 'col-custID',\r\n responsivePriority: 1,\r\n width: '10px'\r\n },\r\n {\r\n // Target the actions column\r\n //targets: 7,\r\n targets: \"col-action\",\r\n responsivePriority: 1,\r\n filterable: false,\r\n sortable: false\r\n }\r\n\r\n ],\r\n language: {\r\n \"emptyTable\": \"No records available\",\r\n \"zeroRecords\": \"No matching records found\"\r\n },\r\n initComplete: function () {\r\n CheckScrollbar();\r\n }\r\n //For more options, look here: https://datatables.net/reference/option/\r\n };\r\n vm.isLimited = true;\r\n vm.searchFields = ['All', 'Account Number', 'Address', 'Customer ID', 'E-mail', 'Name', 'Username'];\r\n vm.searchKey = '';\r\n vm.selectedAccountType = 'Portal Accounts';\r\n vm.selectedSearchField = 'All';\r\n vm.titlePage = 'Portal Users';\r\n\r\n\r\n /// Pagination Binding Data\r\n vm.pages = [];\r\n vm.recordLengths = [10, 50, 100];\r\n vm.selectedPage = 1;\r\n vm.selectedRecordsLength = 10;\r\n vm.totalCount = 0;\r\n vm.totalpages = 0;\r\n\r\n\r\n /// Method Binding\r\n vm.filter = function (type) {\r\n if (type === \"length\") {\r\n vm.selectedPage = 1;\r\n }\r\n if (vm.searchKey.length < 1) {\r\n vm.getPortalAccounts();\r\n }\r\n else {\r\n vm.searchCustomers();\r\n }\r\n }\r\n vm.filterAccountType = function () {\r\n vm.searchKey = '';\r\n if (vm.selectedAccountType === 'Non-Portal Accounts' || vm.selectedAccountType === 'All') {\r\n vm.display = true;\r\n vm.customers = [];\r\n vm.totalCount = 0;\r\n vm.titlePage = 'Customer List';\r\n\r\n vm.searchFields.forEach(function (element, index) {\r\n if (element === 'All') {\r\n vm.searchFields.splice(index, 1);\r\n }\r\n });\r\n vm.selectedSearchField = 'Customer ID';\r\n vm.setIsLimited();\r\n }\r\n else {\r\n vm.display = false;\r\n vm.searchFields.unshift('All');\r\n vm.selectedSearchField = 'All';\r\n vm.titlePage = 'Portal Users';\r\n vm.getPortalAccounts();\r\n }\r\n if (vm.selectedAccountType === 'Non-Portal Accounts') {\r\n vm.searchFields = ['All', 'Account Number', 'Address', 'Customer ID', 'Name'];\r\n }\r\n else {\r\n vm.searchFields = ['All', 'Account Number', 'Address', 'Customer ID', 'E-mail', 'Name', 'Username'];\r\n }\r\n }\r\n vm.getPortalAccounts = function () {\r\n $rootScope.rootscopeLoading = true;\r\n vm.customers = [];\r\n var searchUrl = customerListMethod + '/PortalAccounts/' + vm.selectedAccountType + '/' + vm.selectedPage + '/' + vm.selectedRecordsLength;\r\n $cacheFactory.get('$http').remove($rootScope.serviceBase + searchUrl);\r\n var promiseGet = genericService.get(searchUrl);\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n if (pl.data.customers.length !== 0) {\r\n vm.totalpages = Math.ceil(pl.data.totalCount / vm.selectedRecordsLength);\r\n vm.totalCount = pl.data.totalCount;\r\n GetPages(vm.totalpages);\r\n for (var i = 0; i < pl.data.customers.length; i++) {\r\n vm.customers[i] = {\r\n data: pl.data.customers[i]\r\n };\r\n }\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n vm.dtOptions.language.emptyTable = \"Unable to retrieve records.\";\r\n $rootScope.rootscopeLoading = false;\r\n });\r\n };\r\n vm.goTop = function () {\r\n $location.hash('admin-customers');\r\n $anchorScroll();\r\n } \r\n vm.init = function () {\r\n vm.getPortalAccounts();\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n authService.setNavigationItems();\r\n $rootScope.showAdminToolbar = false;\r\n });\r\n }; \r\n vm.ResetForm = function (Form) {\r\n Form.$aaFormExtensions.$resetChanged();\r\n };\r\n vm.ResetPage = function () {\r\n vm.selectedRecordsLength = 10;\r\n vm.selectedPage = 1;\r\n\r\n if (vm.selectedAccountType === 'Portal Accounts' && vm.selectedSearchField === 'All') {\r\n vm.display = false;\r\n }\r\n }\r\n vm.searchCustomers = function (Form) {\r\n $rootScope.rootscopeLoading = true;\r\n vm.display = true;\r\n var _selectedSearchField = vm.selectedSearchField.replace(/ /g, '');\r\n //var _searchKey = vm.searchKey.replace(/ /g, '');\r\n\r\n if (vm.selectedSearchField.toLowerCase() === \"account number\") {\r\n var pad = \"00000000\";\r\n vm.searchKey = pad.substring(0, pad.length - vm.searchKey.length) + vm.searchKey;\r\n } else if (vm.selectedSearchField.toLowerCase() === \"customer id\") {\r\n if (vm.searchKey == 0) {\r\n commonService.displayError('Invalid customer Id');\r\n $rootScope.rootscopeLoading = false;\r\n return;\r\n }\r\n } else if (vm.selectedSearchField.toLowerCase() === \"name\") {\r\n if (vm.searchKey == 0) {\r\n commonService.displayError('Invalid name');\r\n $rootScope.rootscopeLoading = false;\r\n return;\r\n }\r\n } else if (vm.selectedSearchField.toLowerCase() === \"address\") {\r\n if (vm.searchKey == 0) {\r\n commonService.displayError('Invalid address');\r\n $rootScope.rootscopeLoading = false;\r\n return;\r\n }\r\n } else if (vm.selectedSearchField.toLowerCase() === \"username\") {\r\n if (vm.searchKey == 0) {\r\n commonService.displayError('Invalid username');\r\n $rootScope.rootscopeLoading = false;\r\n return;\r\n }\r\n } else if (vm.selectedSearchField.toLowerCase() === \"e-mail\") {\r\n if (vm.searchKey == 0) {\r\n commonService.displayError('Invalid e-mail');\r\n $rootScope.rootscopeLoading = false;\r\n return;\r\n }\r\n }\r\n\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n vm.customers = [];\r\n var searchUrl = customerListMethod + '?field=' + _selectedSearchField + '&key=' + encodeURIComponent(vm.searchKey) + '&type=' + vm.selectedAccountType + '&pagenum=' + vm.selectedPage + '&pagesize=' + vm.selectedRecordsLength;\r\n $cacheFactory.get('$http').remove($rootScope.serviceBase + searchUrl);\r\n var promiseGet = genericService.get(searchUrl);\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.rootscopeLoading = false;\r\n if (pl.data.length !== 0) {\r\n if (pl.data.length !== 0) {\r\n\r\n vm.totalpages = Math.ceil(pl.data.totalCount / vm.selectedRecordsLength);\r\n vm.totalCount = pl.data.totalCount;\r\n GetPages(vm.totalpages);\r\n for (var i = 0; i < pl.data.customers.length; i++) {\r\n vm.customers[i] = {\r\n data: pl.data.customers[i]\r\n };\r\n }\r\n\r\n\r\n //if (pl.data.length == undefined) {\r\n // vm.customers.push(pl.data);\r\n //}\r\n //else {\r\n // vm.customers = pl.data;\r\n //}\r\n\r\n //if (!vm.customers.length || vm.customers.length <= 0) {\r\n // vm.dtOptions.language.emptyTable = \"Search criteria did not match any record.\";\r\n //}\r\n }\r\n }\r\n }, function (errorPl) {\r\n commonService.handleError(errorPl);\r\n vm.dtOptions.language.emptyTable = \"Unable to retrieve records.\";\r\n $rootScope.rootscopeLoading = false;\r\n })\r\n });\r\n };\r\n vm.SearchOnKeyPress = function ($event, Form) {\r\n var key = $event.keyCode;\r\n if (key === 13) {\r\n vm.ResetPage();\r\n vm.searchCustomers(Form);\r\n }\r\n }\r\n vm.setIsLimited = function () {\r\n vm.searchKey = '';\r\n if (vm.selectedSearchField.toLowerCase() === \"name\" || vm.selectedSearchField.toLowerCase() === \"address\" || vm.selectedSearchField.toLowerCase() === \"username\" || vm.selectedSearchField.toLowerCase() === \"e-mail\") {\r\n vm.customerSearchPattern = \"*\";\r\n vm.isLimited = false;\r\n }\r\n else if (vm.selectedSearchField.toLowerCase() === \"customer id\" || vm.selectedSearchField.toLowerCase() === \"account number\") {\r\n vm.customerSearchPattern = \"9?9?9?9?9?9?9?9\";\r\n vm.isLimited = true;\r\n }\r\n else {\r\n vm.getPortalAccounts();\r\n }\r\n }\r\n vm.simulateAccount = function (account, Form) {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $rootScope.rootscopeLoading = false;\r\n //authService.authentication.CustomerID = account.CustomerIDNumber;\r\n Form.$aaFormExtensions.$resetChanged();\r\n $state.go('app.msportal.accounts', { CID: account.CustomerIDNumber });\r\n $rootScope.$broadcast('simulateAccount', account);\r\n });\r\n };\r\n vm.unlockUser = function (account) {\r\n $mdDialog.show({\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n template:\r\n '' +\r\n '

Unlock Account

' +\r\n ' Are you sure you want to unlock the portal account for username ' + account.Username + '? ' +\r\n ' ' +\r\n '\t CANCEL ' +\r\n ' UNLOCK ' +\r\n ' ' +\r\n '
',\r\n controller: DialogController\r\n });\r\n function DialogController($scope, $mdDialog) {\r\n $scope.unlockAccount = function () {\r\n\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n authService.unlockAccount(account).then(function (response) {\r\n $mdDialog.show({\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n template:\r\n '' +\r\n '

Portal Account Unlocked

' +\r\n ' The portal user account ' + account.Username + ' has been successfully unlocked.' +\r\n ' ' +\r\n '\t OK ' +\r\n ' ' +\r\n '
',\r\n controller: ActionController\r\n });\r\n\r\n function ActionController($scope) {\r\n $scope.okDialog = function () {\r\n $mdDialog.hide();\r\n //window.location.reload();\r\n vm.searchCustomers();\r\n }\r\n }\r\n\r\n }, function (err) {\r\n $scope.hideProgress();\r\n commonService.handleError(err);\r\n });\r\n }, function (err) {\r\n $scope.hideProgress();\r\n commonService.handleError(err);\r\n });\r\n }\r\n\r\n $scope.closeDialog = function () {\r\n $mdDialog.hide();\r\n }\r\n }\r\n\r\n}\r\n\r\n /// Pagination Method Binding\r\n vm.goFirst = function () {\r\n vm.selectedPage = 1;\r\n vm.filter('pagenum');\r\n }\r\n vm.goLast = function () {\r\n vm.selectedPage = vm.totalpages;\r\n vm.filter('pagenum');\r\n }\r\n vm.goNext = function () {\r\n vm.selectedPage = vm.selectedPage + 1;\r\n vm.filter('pagenum');\r\n }\r\n vm.goPrevious = function () {\r\n vm.selectedPage = vm.selectedPage - 1;\r\n vm.filter('pagenum');\r\n }\r\n\r\n /// Methods\r\n function ChangeEmailConfirmation(account) {\r\n var user = {\r\n UserName: account.Username,\r\n NewEmailConfirmed: account.EmailConfirmed === 1 ? false : true\r\n };\r\n\r\n var dialogContent = {};\r\n if (user.NewEmailConfirmed) {\r\n dialogContent = GetDialogContent('Activate Portal Account', user);\r\n } else {\r\n dialogContent = GetDialogContent('Deactivate Portal Account', user);\r\n }\r\n\r\n $mdDialog.show(commonService.confirmDialog(dialogContent)).then(function () {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n authService.changeEmailConfirmation(user).then(function (response) {\r\n $rootScope.rootscopeLoading = false;\r\n var records = $filter(\"filter\")(vm.customers, { Username: user.UserName });\r\n for (var i = 0; i < records.length; i++) {\r\n var index = vm.customers.indexOf(records[i]);\r\n vm.customers[index].EmailConfirmed = user.NewEmailConfirmed ? 1 : 0;\r\n }\r\n\r\n if (user.NewEmailConfirmed) {\r\n dialogContent = GetDialogContent('Portal Account Activated', user);\r\n } else {\r\n dialogContent = GetDialogContent('Portal Account Deactivated', user);\r\n }\r\n\r\n $mdDialog.show(commonService.alertDialog(dialogContent));\r\n vm.searchCustomers();\r\n }, function (error) {\r\n $rootScope.rootscopeLoading = false;\r\n commonService.handleError(error);\r\n });\r\n });\r\n });\r\n }\r\n function CheckScrollbar() {\r\n var divHeight = document.getElementById(\"admin-customers\").clientHeight;\r\n var winHeight = document.getElementById(\"main\").clientHeight;\r\n if (divHeight > winHeight) {\r\n vm.hasScroll = true;\r\n }\r\n else {\r\n vm.hasScroll = false;\r\n }\r\n }\r\n function DeleteUser(account) {\r\n var user = {\r\n UserName: account.Username,\r\n CustomerId: account.CustomerIDNumber\r\n };\r\n $mdDialog.show(commonService.confirmDialog(GetDialogContent('Delete Portal Account', user))).then(function () {\r\n $rootScope.rootscopeLoading = true;\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n authService.deleteUser(user).then(function (response) {\r\n $rootScope.rootscopeLoading = false;\r\n if (response.data.indexOf('Success') !== -1) {\r\n var records = $filter(\"filter\")(vm.customers, { Username: user.UserName });\r\n for (var i = 0; i < records.length; i++) {\r\n var index = vm.customers.indexOf(records[i]);\r\n vm.customers.splice(index, 1);\r\n }\r\n\r\n $mdDialog.show(commonService.alertDialog(GetDialogContent('Portal Account Deleted', user)));\r\n vm.searchCustomers();\r\n }\r\n }, function (error) {\r\n $rootScope.rootscopeLoading = false;\r\n commonService.handleError(error);\r\n });\r\n });\r\n });\r\n }\r\n function GetDialogContent(title, object) {\r\n if (title === 'Activate Portal Account') {\r\n return {\r\n title: title,\r\n message: 'Are you sure you want to activate portal user account for ' + object.UserName + '?',\r\n confirmButtonLabel: 'Activate'\r\n }\r\n } else if (title === 'Deactivate Portal Account') {\r\n return {\r\n title: title,\r\n message: 'Are you sure you want to deactivate portal user account for ' + object.UserName + '?',\r\n confirmButtonLabel: 'Deactivate'\r\n }\r\n } else if (title === 'Delete Portal Account') {\r\n return {\r\n title: title,\r\n message: 'Are you sure you want to delete portal user account for ' + object.UserName + '?',\r\n confirmButtonLabel: 'Delete'\r\n }\r\n } else if (title === 'Portal Account Activated') {\r\n return {\r\n title: title,\r\n message: 'Portal user account ' + object.UserName + ' has been successfully activated.'\r\n }\r\n } else if (title === 'Portal Account Deactivated') {\r\n return {\r\n title: title,\r\n message: 'Portal user account ' + object.UserName + ' has been successfully deactivated.'\r\n }\r\n } else if (title === 'Portal Account Deleted') {\r\n return {\r\n title: title,\r\n message: 'Portal user account ' + object.UserName + ' has been successfully deleted.'\r\n }\r\n }\r\n }\r\n function GetPages(totalpages) {\r\n vm.pages = [];\r\n for (var i = 1; i <= totalpages; i++) {\r\n vm.pages.push(i);\r\n }\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.msportal')\r\n .factory('CustomerContext', [\"genericService\", \"$q\", CustomerContext]);\r\n\r\n /** @ngInject\r\n * @ngdoc factory\r\n * @name ProfileContext\r\n * @requires genericService\r\n * @description Factory used to interact with Account Profile back-end.\r\n */\r\n function CustomerContext(genericService, $q) {\r\n\r\n /// Variables\r\n var controllerMethod = 'Customers'\r\n\r\n ///functions\r\n function GetCustomerByAccountNo(acctNo) {\r\n var deferred = $q.defer();\r\n\r\n var promise = genericService.get(controllerMethod + \"?field=AccountNumber&key=\" + acctNo + '&type=All&pagenum=1&pagesize=100');\r\n\r\n promise.then(\r\n function (res) {\r\n if (res.data.customers && res.data.customers.length > 0) {\r\n deferred.resolve(res.data.customers[0]) \r\n } else {\r\n deferred.reject()\r\n }\r\n }, function (err) {\r\n deferred.reject(err)\r\n })\r\n return deferred.promise\r\n }\r\n\r\n /// Service Return.\r\n return {\r\n /// Methods.\r\n GetCustomerByAccountNo: GetCustomerByAccountNo,\r\n\r\n /// Properties.\r\n controllerMethod: controllerMethod\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.quick-panel', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($translatePartialLoaderProvider, msApiProvider)\r\n {\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/quick-panel');\r\n\r\n // Api\r\n msApiProvider.register('quickPanel.activities', ['app/data/quick-panel/activities.json']);\r\n msApiProvider.register('quickPanel.contacts', ['app/data/quick-panel/contacts.json']);\r\n msApiProvider.register('quickPanel.events', ['app/data/quick-panel/events.json']);\r\n msApiProvider.register('quickPanel.notes', ['app/data/quick-panel/notes.json']);\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.quick-panel')\r\n .controller('ChatTabController', ChatTabController);\r\n\r\n /** @ngInject */\r\n function ChatTabController(msApi, $timeout)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.chat = {};\r\n vm.chatActive = false;\r\n vm.replyMessage = '';\r\n\r\n msApi.request('quickPanel.contacts@get', {},\r\n // Success\r\n function (response)\r\n {\r\n vm.contacts = response.data;\r\n }\r\n );\r\n\r\n // Methods\r\n vm.toggleChat = toggleChat;\r\n vm.reply = reply;\r\n\r\n //////////\r\n\r\n function toggleChat(contact)\r\n {\r\n vm.chatActive = !vm.chatActive;\r\n\r\n if ( vm.chatActive )\r\n {\r\n vm.replyMessage = '';\r\n vm.chat.contact = contact;\r\n scrollToBottomOfChat(0);\r\n }\r\n }\r\n\r\n function reply()\r\n {\r\n if ( vm.replyMessage === '' )\r\n {\r\n return;\r\n }\r\n\r\n if ( !vm.chat.contact.dialog )\r\n {\r\n vm.chat.contact.dialog = [];\r\n }\r\n\r\n vm.chat.contact.dialog.push({\r\n who : 'user',\r\n message: vm.replyMessage,\r\n time : 'Just now'\r\n });\r\n\r\n vm.replyMessage = '';\r\n\r\n scrollToBottomOfChat(400);\r\n }\r\n\r\n function scrollToBottomOfChat(speed)\r\n {\r\n var chatDialog = angular.element('#chat-dialog');\r\n\r\n $timeout(function ()\r\n {\r\n chatDialog.animate({\r\n scrollTop: chatDialog[0].scrollHeight\r\n }, speed);\r\n }, 0);\r\n\r\n }\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core',\r\n [\r\n 'ngAnimate',\r\n 'ngAria',\r\n 'ngCookies',\r\n 'ngMessages',\r\n 'ngResource',\r\n 'ngSanitize',\r\n 'ngMaterial',\r\n 'datatables',\r\n 'pascalprecht.translate',\r\n 'ui.router',\r\n 'LocalStorageModule',\r\n\t\t\t\t'ngMask',\r\n 'treasure-overlay-spinner',\r\n 'ui.utils.masks'\r\n //'ui.mask'\r\n ]);\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsWidgetController', MsWidgetController)\r\n .directive('msWidget', msWidgetDirective)\r\n .directive('msWidgetFront', msWidgetFrontDirective)\r\n .directive('msWidgetBack', msWidgetBackDirective);\r\n\r\n /** @ngInject */\r\n function MsWidgetController($scope, $element)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.flipped = false;\r\n\r\n // Methods\r\n vm.flip = flip;\r\n\r\n //////////\r\n\r\n /**\r\n * Flip the widget\r\n */\r\n function flip()\r\n {\r\n if ( !isFlippable() )\r\n {\r\n return;\r\n }\r\n\r\n // Toggle flipped status\r\n vm.flipped = !vm.flipped;\r\n\r\n // Toggle the 'flipped' class\r\n $element.toggleClass('flipped', vm.flipped);\r\n }\r\n\r\n /**\r\n * Check if widget is flippable\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFlippable()\r\n {\r\n return (angular.isDefined($scope.flippable) && $scope.flippable === true);\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msWidgetDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n flippable: '=?'\r\n },\r\n controller: 'MsWidgetController',\r\n transclude: true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-widget');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsWidgetCtrl, transcludeFn)\r\n {\r\n // Custom transclusion\r\n transcludeFn(function (clone)\r\n {\r\n iElement.empty();\r\n iElement.append(clone);\r\n });\r\n\r\n //////////\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msWidgetFrontDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n require : '^msWidget',\r\n transclude: true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-widget-front');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsWidgetCtrl, transcludeFn)\r\n {\r\n // Custom transclusion\r\n transcludeFn(function (clone)\r\n {\r\n iElement.empty();\r\n iElement.append(clone);\r\n });\r\n\r\n // Methods\r\n scope.flipWidget = MsWidgetCtrl.flip;\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msWidgetBackDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n require : '^msWidget',\r\n transclude: true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-widget-back');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsWidgetCtrl, transcludeFn)\r\n {\r\n // Custom transclusion\r\n transcludeFn(function (clone)\r\n {\r\n iElement.empty();\r\n iElement.append(clone);\r\n });\r\n\r\n // Methods\r\n scope.flipWidget = MsWidgetCtrl.flip;\r\n };\r\n }\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsStepperController', MsStepperController)\r\n .directive('msStepper', msStepperDirective)\r\n .directive('msStepperStep', msStepperStepDirective);\r\n\r\n /** @ngInject */\r\n function MsStepperController($timeout)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.mainForm = undefined;\r\n\r\n vm.steps = [];\r\n vm.currentStep = undefined;\r\n vm.currentStepNumber = 1;\r\n\r\n // Methods\r\n vm.registerMainForm = registerMainForm;\r\n vm.registerStep = registerStep;\r\n vm.setupSteps = setupSteps;\r\n vm.resetForm = resetForm;\r\n\r\n vm.setCurrentStep = setCurrentStep;\r\n\r\n vm.gotoStep = gotoStep;\r\n vm.gotoPreviousStep = gotoPreviousStep;\r\n vm.gotoNextStep = gotoNextStep;\r\n vm.gotoFirstStep = gotoFirstStep;\r\n vm.gotoLastStep = gotoLastStep;\r\n\r\n vm.isFirstStep = isFirstStep;\r\n vm.isLastStep = isLastStep;\r\n\r\n vm.isStepCurrent = isStepCurrent;\r\n vm.isStepDisabled = isStepDisabled;\r\n vm.isStepOptional = isStepOptional;\r\n vm.isStepHidden = isStepHidden;\r\n vm.filterHiddenStep = filterHiddenStep;\r\n vm.isStepValid = isStepValid;\r\n vm.isStepNumberValid = isStepNumberValid;\r\n\r\n vm.isFormValid = isFormValid;\r\n\r\n //////////\r\n\r\n /**\r\n * Register the main form\r\n *\r\n * @param form\r\n */\r\n function registerMainForm(form)\r\n {\r\n vm.mainForm = form;\r\n }\r\n\r\n /**\r\n * Register a step\r\n *\r\n * @param element\r\n * @param scope\r\n * @param form\r\n */\r\n function registerStep(element, scope, form)\r\n {\r\n var step = {\r\n element : element,\r\n scope : scope,\r\n form : form,\r\n stepNumber: scope.step || (vm.steps.length + 1),\r\n stepTitle : scope.stepTitle\r\n };\r\n\r\n // Push the step into steps array\r\n vm.steps.push(step);\r\n\r\n // Sort steps by stepNumber\r\n vm.steps.sort(function (a, b)\r\n {\r\n return a.stepNumber - b.stepNumber;\r\n });\r\n }\r\n\r\n /**\r\n * Setup steps for the first time\r\n */\r\n function setupSteps()\r\n {\r\n vm.setCurrentStep(vm.currentStepNumber);\r\n }\r\n\r\n /**\r\n * Reset steps and the main form\r\n */\r\n function resetForm()\r\n {\r\n // Timeout is required here because we need to\r\n // let form model to reset before setting the\r\n // statuses\r\n $timeout(function ()\r\n {\r\n // Reset all the steps\r\n for ( var x = 0; x < vm.steps.length; x++ )\r\n {\r\n vm.steps[x].form.$setPristine();\r\n vm.steps[x].form.$setUntouched();\r\n }\r\n\r\n // Reset the main form\r\n vm.mainForm.$setPristine();\r\n vm.mainForm.$setUntouched();\r\n\r\n // Go to first step\r\n gotoFirstStep();\r\n });\r\n }\r\n\r\n /**\r\n * Set current step\r\n *\r\n * @param stepNumber\r\n */\r\n function setCurrentStep(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return;\r\n }\r\n\r\n // Update the current step number\r\n vm.currentStepNumber = stepNumber;\r\n\r\n // Hide all steps\r\n for ( var i = 0; i < vm.steps.length; i++ )\r\n {\r\n vm.steps[i].element.hide();\r\n }\r\n\r\n // Show the current step\r\n vm.steps[vm.currentStepNumber - 1].element.show();\r\n }\r\n\r\n /**\r\n * Go to a step\r\n *\r\n * @param stepNumber\r\n */\r\n function gotoStep(stepNumber)\r\n {\r\n // If the step we are about to go\r\n // is hidden, bail...\r\n if ( isStepHidden(stepNumber) )\r\n {\r\n return;\r\n }\r\n\r\n vm.setCurrentStep(stepNumber);\r\n }\r\n\r\n /**\r\n * Go to the previous step\r\n */\r\n function gotoPreviousStep()\r\n {\r\n var stepNumber = vm.currentStepNumber - 1;\r\n\r\n // Test the previous steps and make sure\r\n // we will land to a one that is not hidden\r\n for ( var s = stepNumber; s >= 1; s-- )\r\n {\r\n if ( !isStepHidden(s) )\r\n {\r\n stepNumber = s;\r\n break;\r\n }\r\n }\r\n\r\n vm.setCurrentStep(stepNumber);\r\n }\r\n\r\n /**\r\n * Go to the next step\r\n */\r\n function gotoNextStep()\r\n {\r\n var stepNumber = vm.currentStepNumber + 1;\r\n\r\n // Test the following steps and make sure\r\n // we will land to a one that is not hidden\r\n for ( var s = stepNumber; s <= vm.steps.length; s++ )\r\n {\r\n if ( !isStepHidden(s) )\r\n {\r\n stepNumber = s;\r\n break;\r\n }\r\n }\r\n\r\n vm.setCurrentStep(stepNumber);\r\n }\r\n\r\n /**\r\n * Go to the first step\r\n */\r\n function gotoFirstStep()\r\n {\r\n vm.setCurrentStep(1);\r\n }\r\n\r\n /**\r\n * Go to the last step\r\n */\r\n function gotoLastStep()\r\n {\r\n vm.setCurrentStep(vm.steps.length);\r\n }\r\n\r\n /**\r\n * Check if the current step is the first step\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFirstStep()\r\n {\r\n return vm.currentStepNumber === 1;\r\n }\r\n\r\n /**\r\n * Check if the current step is the last step\r\n *\r\n * @returns {boolean}\r\n */\r\n function isLastStep()\r\n {\r\n return vm.currentStepNumber === vm.steps.length;\r\n }\r\n\r\n /**\r\n * Check if the given step is the current one\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepCurrent(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n return vm.currentStepNumber === stepNumber;\r\n }\r\n\r\n /**\r\n * Check if the given step should be disabled\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepDisabled(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n var disabled = false;\r\n\r\n for ( var i = 1; i < stepNumber; i++ )\r\n {\r\n if ( !isStepValid(i) )\r\n {\r\n disabled = true;\r\n break;\r\n }\r\n }\r\n\r\n return disabled;\r\n }\r\n\r\n /**\r\n * Check if the given step is optional\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepOptional(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n return vm.steps[stepNumber - 1].scope.optionalStep;\r\n }\r\n\r\n /**\r\n * Check if the given step is hidden\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepHidden(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n return !!vm.steps[stepNumber - 1].scope.hideStep;\r\n }\r\n\r\n /**\r\n * Check if the given step is hidden as a filter\r\n *\r\n * @param step\r\n * @returns {boolean}\r\n */\r\n function filterHiddenStep(step)\r\n {\r\n return !isStepHidden(step.stepNumber);\r\n }\r\n\r\n /**\r\n * Check if the given step is valid\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepValid(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n // If the step is optional, always return true\r\n if ( isStepOptional(stepNumber) )\r\n {\r\n return true;\r\n }\r\n\r\n return vm.steps[stepNumber - 1].form.$valid;\r\n }\r\n\r\n /**\r\n * Check if the given step number is a valid step number\r\n *\r\n * @param stepNumber\r\n * @returns {boolean}\r\n */\r\n function isStepNumberValid(stepNumber)\r\n {\r\n return !(angular.isUndefined(stepNumber) || stepNumber < 1 || stepNumber > vm.steps.length);\r\n }\r\n\r\n /**\r\n * Check if the entire form is valid\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFormValid()\r\n {\r\n return vm.mainForm.$valid;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msStepperDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n require : ['form', 'msStepper'],\r\n priority : 1001,\r\n controller : 'MsStepperController as MsStepper',\r\n bindToController: {\r\n model: '=ngModel'\r\n },\r\n transclude : true,\r\n templateUrl : 'app/core/directives/ms-stepper/templates/horizontal/horizontal.html',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-stepper');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var FormCtrl = ctrls[0],\r\n MsStepperCtrl = ctrls[1];\r\n\r\n // Register the main form and setup\r\n // the steps for the first time\r\n MsStepperCtrl.registerMainForm(FormCtrl);\r\n MsStepperCtrl.setupSteps();\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msStepperStepDirective()\r\n {\r\n return {\r\n restrict: 'E',\r\n require : ['form', '^msStepper'],\r\n priority: 1000,\r\n scope : {\r\n step : '=?',\r\n stepTitle : '=?',\r\n optionalStep: '=?',\r\n hideStep : '=?'\r\n },\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-stepper-step');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var FormCtrl = ctrls[0],\r\n MsStepperCtrl = ctrls[1];\r\n\r\n // Is it an optional step?\r\n scope.optionalStep = angular.isDefined(iAttrs.optionalStep);\r\n\r\n // Register the step\r\n MsStepperCtrl.registerStep(iElement, scope, FormCtrl);\r\n\r\n // Hide the step by default\r\n iElement.hide();\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsTimelineController', MsTimelineController)\r\n .directive('msTimeline', msTimelineDirective)\r\n .directive('msTimelineItem', msTimelineItemDirective);\r\n\r\n /** @ngInject */\r\n function MsTimelineController()\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.scrollEl = undefined;\r\n\r\n // Methods\r\n vm.setScrollEl = setScrollEl;\r\n vm.getScrollEl = getScrollEl;\r\n\r\n //////////\r\n\r\n /**\r\n * Set scroll element\r\n *\r\n * @param scrollEl\r\n */\r\n function setScrollEl(scrollEl)\r\n {\r\n vm.scrollEl = scrollEl;\r\n }\r\n\r\n /**\r\n * Get scroll element\r\n *\r\n * @returns {undefined|*}\r\n */\r\n function getScrollEl()\r\n {\r\n return vm.scrollEl;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msTimelineDirective()\r\n {\r\n return {\r\n scope : {\r\n msTimeline: '=?',\r\n loadMore : '&?msTimelineLoadMore'\r\n },\r\n controller: 'MsTimelineController',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-timeline');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsTimelineCtrl)\r\n {\r\n // Create an element for triggering the load more action and append it\r\n var loadMoreEl = angular.element('
');\r\n iElement.append(loadMoreEl);\r\n\r\n // Default config\r\n var config = {\r\n scrollEl: '#content'\r\n };\r\n\r\n // Extend the configuration\r\n config = angular.extend(config, scope.msTimeline, {});\r\n \r\n // Grab the scrollable element and store it in the controller for general use\r\n var scrollEl = angular.element(config.scrollEl);\r\n MsTimelineCtrl.setScrollEl(scrollEl);\r\n\r\n // Threshold\r\n var threshold = 144;\r\n\r\n // Register onScroll event for the first time\r\n registerOnScroll();\r\n\r\n /**\r\n * onScroll Event\r\n */\r\n function onScroll()\r\n {\r\n if ( scrollEl.scrollTop() + scrollEl.height() + threshold > loadMoreEl.position().top )\r\n {\r\n // Show the loader\r\n loadMoreEl.addClass('show');\r\n\r\n // Unregister scroll event to prevent triggering the function over and over again\r\n unregisterOnScroll();\r\n\r\n // Trigger load more event\r\n scope.loadMore().then(\r\n // Success\r\n function ()\r\n {\r\n // Hide the loader\r\n loadMoreEl.removeClass('show');\r\n\r\n // Register the onScroll event again\r\n registerOnScroll();\r\n },\r\n\r\n // Error\r\n function ()\r\n {\r\n // Remove the loader completely\r\n loadMoreEl.remove();\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * onScroll event registerer\r\n */\r\n function registerOnScroll()\r\n {\r\n scrollEl.on('scroll', onScroll);\r\n }\r\n\r\n /**\r\n * onScroll event unregisterer\r\n */\r\n function unregisterOnScroll()\r\n {\r\n scrollEl.off('scroll', onScroll);\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n unregisterOnScroll();\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msTimelineItemDirective($timeout, $q)\r\n {\r\n return {\r\n scope : true,\r\n require: '^msTimeline',\r\n compile: function (tElement)\r\n {\r\n tElement.addClass('ms-timeline-item').addClass('hidden');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsTimelineCtrl)\r\n {\r\n var threshold = 72,\r\n itemLoaded = false,\r\n itemInViewport = false,\r\n scrollEl = MsTimelineCtrl.getScrollEl();\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Check if the timeline item has ms-card\r\n if ( iElement.find('ms-card') )\r\n {\r\n // If the ms-card template loaded...\r\n scope.$on('msCard::cardTemplateLoaded', function (event, args)\r\n {\r\n var cardEl = angular.element(args[0]);\r\n\r\n // Test the card to see if there is any image on it\r\n testForImage(cardEl).then(function ()\r\n {\r\n $timeout(function ()\r\n {\r\n itemLoaded = true;\r\n });\r\n });\r\n });\r\n }\r\n else\r\n {\r\n // Test the element to see if there is any image on it\r\n testForImage(iElement).then(function ()\r\n {\r\n $timeout(function ()\r\n {\r\n itemLoaded = true;\r\n });\r\n });\r\n }\r\n\r\n // Check if the loaded element also in the viewport\r\n scrollEl.on('scroll', testForVisibility);\r\n\r\n // Test for visibility for the first time without waiting for the scroll event\r\n testForVisibility();\r\n }\r\n\r\n // Item ready watcher\r\n var itemReadyWatcher = scope.$watch(\r\n function ()\r\n {\r\n return itemLoaded && itemInViewport;\r\n },\r\n function (current, old)\r\n {\r\n if ( angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n if ( current )\r\n {\r\n iElement.removeClass('hidden').addClass('animate');\r\n\r\n // Unbind itemReadyWatcher\r\n itemReadyWatcher();\r\n }\r\n }, true);\r\n\r\n /**\r\n * Test the given element for image\r\n *\r\n * @param element\r\n * @returns promise\r\n */\r\n function testForImage(element)\r\n {\r\n var deferred = $q.defer(),\r\n imgEl = element.find('img');\r\n\r\n if ( imgEl.length > 0 )\r\n {\r\n imgEl.on('load', function ()\r\n {\r\n deferred.resolve('Image is loaded');\r\n });\r\n }\r\n else\r\n {\r\n deferred.resolve('No images');\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Test the element for visibility\r\n */\r\n function testForVisibility()\r\n {\r\n if ( scrollEl.scrollTop() + scrollEl.height() > iElement.position().top + threshold )\r\n {\r\n $timeout(function ()\r\n {\r\n itemInViewport = true;\r\n });\r\n\r\n // Unbind the scroll event\r\n scrollEl.off('scroll', testForVisibility);\r\n }\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msSidenavHelper', msSidenavHelperDirective);\r\n\r\n /** @ngInject */\r\n function msSidenavHelperDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^mdSidenav',\r\n link : function (scope, iElement, iAttrs, MdSidenavCtrl)\r\n {\r\n // Watch md-sidenav open & locked open statuses\r\n // and add class to the \".page-layout\" if only\r\n // the sidenav open and NOT locked open\r\n scope.$watch(function ()\r\n {\r\n return MdSidenavCtrl.isOpen() && !MdSidenavCtrl.isLockedOpen();\r\n }, function (current)\r\n {\r\n if ( angular.isUndefined(current) )\r\n {\r\n return;\r\n }\r\n\r\n iElement.parent().toggleClass('full-height', current);\r\n angular.element('html').toggleClass('sidenav-open', current);\r\n });\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msSplashScreen', msSplashScreenDirective);\r\n\r\n /** @ngInject */\r\n function msSplashScreenDirective($animate)\r\n {\r\n return {\r\n restrict: 'E',\r\n link : function (scope, iElement)\r\n {\r\n var splashScreenRemoveEvent = scope.$on('msSplashScreen::remove', function ()\r\n {\r\n $animate.leave(iElement).then(function ()\r\n {\r\n // De-register scope event\r\n splashScreenRemoveEvent();\r\n\r\n // Null-ify everything else\r\n scope = iElement = null;\r\n });\r\n });\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsShortcutsController', MsShortcutsController)\r\n .directive('msShortcuts', msShortcutsDirective);\r\n\r\n /** @ngInject */\r\n function MsShortcutsController($scope, $cookies, $document, $timeout, $q, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.query = '';\r\n vm.queryOptions = {\r\n debounce: 300\r\n };\r\n vm.resultsLoading = false;\r\n vm.selectedResultIndex = 0;\r\n vm.ignoreMouseEvents = false;\r\n\r\n vm.results = null;\r\n vm.shortcuts = [];\r\n\r\n vm.sortableOptions = {\r\n ghostClass : 'ghost',\r\n forceFallback: true,\r\n fallbackClass: 'dragging',\r\n onSort : function ()\r\n {\r\n vm.saveShortcuts();\r\n }\r\n };\r\n\r\n // Methods\r\n vm.populateResults = populateResults;\r\n vm.loadShortcuts = loadShortcuts;\r\n vm.saveShortcuts = saveShortcuts;\r\n vm.addShortcut = addShortcut;\r\n vm.removeShortcut = removeShortcut;\r\n vm.handleResultClick = handleResultClick;\r\n\r\n vm.absorbEvent = absorbEvent;\r\n vm.handleKeydown = handleKeydown;\r\n vm.handleMouseenter = handleMouseenter;\r\n vm.temporarilyIgnoreMouseEvents = temporarilyIgnoreMouseEvents;\r\n vm.ensureSelectedResultIsVisible = ensureSelectedResultIsVisible;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n function init()\r\n {\r\n // Load the shortcuts\r\n vm.loadShortcuts().then(\r\n // Success\r\n function (response)\r\n {\r\n vm.shortcuts = response;\r\n\r\n // Add shortcuts as results by default\r\n if ( vm.shortcuts.length > 0 )\r\n {\r\n vm.results = response;\r\n }\r\n }\r\n );\r\n\r\n // Watch the model changes to trigger the search\r\n $scope.$watch('MsShortcuts.query', function (current, old)\r\n {\r\n if ( angular.isUndefined(current) )\r\n {\r\n return;\r\n }\r\n\r\n if ( angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n // Show the loader\r\n vm.resultsLoading = true;\r\n\r\n // Populate the results\r\n vm.populateResults().then(\r\n // Success\r\n function (response)\r\n {\r\n vm.results = response;\r\n },\r\n // Error\r\n function ()\r\n {\r\n vm.results = [];\r\n }\r\n ).finally(\r\n function ()\r\n {\r\n // Hide the loader\r\n vm.resultsLoading = false;\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Populate the results\r\n */\r\n function populateResults()\r\n {\r\n var results = [],\r\n flatNavigation = msNavigationService.getFlatNavigation(),\r\n deferred = $q.defer();\r\n\r\n // Iterate through the navigation array and\r\n // make sure it doesn't have any groups or\r\n // none ui-sref items\r\n for ( var x = 0; x < flatNavigation.length; x++ )\r\n {\r\n if ( flatNavigation[x].uisref )\r\n {\r\n results.push(flatNavigation[x]);\r\n }\r\n }\r\n\r\n // If there is a query, filter the results\r\n if ( vm.query )\r\n {\r\n results = results.filter(function (item)\r\n {\r\n if ( angular.lowercase(item.title).search(angular.lowercase(vm.query)) > -1 )\r\n {\r\n return true;\r\n }\r\n });\r\n\r\n // Iterate through one last time and\r\n // add required properties to items\r\n for ( var i = 0; i < results.length; i++ )\r\n {\r\n // Add false to hasShortcut by default\r\n results[i].hasShortcut = false;\r\n\r\n // Test if the item is in the shortcuts list\r\n for ( var y = 0; y < vm.shortcuts.length; y++ )\r\n {\r\n if ( vm.shortcuts[y]._id === results[i]._id )\r\n {\r\n results[i].hasShortcut = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n else\r\n {\r\n // If the query is empty, that means\r\n // there is nothing to search for so\r\n // we will populate the results with\r\n // current shortcuts if there is any\r\n if ( vm.shortcuts.length > 0 )\r\n {\r\n results = vm.shortcuts;\r\n }\r\n }\r\n\r\n // Reset the selected result\r\n vm.selectedResultIndex = 0;\r\n\r\n // Fake the service delay\r\n $timeout(function ()\r\n {\r\n // Resolve the promise\r\n deferred.resolve(results);\r\n }, 250);\r\n\r\n // Return a promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Load shortcuts\r\n */\r\n function loadShortcuts()\r\n {\r\n var deferred = $q.defer();\r\n\r\n // For the demo purposes, we will\r\n // load the shortcuts from the cookies.\r\n // But here you can make an API call\r\n // to load them from the DB.\r\n var shortcuts = angular.fromJson($cookies.get('FUSE.shortcuts'));\r\n\r\n // No cookie available. Generate one\r\n // for the demo purposes...\r\n if ( angular.isUndefined(shortcuts) )\r\n {\r\n shortcuts = [\r\n {\r\n 'title' : 'Sample',\r\n 'icon' : 'icon-tile-four',\r\n 'state' : 'app.sample',\r\n 'weight' : 1,\r\n 'children' : [],\r\n '_id' : 'sample',\r\n '_path' : 'apps.sample',\r\n 'uisref' : 'app.sample',\r\n 'hasShortcut': true\r\n }\r\n ];\r\n\r\n $cookies.put('FUSE.shortcuts', angular.toJson(shortcuts));\r\n }\r\n\r\n // Resolve the promise\r\n deferred.resolve(shortcuts);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Save the shortcuts\r\n */\r\n function saveShortcuts()\r\n {\r\n var deferred = $q.defer();\r\n\r\n // For the demo purposes, we will\r\n // keep the shortcuts in the cookies.\r\n // But here you can make an API call\r\n // to save them to the DB.\r\n $cookies.put('FUSE.shortcuts', angular.toJson(vm.shortcuts));\r\n\r\n // Fake the service delay\r\n $timeout(function ()\r\n {\r\n deferred.resolve({'success': true});\r\n }, 250);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Add item as shortcut\r\n *\r\n * @param item\r\n */\r\n function addShortcut(item)\r\n {\r\n // Update the hasShortcut status\r\n item.hasShortcut = true;\r\n\r\n // Add as a shortcut\r\n vm.shortcuts.push(item);\r\n\r\n // Save the shortcuts\r\n vm.saveShortcuts();\r\n }\r\n\r\n /**\r\n * Remove item from shortcuts\r\n *\r\n * @param item\r\n */\r\n function removeShortcut(item)\r\n {\r\n // Update the hasShortcut status\r\n item.hasShortcut = false;\r\n\r\n // Remove the shortcut\r\n for ( var x = 0; x < vm.shortcuts.length; x++ )\r\n {\r\n if ( vm.shortcuts[x]._id === item._id )\r\n {\r\n // Remove the x-th item from the array\r\n vm.shortcuts.splice(x, 1);\r\n\r\n // If we aren't searching for anything...\r\n if ( !vm.query )\r\n {\r\n // If all the shortcuts have been removed,\r\n // null-ify the results\r\n if ( vm.shortcuts.length === 0 )\r\n {\r\n vm.results = null;\r\n }\r\n // Otherwise update the selected index\r\n else\r\n {\r\n if ( x >= vm.shortcuts.length )\r\n {\r\n vm.selectedResultIndex = vm.shortcuts.length - 1;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Save the shortcuts\r\n vm.saveShortcuts();\r\n }\r\n\r\n /**\r\n * Handle the result click\r\n *\r\n * @param item\r\n */\r\n function handleResultClick(item)\r\n {\r\n // Add or remove the shortcut\r\n if ( item.hasShortcut )\r\n {\r\n vm.removeShortcut(item);\r\n }\r\n else\r\n {\r\n vm.addShortcut(item);\r\n }\r\n }\r\n\r\n /**\r\n * Absorb the given event\r\n *\r\n * @param event\r\n */\r\n function absorbEvent(event)\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n /**\r\n * Handle keydown\r\n *\r\n * @param event\r\n */\r\n function handleKeydown(event)\r\n {\r\n var keyCode = event.keyCode,\r\n keys = [38, 40];\r\n\r\n // Prevent the default action if\r\n // one of the keys are pressed that\r\n // we are listening\r\n if ( keys.indexOf(keyCode) > -1 )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n switch ( keyCode )\r\n {\r\n // Enter\r\n case 13:\r\n\r\n // Trigger result click\r\n vm.handleResultClick(vm.results[vm.selectedResultIndex]);\r\n\r\n break;\r\n\r\n // Up Arrow\r\n case 38:\r\n\r\n // Decrease the selected result index\r\n if ( vm.selectedResultIndex - 1 >= 0 )\r\n {\r\n // Decrease the selected index\r\n vm.selectedResultIndex--;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n // Down Arrow\r\n case 40:\r\n\r\n // Increase the selected result index\r\n if ( vm.selectedResultIndex + 1 < vm.results.length )\r\n {\r\n // Increase the selected index\r\n vm.selectedResultIndex++;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Handle mouseenter\r\n *\r\n * @param index\r\n */\r\n function handleMouseenter(index)\r\n {\r\n if ( vm.ignoreMouseEvents )\r\n {\r\n return;\r\n }\r\n\r\n // Update the selected result index\r\n // with the given index\r\n vm.selectedResultIndex = index;\r\n }\r\n\r\n /**\r\n * Set a variable for a limited time\r\n * to make other functions to ignore\r\n * the mouse events\r\n */\r\n function temporarilyIgnoreMouseEvents()\r\n {\r\n // Set the variable\r\n vm.ignoreMouseEvents = true;\r\n\r\n // Cancel the previous timeout\r\n $timeout.cancel(vm.mouseEventIgnoreTimeout);\r\n\r\n // Set the timeout\r\n vm.mouseEventIgnoreTimeout = $timeout(function ()\r\n {\r\n vm.ignoreMouseEvents = false;\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Ensure the selected result will\r\n * always be visible on the results\r\n * area\r\n */\r\n function ensureSelectedResultIsVisible()\r\n {\r\n var resultsEl = $document.find('#ms-shortcut-add-menu').find('.results'),\r\n selectedItemEl = angular.element(resultsEl.find('.result')[vm.selectedResultIndex]);\r\n\r\n if ( resultsEl && selectedItemEl )\r\n {\r\n var top = selectedItemEl.position().top - 8,\r\n bottom = selectedItemEl.position().top + selectedItemEl.outerHeight() + 8;\r\n\r\n // Start ignoring mouse events\r\n vm.temporarilyIgnoreMouseEvents();\r\n\r\n if ( resultsEl.scrollTop() > top )\r\n {\r\n resultsEl.scrollTop(top);\r\n }\r\n\r\n if ( bottom > (resultsEl.height() + resultsEl.scrollTop()) )\r\n {\r\n resultsEl.scrollTop(bottom - resultsEl.height());\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msShortcutsDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n require : 'msShortcuts',\r\n controller : 'MsShortcutsController as MsShortcuts',\r\n bindToController: {},\r\n templateUrl : 'app/core/directives/ms-shortcuts/ms-shortcuts.html',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-shortcuts');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n // Data\r\n\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsSearchBarController', MsSearchBarController)\r\n .directive('msSearchBar', msSearchBarDirective);\r\n\r\n /** @ngInject */\r\n function MsSearchBarController($scope, $element, $timeout)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.collapsed = true;\r\n vm.query = '';\r\n vm.queryOptions = {\r\n debounce: vm.debounce || 0\r\n };\r\n vm.resultsLoading = false;\r\n vm.results = null;\r\n vm.selectedResultIndex = 0;\r\n vm.ignoreMouseEvents = false;\r\n\r\n // Methods\r\n vm.populateResults = populateResults;\r\n\r\n vm.expand = expand;\r\n vm.collapse = collapse;\r\n\r\n vm.absorbEvent = absorbEvent;\r\n vm.handleKeydown = handleKeydown;\r\n vm.handleMouseenter = handleMouseenter;\r\n vm.temporarilyIgnoreMouseEvents = temporarilyIgnoreMouseEvents;\r\n vm.handleResultClick = handleResultClick;\r\n vm.ensureSelectedResultIsVisible = ensureSelectedResultIsVisible;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n function init()\r\n {\r\n // Watch the model changes to trigger the search\r\n $scope.$watch('MsSearchBar.query', function (current, old)\r\n {\r\n if ( angular.isUndefined(current) )\r\n {\r\n return;\r\n }\r\n\r\n if ( angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n if ( vm.collapsed )\r\n {\r\n return;\r\n }\r\n\r\n // Evaluate the onSearch function to access the\r\n // function itself\r\n var onSearchEvaluated = $scope.$parent.$eval(vm.onSearch, {query: current}),\r\n isArray = angular.isArray(onSearchEvaluated),\r\n isPromise = (onSearchEvaluated && !!onSearchEvaluated.then);\r\n\r\n if ( isArray )\r\n {\r\n // Populate the results\r\n vm.populateResults(onSearchEvaluated);\r\n }\r\n\r\n if ( isPromise )\r\n {\r\n // Show the loader\r\n vm.resultsLoading = true;\r\n\r\n onSearchEvaluated.then(\r\n // Success\r\n function (response)\r\n {\r\n // Populate the results\r\n vm.populateResults(response);\r\n },\r\n // Error\r\n function ()\r\n {\r\n // Assign an empty array to show\r\n // the no-results screen\r\n vm.populateResults([]);\r\n }\r\n ).finally(function ()\r\n {\r\n // Hide the loader\r\n vm.resultsLoading = false;\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Populate the results\r\n *\r\n * @param results\r\n */\r\n function populateResults(results)\r\n {\r\n // Before doing anything,\r\n // make sure the search bar is expanded\r\n if ( vm.collapsed )\r\n {\r\n return;\r\n }\r\n\r\n var isArray = angular.isArray(results),\r\n isNull = results === null;\r\n\r\n // Only accept arrays and null values\r\n if ( !isArray && !isNull )\r\n {\r\n return;\r\n }\r\n\r\n // Reset the selected result\r\n vm.selectedResultIndex = 0;\r\n\r\n // Populate the results\r\n vm.results = results;\r\n }\r\n\r\n /**\r\n * Expand\r\n */\r\n function expand()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = false;\r\n\r\n // Call expand on scope\r\n $scope.expand();\r\n\r\n // Callback\r\n if ( vm.onExpand && angular.isFunction(vm.onExpand) )\r\n {\r\n vm.onExpand();\r\n }\r\n }\r\n\r\n /**\r\n * Collapse\r\n */\r\n function collapse()\r\n {\r\n // Empty the query\r\n vm.query = '';\r\n\r\n // Empty results to hide the results view\r\n vm.populateResults(null);\r\n\r\n // Set collapsed status\r\n vm.collapsed = true;\r\n\r\n // Call collapse on scope\r\n $scope.collapse();\r\n\r\n // Callback\r\n if ( vm.onCollapse && angular.isFunction(vm.onCollapse) )\r\n {\r\n vm.onCollapse();\r\n }\r\n }\r\n\r\n /**\r\n * Absorb the given event\r\n *\r\n * @param event\r\n */\r\n function absorbEvent(event)\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n /**\r\n * Handle keydown\r\n *\r\n * @param event\r\n */\r\n function handleKeydown(event)\r\n {\r\n var keyCode = event.keyCode,\r\n keys = [27, 38, 40];\r\n\r\n // Prevent the default action if\r\n // one of the keys are pressed that\r\n // we are listening\r\n if ( keys.indexOf(keyCode) > -1 )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n switch ( keyCode )\r\n {\r\n // Enter\r\n case 13:\r\n\r\n // Trigger result click\r\n vm.handleResultClick(vm.results[vm.selectedResultIndex]);\r\n\r\n break;\r\n\r\n // Escape\r\n case 27:\r\n\r\n // Collapse the search bar\r\n vm.collapse();\r\n\r\n break;\r\n\r\n // Up Arrow\r\n case 38:\r\n\r\n // Decrease the selected result index\r\n if ( vm.selectedResultIndex - 1 >= 0 )\r\n {\r\n // Decrease the selected index\r\n vm.selectedResultIndex--;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n // Down Arrow\r\n case 40:\r\n\r\n if ( !vm.results )\r\n {\r\n return;\r\n }\r\n\r\n // Increase the selected result index\r\n if ( vm.selectedResultIndex + 1 < vm.results.length )\r\n {\r\n // Increase the selected index\r\n vm.selectedResultIndex++;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Handle mouseenter\r\n *\r\n * @param index\r\n */\r\n function handleMouseenter(index)\r\n {\r\n if ( vm.ignoreMouseEvents )\r\n {\r\n return;\r\n }\r\n\r\n // Update the selected result index\r\n // with the given index\r\n vm.selectedResultIndex = index;\r\n }\r\n\r\n /**\r\n * Set a variable for a limited time\r\n * to make other functions to ignore\r\n * the mouse events\r\n */\r\n function temporarilyIgnoreMouseEvents()\r\n {\r\n // Set the variable\r\n vm.ignoreMouseEvents = true;\r\n\r\n // Cancel the previous timeout\r\n $timeout.cancel(vm.mouseEventIgnoreTimeout);\r\n\r\n // Set the timeout\r\n vm.mouseEventIgnoreTimeout = $timeout(function ()\r\n {\r\n vm.ignoreMouseEvents = false;\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Handle the result click\r\n *\r\n * @param item\r\n */\r\n function handleResultClick(item)\r\n {\r\n if ( vm.onResultClick )\r\n {\r\n vm.onResultClick({item: item});\r\n }\r\n\r\n // Collapse the search bar\r\n vm.collapse();\r\n }\r\n\r\n /**\r\n * Ensure the selected result will\r\n * always be visible on the results\r\n * area\r\n */\r\n function ensureSelectedResultIsVisible()\r\n {\r\n var resultsEl = $element.find('.ms-search-bar-results'),\r\n selectedItemEl = angular.element(resultsEl.find('.result')[vm.selectedResultIndex]);\r\n\r\n if ( resultsEl && selectedItemEl )\r\n {\r\n var top = selectedItemEl.position().top - 8,\r\n bottom = selectedItemEl.position().top + selectedItemEl.outerHeight() + 8;\r\n\r\n // Start ignoring mouse events\r\n vm.temporarilyIgnoreMouseEvents();\r\n\r\n if ( resultsEl.scrollTop() > top )\r\n {\r\n resultsEl.scrollTop(top);\r\n }\r\n\r\n if ( bottom > (resultsEl.height() + resultsEl.scrollTop()) )\r\n {\r\n resultsEl.scrollTop(bottom - resultsEl.height());\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msSearchBarDirective($document)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n require : 'msSearchBar',\r\n controller : 'MsSearchBarController as MsSearchBar',\r\n bindToController: {\r\n debounce : '=?',\r\n onSearch : '@',\r\n onResultClick: '&?',\r\n onExpand : '&?',\r\n onCollapse : '&?'\r\n },\r\n templateUrl : 'app/core/directives/ms-search-bar/ms-search-bar.html',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-search-bar');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n // Data\r\n var inputEl,\r\n bodyEl = $document.find('body');\r\n\r\n // Methods\r\n scope.collapse = collapse;\r\n scope.expand = expand;\r\n\r\n //////////\r\n\r\n // Initialize\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Grab the input element\r\n inputEl = iElement.find('#ms-search-bar-input');\r\n }\r\n\r\n /**\r\n * Expand action\r\n */\r\n function expand()\r\n {\r\n // Add expanded class\r\n iElement.addClass('expanded');\r\n\r\n // Add helper class to the body\r\n bodyEl.addClass('ms-search-bar-expanded');\r\n\r\n // Focus on the input\r\n inputEl.focus();\r\n }\r\n\r\n /**\r\n * Collapse action\r\n */\r\n function collapse()\r\n {\r\n // Remove expanded class\r\n iElement.removeClass('expanded');\r\n\r\n // Remove helper class from the body\r\n bodyEl.removeClass('ms-search-bar-expanded');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msScrollConfig', msScrollConfigProvider)\r\n .directive('msScroll', msScrollDirective);\r\n\r\n /** @ngInject */\r\n function msScrollConfigProvider()\r\n {\r\n // Default configuration\r\n var defaultConfiguration = {\r\n wheelSpeed : 1,\r\n wheelPropagation : false,\r\n swipePropagation : true,\r\n minScrollbarLength : null,\r\n maxScrollbarLength : null,\r\n useBothWheelAxes : false,\r\n useKeyboard : true,\r\n suppressScrollX : false,\r\n suppressScrollY : false,\r\n scrollXMarginOffset : 0,\r\n scrollYMarginOffset : 0,\r\n stopPropagationOnClick: true\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n defaultConfiguration = angular.extend({}, defaultConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getConfig: getConfig\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Return the config\r\n */\r\n function getConfig()\r\n {\r\n return defaultConfiguration;\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msScrollDirective($timeout, msScrollConfig, msUtils, fuseConfig)\r\n {\r\n return {\r\n restrict: 'AE',\r\n compile : function (tElement)\r\n {\r\n // Do not replace scrollbars if\r\n // 'disableCustomScrollbars' config enabled\r\n if ( fuseConfig.getConfig('disableCustomScrollbars') )\r\n {\r\n return;\r\n }\r\n\r\n // Do not replace scrollbars on mobile devices\r\n // if 'disableCustomScrollbarsOnMobile' config enabled\r\n if ( fuseConfig.getConfig('disableCustomScrollbarsOnMobile') && msUtils.isMobile() )\r\n {\r\n return;\r\n }\r\n\r\n // Add class\r\n tElement.addClass('ms-scroll');\r\n\r\n return function postLink(scope, iElement, iAttrs)\r\n {\r\n var options = {};\r\n\r\n // If options supplied, evaluate the given\r\n // value. This is because we don't want to\r\n // have an isolated scope but still be able\r\n // to use scope variables.\r\n // We don't want an isolated scope because\r\n // we should be able to use this everywhere\r\n // especially with other directives\r\n if ( iAttrs.msScroll )\r\n {\r\n options = scope.$eval(iAttrs.msScroll);\r\n }\r\n\r\n // Extend the given config with the ones from provider\r\n options = angular.extend({}, msScrollConfig.getConfig(), options);\r\n\r\n // Initialize the scrollbar\r\n $timeout(function ()\r\n {\r\n PerfectScrollbar.initialize(iElement[0], options);\r\n }, 0);\r\n\r\n // Update the scrollbar on element mouseenter\r\n iElement.on('mouseenter', updateScrollbar);\r\n\r\n // Watch scrollHeight and update\r\n // the scrollbar if it changes\r\n scope.$watch(function ()\r\n {\r\n return iElement.prop('scrollHeight');\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n updateScrollbar();\r\n });\r\n\r\n // Watch scrollWidth and update\r\n // the scrollbar if it changes\r\n scope.$watch(function ()\r\n {\r\n return iElement.prop('scrollWidth');\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n updateScrollbar();\r\n });\r\n\r\n /**\r\n * Update the scrollbar\r\n */\r\n function updateScrollbar()\r\n {\r\n PerfectScrollbar.update(iElement[0]);\r\n }\r\n\r\n // Cleanup on destroy\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('mouseenter');\r\n PerfectScrollbar.destroy(iElement[0]);\r\n });\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msResponsiveTable', msResponsiveTableDirective);\r\n\r\n /** @ngInject */\r\n function msResponsiveTableDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n link : function (scope, iElement)\r\n {\r\n // Wrap the table\r\n var wrapper = angular.element('
');\r\n iElement.after(wrapper);\r\n wrapper.append(iElement);\r\n\r\n //////////\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msRandomClass', msRandomClassDirective);\r\n\r\n /** @ngInject */\r\n function msRandomClassDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n scope : {\r\n msRandomClass: '='\r\n },\r\n link : function (scope, iElement)\r\n {\r\n var randomClass = scope.msRandomClass[Math.floor(Math.random() * (scope.msRandomClass.length))];\r\n iElement.addClass(randomClass);\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msNavigationService', msNavigationServiceProvider)\r\n .controller('MsNavigationController', MsNavigationController)\r\n // Vertical\r\n .directive('msNavigation', msNavigationDirective)\r\n .controller('MsNavigationNodeController', MsNavigationNodeController)\r\n .directive('msNavigationNode', msNavigationNodeDirective)\r\n .directive('msNavigationItem', msNavigationItemDirective)\r\n //Horizontal\r\n .directive('msNavigationHorizontal', msNavigationHorizontalDirective)\r\n .controller('MsNavigationHorizontalNodeController', MsNavigationHorizontalNodeController)\r\n .directive('msNavigationHorizontalNode', msNavigationHorizontalNodeDirective)\r\n .directive('msNavigationHorizontalItem', msNavigationHorizontalItemDirective);\r\n\r\n /** @ngInject */\r\n function msNavigationServiceProvider()\r\n {\r\n // Inject $log service\r\n var $log = angular.injector(['ng']).get('$log');\r\n\r\n // Navigation array\r\n var navigation = [];\r\n\r\n var service = this;\r\n\r\n // Methods\r\n service.saveItem = saveItem;\r\n service.deleteItem = deleteItem;\r\n service.sortByWeight = sortByWeight;\r\n\r\n //////////\r\n\r\n /**\r\n * Create or update the navigation item\r\n *\r\n * @param path\r\n * @param item\r\n */\r\n function saveItem(path, item)\r\n {\r\n if ( !angular.isString(path) )\r\n {\r\n $log.error('path must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n var parts = path.split('.');\r\n\r\n // Generate the object id from the parts\r\n var id = parts[parts.length - 1];\r\n\r\n // Get the parent item from the parts\r\n var parent = _findOrCreateParent(parts);\r\n\r\n // Decide if we are going to update or create\r\n var updateItem = false;\r\n\r\n for ( var i = 0; i < parent.length; i++ )\r\n {\r\n if ( parent[i]._id === id )\r\n {\r\n updateItem = parent[i];\r\n\r\n break;\r\n }\r\n }\r\n\r\n // Update\r\n if ( updateItem )\r\n {\r\n angular.extend(updateItem, item);\r\n\r\n // Add proper ui-sref\r\n updateItem.uisref = _getUiSref(updateItem);\r\n }\r\n // Create\r\n else\r\n {\r\n // Create an empty children array in the item\r\n item.children = [];\r\n\r\n // Add the default weight if not provided or if it's not a number\r\n if ( angular.isUndefined(item.weight) || !angular.isNumber(item.weight) )\r\n {\r\n item.weight = 1;\r\n }\r\n\r\n // Add the item id\r\n item._id = id;\r\n\r\n // Add the item path\r\n item._path = path;\r\n\r\n // Add proper ui-sref\r\n item.uisref = _getUiSref(item);\r\n\r\n // Push the item into the array\r\n parent.push(item);\r\n }\r\n }\r\n\r\n /**\r\n * Delete navigation item\r\n *\r\n * @param path\r\n */\r\n function deleteItem(path)\r\n {\r\n if ( !angular.isString(path) )\r\n {\r\n $log.error('path must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n // Locate the item by using given path\r\n var item = navigation,\r\n parts = path.split('.');\r\n\r\n for ( var p = 0; p < parts.length; p++ )\r\n {\r\n var id = parts[p];\r\n\r\n for ( var i = 0; i < item.length; i++ )\r\n {\r\n if ( item[i]._id === id )\r\n {\r\n // If we have a matching path,\r\n // we have found our object:\r\n // remove it.\r\n if ( item[i]._path === path )\r\n {\r\n item.splice(i, 1);\r\n return true;\r\n }\r\n\r\n // Otherwise grab the children of\r\n // the current item and continue\r\n item = item[i].children;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Sort the navigation items by their weights\r\n *\r\n * @param parent\r\n */\r\n function sortByWeight(parent)\r\n {\r\n // If parent not provided, sort the root items\r\n if ( !parent )\r\n {\r\n parent = navigation;\r\n parent.sort(_byWeight);\r\n }\r\n\r\n // Sort the children\r\n for ( var i = 0; i < parent.length; i++ )\r\n {\r\n var children = parent[i].children;\r\n\r\n if ( children.length > 1 )\r\n {\r\n children.sort(_byWeight);\r\n }\r\n\r\n if ( children.length > 0 )\r\n {\r\n sortByWeight(children);\r\n }\r\n }\r\n }\r\n\r\n /* ----------------- */\r\n /* Private Functions */\r\n /* ----------------- */\r\n\r\n /**\r\n * Find or create parent\r\n *\r\n * @param parts\r\n * @returns {Array|Boolean}\r\n * @private\r\n */\r\n function _findOrCreateParent(parts)\r\n {\r\n // Store the main navigation\r\n var parent = navigation;\r\n\r\n // If it's going to be a root item\r\n // return the navigation itself\r\n if ( parts.length === 1 )\r\n {\r\n return parent;\r\n }\r\n\r\n // Remove the last element from the parts as\r\n // we don't need that to figure out the parent\r\n parts.pop();\r\n\r\n // Find and return the parent\r\n for ( var i = 0; i < parts.length; i++ )\r\n {\r\n var _id = parts[i],\r\n createParent = true;\r\n\r\n for ( var p = 0; p < parent.length; p++ )\r\n {\r\n if ( parent[p]._id === _id )\r\n {\r\n parent = parent[p].children;\r\n createParent = false;\r\n\r\n break;\r\n }\r\n }\r\n\r\n // If there is no parent found, create one, push\r\n // it into the current parent and assign it as a\r\n // new parent\r\n if ( createParent )\r\n {\r\n var item = {\r\n _id : _id,\r\n _path : parts.join('.'),\r\n title : _id,\r\n weight : 1,\r\n children: []\r\n };\r\n\r\n parent.push(item);\r\n parent = item.children;\r\n }\r\n }\r\n\r\n return parent;\r\n }\r\n\r\n /**\r\n * Sort by weight\r\n *\r\n * @param x\r\n * @param y\r\n * @returns {number}\r\n * @private\r\n */\r\n function _byWeight(x, y)\r\n {\r\n return parseInt(x.weight) - parseInt(y.weight);\r\n }\r\n\r\n /**\r\n * Setup the ui-sref using state & state parameters\r\n *\r\n * @param item\r\n * @returns {string}\r\n * @private\r\n */\r\n function _getUiSref(item)\r\n {\r\n var uisref = '';\r\n\r\n if ( angular.isDefined(item.state) )\r\n {\r\n uisref = item.state;\r\n\r\n if ( angular.isDefined(item.stateParams) && angular.isObject(item.stateParams) )\r\n {\r\n uisref = uisref + '(' + angular.toJson(item.stateParams) + ')';\r\n }\r\n }\r\n\r\n return uisref;\r\n }\r\n\r\n /* ----------------- */\r\n /* Service */\r\n /* ----------------- */\r\n\r\n this.$get = function ()\r\n {\r\n var activeItem = null,\r\n navigationScope = null,\r\n folded = null,\r\n foldedOpen = null,\r\n _flatNavigation = [];\r\n\r\n var service = {\r\n saveItem : saveItem,\r\n deleteItem : deleteItem,\r\n sort : sortByWeight,\r\n clearNavigation : clearNavigation,\r\n setActiveItem : setActiveItem,\r\n getActiveItem : getActiveItem,\r\n getNavigation : getNavigation,\r\n getFlatNavigation : getFlatNavigation,\r\n setNavigationScope: setNavigationScope,\r\n setFolded : setFolded,\r\n getFolded : getFolded,\r\n setFoldedOpen : setFoldedOpen,\r\n getFoldedOpen : getFoldedOpen,\r\n toggleFolded : toggleFolded\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Clear the entire navigation\r\n */\r\n function clearNavigation()\r\n {\r\n // Clear the navigation array\r\n navigation = [];\r\n\r\n // Clear the vm.navigation from main controller\r\n if ( navigationScope )\r\n {\r\n navigationScope.vm.navigation = [];\r\n }\r\n }\r\n\r\n /**\r\n * Set active item\r\n *\r\n * @param node\r\n * @param scope\r\n */\r\n function setActiveItem(node, scope)\r\n {\r\n activeItem = {\r\n node : node,\r\n scope: scope\r\n };\r\n }\r\n\r\n /**\r\n * Return active item\r\n */\r\n function getActiveItem()\r\n {\r\n return activeItem;\r\n }\r\n\r\n /**\r\n * Return navigation array\r\n *\r\n * @param root\r\n * @returns Array\r\n */\r\n function getNavigation(root)\r\n {\r\n if ( root )\r\n {\r\n for ( var i = 0; i < navigation.length; i++ )\r\n {\r\n if ( navigation[i]._id === root )\r\n {\r\n return [navigation[i]];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n return navigation;\r\n }\r\n\r\n /**\r\n * Return flat navigation array\r\n *\r\n * @param root\r\n * @returns Array\r\n */\r\n function getFlatNavigation(root)\r\n {\r\n // Get the correct navigation array\r\n var navigation = getNavigation(root);\r\n\r\n // Flatten the navigation object\r\n return _flattenNavigation(navigation);\r\n }\r\n\r\n /**\r\n * Store navigation's scope for later use\r\n *\r\n * @param scope\r\n */\r\n function setNavigationScope(scope)\r\n {\r\n navigationScope = scope;\r\n }\r\n\r\n /**\r\n * Set folded status\r\n *\r\n * @param status\r\n */\r\n function setFolded(status)\r\n {\r\n folded = status;\r\n }\r\n\r\n /**\r\n * Return folded status\r\n *\r\n * @returns {*}\r\n */\r\n function getFolded()\r\n {\r\n return folded;\r\n }\r\n\r\n /**\r\n * Set folded open status\r\n *\r\n * @param status\r\n */\r\n function setFoldedOpen(status)\r\n {\r\n foldedOpen = status;\r\n }\r\n\r\n /**\r\n * Return folded open status\r\n *\r\n * @returns {*}\r\n */\r\n function getFoldedOpen()\r\n {\r\n return foldedOpen;\r\n }\r\n\r\n\r\n /**\r\n * Toggle fold on stored navigation's scope\r\n */\r\n function toggleFolded()\r\n {\r\n navigationScope.toggleFolded();\r\n }\r\n\r\n /**\r\n * Flatten the given navigation\r\n *\r\n * @param navigation\r\n * @private\r\n */\r\n function _flattenNavigation(navigation)\r\n {\r\n var flatNav = [];\r\n\r\n for ( var x = 0; x < navigation.length; x++ )\r\n {\r\n // Copy and clear the children of the\r\n // navigation that we want to push\r\n var navToPush = angular.copy(navigation[x]);\r\n navToPush.children = [];\r\n\r\n // Push the item\r\n flatNav.push(navToPush);\r\n\r\n // If there are child items in this navigation,\r\n // do some nested function magic\r\n if ( navigation[x].children.length > 0 )\r\n {\r\n flatNav = flatNav.concat(_flattenNavigation(navigation[x].children));\r\n }\r\n }\r\n\r\n return flatNav;\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationController($scope, msNavigationService, $transitions)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n if ( $scope.root )\r\n {\r\n vm.navigation = msNavigationService.getNavigation($scope.root);\r\n }\r\n else\r\n {\r\n vm.navigation = msNavigationService.getNavigation();\r\n }\r\n\r\n // Methods\r\n vm.toggleHorizontalMobileMenu = toggleHorizontalMobileMenu;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Sort the navigation before doing anything else\r\n msNavigationService.sort();\r\n }\r\n\r\n /**\r\n * Toggle horizontal mobile menu\r\n */\r\n function toggleHorizontalMobileMenu()\r\n {\r\n angular.element('body').toggleClass('ms-navigation-horizontal-mobile-menu-active');\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationDirective($rootScope, $timeout, $mdSidenav, msNavigationService, $transitions)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n folded: '=',\r\n root : '@'\r\n },\r\n controller : 'MsNavigationController as vm',\r\n templateUrl: 'app/core/directives/ms-navigation/templates/vertical.html',\r\n transclude : true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n var bodyEl = angular.element('body'),\r\n foldExpanderEl = angular.element('
'),\r\n foldCollapserEl = angular.element('
'),\r\n sidenav = $mdSidenav('navigation');\r\n\r\n // Store the navigation in the service for public access\r\n msNavigationService.setNavigationScope(scope);\r\n\r\n // Initialize\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Set the folded status for the first time.\r\n // First, we have to check if we have a folded\r\n // status available in the service already. This\r\n // will prevent navigation to act weird if we already\r\n // set the fold status, remove the navigation and\r\n // then re-initialize it, which happens if we\r\n // change to a view without a navigation and then\r\n // come back with history.back() function.\r\n\r\n // If the service didn't initialize before, set\r\n // the folded status from scope, otherwise we\r\n // won't touch anything because the folded status\r\n // already set in the service...\r\n if ( msNavigationService.getFolded() === null )\r\n {\r\n msNavigationService.setFolded(scope.folded);\r\n }\r\n\r\n if ( msNavigationService.getFolded() )\r\n {\r\n // Collapse everything.\r\n // This must be inside a $timeout because by the\r\n // time we call this, the 'msNavigation::collapse'\r\n // event listener is not registered yet. $timeout\r\n // will ensure that it will be called after it is\r\n // registered.\r\n $timeout(function ()\r\n {\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n });\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded');\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n }\r\n\r\n // Sidenav locked open status watcher\r\n scope.$watch(function ()\r\n {\r\n return sidenav.isLockedOpen();\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n var folded = msNavigationService.getFolded();\r\n\r\n if ( folded )\r\n {\r\n if ( current )\r\n {\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n }\r\n else\r\n {\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Folded status watcher\r\n scope.$watch('folded', function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n setFolded(current);\r\n });\r\n\r\n /**\r\n * Set folded status\r\n *\r\n * @param folded\r\n */\r\n function setFolded(folded)\r\n {\r\n // Store folded status on the service for global access\r\n msNavigationService.setFolded(folded);\r\n\r\n if ( folded )\r\n {\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded');\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n else\r\n {\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n\r\n // Remove body class\r\n bodyEl.removeClass('ms-navigation-folded ms-navigation-folded-open');\r\n\r\n // Remove fold collapser\r\n removeFoldCollapser();\r\n }\r\n }\r\n\r\n /**\r\n * Set fold expander\r\n */\r\n function setFoldExpander()\r\n {\r\n iElement.parent().append(foldExpanderEl);\r\n\r\n // Let everything settle for a moment\r\n // before registering the event listener\r\n $timeout(function ()\r\n {\r\n foldExpanderEl.on('mouseenter touchstart', onFoldExpanderHover);\r\n });\r\n }\r\n\r\n /**\r\n * Set fold collapser\r\n */\r\n function setFoldCollapser()\r\n {\r\n bodyEl.find('#main').append(foldCollapserEl);\r\n foldCollapserEl.on('mouseenter touchstart', onFoldCollapserHover);\r\n }\r\n\r\n /**\r\n * Remove fold collapser\r\n */\r\n function removeFoldCollapser()\r\n {\r\n foldCollapserEl.remove();\r\n }\r\n\r\n /**\r\n * onHover event of foldExpander\r\n */\r\n function onFoldExpanderHover(event)\r\n {\r\n if ( event )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Set folded open status\r\n msNavigationService.setFoldedOpen(true);\r\n\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded-open');\r\n\r\n // Remove the fold opener\r\n foldExpanderEl.remove();\r\n\r\n // Set fold collapser\r\n setFoldCollapser();\r\n }\r\n\r\n /**\r\n * onHover event of foldCollapser\r\n */\r\n function onFoldCollapserHover(event)\r\n {\r\n if ( event )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Set folded open status\r\n msNavigationService.setFoldedOpen(false);\r\n\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n\r\n // Remove body class\r\n bodyEl.removeClass('ms-navigation-folded-open');\r\n\r\n // Remove the fold collapser\r\n foldCollapserEl.remove();\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n\r\n /**\r\n * Public access for toggling folded status externally\r\n */\r\n scope.toggleFolded = function ()\r\n {\r\n var folded = msNavigationService.getFolded();\r\n\r\n setFolded(!folded);\r\n };\r\n\r\n /**\r\n * On $stateChangeStart\r\n */\r\n $transitions.onStart({ }, function (transition)\r\n {\r\n // Close the sidenav\r\n sidenav.close();\r\n });\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n foldCollapserEl.off('mouseenter touchstart');\r\n foldExpanderEl.off('mouseenter touchstart');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationNodeController($scope, $element, $rootScope, $animate, $state, msNavigationService, $transitions)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.element = $element;\r\n vm.node = $scope.node;\r\n vm.hasChildren = undefined;\r\n vm.collapsed = undefined;\r\n vm.collapsable = undefined;\r\n vm.group = undefined;\r\n vm.animateHeightClass = 'animate-height';\r\n\r\n // Methods\r\n vm.toggleCollapsed = toggleCollapsed;\r\n vm.collapse = collapse;\r\n vm.expand = expand;\r\n vm.getClass = getClass;\r\n vm.isHidden = isHidden;\r\n vm.isActive = isActive;\r\n vm.goToState = goToState;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Setup the initial values\r\n\r\n // Has children?\r\n vm.hasChildren = vm.node.children.length > 0;\r\n\r\n // Is group?\r\n vm.group = !!(angular.isDefined(vm.node.group) && vm.node.group === true);\r\n\r\n // Is collapsable?\r\n if ( !vm.hasChildren || vm.group )\r\n {\r\n vm.collapsable = false;\r\n }\r\n else\r\n {\r\n vm.collapsable = !!(angular.isUndefined(vm.node.collapsable) || typeof vm.node.collapsable !== 'boolean' || vm.node.collapsable === true);\r\n }\r\n\r\n // Is collapsed?\r\n if ( !vm.collapsable )\r\n {\r\n vm.collapsed = false;\r\n }\r\n else\r\n {\r\n vm.collapsed = !!(angular.isUndefined(vm.node.collapsed) || typeof vm.node.collapsed !== 'boolean' || vm.node.collapsed === true);\r\n }\r\n\r\n // Expand all parents if we have a matching state or\r\n // the current state is a child of the node's state\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n $scope.$emit('msNavigation::stateMatched');\r\n\r\n // Also store the current active menu item\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n }\r\n\r\n $scope.$on('msNavigation::stateMatched', function ()\r\n {\r\n // Expand if the current scope is collapsable and is collapsed\r\n if ( vm.collapsable && vm.collapsed )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.collapsed = false;\r\n });\r\n }\r\n });\r\n\r\n // Listen for collapse event\r\n $scope.$on('msNavigation::collapse', function (event, path)\r\n {\r\n if ( vm.collapsed || !vm.collapsable )\r\n {\r\n return;\r\n }\r\n\r\n // If there is no path defined, collapse\r\n if ( angular.isUndefined(path) )\r\n {\r\n vm.collapse();\r\n }\r\n // If there is a path defined, do not collapse\r\n // the items that are inside that path. This will\r\n // prevent parent items from collapsing\r\n else\r\n {\r\n var givenPathParts = path.split('.'),\r\n activePathParts = [];\r\n\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activePathParts = activeItem.node._path.split('.');\r\n }\r\n\r\n // Test for given path\r\n if ( givenPathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n return;\r\n }\r\n\r\n // Test for active path\r\n if ( activePathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n return;\r\n }\r\n\r\n vm.collapse();\r\n }\r\n });\r\n\r\n // Listen for $stateChangeSuccess event\r\n $transitions.onSuccess({ }, function (transition)\r\n {\r\n if ( vm.node.state === $state.current.name )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Update active item on state change\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n\r\n // Collapse everything except the one we're using\r\n $rootScope.$broadcast('msNavigation::collapse', vm.node._path);\r\n }\r\n\r\n // Expand the parents if we the current\r\n // state is a child of the node's state\r\n if ( $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Emit the stateMatched\r\n $scope.$emit('msNavigation::stateMatched');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Toggle collapsed\r\n */\r\n function toggleCollapsed()\r\n {\r\n if ( vm.collapsed )\r\n {\r\n vm.expand();\r\n }\r\n else\r\n {\r\n vm.collapse();\r\n }\r\n }\r\n\r\n /**\r\n * Collapse\r\n */\r\n function collapse()\r\n {\r\n // Grab the element that we are going to collapse\r\n var collapseEl = vm.element.children('ul');\r\n\r\n // Grab the height\r\n var height = collapseEl[0].offsetHeight;\r\n\r\n $scope.$evalAsync(function ()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = true;\r\n\r\n // Add collapsing class to the node\r\n vm.element.addClass('collapsing');\r\n\r\n // Animate the height\r\n $animate.animate(collapseEl,\r\n {\r\n 'display': 'block',\r\n 'height' : height + 'px'\r\n },\r\n {\r\n 'height': '0px'\r\n },\r\n vm.animateHeightClass\r\n ).then(\r\n function ()\r\n {\r\n // Clear the inline styles after animation done\r\n collapseEl.css({\r\n 'display': '',\r\n 'height' : ''\r\n });\r\n\r\n // Clear collapsing class from the node\r\n vm.element.removeClass('collapsing');\r\n }\r\n );\r\n\r\n // Broadcast the collapse event so child items can also be collapsed\r\n $scope.$broadcast('msNavigation::collapse');\r\n });\r\n }\r\n\r\n /**\r\n * Expand\r\n */\r\n function expand()\r\n {\r\n // Grab the element that we are going to expand\r\n var expandEl = vm.element.children('ul');\r\n\r\n // Move the element out of the dom flow and\r\n // make it block so we can get its height\r\n expandEl.css({\r\n 'position' : 'absolute',\r\n 'visibility': 'hidden',\r\n 'display' : 'block',\r\n 'height' : 'auto'\r\n });\r\n\r\n // Grab the height\r\n var height = expandEl[0].offsetHeight;\r\n\r\n // Reset the style modifications\r\n expandEl.css({\r\n 'position' : '',\r\n 'visibility': '',\r\n 'display' : '',\r\n 'height' : ''\r\n });\r\n\r\n $scope.$evalAsync(function ()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = false;\r\n\r\n // Add expanding class to the node\r\n vm.element.addClass('expanding');\r\n\r\n // Animate the height\r\n $animate.animate(expandEl,\r\n {\r\n 'display': 'block',\r\n 'height' : '0px'\r\n },\r\n {\r\n 'height': height + 'px'\r\n },\r\n vm.animateHeightClass\r\n ).then(\r\n function ()\r\n {\r\n // Clear the inline styles after animation done\r\n expandEl.css({\r\n 'height': ''\r\n });\r\n\r\n // Clear expanding class from the node\r\n vm.element.removeClass('expanding');\r\n }\r\n );\r\n\r\n // If item expanded, broadcast the collapse event from rootScope so that the other expanded items\r\n // can be collapsed. This is necessary for keeping only one parent expanded at any time\r\n $rootScope.$broadcast('msNavigation::collapse', vm.node._path);\r\n });\r\n }\r\n\r\n /**\r\n * Return the class\r\n *\r\n * @returns {*}\r\n */\r\n function getClass()\r\n {\r\n return vm.node.class;\r\n }\r\n\r\n /**\r\n * Check if node should be hidden\r\n *\r\n * @returns {boolean}\r\n */\r\n function isHidden()\r\n {\r\n if ( angular.isDefined(vm.node.hidden) && angular.isFunction(vm.node.hidden) )\r\n {\r\n return vm.node.hidden();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function goToState(node) {\r\n if ($state.current.name !== node.state) {\r\n $state.go(node.state, node.stateParams);\r\n }\r\n }\r\n\r\n function isActive(stateName) {\r\n return $state.current.name === stateName;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationNodeDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n bindToController: {\r\n node: '=msNavigationNode'\r\n },\r\n controller : 'MsNavigationNodeController as vm',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-node');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationNodeCtrl)\r\n {\r\n // Add custom classes\r\n iElement.addClass(MsNavigationNodeCtrl.getClass());\r\n\r\n // Add group class if it's a group\r\n if ( MsNavigationNodeCtrl.group )\r\n {\r\n iElement.addClass('group');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationItemDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNavigationNode',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-item');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationNodeCtrl)\r\n {\r\n // If the item is collapsable...\r\n if ( MsNavigationNodeCtrl.collapsable )\r\n {\r\n iElement.on('click', MsNavigationNodeCtrl.toggleCollapsed);\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('click');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalDirective(msNavigationService)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n root: '@'\r\n },\r\n controller : 'MsNavigationController as vm',\r\n templateUrl: 'app/core/directives/ms-navigation/templates/horizontal.html',\r\n transclude : true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal');\r\n\r\n return function postLink(scope)\r\n {\r\n // Store the navigation in the service for public access\r\n msNavigationService.setNavigationScope(scope);\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationHorizontalNodeController($scope, $element, $rootScope, $state, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.element = $element;\r\n vm.node = $scope.node;\r\n vm.hasChildren = undefined;\r\n vm.group = undefined;\r\n\r\n // Methods\r\n vm.getClass = getClass;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Setup the initial values\r\n\r\n // Is active\r\n vm.isActive = false;\r\n\r\n // Has children?\r\n vm.hasChildren = vm.node.children.length > 0;\r\n\r\n // Is group?\r\n vm.group = !!(angular.isDefined(vm.node.group) && vm.node.group === true);\r\n\r\n // Mark all parents as active if we have a matching state\r\n // or the current state is a child of the node's state\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n $scope.$emit('msNavigation::stateMatched');\r\n\r\n // Also store the current active menu item\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n }\r\n\r\n $scope.$on('msNavigation::stateMatched', function ()\r\n {\r\n // Mark as active if has children\r\n if ( vm.hasChildren )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = true;\r\n });\r\n }\r\n });\r\n\r\n // Listen for clearActive event\r\n $scope.$on('msNavigation::clearActive', function ()\r\n {\r\n if ( !vm.hasChildren )\r\n {\r\n return;\r\n }\r\n\r\n var activePathParts = [];\r\n\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activePathParts = activeItem.node._path.split('.');\r\n }\r\n\r\n // Test for active path\r\n if ( activePathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = true;\r\n });\r\n }\r\n else\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = false;\r\n });\r\n }\r\n\r\n });\r\n\r\n // Listen for $stateChangeSuccess event\r\n $transition.onSuccess({ }, function (transition)\r\n {\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Update active item on state change\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n\r\n // Clear all active states except the one we're using\r\n $rootScope.$broadcast('msNavigation::clearActive');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Return the class\r\n *\r\n * @returns {*}\r\n */\r\n function getClass()\r\n {\r\n return vm.node.class;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalNodeDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n bindToController: {\r\n node: '=msNavigationHorizontalNode'\r\n },\r\n controller : 'MsNavigationHorizontalNodeController as vm',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal-node');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationHorizontalNodeCtrl)\r\n {\r\n // Add custom classes\r\n iElement.addClass(MsNavigationHorizontalNodeCtrl.getClass());\r\n\r\n // Add group class if it's a group\r\n if ( MsNavigationHorizontalNodeCtrl.group )\r\n {\r\n iElement.addClass('group');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalItemDirective($mdMedia)\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNavigationHorizontalNode',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal-item');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationHorizontalNodeCtrl)\r\n {\r\n iElement.on('click', onClick);\r\n\r\n function onClick()\r\n {\r\n if ( !MsNavigationHorizontalNodeCtrl.hasChildren || $mdMedia('gt-md') )\r\n {\r\n return;\r\n }\r\n\r\n iElement.toggleClass('expanded');\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('click');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msInfoBar', msInfoBarDirective);\r\n\r\n /** @ngInject */\r\n function msInfoBarDirective($document)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n transclude : true,\r\n templateUrl: 'app/core/directives/ms-info-bar/ms-info-bar.html',\r\n link : function (scope, iElement)\r\n {\r\n var body = $document.find('body'),\r\n bodyClass = 'ms-info-bar-active';\r\n\r\n // Add body class\r\n body.addClass(bodyClass);\r\n\r\n /**\r\n * Remove the info bar\r\n */\r\n function removeInfoBar()\r\n {\r\n body.removeClass(bodyClass);\r\n iElement.remove();\r\n scope.$destroy();\r\n }\r\n\r\n // Expose functions\r\n scope.removeInfoBar = removeInfoBar;\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('msMasonryController', msMasonryController)\r\n .directive('msMasonry', msMasonry)\r\n .directive('msMasonryItem', msMasonryItem);\r\n\r\n /** @ngInject */\r\n function msMasonryController($scope, $window, $mdMedia, $timeout)\r\n {\r\n var vm = this,\r\n defaultOpts = {\r\n columnCount : 5,\r\n reLayoutDebounce: 400,\r\n responsive : {\r\n md: 3,\r\n sm: 2,\r\n xs: 1\r\n }\r\n },\r\n reLayoutTimeout = true;\r\n\r\n vm.options = null;\r\n vm.container = [];\r\n vm.containerPos = '';\r\n vm.columnWidth = '';\r\n vm.items = [];\r\n\r\n // Methods\r\n vm.reLayout = reLayout;\r\n vm.initialize = initialize;\r\n vm.waitImagesLoaded = waitImagesLoaded;\r\n\r\n function initialize()\r\n {\r\n vm.options = !vm.options ? defaultOpts : angular.extend(defaultOpts, vm.options);\r\n\r\n\r\n watchContainerResize();\r\n }\r\n\r\n $scope.$on('msMasonry:relayout', function ()\r\n {\r\n reLayout();\r\n });\r\n\r\n function waitImagesLoaded(element, callback)\r\n {\r\n if ( typeof imagesLoaded !== 'undefined' )\r\n {\r\n var imgLoad = $window.imagesLoaded(element);\r\n\r\n imgLoad.on('done', function ()\r\n {\r\n callback();\r\n });\r\n }\r\n else\r\n {\r\n callback();\r\n }\r\n }\r\n\r\n function watchContainerResize()\r\n {\r\n $scope.$watch(\r\n function ()\r\n {\r\n return vm.container.width();\r\n },\r\n function (newValue, oldValue)\r\n {\r\n if ( newValue !== oldValue )\r\n {\r\n reLayout();\r\n }\r\n }\r\n );\r\n }\r\n\r\n function reLayout()\r\n {\r\n // Debounce for relayout\r\n if ( reLayoutTimeout )\r\n {\r\n $timeout.cancel(reLayoutTimeout);\r\n }\r\n\r\n reLayoutTimeout = $timeout(function ()\r\n {\r\n start();\r\n\r\n $scope.$broadcast('msMasonry:relayoutFinished');\r\n\r\n }, vm.options.reLayoutDebounce);\r\n\r\n // Start relayout\r\n function start()\r\n {\r\n\r\n vm.containerPos = vm.container[0].getBoundingClientRect();\r\n\r\n updateColumnOptions();\r\n\r\n $scope.$broadcast('msMasonry:relayoutStarted');\r\n\r\n vm.items = vm.container.find('ms-masonry-item');\r\n\r\n //initialize lastRowBottomArr\r\n var referenceArr = Array.apply(null, new Array(vm.columnCount)).map(function ()\r\n {\r\n return 0;\r\n });\r\n\r\n // set item positions\r\n for ( var i = 0; i < vm.items.length; i++ )\r\n {\r\n var item = vm.items[i],\r\n xPos, yPos;\r\n\r\n item = angular.element(item);\r\n\r\n if ( item.scope() )\r\n {\r\n item.scope().$broadcast('msMasonryItem:startReLayout');\r\n }\r\n\r\n item.css({'width': vm.columnWidth});\r\n\r\n var refTop = Math.min.apply(Math, referenceArr);\r\n\r\n var column = referenceArr.indexOf(refTop);\r\n\r\n referenceArr[column] = refTop + item[0].getBoundingClientRect().height;\r\n\r\n xPos = Math.round(column * vm.columnWidth);\r\n yPos = refTop;\r\n\r\n item.css({'transform': 'translate3d(' + xPos + 'px,' + yPos + 'px,0px)'});\r\n\r\n item.addClass('placed');\r\n\r\n if ( item.scope() )\r\n {\r\n item.scope().$broadcast('msMasonryItem:finishReLayout');\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n function updateColumnOptions()\r\n {\r\n vm.columnCount = vm.options.columnCount;\r\n\r\n if ( $mdMedia('gt-md') )\r\n {\r\n vm.columnCount = vm.options.columnCount;\r\n }\r\n else if ( $mdMedia('md') )\r\n {\r\n vm.columnCount = (vm.columnCount > vm.options.responsive.md ? vm.options.responsive.md : vm.columnCount);\r\n }\r\n else if ( $mdMedia('sm') )\r\n {\r\n vm.columnCount = (vm.columnCount > vm.options.responsive.sm ? vm.options.responsive.sm : vm.columnCount);\r\n }\r\n else\r\n {\r\n vm.columnCount = vm.options.responsive.xs;\r\n }\r\n\r\n vm.columnWidth = vm.containerPos.width / vm.columnCount;\r\n\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msMasonry($timeout)\r\n {\r\n return {\r\n restrict : 'AEC',\r\n controller: 'msMasonryController',\r\n compile : compile\r\n };\r\n function compile(element, attributes)\r\n {\r\n return {\r\n pre : function preLink(scope, iElement, iAttrs, controller)\r\n {\r\n controller.options = angular.fromJson(attributes.options || '{}');\r\n controller.container = element;\r\n },\r\n post: function postLink(scope, iElement, iAttrs, controller)\r\n {\r\n $timeout(function ()\r\n {\r\n controller.initialize();\r\n });\r\n }\r\n };\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msMasonryItem()\r\n {\r\n return {\r\n restrict: 'AEC',\r\n require : '^msMasonry',\r\n priority: 1,\r\n link : link\r\n };\r\n\r\n function link(scope, element, attributes, controller)\r\n {\r\n controller.waitImagesLoaded(element, function ()\r\n {\r\n controller.reLayout();\r\n\r\n });\r\n\r\n scope.$on('msMasonryItem:finishReLayout', function ()\r\n {\r\n scope.$watch(function ()\r\n {\r\n return element.height();\r\n }, function (newVal, oldVal)\r\n {\r\n if ( newVal !== oldVal )\r\n {\r\n controller.reLayout();\r\n }\r\n });\r\n });\r\n\r\n element.on('$destroy', function ()\r\n {\r\n controller.reLayout();\r\n });\r\n }\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('msMaterialColorPickerController', msMaterialColorPickerController)\r\n .directive('msMaterialColorPicker', msMaterialColorPicker);\r\n\r\n /** @ngInject */\r\n function msMaterialColorPickerController($scope, $mdColorPalette, $mdMenu, fuseGenerator)\r\n {\r\n var vm = this;\r\n vm.palettes = $mdColorPalette; // Material Color Palette\r\n vm.selectedPalette = false;\r\n vm.selectedHues = false;\r\n $scope.$selectedColor = {};\r\n\r\n // Methods\r\n vm.activateHueSelection = activateHueSelection;\r\n vm.selectColor = selectColor;\r\n vm.removeColor = removeColor;\r\n\r\n /**\r\n * Initialize / Watch model changes\r\n */\r\n $scope.$watch('ngModel', setSelectedColor);\r\n\r\n /**\r\n * Activate Hue Selection\r\n * @param palette\r\n * @param hues\r\n */\r\n function activateHueSelection(palette, hues)\r\n {\r\n vm.selectedPalette = palette;\r\n vm.selectedHues = hues;\r\n }\r\n\r\n /**\r\n * Select Color\r\n * @type {selectColor}\r\n */\r\n function selectColor(palette, hue)\r\n {\r\n // Update Selected Color\r\n updateSelectedColor(palette, hue);\r\n\r\n // Update Model Value\r\n updateModel();\r\n\r\n // Hide The picker\r\n $mdMenu.hide();\r\n }\r\n\r\n function removeColor()\r\n {\r\n\r\n vm.selectedColor = {\r\n palette: '',\r\n hue : '',\r\n class : ''\r\n };\r\n\r\n activateHueSelection(false, false);\r\n\r\n updateModel();\r\n }\r\n\r\n /**\r\n * Set SelectedColor by model type\r\n */\r\n function setSelectedColor()\r\n {\r\n\r\n if ( !vm.modelCtrl.$viewValue || vm.modelCtrl.$viewValue === '' )\r\n {\r\n removeColor();\r\n return;\r\n }\r\n\r\n var palette, hue;\r\n\r\n // If ModelType Class\r\n if ( vm.msModelType === 'class' )\r\n {\r\n var color = vm.modelCtrl.$viewValue.split('-');\r\n if ( color.length >= 5 )\r\n {\r\n palette = color[1] + '-' + color[2];\r\n hue = color[3];\r\n }\r\n else\r\n {\r\n palette = color[1];\r\n hue = color[2];\r\n }\r\n }\r\n\r\n // If ModelType Object\r\n else if ( vm.msModelType === 'obj' )\r\n {\r\n palette = vm.modelCtrl.$viewValue.palette;\r\n hue = vm.modelCtrl.$viewValue.hue || 500;\r\n }\r\n\r\n // Update Selected Color\r\n updateSelectedColor(palette, hue);\r\n }\r\n\r\n /**\r\n * Update Selected Color\r\n * @param palette\r\n * @param hue\r\n */\r\n function updateSelectedColor(palette, hue)\r\n {\r\n vm.selectedColor = {\r\n palette : palette,\r\n hue : hue,\r\n class : 'md-' + palette + '-' + hue + '-bg',\r\n bgColorValue: fuseGenerator.rgba(vm.palettes[palette][hue].value),\r\n fgColorValue: fuseGenerator.rgba(vm.palettes[palette][hue].contrast)\r\n };\r\n\r\n // If Model object not Equals the selectedColor update it\r\n // it can be happen when the model only have pallete and hue values\r\n if ( vm.msModelType === 'obj' && !angular.equals(vm.selectedColor, vm.modelCtrl.$viewValue) )\r\n {\r\n // Update Model Value\r\n updateModel();\r\n }\r\n\r\n activateHueSelection(palette, vm.palettes[palette]);\r\n\r\n $scope.$selectedColor = vm.selectedColor;\r\n }\r\n\r\n /**\r\n * Update Model Value by model type\r\n */\r\n function updateModel()\r\n {\r\n\r\n if ( vm.msModelType === 'class' )\r\n {\r\n vm.modelCtrl.$setViewValue(vm.selectedColor.class);\r\n }\r\n else if ( vm.msModelType === 'obj' )\r\n {\r\n vm.modelCtrl.$setViewValue(vm.selectedColor);\r\n }\r\n }\r\n\r\n }\r\n\r\n /** @ngInject */\r\n function msMaterialColorPicker()\r\n {\r\n return {\r\n require : ['msMaterialColorPicker', 'ngModel'],\r\n restrict : 'E',\r\n scope : {\r\n ngModel : '=',\r\n msModelType: '@?'\r\n },\r\n controller : 'msMaterialColorPickerController as vm',\r\n transclude : true,\r\n templateUrl: 'app/core/directives/ms-material-color-picker/ms-material-color-picker.html',\r\n link : function (scope, element, attrs, controllers, transclude)\r\n {\r\n var ctrl = controllers[0];\r\n\r\n /**\r\n * Pass model controller to directive controller\r\n */\r\n ctrl.modelCtrl = controllers[1];\r\n\r\n /**\r\n * ModelType: 'obj', 'class'(default)\r\n * @type {string|string}\r\n */\r\n ctrl.msModelType = scope.msModelType || 'class';\r\n\r\n transclude(scope, function (clone)\r\n {\r\n clone = clone.filter(function (i, el)\r\n {\r\n return ( el.nodeType === 1 ) ? true : false;\r\n });\r\n\r\n if ( clone.length )\r\n {\r\n element.find('ms-color-picker-button').replaceWith(clone);\r\n }\r\n });\r\n\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('msNavFoldService', msNavFoldService)\r\n .directive('msNavIsFolded', msNavIsFoldedDirective)\r\n .controller('MsNavController', MsNavController)\r\n .directive('msNav', msNavDirective)\r\n .directive('msNavTitle', msNavTitleDirective)\r\n .directive('msNavButton', msNavButtonDirective)\r\n .directive('msNavToggle', msNavToggleDirective);\r\n\r\n /** @ngInject */\r\n function msNavFoldService()\r\n {\r\n var foldable = {};\r\n\r\n var service = {\r\n setFoldable : setFoldable,\r\n isNavFoldedOpen: isNavFoldedOpen,\r\n toggleFold : toggleFold,\r\n openFolded : openFolded,\r\n closeFolded : closeFolded\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Set the foldable\r\n *\r\n * @param scope\r\n * @param element\r\n */\r\n function setFoldable(scope, element)\r\n {\r\n foldable = {\r\n 'scope' : scope,\r\n 'element': element\r\n };\r\n }\r\n\r\n /**\r\n * Is folded open\r\n */\r\n function isNavFoldedOpen()\r\n {\r\n return foldable.scope.isNavFoldedOpen();\r\n }\r\n\r\n /**\r\n * Toggle fold\r\n */\r\n function toggleFold()\r\n {\r\n foldable.scope.toggleFold();\r\n }\r\n\r\n /**\r\n * Open folded navigation\r\n */\r\n function openFolded()\r\n {\r\n foldable.scope.openFolded();\r\n }\r\n\r\n /**\r\n * Close folded navigation\r\n */\r\n function closeFolded()\r\n {\r\n foldable.scope.closeFolded();\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavIsFoldedDirective($document, $rootScope, msNavFoldService)\r\n {\r\n return {\r\n restrict: 'A',\r\n link : function (scope, iElement, iAttrs)\r\n {\r\n var isFolded = (iAttrs.msNavIsFolded === 'true'),\r\n isFoldedOpen = false,\r\n body = angular.element($document[0].body),\r\n openOverlay = angular.element('
'),\r\n closeOverlay = angular.element('
'),\r\n sidenavEl = iElement.parent();\r\n\r\n // Initialize the service\r\n msNavFoldService.setFoldable(scope, iElement, isFolded);\r\n\r\n // Set the fold status for the first time\r\n if ( isFolded )\r\n {\r\n fold();\r\n }\r\n else\r\n {\r\n unfold();\r\n }\r\n\r\n /**\r\n * Is nav folded open\r\n */\r\n function isNavFoldedOpen()\r\n {\r\n return isFoldedOpen;\r\n }\r\n\r\n /**\r\n * Toggle fold\r\n */\r\n function toggleFold()\r\n {\r\n isFolded = !isFolded;\r\n\r\n if ( isFolded )\r\n {\r\n fold();\r\n }\r\n else\r\n {\r\n unfold();\r\n }\r\n }\r\n\r\n /**\r\n * Fold the navigation\r\n */\r\n function fold()\r\n {\r\n // Add classes\r\n body.addClass('ms-nav-folded');\r\n\r\n // Collapse everything and scroll to the top\r\n $rootScope.$broadcast('msNav::forceCollapse');\r\n iElement.scrollTop(0);\r\n\r\n // Append the openOverlay to the element\r\n sidenavEl.append(openOverlay);\r\n\r\n // Event listeners\r\n openOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n openFolded(event);\r\n isFoldedOpen = true;\r\n });\r\n }\r\n\r\n /**\r\n * Open folded navigation\r\n */\r\n function openFolded(event)\r\n {\r\n if ( angular.isDefined(event) )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n body.addClass('ms-nav-folded-open');\r\n\r\n // Update the location\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Remove open overlay\r\n sidenavEl.find(openOverlay).remove();\r\n\r\n // Append close overlay and bind its events\r\n sidenavEl.parent().append(closeOverlay);\r\n closeOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n closeFolded(event);\r\n isFoldedOpen = false;\r\n });\r\n }\r\n\r\n /**\r\n * Close folded navigation\r\n */\r\n function closeFolded(event)\r\n {\r\n if ( angular.isDefined(event) )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Collapse everything and scroll to the top\r\n $rootScope.$broadcast('msNav::forceCollapse');\r\n iElement.scrollTop(0);\r\n\r\n body.removeClass('ms-nav-folded-open');\r\n\r\n // Remove close overlay\r\n sidenavEl.parent().find(closeOverlay).remove();\r\n\r\n // Append open overlay and bind its events\r\n sidenavEl.append(openOverlay);\r\n openOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n openFolded(event);\r\n isFoldedOpen = true;\r\n });\r\n }\r\n\r\n /**\r\n * Unfold the navigation\r\n */\r\n function unfold()\r\n {\r\n body.removeClass('ms-nav-folded ms-nav-folded-open');\r\n\r\n // Update the location\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n iElement.off('mouseenter mouseleave');\r\n }\r\n\r\n // Expose functions to the scope\r\n scope.toggleFold = toggleFold;\r\n scope.openFolded = openFolded;\r\n scope.closeFolded = closeFolded;\r\n scope.isNavFoldedOpen = isNavFoldedOpen;\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n openOverlay.off('mouseenter touchstart');\r\n closeOverlay.off('mouseenter touchstart');\r\n iElement.off('mouseenter mouseleave');\r\n });\r\n }\r\n };\r\n }\r\n\r\n\r\n /** @ngInject */\r\n function MsNavController($transitions)\r\n {\r\n var vm = this,\r\n disabled = false,\r\n toggleItems = [],\r\n lockedItems = [];\r\n\r\n // Data\r\n\r\n // Methods\r\n vm.isDisabled = isDisabled;\r\n vm.enable = enable;\r\n vm.disable = disable;\r\n vm.setToggleItem = setToggleItem;\r\n vm.getLockedItems = getLockedItems;\r\n vm.setLockedItem = setLockedItem;\r\n vm.clearLockedItems = clearLockedItems;\r\n\r\n //////////\r\n\r\n /**\r\n * Is navigation disabled\r\n *\r\n * @returns {boolean}\r\n */\r\n function isDisabled()\r\n {\r\n return disabled;\r\n }\r\n\r\n /**\r\n * Disable the navigation\r\n */\r\n function disable()\r\n {\r\n disabled = true;\r\n }\r\n\r\n /**\r\n * Enable the navigation\r\n */\r\n function enable()\r\n {\r\n disabled = false;\r\n }\r\n\r\n /**\r\n * Set toggle item\r\n *\r\n * @param element\r\n * @param scope\r\n */\r\n function setToggleItem(element, scope)\r\n {\r\n toggleItems.push({\r\n 'element': element,\r\n 'scope' : scope\r\n });\r\n }\r\n\r\n /**\r\n * Get locked items\r\n *\r\n * @returns {Array}\r\n */\r\n function getLockedItems()\r\n {\r\n return lockedItems;\r\n }\r\n\r\n /**\r\n * Set locked item\r\n *\r\n * @param element\r\n * @param scope\r\n */\r\n function setLockedItem(element, scope)\r\n {\r\n lockedItems.push({\r\n 'element': element,\r\n 'scope' : scope\r\n });\r\n }\r\n\r\n /**\r\n * Clear locked items list\r\n */\r\n function clearLockedItems()\r\n {\r\n lockedItems = [];\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavDirective($rootScope, $mdComponentRegistry, msNavFoldService, $transitions)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n controller: 'MsNavController',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav');\r\n\r\n return function postLink(scope)\r\n {\r\n // Update toggle status according to the ui-router current state\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Update toggles on state changes\r\n var stateChangeSuccessEvent = $transitions.onSuccess({ }, function (transition)\r\n {\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Close navigation sidenav on stateChangeSuccess\r\n $mdComponentRegistry.when('navigation').then(function (navigation)\r\n {\r\n navigation.close();\r\n\r\n if ( msNavFoldService.isNavFoldedOpen() )\r\n {\r\n msNavFoldService.closeFolded();\r\n }\r\n });\r\n });\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n stateChangeSuccessEvent();\r\n })\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavTitleDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav-title');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavButtonDirective()\r\n {\r\n return {\r\n restrict: 'AE',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav-button');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavToggleDirective($rootScope, $q, $animate, $state)\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNav',\r\n scope : true,\r\n compile : function (tElement, tAttrs)\r\n {\r\n tElement.addClass('ms-nav-toggle');\r\n\r\n // Add collapsed attr\r\n if ( angular.isUndefined(tAttrs.collapsed) )\r\n {\r\n tAttrs.collapsed = true;\r\n }\r\n\r\n tElement.attr('collapsed', tAttrs.collapsed);\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavCtrl)\r\n {\r\n var classes = {\r\n expanded : 'expanded',\r\n expandAnimation : 'expand-animation',\r\n collapseAnimation: 'collapse-animation'\r\n };\r\n\r\n // Store all related states\r\n var links = iElement.find('a');\r\n var states = [];\r\n var regExp = /\\(.*\\)/g;\r\n\r\n angular.forEach(links, function (link)\r\n {\r\n var state = angular.element(link).attr('ui-sref');\r\n\r\n if ( angular.isUndefined(state) )\r\n {\r\n return;\r\n }\r\n\r\n // Remove any parameter definition from the state name before storing it\r\n state = state.replace(regExp, '');\r\n\r\n states.push(state);\r\n });\r\n\r\n // Store toggle-able element and its scope in the main nav controller\r\n MsNavCtrl.setToggleItem(iElement, scope);\r\n\r\n // Click handler\r\n iElement.children('.ms-nav-button').on('click', toggle);\r\n\r\n // Toggle function\r\n function toggle()\r\n {\r\n // If navigation is disabled, do nothing...\r\n if ( MsNavCtrl.isDisabled() )\r\n {\r\n return;\r\n }\r\n\r\n // Disable the entire navigation to prevent spamming\r\n MsNavCtrl.disable();\r\n\r\n if ( isCollapsed() )\r\n {\r\n // Clear the locked items list\r\n MsNavCtrl.clearLockedItems();\r\n\r\n // Emit pushToLockedList event\r\n scope.$emit('msNav::pushToLockedList');\r\n\r\n // Collapse everything but locked items\r\n $rootScope.$broadcast('msNav::collapse');\r\n\r\n // Expand and then...\r\n expand().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n }\r\n else\r\n {\r\n // Collapse with all children\r\n scope.$broadcast('msNav::forceCollapse');\r\n }\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.children('.ms-nav-button').off('click');\r\n });\r\n\r\n /*---------------------*/\r\n /* Scope Events */\r\n /*---------------------*/\r\n\r\n /**\r\n * Collapse everything but locked items\r\n */\r\n scope.$on('msNav::collapse', function ()\r\n {\r\n // Only collapse toggles that are not locked\r\n var lockedItems = MsNavCtrl.getLockedItems();\r\n var locked = false;\r\n\r\n angular.forEach(lockedItems, function (lockedItem)\r\n {\r\n if ( angular.equals(lockedItem.scope, scope) )\r\n {\r\n locked = true;\r\n }\r\n });\r\n\r\n if ( locked )\r\n {\r\n return;\r\n }\r\n\r\n // Collapse and then...\r\n collapse().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n });\r\n\r\n /**\r\n * Collapse everything\r\n */\r\n scope.$on('msNav::forceCollapse', function ()\r\n {\r\n // Collapse and then...\r\n collapse().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n });\r\n\r\n /**\r\n * Expand toggles that match with the current states\r\n */\r\n scope.$on('msNav::expandMatchingToggles', function ()\r\n {\r\n var currentState = $state.current.name;\r\n var shouldExpand = false;\r\n\r\n angular.forEach(states, function (state)\r\n {\r\n if ( currentState === state )\r\n {\r\n shouldExpand = true;\r\n }\r\n });\r\n\r\n if ( shouldExpand )\r\n {\r\n expand();\r\n }\r\n else\r\n {\r\n collapse();\r\n }\r\n });\r\n\r\n /**\r\n * Add toggle to the locked list\r\n */\r\n scope.$on('msNav::pushToLockedList', function ()\r\n {\r\n // Set expanded item on main nav controller\r\n MsNavCtrl.setLockedItem(iElement, scope);\r\n });\r\n\r\n /*---------------------*/\r\n /* Internal functions */\r\n /*---------------------*/\r\n\r\n /**\r\n * Is element collapsed\r\n *\r\n * @returns {bool}\r\n */\r\n function isCollapsed()\r\n {\r\n return iElement.attr('collapsed') === 'true';\r\n }\r\n\r\n /**\r\n * Is element expanded\r\n *\r\n * @returns {bool}\r\n */\r\n function isExpanded()\r\n {\r\n return !isCollapsed();\r\n }\r\n\r\n /**\r\n * Expand the toggle\r\n *\r\n * @returns $promise\r\n */\r\n function expand()\r\n {\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // If the menu item is already expanded, do nothing..\r\n if ( isExpanded() )\r\n {\r\n // Reject the deferred object\r\n deferred.reject({'error': true});\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n // Set element attr\r\n iElement.attr('collapsed', false);\r\n\r\n // Grab the element to expand\r\n var elementToExpand = angular.element(iElement.find('ms-nav-toggle-items')[0]);\r\n\r\n // Move the element out of the dom flow and\r\n // make it block so we can get its height\r\n elementToExpand.css({\r\n 'position' : 'absolute',\r\n 'visibility': 'hidden',\r\n 'display' : 'block',\r\n 'height' : 'auto'\r\n });\r\n\r\n // Grab the height\r\n var height = elementToExpand[0].offsetHeight;\r\n\r\n // Reset the style modifications\r\n elementToExpand.css({\r\n 'position' : '',\r\n 'visibility': '',\r\n 'display' : '',\r\n 'height' : ''\r\n });\r\n\r\n // Animate the height\r\n scope.$evalAsync(function ()\r\n {\r\n $animate.animate(elementToExpand,\r\n {\r\n 'display': 'block',\r\n 'height' : '0px'\r\n },\r\n {\r\n 'height': height + 'px'\r\n },\r\n classes.expandAnimation\r\n ).then(\r\n function ()\r\n {\r\n // Add expanded class\r\n elementToExpand.addClass(classes.expanded);\r\n\r\n // Clear the inline styles after animation done\r\n elementToExpand.css({'height': ''});\r\n\r\n // Resolve the deferred object\r\n deferred.resolve({'success': true});\r\n }\r\n );\r\n });\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Collapse the toggle\r\n *\r\n * @returns $promise\r\n */\r\n function collapse()\r\n {\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // If the menu item is already collapsed, do nothing..\r\n if ( isCollapsed() )\r\n {\r\n // Reject the deferred object\r\n deferred.reject({'error': true});\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n // Set element attr\r\n iElement.attr('collapsed', true);\r\n\r\n // Grab the element to collapse\r\n var elementToCollapse = angular.element(iElement.find('ms-nav-toggle-items')[0]);\r\n\r\n // Grab the height\r\n var height = elementToCollapse[0].offsetHeight;\r\n\r\n // Animate the height\r\n scope.$evalAsync(function ()\r\n {\r\n $animate.animate(elementToCollapse,\r\n {\r\n 'height': height + 'px'\r\n },\r\n {\r\n 'height': '0px'\r\n },\r\n classes.collapseAnimation\r\n ).then(\r\n function ()\r\n {\r\n // Remove expanded class\r\n elementToCollapse.removeClass(classes.expanded);\r\n\r\n // Clear the inline styles after animation done\r\n elementToCollapse.css({\r\n 'display': '',\r\n 'height' : ''\r\n });\r\n\r\n // Resolve the deferred object\r\n deferred.resolve({'success': true});\r\n }\r\n );\r\n });\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsFormWizardController', MsFormWizardController)\r\n .directive('msFormWizard', msFormWizardDirective)\r\n .directive('msFormWizardForm', msFormWizardFormDirective);\r\n\r\n /** @ngInject */\r\n function MsFormWizardController()\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.forms = [];\r\n vm.selectedIndex = 0;\r\n\r\n // Methods\r\n vm.registerForm = registerForm;\r\n\r\n vm.previousStep = previousStep;\r\n vm.nextStep = nextStep;\r\n vm.firstStep = firstStep;\r\n vm.lastStep = lastStep;\r\n\r\n vm.totalSteps = totalSteps;\r\n vm.isFirstStep = isFirstStep;\r\n vm.isLastStep = isLastStep;\r\n\r\n vm.currentStepInvalid = currentStepInvalid;\r\n vm.previousStepInvalid = previousStepInvalid;\r\n vm.formsIncomplete = formsIncomplete;\r\n vm.resetForm = resetForm;\r\n\r\n //////////\r\n\r\n /**\r\n * Register form\r\n *\r\n * @param form\r\n */\r\n function registerForm(form)\r\n {\r\n vm.forms.push(form);\r\n }\r\n\r\n /**\r\n * Go to previous step\r\n */\r\n function previousStep()\r\n {\r\n if ( isFirstStep() )\r\n {\r\n return;\r\n }\r\n\r\n vm.selectedIndex--;\r\n }\r\n\r\n /**\r\n * Go to next step\r\n */\r\n function nextStep()\r\n {\r\n if ( isLastStep() )\r\n {\r\n return;\r\n }\r\n\r\n vm.selectedIndex++;\r\n }\r\n\r\n /**\r\n * Go to first step\r\n */\r\n function firstStep()\r\n {\r\n vm.selectedIndex = 0;\r\n }\r\n\r\n /**\r\n * Go to last step\r\n */\r\n function lastStep()\r\n {\r\n vm.selectedIndex = totalSteps() - 1;\r\n }\r\n\r\n /**\r\n * Return total steps\r\n *\r\n * @returns {int}\r\n */\r\n function totalSteps()\r\n {\r\n return vm.forms.length;\r\n }\r\n\r\n /**\r\n * Is first step?\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFirstStep()\r\n {\r\n return vm.selectedIndex === 0;\r\n }\r\n\r\n /**\r\n * Is last step?\r\n *\r\n * @returns {boolean}\r\n */\r\n function isLastStep()\r\n {\r\n return vm.selectedIndex === totalSteps() - 1;\r\n }\r\n\r\n /**\r\n * Is current step invalid?\r\n *\r\n * @returns {boolean}\r\n */\r\n function currentStepInvalid()\r\n {\r\n return angular.isDefined(vm.forms[vm.selectedIndex]) && vm.forms[vm.selectedIndex].$invalid;\r\n }\r\n\r\n /**\r\n * Is previous step invalid?\r\n *\r\n * @returns {boolean}\r\n */\r\n function previousStepInvalid()\r\n {\r\n return vm.selectedIndex > 0 && angular.isDefined(vm.forms[vm.selectedIndex - 1]) && vm.forms[vm.selectedIndex - 1].$invalid;\r\n }\r\n\r\n /**\r\n * Check if there is any incomplete forms\r\n *\r\n * @returns {boolean}\r\n */\r\n function formsIncomplete()\r\n {\r\n for ( var x = 0; x < vm.forms.length; x++ )\r\n {\r\n if ( vm.forms[x].$invalid )\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Reset form\r\n */\r\n function resetForm()\r\n {\r\n // Go back to the first step\r\n vm.selectedIndex = 0;\r\n\r\n // Make sure all the forms are back in the $pristine & $untouched status\r\n for ( var x = 0; x < vm.forms.length; x++ )\r\n {\r\n vm.forms[x].$setPristine();\r\n vm.forms[x].$setUntouched();\r\n }\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msFormWizardDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : true,\r\n controller: 'MsFormWizardController as msWizard',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-form-wizard');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n }\r\n\r\n }\r\n\r\n /** @ngInject */\r\n function msFormWizardFormDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : ['form', '^msFormWizard'],\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-form-wizard-form');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var formCtrl = ctrls[0],\r\n MsFormWizardCtrl = ctrls[1];\r\n\r\n MsFormWizardCtrl.registerForm(formCtrl);\r\n }\r\n }\r\n }\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msDatepickerFixConfig', msDatepickerFixConfigProvider)\r\n .directive('msDatepickerFix', msDatepickerFix);\r\n\r\n /** @ngInject */\r\n function msDatepickerFixConfigProvider()\r\n {\r\n\r\n // Default configuration\r\n var defaultConfiguration = {\r\n // To view\r\n formatter: function (val)\r\n {\r\n if ( !val )\r\n {\r\n return '';\r\n }\r\n\r\n return val === '' ? val : new Date(val);\r\n },\r\n // To model\r\n parser : function (val)\r\n {\r\n if ( !val )\r\n {\r\n return '';\r\n }\r\n var offset = moment(val).utcOffset();\r\n var date = new Date(moment(val).add(offset, 'm'));\r\n return date;\r\n }\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n defaultConfiguration = angular.extend({}, defaultConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n return defaultConfiguration;\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msDatepickerFix(msDatepickerFixConfig)\r\n {\r\n return {\r\n require: 'ngModel',\r\n link : function (scope, elem, attrs, ngModel)\r\n {\r\n ngModel.$formatters.unshift(msDatepickerFixConfig.formatter); // to view\r\n ngModel.$parsers.unshift(msDatepickerFixConfig.parser); // to model\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n /* Directive Used to control the flip animation function */\r\n angular\r\n .module('app.core')\r\n .directive(\"flipper\", function () {\r\n return {\r\n restrict: \"E\",\r\n template: \"
\",\r\n transclude: true,\r\n scope: {\r\n flipped: \"=\"\r\n }\r\n };\r\n })\r\n .directive(\"front\", function () {\r\n return {\r\n restrict: \"E\",\r\n template: \"
\",\r\n transclude: true\r\n };\r\n })\r\n .directive(\"back\", ['$window', '$compile', function ($window, $compile) {\r\n return {\r\n restrict: \"E\",\r\n template: \"
\",\r\n transclude: true,\r\n controller: function ($window) {\r\n\r\n var userAgent = $window.navigator.userAgent;\r\n\r\n var browsers = { chrome: /chrome/i, safari: /safari/i, firefox: /firefox/i };\r\n var keyAccepted = 'unknown';\r\n\r\n for (var key in browsers) {\r\n if (browsers[key].test(userAgent)) {\r\n keyAccepted = key;\r\n break;\r\n }\r\n };\r\n\r\n if (keyAccepted == \"unknown\") {\r\n this.dynamicClass = \"back_IE tile\";\r\n } else {\r\n this.dynamicClass = \"back tile\";\r\n }\r\n\r\n },\r\n controllerAs: \"backController\"\r\n }\r\n }]);\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msCard', msCardDirective);\r\n\r\n /** @ngInject */\r\n function msCardDirective()\r\n {\r\n return {\r\n restrict: 'E',\r\n scope : {\r\n templatePath: '=template',\r\n card : '=ngModel',\r\n vm : '=viewModel'\r\n },\r\n template: '
',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-card');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n // Methods\r\n scope.cardTemplateLoaded = cardTemplateLoaded;\r\n\r\n //////////\r\n\r\n /**\r\n * Emit cardTemplateLoaded event\r\n */\r\n function cardTemplateLoaded()\r\n {\r\n scope.$emit('msCard::cardTemplateLoaded', iElement);\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular.module('aa.formExtensions')\r\n .directive('aaUiListBox', ['$compile', aaUiSelect2])\r\n .filter('startsWith', function() {\r\n return function(array,search) {\r\n //if(!_.isUndefined(array) && !_.isUndefined(search)) {\r\n var matches = [];\r\n for (var i = 0; i < array.length; i++) {\r\n if (array[i].Name.toUpperCase().indexOf(search.toUpperCase()) === 0 &&\r\n search.length <= array[i].Name.length) {\r\n matches.push(array[i]);\r\n }\r\n }\r\n return matches;\r\n //}\r\n };\r\n });\r\n\r\n function startsWith(actual, expected) {\r\n alert();\r\n var lowerStr = (actual + \"\").toLowerCase();\r\n return lowerStr.indexOf(expected.toLowerCase()) === 0;\r\n }\r\n\r\n /** Private directive that represents a list of months inside the calendar. */\r\n function aaUiSelect2($compile) {\r\n return {\r\n restrict: 'A',\r\n replace: true,\r\n scope: true,\r\n template: '
',\r\n \r\n //controller: CalendarMonthCtrl,\r\n //controllerAs: 'monthCtrl',\r\n //bindToController: true,\r\n link: function (scope, element, attrs, controllers) {\r\n // append the collection directive to this element\r\n attrs.aaUiListBox = attrs.aaUiListBox.replaceAll(\"\\\"\", \"\").replaceAll(\"'\", \"\\\"\");\r\n var listFunction = attrs.ngModel.split(\".\")[0];\r\n var options = JSON.parse(attrs.aaUiListBox);\r\n var required = '>';\r\n //var required = (attrs.required) ? ' required=\"required\" required-msg=\"' + attrs.requiredMsg + '\">' : '>';\r\n //element.append(\r\n //'{{$select.selected.' + options.text + '}}' +\r\n // '' +\r\n // '
' +\r\n // //'
' +\r\n // '
' +\r\n //'
');\r\n element.append(\r\n '{{$select.selected.' + options.text + '}}' +\r\n '{{$select.selected.' + options.text + '}}' +\r\n '' +\r\n '
' +\r\n //'
' +\r\n '
' +\r\n '
');\r\n\r\n element.removeAttr('ng-model');\r\n element.removeAttr('required');\r\n element.removeAttr('required-msg');\r\n element.removeAttr('aa-ui-list-box');\r\n element.removeAttr('ng-disabled');\r\n element.removeAttr('name');\r\n element.removeAttr('aa-label');\r\n element.removeAttr('aa-val-msg');\r\n element.removeAttr('class');\r\n element.removeAttr('type');\r\n element.removeAttr('id');\r\n \r\n // we need to tell angular to render the directive\r\n $compile(element.contents())(scope);\r\n }\r\n };\r\n }\r\n\r\n})();\r\n\r\n\r\nString.prototype.replaceAll = function (search, replacement) {\r\n var target = this;\r\n return target.split(search).join(replacement);\r\n};\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('cryptoField', ['$compile', 'commonService', '$parse', cryptoFieldDirective]);\r\n\r\n /** @ngInject */\r\n function cryptoFieldDirective($compile, commonService, $parse) {\r\n return {\r\n priority: 1,\r\n require: '^ngModel',\r\n restrict: 'A',\r\n scope: true,\r\n compile: function (tElem, tAttrs) {\r\n return {\r\n post: function (scope, element, attrs, controllers) {\r\n //console.log(': pre link');\r\n var __element = element;\r\n var maskedValue = $parse(attrs.maskedValue);\r\n var inputType = attrs.type;\r\n var inputName = attrs.name;\r\n\r\n scope.$$parent = {};\r\n scope.$$parent.ClearValue = \"\";\r\n attrs.cryptoField = attrs.cryptoField.split(\" \").join(\"\");\r\n attrs.cryptoField = attrs.cryptoField.split(\"'\").join(\"\");\r\n attrs.cryptoField = attrs.cryptoField.split(\"{\").join(\"\");\r\n attrs.cryptoField = attrs.cryptoField.split(\"}\").join(\"\");\r\n scope.$$parent.field = attrs.cryptoField;\r\n scope.$$parent.isValid = false;\r\n\r\n\r\n String.prototype.toMask = function (number) {\r\n if (!number)\r\n number = parseInt(\"-16\");\r\n else \r\n number = parseInt(\"-\" + number);\r\n\r\n return String(\"************************\" + this.substr(this.length - 4)).slice(number);\r\n };\r\n\r\n var fieldKey = scope.$$parent.field.split(\",\")[0].split(\":\")[1];\r\n var fieldIv = scope.$$parent.field.split(\",\")[1].split(\":\")[1];\r\n\r\n controllers.$formatters.push(function (value) {\r\n var decrypted;\r\n\r\n if (value != undefined) {\r\n\r\n var encrypted = value.split(\"-\")[1];\r\n scope.$$parent.ClearValue = commonService.Decrypt(encrypted, fieldKey, fieldIv);\r\n\r\n if (maskedValue != undefined && maskedValue.assign != undefined) {\r\n if (inputType != \"password\" && inputName != \"emailE\" && inputName != \"usernameE\" && inputName != \"emailConfirm\") {\r\n maskedValue.assign(scope.$parent, scope.$$parent.ClearValue.toMask());\r\n }\r\n }\r\n\r\n\r\n decrypted = scope.$$parent.ClearValue;\r\n }\r\n\r\n return decrypted;\r\n });\r\n\r\n controllers.$parsers.push(function (value) {\r\n \r\n var encrypted = \"\";\r\n scope.$$parent.isValid = true;\r\n scope.$$parent.ClearValue = value;\r\n\r\n if (maskedValue != undefined && maskedValue.assign != undefined) {\r\n if (inputType != \"password\" && inputName != \"emailE\" && inputName != \"usernameE\" && inputName != \"emailConfirm\") {\r\n maskedValue.assign(scope.$parent, scope.$$parent.ClearValue.toMask());\r\n }\r\n }\r\n\r\n if (inputType != \"password\" && inputName != \"emailE\" && inputName != \"usernameE\" && inputName != \"emailConfirm\") {\r\n encrypted = \"*-\" + commonService.Encrypt(value.replace(/\\D/g, ''), fieldKey, fieldIv);\r\n }\r\n else {\r\n encrypted = \"*-\" + commonService.Encrypt(value, fieldKey, fieldIv);\r\n }\r\n\r\n return encrypted;\r\n });\r\n\r\n element.removeAttr('crypto-field');\r\n\r\n element.bind(\"focus\", function (ele) {\r\n if (!controllers.$dirty) {\r\n scope.$$parent.isValid = true;\r\n }\r\n ele.currentTarget.value = scope.$$parent.ClearValue;\r\n });\r\n\r\n element.bind(\"blur\", function (ele) {\r\n if (ele.currentTarget.value != \"\" && scope.$$parent.isValid) {\r\n if (inputType != \"password\" && inputName != \"emailE\" && inputName != \"usernameE\" && inputName != \"emailConfirm\") {\r\n ele.currentTarget.value = scope.$$parent.ClearValue.toMask();\r\n }\r\n }\r\n });\r\n\r\n\r\n element.bind(\"cut copy paste\", function (ele) {\r\n ele.preventDefault();\r\n });\r\n\r\n },\r\n pre: function (scope, element, attrs, controllers) {\r\n\r\n controllers.$formatters.push(function (value) {\r\n var returnValue;\r\n\r\n if (value != undefined)\r\n returnValue = value.toMask(5);\r\n\r\n return returnValue;\r\n });\r\n\r\n controllers.$parsers.push(function (value) {\r\n \r\n if (controllers.$dirty) {\r\n scope.$$parent.ClearValue = value;\r\n scope.$$parent.isValid = false;\r\n }\r\n\r\n return value;\r\n });\r\n }\r\n }\r\n }\r\n\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsThemeOptionsController', MsThemeOptionsController)\r\n .directive('msThemeOptions', msThemeOptions);\r\n\r\n /** @ngInject */\r\n function MsThemeOptionsController($cookies, fuseTheming)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.themes = fuseTheming.themes;\r\n vm.layoutMode = 'wide';\r\n vm.layoutStyle = $cookies.get('layoutStyle') || 'verticalNavigation';\r\n\r\n // Methods\r\n vm.setActiveTheme = setActiveTheme;\r\n vm.updateLayoutMode = updateLayoutMode;\r\n vm.updateLayoutStyle = updateLayoutStyle;\r\n\r\n //////////\r\n\r\n /**\r\n * Set active theme\r\n *\r\n * @param themeName\r\n */\r\n function setActiveTheme(themeName)\r\n {\r\n // Set active theme\r\n fuseTheming.setActiveTheme(themeName);\r\n }\r\n\r\n /**\r\n * Update layout mode\r\n */\r\n function updateLayoutMode()\r\n {\r\n var bodyEl = angular.element('body');\r\n\r\n // Update class on body element\r\n bodyEl.toggleClass('boxed', (vm.layoutMode === 'boxed'));\r\n }\r\n\r\n /**\r\n * Update layout style\r\n */\r\n function updateLayoutStyle()\r\n {\r\n // Update the cookie\r\n $cookies.put('layoutStyle', vm.layoutStyle);\r\n\r\n // Reload the page to apply the changes\r\n location.reload();\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msThemeOptions()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n panelOpen: '=?'\r\n },\r\n controller : 'MsThemeOptionsController as vm',\r\n templateUrl: 'app/core/theme-options/theme-options.html',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-theme-options');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n var bodyEl = angular.element('body'),\r\n backdropEl = angular.element('
');\r\n\r\n // Panel open status\r\n scope.panelOpen = scope.panelOpen || false;\r\n\r\n /**\r\n * Toggle options panel\r\n */\r\n function toggleOptionsPanel()\r\n {\r\n if ( scope.panelOpen )\r\n {\r\n closeOptionsPanel();\r\n }\r\n else\r\n {\r\n openOptionsPanel();\r\n }\r\n }\r\n\r\n function openOptionsPanel()\r\n {\r\n // Set panelOpen status\r\n scope.panelOpen = true;\r\n\r\n // Add open class\r\n iElement.addClass('open');\r\n\r\n // Append the backdrop\r\n bodyEl.append(backdropEl);\r\n\r\n // Register the event\r\n backdropEl.on('click touch', closeOptionsPanel);\r\n }\r\n\r\n /**\r\n * Close options panel\r\n */\r\n function closeOptionsPanel()\r\n {\r\n // Set panelOpen status\r\n scope.panelOpen = false;\r\n\r\n // Remove open class\r\n iElement.removeClass('open');\r\n\r\n // De-register the event\r\n backdropEl.off('click touch', closeOptionsPanel);\r\n\r\n // Remove the backdrop\r\n backdropEl.remove();\r\n }\r\n\r\n // Expose the toggle function\r\n scope.toggleOptionsPanel = toggleOptionsPanel;\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('fuseTheming', fuseThemingProvider);\r\n\r\n /** @ngInject */\r\n function fuseThemingProvider()\r\n {\r\n // Inject Cookies Service\r\n var $cookies;\r\n\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // Inject $log service\r\n var $log = angular.injector(['ng']).get('$log');\r\n\r\n var registeredPalettes,\r\n registeredThemes;\r\n\r\n // Methods\r\n this.setRegisteredPalettes = setRegisteredPalettes;\r\n this.setRegisteredThemes = setRegisteredThemes;\r\n\r\n //////////\r\n\r\n /**\r\n * Set registered palettes\r\n *\r\n * @param _registeredPalettes\r\n */\r\n function setRegisteredPalettes(_registeredPalettes)\r\n {\r\n registeredPalettes = _registeredPalettes;\r\n }\r\n\r\n /**\r\n * Set registered themes\r\n *\r\n * @param _registeredThemes\r\n */\r\n function setRegisteredThemes(_registeredThemes)\r\n {\r\n registeredThemes = _registeredThemes;\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getRegisteredPalettes: getRegisteredPalettes,\r\n getRegisteredThemes : getRegisteredThemes,\r\n setActiveTheme : setActiveTheme,\r\n setThemesList : setThemesList,\r\n themes : {\r\n list : {},\r\n active: {\r\n 'name' : '',\r\n 'theme': {}\r\n }\r\n }\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Get registered palettes\r\n *\r\n * @returns {*}\r\n */\r\n function getRegisteredPalettes()\r\n {\r\n return registeredPalettes;\r\n }\r\n\r\n /**\r\n * Get registered themes\r\n *\r\n * @returns {*}\r\n */\r\n function getRegisteredThemes()\r\n {\r\n return registeredThemes;\r\n }\r\n\r\n /**\r\n * Set active theme\r\n *\r\n * @param themeName\r\n */\r\n function setActiveTheme(themeName)\r\n {\r\n // If theme does not exist, fallback to the default theme\r\n if ( angular.isUndefined(service.themes.list[themeName]) )\r\n {\r\n // If there is no theme called \"default\"...\r\n if ( angular.isUndefined(service.themes.list.default) )\r\n {\r\n $log.error('You must have at least one theme named \"default\"');\r\n return;\r\n }\r\n\r\n $log.warn('The theme \"' + themeName + '\" does not exist! Falling back to the \"default\" theme.');\r\n\r\n // Otherwise set theme to default theme\r\n service.themes.active.name = 'default';\r\n service.themes.active.theme = service.themes.list.default;\r\n $cookies.put('selectedTheme', service.themes.active.name);\r\n\r\n return;\r\n }\r\n\r\n service.themes.active.name = themeName;\r\n service.themes.active.theme = service.themes.list[themeName];\r\n $cookies.put('selectedTheme', themeName);\r\n }\r\n\r\n /**\r\n * Set available themes list\r\n *\r\n * @param themeList\r\n */\r\n function setThemesList(themeList)\r\n {\r\n service.themes.list = themeList;\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($mdThemingProvider, fusePalettes, fuseThemes, fuseThemingProvider)\r\n {\r\n // Inject Cookies Service\r\n var $cookies;\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // Check if custom theme exist in cookies\r\n var customTheme = $cookies.getObject('customTheme');\r\n if ( customTheme )\r\n {\r\n fuseThemes['custom'] = customTheme;\r\n }\r\n\r\n $mdThemingProvider.alwaysWatchTheme(true);\r\n\r\n // Define custom palettes\r\n angular.forEach(fusePalettes, function (palette)\r\n {\r\n $mdThemingProvider.definePalette(palette.name, palette.options);\r\n });\r\n\r\n // Register custom themes\r\n angular.forEach(fuseThemes, function (theme, themeName)\r\n {\r\n $mdThemingProvider.theme(themeName)\r\n .primaryPalette(theme.primary.name, theme.primary.hues)\r\n .accentPalette(theme.accent.name, theme.accent.hues)\r\n .warnPalette(theme.warn.name, theme.warn.hues)\r\n .backgroundPalette(theme.background.name, theme.background.hues);\r\n });\r\n\r\n // Store generated PALETTES and THEMES objects from $mdThemingProvider\r\n // in our custom provider, so we can inject them into other areas\r\n fuseThemingProvider.setRegisteredPalettes($mdThemingProvider._PALETTES);\r\n fuseThemingProvider.setRegisteredThemes($mdThemingProvider._THEMES);\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n var fuseThemes = {\r\n 'default' : {\r\n primary : {\r\n name: 'fuse-pale-blue',\r\n hues: {\r\n 'default': '700',\r\n 'hue-1' : '500',\r\n 'hue-2' : '600',\r\n 'hue-3' : '400'\r\n }\r\n },\r\n accent : {\r\n name: 'light-blue',\r\n hues: {\r\n 'default': '600',\r\n 'hue-1' : '400',\r\n 'hue-2' : '700',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {name: 'red'},\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : '100',\r\n 'hue-2' : '50',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n },\r\n 'pink': {\r\n primary : {\r\n name: 'blue-grey',\r\n hues: {\r\n 'default': '800',\r\n 'hue-1' : '600',\r\n 'hue-2' : '400',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n accent : {\r\n name: 'pink',\r\n hues: {\r\n 'default': '400',\r\n 'hue-1' : '300',\r\n 'hue-2' : '600',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {name: 'blue'},\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : '100',\r\n 'hue-2' : '50',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n },\r\n 'teal' : {\r\n primary : {\r\n name: 'fuse-blue',\r\n hues: {\r\n 'default': '900',\r\n 'hue-1' : '600',\r\n 'hue-2' : '500',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n accent : {\r\n name: 'teal',\r\n hues: {\r\n 'default': '500',\r\n 'hue-1' : '400',\r\n 'hue-2' : '600',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {name: 'deep-orange'},\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : '100',\r\n 'hue-2' : '50',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n }\r\n };\r\n\r\n angular\r\n .module('app.core')\r\n .constant('fuseThemes', fuseThemes);\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n var fusePalettes = [\r\n {\r\n name: 'fuse-blue',\r\n options: {\r\n '50': '#ebf1fa',\r\n '100': '#c2d4ef',\r\n '200': '#9ab8e5',\r\n '300': '#78a0dc',\r\n '400': '#5688d3',\r\n '500': '#3470ca',\r\n '600': '#2e62b1',\r\n '700': '#275498',\r\n '800': '#21467e',\r\n '900': '#1a3865',\r\n 'A100': '#c2d4ef',\r\n 'A200': '#9ab8e5',\r\n 'A400': '#5688d3',\r\n 'A700': '#275498',\r\n 'contrastDefaultColor': 'light',\r\n 'contrastDarkColors': '50 100 200 A100',\r\n 'contrastStrongLightColors': '300 400'\r\n }\r\n },\r\n {\r\n name: 'fuse-pale-blue',\r\n options: {\r\n '50': '#ececee',\r\n '100': '#c5c6cb',\r\n '200': '#9ea1a9',\r\n '300': '#7d818c',\r\n '400': '#5c616f',\r\n '500': '#3c4252',\r\n '600': '#353a48',\r\n '700': '#2d323e',\r\n '800': '#262933',\r\n '900': '#1e2129',\r\n 'A100': '#c5c6cb',\r\n 'A200': '#9ea1a9',\r\n 'A400': '#5c616f',\r\n 'A700': '#2d323e',\r\n 'contrastDefaultColor': 'light',\r\n 'contrastDarkColors': '50 100 200 A100',\r\n 'contrastStrongLightColors': '300 400'\r\n }\r\n }\r\n ];\r\n\r\n angular\r\n .module('app.core')\r\n .constant('fusePalettes', fusePalettes);\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('fuseGenerator', fuseGeneratorService);\r\n\r\n /** @ngInject */\r\n function fuseGeneratorService($cookies, $log, fuseTheming)\r\n {\r\n // Storage for simplified themes object\r\n var themes = {};\r\n\r\n var service = {\r\n generate: generate,\r\n rgba : rgba\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Generate less variables for each theme from theme's\r\n * palette by using material color naming conventions\r\n */\r\n function generate()\r\n {\r\n var registeredThemes = fuseTheming.getRegisteredThemes();\r\n var registeredPalettes = fuseTheming.getRegisteredPalettes();\r\n\r\n // First, create a simplified object that stores\r\n // all registered themes and their colors\r\n\r\n // Iterate through registered themes\r\n angular.forEach(registeredThemes, function (registeredTheme)\r\n {\r\n themes[registeredTheme.name] = {};\r\n\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(registeredTheme.colors, function (colorType, colorTypeName)\r\n {\r\n themes[registeredTheme.name][colorTypeName] = {\r\n 'name' : colorType.name,\r\n 'levels': {\r\n 'default': {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues.default].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 4)\r\n },\r\n 'hue1' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 4)\r\n },\r\n 'hue2' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 4)\r\n },\r\n 'hue3' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 4)\r\n }\r\n }\r\n };\r\n });\r\n });\r\n\r\n // Process themes one more time and then store them in the service for external use\r\n processAndStoreThemes(themes);\r\n\r\n // Iterate through simplified themes\r\n // object and create style variables\r\n var styleVars = {};\r\n\r\n // Iterate through registered themes\r\n angular.forEach(themes, function (theme, themeName)\r\n {\r\n styleVars = {};\r\n styleVars['@themeName'] = themeName;\r\n\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(theme, function (colorTypes, colorTypeName)\r\n {\r\n // Iterate through color levels (default, hue1, hue2 & hue3)\r\n angular.forEach(colorTypes.levels, function (colors, colorLevelName)\r\n {\r\n // Iterate through color name (color, contrast1, contrast2, contrast3 & contrast4)\r\n angular.forEach(colors, function (color, colorName)\r\n {\r\n styleVars['@' + colorTypeName + ucfirst(colorLevelName) + ucfirst(colorName)] = color;\r\n });\r\n });\r\n });\r\n\r\n // Render styles\r\n render(styleVars);\r\n });\r\n }\r\n\r\n // ---------------------------\r\n // INTERNAL HELPER FUNCTIONS\r\n // ---------------------------\r\n\r\n /**\r\n * Process and store themes for global use\r\n *\r\n * @param _themes\r\n */\r\n function processAndStoreThemes(_themes)\r\n {\r\n // Here we will go through every registered theme one more time\r\n // and try to simplify their objects as much as possible for\r\n // easier access to their properties.\r\n var themes = angular.copy(_themes);\r\n\r\n // Iterate through themes\r\n angular.forEach(themes, function (theme)\r\n {\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(theme, function (colorType, colorTypeName)\r\n {\r\n theme[colorTypeName] = colorType.levels;\r\n theme[colorTypeName].color = colorType.levels.default.color;\r\n theme[colorTypeName].contrast1 = colorType.levels.default.contrast1;\r\n theme[colorTypeName].contrast2 = colorType.levels.default.contrast2;\r\n theme[colorTypeName].contrast3 = colorType.levels.default.contrast3;\r\n theme[colorTypeName].contrast4 = colorType.levels.default.contrast4;\r\n delete theme[colorTypeName].default;\r\n });\r\n });\r\n\r\n // Store themes and set selected theme for the first time\r\n fuseTheming.setThemesList(themes);\r\n\r\n // Remember selected theme.\r\n var selectedTheme = $cookies.get('selectedTheme');\r\n\r\n if ( selectedTheme )\r\n {\r\n fuseTheming.setActiveTheme(selectedTheme);\r\n }\r\n else\r\n {\r\n fuseTheming.setActiveTheme('default');\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Render css files\r\n *\r\n * @param styleVars\r\n */\r\n function render(styleVars)\r\n {\r\n var cssTemplate = '[md-theme=\"@themeName\"] a {\\n color: @accentDefaultColor;\\n}\\n\\n[md-theme=\"@themeName\"] .secondary-text,\\n[md-theme=\"@themeName\"] .icon {\\n color: @backgroundDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .hint-text,\\n[md-theme=\"@themeName\"] .disabled-text {\\n color: @backgroundDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .fade-text,\\n[md-theme=\"@themeName\"] .divider {\\n color: @backgroundDefaultContrast4;\\n}\\n\\n/* Primary */\\n[md-theme=\"@themeName\"] .md-primary-bg {\\n background-color: @primaryDefaultColor;\\n color: @primaryDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .icon {\\n color: @primaryDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .disabled-text {\\n color: @primaryDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .divider {\\n color: @primaryDefaultContrast4;\\n}\\n\\n/* Primary, Hue-1 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 {\\n background-color: @primaryHue1Color;\\n color: @primaryHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .icon {\\n color: @primaryHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .disabled-text {\\n color: @primaryHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .divider {\\n color: @primaryHue1Contrast4;\\n}\\n\\n/* Primary, Hue-2 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 {\\n background-color: @primaryHue2Color;\\n color: @primaryHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .icon {\\n color: @primaryHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .disabled-text {\\n color: @primaryHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .divider {\\n color: @primaryHue2Contrast4;\\n}\\n\\n/* Primary, Hue-3 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 {\\n background-color: @primaryHue3Color;\\n color: @primaryHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .icon {\\n color: @primaryHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .disabled-text {\\n color: @primaryHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .divider {\\n color: @primaryHue3Contrast4;\\n}\\n\\n/* Primary foreground */\\n[md-theme=\"@themeName\"] .md-primary-fg {\\n color: @primaryDefaultColor !important;\\n}\\n\\n/* Primary foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-1 {\\n color: @primaryHue1Color !important;\\n}\\n\\n/* Primary foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-2 {\\n color: @primaryHue2Color !important;\\n}\\n\\n/* Primary foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-3 {\\n color: @primaryHue3Color !important;\\n}\\n\\n\\n/* Accent */\\n[md-theme=\"@themeName\"] .md-accent-bg {\\n background-color: @accentDefaultColor;\\n color: @accentDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .icon {\\n color: @accentDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .disabled-text {\\n color: @accentDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .divider {\\n color: @accentDefaultContrast4;\\n}\\n\\n/* Accent, Hue-1 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 {\\n background-color: @accentHue1Color;\\n color: @accentHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .icon {\\n color: @accentHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .disabled-text {\\n color: @accentHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .divider {\\n color: @accentHue1Contrast4;\\n}\\n\\n/* Accent, Hue-2 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 {\\n background-color: @accentHue2Color;\\n color: @accentHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .icon {\\n color: @accentHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .disabled-text {\\n color: @accentHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .divider {\\n color: @accentHue2Contrast4;\\n}\\n\\n/* Accent, Hue-3 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 {\\n background-color: @accentHue3Color;\\n color: @accentHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .icon {\\n color: @accentHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .disabled-text {\\n color: @accentHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .divider {\\n color: @accentHue3Contrast4;\\n}\\n\\n/* Accent foreground */\\n[md-theme=\"@themeName\"] .md-accent-fg {\\n color: @accentDefaultColor !important;\\n}\\n\\n/* Accent foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-1 {\\n color: @accentHue1Color !important;\\n}\\n\\n/* Accent foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-2 {\\n color: @accentHue2Color !important;\\n}\\n\\n/* Accent foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-3 {\\n color: @accentHue3Color !important;\\n}\\n\\n\\n/* Warn */\\n[md-theme=\"@themeName\"] .md-warn-bg {\\n background-color: @warnDefaultColor;\\n color: @warnDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .icon {\\n color: @warnDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .disabled-text {\\n color: @warnDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .divider {\\n color: @warnDefaultContrast4;\\n}\\n\\n/* Warn, Hue-1 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 {\\n background-color: @warnHue1Color;\\n color: @warnHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .icon {\\n color: @warnHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .disabled-text {\\n color: @warnHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .divider {\\n color: @warnHue1Contrast4;\\n}\\n\\n/* Warn, Hue-2 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 {\\n background-color: @warnHue2Color;\\n color: @warnHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .icon {\\n color: @warnHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .disabled-text {\\n color: @warnHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .divider {\\n color: @warnHue2Contrast4;\\n}\\n\\n/* Warn, Hue-3 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 {\\n background-color: @warnHue3Color;\\n color: @warnHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .icon {\\n color: @warnHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .disabled-text {\\n color: @warnHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .divider {\\n color: @warnHue3Contrast4;\\n}\\n\\n/* Warn foreground */\\n[md-theme=\"@themeName\"] .md-warn-fg {\\n color: @warnDefaultColor !important;\\n}\\n\\n/* Warn foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-1 {\\n color: @warnHue1Color !important;\\n}\\n\\n/* Warn foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-2 {\\n color: @warnHue2Color !important;\\n}\\n\\n/* Warn foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-3 {\\n color: @warnHue3Color !important;\\n}\\n\\n/* Background */\\n[md-theme=\"@themeName\"] .md-background-bg {\\n background-color: @backgroundDefaultColor;\\n color: @backgroundDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg .icon {\\n color: @backgroundDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg .disabled-text {\\n color: @backgroundDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg .divider {\\n color: @backgroundDefaultContrast4;\\n}\\n\\n/* Background, Hue-1 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 {\\n background-color: @backgroundHue1Color;\\n color: @backgroundHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .icon {\\n color: @backgroundHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .disabled-text {\\n color: @backgroundHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .divider {\\n color: @backgroundHue1Contrast4;\\n}\\n\\n/* Background, Hue-2 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 {\\n background-color: @backgroundHue2Color;\\n color: @backgroundHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .icon {\\n color: @backgroundHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .disabled-text {\\n color: @backgroundHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .divider {\\n color: @backgroundHue2Contrast4;\\n}\\n\\n/* Background, Hue-3 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 {\\n background-color: @backgroundHue3Color;\\n color: @backgroundHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .icon {\\n color: @backgroundHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .disabled-text {\\n color: @backgroundHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .divider {\\n color: @backgroundHue3Contrast4;\\n}\\n\\n/* Background foreground */\\n[md-theme=\"@themeName\"] .md-background-fg {\\n color: @backgroundDefaultColor !important;\\n}\\n\\n/* Background foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-1 {\\n color: @backgroundHue1Color !important;\\n}\\n\\n/* Background foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-2 {\\n color: @backgroundHue2Color !important;\\n}\\n\\n/* Background foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-3 {\\n color: @backgroundHue3Color !important;\\n}';\r\n\r\n var regex = new RegExp(Object.keys(styleVars).join('|'), 'gi');\r\n var css = cssTemplate.replace(regex, function (matched)\r\n {\r\n return styleVars[matched];\r\n });\r\n\r\n var headEl = angular.element('head');\r\n var styleEl = angular.element('');\r\n styleEl.html(css);\r\n headEl.append(styleEl);\r\n }\r\n\r\n /**\r\n * Convert color array to rgb/rgba\r\n * Also apply contrasts if needed\r\n *\r\n * @param color\r\n * @param _contrastLevel\r\n * @returns {string}\r\n */\r\n function rgba(color, _contrastLevel)\r\n {\r\n var contrastLevel = _contrastLevel || false;\r\n\r\n // Convert 255,255,255,0.XX to 255,255,255\r\n // According to Google's Material design specs, white primary\r\n // text must have opacity of 1 and we will fix that here\r\n // because Angular Material doesn't care about that spec\r\n if ( color.length === 4 && color[0] === 255 && color[1] === 255 && color[2] === 255 )\r\n {\r\n color.splice(3, 4);\r\n }\r\n\r\n // If contrast level provided, apply it to the current color\r\n if ( contrastLevel )\r\n {\r\n color = applyContrast(color, contrastLevel);\r\n }\r\n\r\n // Convert color array to color string (rgb/rgba)\r\n if ( color.length === 3 )\r\n {\r\n return 'rgb(' + color.join(',') + ')';\r\n }\r\n else if ( color.length === 4 )\r\n {\r\n return 'rgba(' + color.join(',') + ')';\r\n }\r\n else\r\n {\r\n $log.error('Invalid number of arguments supplied in the color array: ' + color.length + '\\n' + 'The array must have 3 or 4 colors.');\r\n }\r\n }\r\n\r\n /**\r\n * Apply given contrast level to the given color\r\n *\r\n * @param color\r\n * @param contrastLevel\r\n */\r\n function applyContrast(color, contrastLevel)\r\n {\r\n var contrastLevels = {\r\n 'white': {\r\n '1': '1',\r\n '2': '0.7',\r\n '3': '0.3',\r\n '4': '0.12'\r\n },\r\n 'black': {\r\n '1': '0.87',\r\n '2': '0.54',\r\n '3': '0.26',\r\n '4': '0.12'\r\n }\r\n };\r\n\r\n // If white\r\n if ( color[0] === 255 && color[1] === 255 && color[2] === 255 )\r\n {\r\n color[3] = contrastLevels.white[contrastLevel];\r\n }\r\n // If black\r\n else if ( color[0] === 0 && color[1] === 0 && color[2] === 0 )\r\n {\r\n color[3] = contrastLevels.black[contrastLevel];\r\n }\r\n\r\n return color;\r\n }\r\n\r\n /**\r\n * Uppercase first\r\n */\r\n function ucfirst(string)\r\n {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('msUtils', msUtils);\r\n\r\n /** @ngInject */\r\n function msUtils($window)\r\n {\r\n // Private variables\r\n var mobileDetect = new MobileDetect($window.navigator.userAgent),\r\n browserInfo = null;\r\n\r\n var service = {\r\n exists : exists,\r\n detectBrowser: detectBrowser,\r\n guidGenerator: guidGenerator,\r\n isMobile : isMobile,\r\n toggleInArray: toggleInArray\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Check if item exists in a list\r\n *\r\n * @param item\r\n * @param list\r\n * @returns {boolean}\r\n */\r\n function exists(item, list)\r\n {\r\n return list.indexOf(item) > -1;\r\n }\r\n\r\n /**\r\n * Returns browser information\r\n * from user agent data\r\n *\r\n * Found at http://www.quirksmode.org/js/detect.html\r\n * but modified and updated to fit for our needs\r\n */\r\n function detectBrowser()\r\n {\r\n // If we already tested, do not test again\r\n if ( browserInfo )\r\n {\r\n return browserInfo;\r\n }\r\n\r\n var browserData = [\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Edge',\r\n versionSearch: 'Edge',\r\n identity : 'Edge'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: 'Chrome',\r\n identity : 'Chrome'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'OmniWeb',\r\n versionSearch: 'OmniWeb/',\r\n identity : 'OmniWeb'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString : 'Apple',\r\n versionSearch: 'Version',\r\n identity : 'Safari'\r\n },\r\n {\r\n prop : $window.opera,\r\n identity: 'Opera'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: 'iCab',\r\n identity : 'iCab'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: 'KDE',\r\n identity : 'Konqueror'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: 'Firefox',\r\n identity : 'Firefox'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: 'Camino',\r\n identity : 'Camino'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: 'Netscape',\r\n identity : 'Netscape'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'MSIE',\r\n identity : 'Explorer',\r\n versionSearch: 'MSIE'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Trident/7',\r\n identity : 'Explorer',\r\n versionSearch: 'rv'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Gecko',\r\n identity : 'Mozilla',\r\n versionSearch: 'rv'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Mozilla',\r\n identity : 'Netscape',\r\n versionSearch: 'Mozilla'\r\n }\r\n ];\r\n\r\n var osData = [\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Win',\r\n identity : 'Windows'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Mac',\r\n identity : 'Mac'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Linux',\r\n identity : 'Linux'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'iPhone',\r\n identity : 'iPhone'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'iPod',\r\n identity : 'iPod'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'iPad',\r\n identity : 'iPad'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Android',\r\n identity : 'Android'\r\n }\r\n ];\r\n\r\n var versionSearchString = '';\r\n\r\n function searchString(data)\r\n {\r\n for ( var i = 0; i < data.length; i++ )\r\n {\r\n var dataString = data[i].string;\r\n var dataProp = data[i].prop;\r\n\r\n versionSearchString = data[i].versionSearch || data[i].identity;\r\n\r\n if ( dataString )\r\n {\r\n if ( dataString.indexOf(data[i].subString) !== -1 )\r\n {\r\n return data[i].identity;\r\n\r\n }\r\n }\r\n else if ( dataProp )\r\n {\r\n return data[i].identity;\r\n }\r\n }\r\n }\r\n\r\n function searchVersion(dataString)\r\n {\r\n var index = dataString.indexOf(versionSearchString);\r\n\r\n if ( index === -1 )\r\n {\r\n return;\r\n }\r\n\r\n return parseInt(dataString.substring(index + versionSearchString.length + 1));\r\n }\r\n\r\n var browser = searchString(browserData) || 'unknown-browser';\r\n var version = searchVersion($window.navigator.userAgent) || searchVersion($window.navigator.appVersion) || 'unknown-version';\r\n var os = searchString(osData) || 'unknown-os';\r\n\r\n // Prepare and store the object\r\n browser = browser.toLowerCase();\r\n version = browser + '-' + version;\r\n os = os.toLowerCase();\r\n\r\n browserInfo = {\r\n browser: browser,\r\n version: version,\r\n os : os\r\n };\r\n\r\n return browserInfo;\r\n }\r\n\r\n /**\r\n * Generates a globally unique id\r\n *\r\n * @returns {*}\r\n */\r\n function guidGenerator()\r\n {\r\n var S4 = function ()\r\n {\r\n return (((1 + Math.random()) * 0x10000) || 0).toString(16).substring(1);\r\n };\r\n return (S4() + S4() + S4() + S4() + S4() + S4());\r\n }\r\n\r\n /**\r\n * Return if current device is a\r\n * mobile device or not\r\n */\r\n function isMobile()\r\n {\r\n return mobileDetect.mobile();\r\n }\r\n\r\n /**\r\n * Toggle in array (push or splice)\r\n *\r\n * @param item\r\n * @param array\r\n */\r\n function toggleInArray(item, array)\r\n {\r\n if ( array.indexOf(item) === -1 )\r\n {\r\n array.push(item);\r\n }\r\n else\r\n {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n }\r\n }\r\n}());\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msApi', msApiProvider);\r\n\r\n /** @ngInject **/\r\n function msApiProvider()\r\n {\r\n /* ----------------- */\r\n /* Provider */\r\n /* ----------------- */\r\n var provider = this;\r\n\r\n // Inject the $log service\r\n var $log = angular.injector(['ng']).get('$log');\r\n\r\n // Data\r\n var baseUrl = '';\r\n var api = [];\r\n\r\n // Methods\r\n provider.setBaseUrl = setBaseUrl;\r\n provider.getBaseUrl = getBaseUrl;\r\n provider.getApiObject = getApiObject;\r\n provider.register = register;\r\n\r\n //////////\r\n\r\n /**\r\n * Set base url for API endpoints\r\n *\r\n * @param url {string}\r\n */\r\n function setBaseUrl(url)\r\n {\r\n baseUrl = url;\r\n }\r\n\r\n /**\r\n * Return the base url\r\n *\r\n * @returns {string}\r\n */\r\n function getBaseUrl()\r\n {\r\n return baseUrl;\r\n }\r\n\r\n /**\r\n * Return the api object\r\n *\r\n * @returns {object}\r\n */\r\n function getApiObject()\r\n {\r\n return api;\r\n }\r\n\r\n /**\r\n * Register API endpoint\r\n *\r\n * @param key\r\n * @param resource\r\n */\r\n function register(key, resource)\r\n {\r\n if ( !angular.isString(key) )\r\n {\r\n $log.error('\"path\" must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n if ( !angular.isArray(resource) )\r\n {\r\n $log.error('\"resource\" must be an array and it must follow $resource definition');\r\n return;\r\n }\r\n\r\n // Store the API object\r\n api[key] = {\r\n url : baseUrl + (resource[0] || ''),\r\n paramDefaults: resource[1] || [],\r\n actions : resource[2] || [],\r\n options : resource[3] || {}\r\n };\r\n }\r\n\r\n /* ----------------- */\r\n /* Service */\r\n /* ----------------- */\r\n this.$get = function ($q, $log, $resource)\r\n {\r\n // Data\r\n\r\n // Methods\r\n var service = {\r\n setBaseUrl: setBaseUrl,\r\n getBaseUrl: getBaseUrl,\r\n register : register,\r\n resolve : resolve,\r\n request : request\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Resolve an API endpoint\r\n *\r\n * @param action {string}\r\n * @param parameters {object}\r\n * @returns {promise|boolean}\r\n */\r\n function resolve(action, parameters)\r\n {\r\n var actionParts = action.split('@'),\r\n resource = actionParts[0],\r\n method = actionParts[1],\r\n params = parameters || {};\r\n\r\n if ( !resource || !method )\r\n {\r\n $log.error('msApi.resolve requires correct action parameter (resourceName@methodName)');\r\n return false;\r\n }\r\n\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // Get the correct resource definition from api object\r\n var apiObject = api[resource];\r\n\r\n if ( !apiObject )\r\n {\r\n $log.error('Resource \"' + resource + '\" is not defined in the api service!');\r\n deferred.reject('Resource \"' + resource + '\" is not defined in the api service!');\r\n }\r\n else\r\n {\r\n // Generate the $resource object based on the stored API object\r\n var resourceObject = $resource(apiObject.url, apiObject.paramDefaults, apiObject.actions, apiObject.options);\r\n\r\n // Make the call...\r\n resourceObject[method](params,\r\n\r\n // Success\r\n function (response)\r\n {\r\n deferred.resolve(response);\r\n },\r\n\r\n // Error\r\n function (response)\r\n {\r\n deferred.reject(response);\r\n }\r\n );\r\n }\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Make a request to an API endpoint\r\n *\r\n * @param action {string}\r\n * @param [parameters] {object}\r\n * @param [success] {function}\r\n * @param [error] {function}\r\n *\r\n * @returns {promise|boolean}\r\n */\r\n function request(action, parameters, success, error)\r\n {\r\n var actionParts = action.split('@'),\r\n resource = actionParts[0],\r\n method = actionParts[1],\r\n params = parameters || {};\r\n\r\n if ( !resource || !method )\r\n {\r\n $log.error('msApi.resolve requires correct action parameter (resourceName@methodName)');\r\n return false;\r\n }\r\n\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // Get the correct resource definition from api object\r\n var apiObject = api[resource];\r\n\r\n if ( !apiObject )\r\n {\r\n $log.error('Resource \"' + resource + '\" is not defined in the api service!');\r\n deferred.reject('Resource \"' + resource + '\" is not defined in the api service!');\r\n }\r\n else\r\n {\r\n // Generate the $resource object based on the stored API object\r\n var resourceObject = $resource(apiObject.url, apiObject.paramDefaults, apiObject.actions, apiObject.options);\r\n\r\n // Make the call...\r\n resourceObject[method](params,\r\n\r\n // SUCCESS\r\n function (response)\r\n {\r\n // Resolve the promise\r\n deferred.resolve(response);\r\n\r\n // Call the success function if there is one\r\n if ( angular.isDefined(success) && angular.isFunction(success) )\r\n {\r\n success(response);\r\n }\r\n },\r\n\r\n // ERROR\r\n function (response)\r\n {\r\n // Reject the promise\r\n deferred.reject(response);\r\n\r\n // Call the error function if there is one\r\n if ( angular.isDefined(error) && angular.isFunction(error) )\r\n {\r\n error(response);\r\n }\r\n }\r\n );\r\n }\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('apiResolver', apiResolverService);\r\n\r\n /** @ngInject */\r\n function apiResolverService($q, $log, api)\r\n {\r\n var service = {\r\n resolve: resolve\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n /**\r\n * Resolve api\r\n * @param action\r\n * @param parameters\r\n */\r\n function resolve(action, parameters)\r\n {\r\n var actionParts = action.split('@'),\r\n resource = actionParts[0],\r\n method = actionParts[1],\r\n params = parameters || {};\r\n\r\n if ( !resource || !method )\r\n {\r\n $log.error('apiResolver.resolve requires correct action parameter (ResourceName@methodName)');\r\n return false;\r\n }\r\n\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // Get the correct api object from api service\r\n var apiObject = getApiObject(resource);\r\n\r\n if ( !apiObject )\r\n {\r\n $log.error('Resource \"' + resource + '\" is not defined in the api service!');\r\n deferred.reject('Resource \"' + resource + '\" is not defined in the api service!');\r\n }\r\n else\r\n {\r\n apiObject[method](params,\r\n\r\n // Success\r\n function (response)\r\n {\r\n deferred.resolve(response);\r\n },\r\n\r\n // Error\r\n function (response)\r\n {\r\n deferred.reject(response);\r\n }\r\n );\r\n }\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Get correct api object\r\n *\r\n * @param resource\r\n * @returns {*}\r\n */\r\n function getApiObject(resource)\r\n {\r\n // Split the resource in case if we have a dot notated object\r\n var resourceParts = resource.split('.'),\r\n apiObject = api;\r\n\r\n // Loop through the resource parts and go all the way through\r\n // the api object and return the correct one\r\n for ( var l = 0; l < resourceParts.length; l++ )\r\n {\r\n if ( angular.isUndefined(apiObject[resourceParts[l]]) )\r\n {\r\n $log.error('Resource part \"' + resourceParts[l] + '\" is not defined!');\r\n apiObject = false;\r\n break;\r\n }\r\n\r\n apiObject = apiObject[resourceParts[l]];\r\n }\r\n\r\n if ( !apiObject )\r\n {\r\n return false;\r\n }\r\n\r\n return apiObject;\r\n }\r\n }\r\n\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular.module('angularPayments')\r\n .factory('Common', [function () {\r\n\r\n var ret = {};\r\n\r\n // expiry is a string \"mm / yy[yy]\"\r\n ret['parseExpiry'] = function (value) {\r\n var month, prefix, year, _ref;\r\n\r\n var isDate = new Date(value);\r\n isDate = new Date(isDate.getUTCFullYear(), isDate.getUTCMonth(), isDate.getUTCDate());\r\n //var currentTime = new Date(currentTime.getUTCFullYear(), currentTime.getUTCMonth(), currentTime.getUTCDate());\r\n\r\n if (value && isDate) {\r\n /*console.log('value.split(\"-\")[2]: ' + value.split(\"-\")[2]);\r\n console.log('value.split(\"-\") != undefined ' + (value.split(\"-\") != undefined));\r\n console.log('value.split(\"-\")[2] != undefined ' + (value.split(\"-\")[2] != undefined));\r\n console.log('parseInt(value.split(\"-\")[2]) == 1 ' + (parseInt(value.split(\"-\")[2]) == 1));\r\n if (value.split(\"-\") != undefined && value.split(\"-\")[2] != undefined && parseInt(value.split(\"-\")[2]) == 1)\r\n {\r\n console.log(\"if statement\");\r\n month = (isDate.getMonth() + 1);\r\n console.log(\"month \" + month);\r\n }\r\n else\r\n {\r\n console.log(\"else statement\");\r\n month = (isDate.getMonth());\r\n console.log(\"month \" + month);\r\n }*/\r\n\r\n if (value.split(\"-\") != undefined && value.split(\"-\")[2] != undefined)\r\n { month = (isDate.getMonth() + 1); }\r\n\r\n\r\n year = isDate.getFullYear();\r\n } else {\r\n\r\n value = value || '';\r\n\r\n value = value.replace(/\\s/g, '');\r\n _ref = value.split('/', 2), month = _ref[0], year = _ref[1];\r\n\r\n if ((year != null ? year.length : void 0) === 2 && /^\\d+$/.test(year)) {\r\n prefix = (new Date).getFullYear();\r\n prefix = prefix.toString().slice(0, 2);\r\n year = prefix + year;\r\n }\r\n\r\n month = parseInt(month, 10);\r\n year = parseInt(year, 10);\r\n }\r\n\r\n return {\r\n month: month,\r\n year: year\r\n };\r\n }\r\n\r\n return ret;\r\n\r\n }]);\r\n\r\n angular\r\n .module('angularPayments')\r\n .directive('routingNumber', function () {\r\n\r\n var _passesLuhnCheck = function (routing) {\r\n var checksumTotal = (7 * (parseInt(routing.charAt(0), 10) + parseInt(routing.charAt(3), 10) + parseInt(routing.charAt(6), 10))) +\r\n (3 * (parseInt(routing.charAt(1), 10) + parseInt(routing.charAt(4), 10) + parseInt(routing.charAt(7), 10))) +\r\n (9 * (parseInt(routing.charAt(2), 10) + parseInt(routing.charAt(5), 10) + parseInt(routing.charAt(8), 10)));\r\n var checksumMod = checksumTotal % 10;\r\n if (checksumMod !== 0) return false;\r\n return true;\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n compile: function (element, attributes) {\r\n attributes.$set('pattern', '/[012346789][0-9]{8}/');\r\n attributes.$set('maxlength', 9);\r\n attributes.$set('xAutocompletetype', 'routing-transit-number');\r\n\r\n return function (scope, elm, attrs, ngModel) {\r\n ngModel.$validators.abaRoutingMinLength = function (value) {\r\n if (!value || value === '') return true;\r\n value = String(value);\r\n if (value.length < 9) return false;\r\n return true;\r\n };\r\n\r\n ngModel.$validators.abaRoutingMaxLength = function (value) {\r\n if (!value || value === '') return true;\r\n value = String(value);\r\n if (value.length > 9) return false;\r\n return true;\r\n };\r\n\r\n // internal routing numbers begin with a 5 - these are not valid routing numbers\r\n ngModel.$validators.abaRoutingInternal = function (value) {\r\n if (!value || value === '') return true;\r\n value = String(value);\r\n if (value.length < 1) return true; // don't fail if we don't have a value yet\r\n if (value.substring(0, 1) === '5') return false;\r\n return true;\r\n };\r\n\r\n ngModel.$validators.abaRouting = function (value) {\r\n if (!value || value === '') return true;\r\n if (typeof value !== 'string') return false;\r\n\r\n // should be 9 digits, not starting with a 5\r\n var abaRegex = /^[012346789][0-9]{8}$/;\r\n if (!abaRegex.test(value)) return false;\r\n\r\n // should pass the Luhn algorithm check\r\n return _passesLuhnCheck(value);\r\n };\r\n };\r\n },\r\n };\r\n });\r\n\r\n angular\r\n .module('app.msportal')\r\n .run(['editableOptions', function (editableOptions) {\r\n editableOptions.theme = 'bs3';\r\n }]);\r\n\r\n\r\n angular\r\n .module('angularPayments')\r\n .config(['$provide', function ($provide) {\r\n $provide.decorator(\"paymentsValidateDirective\", ['$delegate', '$window', '_Validate', '_ValidateWatch', function ($delegate, $window, _Validate, _ValidateWatch) {\r\n var directive = $delegate[0];\r\n\r\n var link = function myLinkFunction(scope, elem, attr, ctrl) {\r\n var type = attr.paymentsValidate;\r\n var crypto = attr.cryptoField;\r\n\r\n _ValidateWatch(type, ctrl, scope, attr);\r\n\r\n var validateFn = function (val) {\r\n if (type == \"card\") {\r\n\r\n var ModelValue = ctrl.$modelValue;\r\n\r\n /// It validate if there are encryption functionality applied.\r\n if (scope.$$parent != undefined && scope.$$parent.ClearValue != undefined) {\r\n ModelValue = scope.$$parent.ClearValue;\r\n }\r\n\r\n if (ModelValue != undefined && !ctrl.$dirty && ModelValue.indexOf(\"*\") == 0) {\r\n /// Validate the Credit Card Type.\r\n var validCardType = _Validate(\"cardType\", val, ctrl, scope, attr);\r\n ctrl.$setValidity(\"cardType\", validCardType);\r\n\r\n return validCardType ? ModelValue : undefined;\r\n }\r\n\r\n if (val != undefined && ctrl.$dirty) {\r\n\r\n /// Validate the Credit Card Type.\r\n var validCardType = _Validate(\"cardType\", val, ctrl, scope, attr);\r\n ctrl.$setValidity(\"cardType\", validCardType);\r\n\r\n if (!validCardType) {\r\n return undefined;\r\n }\r\n }\r\n\r\n /// Validate the Controller for credit card.\r\n var valid = _Validate(type, val, ctrl, scope, attr);\r\n ctrl.$setValidity(type, valid);\r\n\r\n return valid ? val : undefined;\r\n }\r\n\r\n else {\r\n var valid = _Validate(type, val, ctrl, scope, attr);\r\n ctrl.$setValidity(type, valid);\r\n\r\n return valid ? val : undefined;\r\n }\r\n };\r\n ctrl.$formatters.push(validateFn);\r\n ctrl.$parsers.push(validateFn);\r\n }\r\n\r\n directive.compile = function () {\r\n return function (scope, elem, attr, ctrl) {\r\n\r\n link.apply(this, arguments);\r\n };\r\n };\r\n\r\n return $delegate;\r\n }]);\r\n }]);\r\n\r\n angular\r\n .module('angularPayments')\r\n .factory('_Validate', ['Cards', 'Common', '$parse', function (Cards, Common, $parse) {\r\n\r\n var __indexOf = [].indexOf || function (item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }\r\n\r\n var _luhnCheck = function (num) {\r\n var digit, digits, odd, sum, i, len;\r\n\r\n odd = true;\r\n sum = 0;\r\n digits = (num + '').split('').reverse();\r\n\r\n for (i = 0, len = digits.length; i < len; i++) {\r\n\r\n digit = digits[i];\r\n digit = parseInt(digit, 10);\r\n\r\n if ((odd = !odd)) {\r\n digit *= 2;\r\n }\r\n\r\n if (digit > 9) {\r\n digit -= 9;\r\n }\r\n\r\n sum += digit;\r\n\r\n }\r\n\r\n return sum % 10 === 0;\r\n };\r\n\r\n var _validators = {}\r\n\r\n _validators['cvc'] = function (cvc, ctrl, scope, attr) {\r\n var ref, ref1;\r\n\r\n // valid if empty - let ng-required handle empty\r\n if (cvc == null || cvc.length == 0) return true;\r\n\r\n if (!/^\\d+$/.test(cvc)) {\r\n return false;\r\n }\r\n\r\n var type;\r\n if (attr.paymentsTypeModel) {\r\n var typeModel = $parse(attr.paymentsTypeModel);\r\n type = typeModel(scope);\r\n }\r\n\r\n if (type) {\r\n return ref = cvc.length, __indexOf.call((ref1 = Cards.fromType(type)) != null ? ref1.cvcLength : void 0, ref) >= 0;\r\n } else {\r\n return cvc.length >= 3 && cvc.length <= 4;\r\n }\r\n }\r\n\r\n _validators['card'] = function (num, ctrl, scope, attr) {\r\n var card, ref, typeModel;\r\n\r\n if (attr.paymentsTypeModel) {\r\n typeModel = $parse(attr.paymentsTypeModel);\r\n }\r\n\r\n var clearCard = function () {\r\n if (typeModel) {\r\n typeModel.assign(scope, null);\r\n }\r\n ctrl.$card = null;\r\n };\r\n\r\n // valid if empty - let ng-required handle empty\r\n if (num == null || num.length == 0) {\r\n clearCard();\r\n return true;\r\n }\r\n\r\n num = (num + '').replace(/\\s+|-/g, '');\r\n\r\n if (!/^\\d+$/.test(num)) {\r\n clearCard();\r\n return false;\r\n }\r\n\r\n card = Cards.fromNumber(num);\r\n\r\n if (!card) {\r\n clearCard();\r\n return false;\r\n }\r\n\r\n ctrl.$card = angular.copy(card);\r\n\r\n /// Handle the credit card type if it comes from the server and the card number is masked.\r\n if (typeModel && num.length > 4) {\r\n typeModel.assign(scope, card.type);\r\n }\r\n\r\n var ret = (ref = num.length, __indexOf.call(card.length, ref) >= 0) && (card.luhn === false || _luhnCheck(num));\r\n\r\n return ret;\r\n }\r\n\r\n _validators['expiry'] = function (val) {\r\n // valid if empty - let ng-required handle empty\r\n if (val == null || val.length == 0) return true;\r\n\r\n var obj = Common.parseExpiry(val);\r\n\r\n var month = obj.month;\r\n var year = obj.year;\r\n\r\n var currentTime, expiry, prefix;\r\n\r\n if (!(month && year)) {\r\n return false;\r\n }\r\n\r\n if (!/^\\d+$/.test(month)) {\r\n return false;\r\n }\r\n\r\n if (!/^\\d+$/.test(year)) {\r\n return false;\r\n }\r\n\r\n if (!(parseInt(month, 10) <= 12)) {\r\n return false;\r\n }\r\n\r\n /// This month is necesary for take the last date of the month to be compared.\r\n /// To doing this you have to do the next:\r\n /// If the current month is November then you are going to have [month = 10], because \"Common.parseExpiry(val)\" returns a cero base array.\r\n /// in order to get the last day of the month you have to use this date format (yyyy-mm-01). That means that\r\n /// if you want to know the last day of november of 2016, you need to use this date (new Date(2016-12-01)) this is going to\r\n /// return (November 30 2016).\r\n //month = parseInt(month) + 2;\r\n\r\n /// Common.parseExpiry(val) now returns actual month instead of zero-based array.\r\n /// Add an additional month to get the last day of the selected month-year\r\n /*month = parseInt(month) + 1;\r\n\r\n /// It reset the month greater than 12.\r\n if (parseInt(month) > 12) {\r\n month = parseInt(month) - 12;\r\n year = parseInt(year) + 1;\r\n }\r\n\r\n /// The month have to be parsed with left cero.\r\n if (parseInt(month) < 10) {\r\n month = \"0\" + month;\r\n }*/\r\n\r\n /// Note: Using this format \"yyyy-mm-01\" it takes the last day of the month when instantiate the new Date() function.\r\n /*var dateFixed = year + \"-\" + month + \"-01\";\r\n expiry = new Date(dateFixed);\r\n expiry.setDate(expiry.getDate() - 1);\r\n var expiry = new Date(Date.UTC(expiry.getFullYear(), expiry.getMonth(), expiry.getDate()));*/\r\n\r\n //var expiry = new Date(Date.UTC(year, month, month));\r\n\r\n currentTime = new Date;\r\n var currMonth, currYear;\r\n currMonth = currentTime.getMonth() + 1;\r\n currYear = currentTime.getFullYear();\r\n\r\n var returnStatement = false;\r\n if (obj.year > currYear) {\r\n returnStatement = true;\r\n }\r\n else if (obj.year == currYear) {\r\n if (obj.month >= currMonth) {\r\n returnStatement = true;\r\n }\r\n }\r\n\r\n //return expiry >= currentTime;\r\n return returnStatement;\r\n }\r\n\r\n _validators['cardType'] = function (num, ctrl, scope, attr) {\r\n var isTypeValid = false;\r\n var card, typeModel, typeModelValid;\r\n\r\n var clearCard = function () {\r\n if (typeModel) {\r\n typeModel.assign(scope, null);\r\n }\r\n ctrl.$card = null;\r\n };\r\n\r\n // valid if empty - let ng-required handle empty\r\n if (num == null || num.length == 0) {\r\n clearCard();\r\n return true;\r\n }\r\n\r\n\r\n\r\n if (attr.paymentsTypeModelValid) {\r\n typeModelValid = $parse(attr.paymentsTypeModelValid);\r\n }\r\n\r\n if (attr.paymentsTypeModel) {\r\n typeModel = $parse(attr.paymentsTypeModel);\r\n }\r\n\r\n if (typeModel != undefined && typeModel(scope) != null) {\r\n card = Cards.fromType(typeModel(scope));\r\n }\r\n\r\n if (card == undefined || !card) {\r\n card = Cards.fromNumber(num);\r\n\r\n if (card != null && card.type != null) {\r\n typeModel.assign(scope, card.type);\r\n }\r\n }\r\n\r\n\r\n if (!card) {\r\n clearCard();\r\n\r\n /// I return true but the required field validation will do the work.\r\n return true;\r\n }\r\n\r\n ctrl.$card = angular.copy(card);\r\n\r\n\r\n /// Validates if the credit card number is allowed.\r\n if (typeModelValid(scope)) {\r\n switch (ctrl.$card.type) {\r\n case \"visa\":\r\n isTypeValid = (typeModelValid(scope).INT_COOPPARM_1 > 0);\r\n break;\r\n case \"mastercard\":\r\n isTypeValid = (typeModelValid(scope).INT_COOPPARM_2 > 0);\r\n break;\r\n case \"discover\":\r\n isTypeValid = (typeModelValid(scope).INT_COOPPARM_3 > 0);\r\n break;\r\n case \"amex\":\r\n isTypeValid = (typeModelValid(scope).INT_COOPPARM_4 > 0);\r\n break;\r\n }\r\n\r\n }\r\n\r\n return isTypeValid;\r\n }\r\n\r\n\r\n return function (type, val, ctrl, scope, attr) {\r\n if (!_validators[type]) {\r\n\r\n types = Object.keys(_validators);\r\n\r\n errstr = 'Unknown type for validation: \"' + type + '\". ';\r\n errstr += 'Should be one of: \"' + types.join('\", \"') + '\"';\r\n\r\n throw errstr;\r\n }\r\n return _validators[type](val, ctrl, scope, attr);\r\n }\r\n }]);\r\n\r\n angular\r\n .module('angularPayments')\r\n .factory('_Format', ['Cards', 'Common', '$filter', function (Cards, Common, $filter) {\r\n\r\n var _formats = {}\r\n\r\n var _hasTextSelected = function ($target) {\r\n var ref;\r\n\r\n if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== $target.prop('selectionEnd')) {\r\n return true;\r\n }\r\n\r\n if (typeof document !== \"undefined\" && document !== null ? (ref = document.selection) != null ? typeof ref.createRange === \"function\" ? ref.createRange().text : void 0 : void 0 : void 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // card formatting\r\n\r\n var _formatCardNumber = function (e) {\r\n var $target, card, digit, length, re, upperLength, value;\r\n\r\n digit = String.fromCharCode(e.which);\r\n $target = angular.element(e.currentTarget);\r\n value = $target.val();\r\n card = Cards.fromNumber(value + digit);\r\n length = (value.replace(/\\D/g, '') + digit).length;\r\n\r\n upperLength = 16;\r\n\r\n //Override for backspace issue in Firefox (MND-890)\r\n if (e.keyCode == 46 || e.keyCode == 8 || (e.keyCode >= 37 && e.keyCode <= 40)) {\r\n return;\r\n }\r\n\r\n if (card) {\r\n upperLength = card.length[card.length.length - 1];\r\n }\r\n\r\n if (length >= upperLength) {\r\n return;\r\n }\r\n\r\n if (!/^\\d+$/.test(digit) && !e.meta && e.keyCode >= 46) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== value.length) {\r\n return;\r\n }\r\n\r\n re = Cards.defaultInputFormat();\r\n if (card) {\r\n re = card.inputFormat;\r\n }\r\n\r\n if (re.test(value)) {\r\n e.preventDefault();\r\n return $target.val(value + ' ' + digit);\r\n\r\n } else if (re.test(value + digit)) {\r\n e.preventDefault();\r\n return $target.val(value + digit + ' ');\r\n\r\n }\r\n };\r\n\r\n var _restrictCardNumber = function (e) {\r\n var $target, card, digit, value;\r\n\r\n $target = angular.element(e.currentTarget);\r\n digit = String.fromCharCode(e.which);\r\n\r\n if (!/^\\d+$/.test(digit)) {\r\n return;\r\n }\r\n\r\n if (_hasTextSelected($target)) {\r\n return;\r\n }\r\n\r\n value = ($target.val() + digit).replace(/\\D/g, '');\r\n card = Cards.fromNumber(value);\r\n\r\n if (card) {\r\n if (!(value.length <= card.length[card.length.length - 1])) {\r\n e.preventDefault();\r\n }\r\n } else {\r\n if (!(value.length <= 16)) {\r\n e.preventDefault();\r\n }\r\n }\r\n };\r\n\r\n var _formatBackCardNumber = function (e) {\r\n var $target, value;\r\n\r\n $target = angular.element(e.currentTarget);\r\n value = $target.val();\r\n\r\n if (e.meta) {\r\n return;\r\n }\r\n\r\n if (e.which !== 8) {\r\n return;\r\n }\r\n\r\n if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== value.length) {\r\n return;\r\n }\r\n\r\n if (/\\d\\s$/.test(value) && !e.meta && e.keyCode >= 46) {\r\n e.preventDefault();\r\n return $target.val(value.replace(/\\d\\s$/, ''));\r\n } else if (/\\s\\d?$/.test(value)) {\r\n e.preventDefault();\r\n return $target.val(value.replace(/\\s\\d?$/, ''));\r\n }\r\n };\r\n\r\n var _getFormattedCardNumber = function (num) {\r\n var card, groups, upperLength, ref;\r\n card = Cards.fromNumber(num);\r\n\r\n if (!card) {\r\n return num;\r\n }\r\n\r\n upperLength = card.length[card.length.length - 1];\r\n num = num.replace(/\\D/g, '');\r\n num = num.slice(0, +upperLength + 1 || 9e9);\r\n\r\n if (card.format.global) {\r\n return (ref = num.match(card.format)) != null ? ref.join(' ') : void 0;\r\n } else {\r\n groups = card.format.exec(num);\r\n\r\n if (groups != null) {\r\n groups.shift();\r\n }\r\n\r\n return groups != null ? groups.join(' ') : void 0;\r\n }\r\n };\r\n\r\n var _reFormatCardNumber = function (e) {\r\n return setTimeout(function () {\r\n var $target, value;\r\n $target = angular.element(e.target);\r\n\r\n value = $target.val();\r\n value = _getFormattedCardNumber(value);\r\n return $target.val(value);\r\n });\r\n };\r\n\r\n var _parseCardNumber = function (value) {\r\n /// Fix of the MND-890 related to the Credit Card Number format.\r\n\r\n if (value != null) {\r\n value = value.replace(/\\D/g, '');\r\n value = _getFormattedCardNumber(value);\r\n }\r\n\r\n return value;\r\n };\r\n\r\n _formats['card'] = function (elem, ctrl) {\r\n elem.bind('keypress', _restrictCardNumber);\r\n elem.bind('keypress', _formatCardNumber);\r\n elem.bind('keydown', _formatBackCardNumber);\r\n elem.bind('paste', _reFormatCardNumber);\r\n\r\n ctrl.$parsers.push(_parseCardNumber);\r\n ctrl.$formatters.push(_getFormattedCardNumber);\r\n }\r\n\r\n\r\n // cvc\r\n\r\n var _formatCVC = function (e) {\r\n $target = angular.element(e.currentTarget);\r\n digit = String.fromCharCode(e.which);\r\n\r\n if (!/^\\d+$/.test(digit) && !e.meta && e.keyCode >= 46) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n val = $target.val() + digit;\r\n\r\n if (val.length <= 4) {\r\n return;\r\n } else {\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n _formats['cvc'] = function (elem) {\r\n elem.bind('keypress', _formatCVC)\r\n }\r\n\r\n // expiry\r\n\r\n var _restrictExpiry = function (e) {\r\n var $target, digit, value;\r\n\r\n $target = angular.element(e.currentTarget);\r\n digit = String.fromCharCode(e.which);\r\n\r\n if (!/^\\d+$/.test(digit) && !e.meta && e.keyCode >= 46) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n if (_hasTextSelected($target)) {\r\n return;\r\n }\r\n\r\n value = $target.val() + digit;\r\n value = value.replace(/\\D/g, '');\r\n\r\n if (value.length > 6) {\r\n e.preventDefault()\r\n return;\r\n }\r\n };\r\n\r\n var _formatExpiry = function (e) {\r\n var $target, digit, val;\r\n\r\n digit = String.fromCharCode(e.which);\r\n\r\n if (!/^\\d+$/.test(digit) && !e.meta && e.keyCode >= 46) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n $target = angular.element(e.currentTarget);\r\n val = $target.val() + digit;\r\n\r\n if (/^\\d$/.test(val) && (val !== '0' && val !== '1')) {\r\n e.preventDefault();\r\n return $target.val(\"0\" + val + \" / \");\r\n\r\n } else if (/^\\d\\d$/.test(val)) {\r\n e.preventDefault();\r\n return $target.val(\"\" + val + \" / \");\r\n\r\n }\r\n };\r\n\r\n var _formatForwardExpiry = function (e) {\r\n var $target, digit, val;\r\n\r\n digit = String.fromCharCode(e.which);\r\n\r\n if (!/^\\d+$/.test(digit) && !e.meta && e.keyCode >= 46) {\r\n return;\r\n }\r\n\r\n $target = angular.element(e.currentTarget);\r\n val = $target.val();\r\n\r\n if (/^\\d\\d$/.test(val)) {\r\n return $target.val(\"\" + val + \" / \");\r\n }\r\n };\r\n\r\n var _formatForwardSlash = function (e) {\r\n var $target, slash, val;\r\n\r\n slash = String.fromCharCode(e.which);\r\n\r\n if (slash !== '/') {\r\n return;\r\n }\r\n\r\n $target = angular.element(e.currentTarget);\r\n val = $target.val();\r\n\r\n if (/^\\d$/.test(val) && val !== '0') {\r\n return $target.val(\"0\" + val + \" / \");\r\n }\r\n };\r\n\r\n var _formatBackExpiry = function (e) {\r\n var $target, value;\r\n\r\n if (e.meta) {\r\n return;\r\n }\r\n\r\n $target = angular.element(e.currentTarget);\r\n value = $target.val();\r\n\r\n if (e.which !== 8) {\r\n return;\r\n }\r\n\r\n if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== value.length) {\r\n return;\r\n }\r\n\r\n if (/\\d(\\s|\\/)+$/.test(value)) {\r\n e.preventDefault();\r\n return $target.val(value.replace(/\\d(\\s|\\/)*$/, ''));\r\n\r\n } else if (/\\s\\/\\s?\\d?$/.test(value)) {\r\n e.preventDefault();\r\n return $target.val(value.replace(/\\s\\/\\s?\\d?$/, ''));\r\n\r\n }\r\n };\r\n\r\n var _parseExpiry = function (value) {\r\n\r\n if (value != null) {\r\n var obj = Common.parseExpiry(value);\r\n var expiry = new Date(obj.year, obj.month - 1);\r\n return $filter('date')(expiry, 'MM/yyyy');\r\n }\r\n return null;\r\n };\r\n\r\n var _getFormattedExpiry = function (value) {\r\n\r\n if (value != null) {\r\n var obj = Common.parseExpiry(value);\r\n var expiry = new Date(obj.year, obj.month - 1);\r\n return $filter('date')(expiry, 'MM / yyyy');\r\n }\r\n return null;\r\n };\r\n\r\n\r\n _formats['expiry'] = function (elem, ctrl) {\r\n elem.bind('keypress', _restrictExpiry);\r\n elem.bind('keypress', _formatExpiry);\r\n elem.bind('keypress', _formatForwardSlash);\r\n elem.bind('keypress', _formatForwardExpiry);\r\n elem.bind('keydown', _formatBackExpiry);\r\n\r\n ctrl.$parsers.push(_parseExpiry);\r\n ctrl.$formatters.push(_getFormattedExpiry);\r\n }\r\n\r\n return function (type, elem, ctrl) {\r\n if (!_formats[type]) {\r\n\r\n types = Object.keys(_formats);\r\n\r\n errstr = 'Unknown type for formatting: \"' + type + '\". ';\r\n errstr += 'Should be one of: \"' + types.join('\", \"') + '\"';\r\n\r\n throw errstr;\r\n }\r\n return _formats[type](elem, ctrl);\r\n }\r\n\r\n }])\r\n\r\n})();\n(function ()\r\n{\r\n\t'use strict';\r\n\r\n\t/* Directive Used to control the values introduced in a currency input field */\r\n\tangular\r\n\t\t.module('app.core')\r\n\t\t.directive(\"stringToNumber\", [\"$filter\", directive]);\r\n\r\n\tfunction directive($filter) {\r\n\r\n\t\tfunction getCaretPosition(input) {\r\n\t\t\tif (!input) return 0;\r\n\r\n\t\t\tif (input.selectionStart !== undefined) {\r\n\t\t\t\treturn input.selectionStart;\r\n\t\t\t} else if (document.selection) {\r\n\t\t\t\t// Curse you IE\r\n\t\t\t\tinput.focus();\r\n\t\t\t\tvar selection = document.selection.createRange();\r\n\t\t\t\tselection.moveStart('character', input.value ? -input.value.length : 0);\r\n\t\t\t\treturn selection.text.length;\r\n\t\t\t}\r\n\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tfunction setCaretPosition(input, pos) {\r\n\t\t\tif (!input) return 0;\r\n\t\t\tif (input.offsetWidth === 0 || input.offsetHeight === 0) {\r\n\t\t\t\treturn; // Input's hidden\r\n\t\t\t}\r\n\t\t\tif (input.setSelectionRange) {\r\n\t\t\t\t//input.focus(); Commented by Rovie 3/2/2017 fix for MND-961\r\n\t\t\t\tinput.setSelectionRange(pos, pos);\r\n\t\t\t}\r\n\t\t\telse if (input.createTextRange) {\r\n\t\t\t\t// Curse you IE\r\n\t\t\t\tvar range = input.createTextRange();\r\n\t\t\t\trange.collapse(true);\r\n\t\t\t\trange.moveEnd('character', pos);\r\n\t\t\t\trange.moveStart('character', pos);\r\n\t\t\t\trange.select();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tpriority: 1,\r\n\t\t\trequire: 'ngModel',\r\n\t\t\trestrict: 'A',\r\n\t\t\tscope: true,\r\n\t\t\tlink: function (scope, element, attrs, controller) {\r\n\t\t\t\t\r\n\t\t\t\tfunction NumberToString(value) {\r\n\t\t\t\t var oldModelValue = controller.$modelValue;\r\n\t\t\t\t if (isNaN(value)) {\r\n\t\t\t\t value = oldModelValue;\r\n\t\t\t\t } else if (!value) {\r\n\t\t\t\t value = 0;\r\n\t\t\t\t }\r\n\r\n\t\t\t\t var newModelValue = parseFloat(value).toFixed(2);\r\n\t\t\t\t\tvar pos = getCaretPosition(element[0]);\r\n\t\t\t\t\t\r\n\t\t\t\t\telement.val(parseFloat(value).toFixed(2));\r\n\r\n\t\t\t\t\tvar newPos = pos + controller.$viewValue.length - value.length;\r\n\r\n\t\t\t\t\tif ((oldModelValue === undefined) || isNaN(oldModelValue)) {\r\n\t\t\t\t\t\tnewPos -= 3;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tsetCaretPosition(element[0], newPos);\r\n\r\n\t\t\t\t\treturn newModelValue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction StringToNumber(value) {\r\n\t\t\t\t return $filter('number') (value, '2');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcontroller.$parsers.push(NumberToString);\r\n\t\t\t\tcontroller.$formatters.push(StringToNumber);\r\n\r\n\r\n\t\t\t\t//element.bind('keypress', function (val) {\t\t\t\t \r\n\t\t\t\t//\t//switch(val.charCode)\r\n\t\t\t\t//\t//{\r\n\t\t\t\t//\t// case 8:\r\n\t\t\t\t//\t// case 48:\r\n\t\t\t\t//\t// case 49:\r\n\t\t\t\t//\t//\tcase 50:\r\n\t\t\t\t//\t//\tcase 51:\r\n\t\t\t\t//\t//\tcase 52:\r\n\t\t\t\t//\t//\tcase 53:\r\n\t\t\t\t//\t//\tcase 54:\r\n\t\t\t\t//\t//\tcase 55:\r\n\t\t\t\t//\t//\tcase 56:\r\n\t\t\t\t//\t//\tcase 57:\r\n\r\n\t\t\t\t//\t//\t\tbreak;\r\n\t\t\t\t//\t//\tdefault:\r\n\t\t\t\t//\t//\t\tval.preventDefault();\r\n\r\n\t\t\t\t//\t//}\r\n\t\t\t\t//});\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n /* \r\n Usage: use this directive to override angular-agility's navigate away strategies.\r\n Related Attributes:\r\n - prevent-leaving-unsaved => Required. Assign a string to it to override the default message on the pop up.\r\n - login-required => Add login-required=\"false\" to a form if you want to display the \r\n 'Unsaved changes' pop up even when the user is not logged in (in Registration form for example)\r\n - on-navigate-away-strategy => This MUST have a value in order to override angular-agility's \r\n default strategy.\r\n - tab-index => use this on any form contained in the tabs (Services, Profile, Billing History, etc.).\r\n This is needed to determine which tab to go back to when the user clicks on Cancel on the 'Unsaved Changes' pop up.\r\n */\r\n\r\n\r\n angular\r\n .module('app.core')\r\n .directive(\"preventLeavingUnsaved\", [\"aaFormExtensions\", \"$rootScope\", 'authService', '$transitions', directive]);\r\n\r\n function directive(aaFormExtensions, $rootScope, authService, $transitions) {\r\n return {\r\n priority: 2,\r\n restrict: \"A\",\r\n require: \"form\",\r\n compile: function () {\r\n return {\r\n pre: function (scope, element, attrs, ctrl) {\r\n var funcName = attrs.onNavigateAwayStrategy;\r\n\r\n if(funcName){\r\n\r\n //add the function to aaFormExtensions.onNavigateAwayStrategies array\r\n aaFormExtensions.onNavigateAwayStrategies[funcName] = function (rootFormScope, rootForm, $injector) {\r\n var confirmationMessage = attrs.preventLeavingUnsaved || 'You have unsaved changes. Are you sure you want to navigate away without saving them?';\r\n var tabIndex = attrs.tabIndex;\r\n var loginRequired = attrs.loginRequired;\r\n\r\n var deRegisterEventListener = $transitions.onStart({ }, function (transition) {\r\n\r\n if (rootForm.$aaFormExtensions.$changed) { //if the value of any field in the form is changed\r\n if ((authService.isLoggedIn() || loginRequired == 'false') && !window.confirm(confirmationMessage)) {\r\n transition.abort();\r\n $rootScope.loadingProgress = false;\r\n if (tabIndex) {//if the element has tab-index attribute\r\n //broadcast event to move back to tab containing the form. This is handled in serviceController\r\n $rootScope.$broadcast('setCurrentTabIndex', tabIndex);\r\n }\r\n } else {\r\n //reset the form to prevent the pop up from showing again when user tries to navigate away\r\n ctrl.$aaFormExtensions.$reset(true);\r\n }\r\n }\r\n });\r\n\r\n //NATIVE DOM IE9+\r\n function beforeUnload(e) {\r\n if (rootForm.$aaFormExtensions.$changed) {\r\n (e || window.event).returnValue = confirmationMessage;\r\n return confirmationMessage;\r\n }\r\n }\r\n\r\n angular.element(window).on('beforeunload', beforeUnload);\r\n\r\n rootFormScope.$on('$destroy', function () {\r\n deRegisterEventListener();\r\n angular.element(window).off('beforeunload', beforeUnload);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n angular\r\n\t.module('app.core')\r\n\t.directive('notEqualToValue', function () {\r\n\t return {\r\n\t priority: 2,\r\n\t restrict: 'A',\r\n\t require: 'ngModel',\r\n\t link: function (scope, element, attr, ctrl) {\r\n\r\n\t var compareValue = attr.notEqualToValue;\r\n\r\n\t var check = function (value) {\r\n\r\n\t var isSame = value === compareValue;\r\n\r\n\t ctrl.$setValidity(\"notEqualTo\", !isSame);\r\n\r\n\t return value;\r\n\r\n\t }\r\n\r\n\t ctrl.$parsers.push(check);\r\n\t ctrl.$formatters.push(check);\r\n\t attr.$observe(\"notEqualToWatch\", function (value) {\r\n\t compareValue = value;\r\n\t check(ctrl.$$rawModelValue);\r\n\t });\r\n\r\n\t check(ctrl.$$rawModelValue);\r\n\r\n\t }\r\n\t };\r\n\t});\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n /* \r\n Usage: use this directive to override angular-agility's navigate away strategies.\r\n Related Attributes:\r\n - prevent-leaving-unsaved => Required. Assign a string to it to override the default message on the pop up.\r\n - login-required => Add login-required=\"false\" to a form if you want to display the \r\n 'Unsaved changes' pop up even when the user is not logged in (in Registration form for example)\r\n - on-navigate-away-strategy => This MUST have a value in order to override angular-agility's \r\n default strategy.\r\n - tab-index => use this on any form contained in the tabs (Services, Profile, Billing History, etc.).\r\n This is needed to determine which tab to go back to when the user clicks on Cancel on the 'Unsaved Changes' pop up.\r\n */\r\n\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msPassword', function () {\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function (scope, element, attr, ctrl) {\r\n\r\n var check = function (value) {\r\n\r\n var isValid = true;\r\n var str = ctrl.$viewValue;\r\n\r\n if (str) {\r\n\r\n if ((attr.msRequireNumbers !== 'false' && str.search(/\\d/) == -1)) {\r\n isValid = false\r\n }\r\n if ((attr.msRequireSpecialChars !== 'false' && !(/\\W/.test(str)))) {\r\n isValid = false\r\n }\r\n if (attr.msRequireCapitalLetter !== 'false' && str.search(/[A-Z]/) == -1) {\r\n isValid = false\r\n }\r\n if (attr.msRequireSmallLetter !== 'false' && str.search(/[a-z]/) == -1) {\r\n isValid = false\r\n }\r\n\r\n }\r\n\r\n ctrl.$setValidity(\"ms-password\", isValid);\r\n\r\n return value;\r\n\r\n }\r\n\r\n ctrl.$parsers.push(check);\r\n ctrl.$formatters.push(check);\r\n\r\n check(ctrl.$modelValue);\r\n\r\n }\r\n };\r\n })\r\n \r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('hljs', hljsDirective);\r\n\r\n /** @ngInject */\r\n function hljsDirective($timeout, $q, $interpolate)\r\n {\r\n return {\r\n restrict: 'E',\r\n compile : function (element, attr)\r\n {\r\n var code;\r\n //No attribute? code is the content\r\n if ( !attr.code )\r\n {\r\n code = element.html();\r\n element.empty();\r\n }\r\n\r\n return function (scope, element, attr)\r\n {\r\n\r\n if ( attr.code )\r\n {\r\n // Attribute? code is the evaluation\r\n code = scope.$eval(attr.code);\r\n }\r\n var shouldInterpolate = scope.$eval(attr.shouldInterpolate);\r\n\r\n $q.when(code).then(function (code)\r\n {\r\n if ( code )\r\n {\r\n if ( shouldInterpolate )\r\n {\r\n code = $interpolate(code)(scope);\r\n }\r\n var contentParent = angular.element(\r\n '
'\r\n );\r\n element.append(contentParent);\r\n // Defer highlighting 1-frame to prevent GA interference...\r\n $timeout(function ()\r\n {\r\n render(code, contentParent);\r\n }, 34, false);\r\n }\r\n });\r\n\r\n function render(contents, parent)\r\n {\r\n\r\n var codeElement = parent.find('code');\r\n var lines = contents.split('\\n');\r\n\r\n // Remove empty lines\r\n lines = lines.filter(function (line)\r\n {\r\n return line.trim().length;\r\n });\r\n\r\n // Make it so each line starts at 0 whitespace\r\n var firstLineWhitespace = lines[0].match(/^\\s*/)[0];\r\n var startingWhitespaceRegex = new RegExp('^' + firstLineWhitespace);\r\n lines = lines.map(function (line)\r\n {\r\n return line\r\n .replace(startingWhitespaceRegex, '')\r\n .replace(/\\s+$/, '');\r\n });\r\n\r\n var highlightedCode = hljs.highlight(attr.language || attr.lang, lines.join('\\n'), true);\r\n highlightedCode.value = highlightedCode.value\r\n .replace(/=\"\"<\\/span>/gi, '')\r\n .replace('', '')\r\n .replace('', '');\r\n codeElement.append(highlightedCode.value).addClass('highlight');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n /* Directive Used to display google map */\r\n angular\r\n .module('app.core')\r\n .directive('googleMap', function () {\r\n return {\r\n restrict: 'E',\r\n template: '
',\r\n replace: true,\r\n link: function (scope, element, attrs) {\r\n function initialize() {\r\n var myLatlng = new google.maps.LatLng(20, 50);\r\n\r\n var mapOptions = {\r\n center: myLatlng,\r\n zoom: 16,\r\n mapTypeId: google.maps.MapTypeId.ROADMAP\r\n };\r\n\r\n var map = new google.maps.Map(attrs.id,\r\n mapOptions);\r\n }\r\n\r\n google.maps.event.addDomListener(window, \"load\", initialize);\r\n }\r\n };\r\n });\r\n})();\n(function ()\n{\n 'use strict';\n\n /* Directive Used to control a Compare Validator function in an input field */\n angular\n .module('app.core')\n .directive\r\n ('emailAddressCheck'\r\n , function () {\r\n var directive =\r\n {\r\n require: 'ngModel'\r\n , link: function (scope, elm, attrs, ctrl) {\r\n ctrl.$parsers.unshift(function (value) {\r\n var isValid = (/^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i.test(value))\r\n\r\n ctrl.$setValidity('invalid', !!isValid)\r\n return value\r\n })\r\n }\r\n }\r\n return directive\r\n }\r\n )\n})();\n\n(function () {\n 'use strict';\n\n angular\n .module('app.core')\n .directive('customerSearch', customerSearch);\n\n //function customerSearch() {\n // return {\n // require: 'ngModel',\n // link: function (scope, elm, attr, ctrl) {\n // var selectedField = attr.customerSearch;\n // var regex;\n \n // var check = function (value) {\n\n // switch (selectedField) {\n // case \"Customer ID\":\n // regex = /^\\d{5}$/g;\n // break;\n // case \"Account Number\":\n // regex = /^\\d{8}$/g;\n // break;\n // case \"Name\":\n // regex = /^[a-zA-Z-\\s]+$/g;\n // break;\n // case \"Address\":\n // regex = /[^;:]/g;\n // break;\n // }\n\n // scope.customerSearchPattern = regex;\n // return value;\n // }\n\n // ctrl.$parsers.push(check);\n // attr.$observe(\"changeField\", function (value) {\n // selectedField = value;\n // check(ctrl.$$rawModelValue);\n // });\n\n // check(ctrl.$$rawModelValue);\n // }\n // };\n //}\n\n function customerSearch() {\r\n return {\r\n require: 'ngModel',\n link: function (scope, elm, attr, ctrl) {\r\n var selectedField = attr.customerSearch;\n var regex;\n\n var check = function (value) {\r\n\n switch (selectedField) {\r\n case \"Customer ID\":\n regex = \"9?9?9?9?9?9?9?9\";\n break;\n case \"Account Number\":\n regex = \"9?9?9?9?9?9?9?9\";\n break;\n case \"Name\":\n regex = \"*\";\n break;\n case \"Address\":\n regex = \"*\";\n break;\r\n }\n\n scope.customerSearchPattern = regex;\n return value;\r\n }\n\n ctrl.$parsers.push(check);\n attr.$observe(\"changeField\", function (value) {\r\n selectedField = value;\n check(ctrl.$$rawModelValue);\r\n });\n\n check(ctrl.$$rawModelValue);\r\n }\r\n };\r\n }\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n /* Directive Used to control the values introduced in a currency input field */\r\n angular\r\n .module('app.core')\r\n .directive(\"realTimeCurrency\", [\"$filter\", \"$locale\", directive]);\r\n\r\n function directive($filter, $locale) {\r\n var decimalSep = $locale.NUMBER_FORMATS.DECIMAL_SEP;\r\n var toNumberRegex = new RegExp('[^0-9\\\\' + decimalSep + ']', 'g');\r\n var trailingZerosRegex = new RegExp('\\\\' + decimalSep + '0+$');\r\n\r\n var filterFunc = function (value) {\r\n return $filter('currency')(value);\r\n };\r\n\r\n function getCaretPosition(input) {\r\n if (!input) return 0;\r\n\r\n if (input.selectionStart !== undefined) {\r\n return input.selectionStart;\r\n } else if (document.selection) {\r\n // Curse you IE\r\n input.focus();\r\n var selection = document.selection.createRange();\r\n selection.moveStart('character', input.value ? -input.value.length : 0);\r\n return selection.text.length;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n function setCaretPosition(input, pos) {\r\n if (!input) return 0;\r\n if (input.offsetWidth === 0 || input.offsetHeight === 0) {\r\n return; // Input's hidden\r\n }\r\n if (input.setSelectionRange) {\r\n input.focus();\r\n input.setSelectionRange(pos, pos);\r\n }\r\n else if (input.createTextRange) {\r\n // Curse you IE\r\n var range = input.createTextRange();\r\n range.collapse(true);\r\n range.moveEnd('character', pos);\r\n range.moveStart('character', pos);\r\n range.select();\r\n }\r\n }\r\n\r\n function toNumber(currencyStr) {\r\n return parseFloat(currencyStr.replace(toNumberRegex, ''), 10);\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function postLink(scope, elem, attrs, modelCtrl) {\r\n modelCtrl.$formatters.push(filterFunc);\r\n\r\n modelCtrl.$parsers.push(function (newViewValue) {\r\n var oldModelValue = modelCtrl.$modelValue;\r\n var newModelValue = toNumber(newViewValue);\r\n\r\n modelCtrl.$viewValue = filterFunc(newModelValue);\r\n \r\n var pos = getCaretPosition(elem[0]);\r\n \r\n elem.val(modelCtrl.$viewValue);\r\n \r\n var newPos = pos + modelCtrl.$viewValue.length - newViewValue.length;\r\n\r\n if ((oldModelValue === undefined) || isNaN(oldModelValue)) {\r\n newPos -= 3;\r\n }\r\n \r\n setCaretPosition(elem[0], newPos);\r\n \r\n return newModelValue;\r\n });\r\n }\r\n };\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n /* Directive Used to control a Compare Validator function in an input field */\r\n angular\r\n .module('app.core')\r\n .directive(\"matchField\", [\"$parse\", directive]);\r\n\r\n function directive($parse) {\r\n return {\r\n priority: 2,\r\n restrict: \"A\",\r\n require: \"ngModel\",\r\n link: function (scope, element, attrs, ctrl) {\r\n if (!ctrl) return;\r\n\r\n var compareField = $parse(attrs[\"matchField\"]);\r\n\r\n var validate = function (value) {\r\n var temp = compareField(scope)\r\n\r\n var v = value === temp;\r\n\r\n ctrl.$setValidity(\"match\", v);\r\n\r\n return value;\r\n };\r\n\r\n ctrl.$parsers.push(validate);\r\n ctrl.$formatters.push(validate);\r\n attrs.$observe(\"matchValue\", function () {\r\n validate(ctrl.$modelValue);\r\n });\r\n\r\n validate(ctrl.$modelValue);\r\n }\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('filterByTags', filterByTags)\r\n .filter('filterSingleByTags', filterSingleByTags);\r\n\r\n /** @ngInject */\r\n function filterByTags()\r\n {\r\n return function (items, tags)\r\n {\r\n if ( items.length === 0 || tags.length === 0 )\r\n {\r\n return items;\r\n }\r\n\r\n var filtered = [];\r\n\r\n items.forEach(function (item)\r\n {\r\n var match = tags.every(function (tag)\r\n {\r\n var tagExists = false;\r\n\r\n item.tags.forEach(function (itemTag)\r\n {\r\n if ( itemTag.name === tag.name )\r\n {\r\n tagExists = true;\r\n return;\r\n }\r\n });\r\n\r\n return tagExists;\r\n });\r\n\r\n if ( match )\r\n {\r\n filtered.push(item);\r\n }\r\n });\r\n\r\n return filtered;\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function filterSingleByTags()\r\n {\r\n return function (itemTags, tags)\r\n {\r\n if ( itemTags.length === 0 || tags.length === 0 )\r\n {\r\n return;\r\n }\r\n\r\n if ( itemTags.length < tags.length )\r\n {\r\n return [];\r\n }\r\n\r\n var filtered = [];\r\n\r\n var match = tags.every(function (tag)\r\n {\r\n var tagExists = false;\r\n\r\n itemTags.forEach(function (itemTag)\r\n {\r\n if ( itemTag.name === tag.name )\r\n {\r\n tagExists = true;\r\n return;\r\n }\r\n });\r\n\r\n return tagExists;\r\n });\r\n\r\n if ( match )\r\n {\r\n filtered.push(itemTags);\r\n }\r\n\r\n return filtered;\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('filterByPropIds', filterByPropIds);\r\n\r\n /** @ngInject */\r\n function filterByPropIds()\r\n {\r\n return function (items, parameter, ids)\r\n {\r\n if ( items.length === 0 || !ids || ids.length === 0 )\r\n {\r\n return items;\r\n }\r\n\r\n var filtered = [];\r\n\r\n for ( var i = 0; i < items.length; i++ )\r\n {\r\n var item = items[i];\r\n var match = false;\r\n\r\n for ( var j = 0; j < ids.length; j++ )\r\n {\r\n var id = ids[j];\r\n if ( item[parameter].indexOf(id) > -1 )\r\n {\r\n match = true;\r\n break;\r\n }\r\n }\r\n\r\n if ( match )\r\n {\r\n filtered.push(item);\r\n }\r\n\r\n }\r\n\r\n return filtered;\r\n\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('filterByIds', filterByIds);\r\n\r\n /** @ngInject */\r\n function filterByIds()\r\n {\r\n return function (items, ids)\r\n {\r\n\r\n if ( items.length === 0 || !ids )\r\n {\r\n return items;\r\n }\r\n\r\n if ( ids.length === 0 )\r\n {\r\n return [];\r\n }\r\n\r\n var filtered = [];\r\n\r\n for ( var i = 0; i < items.length; i++ )\r\n {\r\n var item = items[i];\r\n var match = false;\r\n\r\n for ( var j = 0; j < ids.length; j++ )\r\n {\r\n var id = ids[j];\r\n if ( item.id === id )\r\n {\r\n match = true;\r\n break;\r\n }\r\n }\r\n\r\n if ( match )\r\n {\r\n filtered.push(item);\r\n }\r\n\r\n }\r\n\r\n return filtered;\r\n\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('toTrusted', toTrustedFilter)\r\n .filter('htmlToPlaintext', htmlToPlainTextFilter)\r\n .filter('nospace', nospaceFilter)\r\n .filter('humanizeDoc', humanizeDocFilter);\r\n\r\n /** @ngInject */\r\n function toTrustedFilter($sce)\r\n {\r\n return function (value)\r\n {\r\n return $sce.trustAsHtml(value);\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function htmlToPlainTextFilter()\r\n {\r\n return function (text)\r\n {\r\n return String(text).replace(/<[^>]+>/gm, '');\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function nospaceFilter()\r\n {\r\n return function (value)\r\n {\r\n return (!value) ? '' : value.replace(/ /g, '');\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function humanizeDocFilter()\r\n {\r\n return function (doc)\r\n {\r\n if ( !doc )\r\n {\r\n return;\r\n }\r\n if ( doc.type === 'directive' )\r\n {\r\n return doc.name.replace(/([A-Z])/g, function ($1)\r\n {\r\n return '-' + $1.toLowerCase();\r\n });\r\n }\r\n return doc.label || doc.name;\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('altDate', altDate);\r\n\r\n /** @ngInject */\r\n function altDate()\r\n {\r\n return function (value)\r\n {\r\n var diff = Date.now() - new Date(value);\r\n\r\n /**\r\n * If in a hour\r\n * e.g. \"2 minutes ago\"\r\n */\r\n if ( diff < (60 * 60 * 1000) )\r\n {\r\n return moment(value).fromNow();\r\n }\r\n /*\r\n * If in the day\r\n * e.g. \"11:23\"\r\n */\r\n else if ( diff < (60 * 60 * 24 * 1000) )\r\n {\r\n return moment(value).format('HH:mm');\r\n }\r\n /*\r\n * If in week\r\n * e.g \"Tuesday\"\r\n */\r\n else if ( diff < (60 * 60 * 24 * 7 * 1000) )\r\n {\r\n return moment(value).format('dddd');\r\n }\r\n /*\r\n * If more than a week\r\n * e.g. 03/29/2016\r\n */\r\n else\r\n {\r\n return moment(value).calendar();\r\n }\r\n\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.login', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_login', {\r\n url : '/auth/login',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_login': {\r\n templateUrl: 'app/auth/login/login.html',\r\n controller: 'LoginController as vm' \r\n },\r\n 'content@app.LoginValidationError': {\r\n templateUrl: 'app/auth/login/ErrorPage.html',\r\n controller: 'LoginController as vm'\r\n }\r\n\r\n },\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('LoginBindingModel', 'loginData')\r\n }]\r\n },\r\n bodyClass: 'login',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n })\r\n .state('app.LoginValidationError', {\r\n url: '/auth/login/:ErrorMessage',\r\n views: {\r\n 'main@': {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller: 'MainController as vm'\r\n },\r\n 'content@app.LoginValidationError': {\r\n templateUrl: 'app/auth/login/ErrorPage.html',\r\n controller: 'LoginController as vm'\r\n }\r\n\r\n },\r\n bodyClass: 'login',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n })\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/login');\r\n\r\n //// Navigation\r\n //msNavigationServiceProvider.saveItem('auth', {\r\n // title : 'Authentication',\r\n // icon : 'icon-lock',\r\n // weight: 1\r\n //});\r\n\r\n //msNavigationServiceProvider.saveItem('auth.login', {\r\n // title : 'Login',\r\n // state : 'app.pages_auth_login',\r\n // weight: 1\r\n //});\r\n }\r\n\r\n})();\n'use strict';\r\nangular.module('app.auth.login')\r\n .factory('tokensManagerService', ['$http', 'ngAuthSettings', function ($http, ngAuthSettings) {\r\n\r\n var serviceBase = ngAuthSettings.apiServiceBaseUri;\r\n \r\n var tokenManagerServiceFactory = {};\r\n\r\n var _getRefreshTokens = function () {\r\n\r\n return $http.get(serviceBase + 'api/refreshtokens').then(function (results) {\r\n return results;\r\n });\r\n };\r\n\r\n var _deleteRefreshTokens = function (tokenid) {\r\n\r\n return $http.delete(serviceBase + 'api/refreshtokens/?tokenid=' + tokenid).then(function (results) {\r\n return results;\r\n });\r\n };\r\n\r\n tokenManagerServiceFactory.deleteRefreshTokens = _deleteRefreshTokens;\r\n tokenManagerServiceFactory.getRefreshTokens = _getRefreshTokens;\r\n\r\n return tokenManagerServiceFactory;\r\n\r\n}]);\n(function () {\r\n\r\n 'use strict';\r\n\r\n\r\n /**\r\n * Main module of the Fuse\r\n */\r\n angular\r\n .module('fuse', [\r\n\r\n // Core\r\n 'app.core',\r\n\r\n // Navigation\r\n 'app.navigation',\r\n\r\n // Toolbar\r\n 'app.toolbar',\r\n\r\n // Quick panel\r\n 'app.quick-panel',\r\n\r\n // MND-422 Add Accounts List application\r\n 'app.msportal',\r\n\r\n //Auth\r\n 'app.auth.login',\r\n\r\n //Auth Admin\r\n 'app.auth.adminLogin',\r\n\r\n //Forgot Password\r\n 'app.auth.forgot-password',\r\n\r\n //Auth.ResetPassword\r\n 'app.auth.changePassword',\r\n\r\n //Auth.ChangeUserName\r\n 'app.auth.changeUserName',\r\n\r\n //Auth.Forgot User Name\r\n 'app.auth.forgotUserName',\r\n\r\n // Change email\r\n 'app.auth.changeEmail',\r\n 'app.auth.confirmChangeEmail',\r\n\r\n //Register\r\n 'app.auth.register',\r\n\r\n //Admin\r\n //'app.admin',\r\n\r\n 'app.auth.reset-password',\r\n\r\n 'app.auth.confirm-user',\r\n\r\n 'app.auth.reset-user',\r\n\r\n 'app.chart',\r\n\r\n 'app.chartdaily',\r\n\r\n 'app.chartinterval',\r\n\r\n 'app.chartmonthly',\r\n\r\n //Utility Contact Information\r\n 'app.utility.contact',\r\n\r\n //Utility Location\r\n 'app.utility.location',\r\n\r\n 'xeditable',\r\n\r\n 'angularPayments',\r\n\r\n 'aa.formExtensions',\r\n\r\n 'aa.formExternalConfiguration',\r\n\r\n 'aa.notify',\r\n\r\n 'ngSanitize',\r\n\r\n 'ui.select',\r\n\r\n 'ngIdle',\r\n\r\n 'ui.mask'\r\n ])\r\n\r\n //TODO: This service should be move to its own \"service\" file\r\n // MND-422 Add Service for data retrieval\r\n .service('genericService', ['$http', '$rootScope', '$cacheFactory', function ($http, $rootScope, $cacheFactory) {\r\n\r\n var serviceBase = '/Sedc.Multiservice.Consumer.WebApi/api/';\r\n //var serviceBase = 'https://10.1.0.57/Sedc.Multiservice.Consumer.WebApi/api/'; //DevV14\r\n //var serviceBase = 'https://10.1.0.58/Sedc.Multiservice.Consumer.WebApi/api/'; //QCV14\r\n //var serviceBase = 'https://10.204.0.44/Sedc.Multiservice.Consumer.WebApi/api/'; //DevV15\r\n //var serviceBase = 'https://10.204.0.45/Sedc.Multiservice.Consumer.WebApi/api/'; //QCV15\r\n //var serviceBase = 'http://localhost:59559/api/';\r\n\r\n $rootScope.serviceBase = serviceBase;\r\n var httpCache = $cacheFactory.get('$http');\r\n\r\n //REVIEW: Methods: Pascal Case\r\n this.get = function (url) {\r\n return $http.get(serviceBase + url, { cache: true });\r\n }\r\n\r\n this.post = function (url, obj) {\r\n httpCache.remove(serviceBase + url);\r\n return $http.post(serviceBase + url, obj, { cache: false });\r\n };\r\n\r\n this.put = function (url, objId, obj) {\r\n httpCache.remove(serviceBase + url + objId);\r\n return $http.put(serviceBase + url + objId, obj, { cache: false });\r\n }\r\n\r\n this.nullToBlank = function (possibleNull, withComma) {\r\n if (!possibleNull)\r\n return \"\";\r\n else\r\n if (!withComma)\r\n return possibleNull + \" \";\r\n else\r\n return possibleNull + \", \";\r\n };\r\n\r\n this.getIndexOfPropertyValue = function (array, prop, value) {\r\n for (var i = 0; i < array.length; i += 1) {\r\n if (array[i][prop] === value) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n this.useProperty = function (prop) {\r\n return function (a, b) {\r\n if (a[prop] > b[prop]) {\r\n return 1;\r\n } else if (a[prop] < b[prop]) {\r\n return -1;\r\n }\r\n return 0;\r\n }\r\n }\r\n\r\n }])\r\n\r\n .service('commonService', ['$filter', '$http', '$q', 'genericService', '$mdToast', '$mdDialog', '$rootScope', '$state', function ($filter, $http, $q, genericService, $mdToast, $mdDialog, $rootScope, $state) {\r\n\r\n\r\n var convFeeController = 'ConFee/';\r\n var __this = this;\r\n\r\n this.GenerateKeys = function (url) {\r\n return genericService.get(url + '12');\r\n }\r\n\r\n this.FormatPhoneNumber = function (phoneNumber) {\r\n var phoneNo = phoneNumber.substring(0, 3) + '-' + phoneNumber.substring(3, 6) + '-' + phoneNumber.substring(6);\r\n return phoneNo;\r\n }\r\n\r\n this.Encrypt = function (str, key, iv) {\r\n\r\n var Key = CryptoJS.enc.Utf8.parse(key);\r\n var IV = CryptoJS.enc.Utf8.parse(iv);\r\n\r\n var encryptedText = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(str), Key, { iv: IV, keySize: 128 / 8, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\r\n\r\n //This will change depending on the actual fields needed to be encrypted\r\n\r\n return encryptedText.toString();\r\n }\r\n\r\n this.Decrypt = function (str, key, iv) {\r\n var Key = CryptoJS.enc.Utf8.parse(key);\r\n var IV = CryptoJS.enc.Utf8.parse(iv);\r\n\r\n var decrypted = CryptoJS.AES.decrypt(str, Key, {\r\n keySize: 128 / 8,\r\n iv: IV,\r\n mode: CryptoJS.mode.CBC,\r\n padding: CryptoJS.pad.Pkcs7\r\n });\r\n\r\n return decrypted.toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n this.LoadConvFee = function (obj) {\r\n return genericService.post(convFeeController, obj);\r\n\r\n }\r\n\r\n\r\n this.handleError = function (err, customMessage) {\r\n var errors = [];\r\n var message = '';\r\n\r\n if (err) {\r\n if (err.data) {\r\n if (err.data.error_description) {\r\n if (err.data.error_uri != null) {\r\n message = err.data.error_description;\r\n } else\r\n errors.push(err.data.error_description);\r\n }\r\n else if (err.data.modelState) {\r\n for (var key in err.data.modelState) {\r\n for (var i = 0; i < err.data.modelState[key].length; i++) {\r\n errors.push(err.data.modelState[key][i]);\r\n }\r\n }\r\n }\r\n else if (err.status != null) {\r\n switch (err.status) {\r\n case -1: //request not sent\r\n errors.push('Could not connect to server.');\r\n break;\r\n case 403: //forbidden\r\n errors.push('Forbidden: ' + err.data);\r\n break;\r\n case 500: //Internal Server Error\r\n if (err.data.Message != null) {\r\n errors.push(err.data.Message);\r\n }\r\n else {\r\n errors.push(err.data);\r\n }\r\n $state.go('app.msportal.accounts');\r\n break;\r\n default:\r\n if (err.data.Message != null) {\r\n errors.push(err.data.Message);\r\n }\r\n else {\r\n errors.push(err.data);\r\n }\r\n }\r\n }\r\n else if (err.data.Message != null) {\r\n errors.push(err.data.Message);\r\n }\r\n else if (customMessage) {\r\n errors.push(customMessage);\r\n }\r\n else {\r\n errors.push(\"Internal error, please try again later!\");\r\n }\r\n\r\n }\r\n else {\r\n if (err.status == -1) {\r\n errors.push('Could not connect to server.');\r\n } else if (customMessage) {\r\n errors.push(customMessage);\r\n } else {\r\n errors.push(\"Internal error, please try again later!\");\r\n }\r\n }\r\n } else if (customMessage) {\r\n errors.push(customMessage);\r\n } else {\r\n errors.push(\"Internal error, please try again later!\");\r\n }\r\n\r\n if (errors.length != null && errors.length > 0) {\r\n message = errors.join(\"
\")\r\n }\r\n\r\n __this.displayError(message);\r\n\r\n }\r\n\r\n this.loadSmartAppConfig = function (forceLoad) {\r\n var deferred = $q.defer();\r\n if ($rootScope.smartAppConfig && $rootScope.smartAppConfig.length > 0 && forceLoad !== true) {\r\n deferred.resolve();\r\n } else {\r\n\r\n var promiseGet = genericService.get(\"Settings?DeviceType=WEBOS&HardwareId=\");\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.Parameters = pl.data.Response;\r\n $rootScope.Parameters['ShowConvCCFlag'] = pl.data.ShowConvCCFlag;\r\n $rootScope.Parameters['ShowConvECFlag'] = pl.data.ShowConvECFlag;\r\n\r\n var promiseGetConfig = genericService.get('SmartAppConfig/');\r\n promiseGetConfig.then(function (pl) {\r\n $rootScope.smartAppConfig = pl.data;\r\n //----------------------------------------\r\n\r\n var promiseGetLocations = genericService.get('OfficeLocation/');\r\n promiseGetLocations.then(function (pl) {\r\n $rootScope.utilityOffices = pl.data;\r\n deferred.resolve();\r\n },\r\n function (errorPl) {\r\n genericService.closeNotifier();\r\n console.log('failure loading Offices', errorPl);\r\n deferred.reject();\r\n })\r\n //----------------------------------------\r\n },\r\n function (errorPl) {\r\n console.log('failure loading Smart App Config', errorPl);\r\n deferred.reject();\r\n })\r\n },\r\n function (errorPl) {\r\n console.log('failure loading Settings', errorPl);\r\n deferred.reject();\r\n })\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n this.loadAccountDetails = function (acctNo) {\r\n var deferred = $q.defer();\r\n if ($rootScope.hasAlert == null || $rootScope.accountStatus == null) {\r\n var promiseGetConfig = genericService.get('Account/Services/' + acctNo);\r\n promiseGetConfig.then(function (pl) {\r\n $rootScope.accountStatus = pl.data.Status;\r\n\r\n genericService.get(\"Alerts/GetAlertRegDetail/\" + acctNo)\r\n .then(function (pl) {\r\n if (pl.data.length > 0) {\r\n $rootScope.hasAlert = true;\r\n }\r\n else {\r\n $rootScope.hasAlert = false;\r\n }\r\n deferred.resolve();\r\n },\r\n function (errorpl) { deferred.reject() });\r\n\r\n }, function () {\r\n deferred.reject();\r\n })\r\n\r\n } else {\r\n deferred.resolve();\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n this.displayError = function (message) {\r\n\r\n $mdToast.show({\r\n template: '
' + message + '
',\r\n position: \"top\",\r\n hideDelay: 3000\r\n });\r\n };\r\n\r\n this.showPasswordHelp = function () {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('')\r\n .htmlContent(\r\n 'Password must contain the following:' +\r\n '
    ' +\r\n '
  • at least one lowercase letter
  • ' +\r\n '
  • at least one uppercase letter
  • ' +\r\n '
  • at least one number
  • ' +\r\n '
  • at least one special character
  • ' +\r\n '
  • 6 characters or more
  • ' +\r\n '
'\r\n )\r\n .ariaLabel('Password Requirements')\r\n .ok('Close')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n }\r\n\r\n this.viewPDF = function (url) {\r\n var mbrsep = getParameterByName(\"EAccount\", url);\r\n var eType = getParameterByName(\"EType\", url);\r\n var eData = getParameterByName(\"EData\", url).split('-');\r\n var date = eData[1].substring(3, eData[1].length) + '-' + eData[2] + '-' + eData[3].substring(0, 2);\r\n var id = \"\";\r\n\r\n var serviceURL = \"\";\r\n\r\n if (eType == 1 || eType == 51) {\r\n id = mbrsep;\r\n }\r\n else if (eType == 2 || eType == 52) {\r\n id = mbrsep + 'D';\r\n }\r\n\r\n serviceURL = 'Bills/' + id + '/PDF/' + date;\r\n\r\n var promiseGet = genericService.get(serviceURL);\r\n promiseGet.then(function (pl) {\r\n var pdfResult = pl.data;\r\n if (pdfResult.successFlag === false) {\r\n //genericService.Notifier(\"! For billdate \" + billdate + \" : \" + pdfResult.DisplayMessage);\r\n //$scope.isLoading = false;\r\n $rootScope.rootscopeLoading = false;\r\n showAlert('Cannot Load PDF!', pdfResult.DisplayMessage);\r\n }\r\n else {\r\n if (!pdfResult.pdfBytes) {\r\n //genericService.Notifier(\"! PDF is not yet available for billdate \" + billdate);\r\n //$scope.isLoading = false;\r\n $rootScope.rootscopeLoading = false;\r\n showAlert('Cannot Load PDF!', \"PDF is not yet available for the selected billdate.\");\r\n }\r\n else {\r\n //genericService.Notifier(\"
Downloading PDF bill...\", 3000);\r\n\r\n // Decode the 64string\r\n var byteCharacters = atob(pdfResult.pdfBytes);\r\n // Convert to bytes\r\n var byteNumbers = new Array(byteCharacters.length);\r\n for (var i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n var byteArray = new Uint8Array(byteNumbers);\r\n\r\n // become a blob. :O\r\n var actualPdfFile = new Blob([byteArray], { type: \"application/pdf\" });\r\n //var myFilename = $scope.MemberNo + \"_\" + billdate.replace(/\\//g, \"-\") + \".pdf\";\r\n var fileURL = URL.createObjectURL(actualPdfFile);\r\n //$scope.isLoading = false;\r\n $rootScope.rootscopeLoading = false;\r\n //$window.open(fileURL);\r\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\r\n window.navigator.msSaveOrOpenBlob(actualPdfFile); //FOR IE\r\n }\r\n else {\r\n window.open(fileURL);\r\n }\r\n\r\n //$scope.content = $sce.trustAsResourceUrl(fileURL);\r\n $rootScope.content = $sce.trustAsResourceUrl(fileURL);\r\n }\r\n }\r\n },\r\n function (errorpl) {\r\n commonService.handleError(errorpl);\r\n });\r\n }\r\n\r\n function getParameterByName(name, url) {\r\n if (!url) url = window.location.href;\r\n name = name.replace(/[\\[\\]]/g, \"\\\\$&\");\r\n var regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\"),\r\n results = regex.exec(url);\r\n if (!results) return null;\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\r\n }\r\n\r\n this.showAlert = function (title, messages, ev) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(messages)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n .targetEvent(ev)\r\n );\r\n }\r\n\r\n this.simpleAlertDialog = function (dialogContent) {\r\n var dialog = dialogContent;\r\n\r\n return $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n }).clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(dialog.title)\r\n .textContent(dialog.message)\r\n .ariaLabel(dialog.title)\r\n .ok(dialog.buttonLabel)\r\n .targetEvent(dialog.ev)\r\n };\r\n this.alertDialog = function (dialogContent) {\r\n var dialog = dialogContent;\r\n dialog.confirmButtonLabel = dialog.confirmButtonLabel === undefined ? \"OK\" : dialog.confirmButtonLabel;\r\n\r\n return $mdDialog.alert({\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n template:\r\n '' +\r\n '

' + dialog.title + '

' +\r\n ' ' + dialog.message + ' ' +\r\n ' ' +\r\n ' ' + dialog.confirmButtonLabel + ' ' +\r\n ' ' +\r\n '
',\r\n controller: ['$scope', '$mdDialog', function ($scope, $mdDialog) {\r\n $scope.confirm = function () {\r\n $mdDialog.hide();\r\n };\r\n }]\r\n });\r\n };\r\n this.confirmDialog = function (dialogContent) {\r\n var dialog = dialogContent;\r\n dialog.cancelButtonLabel = dialog.cancelButtonLabel === undefined ? \"CANCEL\" : dialog.cancelButtonLabel;\r\n dialog.confirmButtonLabel = dialog.confirmButtonLabel === undefined ? \"OK\" : dialog.confirmButtonLabel;\r\n\r\n return $mdDialog.confirm({\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n template:\r\n '' +\r\n '

' + dialog.title + '

' +\r\n ' ' + dialog.message + ' ' +\r\n ' ' +\r\n '\t ' + dialog.cancelButtonLabel + ' ' +\r\n ' ' + dialog.confirmButtonLabel + ' ' +\r\n ' ' +\r\n '
',\r\n controller: ['$scope', '$mdDialog', function ($scope, $mdDialog) {\r\n $scope.cancel = function () {\r\n $mdDialog.cancel();\r\n };\r\n $scope.confirm = function () {\r\n $mdDialog.hide();\r\n };\r\n }]\r\n });\r\n };\r\n this.dateLocaleByDay = {\r\n formatDate: function (date) {\r\n var m = moment(date);\r\n return m.isValid() ? m.format(\"MM/DD/YYYY\") : '';\r\n }\r\n };\r\n this.dateLocaleByMonth = {\r\n formatDate: function (date) {\r\n var m = moment(date);\r\n return m.isValid() ? m.format(\"MMMM YYYY\") : '';\r\n }\r\n };\r\n this.dateLocaleExpDate = {\r\n formatDate: function (date) {\r\n var m = moment(date);\r\n return m.isValid() ? m.format(\"MM / YYYY\") : '';\r\n }\r\n };\r\n this.padLeft = function (text, length, character) {\r\n var pad = \"\";\r\n for (var i = 0; i < length - text.length; i++) {\r\n pad += character;\r\n }\r\n return pad + text;\r\n }\r\n this.removePadLeft = function (text, character) {\r\n var actualText = \"\";\r\n var i = 0;\r\n for (i = 0; i < text.length; i++) {\r\n if (text[i] !== character) {\r\n actualText = text.substring(i);\r\n break;\r\n }\r\n }\r\n return actualText;\r\n }\n\n /**\r\n * Determine the width class for columns with decimal values based on the value with most characters.\r\n * @param {JSON} data List of object that contains the decimal values.\r\n * @param {PropertyKey} key The key name of the property with decimal values.\r\n * @param {number} adjustment Number of pixel to be adjust on the width. should be divisible by 10.\r\n * @returns class for the width.\r\n */\r\n this.getNumericColumnWidth = function (data, key, adjustment, minimumWidth) {\r\n // Get the hightest and lowest value of property from the list.\r\n var min = Math.min.apply(Math, data.map(function (item) { return item[key]; }));\r\n var max = Math.max.apply(Math, data.map(function (item) { return item[key]; }));\r\n\r\n // Remove special characters from the value to get the digits only\r\n min = ($filter('number')(min, 2)).replace(\"-\", \"\").replace(\".\", \"\").replace(\",\", \"\").replace(\",\", \"\");\r\n max = ($filter('number')(max, 2)).replace(\"-\", \"\").replace(\".\", \"\").replace(\",\", \"\").replace(\",\", \"\");\r\n\r\n // Determine which value has the most digits.\r\n var digits = max.length;\r\n if (min.length > max.length) {\r\n digits = min.length;\r\n }\r\n\r\n // Determine the width based on the digits\r\n var width = (digits * 10)\r\n if (digits == 4) {\r\n width = 50;\r\n } else if (digits == 3) {\r\n width = 40;\r\n }\r\n\r\n // Apply the adjustment if defined.\r\n if (adjustment !== undefined) {\r\n width += adjustment;\r\n }\r\n\r\n if (minimumWidth > width) {\r\n return minimumWidth;\r\n } else {\r\n return width;\r\n }\r\n }\r\n }])\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n /**\r\n * Main module of the Fuse\r\n */\r\n angular\r\n .module('fuse')\r\n .service('Session', function () {\r\n this.create = function (userName, userRole) {\r\n ///this.id = sessionId;\r\n this.userId = userName;\r\n this.userRole = userRole;\r\n };\r\n this.destroy = function () {\r\n //this.id = null;\r\n this.userId = null;\r\n this.userRole = null;\r\n };\r\n })\r\n\r\n\r\n})();\n'use strict';\r\nangular.module('app.auth.login')\r\n .factory('authService', ['$http', '$q', 'localStorageService', 'ngAuthSettings', 'genericService', '$rootScope', '$log', 'Session', 'commonService', 'Idle', '$mdDialog', 'msNavigationService', '$state', '$cacheFactory', function ($http, $q, localStorageService, ngAuthSettings, genericService, $rootScope, $log, Session, commonService, Idle, $mdDialog, msNavigationService, $state, $cacheFactory) {\r\n\r\n var serviceBase = ngAuthSettings.apiServiceBaseUri;\r\n var authServiceFactory = {};\r\n var requestSettings = false;\r\n var EntitiesValidatorsURL = 'EntityValidators/';\r\n var _isAdmin = true;\r\n var _roleType;\r\n var _customerUserName = '';\r\n\r\n var ProfileStat = false;\r\n var BillHistStat = false;\r\n var PaymentHistStat = false;\r\n var UsageGraphStat = false;\r\n var EbillEnabled = false;\r\n var AlertsEnabled = false;\r\n var CCDraftsEnabled = false;\r\n var BankDraftsEnabled = false;\r\n var EDelinquentEnabled = false;\r\n var DepositsEnabled = false;\r\n var BudgetBillEnabled = false;\r\n var LevelizedBillEnabled = false;\n var isActive = false;\r\n var IsPPM = false;\r\n\r\n var _authentication = {\r\n isAuth: false,\r\n userName: \"\",\r\n roleType: \"\",\r\n useRefreshTokens: true,\r\n CustomerID: \"\",\r\n staySignedIn: false,\r\n email: \"\",\r\n isCalled: false\r\n };\r\n\r\n var _adminAuthentication = {\r\n isAuth: false,\r\n userName: \"\",\r\n roleType: \"\",\r\n useRefreshTokens: true,\r\n CustomerID: \"\",\r\n staySignedIn: false,\r\n email: \"\",\r\n isCalled: false\r\n }\r\n\r\n var getAuthorizationData = function () {\r\n return localStorageService.get('authorizationData');\r\n }\r\n\r\n var _isLoggedIn = function () {\r\n return getAuthorizationData() != null;\r\n }\r\n\r\n var _saveRegistration = function (registration) {\r\n return $http.post(serviceBase + 'api/accounts/create', registration);\r\n };\r\n\r\n var _forgotPassword = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/forgotpassword', user);\r\n\r\n };\r\n\n var _lockoutUser = function (loginData) {\n var user = {\n Username: loginData.Username,\n Password: \"\"\r\n };\n return $http.post(serviceBase + 'api/accounts/lockoutuser', user);\r\n }\r\n\r\n var _changePassword = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/changepassword', user);\r\n };\r\n var _changeUserName = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/changeusername', user);\r\n\r\n };\r\n\r\n var _changeEmail = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/ChangeEmail', user);\r\n };\r\n var _confirmChangeEmail = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/confirmemailencode', user);\r\n };\r\n\n var _resendEmail = function (user) {\r\n return $http.post(serviceBase + 'api/accounts/resendemail', user);\r\n };\n\r\n var _resetPassword = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/resetpassword', user);\r\n\r\n };\r\n\r\n var _forgotUserName = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/forgotusername', user);\r\n\r\n };\r\n\r\n var _validateUserCode = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/validateusercode', user);\r\n\r\n };\r\n\r\n var _resetPasswordEncode = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/resetpasswordencode', user);\r\n\r\n };\r\n\r\n var _confirmEmailEncode = function (user) {\r\n\r\n return $http.post(serviceBase + 'api/accounts/confirmemailencode', user);\r\n\r\n };\r\n\r\n\r\n var _login = function (loginData) {\r\n\r\n var data = \"grant_type=password&username=\" + encodeURIComponent(loginData.Username) + \"&Password=\" + encodeURIComponent(loginData.Password);\r\n\r\n if (loginData.useRefreshTokens) {\r\n data = data + \"&client_id=\" + ngAuthSettings.clientId + \"&client_secret=\" + ngAuthSettings.clientSecret;\r\n }\r\n\r\n var deferred = $q.defer();\r\n\r\n $http.post(serviceBase + 'oauth/token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).then(function (response) {\r\n\r\n response.data.roleType = (response.data.roleType || '')\r\n\r\n if (loginData.useRefreshTokens) {\r\n //window.localStorage.setItem(\"authorizationData\", { token: response.data.access_token, userName: loginData.username, refreshToken: response.refresh_token, useRefreshTokens: true });\r\n localStorageService.set('authorizationData', { token: response.data.access_token, userName: response.data.userName, refreshToken: response.data.refresh_token, useRefreshTokens: true, staySignedIn: loginData.staySignedIn, encryptedUsername: loginData.Username, roleType: response.data.roleType, email: response.data.email });\r\n }\r\n else {\r\n //window.localStorage.setItem(\"authorizationData\", { token: response.data.access_token, userName: loginData.username, refreshToken: \"\", useRefreshTokens: false});\r\n localStorageService.set('authorizationData', { token: response.data.access_token, userName: response.data.userName, refreshToken: \"\", useRefreshTokens: false, staySignedIn: loginData.staySignedIn, encryptedUsername: loginData.Username, roleType: response.data.roleType, email: response.data.email });\r\n }\r\n\r\n $rootScope.previousUserName = response.data.userName.toLowerCase();\r\n\r\n if (response.data.roleType == \"Admin\") {\r\n _adminAuthentication.isAuth = true;\r\n _adminAuthentication.userName = response.data.userName;\r\n _adminAuthentication.roleType = response.data.roleType;\r\n _adminAuthentication.useRefreshTokens = loginData.useRefreshTokens;\r\n _adminAuthentication.CustomerID = getClaimsFromToken().CustomerID;\r\n _adminAuthentication.staySignedIn = loginData.staySignedIn;\r\n _adminAuthentication.email = response.data.email;\r\n\r\n localStorageService.set('authorizationUserData', { token: response.data.access_token, userName: \"\", refreshToken: response.data.refresh_token, useRefreshTokens: true, staySignedIn: loginData.staySignedIn, encryptedUsername: \"\", roleType: \"\", email: \"\" });\r\n\r\n Session.create(_adminAuthentication.userName);\r\n }\r\n else {\r\n _authentication.isAuth = true;\r\n _authentication.userName = response.data.userName;\r\n _authentication.roleType = response.data.roleType;\r\n _authentication.useRefreshTokens = loginData.useRefreshTokens;\r\n _authentication.CustomerID = getClaimsFromToken().CustomerID;\r\n _authentication.staySignedIn = loginData.staySignedIn;\r\n _authentication.email = response.data.email;\r\n\r\n _customerUserName = response.data.userName;\r\n\r\n Session.create(_authentication.userName);\r\n }\r\n\r\n authServiceFactory.roleType = response.data.roleType;\r\n authServiceFactory.isAuth = true;\r\n //_customerUserName = response.data.userName;\r\n\r\n Idle.watch();\r\n\r\n requestSettings = true;\r\n _getSettings();\r\n //getKeyandIV();\r\n _setNavigationItems();\r\n deferred.resolve(response);\r\n\r\n }, function (err, status) {\r\n _logOut();\r\n deferred.reject(err);\r\n });\r\n\r\n return deferred.promise;\r\n\r\n };\r\n\r\n var _logOut = function (isLogOutPressed) {\r\n isLogOutPressed = isLogOutPressed || false;\r\n\r\n if ($rootScope.showAdminToolbar) {\r\n if (isLogOutPressed) {\r\n _authentication.userName = '';\r\n authServiceFactory.authentication.userName = '';\r\n }\r\n else {\r\n _authentication.userName = $rootScope.customerUserName;\r\n authServiceFactory.authentication.userName = $rootScope.customerUserName;\r\n }\r\n }\r\n else {\r\n _authentication.userName = '';\r\n authServiceFactory.authentication.userName = '';\r\n }\r\n\r\n authServiceFactory.isAuth = false;\r\n authServiceFactory.roleType = '';\r\n //_authentication.userName = '';\r\n _authentication.useRefreshTokens = false;\r\n _authentication.roleType = '';\r\n _authentication.CustomerID = '';\r\n _authentication.staySignedIn = false;\r\n _authentication.email = '';\r\n\r\n _adminAuthentication.isAuth = false;\r\n _adminAuthentication.userName = '';\r\n _adminAuthentication.roleType = '';\r\n _adminAuthentication.useRefreshTokens = false;\r\n _adminAuthentication.CustomerID = '';\r\n _adminAuthentication.staySignedIn = false;\r\n _adminAuthentication.email = '';\r\n\r\n //authServiceFactory.authentication.userName = '';\r\n authServiceFactory.authentication.useRefreshTokens = false;\r\n authServiceFactory.authentication.roleType = '';\r\n authServiceFactory.authentication.CustomerID = '';\r\n authServiceFactory.authentication.staySignedIn = false;\r\n authServiceFactory.authentication.email = '';\r\n\r\n authServiceFactory.adminAuthentication.isAuth = false;\r\n authServiceFactory.adminAuthentication.userName = '';\r\n authServiceFactory.adminAuthentication.roleType = '';\r\n authServiceFactory.adminAuthentication.useRefreshTokens = false;\r\n authServiceFactory.adminAuthentication.CustomerID = '';\r\n authServiceFactory.adminAuthentication.staySignedIn = false;\r\n authServiceFactory.adminAuthentication.email = '';\r\n\r\n //window.localStorage.removeItem('authorizationData');\r\n localStorageService.remove('authorizationData');\r\n localStorageService.remove('authorizationUserData');\r\n Idle.unwatch();\r\n\r\n };\r\n\r\n var _fillAuthData = function () {\r\n //var authData = window.localStorage.getItem('authorizationData');\r\n var authData = localStorageService.get('authorizationData');\r\n var authUserData = localStorageService.get('authorizationUserData');\r\n if (authData) {\r\n $rootScope.previousUserName = authData.userName.toLowerCase();\r\n\r\n if (authData.roleType == \"Admin\") {\r\n _adminAuthentication.isAuth = true;\r\n _adminAuthentication.userName = authData.userName;\r\n _adminAuthentication.roleType = authData.roleType;\r\n _adminAuthentication.useRefreshTokens = authData.useRefreshTokens;\r\n _adminAuthentication.CustomerID = '';\r\n _adminAuthentication.staySignedIn = authData.staySignedIn;\r\n _adminAuthentication.email = authData.email;\r\n } else {\r\n _authentication.isAuth = true;\r\n _authentication.userName = authData.userName;\r\n _authentication.roleType = authData.roleType;\r\n _authentication.useRefreshTokens = authData.useRefreshTokens;\r\n _authentication.CustomerID = getClaimsFromToken().CustomerID;\r\n _authentication.staySignedIn = authData.staySignedIn;\r\n _authentication.email = authData.email;\r\n }\r\n\r\n authServiceFactory.roleType = authData.roleType;\r\n authServiceFactory.isAuth = true;\r\n\r\n if (authUserData) {\r\n _authentication.isAuth = true;\r\n _authentication.userName = authUserData.userName;\r\n _authentication.roleType = '';\r\n _authentication.useRefreshTokens = authUserData.useRefreshTokens;\r\n _authentication.CustomerID = authUserData.customerId;\r\n _authentication.staySignedIn = authUserData.staySignedIn;\r\n _authentication.email = authUserData.email;\r\n }\r\n }\r\n _setNavigationItems();\r\n };\r\n\r\n var _refreshToken = function () {\r\n var deferred = $q.defer();\r\n\r\n //var authData = window.localStorage.getItem('authorizationData');\r\n var authData = localStorageService.get('authorizationData');\r\n\r\n if (authData) {\r\n\r\n if (authData.useRefreshTokens) {\r\n\r\n var data = \"grant_type=refresh_token&refresh_token=\" + authData.refreshToken + \"&client_id=\" + ngAuthSettings.clientId;\r\n\r\n //window.localStorage.removeItem('authorizationData');\r\n localStorageService.remove('authorizationData');\r\n\r\n $http.post(serviceBase + 'oauth/token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).then(function (response) {\r\n\r\n //window.localStorage.setItem('authorizationData', { token: response.access_token, userName: response.userName, refreshToken: response.refresh_token, useRefreshTokens: true });\r\n localStorageService.set('authorizationData', { token: response.access_token, userName: response.userName, refreshToken: response.refresh_token, useRefreshTokens: true });\r\n\r\n deferred.resolve(response);\r\n\r\n }, function (err) {\n _logOut(true);\r\n deferred.reject(err);\n });\r\n }\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n var _unlockAccount = function (UserName) {\r\n return $http.post(serviceBase + 'api/accounts/unlockaccount', UserName);\r\n };\n\r\n function urlBase64Decode(str) {\r\n var output = str.replace('-', '+').replace('_', '/');\r\n switch (output.length % 4) {\r\n case 0:\r\n break;\r\n case 2:\r\n output += '==';\r\n break;\r\n case 3:\r\n output += '=';\r\n break;\r\n default:\r\n throw 'Illegal base64url string!';\r\n }\r\n return window.atob(output);\r\n }\r\n\r\n function getClaimsFromToken() {\r\n //var authData = window.localStorage.getItem('authorizationData');\r\n var authData = localStorageService.get('authorizationData');\r\n var user = {};\r\n if (typeof authData !== 'undefined') {\r\n var encoded = authData.token.split('.')[1];\r\n user = JSON.parse(urlBase64Decode(encoded));\r\n }\r\n return user;\r\n }\r\n\r\n document.addEventListener(\"deviceready\", onDeviceReady, false);\r\n function onDeviceReady() {\r\n $rootScope.Parameters = {};\r\n $rootScope.utilityOffices = {};\r\n _getSettings();\r\n }\r\n\r\n var _getSettings = function (refreshed) {\r\n refreshed = refreshed || false;\r\n if (requestSettings || refreshed) {\r\n requestSettings = false;\r\n //var promiseGet = genericService.get(\"Settings?DeviceType=\" + $rootScope.deviceType + \"&HardwareId=\" + $rootScope.HardwareId);\r\n var promiseGet = genericService.get(\"Settings?DeviceType=WEBOS&HardwareId=\");\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.Parameters = pl.data.Response;\r\n $rootScope.Parameters['ShowConvCCFlag'] = pl.data.ShowConvCCFlag;\r\n $rootScope.Parameters['ShowConvECFlag'] = pl.data.ShowConvECFlag;\r\n\r\n var promiseGetConfig = genericService.get('SmartAppConfig/');\r\n promiseGetConfig.then(function (pl) {\r\n $rootScope.smartAppConfig = pl.data;\r\n //----------------------------------------\r\n\r\n var promiseGetLocations = genericService.get('OfficeLocation/');\r\n promiseGetLocations.then(function (pl) {\r\n $rootScope.utilityOffices = pl.data;\r\n return true;\r\n },\r\n function (errorPl) {\r\n genericService.closeNotifier();\r\n console.log('failure loading Offices', errorPl);\r\n return false;\r\n })\r\n //----------------------------------------\r\n },\r\n function (errorPl) {\r\n $log.error('failure loading Smart App Config', errorPl);\r\n return false;\r\n })\r\n },\r\n function (errorPl) {\r\n $log.error('failure loading Settings', errorPl);\r\n return false;\r\n })\r\n\r\n }\r\n };\r\n //function getKeyandIV() {\r\n // //Get Key and IV to be used for encryption. Same Key and IV would be used to decrypt it on the server side\r\n // var promiseGet = commonService.GenerateKeys('Common/');\r\n // promiseGet.then(function (pl) {\r\n // $rootScope.CryptData = pl.data;//Key and IV\r\n // });\r\n //}\r\n\r\n function IsAuthenticated() {\r\n return _authentication.isAuth;\r\n };\r\n\r\n _authentication.isAuthenticated = function () {\r\n return !!Session.userId;\r\n };\r\n\r\n //TODO:Elaborate more\r\n _authentication.isAuthorized = function (authorizedRoles) {\r\n if (!angular.isArray(authorizedRoles)) {\r\n authorizedRoles = [authorizedRoles];\r\n }\r\n return (_authentication.isAuthenticated() &&\r\n authorizedRoles.indexOf(Session.userRole) !== -1);\r\n };\r\n\r\n function _getEntityValidators(entityName, jsonModelName) {\r\n return genericService.get(EntitiesValidatorsURL + \"?entityName=\" + entityName + \"&jsonModelName=\" + jsonModelName + '&isForAuth=true');\r\n }\r\n\r\n function _showFloatingLogin() {\r\n $rootScope.loginDialogIsDisplayed = true;\r\n $mdDialog.show({\r\n templateUrl: 'app/auth/floating-login/floating_login.html',\r\n parent: angular.element(document.body),\r\n clickOutsideToClose: false,\r\n fullscreen: true,\r\n escapeToClose: false,\r\n controller: \"LoginController\",\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('LoginBindingModel', 'loginData')\r\n }]\r\n },\r\n\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n }).then(function (result) {\r\n $rootScope.loginDialogIsDisplayed = false;\r\n }, function (err) {\r\n $rootScope.loginDialogIsDisplayed = false;\r\n $log.error('Floating login form failed to open');\r\n });\r\n }\r\n\r\n var _setNavigationItems = function () {\r\n\r\n var forCustomer = false;\r\n var forAdmin = false;\r\n var showMenu = false;\r\n\r\n if (authServiceFactory.roleType == \"Admin\") {\r\n forAdmin = true;\r\n }\r\n else {\r\n forCustomer = true;\r\n }\r\n\r\n // Navigation\r\n msNavigationService.saveItem('fuse', {\r\n title: 'CUSTOMER SERVICES PORTAL',\r\n group: true,\r\n weight: 1,\r\n hidden: function () { return !forCustomer }\r\n });\r\n\r\n msNavigationService.saveItem('myAccount', {\r\n title: 'My Account',\r\n //icon: 'icon-account-multiple',\r\n weight: 2,\r\n group: true,\r\n hidden: function () {\r\n return ($state.current.name == 'app.msportal.admin.customers')\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('myAccount.accounts', {\r\n title: 'Accounts List',\r\n state: 'app.msportal.accounts',\r\n icon: 'icon-account-multiple',\r\n weight: 1,\r\n hidden: function () {\r\n return ($state.current.name == 'app.msportal.admin.customers')\r\n }\r\n\r\n });\r\n\r\n $rootScope.$on('isAccountSelected', function (event, data) {\n isActive = $rootScope.accountStatus === 'Active' || $rootScope.accountStatus === 'Active Prepaid';\r\n if (data.id) {\n var promiseGet = genericService.get('Account/GetAccount/' + data.id);\n promiseGet.then(function (pl) {\n IsPPM = pl.data.IsPPM === \"P\" ? true : false;\r\n });\n }\r\n \r\n showMenu = data.showMenu;\r\n var promiseGet = commonService.loadSmartAppConfig();\r\n promiseGet.then(function (pl) {\r\n for (var x = 0; x < $rootScope.smartAppConfig.length; x++) {\r\n if ($rootScope.smartAppConfig[x].ConfigId == '52') {\r\n ProfileStat = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '8') {\r\n BillHistStat = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '53') {\r\n PaymentHistStat = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '58') {\r\n UsageGraphStat = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '50') {\r\n EbillEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '51') {\r\n EDelinquentEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '59') {\r\n AlertsEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '87') {\r\n CCDraftsEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '88') {\r\n BankDraftsEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '107') {\r\n DepositsEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '48') {\r\n LevelizedBillEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n else if ($rootScope.smartAppConfig[x].ConfigId == '49') {\r\n BudgetBillEnabled = $rootScope.smartAppConfig[x].Value == 1 ? true : false;\r\n }\r\n }\r\n\r\n if (data.id) {\r\n var promiseGetAcct = commonService.loadAccountDetails(data.id);\r\n promiseGetAcct.then(function (pl) {\r\n //My Accounts\r\n msNavigationService.saveItem('myAccount.detail', {\r\n title: 'Service Details',\r\n state: 'app.msportal.service_detail',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-file-document',\r\n weight: 2,\r\n hidden: function () {\r\n return !showMenu\r\n }\r\n\r\n });\r\n\r\n //Payment\r\n msNavigationService.saveItem('myAccount.payment', {\r\n title: 'Payment',\r\n state: 'app.msportal.payment',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-cash',\r\n weight: 3,\r\n hidden: function () {\r\n return !showMenu\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('myAccount.profile', {\r\n title: 'Profile',\r\n state: 'app.msportal.profile',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-account-box-outline',\r\n weight: 4,\r\n hidden: function () {\r\n\r\n if (ProfileStat) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n\r\n });\r\n\r\n msNavigationService.saveItem('myAccount.deposits', {\r\n title: 'Deposits',\r\n state: 'app.msportal.deposits',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-credit-card',\r\n weight: 5,\r\n hidden: function () {\r\n\r\n if (DepositsEnabled) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n\r\n });\r\n\r\n msNavigationService.saveItem('billHistory', {\r\n title: 'Bill History',\r\n state: 'app.msportal.billHist',\r\n stateParams: { 'id': data.id },\r\n //icon: 'icon-content-paste',\r\n icon: 'icon-history',\r\n weight: 3,\r\n hidden: function () {\r\n\r\n if (BillHistStat) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('ppmAccountHistory', {\r\n title: 'Prepaid Account History',\r\n state: 'app.msportal.ppmAcctHist',\r\n stateParams: { 'id': data.id },\r\n //icon: 'icon-content-paste',\r\n icon: 'icon-calendar-text',\r\n weight: 3,\r\n hidden: function () {\n\r\n if (IsPPM) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('paymentHistory', {\r\n title: 'Payment History',\r\n state: 'app.msportal.paymentHist',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-content-paste',\r\n weight: 4,\r\n hidden: function () {\r\n\r\n if (PaymentHistStat) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('usageCharts', {\r\n title: 'Usage Charts',\r\n state: 'app.msportal.usageCharts',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-chart-line',\r\n weight: 5,\r\n hidden: function () {\r\n\r\n if (UsageGraphStat) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n\r\n\r\n //Payment Drafts\r\n msNavigationService.saveItem('paymentDrafts', {\r\n title: 'Payment Drafts',\r\n state: 'app.msportal.draft',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-file-multiple',\r\n weight: 6,\r\n hidden: function () {\r\n\r\n if ((CCDraftsEnabled || BankDraftsEnabled) && isActive && !IsPPM) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('billTypePreference', {\r\n title: 'E-Bill',\r\n state: 'app.msportal.billTypePreference',\r\n stateParams: { 'id': data.id },\r\n weight: 7,\r\n icon: 'icon-email',\r\n hidden: function () {\r\n\r\n if (EbillEnabled && !IsPPM) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n msNavigationService.saveItem('delinquentNotice', {\r\n title: 'E-Delinquent',\r\n state: 'app.msportal.delinquentNotice',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-alert-circle',\r\n weight: 8,\r\n hidden: function () {\r\n\r\n if (EDelinquentEnabled && !IsPPM) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n //Budget/Levelized Billing\r\n msNavigationService.saveItem('billing-levelized', {\r\n title: 'Budget/Levelized Billing',\r\n state: 'app.msportal.budget-levelized',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-chart-bar',\r\n weight: 9,\r\n hidden: function () {\r\n\r\n if ((BudgetBillEnabled || LevelizedBillEnabled) && isActive && !IsPPM) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n\r\n //Alerts & Reminders\r\n msNavigationService.saveItem('alerts', {\r\n title: 'Alerts & Reminders',\r\n state: 'app.msportal.alerts',\r\n stateParams: { 'id': data.id },\r\n icon: 'icon-bell',\r\n weight: 10,\r\n hidden: function () {\r\n\r\n if (AlertsEnabled && ($rootScope.hasAlert || $rootScope.accountStatus != 'Inactive')) {\r\n return !showMenu\r\n }\r\n\r\n return true;\r\n }\r\n });\r\n });\r\n }\r\n });\r\n\r\n\r\n });\r\n\r\n // Admin Navigation Items\r\n msNavigationService.saveItem('admindashboard', {\r\n title: 'ADMIN DASHBOARD',\r\n group: true,\r\n weight: 1,\r\n hidden: function () { return !forAdmin } //If multiple user roles have access to this item, you can do ...return (!forAdmin || !forCSR) , for example\r\n });\r\n\r\n msNavigationService.saveItem('admindashboard.customers', {\r\n title: 'Customers',\r\n state: 'app.msportal.admin.customers',\r\n icon: 'icon-file-multiple',\r\n weigth: 2,\r\n hidden: function () {\r\n return !forAdmin\r\n }\r\n });\r\n }\r\n var _changeEmailConfirmation = function (user) {\r\n return $http.post(serviceBase + 'api/accounts/changeemailconfirmation', user);\r\n }\r\n var _checkIsPortalEnabled = function (isLoggedIn, form, task) {\n var url = \"Settings?DeviceType=WEBOS&HardwareId=\";\n $cacheFactory.get('$http').remove($rootScope.serviceBase + url);\r\n var promiseGet = genericService.get(url);\r\n\r\n promiseGet.then(function (pl) {\r\n var parameters = pl.data.Response;\r\n $rootScope.isPortalEnabled = parameters.FourthParameters.FOURTHPARM_54 === 1;\r\n var isPortalAdmin = authServiceFactory.adminAuthentication.userName === 'portaladmin';\r\n if ($rootScope.isPortalEnabled || isPortalAdmin) {\r\n if (task !== null) {\r\n task();\r\n }\r\n } else {\r\n if (form !== null) {\r\n form.$aaFormExtensions.$changed = false;\r\n }\r\n commonService.showAlert('Service is currently unavailable due to maintenance.');\r\n\r\n var stateName = $state.current.name;\r\n if (stateName !== 'app.pages_auth_login' && stateName !== 'app.pages_auth_adminLogin') {\r\n var isAdmin = authServiceFactory.adminAuthentication.roleType === 'Admin';\r\n\r\n if (isLoggedIn) {\r\n _logOut(true);\r\n }\r\n if (isAdmin) {\r\n $state.go('app.pages_auth_adminLogin');\r\n }\r\n else {\r\n $state.go('app.pages_auth_login');\r\n } \r\n }\r\n }\r\n }, function () {\r\n\r\n });\r\n }\r\n var _deleteUser = function (user) {\r\n return $http.post(serviceBase + 'api/accounts/deleteuser', user);\r\n }\r\n //var tokenClaims = getClaimsFromToken();\r\n\r\n //authServiceFactory.isAuthorized = _isAuthorized;\r\n authServiceFactory.setNavigationItems = _setNavigationItems;\r\n authServiceFactory.saveRegistration = _saveRegistration;\r\n authServiceFactory.changePassword = _changePassword;\r\n authServiceFactory.changeUserName = _changeUserName;\r\n authServiceFactory.changeEmail = _changeEmail;\n authServiceFactory.changeEmailConfirmation = _changeEmailConfirmation;\n authServiceFactory.deleteUser = _deleteUser;\n authServiceFactory.resendEmail = _resendEmail;\r\n authServiceFactory.resetPassword = _resetPassword;\r\n authServiceFactory.forgotPassword = _forgotPassword;\n authServiceFactory.lockoutUser = _lockoutUser;\r\n authServiceFactory.login = _login;\r\n authServiceFactory.logOut = _logOut;\r\n authServiceFactory.fillAuthData = _fillAuthData;\r\n authServiceFactory.authentication = _authentication;\r\n authServiceFactory.refreshToken = _refreshToken;\r\n authServiceFactory.forgotUserName = _forgotUserName;\r\n authServiceFactory.validateUserCode = _validateUserCode;\r\n authServiceFactory.resetPasswordEncode = _resetPasswordEncode;\r\n authServiceFactory.confirmEmailEncode = _confirmEmailEncode;\r\n authServiceFactory.getSettings = _getSettings;\r\n authServiceFactory.getEntityValidators = _getEntityValidators;\r\n authServiceFactory.isLoggedIn = _isLoggedIn;\r\n authServiceFactory.showFloatingLogin = _showFloatingLogin;\r\n authServiceFactory.isAdmin = _isAdmin;\r\n authServiceFactory.roleType = \"\";\r\n authServiceFactory.adminAuthentication = _adminAuthentication;\r\n authServiceFactory.CheckIsPortalEnabled = _checkIsPortalEnabled;\r\n authServiceFactory.unlockAccount = _unlockAccount;\n\r\n return authServiceFactory;\r\n }]);\r\n\r\n\n'use strict';\r\nangular.module('app.auth.login')\r\n .factory('authInterceptorService', ['$q', '$injector', '$location', 'localStorageService', function ($q, $injector, $location, localStorageService) {\r\n\r\n var authInterceptorServiceFactory = {};\r\n\r\n var _request = function (config) {\r\n\r\n config.headers = config.headers || {};\r\n \r\n //var authData = window.localStorage.getItem('authorizationData');\r\n var authData = localStorageService.get('authorizationData');\r\n if (authData) {\r\n config.headers.Authorization = 'Bearer ' + authData.token;\r\n }\r\n\r\n return config;\r\n }\r\n \r\n var _responseError = function (rejection) {\r\n var deferred = $q.defer();\r\n\r\n switch (rejection.status) {\r\n case 401:\r\n var authService = $injector.get('authService');\r\n authService.refreshToken().then(function (response) {\r\n _retryHttpRequest(rejection.config, deferred);\r\n }, function () {\r\n authService.logOut();\r\n var state = $injector.get('$state');\r\n state.go('app.pages_auth_login');\r\n deferred.reject(rejection);\r\n });\r\n break;\r\n case 403:\r\n var state = $injector.get('$state');\r\n state.go('app.msportal.accounts');\r\n break;\r\n case 503:\r\n var state = $injector.get('$state');\r\n var authService = $injector.get('authService');\r\n var $rootScope = $injector.get('$rootScope');\r\n authService.logOut();\r\n if (state.current.name == 'app.page_loading_failed') {\r\n $rootScope.loadingProgress = false;\r\n } else {\r\n state.go('app.page_loading_failed', { resumeState: { name: 'app.pages_auth_login' } });\r\n }\r\n \r\n break;\r\n default:\r\n deferred.reject(rejection);\r\n break;\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n var _retryHttpRequest = function (config, deferred) {\r\n $http = $http || $injector.get('$http');\r\n $http(config).then(function (response) {\r\n deferred.resolve(response);\r\n }, function (response) {\r\n deferred.reject(response);\r\n });\r\n }\r\n\r\n authInterceptorServiceFactory.request = _request;\r\n authInterceptorServiceFactory.responseError = _responseError;\r\n\r\n return authInterceptorServiceFactory;\r\n}]);\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.reset-user', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_reset-user', {\r\n url : '/reset-user?uid&code',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_reset-user': {\r\n templateUrl: 'app/auth/reset-user/reset-user.html',\r\n controller : 'ResetUserController as vm'\r\n }\r\n },\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('ResetPasswordBindingModel', 'ResetPasswordBindingModel')\r\n }]\r\n },\r\n bodyClass : 'reset-user',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/reset-user');\r\n }\r\n\r\n})();\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope)\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.reset-user')\r\n .controller('ResetUserController', ResetUserController, function ($scope, $location, authService) { });\r\n\r\n /** @ngInject */\r\n function ResetUserController($scope, $location, authService, $rootScope, AUTH_EVENTS, $stateParams, $mdToast, Validator, commonService, $window)\r\n {\r\n $window.document.title = \"Reset Username - \" + document.getElementById(\"title\").title;\r\n // DTO\r\n $scope.ValidateUserCodeViewModel = {\r\n UID: \"\",\r\n Code: \"\",\r\n Purpose:\"\"\r\n };\r\n\r\n $scope.ResetPasswordBindingModel = {\r\n //Token: \"\",\r\n //UserID: \"\",\r\n //NewPassword: \"\",\r\n //ConfirmPassword: \"\",\r\n };\r\n\r\n $scope.Validators = Validator.data;\r\n\r\n\r\n // Properties\r\n $scope.showForm = false;\r\n $scope.flipped = false;\r\n\r\n $scope.flip = function () {\r\n $scope.flipped = !$scope.flipped;\r\n };\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n\r\n // Methods\r\n /// ValidateUserName: Method used for get the username from the server.\r\n $scope.ValidateCode = function () {\r\n $scope.showProgress();\r\n\r\n $scope.ValidateUserCodeViewModel.UID = $stateParams.uid;\r\n $scope.ValidateUserCodeViewModel.Code = $stateParams.code;\r\n $scope.ValidateUserCodeViewModel.Purpose = \"ResetPassword\";\r\n\r\n authService.validateUserCode($scope.ValidateUserCodeViewModel).then(function (response) {\r\n $scope.hideProgress();\r\n $scope.showForm = true;\r\n },\r\n function (err) {\r\n $scope.hideProgress(); \r\n $location.path('/portal/accounts');\r\n });\r\n };\r\n\r\n /// ResetPassword: Method used for get the username from the server.\r\n $scope.ResetPassword = function () {\r\n $scope.showProgress();\r\n\r\n $scope.ResetPasswordBindingModel.UserID = $stateParams.uid;\r\n $scope.ResetPasswordBindingModel.Token = $stateParams.code;\r\n\r\n /// TODO: Fix related to MND-878 (Sprint 12) message saying \"You have unsaved changes...\"\r\n var form = $scope.ResetUserForm;\r\n\r\n\r\n authService.resetPasswordEncode($scope.ResetPasswordBindingModel).then(function (response) {\r\n $scope.hideProgress();\r\n $scope.flip();\r\n\r\n /// TODO: Fix related to MND-878 (Sprint 12) message saying \"You have unsaved changes...\"\r\n form.$rollbackViewValue();\r\n\r\n /// TODO: Fix related to MND-878 (Sprint 12) message saying \"You have unsaved changes...\"\r\n $scope.ResetPasswordBindingModel = {};\r\n //$scope.ResetPasswordBindingModel.Token= \"\";\r\n //$scope.ResetPasswordBindingModel.UserID= \"\";\r\n //$scope.ResetPasswordBindingModel.NewPassword= \"\";\r\n //$scope.ResetPasswordBindingModel.ConfirmPassword= \"\";\r\n\r\n },\r\n function (err) {\r\n $scope.hideProgress();\r\n commonService.handleError(err);\r\n });\r\n };\r\n\r\n \r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n $scope.showPasswordHelp = function () {\r\n commonService.showPasswordHelp()\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('fuseConfig', fuseConfigProvider);\r\n\r\n /** @ngInject */\r\n function fuseConfigProvider()\r\n {\r\n // Default configuration\r\n var fuseConfiguration = {\r\n 'disableCustomScrollbars' : false,\r\n 'disableMdInkRippleOnMobile' : true,\r\n 'disableCustomScrollbarsOnMobile': true\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n fuseConfiguration = angular.extend({}, fuseConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getConfig: getConfig,\r\n setConfig: setConfig\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Returns a config value\r\n */\r\n function getConfig(configName)\r\n {\r\n if ( angular.isUndefined(fuseConfiguration[configName]) )\r\n {\r\n return false;\r\n }\r\n\r\n return fuseConfiguration[configName];\r\n }\r\n\r\n /**\r\n * Creates or updates config object\r\n *\r\n * @param configName\r\n * @param configValue\r\n */\r\n function setConfig(configName, configValue)\r\n {\r\n fuseConfiguration[configName] = configValue;\r\n }\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.reset-password', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_reset-password', {\r\n url : '/auth/reset-password',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_reset-password': {\r\n templateUrl: 'app/auth/reset-password/reset-password.html',\r\n controller : 'ResetPasswordController as vm'\r\n }\r\n },\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('ResetPasswordBindingModel', 'ResetPasswordBindingModel')\r\n }]\r\n },\r\n bodyClass: 'reset-password',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/reset-password');\r\n \r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.reset-password')\r\n .controller('ResetPasswordController', ResetPasswordController);\r\n\r\n /** @ngInject */\r\n function ResetPasswordController($location, $scope, authService, Validator, commonService, $window)\r\n {\r\n $scope.success = false;\r\n // Data\r\n //$scope.user = {\r\n // NewPassword: \"\",\r\n // ConfirmPassword: \"\",\r\n // Token: \"\",\r\n // UserID: \"\"\r\n //};\r\n $window.document.title = \"Reset Password - \" + document.getElementById(\"title\").title;\r\n $scope.ResetPasswordBindingModel = {};\r\n $scope.Validators = Validator.data;\r\n\r\n // Methods\r\n\r\n $scope.resetPassword = function () {\r\n $scope.user.Token = $location.search()['code'];\r\n $scope.user.UserID = $location.search()['userId'];\r\n $scope.progress.activated = true;\r\n\r\n authService.resetPassword($scope.ResetPasswordBindingModel).then(function (response) {\r\n $scope.progress.activated = false;\r\n if (response.status === 200) {\r\n $scope.success = true\r\n } \r\n //TODO:Change this for the right one\r\n //$location.path('/portal/accounts');\r\n\r\n },\r\n function (err) {\r\n $scope.progress.activated = false;\r\n \r\n commonService.handleError(err);\r\n\r\n });\r\n };\r\n //////////\r\n }\r\n})();\r\n\n(function ()\n{\n 'use strict';\n\n angular\n .module('app.auth.register', [])\n .config(config);\n\n /** @ngInject */\n function config($stateProvider, $translatePartialLoaderProvider)\n {\n \n // State\n $stateProvider.state('app.pages_auth_register', {\n url : '/auth/register',\n views : {\n 'main@' : {\n templateUrl: 'app/core/layouts/content-only.html',\n controller : 'MainController as vm'\n },\n 'content@app.pages_auth_register': {\n templateUrl: 'app/auth/register/register.html',\n controller: 'RegisterController as vm' \n }\n },\n resolve: {\r\n SignUpValidators: [\"RegisterContext\", function (RegisterContext) {\r\n return RegisterContext.getValidators('CreateUserBindingModel','registration',true);\r\n }]\r\n },\n bodyClass: 'register', \n data: {\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\n });\n\n // Translation\n $translatePartialLoaderProvider.addPart('app/auth/register');\n\n //// Navigation\n //msNavigationServiceProvider.saveItem('pages.auth.register', {\n // title : 'Register',\n // state : 'app.pages_auth_register',\n // weight: 3\n //});\n }\n\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.register')\r\n .controller('RegisterController', RegisterController);\r\n\r\n /** @ngInject */\r\n function RegisterController($filter, $scope, $location, $timeout, authService, genericService, $mdToast, $state, SignUpValidators, RegisterContext, commonService, $mdDialog, $rootScope, $window) {\r\n //////////\r\n // Properties\r\n //////////\r\n $window.document.title = \"Register - \" + document.getElementById(\"title\").title;\r\n $scope.savedSuccessfully = false;\r\n $scope.SignUpValidators = SignUpValidators.data;\r\n $scope.customer = {\r\n AccountNumber: \"\"\r\n };\r\n $scope.limit = 50;\r\n $scope.retries = 1;\r\n $scope.isNewApplicant = false;\r\n\r\n $scope.registration = {};\r\n $scope.validation = {};\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n $scope.checkAccountNumber = CheckAccountNumber;\r\n\r\n $scope.accountNumberPattern = (function () {\r\n var regexp = /^[0-9]*$/;\r\n\r\n return {\r\n test: function (value) {\r\n //if ($scope.requireTel === false) {\r\n // return true;\r\n //}\r\n return regexp.test(value);\r\n }\r\n };\r\n })();\r\n\r\n $scope.flipped = false;\r\n\r\n $scope.flip = function () {\r\n $scope.flipped = !$scope.flipped;\r\n if ($scope.flipped) {\r\n var register = document.getElementById('register');\r\n register.scrollTop = 0;\r\n }\r\n };\r\n\r\n authService.CheckIsPortalEnabled(false, null, null);\r\n //////////\r\n // Methods\r\n //////////\r\n $scope.Clear = function () {\r\n $scope.validation.BillAmount = 0;\r\n $scope.validation.PNumber = '';\r\n }\r\n function alertDialog(title, content) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .parent(angular.element(document.querySelector('#popupContainer')))\r\n .clickOutsideToClose(true)\r\n .parent(angular.element(document.body))\r\n .title(title)\r\n .textContent(content)\r\n .ariaLabel(title)\r\n .ok('Ok')\r\n //.targetEvent(ev)\r\n );\r\n }\r\n $scope.Validate = function (registerForm) {\r\n authService.CheckIsPortalEnabled(null, registerForm, function () {\r\n if (registerForm.$invalid) {\r\n $scope.notification.message = 'Please input a correct e-mail';\r\n }\r\n else {\r\n if ($scope.isNewApplicant) {\r\n commonService.showAlert(\r\n 'Create Account',\r\n 'You are not allowed to create a Portal Account until your account has been billed. Please try back in a few days.');\r\n } else {\r\n fixAccountNumber();\r\n ValidateBillAmount(registerForm);\r\n }\r\n }\r\n });\r\n }\r\n function retrySignUp(registerForm) {\r\n $scope.signUp(registerForm);\r\n }\r\n\r\n\r\n /// signUp: Method used to register the new user.\r\n $scope.signUp = function (registerForm) {\r\n $scope.showProgress();\r\n\r\n //if (registerForm.$invalid) {\r\n // $scope.notification.message = 'Please input a correct e-mail';\r\n //}\r\n //else {\r\n\r\n //fixAccountNumber();\r\n\r\n var promiseGet = genericService.get('Account/getCID/CID/' + $scope.customer.AccountNumber);\r\n\r\n promiseGet.then(function (pl) {\r\n\r\n //Checks if Account Number entered has corresponding CID (pl.data is not equals 0)\r\n if (pl.data !== 0) {\r\n $scope.registration.CustomerID = pl.data;\r\n $scope.registration.FirstName = \"_\";\r\n $scope.registration.LastName = \"_\";\r\n $scope.registration.TimeZone = $filter('date')(new Date(), \"Z\");\r\n //$scope.registration.AccountNumber = $scope.customer.AccountNumber;\r\n\r\n authService.saveRegistration($scope.registration).then(function (response) {\r\n //prevents 'Unsaved Changes' pop up\r\n registerForm.$aaFormExtensions.$changed = false;\r\n\r\n $scope.hideProgress();\r\n\r\n if (response.status === 201) {\r\n $scope.flip();\r\n $scope.savedSuccessfully = true;\r\n //form.$rollbackViewValue();\r\n }\r\n else if (response.status === 200) {\r\n if ($scope.retries < $scope.limit) {\r\n $scope.retries = $scope.retries + 1;\r\n retrySignUp(registerForm);\r\n }\r\n else {\r\n $scope.hideProgress();\r\n $scope.notification.message = \"Error while updating the entries. Please try again.\";\r\n $scope.notification.display = true;\r\n commonService.handleError(null, $scope.notification.message);\r\n }\r\n\r\n }\r\n\r\n //$scope.notification.message = \"User has been registered successfully. You will be redirected to login page in 2 seconds.\";\r\n //$scope.notification.display = true;\r\n\r\n //showSimpleToast(true, $scope.notification.message);\r\n //startTimer();\r\n\r\n }, function (response) {\r\n $scope.hideProgress();\r\n //$scope.EvalErrorWebAPi(response);\r\n commonService.handleError(response);\r\n });\r\n }\r\n else { //If no CID number returned (pl.data is 0)\r\n $scope.hideProgress();\r\n $scope.notification.message = \"Account number was not found\";\r\n $scope.notification.display = true;\r\n commonService.handleError(null, $scope.notification.message);\r\n }\r\n }, function (errorPl) {\r\n $scope.hideProgress();\r\n\r\n //$scope.EvalErrorWebAPi(errorPl, 'Account number was not found');\r\n commonService.handleError(errorPl, 'Account number was not found');\r\n });\r\n //}\r\n };\r\n\r\n /// Clear: Method used for clean every text control in the page.\r\n $scope.clear = function () {\r\n $scope.customer.AccountNumber = \"\";\r\n $scope.registration = {};\r\n $scope.notification = {};\r\n };\r\n\r\n /// startTimer: Method used for redirect to Login page after 2 seconds.\r\n var startTimer = function () {\r\n var timer = $timeout(\r\n function () {\r\n $timeout.cancel(timer);\r\n $state.go('app.pages_auth_login');\r\n }\r\n , 2000);\r\n }\r\n\r\n ///\r\n function fixAccountNumber() {\r\n var currentLength = ($scope.customer.AccountNumber).length;\r\n if (currentLength < 8)\r\n for (var x = 0; x < (8 - currentLength); x++)\r\n $scope.customer.AccountNumber = \"0\" + $scope.customer.AccountNumber;\r\n }\r\n\r\n $scope.showPasswordHelp = function () {\r\n commonService.showPasswordHelp()\r\n }\r\n $scope.showBillAmountHelp = function () {\r\n var alert = $mdDialog.alert(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Bill Amount')\r\n .htmlContent(\r\n 'Enter the total amount due from your current bill.'\r\n )\r\n .ariaLabel('Bill Amount Help')\r\n .ok('Close')\r\n .multiple(true)\r\n\r\n return $mdDialog.show(alert);\r\n };\r\n\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n function ValidateBillAmount(registerForm) {\r\n $scope.showProgress();\r\n var promiseGet = genericService.get('Bills/Validate?amount=' + $scope.validation.BillAmount + \"&accountNumber=\" + $scope.customer.AccountNumber);\r\n\r\n promiseGet.then(function (pl) {\r\n var result = pl.data;\r\n if (result === \"Success\") {\r\n $scope.hideProgress();\r\n ValidatePhoneNumber(registerForm);\r\n }\r\n else {\r\n alertDialog(\"Bill Amount Validation Failed\", result);\r\n $scope.hideProgress();\r\n }\r\n }, function (errorPl) {\r\n $scope.hideProgress();\r\n commonService.handleError(errorPl, \"Internal Error\");\r\n });\r\n }\r\n function ValidatePhoneNumber(registerForm) {\r\n $scope.showProgress();\r\n var promiseGet = genericService.get('Account/Validate?number=' + $scope.validation.PNumber + \"&accountNumber=\" + $scope.customer.AccountNumber);\r\n\r\n promiseGet.then(function (pl) {\r\n var result = pl.data;\r\n if (result === \"Success\") {\r\n $scope.hideProgress();\r\n $scope.signUp(registerForm);\r\n }\r\n else {\r\n alertDialog(\"Phone Number Validation Failed\", result);\r\n $scope.hideProgress();\r\n }\r\n }, function (errorPl) {\r\n $scope.hideProgress();\r\n commonService.handleError(errorPl, 'Internal Error');\r\n });\r\n }\r\n\r\n // Functions\r\n function CheckAccountNumber(accountNo) {\r\n $rootScope.loadingProgress = true;\r\n accountNo = accountNo === undefined ? \"\" : accountNo;\r\n accountNo = commonService.padLeft(accountNo, 8, \"0\");\r\n genericService.get('Account/GetAccount/' + accountNo).then(function (response) {\r\n $rootScope.loadingProgress = false;\r\n var account = response.data;\r\n if (account.MemberNo !== null) {\r\n $scope.isNewApplicant = account.Status === 'New';\r\n if ($scope.isNewApplicant) {\r\n commonService.showAlert(\r\n 'Create Account',\r\n 'You are not allowed to create a Portal Account until your account has been billed. Please try back in a few days.');\r\n }\r\n }\r\n }, function (error) {\r\n\r\n });\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.register')\r\n .factory('RegisterContext', [\"genericService\",'commonService', RegisterContext]);\r\n\r\n function RegisterContext(genericService, commonService) {\r\n var EntitiesValidatorsURL = 'EntityValidators/';\r\n\r\n return {\r\n getValidators: GetValidators,\r\n SignUpValidation: {},\r\n\r\n getSignUpValidation: function () {\r\n return this.SignUpValidation;\r\n },\r\n setCCValidation: function (obj) {\r\n this.SignUpValidation = angular.copy(obj);\r\n },\r\n\r\n\r\n Decrypt: commonService.Decrypt,\r\n Encrypt: commonService.Encrypt,\r\n\r\n PasswordMasked: \"\",\r\n ConfirmPasswordMasked: \"\",\r\n EmailMasked:\"\",\r\n UsernameMasked: \"\",\r\n ConfirmEmailMasked: \"\"\r\n\r\n }\r\n \r\n function GetValidators(entityName, jsonModelName, isForAuth) {\r\n return genericService.get(EntitiesValidatorsURL + \"?entityName=\" + entityName + \"&jsonModelName=\" + jsonModelName + \"&isForAuth=\" + isForAuth);\r\n }\r\n }\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.utility.location', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider) {\r\n // State\r\n $stateProvider.state('app.pages_utility_location', {\r\n url: '/location',\r\n views: {\r\n 'main@': {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller: 'MainController as vm'\r\n },\r\n 'content@app.pages_utility_location': {\r\n templateUrl: 'app/auth/location/location.html',\r\n controller: 'LocationController as vm'\r\n }\r\n },\r\n bodyClass: 'login',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n }\r\n\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.utility.location')\r\n .controller('LocationController', ['genericService', 'authService', '$mdDialog', '$state', '$rootScope', '$scope', '$compile', '$mdSidenav', '$window', LocationController]);\r\n\r\n function LocationController(genericService, authService, $mdDialog, $state, $rootScope, $scope, $compile, $mdSidenav, $window) {\r\n $window.document.title = \"Location - \" + document.getElementById(\"title\").title;\r\n var options = { timeout: 10000, enableHighAccuracy: true };\r\n var serviceController = 'OfficeLocation/';\r\n\r\n $scope.IsCollapsed = false;\r\n var infowindow = null;\r\n\r\n initialize();\r\n\r\n function initialize() {\r\n if (!$scope.Offices || $scope.Offices.length <= 0) {\r\n LoadOffices();\r\n }\r\n else {\r\n $scope.map = null;\r\n var myLatlng = new google.maps.LatLng($scope.SelectedOffice.Latitude, $scope.SelectedOffice.Longitude);\r\n\r\n var mapOptions = {\r\n center: myLatlng,\r\n zoom: 16,\r\n mapTypeId: google.maps.MapTypeId.ROADMAP\r\n };\r\n\r\n var map = new google.maps.Map(document.getElementById(\"map\"),\r\n mapOptions);\r\n\r\n $scope.map = map;\r\n\r\n for (var x = 0; x <= ($scope.Offices.length - 1) ; x++) {\r\n createMarker($scope.Offices[x]);\r\n }\r\n\r\n CenterOnMe();\r\n }\r\n\r\n }\r\n\r\n function LoadOffices() {\r\n var promiseGet = genericService.get(serviceController);\r\n showProgress();\r\n\r\n promiseGet.then(function (pl) {\r\n if (pl.data) {\r\n $scope.Offices = pl.data;\r\n $scope.SelectedOffice = $scope.Offices[0];\r\n initialize();\r\n hideProgress();\r\n } else {\r\n alert(\"No location data was found.\");\r\n hideProgress();\r\n }\r\n },\r\n function (errorPl) {\r\n hideProgress();\r\n })\r\n\r\n }\r\n\r\n var createMarker = function (ofc) {\r\n var marker = new google.maps.Marker({\r\n position: new google.maps.LatLng(ofc.Latitude, ofc.Longitude),\r\n map: $scope.map\r\n });\r\n\r\n var infoWindowTemplate = \"
\" +\r\n \"
\" +\r\n \"

\" + ofc.OfficeTypeDesc + \" - \" + ofc.City + \", \" + ofc.State + \"

\" +\r\n \"
\" +\r\n \"

\" + ofc.FullAddress + \"

\" +\r\n \"
\";\r\n\r\n infowindow = new google.maps.InfoWindow()\r\n google.maps.event.addListener(marker, 'click', (function (marker, infoWindowTemplate, infowindow) {\r\n return function () {\r\n infowindow.setContent(infoWindowTemplate);\r\n infowindow.open($scope.map, marker);\r\n };\r\n })(marker, infoWindowTemplate, infowindow));\r\n }\r\n\r\n $scope.selectOffice = function (ofc) {\r\n\r\n if (ofc) {\r\n $scope.SelectedOffice = ofc;\r\n CenterOnMe();\r\n \r\n }\r\n\r\n //$scope.IsCollapsed = true;\r\n \r\n };\r\n\r\n $scope.toggle = function (componentID) {\r\n $mdSidenav(componentID).toggle();\r\n };\r\n\r\n\r\n function CenterOnMe() {\r\n if (!$scope.map) {\r\n return;\r\n }\r\n\r\n $scope.map.setCenter(new google.maps.LatLng($scope.SelectedOffice.Latitude, $scope.SelectedOffice.Longitude));\r\n\r\n var infoWindowTemplate = \"
\" +\r\n \"
\" +\r\n \"

\" + $scope.SelectedOffice.OfficeTypeDesc + \" - \" + $scope.SelectedOffice.City + \", \" + $scope.SelectedOffice.State + \"

\" +\r\n \"
\" +\r\n \"

\" + $scope.SelectedOffice.FullAddress + \"

\" +\r\n \"
\";\r\n\r\n infowindow = new google.maps.InfoWindow({\r\n content: infoWindowTemplate,\r\n position: new google.maps.LatLng($scope.SelectedOffice.Latitude, $scope.SelectedOffice.Longitude),\r\n });\r\n\r\n\r\n var marker = new google.maps.Marker({\r\n position: new google.maps.LatLng($scope.SelectedOffice.Latitude, $scope.SelectedOffice.Longitude),\r\n map: $scope.map,\r\n });\r\n\r\n infowindow.open($scope.map, marker);\r\n\r\n google.maps.event.addListener(marker, 'click', (function (marker, infoWindowTemplate, infowindow) {\r\n return function () {\r\n infowindow.setContent(infoWindowTemplate);\r\n infowindow.open($scope.map, marker);\r\n };\r\n })(marker, infoWindowTemplate, infowindow));\r\n };\r\n\r\n /// showProgress: Method used to show the progress bar\r\n function showProgress() {\r\n $scope.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n function hideProgress() {\r\n $scope.activated = false;\r\n }\r\n }\r\n})();\r\n\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope, commonService) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.login')\r\n .controller('LoginController', LoginController, function ($scope, $location, authService, commonService) { });\r\n\r\n\r\n /** @ngInject */\r\n function LoginController($filter, genericService, $scope, $location, authService, $rootScope, AUTH_EVENTS, $mdToast, $state, $stateParams, $window, Validator, $mdDialog, commonService) {\r\n $window.document.title = \"Login - \" + document.getElementById(\"title\").title;\r\n $scope.Validators = Validator.data;\r\n $scope.shownAsDialog = $state.current.name != 'app.pages_auth_login';\r\n $scope.loginData = {\r\n useRefreshTokens: true,\r\n staySignedIn: true\r\n };\r\n\r\n $scope.portalVersion = '';\r\n $scope.processing = false;\r\n $scope.accessFailed = 0;\r\n $scope.lockoutValue = \"\";\r\n $scope.levelUser = \"\";\r\n $scope.emailConfirmed = \"\";\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n\r\n $scope.resetNotification = function () {\r\n $scope.notification.message = \"\";\r\n $scope.notification.display = \"\";\r\n };\r\n //$scope.goToForgotPassword = GoToForgotPassword;\r\n //$scope.goToForgotUsername = GoToForgotUsername;\r\n\r\n $scope.flipped = false;\r\n\r\n $scope.flip = function () {\r\n $scope.flipped = !$scope.flipped;\r\n };\r\n\r\n var accountChanged = false;\r\n\r\n // Initialization\r\n LoadPortalVersion();\r\n\r\n //REVIEW: Pascal Case\r\n $scope.login = function (loginForm) {\r\n authService.CheckIsPortalEnabled($scope.shownAsDialog, null, function () {\r\n if ($scope.shownAsDialog && loginForm.usernameE.$viewValue.toLowerCase() != $rootScope.previousUserName) {\r\n confirmAccountChange().then(function () {\r\n accountChanged = true;\r\n $scope.showProgress();\r\n lockoutUser(loginForm);\r\n }, function () {\r\n\r\n });\r\n } else {\r\n accountChanged = false;\r\n $scope.showProgress();\r\n lockoutUser(loginForm);\r\n }\r\n });\r\n };\r\n\r\n var continueLogin = function (loginForm) {\r\n $scope.showProgress();\r\n\r\n authService.login($scope.loginData).then(function (response) {\r\n $rootScope.$broadcast(AUTH_EVENTS.loginSuccess, $scope.loginData);\r\n\r\n $scope.hideProgress();\r\n\r\n if ($scope.shownAsDialog) {\r\n if (accountChanged) {\r\n\r\n if (!authService.roleType) {\r\n $window.location.href = 'portal/accounts';\r\n }\r\n else {\r\n switch (authService.roleType.toLowerCase()) {\r\n case 'admin':\r\n $window.location.href = 'portal/admin/customers';\r\n break;\r\n default:\r\n $window.location.href = 'portal/accounts';\r\n break;\r\n }\r\n }\r\n } else {\r\n $mdDialog.hide();\r\n }\r\n } else {\r\n if (!authService.adminAuthentication.roleType) {\r\n $state.go('app.msportal.accounts');\r\n }\r\n }\r\n\r\n }, function (err) {\r\n $scope.EvalErrorWebAPi(err);\r\n\r\n $rootScope.$broadcast(AUTH_EVENTS.loginFailed);\r\n\r\n if ($scope.lockoutValue && $scope.emailConfirmed == \"true\") {\r\n failedAttempt();\r\n }\r\n else {\r\n $scope.hideProgress();\r\n }\r\n\r\n });\r\n }\r\n\r\n var lockoutUser = function (loginForm) {\r\n authService.lockoutUser($scope.loginData).then(function (response) {\r\n $scope.lockoutValue = response.data;\r\n var valLocation = $scope.lockoutValue.indexOf(\"*\");\r\n var confirmedLoc = $scope.lockoutValue.indexOf(\"-\");\r\n $scope.levelUser = $scope.lockoutValue.slice(valLocation + 1, confirmedLoc).toLowerCase();\r\n $scope.emailConfirmed = $scope.lockoutValue.slice(confirmedLoc + 1, $scope.lockoutValue.length - 1).toLowerCase();\r\n $scope.accessFailed = 3 - parseInt($scope.lockoutValue.slice(1, valLocation));\r\n //to check if the username is existing\r\n if (!$scope.lockoutValue || $scope.emailConfirmed == \"false\") {\r\n continueLogin(loginForm);\r\n return;\r\n }\r\n if (!$scope.shownAsDialog && $scope.levelUser == \"admin\") {\r\n $mdDialog.show(\r\n\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: \"Invalid User Account\",\r\n textContent: \"If you are an ADMIN of this site, please use the ADMIN login page.\",\r\n ariaLabel: \"Invalid User Account\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n logOut(true)\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n $scope.hideProgress();\r\n return;\r\n }\r\n if ($scope.accessFailed <= 3 && $scope.accessFailed >= 0) {\r\n continueLogin(loginForm);\r\n }\r\n else {\r\n $scope.hideProgress();\r\n lockoutMessage();\r\n }\r\n\r\n }, function (err) {\r\n $scope.hideProgress();\r\n $scope.EvalErrorWebAPi(err);\r\n\r\n $rootScope.$broadcast(AUTH_EVENTS.loginFailed);\r\n\r\n });\r\n }\r\n\r\n function failedAttempt() {\r\n $mdDialog.show(\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: \"Login Failed\",\r\n textContent: \"You have \" + $scope.accessFailed + \" attempt(s) remaining.\",\r\n ariaLabel: \"Login Failed\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .multiple(true)\r\n );\r\n $scope.hideProgress();\r\n }\r\n function LoadPortalVersion() {\r\n var promiseGet = genericService.get(\"Versions/\");\r\n promiseGet.then(function (pl) {\r\n $scope.portalVersion = $filter(\"filter\")(pl.data, { Name: 'Sedc Multiservice Portal Installer' })[0].Version;\r\n }, function () {\r\n\r\n });\r\n }\r\n\r\n function lockoutMessage() {\r\n $mdDialog.show(\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: \"Account Locked\",\r\n textContent: \"This account is currently locked due to too many failed login attempts. Please try again later.\",\r\n ariaLabel: \"Account Locked\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .multiple(true)\r\n );\r\n }\r\n\r\n function confirmAccountChange() {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var confirm = $mdDialog.confirm(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Account Changed')\r\n .textContent('You are logging in using a different account. This will discard any unsaved changes. Do you want to proceed?')\r\n .ariaLabel('Account Changed')\r\n .ok('Yes')\r\n .cancel('No')\r\n .multiple(true);\r\n\r\n return $mdDialog.show(confirm);\r\n }\r\n\r\n\r\n function logOut() {\r\n authService.logOut(true);\r\n $state.go('app.pages_auth_login');\r\n }\r\n\r\n $window.onbeforeunload = $scope.onExit;\r\n\r\n $scope.goToCreateAccount = function () {\r\n authService.CheckIsPortalEnabled($scope.shownAsDialog, null, function () {\r\n $state.go('app.pages_auth_register');\r\n });\r\n };\r\n $scope.goToForgotPassword = function () {\r\n authService.CheckIsPortalEnabled($scope.shownAsDialog, null, function () {\n var roleType = 'user';\r\n if ($scope.shownAsDialog) {\r\n if ($rootScope.roleType === 'admin') {\r\n roleType = 'admin';\r\n }\r\n }\r\n $state.go('app.pages_auth_forgot-password', { roleType: roleType });\r\n });\r\n };\r\n $scope.goToForgotUsername = function () {\r\n authService.CheckIsPortalEnabled($scope.shownAsDialog, null, function () {\n var roleType = 'user';\r\n if ($scope.shownAsDialog) {\r\n if ($rootScope.roleType === 'admin') {\r\n roleType = 'admin';\r\n }\r\n }\r\n $state.go('app.pages_auth_forgotUserName', { roleType: roleType });\r\n });\r\n };\r\n\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n /// showSimpleToast: Method used for show the server response.\r\n var showSimpleToast = function (isSuccess, message) {\r\n var status = (isSuccess) ? \"success\" : \"error\";\r\n $scope.hideProgress();\r\n\r\n $mdToast.show({\r\n template: '
' + message + '
',\r\n position: \"top\",\r\n hideDelay: 6000\r\n });\r\n };\r\n\r\n /// EvalErrorWebAPi: Method used for eval the error and display message to the user.\r\n $scope.EvalErrorWebAPi = function (err, customMessage) {\r\n var errors = [];\r\n\r\n if (err.data != null && err.data.error_description != null) {\r\n if (err.data.error_uri != null) {\r\n $scope.notification.message = err.data.error_description;\r\n $scope.flip();\r\n } else\r\n errors.push(err.data.error_description);\r\n\r\n } else if (err.data != null && err.data.modelState != null) {\r\n for (var key in err.data.modelState) {\r\n for (var i = 0; i < err.data.modelState[key].length; i++) {\r\n errors.push(err.data.modelState[key][i]);\r\n }\r\n }\r\n } else if (customMessage != null) {\r\n errors.push(customMessage);\r\n } else {\r\n errors.push(\"Internal error, please try again later!\");\r\n }\r\n\r\n if (errors.length != null && errors.length > 0) {\r\n $scope.notification.message = errors.join(\"
\"),\r\n $scope.notification.display = errors.join(\"
\"),\r\n\r\n showSimpleToast(false, $scope.notification.message);\r\n }\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.forgotUserName', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_forgotUserName', {\r\n url : '/auth/forgotUserName/:roleType',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_forgotUserName': {\r\n templateUrl: 'app/auth/forgotUserName/forgot-username.html',\r\n controller : 'ForgotUserNameController as vm'\r\n }\r\n },\r\n bodyClass: 'forgotUserName',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/forgotUserName');\r\n\r\n //// Navigation\r\n //msNavigationServiceProvider.saveItem('pages.auth.forgotUserName', {\r\n // title : 'Forgot Password',\r\n // state : 'app.pages_auth_forgot-username',\r\n // weight: 5\r\n //});\r\n }\r\n\r\n})();\r\n\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.forgotUserName')\r\n .controller('ForgotUserNameController', ForgotUserNameController, function ($scope, $location, authService) { });\r\n\r\n /** @ngInject */\r\n function ForgotUserNameController($scope, $location, authService, $rootScope, AUTH_EVENTS, $mdToast, commonService, $stateParams, $window) {\r\n authService.CheckIsPortalEnabled(false, null, null);\r\n $window.document.title = \"Forgot Username - \" + document.getElementById(\"title\").title;\r\n // Data\r\n $scope.ForgotUserNameViewModel = {\r\n Email: \"\",\r\n };\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.flipped = false;\r\n\r\n $scope.flip = function () {\r\n $scope.flipped = !$scope.flipped;\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n $scope.roleType = $stateParams.roleType;\r\n // Methods\r\n\r\n /// ValidateUserName: Method used for get the username from the server.\r\n $scope.ValidateUserName = function () {\r\n var form = $scope.forgotUserNameForm;\r\n authService.CheckIsPortalEnabled(false, form, function () {\r\n $scope.showProgress();\r\n\r\n authService.forgotUserName($scope.ForgotUserNameViewModel).then(function (response) {\r\n if (response.data === \"true\") {\r\n $scope.hideProgress();\r\n $scope.flip();\r\n\r\n form.$rollbackViewValue();\r\n $scope.ForgotUserNameViewModel.Email = \"\";\r\n }\r\n else {\r\n $scope.hideProgress();\r\n commonService.handleError(null, \"Email Address is not found.\");\r\n }\r\n },\r\n function (err) {\r\n $scope.hideProgress();\r\n commonService.handleError(err);\r\n });\r\n });\r\n };\r\n\r\n\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.forgot-password', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_forgot-password', {\r\n url : '/auth/forgot-password/:roleType',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_forgot-password': {\r\n templateUrl: 'app/auth/forgot-password/forgot-password.html',\r\n controller : 'ForgotPasswordController as vm'\r\n }\r\n },\r\n bodyClass: 'forgot-password',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/forgot-password');\r\n \r\n }\r\n\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.forgot-password')\r\n .controller('ForgotPasswordController', ForgotPasswordController);\r\n\r\n function ForgotPasswordController(authService, commonService, $mdDialog, $rootScope, $scope, $stateParams, $window) {\r\n $window.document.title = \"Forgot Password - \" + document.getElementById(\"title\").title;\r\n\r\n // Data Binding\r\n $scope.flipped = false;\r\n $scope.isUserExists = false;\r\n $scope.progress = {\r\n activated: false\r\n };\r\n $scope.roleType = $stateParams.roleType;\r\n $scope.showRetry = false;\r\n $scope.user = {\r\n username: \"\",\r\n email: \"\"\r\n };\r\n\r\n // Function Binding\r\n $scope.flip = Flip;\r\n $scope.forgotPassword = ForgotPassword;\r\n $scope.hideProgress = HideProgress;\r\n $scope.retry = Retry;\r\n $scope.showProgress = ShowProgress;\r\n\r\n // Init\r\n authService.CheckIsPortalEnabled(false, null, null);\r\n\r\n // Functions\r\n function Flip() {\r\n $scope.flipped = !$scope.flipped;\r\n }\r\n function forgetPasswordMessage() {\r\n $mdDialog.show(\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: \"Account Locked\",\r\n textContent: \"This account is currently locked due to too many failed login attempts. Please try again later or contact the utility for assistance.\",\r\n ariaLabel: \"Account Locked\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .multiple(true)\r\n );\r\n }\r\n function ForgotPassword() {\r\n var form = $scope.forgotPasswordForm;\r\n authService.CheckIsPortalEnabled(false, form, function () {\r\n $scope.showProgress();\r\n $scope.FPData = {\r\n useRefreshTokens: true,\r\n staySignedIn: true,\r\n Username: $scope.user.username\r\n };\r\n\r\n authService.lockoutUser($scope.FPData).then(function (response) {\r\n $scope.lockoutValue = response.data;\r\n var valLocation = $scope.lockoutValue.indexOf(\"*\");\r\n $scope.accessFailed = parseInt($scope.lockoutValue.slice(1, valLocation));\r\n\r\n if ($scope.accessFailed == 4) {\r\n $scope.hideProgress();\r\n forgetPasswordMessage();\r\n }\r\n else {\r\n authService.forgotPassword($scope.user).then(function (response) {\r\n $scope.hideProgress();\r\n if (response.status === 200) {\r\n\r\n $scope.isUserExists = response.data === 'true' ? true : false;\r\n $scope.showRetry = $scope.isUserExists === false ? true : false;\r\n $scope.flip();\r\n\r\n /// TODO: Fix related to MND-878 (Sprint 12) message saying \"You have unsaved changes...\"\r\n form.$rollbackViewValue();\r\n /// TODO: Fix related to MND-878 (Sprint 12) message saying \"You have unsaved changes...\"\r\n $scope.user.username = \"\";\r\n $scope.user.email = \"\";\r\n }\r\n\r\n //TODO:Change this for the right one\r\n //$location.path('/portal/accounts');\r\n },\r\n function (err) {\r\n $scope.hideProgress();\r\n commonService.handleError(err);\r\n });\r\n }\r\n },\r\n function (err) {\r\n $scope.hideProgress();\r\n commonService.handleError(err);\r\n });\r\n });\r\n }\r\n function HideProgress() {\r\n $scope.progress.activated = false;\r\n }\r\n function Retry() {\r\n $scope.showRetry = false;\r\n $scope.flip();\r\n }\r\n function ShowProgress() {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.utility.contact', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider) {\r\n // State\r\n $stateProvider.state('app.pages_utility_contact', {\r\n url: '/contact-us',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_utility_contact': {\r\n templateUrl: 'app/auth/contact/contact.html',\r\n controller: 'ContactController as vm' \r\n }\r\n },\r\n bodyClass: 'login',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n }\r\n\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.utility.contact')\r\n .controller('ContactController', ['genericService', 'authService', '$mdDialog', '$state', '$rootScope', '$scope', '$timeout', '$interval', '$window', ContactController]);\r\n\r\n function ContactController(genericService, authService, $mdDialog, $state, $rootScope, $scope, $timeout, $interval, $window) {\r\n $window.document.title = \"Contact Us - \" + document.getElementById(\"title\").title;\r\n var serviceController = 'OfficeLocation/';\r\n $scope.Offices = [];\r\n\r\n LoadSmartAppSettings();\r\n LoadOffices();\r\n\r\n //$scope.activated = false;\r\n\r\n function LoadSmartAppSettings() {\r\n var configserviceController = 'SmartAppConfig/';\r\n var promiseGet = genericService.get(configserviceController);\r\n $rootScope.smartAppConfig = {};\r\n\r\n promiseGet.then(function (pl) {\r\n $rootScope.smartAppConfig = pl.data;\r\n },\r\n function (errorPl) {\r\n console.log('failure loading Offices', errorPl);\r\n })\r\n\r\n }\r\n\r\n function LoadOffices() {\r\n var promiseGet = genericService.get(serviceController);\r\n showProgress();\r\n\r\n promiseGet.then(function (pl) {\r\n hideProgress();\r\n\r\n if (!pl.data) {\r\n $mdDialog.show(\r\n $mdDialog.alert({\r\n title: '! No office locations and contact details retrieved.',\r\n template: '',\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n }\r\n else {\r\n $scope.Offices = pl.data;\r\n $scope.SelectedOffice = $scope.Offices[0];\r\n }\r\n\r\n },\r\n function (errorPl) {\r\n hideProgress();\r\n console.log('failure loading Offices', errorPl);\r\n })\r\n }\r\n\r\n /// showProgress: Method used to show the progress bar\r\n function showProgress() {\r\n $scope.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n function hideProgress() {\r\n $scope.activated = false;\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.confirmChangeEmail', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_confirmChangeEmail', {\r\n url : '/confirm-email-change?uid&code',\r\n views : {\r\n 'main@': {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_confirmChangeEmail': {\r\n templateUrl: 'app/auth/confirmChangeEmail/confirmChangeEmail.html',\r\n controller: 'ConfirmChangeEmailController as vm'\r\n }\r\n },\r\n bodyClass: 'confirmChangeEmail',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/confirmChangeEmail');\r\n }\r\n\r\n})();\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.confirmChangeEmail')\r\n .controller('ConfirmChangeEmailController', ConfirmChangeEmailController, function ($scope, $location, authService) { });\r\n\r\n /** @ngInject */\r\n function ConfirmChangeEmailController($scope, $location, authService, $rootScope, AUTH_EVENTS, $stateParams, $mdToast, $timeout, $window) {\r\n $window.document.title = \"Confirm Change Email - \" + document.getElementById(\"title\").title;\r\n // DTO\r\n $scope.ValidateUserCodeViewModel = {\r\n UID: \"\",\r\n Code: \"\",\r\n Purpose: \"\",\r\n };\r\n\r\n $scope.ConfirmEmailViewModel = {\r\n UID :\"\",\r\n Code: \"\",\r\n }\r\n\r\n // Properties\r\n $scope.showForm = false;\r\n $scope.flipped = false;\r\n\r\n $scope.flip = function () {\r\n $scope.flipped = !$scope.flipped;\r\n };\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n\r\n // Methods\r\n /// ValidateCode: Method used for validate the user token.\r\n $scope.ValidateCode = function () {\r\n $scope.showProgress();\r\n\r\n //alert(\"Pasok dito!\");\r\n\r\n $scope.ValidateUserCodeViewModel.UID = $stateParams.uid;\r\n $scope.ValidateUserCodeViewModel.Code = $stateParams.code;\r\n $scope.ValidateUserCodeViewModel.Purpose = \"Confirmation\";\r\n\r\n $scope.hideProgress();\r\n $scope.showForm = true;\r\n\r\n $timeout(function () {\r\n $scope.hideProgress();\r\n $scope.notification.message = \"You can now access your account again.
Please click the link below to return to the Portal Login Screen.\";\r\n $scope.notification.display = true;\r\n $scope.flip();\r\n }, 2000);\r\n //return;\r\n\r\n authService.validateUserCode($scope.ValidateUserCodeViewModel).then(function (response) {\r\n $scope.hideProgress();\r\n $scope.showForm = true;\r\n $timeout($scope.ConfirmUser, 2000);\r\n },\r\n function (err) {\r\n $scope.hideProgress();\r\n $location.path('/portal/accounts');\r\n });\r\n };\r\n\r\n $scope.ConfirmUser = function () {\r\n $scope.showProgress();\r\n\r\n $scope.ConfirmEmailViewModel.UID = $stateParams.uid;\r\n $scope.ConfirmEmailViewModel.Code = $stateParams.code;\r\n\r\n authService.confirmEmailEncode($scope.ConfirmEmailViewModel).then(function (response) {\r\n $scope.hideProgress();\r\n\r\n if (response.status === 200) {\r\n $scope.notification.message = \"Account has been successfully confirmed.
Please click the link below to return to the Portal Login Screen.\";\r\n $scope.notification.display = true;\r\n\r\n //$scope.flip();\r\n }\r\n else {\r\n $scope.flip();\r\n }\r\n //$scope.notification.message = \"Please feel free to enter in our application.
Click the link below to go to main page.\";\r\n \r\n },\r\n function (err) {\r\n console.log(\"err: \" + err);\r\n $scope.hideProgress(); \r\n $scope.EvalErrorWebAPi(err);\r\n });\r\n };\r\n\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n /// showSimpleToast: Method used for show the server response.\r\n var showSimpleToast = function (isSuccess, message) {\r\n var status = (isSuccess) ? \"success\" : \"error\";\r\n $scope.hideProgress();\r\n\r\n $mdToast.show({\r\n template: '
' + message + '
',\r\n position: \"top\",\r\n hideDelay: 6000\r\n });\r\n };\r\n\r\n /// EvalErrorWebAPi: Method used for eval the error and display message to the user.\r\n $scope.EvalErrorWebAPi = function (err, customMessage) {\r\n var errors = [];\r\n\r\n if (err.data != null && err.data.error_description != null) {\r\n if (err.data.error_uri != null) {\r\n var ErrMessage = encodeURI(err.data.error_description);\r\n $state.go('app.' + err.data.error_uri, { ErrorMessage: ErrMessage });\r\n } else\r\n errors.push(err.data.error_description);\r\n\r\n } else if (err.data != null && err.data.modelState != null) {\r\n for (var key in err.data.modelState) {\r\n for (var i = 0; i < err.data.modelState[key].length; i++) {\r\n errors.push(err.data.modelState[key][i]);\r\n }\r\n }\r\n } else if (customMessage != null) {\r\n errors.push(customMessage);\r\n } else {\r\n errors.push(\"Internal error, please try again later!\");\r\n }\r\n\r\n if (errors.length != null && errors.length > 0) {\r\n $scope.notification.message = errors.join(\"
\"),\r\n $scope.notification.display = errors.join(\"
\"),\r\n\r\n showSimpleToast(false, $scope.notification.message);\r\n }\r\n\r\n }\r\n //////////\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.confirm-user', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_confirm-user', {\r\n url : '/confirm-user?uid&code',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_confirm-user': {\r\n templateUrl: 'app/auth/confirm-user/confirm-user.html',\r\n controller: 'ConfirmUserController as vm'\r\n }\r\n },\r\n bodyClass: 'confirm-user',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/confirm-user');\r\n }\r\n\r\n})();\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.confirm-user')\r\n .controller('ConfirmUserController', ConfirmUserController, function ($filter, $scope, $location, authService) { });\r\n\r\n /** @ngInject */\r\n function ConfirmUserController($filter, $scope, $location, authService, $rootScope, AUTH_EVENTS, $stateParams, $mdToast, $timeout, $window) {\r\n $window.document.title = \"Confirm Change Username - \" + document.getElementById(\"title\").title;\r\n\r\n // DTO\r\n $scope.ResendActivationEmailViewEmail = {\r\n UserId: \"\",\r\n TimeZone: new Date()\r\n };\r\n $scope.ValidateUserCodeViewModel = {\r\n UID: \"\",\r\n Code: \"\",\r\n Purpose: \"\",\r\n };\r\n\r\n $scope.ConfirmEmailViewModel = {\r\n UID: \"\",\r\n Code: \"\",\r\n }\r\n\r\n // Properties\r\n $scope.action = '';\r\n $scope.showForm = false;\r\n $scope.flipped = false;\r\n $scope.errPage = false;\r\n $scope.response = '';\r\n\r\n $scope.flip = function () {\r\n $scope.flipped = !$scope.flipped;\r\n };\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n\r\n // Methods\r\n $scope.resendEmail = function () {\r\n $scope.action = 'Resend Activation Email';\r\n $scope.showProgress();\r\n $scope.notification.display = false;\r\n $scope.ResendActivationEmailViewEmail.TimeZone = $filter('date')(new Date(), \"Z\");\r\n authService.resendEmail($scope.ResendActivationEmailViewEmail).then(function (response) {\r\n $scope.response = 'Activation Email sent';\r\n $scope.hideProgress();\r\n $scope.notification.display = true;\r\n $scope.errPage = false;\r\n }, function (err) {\r\n $scope.response = 'Activation Email not sent';\r\n $scope.hideProgress();\r\n $scope.errPage = true;\r\n $scope.notification.display = true;\r\n });\r\n }\r\n /// ValidateCode: Method used for validate the user token.\r\n var retryConfirm = 0;\r\n $scope.ValidateCode = function () {\r\n\r\n $scope.action = 'Validate User Code';\r\n $scope.ResendActivationEmailViewEmail.UserId = $stateParams.uid;\r\n //alert(\"Pasok dito!\");\r\n\r\n $scope.ValidateUserCodeViewModel.UID = $stateParams.uid;\r\n $scope.ValidateUserCodeViewModel.Code = $stateParams.code;\r\n $scope.ValidateUserCodeViewModel.Purpose = \"Confirmation\";\r\n\r\n $scope.showProgress();\r\n $scope.showForm = true;\r\n\r\n authService.validateUserCode($scope.ValidateUserCodeViewModel).then(function (response) {\r\n if (response.data === 'Code verified') {\r\n $scope.showForm = true;\r\n $scope.ConfirmUser();\r\n $scope.errPage = false;\r\n $scope.response = response.data;\r\n } else if (response.data !== 'Code verified') {\r\n if (response.data === 'Code not verified' && retryConfirm < 30) {\r\n retryConfirm += 1;\r\n $scope.ValidateCode();\r\n }\r\n else {\r\n $scope.response = response.data;\r\n $scope.hideProgress();\r\n $scope.errPage = true;\r\n $scope.notification.display = true;\r\n }\r\n }\r\n }, function (err) {\r\n if (retryConfirm < 30) {\r\n retryConfirm += 1;\r\n $scope.ValidateCode();\r\n }\r\n else {\r\n $scope.hideProgress();\r\n $scope.errPage = true;\r\n $scope.notification.display = true;\r\n }\r\n });\r\n };\r\n\r\n $scope.ConfirmUser = function () {\r\n $scope.showProgress();\r\n\r\n $scope.ConfirmEmailViewModel.UID = $stateParams.uid;\r\n $scope.ConfirmEmailViewModel.Code = $stateParams.code;\r\n\r\n authService.confirmEmailEncode($scope.ConfirmEmailViewModel).then(function (response) {\r\n\r\n if (response.status === 200) { \r\n $scope.notification.message = \"Account has been successfully confirmed.
Please click the link below to return to the Portal Login Screen.\";\r\n $scope.notification.display = true;\r\n $scope.errPage = false;\r\n $scope.hideProgress();\r\n $scope.flip();\r\n }\r\n else {\r\n if (retryConfirm < 30) {\r\n retryConfirm += 1;\r\n $scope.ConfirmUser();\r\n }\r\n else {\r\n $scope.hideProgress();\r\n $scope.errPage = true;\r\n $scope.flip();\r\n $scope.notification.display = true;\r\n }\r\n }\r\n\r\n }, function (err) {\r\n if (retryConfirm < 30) {\r\n retryConfirm += 1;\r\n $scope.ConfirmUser();\r\n }\r\n else {\r\n $scope.hideProgress();\r\n $scope.EvalErrorWebAPi(err);\r\n $scope.errPage = true;\r\n $scope.notification.display = true;\r\n }\r\n });\r\n };\r\n\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n /// showSimpleToast: Method used for show the server response.\r\n var showSimpleToast = function (isSuccess, message) {\r\n var status = (isSuccess) ? \"success\" : \"error\";\r\n $scope.hideProgress();\r\n\r\n $mdToast.show({\r\n template: '
' + message + '
',\r\n position: \"top\",\r\n hideDelay: 6000\r\n });\r\n };\r\n\r\n /// EvalErrorWebAPi: Method used for eval the error and display message to the user.\r\n $scope.EvalErrorWebAPi = function (err, customMessage) {\r\n var errors = [];\r\n\r\n if (err.data != null && err.data.error_description != null) {\r\n if (err.data.error_uri != null) {\r\n var ErrMessage = encodeURI(err.data.error_description);\r\n $state.go('app.' + err.data.error_uri, { ErrorMessage: ErrMessage });\r\n } else\r\n errors.push(err.data.error_description);\r\n\r\n } else if (err.data != null && err.data.modelState != null) {\r\n for (var key in err.data.modelState) {\r\n for (var i = 0; i < err.data.modelState[key].length; i++) {\r\n errors.push(err.data.modelState[key][i]);\r\n }\r\n }\r\n } else if (customMessage != null) {\r\n errors.push(customMessage);\r\n } else {\r\n errors.push(\"Internal error, please try again later!\");\r\n }\r\n\r\n if (errors.length != null && errors.length > 0) {\r\n $scope.notification.message = errors.join(\"
\"),\r\n $scope.notification.display = errors.join(\"
\"),\r\n\r\n showSimpleToast(false, $scope.notification.message);\r\n }\r\n\r\n }\r\n //////////\r\n\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.changePassword', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider) {\r\n // State\r\n $stateProvider.state('app.pages_auth_changePassword', {\r\n url: '/auth/changePassword',\r\n views: {\r\n 'main@': {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller: 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_changePassword': {\r\n templateUrl: 'app/auth/changePassword/changePassword.html',\r\n controller: 'changePasswordController as vm'\r\n }\r\n },\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('ChangePasswordBindingModel', 'ChangePasswordBindingModel')\r\n }]\r\n },\r\n bodyClass: 'changePassword',\r\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/changePassword');\r\n }\r\n})();\r\n\r\n\n(function ($scope, $location, authService, ngAuthSettings, $state, $mdDialog, $window, genericService, $rootScope) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.changePassword')\r\n .controller('changePasswordController', changePasswordController, function ($scope, $location, $mdDialog, authService, $state, $rootScope) { });\r\n\r\n /** @ngInject */\r\n function changePasswordController($scope, $location, authService, $mdToast, $mdDialog, Validator, commonService, $state, $rootScope, $window) {\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n $window.document.title = \"Change Password - \" + document.getElementById(\"title\").title;\r\n $scope.ChangePasswordBindingModel = {\r\n OldPassword: null,\r\n NewPassword: null,\r\n ConfirmPassword: null\r\n };\r\n\r\n //authService.setChangePasswordValidator(Validator.data);\r\n\r\n $scope.Validators = Validator.data;\r\n $scope.OldPasswordValidate = false;\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n\r\n //REVIEW: Pascal Case\r\n $scope.changePassword = function (Form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $scope.showProgress();\r\n\r\n authService.changePassword($scope.ChangePasswordBindingModel).then(function (response) {\r\n Form.$aaFormExtensions.$resetChanged();\r\n\r\n if (response.status === 200) {\r\n var title = \"Change Password\";\r\n var content = \"Your password has been changed successfully!\";\r\n var method = \"Ok\";\r\n $scope.hideProgress();\r\n\r\n DisplayMessage(title, content, method);\r\n }\r\n\r\n }, function (err) {\r\n $scope.hideProgress();\r\n\r\n commonService.handleError(err);\r\n });\r\n });\r\n };\r\n\r\n $scope.onExit = function () {\r\n if (!authService.authentication.staySignedIn) {\r\n authService.logOut();\r\n }\r\n };\r\n $scope.GoBackToAccountsList = function () {\r\n if (!authService.adminAuthentication.roleType) {\r\n $state.go('app.msportal.accounts');\r\n }\r\n else {\r\n if (!authService.authentication.CustomerID) {\r\n $state.go('app.msportal.admin.customers');\r\n }\r\n else {\r\n var account = {\r\n Username: authService.authentication.userName,\r\n CustomerIDNumber: authService.authentication.CustomerID\r\n }\r\n $state.go('app.msportal.accounts', { CID: authService.authentication.CustomerID });\r\n $rootScope.showAdminToolbar = true;\r\n\r\n $rootScope.$broadcast('simulateAccount', account);\r\n }\r\n }\r\n }\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n $scope.showPasswordHelp = function () {\r\n commonService.showPasswordHelp()\r\n }\r\n\r\n function DisplayMessage(title, text, command) {\r\n $mdDialog.show(\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: title,\r\n textContent: text,\r\n ariaLabel: title,\r\n ok: command,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n $scope.GoBackToAccountsList();\r\n }\r\n })\r\n );\r\n }\r\n\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.changeUserName', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider) {\r\n // State\r\n $stateProvider.state('app.pages_auth_changeUserName', {\r\n url: '/auth/changeUserName',\r\n views: {\r\n 'main@': {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller: 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_changeUserName': {\r\n templateUrl: 'app/auth/changeUserName/changeUserName.html',\r\n controller: 'ChangeUserNameController as vm'\r\n }\r\n },\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('ChangeUserNameBindingModel', 'ChangeUserNameBindingModel')\r\n }]\r\n },\r\n bodyClass: 'changeUserName',\r\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/changeUserName');\r\n }\r\n})();\r\n\r\n\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope, $mdDialog, commonService) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.changeUserName')\r\n .controller('ChangeUserNameController', ChangeUserNameController, function ($scope, $location, authService, $mdDialog, commonService, $state, $rootScope) { });\r\n\r\n /** @ngInject */\r\n function ChangeUserNameController($scope, $location, authService, $mdToast, Validator, $mdDialog, commonService, $state, $rootScope, $window) {\r\n authService.CheckIsPortalEnabled(true, null, null);\n $window.document.title = \"Change Username - \" + document.getElementById(\"title\").title;\r\n $scope.ChangeUserNameBindingModel = {\r\n UserName: null,\r\n //OldUserName: (!authService.roleType ? authService.authentication.userName : authService.adminAuthentication.userName)\r\n OldUserName: null\r\n };\r\n\r\n $scope.Validators = Validator.data;\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.progress = {\r\n activated: false\r\n };\r\n\r\n\r\n //REVIEW: Pascal Case\r\n $scope.changeUserName = function (Form) {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $scope.showProgress();\r\n $scope.ChangeUserNameBindingModel.UserName = $scope.ChangeUserNameBindingModel.UserName.trim();\r\n $scope.ChangeUserNameBindingModel.OldUserName = (!authService.roleType ? authService.authentication.userName : authService.adminAuthentication.userName);\r\n\r\n authService.changeUserName($scope.ChangeUserNameBindingModel).then(function (response) {\r\n\r\n $scope.hideProgress();\r\n Form.$aaFormExtensions.$resetChanged();\r\n\r\n var obj = JSON.parse(response.data)\r\n\r\n if (obj.succeeded.toString().toLowerCase() == \"true\") {\r\n var title = 'Username Changed';\r\n var text = 'Your Username has been successfully updated. Please try logging in again with your new username. Thank you!';\r\n var command = 'OK';\r\n DisplaySuccessMessage(title, text, command)\r\n }\r\n\r\n }, function (err) {\r\n $scope.hideProgress();\r\n var obj = '';\r\n try {\r\n obj = JSON.parse(err.data)\r\n }\r\n catch (e) {\r\n obj = err.data;\r\n }\r\n var title = 'Failed to Update Username';\r\n var text = '';\r\n if (!obj.modelState) {\r\n text = obj.message;\r\n }\r\n else {\r\n text = obj.modelState[\"\"][0];\r\n }\r\n var command = 'Retry';\r\n DisplayMessage(title, text, command);\r\n Form.$aaFormExtensions.$resetChanged();\r\n $state.reload();\r\n //commonService.handleError(err);\r\n });\r\n });\r\n };\r\n\r\n $scope.GoBackToAccountsList = function () {\r\n if (!authService.adminAuthentication.roleType) {\r\n $state.go('app.msportal.accounts');\r\n }\r\n else {\r\n if (!authService.authentication.CustomerID) {\r\n $state.go('app.msportal.admin.customers');\r\n }\r\n else {\r\n $state.go('app.msportal.accounts', { CID: authService.authentication.CustomerID });\r\n var account = {\r\n Username: authService.authentication.userName,\r\n CustomerIDNumber: authService.authentication.CustomerID\r\n }\r\n $rootScope.showAdminToolbar = true;\r\n\r\n $rootScope.$broadcast('simulateAccount', account);\r\n\r\n }\r\n }\r\n //$rootScope.$broadcast('simulateAccount', account);\r\n }\r\n\r\n function DisplaySuccessMessage(title, text, command) {\r\n $mdDialog.show(\r\n\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: title,\r\n textContent: text,\r\n ariaLabel: title,\r\n ok: command,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n logOut()\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n\r\n }\r\n\r\n function DisplayMessage(title, text, command) {\r\n $mdDialog.show(\r\n\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: title,\r\n textContent: text,\r\n ariaLabel: title,\r\n ok: command,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n );\r\n }\r\n\r\n $scope.showUserNameHelp = function () {\r\n commonService.showUserNameHelp()\r\n }\r\n\r\n function logOut() {\r\n //authService.logOut(); \r\n //$state.go('app.pages_auth_login');\r\n if (!authService.adminAuthentication.roleType) {\r\n authService.logOut();\r\n $state.go('app.pages_auth_login');\r\n }\r\n else {\r\n // if (!authService.authentication.CustomerID) {\r\n authService.logOut();\r\n $state.go('app.pages_auth_adminLogin');\r\n //}\r\n //else {\r\n // authService.authentication.userName = '';\r\n // authService.authentication.useRefreshTokens = false;\r\n // authService.authentication.roleType = '';\r\n // authService.authentication.CustomerID = '';\r\n // authService.authentication.staySignedIn = false;\r\n // authService.authentication.email = '';\r\n // authService.authentication.isAuth = false;\r\n // $state.go('app.admin.customers')\r\n //}\r\n }\r\n }\r\n\r\n $scope.onExit = function () {\r\n if (!authService.authentication.staySignedIn) {\r\n authService.logOut();\r\n }\r\n };\r\n\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.changeEmail', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider) {\r\n // State\r\n $stateProvider.state('app.pages_auth_changeEmail', {\r\n url: '/auth/changeEmail',\r\n views: {\r\n 'main@': {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller: 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_changeEmail': {\r\n templateUrl: 'app/auth/changeEmail/changeEmail.html',\r\n controller: 'ChangeEmailController as vm'\r\n }\r\n },\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('ChangeEmailBindingModel', 'ChangeEmailBindingModel')\r\n }]\r\n },\r\n bodyClass: 'changeEmail',\r\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/changeEmail');\r\n }\r\n})();\r\n\r\n\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope, $mdDialog, commonService) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.changeEmail')\r\n .controller('ChangeEmailController', ChangeEmailController, function ($scope, $location, authService, $mdDialog, commonService, $state, $rootScope) { });\r\n\r\n /** @ngInject */\r\n function ChangeEmailController($scope, $location, authService, $mdToast, Validator, commonService, $rootScope, $mdDialog, $state, $window) {\r\n // #region Data Binding\r\n $scope.ChangeEmailBindingModel = {\r\n OldEmail: (!authService.roleType ? authService.authentication.email : authService.adminAuthentication.email),\r\n NewEmail: null,\r\n ConfirmEmail: null,\r\n UserName: (!authService.roleType ? authService.authentication.userName : authService.adminAuthentication.userName),\r\n Password: null,\r\n UtilityNumber: \"(02) 477-66-61\"\r\n };\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n $scope.progress = {\r\n activated: false\r\n };\r\n // #endregion Data Binding\r\n\r\n // #region Initialization\r\n ShowProgress();\r\n $window.document.title = \"Change Email - \" + document.getElementById(\"title\").title;\r\n authService.CheckIsPortalEnabled(true, null, null);\r\n HideProgress();\r\n // #endregion Initialization\r\n\r\n // #region Method Binding\r\n $scope.changeEmail = ChangeEmail;\r\n $scope.GoBackToAccountsList = GoBackToAccountsList;\r\n $scope.hideProgress = HideProgress;\r\n $scope.onExit = OnExit;\r\n $scope.showProgress = ShowProgress;\r\n // #endregion Method Binding\r\n\r\n //REVIEW: Pascal Case\r\n function ChangeEmail(Form) {\r\n $scope.showProgress();\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n if (!$rootScope.utilityContact) {\r\n SendLocation();\r\n }\r\n\r\n $scope.ChangeEmailBindingModel.UtilityNumber = $rootScope.utilityContact;\r\n authService.changeEmail($scope.ChangeEmailBindingModel).then(function (response) {\r\n $scope.hideProgress();\r\n Form.$aaFormExtensions.$resetChanged();\r\n\r\n var obj = JSON.parse(response.data)\r\n\r\n if (obj.toString().toLowerCase() == \"change email\") {\r\n var title = 'E-mail Changed';\r\n var text = 'Your e-mail has been successfully updated. Please check your e-mail and click on the confirmation link to enable you to log in. Thank you!';\r\n var command = 'OK';\r\n DisplayMessage(title, text, command).then(function () {\r\n logOut();\r\n });\r\n }\r\n }, function (err) {\r\n $scope.hideProgress();\r\n var obj = '';\r\n try {\r\n obj = JSON.parse(err.data)\r\n }\r\n catch (e) {\r\n obj = err.data;\r\n }\r\n var title = 'Error Changing E-mail';\r\n var text = obj.message;\r\n var command = 'Retry';\r\n DisplayMessage(title, text, command);\r\n Form.$aaFormExtensions.$resetChanged();\r\n //$state.reload();\r\n });\r\n });\r\n }\r\n function DisplayMessage(title, text, command) {\r\n return $mdDialog.show($mdDialog.alert({\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: title,\r\n textContent: text,\r\n ariaLabel: title,\r\n ok: command,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n }));\r\n }\r\n function GoBackToAccountsList() {\r\n if (!authService.adminAuthentication.roleType) {\r\n $state.go('app.msportal.accounts');\r\n }\r\n else {\r\n if (!authService.authentication.CustomerID) {\r\n $state.go('app.msportal.admin.customers');\r\n }\r\n else {\r\n var account = {\r\n Username: authService.authentication.userName,\r\n CustomerIDNumber: authService.authentication.CustomerID\r\n }\r\n $state.go('app.msportal.accounts', { CID: authService.authentication.CustomerID });\r\n $rootScope.showAdminToolbar = true;\r\n $rootScope.$broadcast('simulateAccount', account);\r\n }\r\n }\r\n }\r\n function HideProgress() {\r\n $scope.progress.activated = false;\r\n }\r\n function logOut() {\r\n if (!authService.adminAuthentication.roleType) {\r\n authService.logOut();\r\n $state.go('app.pages_auth_login');\r\n }\r\n else {\r\n // if (!authService.authentication.CustomerID) {\r\n authService.logOut();\r\n $state.go('app.pages_auth_adminLogin');\r\n //}\r\n //else {\r\n // authService.authentication.userName = '';\r\n // authService.authentication.useRefreshTokens = false;\r\n // authService.authentication.roleType = '';\r\n // authService.authentication.CustomerID = '';\r\n // authService.authentication.staySignedIn = false;\r\n // authService.authentication.email = '';\r\n // authService.authentication.isAuth = false;\r\n // $state.go('app.admin.customers')\r\n //}\r\n }\r\n }\r\n function OnExit() {\r\n if (!authService.authentication.staySignedIn) {\r\n authService.logOut();\r\n }\r\n }\r\n function SendLocation() {\r\n //var p = $rootScope.utilityOffices;\r\n if (!$rootScope.utilityOffices.length) {\r\n $rootScope.utilityContact = \"its nearest branch\";\r\n }\r\n else {\r\n for (var x = 0; x < $rootScope.utilityOffices.length; x++) {\r\n if ($rootScope.utilityOffices[x].OfficeType == 'M') {\r\n if (!$rootScope.utilityOffices[x].Telephone) {\r\n // No phone, just eadd\r\n if (!$rootScope.utilityOffices[x].EmailAddress) {\r\n // No phone AND eadd\r\n $rootScope.utilityContact = \"its nearest branch\";\r\n }\r\n else {\r\n $rootScope.utilityContact = $rootScope.utilityOffices[x].EmailAddress;\r\n }\r\n }\r\n else {\r\n // with phone\r\n var phone = $rootScope.utilityOffices[x].Telephone;\r\n phone = phone.substr(0, 3) + '-' + phone.substr(3, 3) + '-' + phone.substr(6, 4)\r\n if (!$rootScope.utilityOffices[x].EmailAddress) {\r\n // no eadd\r\n $rootScope.utilityContact = phone;\r\n }\r\n else {\r\n $rootScope.utilityContact = phone + \" or \" + $rootScope.utilityOffices[x].EmailAddress;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n function ShowProgress() {\r\n $scope.progress.activated = true;\r\n }\r\n // #endregion Functions\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.adminLogin', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider.state('app.pages_auth_adminLogin', {\r\n url : '/auth/admin/login',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.pages_auth_adminLogin': {\r\n templateUrl: 'app/auth/adminLogin/adminLogin.html',\r\n controller: 'AdminLoginController as vm' \r\n },\r\n \r\n },\r\n resolve: {\r\n Validator: [\"authService\", function (authService) {\r\n return authService.getEntityValidators('LoginBindingModel', 'loginData')\r\n }]\r\n },\r\n bodyClass: 'login',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n })\r\n \r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/auth/adminLogin');\r\n //$translatePartialLoaderProvider.addPart('app/auth/adminlogin');\r\n\r\n //// Navigation\r\n //msNavigationServiceProvider.saveItem('auth', {\r\n // title : 'Authentication',\r\n // icon : 'icon-lock',\r\n // weight: 1\r\n //});\r\n\r\n //msNavigationServiceProvider.saveItem('auth.login', {\r\n // title : 'Login',\r\n // state : 'app.pages_auth_login',\r\n // weight: 1\r\n //});\r\n }\r\n\r\n})();\n(function ($scope, $location, authService, ngAuthSettings, $state, $window, genericService, $rootScope) {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth.adminLogin')\r\n .controller('AdminLoginController', AdminLoginController, function ($scope, $location, authService) { });\r\n\r\n\r\n /** @ngInject */\r\n function AdminLoginController(genericService, $scope, $location, authService, $rootScope, AUTH_EVENTS, $mdToast, $state, $stateParams, $window, Validator, $mdDialog) {\r\n $window.document.title = \"Admin Login - \" + document.getElementById(\"title\").title;\r\n $scope.Validators = Validator.data;\r\n $scope.shownAsDialog = $state.current.name != 'app.pages_auth_adminLogin';\r\n $scope.loginData = {\r\n useRefreshTokens: true,\r\n staySignedIn: true\r\n };\r\n\r\n $scope.notification = {\r\n message: \"\",\r\n display: \"\"\r\n };\r\n\r\n $scope.programs = [];\r\n $scope.progress = {\r\n activated: false\r\n };\r\n\r\n $scope.accessFailed = 0;\r\n $scope.lockoutValue = \"\";\r\n $scope.levelUser = \"\";\r\n\r\n $scope.resetNotification = function () {\r\n $scope.notification.message = \"\";\r\n $scope.notification.display = \"\";\r\n };\r\n\r\n\r\n $scope.flipped = false;\r\n $scope.showLoginError = false;\r\n $scope.showVersions = false;\r\n\n $scope.goToState = GoToState;\n\r\n $scope.flip = function (item) {\r\n if (item === 'versions') {\r\n $scope.showVersions = true;\r\n } else if (item === 'login') {\r\n $scope.showLoginError = false;\r\n $scope.showVersions = false;\r\n } else {\r\n $scope.showLoginError = true;\r\n }\r\n $scope.flipped = !$scope.flipped;\r\n };\r\n\r\n var accountChanged = false;\r\n LoadPortalVersion();\r\n\n function GoToState(stateName) {\r\n $scope.showProgress();\r\n authService.CheckIsPortalEnabled($scope.shownAsDialog, null, function () {\r\n $scope.hideProgress();\r\n $state.go(stateName, { roleType: 'admin' });\r\n });\r\n };\n\r\n function LoadPortalVersion() {\r\n var promiseGet = genericService.get(\"Versions/\");\r\n promiseGet.then(function (pl) {\r\n ModifyProgramsProperties(pl.data);\r\n $scope.programs = pl.data;\r\n }, function () {\r\n\r\n });\r\n }\r\n function ModifyProgramsProperties(programs) {\r\n for (var i = 0; i < programs.length; i++) {\r\n var p = programs[i];\r\n if (p.Name === 'Sedc Multiservice Authentication Service') {\r\n p.Name = 'Authentication Service';\r\n } else if (p.Name === 'Sedc Multiservice Consumer Web API') {\r\n p.Name = 'Consumer Web API';\r\n } else if (p.Name === 'Sedc Multiservice Consumer WinService') {\r\n p.Name = 'Consumer WinService';\r\n } else if (p.Name === 'Sedc Multiservice Portal Installer') {\r\n p.Name = 'Portal Website (MSCP)';\r\n }\r\n }\r\n }\r\n //REVIEW: Pascal Case\r\n $scope.login = function (loginForm) {\r\n authService.adminAuthentication.userName = loginForm.usernameE.$viewValue.toLowerCase() === 'portaladmin' ? 'portaladmin' : '';\r\n authService.CheckIsPortalEnabled($scope.shownAsDialog, null, function () {\r\n if ($scope.shownAsDialog && loginForm.usernameE.$viewValue.toLowerCase() != $rootScope.previousUserName) {\r\n confirmAccountChange().then(function () {\r\n accountChanged = true;\r\n $scope.showProgress();\r\n lockoutUser(loginForm);\r\n }, function () {\r\n\r\n });\r\n } else {\r\n accountChanged = false;\r\n $scope.showProgress();\r\n lockoutUser(loginForm);\r\n }\r\n });\r\n };\r\n\r\n var continueLogin = function (loginForm) {\r\n $scope.showProgress();\r\n\r\n authService.login($scope.loginData).then(function (response) {\r\n $rootScope.$broadcast(AUTH_EVENTS.loginSuccess, $scope.loginData);\r\n $scope.setCurrentUser($scope.loginData.Username);\r\n authService.adminAuthentication.isFirstLogin = true;\r\n\r\n $scope.hideProgress();\r\n\r\n if ($scope.shownAsDialog) {\r\n if (accountChanged) {\r\n if (!authService.adminAuthentication.roleType) {\r\n $window.location.href = 'portal/accounts';\r\n }\r\n else {\r\n //$window.location.href = 'admin/customers';//TODO: Change this to new landing page\r\n $state.go('app.msportal.admin.customers');\r\n }\r\n } else {\r\n $mdDialog.hide();\r\n }\r\n\r\n } else {\r\n $state.go('app.msportal.admin.customers');//TODO: Change this to new landing page.\r\n //$window.location.href = '/portal/admin/customers';\r\n }\r\n\r\n },\r\n function (err) {\r\n $scope.EvalErrorWebAPi(err);\r\n\r\n $rootScope.$broadcast(AUTH_EVENTS.loginFailed);\r\n\r\n if ($scope.lockoutValue) {\r\n failedAttempt();\r\n }\r\n else {\r\n $scope.hideProgress();\r\n }\r\n });\r\n }\r\n\r\n var lockoutUser = function (loginForm) {\r\n authService.lockoutUser($scope.loginData).then(function (response) {\r\n $scope.lockoutValue = response.data;\r\n var valLocation = $scope.lockoutValue.indexOf(\"*\");\r\n var confirmedLoc = $scope.lockoutValue.indexOf(\"-\");\r\n $scope.levelUser = $scope.lockoutValue.slice(valLocation + 1, confirmedLoc).toLowerCase();\r\n $scope.accessFailed = 3 - parseInt($scope.lockoutValue.slice(1, valLocation));\r\n //to check if the username is existing\r\n if (!$scope.lockoutValue) {\r\n continueLogin(loginForm);\r\n return;\r\n }\r\n if ($scope.levelUser != \"admin\") {\r\n $mdDialog.show(\r\n\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: \"Invalid Admin Account\",\r\n textContent: \"The account that you are using is not a valid ADMIN account. You may login with that account using the USER login page which you will be redirected to.\",\r\n ariaLabel: \"Invalid Admin Account\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n logOut();\r\n }\r\n })\r\n );\r\n $scope.hideProgress();\r\n return;\r\n }\r\n if ($scope.accessFailed <= 3 && $scope.accessFailed >= 0) {\r\n continueLogin(loginForm);\r\n }\r\n else {\r\n $scope.hideProgress();\r\n lockoutMessage();\r\n }\r\n\r\n }, function (err) {\r\n $scope.hideProgress();\r\n $scope.EvalErrorWebAPi(err);\r\n\r\n $rootScope.$broadcast(AUTH_EVENTS.loginFailed);\r\n\r\n });\r\n }\r\n\r\n function failedAttempt() {\r\n $mdDialog.show(\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: \"Login Failed\",\r\n textContent: \"You have \" + $scope.accessFailed + \" attempt(s) remaining.\",\r\n ariaLabel: \"Login Failed\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .multiple(true)\r\n );\r\n $scope.hideProgress();\r\n }\r\n\r\n function lockoutMessage() {\r\n $mdDialog.show(\r\n $mdDialog.alert(\r\n {\r\n parent: angular.element(document.querySelector('#popupContainer')),\r\n clickOutsideToClose: false,\r\n title: \"Account Locked\",\r\n textContent: \"This account is currently locked due to too many failed login attempts. Please try again later.\",\r\n ariaLabel: \"Account Locked\",\r\n ok: \"OK\",\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .multiple(true)\r\n );\r\n }\r\n\r\n function confirmAccountChange() {\r\n // Appending dialog to document.body to cover sidenav in docs app\r\n var confirm = $mdDialog.confirm(\r\n {\r\n clickOutsideToClose: false,\r\n onComplete: function () {\r\n $rootScope.$broadcast('msDialogIsOpened');\r\n },\r\n onRemoving: function () {\r\n $rootScope.$broadcast('msDialogIsClosed');\r\n }\r\n })\r\n .title('Account Changed')\r\n .textContent('You are logging in using a different account. This will discard any unsaved changes. Do you want to proceed?')\r\n .ariaLabel('Account Changed')\r\n .ok('Yes')\r\n .cancel('No')\r\n .multiple(true);\r\n\r\n return $mdDialog.show(confirm);\r\n }\r\n\r\n function logOut() {\r\n authService.logOut(true);\r\n $state.go('app.pages_auth_login');\r\n }\r\n\r\n $scope.onExit = function () {\r\n if (!authService.adminAuthentication.staySignedIn) {\r\n authService.logOut()\r\n }\r\n };\r\n\r\n $window.onbeforeunload = $scope.onExit;\r\n\r\n\r\n\r\n /// showProgress: Method used to show the progress bar\r\n $scope.showProgress = function () {\r\n $scope.progress.activated = true;\r\n }\r\n\r\n /// hideProgress: Method used to hide the progress bar\r\n $scope.hideProgress = function () {\r\n $scope.progress.activated = false;\r\n }\r\n\r\n /// showSimpleToast: Method used for show the server response.\r\n var showSimpleToast = function (isSuccess, message) {\r\n var status = (isSuccess) ? \"success\" : \"error\";\r\n $scope.hideProgress();\r\n\r\n $mdToast.show({\r\n template: '
' + message + '
',\r\n position: \"top\",\r\n hideDelay: 6000\r\n });\r\n };\r\n\r\n /// EvalErrorWebAPi: Method used for eval the error and display message to the user.\r\n $scope.EvalErrorWebAPi = function (err, customMessage) {\r\n var errors = [];\r\n\r\n if (err.data != null && err.data.error_description != null) {\r\n if (err.data.error_uri != null) {\r\n $scope.notification.message = err.data.error_description;\r\n $scope.flip();\r\n } else\r\n errors.push(err.data.error_description);\r\n\r\n } else if (err.data != null && err.data.modelState != null) {\r\n for (var key in err.data.modelState) {\r\n for (var i = 0; i < err.data.modelState[key].length; i++) {\r\n errors.push(err.data.modelState[key][i]);\r\n }\r\n }\r\n } else if (customMessage != null) {\r\n errors.push(customMessage);\r\n } else {\r\n errors.push(\"Internal error, please try again later!\");\r\n }\r\n\r\n if (errors.length != null && errors.length > 0) {\r\n $scope.notification.message = errors.join(\"
\"),\r\n $scope.notification.display = errors.join(\"
\"),\r\n\r\n showSimpleToast(false, $scope.notification.message);\r\n }\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.toolbar', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($translatePartialLoaderProvider)\r\n {\r\n $translatePartialLoaderProvider.addPart('app/toolbar');\r\n }\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.toolbar')\r\n .controller('ToolbarController', ToolbarController);\r\n\r\n /** @ngInject */\r\n function ToolbarController($rootScope, $q, $state, $timeout, $mdSidenav, $translate, $mdToast, msNavigationService, authService, localStorageService, commonService) {\r\n var vm = this;\r\n\r\n // Data\r\n $rootScope.global = {\r\n search: ''\r\n };\r\n\r\n vm.bodyEl = angular.element('body');\r\n vm.userStatusOptions = [\r\n {\r\n 'title': 'Online',\r\n 'icon': 'icon-checkbox-marked-circle',\r\n 'color': '#4CAF50'\r\n },\r\n {\r\n 'title': 'Away',\r\n 'icon': 'icon-clock',\r\n 'color': '#FFC107'\r\n },\r\n {\r\n 'title': 'Do not Disturb',\r\n 'icon': 'icon-minus-circle',\r\n 'color': '#F44336'\r\n },\r\n {\r\n 'title': 'Invisible',\r\n 'icon': 'icon-checkbox-blank-circle-outline',\r\n 'color': '#BDBDBD'\r\n },\r\n {\r\n 'title': 'Offline',\r\n 'icon': 'icon-checkbox-blank-circle-outline',\r\n 'color': '#616161'\r\n }\r\n ];\r\n vm.languages = {\r\n en: {\r\n 'title': 'English',\r\n 'translation': 'TOOLBAR.ENGLISH',\r\n 'code': 'en',\r\n 'flag': 'us'\r\n },\r\n es: {\r\n 'title': 'Spanish',\r\n 'translation': 'TOOLBAR.SPANISH',\r\n 'code': 'es',\r\n 'flag': 'es'\r\n },\r\n tr: {\r\n 'title': 'Turkish',\r\n 'translation': 'TOOLBAR.TURKISH',\r\n 'code': 'tr',\r\n 'flag': 'tr'\r\n }\r\n };\r\n\r\n // Methods\r\n vm.toggleSidenav = toggleSidenav;\r\n vm.logout = logout;\r\n vm.changeLanguage = changeLanguage;\r\n vm.setUserStatus = setUserStatus;\r\n vm.toggleHorizontalMobileMenu = toggleHorizontalMobileMenu;\r\n vm.toggleMsNavigationFolded = toggleMsNavigationFolded;\r\n vm.search = search;\r\n vm.searchResultClick = searchResultClick;\r\n vm.changePassword = changePassword\r\n vm.changeUserName = changeUserName;\r\n vm.changeEmail = changeEmail;\r\n vm.openMenu = OpenMenu;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init() {\r\n // Select the first status as a default\r\n vm.userStatus = vm.userStatusOptions[0];\r\n\r\n if (authService.adminAuthentication.roleType && !$rootScope.showAdminToolbar) {\r\n vm.session = authService.adminAuthentication;\r\n }\r\n else {\r\n vm.session = authService.authentication;\r\n }\r\n\r\n //TODO: Double check\r\n // Get the selected language directly from angular-translate module setting\r\n vm.selectedLanguage = vm.languages[$translate.preferredLanguage()];\r\n }\r\n\r\n $rootScope.$on('simulateAccount', function (event, account) {\r\n $rootScope.customerUserName = account.Username;\r\n\r\n if ($rootScope.showAdminToolbar) {\r\n\r\n authService.authentication.isAuth = true;\r\n authService.authentication.userName = account.Username;\r\n authService.authentication.roleType = '';\r\n authService.authentication.useRefreshTokens = true;\r\n authService.authentication.CustomerID = account.CustomerIDNumber;\r\n authService.authentication.staySignedIn = true;\r\n authService.authentication.email = account.Email;\r\n\r\n localStorageService.set('authorizationUserData', { customerId: account.CustomerIDNumber, userName: account.Username, email: account.Email });\r\n\r\n vm.session = authService.authentication;\r\n }\r\n });\r\n\r\n $rootScope.$on('adminDashboard', function (event, account) {\r\n vm.session = account;\r\n });\r\n\r\n\r\n /**\r\n * Toggle sidenav\r\n *\r\n * @param sidenavId\r\n */\r\n function toggleSidenav(sidenavId) {\r\n $mdSidenav(sidenavId).toggle();\r\n }\r\n\r\n /**\r\n * Sets User Status\r\n * @param status\r\n */\r\n function setUserStatus(status) {\r\n vm.userStatus = status;\r\n }\r\n\r\n /**\r\n * Logout Function\r\n */\r\n function logout() {\r\n var roleType = authService.roleType;\r\n // Do logout here..\r\n authService.logOut(true);\r\n if (!roleType) {\r\n $state.go('app.pages_auth_login');\r\n }\r\n else {\r\n $state.go('app.pages_auth_adminLogin');\r\n window.location.reload();\r\n }\r\n }\r\n\r\n /**\r\n * Change Language\r\n */\r\n function changeLanguage(lang) {\r\n vm.selectedLanguage = lang;\r\n\r\n /**\r\n * Show temporary message if user selects a language other than English\r\n *\r\n * angular-translate module will try to load language specific json files\r\n * as soon as you change the language. And because we don't have them, there\r\n * will be a lot of errors in the page potentially breaking couple functions\r\n * of the template.\r\n *\r\n * To prevent that from happening, we added a simple \"return;\" statement at the\r\n * end of this if block. If you have all the translation files, remove this if\r\n * block and the translations should work without any problems.\r\n */\r\n if (lang.code !== 'en') {\r\n var message = 'Fuse supports translations through angular-translate module, but currently we do not have any translations other than English language. If you want to help us, send us a message through ThemeForest profile page.';\r\n\r\n $mdToast.show({\r\n template: '
' + message + '
',\r\n hideDelay: 7000,\r\n position: 'top right',\r\n parent: '#content'\r\n });\r\n\r\n return;\r\n }\r\n\r\n // Change the language\r\n $translate.use(lang.code);\r\n }\r\n\r\n /**\r\n * Toggle horizontal mobile menu\r\n */\r\n function toggleHorizontalMobileMenu() {\r\n vm.bodyEl.toggleClass('ms-navigation-horizontal-mobile-menu-active');\r\n }\r\n\r\n /**\r\n * Toggle msNavigation folded\r\n */\r\n function toggleMsNavigationFolded() {\r\n msNavigationService.toggleFolded();\r\n }\r\n\r\n /**\r\n * Search action\r\n *\r\n * @param query\r\n * @returns {Promise}\r\n */\r\n function search(query) {\r\n var navigation = [],\r\n flatNavigation = msNavigationService.getFlatNavigation(),\r\n deferred = $q.defer();\r\n\r\n // Iterate through the navigation array and\r\n // make sure it doesn't have any groups or\r\n // none ui-sref items\r\n for (var x = 0; x < flatNavigation.length; x++) {\r\n if (flatNavigation[x].uisref) {\r\n navigation.push(flatNavigation[x]);\r\n }\r\n }\r\n\r\n // If there is a query, filter the navigation;\r\n // otherwise we will return the entire navigation\r\n // list. Not exactly a good thing to do but it's\r\n // for demo purposes.\r\n if (query) {\r\n navigation = navigation.filter(function (item) {\r\n if (angular.lowercase(item.title).search(angular.lowercase(query)) > -1) {\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n // Fake service delay\r\n $timeout(function () {\r\n deferred.resolve(navigation);\r\n }, 1000);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Search result click action\r\n *\r\n * @param item\r\n */\r\n function searchResultClick(item) {\r\n // If item has a link\r\n if (item.uisref) {\r\n // If there are state params,\r\n // use them...\r\n if (item.stateParams) {\r\n $state.go(item.state, item.stateParams);\r\n }\r\n else {\r\n $state.go(item.state);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reset password action\r\n */\r\n function changePassword() {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $state.go('app.pages_auth_changePassword');\r\n });\r\n\r\n }\r\n function changeUserName() {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $state.go('app.pages_auth_changeUserName');\r\n });\r\n }\r\n function changeEmail() {\r\n authService.CheckIsPortalEnabled(true, null, function () {\r\n $state.go('app.pages_auth_changeEmail');\r\n });\r\n }\r\n function OpenMenu($mdOpenMenu, e) {\r\n if ($rootScope.showAdminToolbar == false) {\r\n $mdOpenMenu(e);\r\n }\r\n }\r\n }\r\n\r\n})();\r\n\n(function () {\n 'use strict';\n\n angular\n .module('app.toolbar')\n .controller('AdminToolbarController', AdminToolbarController);\n\n /** @ngInject */\n function AdminToolbarController($rootScope, $q, $state, $timeout, $mdSidenav, $translate, $mdToast, msNavigationService, authService) {\n var vm = this;\n\n // Data\n $rootScope.global = {\n search: ''\n };\n\n vm.bodyEl = angular.element('body');\n vm.userStatusOptions = [\n {\n 'title': 'Online',\n 'icon': 'icon-checkbox-marked-circle',\n 'color': '#4CAF50'\n },\n {\n 'title': 'Away',\n 'icon': 'icon-clock',\n 'color': '#FFC107'\n },\n {\n 'title': 'Do not Disturb',\n 'icon': 'icon-minus-circle',\n 'color': '#F44336'\n },\n {\n 'title': 'Invisible',\n 'icon': 'icon-checkbox-blank-circle-outline',\n 'color': '#BDBDBD'\n },\n {\n 'title': 'Offline',\n 'icon': 'icon-checkbox-blank-circle-outline',\n 'color': '#616161'\n }\n ];\n vm.languages = {\n en: {\n 'title': 'English',\n 'translation': 'TOOLBAR.ENGLISH',\n 'code': 'en',\n 'flag': 'us'\n },\n es: {\n 'title': 'Spanish',\n 'translation': 'TOOLBAR.SPANISH',\n 'code': 'es',\n 'flag': 'es'\n },\n tr: {\n 'title': 'Turkish',\n 'translation': 'TOOLBAR.TURKISH',\n 'code': 'tr',\n 'flag': 'tr'\n }\n };\n\n // Methods\n vm.toggleSidenav = toggleSidenav;\n vm.logout = logout;\n vm.changeLanguage = changeLanguage;\n vm.setUserStatus = setUserStatus;\n vm.toggleHorizontalMobileMenu = toggleHorizontalMobileMenu;\n vm.toggleMsNavigationFolded = toggleMsNavigationFolded;\n vm.search = search;\n vm.searchResultClick = searchResultClick;\n vm.changePassword = changePassword\n vm.changeUserName = changeUserName;\n vm.changeEmail = changeEmail;\n\n //////////\n\n init();\n\n /**\n * Initialize\n */\n function init() {\n // Select the first status as a default\n vm.userStatus = vm.userStatusOptions[0];\n vm.session = authService.adminAuthentication; //TODO: Double check\n // Get the selected language directly from angular-translate module setting\n vm.selectedLanguage = vm.languages[$translate.preferredLanguage()];\n }\n\n\n /**\n * Toggle sidenav\n *\n * @param sidenavId\n */\n function toggleSidenav(sidenavId) {\n $mdSidenav(sidenavId).toggle();\n }\n\n /**\n * Sets User Status\n * @param status\n */\n function setUserStatus(status) {\n vm.userStatus = status;\n }\n\n /**\n * Logout Function\n */\n function logout() {\n // Do logout here..\n var roleType = authService.roleType;\n // Do logout here..\n authService.logOut(true);\n if (!roleType) {\r\n $state.go('app.pages_auth_login');\r\n }\n else {\r\n $state.go('app.pages_auth_adminLogin');\r\n }\n }\n\n /**\n * Change Language\n */\n function changeLanguage(lang) {\n vm.selectedLanguage = lang;\n\n /**\n * Show temporary message if user selects a language other than English\n *\n * angular-translate module will try to load language specific json files\n * as soon as you change the language. And because we don't have them, there\n * will be a lot of errors in the page potentially breaking couple functions\n * of the template.\n *\n * To prevent that from happening, we added a simple \"return;\" statement at the\n * end of this if block. If you have all the translation files, remove this if\n * block and the translations should work without any problems.\n */\n if (lang.code !== 'en') {\n var message = 'Fuse supports translations through angular-translate module, but currently we do not have any translations other than English language. If you want to help us, send us a message through ThemeForest profile page.';\n\n $mdToast.show({\n template: '
' + message + '
',\n hideDelay: 7000,\n position: 'top right',\n parent: '#content'\n });\n\n return;\n }\n\n // Change the language\n $translate.use(lang.code);\n }\n\n /**\n * Toggle horizontal mobile menu\n */\n function toggleHorizontalMobileMenu() {\n vm.bodyEl.toggleClass('ms-navigation-horizontal-mobile-menu-active');\n }\n\n /**\n * Toggle msNavigation folded\n */\n function toggleMsNavigationFolded() {\n msNavigationService.toggleFolded();\n }\n\n /**\n * Search action\n *\n * @param query\n * @returns {Promise}\n */\n function search(query) {\n var navigation = [],\n flatNavigation = msNavigationService.getFlatNavigation(),\n deferred = $q.defer();\n\n // Iterate through the navigation array and\n // make sure it doesn't have any groups or\n // none ui-sref items\n for (var x = 0; x < flatNavigation.length; x++) {\n if (flatNavigation[x].uisref) {\n navigation.push(flatNavigation[x]);\n }\n }\n\n // If there is a query, filter the navigation;\n // otherwise we will return the entire navigation\n // list. Not exactly a good thing to do but it's\n // for demo purposes.\n if (query) {\n navigation = navigation.filter(function (item) {\n if (angular.lowercase(item.title).search(angular.lowercase(query)) > -1) {\n return true;\n }\n });\n }\n\n // Fake service delay\n $timeout(function () {\n deferred.resolve(navigation);\n }, 1000);\n\n return deferred.promise;\n }\n\n /**\n * Search result click action\n *\n * @param item\n */\n function searchResultClick(item) {\n // If item has a link\n if (item.uisref) {\n // If there are state params,\n // use them...\n if (item.stateParams) {\n $state.go(item.state, item.stateParams);\n }\n else {\n $state.go(item.state);\n }\n }\n }\n\n /**\n * Reset password action\n */\n function changePassword() {\n $state.go('app.pages_auth_changePassword');\n }\n function changeUserName() {\r\n $state.go('app.pages_auth_changeUserName');\r\n }\n function changeEmail() {\r\n $state.go('app.pages_auth_changeEmail');\r\n }\n }\n\n})();\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.quick-panel')\r\n .controller('QuickPanelController', QuickPanelController);\r\n\r\n /** @ngInject */\r\n function QuickPanelController(msApi)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.date = new Date();\r\n vm.settings = {\r\n notify: true,\r\n cloud : false,\r\n retro : true\r\n };\r\n\r\n msApi.request('quickPanel.activities@get', {},\r\n // Success\r\n function (response)\r\n {\r\n vm.activities = response.data;\r\n }\r\n );\r\n\r\n msApi.request('quickPanel.events@get', {},\r\n // Success\r\n function (response)\r\n {\r\n vm.events = response.data;\r\n }\r\n );\r\n\r\n msApi.request('quickPanel.notes@get', {},\r\n // Success\r\n function (response)\r\n {\r\n vm.notes = response.data;\r\n }\r\n );\r\n\r\n // Methods\r\n\r\n //////////\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.navigation', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config()\r\n {\r\n \r\n }\r\n\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.navigation')\r\n .controller('NavigationController', NavigationController);\r\n\r\n /** @ngInject */\r\n function NavigationController($scope, $transitions) {\r\n var vm = this;\r\n\r\n // Data\r\n vm.bodyEl = angular.element('body');\r\n vm.folded = false;\r\n vm.msScrollOptions = {\r\n suppressScrollX: true\r\n };\r\n\r\n // Methods\r\n vm.toggleMsNavigationFolded = toggleMsNavigationFolded;\r\n\r\n //////////\r\n\r\n /**\r\n * Toggle folded status\r\n */\r\n function toggleMsNavigationFolded() {\r\n vm.folded = !vm.folded;\r\n }\r\n\r\n // Close the mobile menu on $stateChangeSuccess\r\n $transitions.onSuccess({}, function (transition) {\r\n vm.bodyEl.removeClass('ms-navigation-horizontal-mobile-menu-active');\r\n });\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .controller('MainController', MainController);\r\n\r\n /** @ngInject */\r\n function MainController($scope, $rootScope, AUTH_ROLES, authService, $stateParams)\r\n {\r\n $scope.userRoles = AUTH_ROLES;\r\n $scope.isAuthorized = authService.isAuthorized;\r\n $scope.resumeState = $stateParams.resumeState;\r\n $scope.auth = authService\r\n\r\n // Remove the splash screen\r\n $scope.$on('$viewContentAnimationEnded', function (event)\r\n {\r\n if ( event.targetScope.$id === $scope.$id )\r\n {\r\n $rootScope.$broadcast('msSplashScreen::remove');\r\n $rootScope.splashScreenIsRemoved = true;\r\n }\r\n });\r\n \r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .run(runBlock);\r\n\r\n /** @ngInject */\r\n function runBlock(msUtils, fuseGenerator, fuseConfig)\r\n {\r\n /**\r\n * Generate extra classes based on registered themes so we\r\n * can use same colors with non-angular-material elements\r\n */\r\n fuseGenerator.generate();\r\n\r\n /**\r\n * Disable md-ink-ripple effects on mobile\r\n * if 'disableMdInkRippleOnMobile' config enabled\r\n */\r\n if ( fuseConfig.getConfig('disableMdInkRippleOnMobile') && msUtils.isMobile() )\r\n {\r\n var bodyEl = angular.element('body');\r\n bodyEl.attr('md-no-ink', true);\r\n }\r\n\r\n /**\r\n * Put isMobile() to the html as a class\r\n */\r\n if ( msUtils.isMobile() )\r\n {\r\n angular.element('html').addClass('is-mobile');\r\n }\r\n\r\n /**\r\n * Put browser information to the html as a class\r\n */\r\n var browserInfo = msUtils.detectBrowser();\r\n if ( browserInfo )\r\n {\r\n var htmlClass = browserInfo.browser + ' ' + browserInfo.version + ' ' + browserInfo.os;\r\n angular.element('html').addClass(htmlClass);\r\n }\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($ariaProvider, $logProvider, msScrollConfigProvider, $translateProvider, fuseConfigProvider)\r\n {\r\n // Enable debug logging\r\n $logProvider.debugEnabled(true);\r\n \r\n // angular-translate configuration\r\n $translateProvider.useLoader('$translatePartialLoader', {\r\n urlTemplate: '{part}/i18n/{lang}.json'\r\n });\r\n $translateProvider.preferredLanguage('en');\r\n $translateProvider.useSanitizeValueStrategy('sanitize');\r\n\r\n /*eslint-disable */\r\n\r\n // ng-aria configuration\r\n $ariaProvider.config({\r\n tabindex: false\r\n });\r\n\r\n // Fuse theme configurations\r\n fuseConfigProvider.config({\r\n 'disableCustomScrollbars' : false,\r\n 'disableCustomScrollbarsOnMobile': true,\r\n 'disableMdInkRippleOnMobile' : true\r\n });\r\n\r\n // msScroll configuration\r\n msScrollConfigProvider.config({\r\n wheelPropagation: true\r\n });\r\n\r\n /*eslint-enable */\r\n }\r\n})();\n(function () {\r\n 'use strict';\n\n angular\n .module('fuse')\n .run(runBlock);\n\n /** @ngInject */\n function runBlock($rootScope, $timeout, $state, $stateParams, authService, Idle, commonService, $location, genericService, $window, $sce, $mdDialog, CustomerContext, localStorageService, $transitions) {\n /// Juan Leon: Implementing the stay signed in functionality.\n authService.fillAuthData();\n\n //var url = $location.absUrl(); //TODO: For E-Bill URL Forwarding\n var prevSimulatedAcctNo; //The last account no. that was simulated by an admin\n\n //var url = \"https://localhost:3000/mscp/enotify.asp?EAccount=10480001&EType=1&EData=x%20%20%2010480-00101-30-171701&EServType=00&ECkCd=00&EBalance=%20%20%201040.73%20&EShare=%20%20%20%200.00%20&PdfFlag=0&PdfInvoiceNbr=&CoopNbr=0160&Param3D30=100\";\n var url = $location.absUrl();\n var eType = getParameterByName(\"EType\", url);\n\n $rootScope.network = {\n online: navigator.onLine,\n showWarning: !navigator.onLine\n }\n\n $rootScope.resumeState = null;\n\n var hasOpenDialogCnt = 0;\n $rootScope.$on('msDialogIsOpened', function () {\r\n hasOpenDialogCnt++\r\n })\n\n $rootScope.$on('msDialogIsClosed', function () {\r\n hasOpenDialogCnt--\r\n })\n\n $state.defaultErrorHandler(function (error) {\r\n // This is a naive example of how to silence the default error handler.\r\n //console.log(error);\r\n });\n\n // Activate loading indicator\n var stateChangeStartEvent = $transitions.onStart({}, function (transition) {\r\n var stateName = transition.to().name;\n var toParams = transition.targetState().params();\n var loggedIn = authService.isLoggedIn();\n var sessionRole = authService.roleType;\n\n if ($rootScope.loginDialogIsDisplayed) {\r\n if (stateName == 'app.pages_auth_forgotUserName' ||\n stateName == 'app.pages_auth_forgot-password' ||\n stateName == 'app.pages_auth_register') {\r\n $mdDialog.cancel();\r\n return;\r\n }\r\n event.preventDefault();\r\n return\r\n } else if (hasOpenDialogCnt > 0) {\r\n $mdDialog.cancel();\r\n event.preventDefault();\r\n return\r\n }\n\n $rootScope.showAdminToolbar = false;\n\n if (stateName.indexOf(\"app.msportal\") == 0) {\r\n if (stateName == 'app.msportal.admin.customers') {\r\n //localStorageService.remove('authorizationUserData');\r\n $rootScope.$broadcast('adminDashboard', authService.adminAuthentication);\r\n } else {\r\n if (authService.roleType == 'Admin') {\r\n $rootScope.showAdminToolbar = true;\r\n $rootScope.$broadcast('adminDashboard', authService.authentication);\r\n }\r\n }\r\n }\n\n if ((stateName == 'app.pages_auth_adminLogin' ||\n stateName == 'app.pages_auth_login' ||\n stateName == 'app.pages_auth_forgotUserName' ||\n stateName == 'app.pages_auth_forgot-password' ||\n stateName == 'app.pages_auth_confirm-user' ||\n stateName == 'app.pages_auth_register' ||\n stateName == 'app.pages_auth_confirmChangeEmail' ||\n stateName == 'app.pages_auth_reset-password' ||\n stateName == 'app.pages_auth_reset-user' ||\n stateName == 'app.page_loading_failed')) {\r\n\n if (stateName == 'app.page_loading_failed' && !toParams.resumeState) {\r\n transition.abort();\n if (stateName == 'app.pages_auth_adminLogin') {\r\n $state.go('app.pages_auth_adminLogin');\r\n }\n else { $state.go('app.pages_auth_login'); }\r\n }\n if (stateName != 'app.page_loading_failed' && loggedIn) {\r\n transition.abort();\n\n if (!authService.roleType) {\r\n $state.go('app.msportal.accounts');\r\n }\n else {\r\n $state.go('app.msportal.accounts', { CID: authService.authentication.CustomerID });\r\n var account = {\r\n Username: authService.authentication.userName,\r\n CustomerIDNumber: authService.authentication.CustomerID\r\n }\r\n $rootScope.$broadcast('simulateAccount', account);\r\n }\r\n\n } else {\r\n Idle.unwatch(); //stop monitoring session\n }\r\n }\n else {\r\n if (!loggedIn && stateName != 'app.pages_utility_contact' && stateName != 'app.pages_utility_location') {\r\n transition.abort();\n if (stateName == 'app.pages_auth_adminLogin' ||\r\n stateName == 'app.msportal.admin.customization' ||\r\n stateName == 'app.msportal.admin.customers') {\r\n $state.go('app.pages_auth_adminLogin');\r\n }\n else {\n authService.logOut();\n\n if (sessionRole == 'Admin') {\n $state.go('app.pages_auth_adminLogin');\n }\n else if (!sessionRole && url.toString().toLowerCase().indexOf(\"/mscp/enotify.asp\") >= 0) {\r\n if (eType == 1 || eType == 2) {\n commonService.viewPDF(url);\n url = \"\";\n }\n else {\n $state.go('app.pages_auth_login');\n }\r\n }\n else {\n $state.go('app.pages_auth_login');\n }\r\n }\r\n }\n else {\r\n\r\n Idle.watch();\r\n\r\n if (!sessionRole) {\r\n if (stateName == \"app.msportal.accounts\" && url.toString().toLowerCase().indexOf(\"/mscp/enotify.asp\") >= 0) {\r\n commonService.viewPDF(url);\n url = \"\";\r\n }\r\n }\n }\r\n }\r\n\r\n if (stateName.indexOf(\"app.msportal\") == 0) {\r\n var showMenu;\r\n if (stateName == 'app.msportal.admin.customers' || stateName == 'app.msportal.accounts') {\r\n showMenu = false;\r\n\r\n if (authService.roleType == 'Admin' && stateName == 'app.msportal.accounts' && (!authService.authentication.CustomerID && !toParams.CID)) {\r\n $rootScope.showAdminToolbar = false;\r\n transition.abort();\r\n $state.go('app.msportal.admin.customers');\r\n }\r\n }\r\n else {\r\n showMenu = true;\r\n\r\n //If simulated account is changed by modifying the URL or thru the browser history, refresh username and CID\r\n if (authService.roleType == 'Admin') {\n if (prevSimulatedAcctNo != toParams.id) {\n if (stateName == 'app.msportal.contactUs') {\n $state.go('app.msportal.contactUs');\n }\n else {\r\n CustomerContext.GetCustomerByAccountNo(toParams.id).then(\r\n function (res) {\r\n if (res.CustomerIDNumber != authService.authentication.CustomerID) {\r\n $rootScope.$broadcast('simulateAccount', res)\r\n }\r\n }, function (err) {\r\n transition.abort();\r\n commonService.displayError('No records were found for the account number ' + toParams.id);\r\n if (authService.roleType == 'Admin') {\r\n $state.go('app.msportal.admin.customers');\r\n } else {\r\n $state.go('app.msportal.accounts');\r\n }\r\n\r\n })\n }\r\n }\r\n prevSimulatedAcctNo = toParams.id;\r\n }\r\n }\r\n\r\n $rootScope.$broadcast('isAccountSelected', { id: toParams.id, showMenu: showMenu });\r\n }\n\n $rootScope.loadingProgress = true;\r\n\n });\n\n var stateChangeErrorListener = $transitions.onError({}, function (transition) {\r\n var resumeState = angular.copy(transition.to());\n $rootScope.loadingProgress = false;\n\n /*\n If firstRedirection is true, it means the splash screen\n is displayed, and splash screen gets stuck\n if redirection fails, so redirect to error screen.\n */\n if (!$rootScope.splashScreenIsRemoved) {\n transition.abort();\r\n $state.go('app.page_loading_failed', { resumeState: resumeState });\r\n } else {\r\n commonService.displayError('Could not load requested page. Please try again later.')\r\n }\r\n });\n\n //Ebill notification\n function getParameterByName(name, url) {\r\n if (!url) url = window.location.href;\r\n name = name.replace(/[\\[\\]]/g, \"\\\\$&\");\r\n var regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\"),\r\n results = regex.exec(url);\r\n if (!results) return null;\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\r\n }\n\n // De-activate loading indicator\n var stateChangeSuccessEvent = $transitions.onSuccess({}, function (transition) {\r\n if (!$rootScope.splashScreenIsRemoved) {\r\n $rootScope.splashScreenIsRemoved = true;\n $rootScope.$broadcast('msSplashScreen::remove');\r\n }\n\n $timeout(function () {\r\n $rootScope.loadingProgress = false;\n pageValidation(transition);\r\n });\r\n\r\n });\n\n // Store state in the root scope for easy access\n $rootScope.state = $state;\n\n // Cleanup\n $rootScope.$on('$destroy', function () {\r\n stateChangeStartEvent();\n stateChangeSuccessEvent();\r\n });\n\n function pageValidation(transition) {\n var next = transition.to();\n if (typeof (next.data) == \"undefined\") {\r\n transition.abort();\n $state.go('app.pages_auth_login');\r\n }\n\n var authorizedRoles = next.data.authorizedRoles;\n\n if (authorizedRoles[0] != \"*\") {\n //TODO:Elaborate more - Role should be checked\n if (!authService.isAuth) {\r\n transition.abort();\n $state.go('app.pages_auth_login');\r\n }\r\n }\r\n }\n\n var networkConnectionStatusIndicatorTimer;\n\n $window.addEventListener(\"offline\", function () {\n $rootScope.$apply(function () {\n $rootScope.network.online = false;\n $rootScope.network.showWarning = true;\n $timeout.cancel(networkConnectionStatusIndicatorTimer);\n });\n }, false);\n\n $window.addEventListener(\"online\", function () {\n $rootScope.$apply(function () {\n $rootScope.network.online = true;\n networkConnectionStatusIndicatorTimer = $timeout(function () {\n $rootScope.network.showWarning = false;\n }, 3000);\n });\n }, false);\r\n }\r\n})();\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .config(routeConfig);\r\n\r\n /** @ngInject */\r\n function routeConfig($stateProvider, $urlRouterProvider, $locationProvider)\r\n {\r\n $locationProvider.html5Mode(true);\r\n\r\n // MND-422 Modify Landing Page to Accounts List\r\n $urlRouterProvider.otherwise('/portal/accounts');\r\n\r\n /**\r\n * Layout Style Switcher\r\n *\r\n * This code is here for demonstration purposes.\r\n * If you don't need to switch between the layout\r\n * styles like in the demo, you can set one manually by\r\n * typing the template urls into the `State definitions`\r\n * area and remove this code\r\n */\r\n // Inject $cookies\r\n var $cookies;\r\n\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // Get active layout\r\n var layoutStyle = $cookies.get('layoutStyle') || 'verticalNavigation';\r\n\r\n var layouts = {\r\n verticalNavigation : {\r\n main : 'app/core/layouts/vertical-navigation.html',\r\n toolbar: 'app/toolbar/layouts/vertical-navigation/toolbar.html',\r\n admin_toolbar: 'app/toolbar/layouts/vertical-navigation/admin_toolbar.html',\r\n navigation: 'app/navigation/layouts/vertical-navigation/navigation.html'\r\n },\r\n verticalNavigationFullwidthToolbar : {\r\n main : 'app/core/layouts/vertical-navigation-fullwidth-toolbar.html',\r\n toolbar : 'app/toolbar/layouts/vertical-navigation-fullwidth-toolbar/toolbar.html',\r\n navigation: 'app/navigation/layouts/vertical-navigation/navigation.html'\r\n },\r\n verticalNavigationFullwidthToolbar2 : {\r\n main : 'app/core/layouts/vertical-navigation-fullwidth-toolbar-2.html',\r\n toolbar : 'app/toolbar/layouts/vertical-navigation-fullwidth-toolbar-2/toolbar.html',\r\n navigation: 'app/navigation/layouts/vertical-navigation-fullwidth-toolbar-2/navigation.html'\r\n },\r\n horizontalNavigation: {\r\n main : 'app/core/layouts/horizontal-navigation.html',\r\n toolbar: 'app/toolbar/layouts/horizontal-navigation/toolbar.html',\r\n navigation: 'app/navigation/layouts/horizontal-navigation/navigation.html'\r\n },\r\n contentOnly : {\r\n main : 'app/core/layouts/content-only.html',\r\n toolbar : '',\r\n navigation: ''\r\n },\r\n contentWithToolbar : {\r\n main : 'app/core/layouts/content-with-toolbar.html',\r\n toolbar : 'app/toolbar/layouts/content-with-toolbar/toolbar.html',\r\n navigation: ''\r\n }\r\n };\r\n // END - Layout Style Switcher\r\n\r\n // State definitions\r\n $stateProvider\r\n .state('app', {\r\n abstract: true,\r\n views : {\r\n 'main@' : {\r\n templateUrl: layouts[layoutStyle].main,\r\n controller : 'MainController as vm'\r\n },\r\n 'toolbar@app' : {\r\n templateUrl: layouts[layoutStyle].toolbar,\r\n controller : 'ToolbarController as vm'\r\n },\r\n 'admin_toolbar@app': {\r\n templateUrl: layouts[layoutStyle].admin_toolbar,\r\n controller: 'AdminToolbarController as vm'\r\n },\r\n 'navigation@app': {\r\n templateUrl: layouts[layoutStyle].navigation,\r\n controller : 'NavigationController as vm'\r\n },\r\n 'quickPanel@app': {\r\n templateUrl: 'app/quick-panel/quick-panel.html',\r\n controller : 'QuickPanelController as vm'\r\n }\r\n }\r\n })\r\n .state('app.page_loading_failed', {\r\n url: '/page-loading-failed',\r\n params:{\r\n resumeState:null\r\n },\r\n views: {\r\n 'main@': {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller: 'MainController as vm'\r\n },\r\n 'content@app.page_loading_failed': {\r\n templateUrl: 'app/page-load-failed/page-load-failed.html'\r\n }\r\n },\r\n bodyClass: 'login',\r\n data: {\r\n authorizedRoles: ['*'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\r\n }\r\n });\r\n }\r\n\r\n})();\r\n\n(function () {\n 'use strict';\n\n angular\n .module('fuse')\n .controller('IndexController', IndexController);\n\n /** @ngInject */\n function IndexController(fuseTheming, $scope, Idle, authService, $mdDialog, $mdMedia, $state, $rootScope, AUTH_EVENTS, $http, $location, $transitions) {\n var vm = this;\n\n // Data\n vm.themes = fuseTheming.themes;\n $scope.currentUser = null;\n $scope.roleType = '';\n\n //if ($location.host() != 'localhost') {\n // $http.get(\"https://ipinfo.io/\" + $location.host()).then(function (response) {\r\n // $scope.ip = response.data.ip;\r\n // });\n //}\n\n //Start monitoring session, if not already monitoring\n if (!Idle.running()) {\n Idle.watch();\n }\n\n var removeIdleTimeoutListener = $scope.$on('IdleTimeout', function () {\n // the user's session has timed out \n authService.logOut(false);\n if ($state.current.name != 'app.pages_utility_contact' && $state.current.name != 'app.pages_utility_location') {\n authService.showFloatingLogin();\n }\n\n });\n\n //This is executed when the user logs in (using the floating login dialog) using a different account after his/her session expires\n //In which case, the user will be redirected to customer/accounts list\n //The login dialog should only be closed after the redirection\n var stateChangeSuccessEvent = $transitions.onSuccess({}, function (transition) {\n if ($rootScope.loginDialogIsDisplayed) {\n $mdDialog.hide();\n }\n });\n\n $scope.$on('$destroy', function () {\n Idle.unwatch();\n removeIdleTimeoutListener();\n removeIdleEndListener();\n stateChangeSuccessEvent();\n })\n\n $rootScope.$on(AUTH_EVENTS.loginSuccess), function (userData) {\r\n $scope.setCurrentUser(userData.Username);\r\n };\n\n $scope.setCurrentUser = function (user) {\n $scope.currentUser = user;\n $scope.roleType = authService.roleType;\n };\n }\n})();\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse').constant('ngAuthSettings', {\r\n apiServiceBaseUri: '/Sedc.Multiservice.AspNet.Identity/',\r\n //apiServiceBaseUri: 'https://10.1.0.57/Sedc.Multiservice.AspNet.Identity/', //DevV14\r\n //apiServiceBaseUri: 'https://10.1.0.58/Sedc.Multiservice.AspNet.Identity/', //QCV14\r\n //apiServiceBaseUri: 'https://10.204.0.44/Sedc.Multiservice.AspNet.Identity/', //DevV15\r\n //apiServiceBaseUri: 'https://10.204.0.45/Sedc.Multiservice.AspNet.Identity/', //QCV15\r\n //apiServiceBaseUri: 'http://localhost:60023/',\r\n clientId: 'MSPortal',\r\n clientSecret: 'qMCdFDQuF23RV1Y-1Gq9L3cF3VmuFwVbam4fMTdAfpo'\r\n });\r\n\r\n angular\r\n .module('fuse').constant('AUTH_EVENTS', {\r\n loginSuccess: 'auth-login-success',\r\n loginFailed: 'auth-login-failed',\r\n logoutSuccess: 'auth-logout-success',\r\n sessionTimeout: 'auth-session-timeout',\r\n notAuthenticated: 'auth-not-authenticated',\r\n notAuthorized: 'auth-not-authorized'\r\n });\r\n\r\n angular\r\n .module('fuse').constant('AUTH_ROLES', {\r\n all: '*',\r\n admin: 'admin',\r\n user: 'user'\r\n });\r\n})();\r\n\n(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($httpProvider, IdleProvider, KeepaliveProvider, $mdThemingProvider, TitleProvider) {\r\n // Put your custom configurations here\r\n $httpProvider.interceptors.push('authInterceptorService');\r\n\r\n // configure Idle settings\r\n IdleProvider.idle(5); //Number of SECONDS of inactivity before the user is considered idle\r\n IdleProvider.timeout(900); // number of seconds of idleness before session expires\r\n IdleProvider.keepalive(false);\r\n //KeepaliveProvider.interval(1);\r\n $mdThemingProvider.theme('dark-grey');\r\n TitleProvider.enabled(false);\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .factory('api', apiService);\r\n\r\n ///Base-href case-insensitivity\r\n var base = document.querySelector(\"base\");\r\n var normalized = RegExp(base.href, \"i\").exec(location.href);\r\n base.href = normalized ? normalized[0] : base.href;\r\n\r\n /** @ngInject */\r\n function apiService($resource)\r\n {\r\n /**\r\n * You can use this service to define your API urls. The \"api\" service\r\n * is designed to work in parallel with \"apiResolver\" service which you can\r\n * find in the \"app/core/services/api-resolver.service.js\" file.\r\n *\r\n * You can structure your API urls whatever the way you want to structure them.\r\n * You can either use very simple definitions, or you can use multi-dimensional\r\n * objects.\r\n *\r\n * Here's a very simple API url definition example:\r\n *\r\n * api.getBlogList = $resource('http://api.example.com/getBlogList');\r\n *\r\n * While this is a perfectly valid $resource definition, most of the time you will\r\n * find yourself in a more complex situation where you want url parameters:\r\n *\r\n * api.getBlogById = $resource('http://api.example.com/blog/:id', {id: '@id'});\r\n *\r\n * You can also define your custom methods. Custom method definitions allow you to\r\n * add hardcoded parameters to your API calls that you want to sent every time you\r\n * make that API call:\r\n *\r\n * api.getBlogById = $resource('http://api.example.com/blog/:id', {id: '@id'}, {\r\n * 'getFromHomeCategory' : {method: 'GET', params: {blogCategory: 'home'}}\r\n * });\r\n *\r\n * In addition to these definitions, you can also create multi-dimensional objects.\r\n * They are nothing to do with the $resource object, it's just a more convenient\r\n * way that we have created for you to packing your related API urls together:\r\n *\r\n * api.blog = {\r\n * list : $resource('http://api.example.com/blog'),\r\n * getById : $resource('http://api.example.com/blog/:id', {id: '@id'}),\r\n * getByDate: $resource('http://api.example.com/blog/:date', {id: '@date'}, {\r\n * get: {\r\n * method: 'GET',\r\n * params: {\r\n * getByDate: true\r\n * }\r\n * }\r\n * })\r\n * }\r\n *\r\n * If you look at the last example from above, we overrode the 'get' method to put a\r\n * hardcoded parameter. Now every time we make the \"getByDate\" call, the {getByDate: true}\r\n * object will also be sent along with whatever data we are sending.\r\n *\r\n * All the above methods are using standard $resource service. You can learn more about\r\n * it at: https://docs.angularjs.org/api/ngResource/service/$resource\r\n *\r\n * -----\r\n *\r\n * After you defined your API urls, you can use them in Controllers, Services and even\r\n * in the UIRouter state definitions.\r\n *\r\n * If we use the last example from above, you can do an API call in your Controllers and\r\n * Services like this:\r\n *\r\n * function MyController (api)\r\n * {\r\n * // Get the blog list\r\n * api.blog.list.get({},\r\n *\r\n * // Success\r\n * function (response)\r\n * {\r\n * console.log(response);\r\n * },\r\n *\r\n * // Error\r\n * function (response)\r\n * {\r\n * console.error(response);\r\n * }\r\n * );\r\n *\r\n * // Get the blog with the id of 3\r\n * var id = 3;\r\n * api.blog.getById.get({'id': id},\r\n *\r\n * // Success\r\n * function (response)\r\n * {\r\n * console.log(response);\r\n * },\r\n *\r\n * // Error\r\n * function (response)\r\n * {\r\n * console.error(response);\r\n * }\r\n * );\r\n *\r\n * // Get the blog with the date by using custom defined method\r\n * var date = 112314232132;\r\n * api.blog.getByDate.get({'date': date},\r\n *\r\n * // Success\r\n * function (response)\r\n * {\r\n * console.log(response);\r\n * },\r\n *\r\n * // Error\r\n * function (response)\r\n * {\r\n * console.error(response);\r\n * }\r\n * );\r\n * }\r\n *\r\n * Because we are directly using $resource service, all your API calls will return a\r\n * $promise object.\r\n *\r\n * --\r\n *\r\n * If you want to do the same calls in your UI Router state definitions, you need to use\r\n * \"apiResolver\" service we have prepared for you:\r\n *\r\n * $stateProvider.state('app.blog', {\r\n * url : '/blog',\r\n * views : {\r\n * 'content@app': {\r\n * templateUrl: 'app/main/apps/blog/blog.html',\r\n * controller : 'BlogController as vm'\r\n * }\r\n * },\r\n * resolve : {\r\n * Blog: function (apiResolver)\r\n * {\r\n * return apiResolver.resolve('blog.list@get');\r\n * }\r\n * }\r\n * });\r\n *\r\n * You can even use parameters with apiResolver service:\r\n *\r\n * $stateProvider.state('app.blog.show', {\r\n * url : '/blog/:id',\r\n * views : {\r\n * 'content@app': {\r\n * templateUrl: 'app/main/apps/blog/blog.html',\r\n * controller : 'BlogController as vm'\r\n * }\r\n * },\r\n * resolve : {\r\n * Blog: function (apiResolver, $stateParams)\r\n * {\r\n * return apiResolver.resolve('blog.getById@get', {'id': $stateParams.id);\r\n * }\r\n * }\r\n * });\r\n *\r\n * And the \"Blog\" object will be available in your BlogController:\r\n *\r\n * function BlogController(Blog)\r\n * {\r\n * var vm = this;\r\n *\r\n * // Data\r\n * vm.blog = Blog;\r\n *\r\n * ...\r\n * }\r\n */\r\n\r\n var api = {};\r\n\r\n // Base Url\r\n api.baseUrl = 'app/data/';\r\n\r\n // api.sample = $resource(api.baseUrl + 'sample/sample.json');\r\n\r\n return api;\r\n }\r\n})();\r\n\n(function () {\n 'use strict';\n\n angular\n .module('app.admin',\n [\n 'flow'\n ]\n )\n .config(config);\n\n /** @ngInject */\n function config($stateProvider, $translatePartialLoaderProvider, msApiProvider, msNavigationServiceProvider) {\n // State\n $stateProvider\n .state('app.admin', {\r\n abstract: true,\n url: '/admin'\r\n })\n .state('app.admin.customers', {\r\n url: '/customers',\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/adminpages/views/customer_list/customer_list.html',\n controller: 'CustomerListController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n })\n\n .state('app.admin.customization', {\r\n url: '/customizePortal',\n views: {\r\n 'content@app': {\r\n templateUrl: 'app/main/adminpages/views/customizePortal/customizePortal.html',\n controller: 'CustomizePortalController as vm'\r\n }\r\n },\n bodyClass: 'msportal',\n data: {\r\n authorizedRoles: ['user'] //TODO: Use constant for consistency. It wasn't done that way because of issue trying to inject constant to a config\n }\r\n });\n\n // Translation\n //$translatePartialLoaderProvider.addPart('app/main/adminPages');\n $translatePartialLoaderProvider.addPart('app/main/msportal');\n\n // Api\n //msApiProvider.register('msportal.accounts', ['app/data/msportal/accounts.json']);\n //msApiProvider.register('msportal.services', ['app/data/msportal/product.json']);\n\n // Navigation\n //msNavigationServiceProvider.saveItem('msportal', {\n // title: 'My Account',\n // icon: 'icon-account-multiple',\n // weight: 2\n //});\n\n //msNavigationServiceProvider.saveItem('fuse', {\n // title: 'CUSTOMER SERVICES PORTAL',\n // group: true,\n // weight: 1\n //});\n\n\n //msNavigationServiceProvider.saveItem('msportal.accounts', {\n // title: 'Accounts',\n // state: 'app.msportal.accounts',\n // icon: 'icon-file-multiple',\n // weigth: 3\n //});\n\n \n\n }\n})();\nangular.module(\"fuse\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/quick-panel/quick-panel.html\",\"TODAY\\nCHATACTIVITY\\n\");\n$templateCache.put(\"app/page-load-failed/page-load-failed.html\",\"

Alert

Service is currently unavailable due to maintenance.

\\n
Please try again later
\");\n$templateCache.put(\"app/core/layouts/content-only.html\",\"
\\nYou went offline! You are now online!
\");\n$templateCache.put(\"app/core/layouts/content-with-toolbar.html\",\"
\\n
\");\n$templateCache.put(\"app/core/layouts/horizontal-navigation.html\",\"
\");\n$templateCache.put(\"app/core/layouts/vertical-navigation-fullwidth-toolbar-2.html\",\"
\\n
\");\n$templateCache.put(\"app/core/layouts/vertical-navigation-fullwidth-toolbar.html\",\"
\\n
\");\n$templateCache.put(\"app/core/layouts/vertical-navigation.html\",\"
\\nYou went offline! You are now online!
\");\n$templateCache.put(\"app/core/theme-options/theme-options.html\",\"
Layout Style:
Vertical Navigation\\nVertical Navigation with Fullwidth Toolbar\\n\\nVertical Navigation with Fullwidth Toolbar 2\\nHorizontal NavigationContent Only\\nContent with Toolbar
\\n
Layout Mode:
\\nBoxedWide
\\n
Color Palette:
\\n{{themeName}}
\");\n$templateCache.put(\"app/auth/adminLogin/adminLogin.html\",\"
\\n

Sorry

\\nWe did not recognize that information.
The problem is one of the following:

    Portal Component Versions


    {{ p.Name }}{{ p.Version }}

    Log in to your account
    \\n
    Username field is required
    \\n
    Password field is required
    \\nLOG IN
    \");\n$templateCache.put(\"app/auth/changeEmail/changeEmail.html\",\"
    Change your e-mail
    Your current e-mail is: {{ChangeEmailBindingModel.OldEmail}}
    \\n\\n
    New e-mail field is required.
    E-mail must be a valid e-mail address.
    E-mail must be a valid e-mail address.\\n
    \\nOld and new e-mail must not be the same.
    \\n{{changeEmailForm.newEmail.$setValidity(\\\"notEqualTo\\\", !((changeEmailForm.newEmail.$viewValue.substring(changeEmailForm.newEmail.$viewValue.indexOf(\\'@\\')).toLowerCase() == ChangeEmailBindingModel.OldEmail.substring(ChangeEmailBindingModel.OldEmail.indexOf(\\'@\\')).toLowerCase()) && (changeEmailForm.newEmail.$viewValue.substring(0, changeEmailForm.newEmail.$viewValue.indexOf(\\'@\\')).toLowerCase() == ChangeEmailBindingModel.OldEmail.substring(0, ChangeEmailBindingModel.OldEmail.indexOf(\\'@\\')).toLowerCase())))}}\\n
    Confirm e-mail field is required.
    \\nNew e-mail and e-mail confirm does not match.
    E-mail must be a valid e-mail address.
    \\n{{changeEmailForm.emailConfirm.$setValidity(\\\"match\\\", !((changeEmailForm.newEmail.$viewValue.substring(changeEmailForm.newEmail.$viewValue.indexOf(\\'@\\')).toLowerCase() != changeEmailForm.emailConfirm.$viewValue.substring(changeEmailForm.emailConfirm.$viewValue.indexOf(\\'@\\')).toLowerCase()) || (changeEmailForm.newEmail.$viewValue.substring(0, changeEmailForm.newEmail.$viewValue.indexOf(\\'@\\')).toLowerCase() != changeEmailForm.emailConfirm.$viewValue.substring(0, changeEmailForm.emailConfirm.$viewValue.indexOf(\\'@\\')).toLowerCase())))}}\\n
    Password field is required.
    \\n
    \");\n$templateCache.put(\"app/auth/changePassword/changePassword.html\",\"
    Change your password
    \\n
    \\n
    \\n
    Password must contain the following:
    • \\nat least one lowercase letter
    • at least one uppercase letter
    • at least one number
    • \\nat least one special character
    \\n
    \\n
    \");\n$templateCache.put(\"app/auth/changeUserName/changeUserName.html\",\"
    Change your username
    \\n
    Username field is required
    \\nUsername is invalid
    • \\nUsername may consist only of alphanumeric characters and the special characters at sign, underscore and period (@ _ .)\\n
    • Other special characters and spaces are NOT allowed
    \");\n$templateCache.put(\"app/auth/confirm-user/confirm-user.html\",\"
    Account Creation\\n

    Congratulations!

    Error!

    \\n

    \\nPlease wait a minute while the application confirm your information...

    Please wait a minute while the application resending activation email...\\n

    Error!

    We encountered an error while activating your account.
      Unknown Error! Please try again later.


      Return to Portal Login

      Expired Link!

      \\nThe activation link has expired. Click on the link below to resend activation email.

      Resend Activation Email

      Return to Portal Login

      Activation Email Sent!

      \\n
      Please check your e-mail and confirm your registration.


      Return to Portal Login

      \\nResend Activation Email unsuccessful!

      \\nAn error occured while resending activation email. Please click on the link below to resend activation email again.\\n

      Resend Activation Email

      Return to Portal Login
      \\n
      \");\n$templateCache.put(\"app/auth/floating-login/floating_login.html\",\"
      \\nYou have been logged out due to inactivity. Please log back in to continue.
      \\n

      Sorry

      We did not recognize that information.

      \\nThe problem is one of the following:

        Username field is required\\n
        \\n
        Password field is required
        \\n\\n
        Stay signed in
        \\nLOG IN
        \\nDon\\'t have an account?
        \");\n$templateCache.put(\"app/auth/contact/contact.html\",\"

        \\n{{ofc.OfficeTypeDesc}} - {{ofc.City}}, {{ofc.State}}

        E-mail

        \\n{{ofc.EmailAddress}}

        N/A

        Telephone\\n

        N/A

        Working Hours

        {{ofc.WorkingHours}}

        N/A

        Services Provided\\n

        {{ofc.Services}}

        N/A

        \\n

        Go back to Login\\n
        \");\n$templateCache.put(\"app/auth/confirmChangeEmail/confirmChangeEmail.html\",\"
        Change E-mail Confirmed

        Congratulations!

        \\nPlease wait a minute while the application confirm your information...

        \\n\\n\\n

        Error!

        We could not confirm your information, please check this issues:


          Return to Portal Login
          \\n
          \");\n$templateCache.put(\"app/auth/forgot-password/forgot-password.html\",\"
          Recover your password
          \\n
          \\n
          Username field is required
          \\nSEND RESET LINK\\n
          \");\n$templateCache.put(\"app/auth/forgotUserName/forgot-username.html\",\"
          Recover your username
          E-mail field is required
          \\nE-mail must be a valid e-mail address
          {{notification.message}}
          \\n
          SEND RESET LINK\\n
          \");\n$templateCache.put(\"app/auth/location/location.html\",\"\");\n$templateCache.put(\"app/auth/reset-password/reset-password.html\",\"
          Password field is required
          Password must contain the following:
          • at least one lowercase letter
          • \\n
          • at least one uppercase letter
          • at least one number
          • at least one special character
          \\n
          Password must be at least 6 characters long.
          \\n
          Password (Confirm) field is required
          \\n
          RESET MY PASSWORD
          Your password has been reset
          \");\n$templateCache.put(\"app/auth/register/register.html\",\"
          SEDC
          Create an account
          \\n
          Account No. field is required
          Username field is required
          \\nUsername is invalid
          • \\nUsername may consist only of alphanumeric characters and the special characters at sign, underscore and period (@ _ .)\\n
          • Other special characters and spaces are NOT allowed
          \\n
          E-mail field is required
          E-mail must be a valid e-mail address
          \\n
          \\n
          E-mail (Confirm) field is required
          \\n
          Password field is required
          \\nPassword must contain the following:
          • \\nat least one lowercase letter
          • at least one uppercase letter
          • at least one number
          • \\nat least one special character
          \\nPassword must be at least 6 characters long.
          Password (Confirm) field is required
          \\n
          \\n
          CREATE MY ACCOUNTAlready have an account? Log in
          \");\n$templateCache.put(\"app/auth/login/ErrorPage.html\",\"
          Log in to your account

          Sorry

          We did not recognize that information.

          The problem is one of the following:

          \");\n$templateCache.put(\"app/auth/login/login.html\",\"
          Log in to your account

          \\nSorry

          We did not recognize that information.

          \\nThe problem is one of the following:

            Username field is required\\n
            \\n
            Password field is required
            \\n\\n
            Stay signed in
            \\nLOG IN
            \\nDon\\'t have an account?
            Version {{portalVersion}}\\n
            \");\n$templateCache.put(\"app/auth/reset-user/reset-user.html\",\"
            SEDC
            \\n

            Your password has been changed.

              \\n
              \\nPassword must contain the following:
              • at least one lowercase letter
              • at least one uppercase letter\\n
              • at least one number
              • at least one special character
              \\n
              \\n
              \\n
              SEND RESET LINK\\n
              \");\n$templateCache.put(\"app/main/msportal/msportal.html\",\"
              \\n
              \\n
              \\n
              \");\n$templateCache.put(\"app/core/directives/ms-info-bar/ms-info-bar.html\",\"
              \\n
              \");\n$templateCache.put(\"app/core/directives/ms-material-color-picker/ms-material-color-picker.html\",\"
              {{vm.selectedColor.palette}} {{vm.selectedColor.hue}} Select Color
              \\n{{vm.selectedColor.palette}} {{vm.selectedColor.hue}} Select Color\\n\\n
              {{palette}}
              {{hue}}
              \");\n$templateCache.put(\"app/core/directives/ms-shortcuts/ms-shortcuts.html\",\"
              0\\\" \\nng-sortable=\\\"MsShortcuts.sortableOptions\\\">
              \\n
              {{shortcut.title.charAt(0)}}
              {{shortcut.title}}
              \\nClick to add/remove shortcut
              No Results!
              \\n
              \\n
              {{result.title}}
              \\n
              \\n
              \");\n$templateCache.put(\"app/core/directives/ms-search-bar/ms-search-bar.html\",\"
              \\n
              No Results!\\n
              \\n
              {{result.title}}
              {{result.description}}\\n
              \");\n$templateCache.put(\"app/navigation/layouts/horizontal-navigation/navigation.html\",\"
              \");\n$templateCache.put(\"app/navigation/layouts/vertical-navigation/navigation.html\",\"
              \\n
              \");\n$templateCache.put(\"app/navigation/layouts/vertical-navigation-fullwidth-toolbar-2/navigation.html\",\"\");\n$templateCache.put(\"app/quick-panel/tabs/today/today-tab.html\",\"Today\\n
              \\n
              {{vm.date | date:\\'EEEE\\'}}
              {{vm.date | date:\\'d\\'}} \\nth {{vm.date | date:\\'MMMM\\'}}
              \\nEvents\\n

              {{event.title}}

              {{event.detail}}

              \\nNotes\\n
              \\n

              {{note.title}}

              {{note.detail}}

              \\nQuick Settings\\n

              Notifications

              Cloud Sync

              \\n

              Retro Thrusters

              \");\n$templateCache.put(\"app/quick-panel/tabs/chat/chat-tab.html\",\"
              Recent\\\"{{contact.name}}\\\"
              {{contact.unread}}

              {{contact.name}}

              {{contact.lastMessage}}

              \\n
              Start New Chat\\\"{{contact.name}}\\\"
              \\n

              {{contact.name}}

              \\n{{vm.chat.contact.name}}

              \\n
              \\\"{{vm.chat.contact.name}}\\\"
              {{dialog.message}}
              {{dialog.time}}
              \\n
              \\n
              \");\n$templateCache.put(\"app/quick-panel/tabs/activity/activity-tab.html\",\"Friends\\n\\\"{{friend.name}}\\\"
              {{contact.unread}}

              {{friend.message}}

              {{friend.time}}

              \\n
              Application Servers

              {{server.location}}

              {{server.detail}}

              \\n
              User Stats
              \\n{{stat.title}} ({{stat.current}} / {{stat.total}})
              \");\n$templateCache.put(\"app/toolbar/layouts/content-with-toolbar/toolbar.html\",\"
              F FUSE
              \\n
              \\n
              \\n
              Hi,{{vm.session.userName}}
              \\nreset passwordLogout\\n
              \");\n$templateCache.put(\"app/toolbar/layouts/vertical-navigation-fullwidth-toolbar/toolbar.html\",\"
              \\n
              \\n
              Hi,{{vm.session.userName}}
              \\nChange Password\\nLogout
              \");\n$templateCache.put(\"app/toolbar/layouts/vertical-navigation/admin_toolbar.html\",\"
              \\n
              Good day {{vm.session.roleType}},\\n {{vm.session.userName}}
              Change Password\\nChange Username\\nChange E-mail\\nLogout\\n
              \");\n$templateCache.put(\"app/toolbar/layouts/vertical-navigation/toolbar.html\",\"
              \\n
              \\n
              Hi {{vm.session.roleType}},\\n{{vm.session.userName}}
              \\nHi, {{vm.session.userName}}
              \\nChange PasswordChange Username\\n\\nChange E-mailLogout\\n
              \");\n$templateCache.put(\"app/toolbar/layouts/horizontal-navigation/toolbar.html\",\"
              F FUSE
              \\n
              \\n
              \\n
              Hi,{{vm.session.userName}}
              \\nreset passwordLogout\\n
              \");\n$templateCache.put(\"app/toolbar/layouts/vertical-navigation-fullwidth-toolbar-2/toolbar.html\",\"
              F FUSE
              \\n
              \\n\\n
              \\n
              Hi,\\n{{vm.session.userName}}
              Change Password\\nLogout
              \");\n$templateCache.put(\"app/core/directives/ms-navigation/templates/horizontal.html\",\"
              \");\n$templateCache.put(\"app/core/directives/ms-navigation/templates/vertical.html\",\"
              \\n\");\n$templateCache.put(\"app/main/adminpages/views/customer_list/customer_list.html\",\"
              {{vm.titlePage}}
              0\\\">\\n{{vm.totalCount}} 1\\\">resultsresult\\n
              {{type}}{{field}}Search\\nEnter a search criteria in Search box to return results.
              \\nInvalid input. Customer ID must be 5 digits. \\nInvalid input. Account Number must be 8 digits. \\nPlease make sure there are no numbers or special characters.
              0 && vm.totalCount > 10\\\">View\\n{{length}}Page \\n{{page}}of {{vm.totalpages}}\\n
              \\n
              \\nCustomer ID
              Account No.
              Username
              E-mail
              Name
              Address\\n
              Balance
              Actions
              {{account.data.CustomerIDNumber}}{{account.data.MemberNo}}\\n{{account.data.Username}}{{account.data.Email}}{{account.data.AccountName}}\\n{{account.data.ServiceAddress}}= 0\\\">\\n${{account.data.Balance | number:2}}\\n-${{account.data.Balance * -1 | number:2}}\\nView
              Unlock \\n{{ account.data.EmailConfirmed === 1 ? \\\"Deactivate\\\" : \\\"Activate\\\" }} Delete
              0 && vm.hasScroll\\\" id=\\\"btnBacktoTop\\\" ng-click=\\\"vm.goTop()\\\">BACK TO TOP
              \");\n$templateCache.put(\"app/main/adminpages/views/customizePortal/customizePortal.html\",\"

              Customize Portal

              \");\n$templateCache.put(\"app/main/msportal/views/accounts/accounts.html\",\"
              \\n

              Accounts

              \\n{{field}}
              \\n
              \\n
              \\nService Address
              Account Status
              Due Date
              Past Due
              Balance
              \\nAccount No
              View Service Details
              {{account.data.ServiceAddress}}\\n\\n{{account.data.Status}}{{account.data.DueDate}}
              \\n{{ account.data.PastDue | currency }}
              {{ account.data.Balance | currency }}
              {{ account.data.Balance * -1 | currency }}
              \\n
              {{account.data.MemberNo}}\\n
              \");\n$templateCache.put(\"app/main/msportal/views/contact_us/contact_us.html\",\"
              \\n

              Contact Us

              \\n
              \\n
              {{ office.Description }} - {{ office.City }}, {{ office.State }}
              \\n
              \\n

              Email

              \\n{{ office.EmailAddress }}

              Telephone

              \\n{{ office.Telephone }}

              Working Hours

              {{ office.WorkingHours }}

              \\n

              Services Provided

              {{ office.Services }}

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/bill_preference/bill_preference.html\",\"
              \\n

              E-Bill -- Account Number {{MemberNo}}

              \\n

              Account No. {{MemberNo}}

              Account Status: {{Service.Status}}

              Amount Due: = 0\\\">${{Service.Balance| number:2}} \\n-${{Service.Balance * -1| number:2}}

              \\nBilling Preference: {{BillingPreferenceDesc}}

              \\n
              \\n

              Instructions

              \\n

              \\nTo enroll the selected account in E-Bill, change the Billing Method to \\'E-Bill\\'. An e-mail address will be required. You must also confirm your e-mail address before clicking \\nSAVE\\n. If you\\'d like the convenience of E-Bill but want to continue receiving paper, change the Billing Method to \\'Paper & E-Bill\\'. To stop receiving E-Bill Notifications at any time, simply change the Billing Method back to \\'Paper\\'.\\n

              Billing Method:

              \\n\\nBilling Method{{b.desc}}\\n

              E-mail 1:

              \\n

              Confirm E-mail 1:

              \\n

              E-mail 2:

              \\n

              \\nConfirm E-mail 2:

              \\n

              Save

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/alerts/alerts.html\",\"
              \\n

              Alerts & Reminders -- Account Number {{vm.account}}\\n

              Subscription Details\\n

              E-mail Address
              E-mail Address is required Invalid E-mail Address
              Confirm E-mail Address \\n
              \\nPlease confirm your e-mail address \\nConfirmation E-mail does not match with E-mail Address
              \\nMobile Number
              Mobile Number is required \\nInvalid format. Mobile Number should be 10 digits
              Mobile Service Provider{{provider.ProviderName}}\\n
              \\nMobile Service Provider is required

              \\nAlerts Service Details

              \\n\\n
              Alert Description
              Text Message
              E-mail
              {{alert.AlertName}} Remind the customerday(s) before. Alert the customer when due date has passed.\\n Alert the customer when account profile has changed. Alert the customer when a check is returned/rejected. Notify the customer when the bill is paid. Alert the customer when a service is connected. Alert the customer when a service is disconnected Alert the customer when a service is reconnected. Alert the customer when Prepaid Balance reaches Alert the customer each day with Prepaid Balance and Usage Remind the customerday(s) before the due date.
              \\n

              * E-mail Address is required

              * Invalid E-mail Address

              * Please confirm your e-mail address

              \\n* Confirmation E-mail does not match with E-mail Address

              \\n* Mobile Number is required

              \\n* Invalid format. Mobile Number should be 10 digits

              \\n* Invalid format. Mobile Number should be 10 digits

              \\n* Mobile Provider is required

              Edit\\nSaveCancel
              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/alerts/subscription_details.html\",\"
              \\n

              Alerts & Reminders

              \\n
              Account Number
              E-mail Address
              Mobile Number
              View Full Detail
              \\n{{account.MbrNo}}{{account.EmailAddr}}{{account.Cellphone}}\\n
              \");\n$templateCache.put(\"app/main/msportal/views/budget_levelized/budgetLevelized.html\",\"

              \\nBudget/Levelized Billing -- Account Number {{vm.MemberNo}}

              Account No. {{vm.MemberNo}}

              \\n

              Account Status: {{vm.Account.Status}}

              Address: {{vm.Account.ServiceAddress}}

              \\n

              Account Name: {{vm.Account.AccountName}}\\n

              Due Date: {{vm.Account.DueDate}}

              Amount Due: = 0\\\">${{vm.Account.Balance| number:2}} -${{vm.Account.Balance * -1| number:2}}

              \\n

              For Signing Up: \\nOnly ACTIVE\\n accounts and services can be enrolled in Budget/Levelized Billling. Select the desired type of billing (Budget Bill or Levelized Bill) and click \\nEDIT then SUBMIT\\n to sign up. The changes you make will be effective with the next billing.

              For Removing: \\nOnce you are signed up for Budget/Levelized Billing, you will be able to see the list of your Enrolled Services\\n. To remove them from Budget/Levelized Billing, click EDIT then REMOVE.

              \\n
              \\n

              Please select the type of billing:

              Budget Bill\\nLevelized Bill\\n
              0 && vm.EnrolledServices.length === 0\\\">
              \\n\\n

              Inactive Services

              0 && vm.EnrolledServices.length === 0\\\" \\nclass=\\\"content-card content fullpage-datatable\\\" layout=\\\"column\\\" layout-gt-sm=\\\"row\\\">\\n
              Service ID
              Description
              Status
              Balance
              \\n
              \\n{{s.data.MemberSep.replace(s.data.MemberNo, s.data.MemberNo + \\\"-\\\")}}\\n{{s.data.Description}}\\n{{s.data.Status}}=0\\\">
              ${{s.data.Balance| number:2}}
              \\n
              -${{s.data.Balance * -1| number:2}}
              0) || (vm.Enrolled && vm.HasExcludedService) && vm.EnrolledServices.length === 0\\\">\\n

              Active Services Excluded Services

              0) || (vm.Enrolled && vm.HasExcludedService) && vm.EnrolledServices.length === 0\\\" \\nclass=\\\"content-card content fullpage-datatable\\\" layout=\\\"column\\\" layout-gt-sm=\\\"row\\\">\\n\\n\\n
              Service ID
              Description
              Status
              Balance
              Amount
              \\n{{s.data.MemberSep.replace(s.data.MemberNo, s.data.MemberNo + \\\"-\\\")}}\\n{{s.data.Description}}\\n{{s.data.Status}}=0\\\">
              ${{s.data.Balance| number:2}}
              \\n
              -${{s.data.Balance * -1| number:2}}
              \\n=0\\\">${{s.data.BudgetBillAmount| number:2}} -${{s.data.BudgetBillAmount * -1| number:2}}

              Enrolled Services\\n

              \\n\\n
              Service ID
              Description
              Status
              Balance
              Amount
              \\n{{s.data.MemberSep.replace(s.data.MemberNo, s.data.MemberNo + \\\"-\\\")}}\\n{{s.data.Description}}\\n{{s.data.Status}}=0\\\">
              ${{s.data.Balance| number:2}}
              \\n
              -${{s.data.Balance * -1| number:2}}
              =0\\\">${{s.data.BudgetBillAmount| number:2}} -${{s.data.BudgetBillAmount * -1| number:2}}

              EditSUBMITREMOVECancel

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/deposits/deposits.html\",\"

              Deposit Information -- Account Number {{vm.account}}\\n

              \\n
              Service ID
              Name
              Service Address
              Consumer Deposits\\n
              Paid Date
              \\n
              Refund Date
              Other Deposits
              Paid Date
              Refund Date
              {{deposit.MemberSep}}{{vm.depositDetailsExt.AccountName}}{{vm.depositDetailsExt.ServiceAddress}}
              \\n{{deposit.ConsumerDeposit | currency }}
              N/A\\n {{deposit.CDPaidDate}}N/A {{deposit.CDRefundDate}}\\n
              {{deposit.OtherDeposit | currency }}
              N/A {{deposit.ODPaidDate}}\\nN/A {{deposit.ODRefundDate}}
              \");\n$templateCache.put(\"app/main/msportal/views/delinquent/delinquent.html\",\"
              \\n

              E-Delinquent -- Account Number {{MemberNo}}\\n

              Account No. {{MemberNo}}

              Account Status: {{Service.Status}}

              Amount Due: = 0\\\">${{Service.Balance| number:2}} \\n-${{Service.Balance * -1| number:2}}

              Delinquent Notice: {{BillingPreferenceDesc}}\\n

              \\nInstructions

              \\nTo enroll the selected account in E-Delinquent, change the Delinquent Method to \\'E-Delinquent\\'. An e-mail address will be required. You must also confirm your e-mail address before clicking \\nSAVE\\n. If you\\'d like the convenience of E-Delinquent, but want to continue receiving paper notices, change the Delinquent Method to \\'Paper & E-Delinquent\\'. To stop receiving E-Delinquent Notifications at any time, simply change the Delinquent Method back to \\'Paper\\'.\\n

              Delinquent Method:\\n

              \\nDelinquent Method{{b.desc}}

              E-mail 1:

              \\n

              \\nConfirm E-mail 1:

              \\n

              E-mail 2:

              \\n

              Confirm E-mail 2:

              \\n

              \\n

              Save

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/draft/bankDraft.html\",\"
              \\n\\n

              Bank Draft

              \\n

              \\nBy signing up for Bank Draft, you authorize us to draft your bank account each month for the total amount of your utility bill. This authority will remain in effect until the selected account has been removed from draft. In the event that a payment cannot be made due to insufficient funds, a service charge may be imposed.\\n

              Your security and privacy are guaranteed, and you make changes to this information at any time.

              \\nBank Routing Number:\\n The routing number is the first nine digits of the encoded number along the bottom of a check. (This may also be referred to as the \\'Transit Number\\'.) If in doubt, contact your bank for the correct number to enter in this field. After clicking \\'Submit\\', the name of your bank should display in the \\'Bank Name\\' field.\\n

              Bank Account Number:\\n The bank account number follows the nine-digit routing number on the encoded line along the bottom of the check. If in doubt, refer to a bank statement or contact your bank.\\n

              Please enter the account name
              \\n
              Please select a Bank Routing Number.
              Invalid Format.
              \\nPlease Select a Bank Account Number
              \\nSavingsChecking
              \\nPlease select an Account Type

              EDITSUBMITDELETECANCEL

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/draft/ccDraft.html\",\"
              \\n\\n

              Credit Card Draft

              \\n

              \\nBy signing up for Credit Card Draft, you authorize us to draft your credit card account each month for the total amount of your utility bill. You will be charged a convenience fee every time your credit card account is drafted.\\n

              \\nThis authority will remain in effect until the selected account has been removed from draft. In the event that a payment cannot be made due to insufficient funds, a service charge may be imposed. Your security and privacy are guaranteed, and you make changes to this information at any time.\\n

              \\nCredit card name is a required field

              \\nWe no longer accept {{vm.CreditCardProfile.CardType}}. Please use one of the following cards:
              0\\\" style=\\\"width:40px\\\">\\n  0\\\" style=\\\"width:40px\\\">  0\\\" style=\\\"width:40px\\\">\\n  0\\\" \\nstyle=\\\"width:40px\\\"> 
              Credit Card is not valid
              Credit Card is a required field!
              \\nCard Security Code is not valid
              Card Security Code is a required field!\\n
              \\n
              Expiration Date must be greater than the date today
              \\n
              \\nZip Code is a required field!

              EDITSUBMITDELETECANCEL

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/draft/drafts.html\",\"

              \\nPayment Drafts -- Account Number {{vm.MemberNo}}

              Account No.: {{vm.MemberNo}}

              Account Status:\\n {{Service.Status}}

              Svc Address: {{Service.ServiceAddress}}

              Account Name: {{Service.AccountName}}

              \\n

              Pay by: {{Service.DueDate}}

              Amount Due: \\n= 0\\\">${{Service.Balance| number:2}} -${{Service.Balance * -1| number:2}}

              \\n

              Please select the type of draft:

              Credit Card Draft\\nBank Draft\\n
              \");\n$templateCache.put(\"app/main/msportal/views/payment/payment.html\",\"
              \\n

              Payment Review -- Account Number {{vm.MemberNo}}

              \\n

               Please select one or more services and then select the payment method.

              \\n
              Note:
              \\nThe payee on your financial statement for the transaction will be listed as \\\"SEDC Payment.\\\"
              \\n
              \\n\\n
              \\n
              Service ID
              Description
              Status
              Due Date
              Past Due
              Balance
              \\n{{service.MemberSep}}{{service.Description}}\\n{{service.Status}}{{service.DueDate}}
              {{ service.PastDue | currency }}
              {{ service.Balance | currency }}
              {{ vm.PPMPaymentLabel }}
              \\n{{ vm.PPMPaymentNeeded | currency }}

              \\nTotal Past Due for this account is {{vm.AccountServices.PaymentDetails.totalPastDueDisplay | currency}}.

              \\nTotal Amount Due for this account is {{vm.AccountServices.PaymentDetails.totalAmountDisplay | currency}}.

              \\nTotal Amount Due for services above is {{vm.AccountServices.PaymentDetails.totalAmountDisplay | currency}}.

              0\\\">\\nTotal Amount Due for services checked above is {{vm.AccountServices.PaymentDetails.totalAmountDisplay | currency}}.

              \\n

              \\nTotal Amount Due for this account is {{vm.AccountServices.PaymentDetails.totalAmount * -1 | currency}}.

              \\nTotal Amount Due for services above is {{vm.AccountServices.PaymentDetails.totalAmount * -1 | currency}}.

              0\\\">\\nTotal Amount Due for services checked above is {{vm.AccountServices.PaymentDetails.totalAmount * -1 | currency}}.

              \\n
              \\nPay with Credit CardPay with e-Check\\n
              \");\n$templateCache.put(\"app/main/msportal/views/mdm_chart/mdm_chart.html\",\"
              \\n

              Usage

              Start Date
              End Date
              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/payment_history/payment_history.html\",\"
              \\n

              \\nPayment History -- Account Number {{MemberNo}}

              \\n
              FilterClear Filter
              \\n
              \\n\\n
              Payment Date
              Amount
              Check No
              Approval Code
              {{b.PaymentDate}}
              {{ b.Amount| currency }}
              {{b.CheckNo}}{{b.ApprovalCode}}

              \\nThe payment of {{TransAmt| currency}} was generated by the system to write off to the account. Contact the utility for more information.\\n

              \");\n$templateCache.put(\"app/main/msportal/views/ppm_history/dailyTransactions.html\",\"

              \\nPrepaid Services History for {{ item.SystemDate | date : \\\"MM/dd/yy\\\"}}

              Service Id
              Charges \\n
              Payment
              Adjustment
              Reconciliation
              Prepaid Balance
              View Details
              {{ p.MemberSep }}
              \\n{{ p.Charges | number:2 }}
              {{ p.Payment | number:2 }}
              {{ p.Adjustment | number:2 }}
              {{ p.Reconciliation | number:2 }}\\n
              {{ p.Balance | number:2 }}\\n
              \\n
              Charges{{ p.Charges | number:2 }}
              Payment {{ p.Payment | number:2 }}
              \\nAdjustment {{ p.Adjustment | number:2 }}
              \\nReconciliation {{ p.Reconciliation | number: 2}}
              \");\n$templateCache.put(\"app/main/msportal/views/ppm_history/ppm_history.html\",\"
              \\n

              \\nPrepaid Account History -- Account Number {{::MemberNo}}

              \\n
              \\n
              Filter\\nClear Filter
              \\n

              \\n{{ PPMAccount.PaymentNotice }} {{ PPMAccount.PaymentNeeded | currency }}


              Date
              Charges \\n
              Payment
              Adjustment
              Reconciliation
              Prepaid Balance
              \\nView History Breakdown
              {{ p.SystemDate | date : \\\"MM/dd/yy\\\" }}
              {{ p.Charges | number:2 }}
              {{ p.Payment | number:2 }}\\n
              \\n{{ p.Adjustment | number:2 }}
              \\n{{ p.Reconciliation | number:2 }}
              {{ p.Balance | number:2 }}
              Charges{{ p.Charges | number:2 }}
              Payment {{ p.Payment | number:2 }}
              \\n
              Adjustment \\n{{ p.Adjustment | number:2 }}
              Reconciliation \\n{{ p.Reconciliation | number: 2}}
              \");\n$templateCache.put(\"app/main/msportal/views/profile/profile.html\",\"

              Unable to load profile details.

              0)\\\">
              \\nThere are some validation errors:
              • 0)\\\">\\nInvalid phone number. \\n
              • 0)\\\">\\nInvalid phone number. 
              • 0)\\\">\\nInvalid phone number. 
              • 0)\\\">\\nInvalid phone number. 
              • 0)\\\">\\nInvalid phone number. 
              • 0)\\\">\\nInvalid phone number. \\n
              • 0)\\\">\\nStreet Number is required. 
              • 0)\\\">Street / P.O. Box is required. \\n\\n
              • 0)\\\">City is required. \\n\\n
              • 0)\\\">\\nState is required. 
              • 0)\\\">\\nThe Postal Code is not in a correct format. 
              • 0)\\\">Zip is required. 
              • \\n
              EditSaveCancel
              \\n
              \\n

              \\nAccount Profile -- Account Number {{vm.MemberNo}}

              \\n

              Contact Information

              \\n
              \\n\\n
              \\n

              Spouse Information

              \\n
              \\n\\n\\n

              \\nBilling Address

              \\n\\n\\n
              \\n
              \\n
              0 || (!vm.Model.state && saveCounter > 0)\\\">\\nState is required.
              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/service_details/service_details.html\",\"

              \\nService Details -- Account Number {{vm.MemberNo}}

              \\n

              Account No.: {{vm.MemberNo}}

              Account Status:\\n {{vm.Service.Status}}

              Svc Address: {{vm.Service.ServiceAddress}}

              \\n

              Account Name:\\n {{vm.Service.AccountName}}

              Pay by: {{vm.Service.DueDate}}\\n

              0\\\">

              Account Balance:\\n -${{vm.Service.Balance | number:2}}

              \\nAccount Balance: ${{vm.Service.Balance * -1 | number:2}}

              0\\\">

              {{vm.ppmLabel}} \\n{{vm.Service.ppmMinPayment | currency}}

              Amount Due: \\n{{ vm.Service.Balance | currency }}

              \\n{{ vm.roundupBillContent }}

              \\n
              \\n

              Services

              Service ID
              Description
              Status
              Past Due
              Balance\\n
              \\n{{s.MemberSep.replace(s.MemberNo, s.MemberNo + \\\"-\\\")}}\\n\\n{{s.Description}}{{s.Status}}
              \\n{{ s.PastDue | currency }}
              {{ s.Balance | currency }}
              \");\n$templateCache.put(\"app/main/msportal/views/services/services.html\",\"
              \\nPayment History\\n
              \\n
              Payment
              E-Bill
              \\n\\nE-Delinquent
              \\nPayment Drafts\\n
              \\nBudget/Levelized Billing
              \\n
              Usage Charts
              Alerts & Reminders
              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/usage_charts/navbar.html\",\"

              Usage Summary

              \\n{{ item }}\");\n$templateCache.put(\"app/main/msportal/views/usage_charts/usagecharts.html\",\"
              \\n
              \\n
              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/usage/usage.html\",\"
              \\n

              \\nBilling History -- Account Number {{MemberNo}}

              \\n
              FilterClear Filter
              \\n
              View PDF
              Bill Date
              Due Date\\n
              Balance
              \\n
              \\n{{b.BillDate}}{{b.DueDate}}
              {{ b.Balance | currency }}
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-1/template-1.html\",\"
              {{card.title}}
              {{card.subtitle}}\\n
              {{card.text}}
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-10/template-10.html\",\"
              \\n
              {{card.title}}
              {{card.subtitle}}
              \\\"{{card.media.image.alt}}\\\"
              {{card.text}}
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-2/template-2.html\",\"
              {{card.title}}
              \\n{{card.subtitle}}
              {{card.text}}\\n
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-5/template-5.html\",\"
              {{card.title}}
              \\n{{card.event}}
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-3/template-3.html\",\"
              {{card.title}}
              {{card.subtitle}}
              {{card.cta}}
              \\\"{{card.media.image.alt}}\\\"
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-4/template-4.html\",\"
              {{card.title}}\\n
              {{card.text}}
              \\\"{{card.media.image.alt}}\\\"
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-6/template-6.html\",\"
              \\n{{card.subtitle}}
              {{card.title}}
              {{card.text}}
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-8/template-8.html\",\"
              {{card.title}}
              {{card.subtitle}}\\n
              {{card.button1}}\\n{{card.button2}}
              {{card.text}}
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-7/template-7.html\",\"
              {{card.title}}\\n
              {{card.subtitle}}
              {{card.text}}
              \\n
              \\\"{{card.media.image.alt}}\\\"
              \");\n$templateCache.put(\"app/core/directives/ms-stepper/templates/horizontal/horizontal.html\",\"
              {{$index + 1}} \\n
              \\n{{step.stepTitle}}
              Optional
              \\n
              Back
              Next\\nSubmit
              \");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-9/template-9.html\",\"
              {{card.title}}
              \\n{{card.subtitle}}
              {{card.text}}
              \\\"{{card.media.image.alt}}\\\"
              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/payment/profile/creditCard.html\",\"
              Credit Card Number: {{vm.CCNumberMasked || \\'NO CC NUMBER\\'}}
              \\n
              \\n
              \\nCredit card name is a required field
              \\n
              \\nWe no longer accept {{vm.GetCCTypeDesc(vm.CreditCardProfile.CardType)}}. Please use one of the following cards:\\n
              0\\\" \\nstyle=\\\"width:40px\\\">  0\\\" style=\\\"width:40px\\\">  0\\\" style=\\\"width:40px\\\">\\n  0\\\" \\nstyle=\\\"width:40px\\\"> 
              Credit Card is not valid
              Credit Card is a required field!
              Card Security Code is not valid
              \\nCard Security Code is a required field!
              \\nExpiration Date must be greater than the date today
              \\nZip Code is not valid
              Zip Code is a required field!
              \\n
              \\n\\n\\n\\n{{ vm.getSaveProfileLabel() }}
              Delete Credit Card Info
              \\n\\nPlease do not click \\\"Pay Now\\\" more than once or you may be charged multiple times.\\n
              \");\n$templateCache.put(\"app/main/msportal/views/payment/profile/eCheck.html\",\"
              \\n
              \\n
              \\n
              \\n
              \\n\\n
              \\n
              \\nPlease enter your last name.
              {{s.Name}}\\n
              Please select a Bank Routing Number.
              Invalid Format.
              \\n
              \\nPlease Select a Bank Account Number
              \\nBank Account Number does not match
              SavingsChecking
              Please select an Account Type
              \\n
              \\n\\n\\n{{ vm.getSaveProfileLabel() }}
              \\n
              Delete ECheck Info
              \\n

              \\nDebit Authorization Agreement

              I, {{vm.ECheckProfile.AccountName}}\\n, authorize SEDC to process this single electronic ACH transaction to debit my bank account number \\n{{vm.BankAccountNumberMasked}} and routing number {{vm.RoutingNumberMasked}} in the amount of \\n{{paymentDetail.AccountServices.PaymentDetails.totalPaymentAmount | currency}}, payable to SEDC

              \\n
              \\nPlease do not click \\\"Pay Now\\\" more than once or you may be charged multiple times.\\n
              \");\n$templateCache.put(\"app/main/msportal/views/payment/receipt/payment_receipt.html\",\"

              Payment Receipt

              \\n

              Payment Complete

              Thank you for your payment.

              \\nThis page serves as your receipt and provides you with a Confirmation number.

              \\nPlease save this information for your records.

              \\nConfirmation Number: {{vm.detail.title}}

              \\n
              ServiceAccountAmount
              {{account.Account}}\\n${{account.Amount | number:2}}
              Total:\\n${{vm.detail.PaymentDetails.totalAmount| number:2}}
              Convenience Fee:\\n\\n${{vm.detail.PaymentDetails.convenienceFee| number:2}}
              Total Payment Amount:\\n${{vm.detail.PaymentDetails.totalPaymentAmount| number:2}}
              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/payment/detail/payment_detail.html\",\"

              {{paymentDetail.title}}

              \\n
              \\n
              Service\\n
              Past Due
              Balance
              \\n
              Payment Amount
              \\n{{ account.MemberSep }}\\n
              {{ account.PastDue | currency }}
              {{ account.Balance | currency }}
              {{ account.Balance * -1 | currency }}\\n
              \\n
              \\n

              Past Due Amount: {{paymentDetail.AccountServices.PaymentDetails.totalPastDueDisplay | currency}}

              \\nTotal:

              \\nPayment Amount:

              \\nNote: \\'Total\\' amount does not include any credit balances. Payment amount can be edited.

              \\nConvenience Fee: {{paymentDetail.AccountServices.PaymentDetails.convenienceFee | currency}}

              \\nTotal Payment Amount: {{paymentDetail.AccountServices.PaymentDetails.totalPaymentAmount | currency}}

              \\n

              Calculating...

              Cancel{{ paymentDetail.paymentLabel }}\\n
              \");\n$templateCache.put(\"app/main/msportal/views/usage_charts/daily/usageDaily.html\",\"
              \\n
              \\n\\n
              {{opt.MemberSep}}
              \\nPlease select a service.
              View Usage

              Please select a service.

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/usage_charts/interval/usageinterval.html\",\"
              \\n
              \\n{{opt.MemberSep}}
              \\nPlease select a service.
              View Usage

              Please select a service.

              \\n
              \");\n$templateCache.put(\"app/main/msportal/views/usage_charts/monthly/usagemonthly.html\",\"
              \\n
              \\n
              \\n
              {{opt.MemberSep}}
              \\nPlease select a service.
              View Usage

              Please select a service.

              \\n
              \");}]);"],"sourceRoot":"/source/"}