{"version":3,"sources":["app-module.js","app.js","my-memberships/join-pod/partials/form-user-details.tpl.html","components/ui/tabs/tabs-manager-directive.tpl.html","components/ui/table/table-user-popover.tpl.html","components/ui/table/table-user-details-directive.tpl.html","user/messages/messages.tpl.html","user/messages/messages-list-partial.tpl.html","user/messages/messages-list-modal.tpl.html","user/marketplace/marketplace.tpl.html","user/leads/sent.tpl.html","user/leads/received.tpl.html","user/connections/connections.tpl.html","user/agreements/agreements.tpl.html","user/agreements/agreement-pricing-detail-directive.tpl.html","my-pod/sent-leads/sent-leads.tpl.html","my-pod/send-invite/send-invite-modal.tpl.html","my-pod/members/members.tpl.html","my-memberships/send-reward/send-reward.tpl.html","my-memberships/import/import.tpl.html","my-memberships/reward-program/welcome-modal-template.tpl.html","my-memberships/reward-program/setup.tpl.html","my-memberships/reward-program/reward-program.tpl.html","my-memberships/reward-program/reward-code-embed.tpl.html","my-memberships/reward-program/reward-code-detail.tpl.html","my-memberships/reward-program/reward-code-create-modal.tpl.html","my-memberships/received-leads/received-leads.tpl.html","my-memberships/memberships/memberships.tpl.html","my-memberships/join-pod/join-pod-modal.tpl.html","dashboard/stats/stats.tpl.html","components/ui/prompt-dialog.tpl.html","components/ui/credit-card-directive.tpl.html","components/ui/apps-store-links-directive.tpl.html","components/ui/action-toolbar-directive.tpl.html","dashboard/pod/pod.tpl.html","dashboard/pod/pod-members-list-directive.tpl.html","dashboard/pod/pod-earnings-graph-directive.tpl.html","dashboard/memberships/received-leads-list-directive.tpl.html","dashboard/memberships/received-leads-graph-directive.tpl.html","dashboard/memberships/memberships.tpl.html","account/profile/profile.tpl.html","account/profile/photo-upload.tpl.html","account/profile/deactivate-modal.tpl.html","account/billing/credit-card.tpl.html","account/billing/billing.tpl.html","account/preferences/preferences-modal.tpl.html","account/preferences/mailing-list-unsubscribe.tpl.html","account/password/reset.tpl.html","account/password/recover.tpl.html","account/feedback/feedback-modal.tpl.html","account/earnings/withdraw.tpl.html","account/earnings/earnings.tpl.html","user/user.tpl.html","user/user-avatar-directive.tpl.html","user/about.tpl.html","toolbar/toolbar.tpl.html","toolbar/business-suggestion-directive.tpl.html","social-share/social-share-directive.tpl.html","search/search-bar-directive.tpl.html","search/search-bar-autocomplete-result-template.tpl.html","search/search-autocomplete-directive.tpl.html","notifications/notification-center-directive.tpl.html","my-pod/my-pod.tpl.html","my-memberships/reward-selector-directive.tpl.html","my-memberships/my-memberships.tpl.html","lead/send-lead.tpl.html","lead/send-lead-modal.tpl.html","lead/send-lead-form-partial.tpl.html","lead/lead-view.tpl.html","lead/lead-detail.tpl.html","lead/close-lead.tpl.html","mlp-marketplace/marketplace.tpl.html","mlp-marketplace/marketplace-listings-directive.tpl.html","mlp-marketplace/marketplace-info-modal.tpl.html","mlp-marketplace/marketplace-activation-modal.tpl.html","mlp-charity/donate-modal.tpl.html","messaging/messaging-form-directive.tpl.html","dashboard/dashboard.tpl.html","components/stat-block-directive.tpl.html","account/sign-up.tpl.html","account/sign-in.tpl.html","account/business-account.tpl.html","account/business-account-trial.tpl.html","account/activate.tpl.html","account/activate-update-password.tpl.html","account/account.tpl.html","account/account-header.tpl.html","components/ui/tabs/tabs-module.js","components/ui/tabs/tabs-manager-directive.js","components/ui/tabs/tab-additional-content.js","components/ui/table/table-module.js","components/ui/table/table-user-details-directive.js","components/ui/table/single-expand-directive.js","components/ui/table/header-check-directive.js","user/messages/messages-module.js","user/messages/messages-routes.js","user/messages/messages-controller.js","user/marketplace/marketplace-module.js","user/marketplace/marketplace-routes.js","user/marketplace/marketplace-controller.js","user/leads/leads-module.js","user/leads/user-sent-leads-controller.js","user/leads/user-received-leads-controller.js","user/leads/leads-routes.js","user/connections/connections-module.js","user/connections/connections-routes.js","user/connections/connections-controller.js","user/agreements/agreements-module.js","user/agreements/agreements-routes.js","user/agreements/agreements-controller.js","user/agreements/agreement-pricing-detail-directive.js","social-share/providers/providers-module.js","social-share/providers/twitter-social-share-provider.js","social-share/providers/linkedin-social-share-provider.js","social-share/providers/google-plus-social-share-provider.js","social-share/providers/facebook-social-share-provider.js","my-pod/sent-leads/sent-leads-module.js","my-pod/sent-leads/sent-leads-routes.js","my-pod/sent-leads/sent-leads-controller.js","my-pod/send-invite/send-invite-module.js","my-pod/send-invite/send-invite-routes.js","my-pod/send-invite/send-invite-modal-controller.js","my-pod/send-invite/send-invite-controller.js","my-pod/members/members-module.js","my-pod/members/members-routes.js","my-pod/members/members-controller.js","my-memberships/send-reward/send-reward-module.js","my-memberships/send-reward/send-reward-routes.js","my-memberships/send-reward/send-reward-controller.js","my-memberships/reward-program/reward-program-module.js","my-memberships/reward-program/welcome-modal-controller.js","my-memberships/reward-program/reward-programs-setup-controller.js","my-memberships/reward-program/reward-program-routes.js","my-memberships/reward-program/reward-program-controller.js","my-memberships/reward-program/reward-codes-service.js","my-memberships/reward-program/reward-code-embed-controller.js","my-memberships/reward-program/reward-code-detail-controller.js","my-memberships/reward-program/reward-code-create-controller.js","my-memberships/received-leads/received-leads-module.js","my-memberships/received-leads/received-leads-routes.js","my-memberships/received-leads/received-leads-controller.js","my-memberships/memberships/memberships-module.js","my-memberships/memberships/memberships-routes.js","my-memberships/memberships/memberships-controller.js","my-memberships/join-pod/join-pod-module.js","my-memberships/join-pod/join-pod-routes.js","my-memberships/join-pod/join-pod-modal-controller.js","my-memberships/join-pod/join-pod-controller.js","my-memberships/import/import-module.js","my-memberships/import/import-routes.js","my-memberships/import/import-controller.js","dashboard/memberships/memberships-module.js","dashboard/memberships/received-leads-list-directive.js","dashboard/memberships/received-leads-graph-directive.js","dashboard/memberships/memberships-routes.js","dashboard/memberships/memberships-controller.js","dashboard/stats/stats-module.js","dashboard/stats/stats-routes.js","dashboard/stats/stats-controller.js","dashboard/pod/pod-module.js","dashboard/pod/pod-routes.js","dashboard/pod/pod-members-list-directive.js","dashboard/pod/pod-earnings-graph-directive.js","dashboard/pod/pod-controller.js","components/ui/ui-module.js","components/ui/prompt-dialog-service.js","components/ui/prompt-dialog-controller.js","components/ui/credit-card-directive.js","components/ui/content-slider-directive.js","components/ui/apps-store-links-directive.js","components/ui/action-toolbar-directive.js","account/profile/profile-module.js","account/profile/profile-routes.js","account/profile/profile-controller.js","account/profile/photo-upload-controller.js","account/preferences/preferences-module.js","account/profile/deactivate-modal-controller.js","account/preferences/preferences-controller.js","account/preferences/mailing-list-unsubscribe-controller.js","account/password/password-module.js","account/password/reset-controller.js","account/password/recover-controller.js","account/password/password-routes.js","account/feedback/feedback-module.js","account/feedback/feedback-controller.js","account/earnings/earnings-module.js","account/earnings/withdraw-controller.js","account/earnings/earnings-routes.js","account/earnings/earnings-controller.js","account/billing/billing-module.js","account/billing/credit-card-controller.js","account/billing/billing-routes.js","account/billing/billing-controller.js","user/user-module.js","user/user-routes.js","user/user-controller.js","user/user-avatar-directive.js","user/about-controller.js","notifications/mlp-notifications-module.js","notifications/one-signal-provider.js","notifications/notification-swipe-item-directive.js","notifications/notification-const-constants.js","notifications/notification-center-directive.js","url-shorteners/url-shorteners-module.js","url-shorteners/bitly-url-shortener-provider.js","toolbar/toolbar-module.js","toolbar/toolbar-controller.js","toolbar/business-suggestion-directive.js","social-share/social-share.js","social-share/social-share-provider.js","social-share/social-share-directive.js","social-network/social-network-module.js","social-network/social-network-provider-constant.js","social-network/social-account-service.js","search/search-module.js","search/search-bar-directive.js","search/search-autocomplete-directive.js","lead/lead-module.js","my-pod/my-pod-service.js","my-pod/my-pod-module.js","my-pod/my-pod-routes.js","my-pod/my-pod-controller.js","my-memberships/my-memberships-module.js","my-memberships/reward-selector-directive.js","my-memberships/my-memberships-service.js","my-memberships/my-memberships-routes.js","my-memberships/my-memberships-controller.js","mlp-marketplace/mlp-marketplace-module.js","mlp-marketplace/mlp-marketplace-routes.js","mlp-marketplace/marketplace-service.js","mlp-marketplace/marketplace-listings-directive.js","mlp-marketplace/marketplace-info-controller.js","mlp-marketplace/marketplace-controller.js","mlp-marketplace/marketplace-activation-controller.js","messaging/mlp-messaging-module.js","messaging/messaging-service.js","messaging/messaging-form-directive.js","mlp-charity/charity-module.js","mlp-charity/donate-controller.js","mlp-charity/charities-service.js","lead/send-lead-controller.js","lead/leads-service.js","lead/lead-view-controller.js","lead/lead-routes.js","lead/lead-detail-controller.js","lead/close-lead-controller.js","dashboard/dashboard-module.js","dashboard/dashboard-routes.js","dashboard/dashboard-controller.js","configuration/configuration-module.js","configuration/config-options-constant.js","components/components-module.js","components/tabs-factory.js","components/static-include-directive.js","components/state-class-directive.js","components/stat-block-directive.js","components/st-pagination-scroll-directive.js","components/scroll-navigator-directive.js","components/scroll-check-directive.js","components/router-helper-service.js","components/records-set-factory.js","components/queue-manager-factory.js","components/queue-item-factory.js","components/node-relocate-directive.js","components/nl2br-filter.js","components/location-service.js","components/location-search-directive.js","components/industries-service.js","components/google-map-provider.js","components/form-alerts-factory.js","components/file-download-directive.js","components/data-table-factory.js","components/credit-card-util-service.js","components/components-util-factory.js","components/address-filter.js","cache/cache-module.js","cache/cache-service.js","api/api-module.js","api/session-service.js","api/ff3-api-interceptor-factory.js","api/auth-service.js","api/auth-events-constant.js","account/account-module.js","account/sign-up-controller.js","account/sign-in-controller.js","account/business-account-service.js","account/business-account-controller.js","account/activate-update-password-controller.js","account/activate-controller.js","account/account-service.js","account/account-routes.js","account/account-controller.js","mlp-animations.js","bootstrap.js","app-routes.js"],"names":["config","$locationProvider","$urlRouterProvider","RestangularProvider","NotificationProvider","$compileProvider","$analyticsProvider","PreloadedUserProfile","GoogleMapProvider","configOptions","BitlyUrlShortenerProvider","SocialShareProvider","cfpLoadingBarProvider","OneSignalProvider","html5Mode","debugInfoEnabled","includeSpinner","setBaseUrl","baseUrl","addResponseInterceptor","data","operation","extractedData","content","records","meta","recordsInfo","angular","extend","contentEtag","responseStatus","code","statusCode","text","statusText","setDefaultHeaders","Accept","init","googleMapApiKey","googleMapLibraries","oneSignalAppId","oneSignalSafariWebId","setAccessToken","bitlyGenericAccessToken","set","facebookAppId","setOptions","delay","startTop","startRight","verticalSpacing","horizontalSpacing","maxCount","firstPageview","withAutoBase","isObject","idUser","otherwise","run","$rootScope","$state","$timeout","$window","$document","Restangular","Auth","Session","QueueManager","Industries","Location","RewardCodes","OneSignal","$anchorScroll","stateChangeStartHandler","loginRequiredHandler","loginSuccessHandler","logoutSuccessHandler","stateChangeSuccessHandler","stateChangeTimeout","stateChangeErrorHandler","uiView","scrollTo","create","isAuthenticated","isValidProfile","getUserId","then","playerId","one","customPOST","oneSignalPlayerId","$on","event","toState","toParams","fromState","fromParams","isDefined","logout","result","$broadcast","name","preventDefault","go","find","parent","addClass","authenticate","reset","nextState","params","removeClass","transitionTo","notify","cancel","queue","length","start","error","signOut","reload","$inject","module","$templateCache","put","tabsManager","restrict","scope","tabId","tabsConfig","defaultTab","tabManager","change","target","blockXsRelocation","templateUrl","replace","controllerAs","controller","$scope","$compile","RouterHelper","Tabs","lastLabel","vm","this","Date","getTime","tabs","_","pluck","isScrolling","Error","value","isDropDownOpen","currentTabLabel","label","openTab","tabName","checkScroll","$event","el","currentTarget","scrollToTab","element","vw","elWidth","elLeft","scrollLeft","diff","parentElement","documentElement","clientWidth","position","left","animate","easing","duration","complete","getActiveLabel","activeTab","forEach","lastEvent","id","directive","tabAdditionalContent","template","rawHtml","link","elem","$watch","newElem","isString","$parent","contents","remove","append","tableUserDetails","$templateRequest","$sce","user","isLink","descriptionKey","stopPropagation","hasDetails","nameOnly","transclude","compile","attrs","pre","mlpUserDetails","showAdvanced","descriptionText","detailsVisible","post","iElement","bind","evt","getTrustedResourceUrl","linked","$apply","htmlPopover","trustAsHtml","html","singleExpand","ComponentsUtil","subContent","subContentIdx","toggleSubContent","headerCheck","tbody","thead","scrollBarWidth","$last","scrollHeight","height","width","scrollWidth","css","padding-right","$stateProvider","state","defaultStateParams","url","onEnter","notificationConst","userProfile","activateTab","userId","category","categoryMessages","type","typeDirectMessage","onExit","MessagesCtrl","$q","$uibModal","Leads","smoothScroll","promises","isLoadingLeads","isLoadingMsg","openInfo","currentLead","modalInstance","targetMsgContainer","loadLeads","push","getList","status","limit","all","resultsArray","sentLeads","plain","each","lead","leadType","receivedLeads","leads","union","sortBy","reverse","openDetails","openDetail","navigateTo","hash","options","stepTo","close","switchToDirect","openModal","open","animation","appendTo","body","size","windowClass","elementId","getElementById","callbackAfter","focus","onMessagesLoad","onDirectMessagesLoad","checkedScroll","watchHandle1","watchHandle2","UserMarketplaceCtrl","Marketplace","items","marketplace","openMarketplace","UserSentLeadsCtrl","DataTable","statuses","new","successful","unsuccessful","list","basicParams","$index","getRecords","UserReceivedLeadsCtrl","MyMemberships","myProfile","receiveLeads","agreementsDetails","getUserProfile","profile","detailInstance","closeLead","openAskForLeads","record","sender","acceptedReceiveLeadsContractExists","ConnectionsCtrl","Notification","MyPod","searchName","invitePendingFor","invitePending","lastSearched","connectionsList","search","quickJoin","member","acceptedSendLeadsContractExists","message","err","AgreementsCtrl","BusinessAccount","getScrollingElement","d","compatMode","indexOf","reviseAgreement","isLoading","customPUT","agreements","sendLeads","accept","contractPurpose","idLead","isNumber","acceptAgreement","contractType","isCCSet","resolve","creditCard","number","btnId","btn","scrollingElement","offset","top","clientHeight","scrollTop","outerHeight","trialData","newSendLeads","reviseReceiveLeads","reviseSendLeads","acceptReceiveLeads","acceptSendLeads","isBusinessAccountActive","cancelReceiveLeadsRevision","revise","cancelSendLeadsRevision","switchReviseSendLeadsContent","switchReviseReceiveLeadsContent","openSendInvite","onRewardSelectionChangeReceiveLeads","isFormValid","isReceiveLeadsRewardsFormValid","onRewardSelectionChangeSendLeads","isSendLeadsRewardsFormValid","response","errorMessage","activateBusinessAccount","initiateActivation","isEligibleForTrial","sendLead","openSendLead","getTrialData","agreementPricingDetail","agreement","TwitterSocialShare","setConfig","newConfig","paramName","popupHeight","popupWidth","$get","$twitter","defer","share","encodeURIComponent","description","source","encodeURI","hashTags","provider","LinkedinSocialShare","$linkedin","GooglePlusSocialShare","$googlePlus","FacebookSocialShare","appId","version","xfbml","angularLoad","fbInitHandler","$facebook","isUndefined","FB","loadScript","method","title","caption","picture","ui","SentLeadsCtrl","filter","searchLead","selectedStatus","selectedStatusLabel","selectStatus","leadStatus","SendInviteModalCtrl","FormAlerts","$uibModalInstance","isLoadingUserData","searchControlName","firstName","email","phoneMobile","alerts","displayContactDetails","hasRewardCode","isRewardCodeValid","isRewardCodeInvalid","targetUser","emptyResults","searchCategories","stateTarget","iconClass","dismiss","send","add","checkRewardCode","rewardCode","toUpperCase","isCheckingCode","get","valid","activationResult","isRedirecting","onRewardCodeEnter","key","stopImmediatePropagation","searchResponseFormatter","r","userInvitedProfile","map","item","categoryDescriptionClass","datasource","returnObject","fullname","companyname","categoryDescription","timeDescription","datecreatedformatted","leadtype","onSearchItemSelected","originalObject","clearContactData","checkContactData","openSearch","onlySearch","onlyRewards","focusIn","openRewardCode","SendInviteCtrl","$stateParams","MembersCtrl","active","past","pending","isReady","recordsExist","expiryMonth","expiryYear","membershipsSubIndustries","subIndustries","SendRewardCtrl","processingFee","total","tax","showTotal","calculating","calculationRequired","selectedRecipient","idIndustry","paymentDetails","idUserRecipient","industries","getConsolidatedFilteredList","parseInt","isNaN","filterByIndustry","selectRecipient","owner","deselectRecipient","isUserSelected","responseData","errorCode","onRewardChange","calculateTotal","reward","fees","WelcomeModalCtrl","openLink","linkUrl","RewardProgramsSetupCtrl","$filter","defaultOptions","getIdForOption","initData","successfulLeadPrice","uiId","rewardProgramHelp","openInvite","openWelcome","renderRewardProgramOptions","option","Math","random","toString","addOption","optionId","idx","input","tableSubContentVisible","closest","deleteOption","form","splice","$setDirty","save","saveDefaultRewardOptions","updateRewardProgramsAndCodes","contains","keys","openWelcomeScreen","dynamic","defaultRewardProgram","RewardProgramCtrl","$interpolate","SocialShare","BitlyUrlShortener","rewardCodeHelp","urlToShare","emailBody","archived","forceReload","updatedRecord","isArchived","openCreateCodeModal","openRewardCreateModal","newSelectedStatus","setUrl","isLoadingLink","shorten","getRewardCodeUrl","exp","defaultEmailMessage","socialService","defaultShareName","defaultShareMessage","appUrl","$httpParamSerializer","self","parentElementId","backdrop","keyboard","openEmbed","rewardType","userShareEmail","associatedUserIds","deferred","associatedUsers","reject","promise","update","idRewardCode","href","absolute","isRewardCodeUnique","unique","isUserShareEmailValid","isValid","getDefaultRewardOptions","getRewardCodes","orderby","getRegistrationFormCode","archive","broadcast","callback","programDeferred","codesDeferred","program","codes","updateLocalUserProfile","rewardCodes","isFunction","apply","service","RewardCodeEmbedCtrl","embedCode","previewVisible","RewardCodeDetailCtrl","clone","originalDescription","associatedUsersClone","userShareEmailHelp","isCopyToClipboardSuccessful","editDescriptionVisible","editUserShareVisible","editAssociatedUsersVisible","isSavingDescription","isSavingUserShare","userShareEmailChecked","userShareEmailValid","userShareEmailValidating","isArchiving","shortUrl","userShare","getUrl","saveDescription","editDescriptionError","openUserShare","console","log","saveUserShare","userMsg","editUserShareError","searchingUser","removeUserShare","onSearchSharedItemSelected","onSuccess","hasEditsAssociatedUsers","diff1","difference","diff2","openAssociatedUser","addAssociatedUser","where","onAssociatedItemSelected","searchingAssociatedUser","onAssociatedUsersCancel","saveAssociatedUsers","isSavingAssociatedUsers","editAssociatedUsersError","removeAssociatedUser","embed","RewardCodeCreateCtrl","rewardCodeChecked","rewardCodeValid","rewardCodeValidating","rewardsProgramSetup","isRewardsProgramDetailVisible","sharingVisible","associatedUsersVisible","sharedUsers","rewardsHelp","shareHelp","associatedUsersHelp","onRewardCodeChange","validateRewardCode","isUnique","associatedUsersIds","toggleRewardsProgramDetailVisibility","toggleMoreDetailsVisibility","toggleSharingVisibility","toggleAssociatedUsersVisibility","closeCreateCodeModal","addShareUser","addUser","showButton","index","querySelector","hideButton","ex","leadToOpen","ReceivedLeadsCtrl","MembershipsCtrl","JoinPodModalCtrl","selectedRewardCode","selectedRewardCodeLabel","isRewardsFormValid","join","onRewardSelectionChange","JoinPodCtrl","ImportCtrl","Upload","downloadTemplateUrl","acceptedFiles","isUploading","importProgressPercent","importFinished","alertsExpanded","upload","files","fixApiEndpointUrl","file","errors","loaded","receivedLeadsList","receivedLeadsGraph","chartData","labels","day","date","series","chartOptions","axisX","showGrid","showLabel","axisY","low","onlyInteger","lineSmooth","scaleMinSpace","chartEvents","draw","circle","Chartist","Svg","cx","x","cy","y","responsiveOptions","ctrl","DashboardMembershipsCtrl","dailyStats","dashboard","leadsDailyStats","StatsCtrl","Charities","membersCount","membershipsCount","sentLeadsCount","donations","earnings","lastMonthEarnings","balance","actualEarnings","donationsValue","earningsValue","getLatestPods","getMembers","getEarnings","getBalance","getDonations","openDonate","podMembersList","podEarningsGraph","cumulativeEarnings","showArea","stretch","PodCtrl","earningsDailyStats","members","PromptDialog","onConfirmMessage","confirmButtonLabel","cancelButtonLabel","instance","PromptDialogCtrl","isConfirmed","confirm","ccData","ccShowForm","CreditCardUtil","months","getExpiryMonths","years","getExpiryYears","cards","getAcceptedCards","showCCForm","showForm","newCard","clearForm","closeCCForm","$error","ccExp","ccNumber","ccNumberType","ccExpMonth","ccExpYear","$$parentForm","contentSlider","container","headers","buttons","parseContents","computeSize","currentContent","stepToClickHandler","manageHeightAndVisibility","updateHeader","eventHandler","currentStep","stepId","click","header","headerStep","attr","Number","isResize","lastContent","targetStep","visibility","opacity","contentHeight","overflow","transform","transition","whiteSpace","cnt","shiftBy","on","evtName","appsStoreLinks","watchHandle","isAvailable","navigator","userAgent","actionToolbar","Raven","toolbarEl","primaryContainer","secondaryContainer","angularRootScope","angularTimeout","checkScrollFn","setVisibilityFn","checkVisibilityFn","checkVisibilityValsFn","timeoutPromise","isPrimaryVisible","isSecondaryVisible","lastScrollTop","stateChanging","instances","primary","secondary","abs","captureMessage","level","visible","isSecondary","transcludedContainer","isVisible","childElementCount","windowScrollHandle","stateChangingHandle","stateChangedHandle","atTarget","appendChild","document","clearTimeout","setTimeout","innerHTML","ProfileCtrl","configDefaults","isBusinessAccount","isLoadingBackgroundImg","isSavingBackgound","photoFile","backgroundFile","imageEditMode","isDragging","backgroundStyleBkp","resetRequested","customOptions","roundCorners","customColors","customHeadlineColors","selectedColor","headlineColor","keepPattern","defaults","edits","patternEdited","colorEdited","headlineEdited","imageEdited","address","addressPostal","getConsolidatedList","getCountries","getStates","idCountryPostal","lastName","businessName","website","location","streetAddress","suburb","postCode","country","idStatePostal","selectedClassification","industry","idClassification","subIndustry","getCoverStyle","clearData","updateUserProfile","hasPhoto","imageToken","removePhoto","uploadPhoto","placeChangedCallback","onCountryChange","onClassificationSelect","classification","getAddress","addressParts","addressLink","formatWebsiteUrl","slice","toLowerCase","deactivateAccount","resetToDefault","changingColor","bkgData","uploadBackgroundPhoto","imageUploadMode","removeBkgPhoto","getProfileStyle","obj","background-color","background-blend-mode","backgroundImage","backgroundBlendMode","backgroundPosition","getHeadlineStyle","color","clearColourSettings","headlineColorEdited","hasEdits","Object","resetBackgroundData","customDELETE","profileConfiguration","coverBackground","saveBackgroundEdits","backgroundColor","textColor","image","coverCss","backgroundSize","PhotoUploadCtrl","croppedDataUrl","ok","updatePhoto","DeactivateModalCtrl","signOutAndRedirect","redirectTo","timeOut","isDeactivating","localSignoutTimeout","copy","wholeAccount","deactivate","feedback","PreferencesCtrl","isSaving","mailingLists","updatePreferences","preferences","dataBkp","changeSettings","lastProperty","split","keyName","array","has","hasChanges","isEqual","saveChanges","up","MailingListUnsubscribeCtrl","AccountService","isError","isContactOpen","subscriptionId","openFeedback","ResetCtrl","showMessage","token","password","RecoverCtrl","vcRecaptchaService","reCaptchaSiteKey","recover","reCaptchaResponse","getResponse","abstract","classNames","FeedbackCtrl","helpRequired","isSending","isHelpRequired","appVersion","isMobileApp","navigatorInfo","updateUserData","fullName","rendered","WithdrawCtrl","minLimit","minimumWithdrawLimit","remainingBalance","receivedAmount","amount","accountHolder","bankAccountName","accountBsb","bankCodeDomestic","accountNumber","bankAccountNumberDomestic","calculate","onAmountChange","amountLessFees","withdraw","donate","EarningsCtrl","summaries","ranges","lastMonth","lastYear","selectedRange","selectedRangeLabel","withdrawalsList","isLoadingSummaries","selectRange","range","dateRange","viewLastMonthEarnings","viewAllEarnings","openLead","earning","openDetailById","CreditCardCtrl","isAdd","BillingCtrl","initialisingCard","cardLoading","invoicesExist","invoices","itemCallback","downloadUrl","idInvoice","manageCreditCard","removeCreditCard","isInvite","isArray","invitation","isRegistered","invitationToken","idUserSender","UserCtrl","isMobile","innerWidth","unshift","condition","toggleDetails","moreDetailsExist","nonEmptyDetails","registerLead","sendInvite","uibModal","isCharityAccountActive","reloadProfile","textCss","isCustomBackground","stateHandler","userAvatar","fixedSize","isSmall","initials","trim","charAt","isImage","isFixedSize","getStyle","avatarUrl","background-image","AboutCtrl","safariWebId","userIdPromise","isApp","isLoaded","applicationId","webId","$http","safari_web_id","autoRegister","notificationClickHandlerMatch","notifyButton","enable","isSubscribed","osUserId","oneSignalApi","scriptElement","gonative_onesignal_info","info","oneSignalUserId","createElement","setAttribute","onload","src","notificationSwipeItem","$swipe","onSwipeDone","onSwiping","onSwipeCancel","onClick","startX","dx","isMoving","onStart","coords","onCancel","onMove","deltaX","onEnd","absDx","preventMouseUp","slideUp","notificationId","move","end","constant","categoryLeads","typeLeadMessage","typeNewLead","notificationCenter","Cache","generateNotifications","foundCategories","now","hasMore","filterCategories","count","leadId","timeFormatted","getFormattedTime","time","hasResults","uniq","notificationsBkp","filterNotifications","fresults","selectedCategories","lastIndexOf","notifications","n","watchHandeNewNotification","watchHandleClearNotification","cache","filterActive","displayHelp","notificationsData","markRead","hasNotifications","clearNotifications","openNotification","clearNotification","openNotificationById","filtered","clearNotificationById","isSelected","changeCategory","isSingleFilter","timegap","interval","granularity","zeroInterval","suffix","short","units","output","seconds","singular","plural","unit","floor","isSwipeRight","dismissHelp","accessToken","longUrl","Authorization","Content-Type","long_url","ToolbarCtrl","authEvents","checkForMobile","isDesktop","updateProfileHandler","notificationHandler","isCollapsed","notificationsCount","isNCopen","isLogin","is","isSignUp","showLoginLink","includes","toggleMenu","closeMenu","helpNeeded","openPreferences","toggleNotificationCenter","isOpen","toggleProfile","isProfileOpen","loginSuccess","undefined","ready","businessSuggestion","userProfileDeferred","checkCount","isInTrial","trialWarning","setIsClosed","closeIt","getSuggestionsCount","trialCount","getTrialSuggestionsCount","maxBusinessSuggestions","isClosed","closeSuggestion","updateSuggestionCount","updateTrialSuggestionCount","registerBusiness","isActivating","getInstanceNameForSocialService","socialServices","facebook","linkedin","twitter","google","$injector","socialInitHandler","$socialShare","instanceName","socialShare","buttonId","$location","absUrl","hello","googlePlusClientId","linkedInClientId","basic","oauth_proxy","linkedInProxy","linkedIn","SocialAccount","socialNetworkProvider","signIn","redirect_uri","current","login","getAuthResponse","access_token","socialSignIn","signInResult","reason","googleSignIn","googlePlusScope","facebookSignIn","facebookScope","linkedInSignIn","linkedInScope","searchBar","handleLeads","callbackHandler","searchbarId","searchUrl","searchService","searchServiceEndPoint","leadfullname","focusOut","searchAutocomplete","$parse","handleInputChange","newval","initial","searchStr","extractTitle","callOrAssign","handleRequired","clickoutHandlerForDropdown","mousedownOn","hideResults","removeEventListener","ie8EventNormalizer","which","keyCode","blurOnSelect","inputField","blur","searchFocused","selectedObject","selectedObjectData","callFunctionOrIdentity","fn","setInputString","str","clearSelected","clearResults","titleField","field","extractValue","i","findMatchString","matches","re","RegExp","match","matchClass","notEmpty","validState","fieldRequired","inputName","$setValidity","requiredClassName","keyupHandler","KEY_LF","KEY_RT","KEY_UP","KEY_EN","KEY_DW","lastSearchStr","results","searching","showDropdown","showFilterDropdown","showHistoryDropdown","minlength","initResults","resetCategories","searchTimerComplete","historyItems","hasHistory","currentHistoryIndex","KEY_ES","val","searchTimer","pause","keydownHandler","handleKeyDown","currentIndex","isHistory","row","rowTop","KEY_TAB","selectHistoryItem","selectResult","handleOverrideSuggestions","updateCurrentIndexByOne","updateInputField","isScrollOn","dropdownRow","dropdownHeight","getBoundingClientRect","bottom","dropdownScrollTopTo","dropdownRowOffsetHeight","dropdownRowTop","overrideSuggestions","negative","cancelHttpRequest","getComputedStyle","offsetHeight","marginTop","marginBottom","dd","maxHeight","querySelectorAll","paddingTop","httpSuccessCallbackGen","processResults","responseFormatter","remoteUrlDataField","httpErrorCallback","errorRes","httpCallInProgress","remoteUrlErrorCallback","httpCanceller","getRemoteResults","remoteUrl","remoteUrlRequestFormatter","remoteUrlRequestWithCredentials","withCredentials","timeout","keyword","categories","getRemoteResultsWithCustomHandler","remoteApiHandler","hideOnly","showResultsFilter","displaySearching","focusFirst","getLocalResults","s","searchFields","parseInput","localData","checkExactMatch","localSearch","sc","description2","formattedText","formattedDesc","descriptionField","descriptionField2","imageField","categoryField","autoMatch","desc","displayNoResults","resultsBackup","showAll","checkHistoryItems","loadingHistory","searchId","controlId","saveHistoryItem","hideTimer","unbindInitialValue","bodyClickHandler","onBodyClickListener","MIN_LENGTH","REQUIRED_CLASS","hasCategoryFilter","isDropdownRelative","checkFocus","addEventListener","className","oldval","onFocusHandler","relatedTarget","BLUR_TIMEOUT","resetHideResults","hoverRow","removeHover","updateInputOnSelect","inputChangeHandler","inputChanged","checkLastSearchedCategories","without","filterResults","openFilter","clearInput","backBtnClicked","checkInput","checkSearch","isBodyClick","path","off","fieldRequiredClass","PAUSE","initialValue","inputType","textSearching","TEXT_SEARCHING","textNoResults","TEXT_NORESULTS","maxlength","MAX_LENGTH","overflowY","require","disableInput","remoteUrlResponseFormatter","placeholder","subtitleField","inputClass","fieldTabindex","resultTemplateUrl","hasBackButton","tElement","startSym","startSymbol","endSym","endSymbol","interpolatedHtml","slModalInstance","MyPodCtrl","rewardSelector","hasMonthlySubscription","hasCode","hasDefaultProgram","hasPayPerLead","hasCreditCard","hasCancelAgreement","clearOnBroadcast","default","hasUser","hasCC","hasLockedDefaultProgram","leadPrice","subscriptionPrice","selectors","payPerLead","subscription","renderRewardCodes","pricingOptions","onContractTypeChange","elementToFocus","onValueChanged","holderName","checkValidity","formData","MyMembershipsCtrl","isImportAllowed","hasUserPermission","newUserProfile","squash","marketplaceItem","addon","activate","marketplaceListings","hasUserAvatar","isProcessing","switchSubscription","MarketplaceInfoCtrl","isUpdating","MarketplaceCtrl","mlpFilter","isGrid","viewMLP","test","mlpItems","MarketplaceActivationCtrl","isPaymentRequired","isFree","isCCLoading","paymentSummary","price","priceMonthly","priceMonthlyInclGst","cc","Messaging","getMessages","postMessage","messagingForm","msgId","msgRequestParams","msgRecipient","msgGrouping","msgWatchParams","msgLoadCallback","messagesContainer","onscroll","loading","lastDataCount","loadMore","$interval","messageIntervalUpdate","recipient","grouping","watchParams","onLoadCallback","messageStr","messages","hasError","requestParams","postParams","notification","offsetIncrement","appendMessages","savingMessages","loadMessages","formatMessages","concat","addMessage","isTemp","saving","dateCreated","created","messageSaved","timeStamp","updateMessageTimes","itemRender","currentGroup","lastGroup","nextGroup","groupId","opensGroup","closesGroup","noGroup","oldVal","newVal","DonateCtrl","charityProfile","donationsHistory","isLoadingCharity","isCalculating","isSearchVisible","canceler","lastCharities","summary","fee","selectCharity","noTimer","sendCalculate","withHttpConfig","calculateWith","onKeyPress","openSelector","charityId","lastRecipients","SendLeadCtrl","isRegister","onCancelCallback","onSentCallback","validateRecipient","selectedUsers","controlName","showPrompt","userSearchCategories","invitations","selectedUser","phone","details","isValidName","isValidContact","removeUser","isEmptyNewRecipient","isEmpty","parseFloat","isValidNewRecipient","isValidRecipient","recipientUserIds","failedUsers","failedUsersIds","success","u","register","senderUserId","changeContractType","addNewRecipient","$setPristine","$setUntouched","removeNewRecipient","onRecipientItemSelected","searchingRecipient","activeSearch","showInviteNew","showInviteForm","showSearchForm","contract","leadPriceBreakdown","#","tabToOpen","isCoOwner","resend","acknowledge","cancelCallback","sentCallback","membersSubIndustries","LeadViewCtrl","LeadDetailCtrl","isAcknowledging","closeData","userShareSectionVisible","coOwner","getUser","showResendButton","showAcknowledgeButton","shareWithProfile","removeSharing","isRemovingShare","onUserShareEmailChange","validateUserShareEmail","forward","getUserDetailClass","onTabChange","CloseLeadCtrl","selectedPricingOption","idPricingOption","isSuccessful","chargeForSuccessfulLead","enableBonusReward","showPriceBreakdown","bonusReward","onBonusRewardChange","onPricingOptionChange","getSuccessfulLeadPrice","dashboardData","DashboardCtrl","passwordPattern","passwordMessage","apiKey","maxFileUploadSize","maxFileUploadMessage","nextSteps","reportRegistration","gtag","send_to","fbq","TabsManager","tabNames","TabsBase","tab","factory","staticInclude","templatePath","$new","stateClass","fromClassNames","toClassNames","statBlock","stat","subtext","buttonText","buttonLink","stPaginationScroll","handler","pagination","itemByPage","tableState","lengthThreshold","timeThreshold","lastRemaining","remaining","scrollNavigator","$uibPosition","autoRun","onClickCallback","scrollTargetElementId","scrollTargetChangeDelay","targetElement","navigatorElement","watchToolbarHandleVisible","watchToolbarHandleHidden","windowResizeHandle","windowFn","navigatorOffsetX","navigatorOffsetY","actionToolbarOffset","viewportOffset","innerHeight","scrollMessage","scrollOffsetX","scrollOffsetY","scrollCheck","hasScrollbar","altElementBreakpoint","targetElementId","withDelay","QueueItem","when","RecordsSet","RecordsSetManager","entity","endPoint","queryParams","initialise","loadingEnabled","totalLoaded","deferredInit","isInitialised","numberOfSets","totalRecords","defaultQueryParams","load","isReload","selectedRecords","ceil","extraParams","performInitQuery","omit","queryParamsOverride","qParams","initialReset","sort","direction","RecordsSetBase","createLoader","QueueManagerBase","queueLoop","previousResult","that","shift","QueueItemBase","nodeRelocate","moveElement","srcElement","display","altElement","altElementId","nl2br","countries","states","idCountry","getCountryId","countryCode","abbrevation","getCountryNameById","countryId","getStateId","stateCode","sts","idState","getStateNameById","stateId","shortName","locationSearch","GoogleMap","inputId","fullAddress","autocomplete","placeSelected","place","getPlace","convertAddress","address_components","getFormattedAddress","maps","addDomListener","places","Autocomplete","types","addListener","maxAge","idIndustryParent","getMainList","getSubList","idParent","getFilteredList","subIndustriesFilter","filteredList","values","findIndex","removeAll","libraries","libs","googleMapApi","googleMapInitCallback","preciseAddress","parts","subParts","streetNumber","inputAddress","addressType","mappings","typeMappings","loopFunc","typeKey","targetKey","sourceKey","mapping","getCurrentLocation","geolocation","getCurrentPosition","geocoder","Geocoder","gcRequest","LatLng","latitude","longitude","geocode","gcResult","gcStatus","GeocoderStatus","OK","geometry","lat","lng","getStaticMapAsBase64","fileReader","w","h","responseType","FileReader","readAsDataURL","FormAlertsBase","someMethod","fileDownload","e","download","replaceWith","DataTableManager","dataLoader","lastTableState","loadingMoreRecords","numberOfPages","reloadParams","predicate","isLoadingMoreRecords","DataTableBase","acceptedCreditCards","expiryMonths","currentYear","getFullYear","expiryYears","ComponentsUtilFactory","addressFilter","locale","format","innerOutput","formats","au","us","k","CacheFactoryProvider","storagePrefix","CacheFactory","cacheInstance","createCache","deleteOnExpire","storageMode","getSession","session","profileData","destroy","loadSession","isSignedIn","dataUri","Ff3ApiInterceptor","Ff3ApiInterceptorBase","request","apiParams","getSecurityParams","responseError","rejection","moduleConfig","$httpProvider","interceptors","getLoginToken","deleteLoginToken","localSignOut","saveLoginToken","authToken","loginToken","serverLogout","passwordSignIn","username","oauth2","activationToken","activateAccount","account","X-Ff3-Api-Key","apiEndpoint","tempUrl","paramsStr","permission","permissions","loginFailed","loginCancelled","logoutSuccess","sessionTimeout","sessionLoaded","notAuthenticated","notAuthorised","SignUpCtrl","invitationSender","invitationType","trialEligible","trialDuration","userSender","isEligibleForBusinessAccountTrial","businessAccountTrialDuration","passwordSignUp","lastChecked","rewardCardOwner","SignInCtrl","afterSignInCallback","openBusinessAccountPopup","domNode","isTrial","pricingDetails","getDomNode","dn","nodeName","loginWatchHandle","suggestionCache","skipPayment","action","activateTrial","businessAccount","expiresIn","trialExpiresInDays","trialExpiresIn","trialExpiryDate","BusinessAccountCtrl","rewardCodeHelp1","rewardCodeHelp2","showRewardCard","businessMarketingPayment","numberPostal","suburbPostal","postCodePostal","statePostal","statePostalShort","countryPostal","formatAddress","$touched","required","onDataChange","isLeadPriceValid","contentDocument","substr","style","fontSize","firstElementChild","isAddressIncomplete","getUserLocationAddress","isGeolocating","updateStateCountryIds","geolocationFailCallback","isGeolocationDisabled","country_id","getLocationScreenshot","isRenderingLocation","base64","updateSummary","p","priceInclGst","ActivateUpdatePasswordCtrl","confirmPassword","newPassword","ActivateCtrl","userRegistration","newsletter","rewardCodeReadOnly","rewardCodeLabel","emailVisible","passwordVisible","isPasswordSet","newSession","idUserRewardCodeOwner","redirectToUserProfile","AccountCtrl","slide","done","slideDown","slideFast","slideIf","enter","leave","slideIfReversed","slideIfFlex","slideLeft","outerWidth","slideRight","opacityIf","fadeIn","args","fadeOut","opacitySlowIf","$windowInstance","injector","addPlugin","Plugins","Angular","deferredBootstrapper","bootstrap","bootstrapConfig","strictDi","injectorModules"],"mappings":"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","file":"app-f7fa0fd163.js","sourcesContent":["(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myLeadPod\n * @description\n *\n */\n angular\n .module('myLeadPod', [\n 'ngAria',\n 'ngAnimate',\n 'ngTouch',\n 'angular-loading-bar',\n 'ngSanitize',\n 'ui.router',\n 'ui.bootstrap',\n 'restangular',\n 'ngRaven',\n 'monospaced.elastic',\n 'smart-table',\n 'ui-notification',\n 'credit-cards',\n 'smoothScroll',\n 'angulartics',\n 'angulartics.google.analytics',\n 'angucomplete-alt',\n 'configuration',\n 'components',\n 'api',\n 'cache',\n 'account',\n 'socialNetwork',\n 'dashboard',\n 'myPod',\n 'myMemberships',\n 'toolbar',\n 'user',\n 'lead',\n 'urlShorteners',\n 'socialShare',\n 'mlp-animations',\n 'mlp-search',\n 'mlp-messaging',\n 'mlpMarketplace',\n 'mlp-charity',\n 'mlp-notifications'\n ]);\n\n angular\n .module('myLeadPod')\n .config(config)\n .run(run);\n\n function config($locationProvider, $urlRouterProvider, RestangularProvider, NotificationProvider,\n $compileProvider, $analyticsProvider, PreloadedUserProfile, GoogleMapProvider, configOptions,\n BitlyUrlShortenerProvider, SocialShareProvider, cfpLoadingBarProvider, OneSignalProvider) {\n $locationProvider.html5Mode(!'%IS_DEVELOPMENT%');\n $compileProvider.debugInfoEnabled('%IS_DEVELOPMENT%');\n cfpLoadingBarProvider.includeSpinner = false;\n RestangularProvider.setBaseUrl(configOptions.baseUrl);\n RestangularProvider.addResponseInterceptor(function (data, operation) {\n var extractedData;\n if (operation === 'getList') {\n extractedData = data.content.records;\n extractedData.meta = data.content.recordsInfo;\n }\n else {\n extractedData = angular.extend({}, data.content);\n }\n extractedData.contentEtag = data.contentEtag;\n extractedData.responseStatus = {\n code: data.statusCode,\n text: data.statusText\n };\n\n return extractedData;\n });\n RestangularProvider.setDefaultHeaders({Accept: 'application/json'});\n GoogleMapProvider.init(configOptions.googleMapApiKey, configOptions.googleMapLibraries);\n OneSignalProvider.init(configOptions.oneSignalAppId, configOptions.oneSignalSafariWebId);\n BitlyUrlShortenerProvider.setAccessToken(configOptions.bitlyGenericAccessToken);\n SocialShareProvider.set('facebook', 'appId', configOptions.facebookAppId);\n NotificationProvider.setOptions({\n delay: 5000,\n startTop: 70,\n startRight: 10,\n verticalSpacing: 20,\n horizontalSpacing: 20,\n maxCount: 1\n });\n\n $analyticsProvider.firstPageview(true);\n $analyticsProvider.withAutoBase(true);\n\n if (angular.isObject(PreloadedUserProfile) && !!PreloadedUserProfile.idUser) {\n $urlRouterProvider.otherwise('/');\n }\n else {\n $urlRouterProvider.otherwise('/account/signin');\n }\n }\n\n function run($rootScope, $state, $timeout, $window, $document, Restangular, Auth, Session, QueueManager, PreloadedUserProfile, Industries, Location, RewardCodes, OneSignal, $anchorScroll) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var stateChangeStartHandler,\n loginRequiredHandler,\n loginSuccessHandler,\n logoutSuccessHandler,\n stateChangeSuccessHandler,\n stateChangeTimeout,\n stateChangeErrorHandler,\n uiView;\n\n // Force the address bar to close when the app is run first time\n $window.scrollTo(0, 1);\n\n Session.create(PreloadedUserProfile);\n $rootScope.isAuthenticated = Session.isValidProfile(PreloadedUserProfile);\n if ($rootScope.isAuthenticated) {\n OneSignal.getUserId().then(function (playerId) {\n Restangular.one('Users').customPOST(null, 'pushNotifications', {\n oneSignalPlayerId: playerId\n });\n });\n }\n\n /**\n * Bind state change start event\n */\n stateChangeStartHandler = $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n if (!(angular.isDefined(fromParams.logout) && fromParams.logout === true)) {\n Auth.isAuthenticated().then(function (result) {\n // Close any modal instances that might be there.\n $rootScope.$broadcast('close-modal-instance', {});\n\n if (!result) {\n if (toState.authenticate) {\n event.preventDefault();\n QueueManager.reset();\n $state.go('accountSignInUp.accountSignIn', {\n nextState: {\n name: toState.name,\n params: toParams\n }\n });\n }\n }\n else if (toState.name === 'accountSignInUp.accountSignIn' || toState.name === 'accountSignInUp.accountSignUp') {\n event.preventDefault();\n $state.go('dashboard');\n }\n else {\n // Now try to apply the loading class but do it in the accepteble timeout so we don't show the pending\n stateChangeTimeout = $timeout(function () {\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n uiView.addClass('state-changing');\n $rootScope.$broadcast('event:app-state-changing');\n }, 300);\n }\n }, function () {\n if (toState.authenticate) {\n event.preventDefault();\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n if (uiView) {\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n }\n $state.transitionTo('accountSignInUp.accountSignIn', {}, {\n notify: false\n });\n }\n });\n }\n });\n\n /**\n * Bind state change success\n */\n stateChangeSuccessHandler = $rootScope.$on('$stateChangeSuccess', function () {\n // Cancel the state changing class\n if (stateChangeTimeout) {\n $timeout.cancel(stateChangeTimeout);\n }\n\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n\n if (QueueManager.queue.length > 0) {\n QueueManager.start();\n }\n $anchorScroll();\n });\n\n /**\n * State change error handler.\n */\n stateChangeErrorHandler = $rootScope.$on('$stateChangeError', function (toState, toParams, fromState, fromParams, error) {\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n if (uiView) {\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n }\n });\n\n /**\n * Bind sign in page to event\n */\n loginRequiredHandler = $rootScope.$on('event:auth-loginRequired', function () {\n $rootScope.isAuthenticated = false;\n Auth.signOut(false);\n $state.go('accountSignInUp.accountSignIn');\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n if (uiView) {\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n }\n });\n\n /**\n * Bind login confirmation event\n */\n loginSuccessHandler = $rootScope.$on('event:auth-loginConfirmed', function () {\n $rootScope.isAuthenticated = true;\n Industries.reload();\n });\n\n /**\n * Bind logout event\n */\n logoutSuccessHandler = $rootScope.$on('event:auth-logoutSuccess', function () {\n $rootScope.isAuthenticated = false;\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myLeadPod\n * @description\n *\n */\n config.$inject = [\"$locationProvider\", \"$urlRouterProvider\", \"RestangularProvider\", \"NotificationProvider\", \"$compileProvider\", \"$analyticsProvider\", \"PreloadedUserProfile\", \"GoogleMapProvider\", \"configOptions\", \"BitlyUrlShortenerProvider\", \"SocialShareProvider\", \"cfpLoadingBarProvider\", \"OneSignalProvider\"];\n run.$inject = [\"$rootScope\", \"$state\", \"$timeout\", \"$window\", \"$document\", \"Restangular\", \"Auth\", \"Session\", \"QueueManager\", \"PreloadedUserProfile\", \"Industries\", \"Location\", \"RewardCodes\", \"OneSignal\", \"$anchorScroll\"];\n angular\n .module('myLeadPod', [\n 'ngAria',\n 'ngAnimate',\n 'ngTouch',\n 'angular-loading-bar',\n 'ngSanitize',\n 'ui.router',\n 'ui.bootstrap',\n 'restangular',\n 'ngRaven',\n 'monospaced.elastic',\n 'smart-table',\n 'ui-notification',\n 'credit-cards',\n 'smoothScroll',\n 'angulartics',\n 'angulartics.google.analytics',\n 'angucomplete-alt',\n 'configuration',\n 'components',\n 'api',\n 'cache',\n 'account',\n 'socialNetwork',\n 'dashboard',\n 'myPod',\n 'myMemberships',\n 'toolbar',\n 'user',\n 'lead',\n 'urlShorteners',\n 'socialShare',\n 'mlp-animations',\n 'mlp-search',\n 'mlp-messaging',\n 'mlpMarketplace',\n 'mlp-charity',\n 'mlp-notifications'\n ]);\n\n angular\n .module('myLeadPod')\n .config(config)\n .run(run);\n\n function config($locationProvider, $urlRouterProvider, RestangularProvider, NotificationProvider,\n $compileProvider, $analyticsProvider, PreloadedUserProfile, GoogleMapProvider, configOptions,\n BitlyUrlShortenerProvider, SocialShareProvider, cfpLoadingBarProvider, OneSignalProvider) {\n $locationProvider.html5Mode(!false);\n $compileProvider.debugInfoEnabled(false);\n cfpLoadingBarProvider.includeSpinner = false;\n RestangularProvider.setBaseUrl(configOptions.baseUrl);\n RestangularProvider.addResponseInterceptor(function (data, operation) {\n var extractedData;\n if (operation === 'getList') {\n extractedData = data.content.records;\n extractedData.meta = data.content.recordsInfo;\n }\n else {\n extractedData = angular.extend({}, data.content);\n }\n extractedData.contentEtag = data.contentEtag;\n extractedData.responseStatus = {\n code: data.statusCode,\n text: data.statusText\n };\n\n return extractedData;\n });\n RestangularProvider.setDefaultHeaders({Accept: 'application/json'});\n GoogleMapProvider.init(configOptions.googleMapApiKey, configOptions.googleMapLibraries);\n OneSignalProvider.init(configOptions.oneSignalAppId, configOptions.oneSignalSafariWebId);\n BitlyUrlShortenerProvider.setAccessToken(configOptions.bitlyGenericAccessToken);\n SocialShareProvider.set('facebook', 'appId', configOptions.facebookAppId);\n NotificationProvider.setOptions({\n delay: 5000,\n startTop: 70,\n startRight: 10,\n verticalSpacing: 20,\n horizontalSpacing: 20,\n maxCount: 1\n });\n\n $analyticsProvider.firstPageview(true);\n $analyticsProvider.withAutoBase(true);\n\n if (angular.isObject(PreloadedUserProfile) && !!PreloadedUserProfile.idUser) {\n $urlRouterProvider.otherwise('/');\n }\n else {\n $urlRouterProvider.otherwise('/account/signin');\n }\n }\n\n function run($rootScope, $state, $timeout, $window, $document, Restangular, Auth, Session, QueueManager, PreloadedUserProfile, Industries, Location, RewardCodes, OneSignal, $anchorScroll) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var stateChangeStartHandler,\n loginRequiredHandler,\n loginSuccessHandler,\n logoutSuccessHandler,\n stateChangeSuccessHandler,\n stateChangeTimeout,\n stateChangeErrorHandler,\n uiView;\n\n // Force the address bar to close when the app is run first time\n $window.scrollTo(0, 1);\n\n Session.create(PreloadedUserProfile);\n $rootScope.isAuthenticated = Session.isValidProfile(PreloadedUserProfile);\n if ($rootScope.isAuthenticated) {\n OneSignal.getUserId().then(function (playerId) {\n Restangular.one('Users').customPOST(null, 'pushNotifications', {\n oneSignalPlayerId: playerId\n });\n });\n }\n\n /**\n * Bind state change start event\n */\n stateChangeStartHandler = $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n if (!(angular.isDefined(fromParams.logout) && fromParams.logout === true)) {\n Auth.isAuthenticated().then(function (result) {\n // Close any modal instances that might be there.\n $rootScope.$broadcast('close-modal-instance', {});\n\n if (!result) {\n if (toState.authenticate) {\n event.preventDefault();\n QueueManager.reset();\n $state.go('accountSignInUp.accountSignIn', {\n nextState: {\n name: toState.name,\n params: toParams\n }\n });\n }\n }\n else if (toState.name === 'accountSignInUp.accountSignIn' || toState.name === 'accountSignInUp.accountSignUp') {\n event.preventDefault();\n $state.go('dashboard');\n }\n else {\n // Now try to apply the loading class but do it in the accepteble timeout so we don't show the pending\n stateChangeTimeout = $timeout(function () {\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n uiView.addClass('state-changing');\n $rootScope.$broadcast('event:app-state-changing');\n }, 300);\n }\n }, function () {\n if (toState.authenticate) {\n event.preventDefault();\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n if (uiView) {\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n }\n $state.transitionTo('accountSignInUp.accountSignIn', {}, {\n notify: false\n });\n }\n });\n }\n });\n\n /**\n * Bind state change success\n */\n stateChangeSuccessHandler = $rootScope.$on('$stateChangeSuccess', function () {\n // Cancel the state changing class\n if (stateChangeTimeout) {\n $timeout.cancel(stateChangeTimeout);\n }\n\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n\n if (QueueManager.queue.length > 0) {\n QueueManager.start();\n }\n $anchorScroll();\n });\n\n /**\n * State change error handler.\n */\n stateChangeErrorHandler = $rootScope.$on('$stateChangeError', function (toState, toParams, fromState, fromParams, error) {\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n if (uiView) {\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n }\n });\n\n /**\n * Bind sign in page to event\n */\n loginRequiredHandler = $rootScope.$on('event:auth-loginRequired', function () {\n $rootScope.isAuthenticated = false;\n Auth.signOut(false);\n $state.go('accountSignInUp.accountSignIn');\n uiView = uiView || $document.find('#app-container-data[ui-view]').parent();\n if (uiView) {\n uiView.removeClass('state-changing');\n $rootScope.$broadcast('event:app-state-changed');\n }\n });\n\n /**\n * Bind login confirmation event\n */\n loginSuccessHandler = $rootScope.$on('event:auth-loginConfirmed', function () {\n $rootScope.isAuthenticated = true;\n Industries.reload();\n });\n\n /**\n * Bind logout event\n */\n logoutSuccessHandler = $rootScope.$on('event:auth-logoutSuccess', function () {\n $rootScope.isAuthenticated = false;\n });\n }\n}());\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/join-pod/partials/form-user-details.tpl.html',\n '
\\n' +\n '
\\n' +\n '
\\n' +\n ' Please enter the details of the person you are asking for the leads\\n' +\n '
\\n' +\n '
\\n' +\n '\\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n ' \\n' +\n '
\\n' +\n '
Missing first name.
\\n' +\n '
\\n' +\n '
\\n' +\n ' \\n' +\n ' \\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n '\\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n ' \\n' +\n '
\\n' +\n '
Missing email.
\\n' +\n '
This is not a valid email.
\\n' +\n '
\\n' +\n '
\\n' +\n ' \\n' +\n ' \\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n '\\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n ' \\n' +\n '
\\n' +\n '
Missing phone number.
\\n' +\n '
\\n' +\n '
\\n' +\n ' \\n' +\n ' \\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n '
\\n' +\n '\\n' +\n '
\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/ui/tabs/tabs-manager-directive.tpl.html',\n '
\\n' +\n '
\\n' +\n '
\\n' +\n ' \\n' +\n '
  • \\n' +\n ' \\n' +\n ' {{tab.label}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' {{tab.label}}\\n' +\n ' \\n' +\n ' \\n' +\n '
  • \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{tabsManager.getActiveLabel()}}\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/ui/table/table-user-popover.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '

    \\n' +\n ' \\n' +\n ' {{user.mlpUserDetails.descriptionText}}\\n' +\n '

    \\n' +\n '

    {{user.phoneMobile}}

    \\n' +\n '

    {{user.email}}

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/ui/table/table-user-details-directive.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/messages/messages.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Loading Leads
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Direct Messages

    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Lead Messages\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Lead Messages

    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Details\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{messages.currentLead.details}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Contact\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{messages.currentLead.firstName}} {{messages.currentLead.lastName}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{messages.currentLead.phone}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{messages.currentLead.email}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/messages/messages-list-partial.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Messages List

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' # Direct Messages\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' # Lead Messages\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' You have no leads (sent or received).\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{lead.firstName}} {{lead.lastName}}
    \\n' +\n '
    {{lead.dateSent | date:\\'d MMM yyyy\\'}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/messages/messages-list-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/marketplace/marketplace.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Open Marketplace for all available subscription packages.\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/leads/sent.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You haven\\'t sent any leads to {{userSentLeads.userProfile.fullName}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Date sentNameStatusDetails
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' {{row.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n ' {{row.dateSent | date:\\'d MMM yyyy\\'}}
    \\n' +\n ' {{row.firstName}} {{row.lastName}}\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Status
    \\n' +\n ' {{userSentLeads.statuses[row.status]}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Details
    \\n' +\n ' \\n' +\n ' View lead\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{row.firstName}} {{row.lastName}}{{userSentLeads.statuses[row.status]}}\\n' +\n ' View lead\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/leads/received.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You have no leads from {{userReceivedLeads.userProfile.fullName}}\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Waiting for user to accept the agreement proposal.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Date receivedNameStatusDetails
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' {{row.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n ' {{row.dateSent | date:\\'d MMM yyyy\\'}}
    \\n' +\n ' {{row.firstName}} {{row.lastName}}\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Status
    \\n' +\n ' \\n' +\n ' {{userReceivedLeads.statuses[row.status]}} (shared)\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Details
    \\n' +\n ' View lead\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{row.firstName}} {{row.lastName}}\\n' +\n ' \\n' +\n ' {{userReceivedLeads.statuses[row.status]}}\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    View lead
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/connections/connections.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' {{connections.userProfile.fullName}} doesn\\'t have any connections.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Following is the list of businesses that {{connections.userProfile.firstName}} is sending leads to\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    NameIndustryReward (up to)Join
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Industry
    \\n' +\n ' {{row.member.industry.name}}\\n' +\n '
    {{row.member.subIndustry.name}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Reward (up to)
    \\n' +\n ' {{row.member.highestReward | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' (Connected)\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{row.member.industry.name}}\\n' +\n ' \\n' +\n '
    {{row.member.subIndustry.name}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{row.member.highestReward | currency:\\'$\\':0}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/agreements/agreements.tpl.html',\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Send leads to {{agreements.userProfile.fullName}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Accept the suggested reward from {{agreements.userProfile.fullName}} or revise the agreement.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' You sent a proposal to {{agreements.userProfile.fullName}} on {{agreements.sendLeads.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' Accept\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Accept\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' You sent a revised proposal to {{agreements.userProfile.fullName}} on\\n' +\n ' {{agreements.sendLeads.revision.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' View details\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Revise\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Join {{agreements.userProfile.fullName}}\\'s Rewards Program and receive up to {{agreements.userProfile.highestReward | currency: \\'$\\':0}}\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' Join\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Receive leads from {{agreements.userProfile.fullName}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' You need to activate Business Account in order to be able to receive leads.\\n' +\n '
    \\n' +\n ' (You are eligible for {{agreements.trialData.expiresIn}}-day Business Account Trial)\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Accept the suggested reward from {{agreements.userProfile.fullName}} or revise the agreement.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' You sent a proposal to {{agreements.userProfile.fullName}} on {{agreements.receiveLeads.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' Accept\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Accept\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' You sent a revised proposal to {{agreements.userProfile.fullName}} on\\n' +\n ' {{agreements.receiveLeads.revision.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' View details\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Revise\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Would you like to receive leads from {{agreements.userProfile.fullName}}?\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/agreements/agreement-pricing-detail-directive.tpl.html',\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Reward{{agreementPricingDetail.label}}
    {{option.name}}{{option.successfulLeadPrice | currency:\\'$\\':0}}
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Reward\\n' +\n '
    \\n' +\n ' {{agreementPricingDetail.agreement.contractType}}\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' {{agreementPricingDetail.label}}\\n' +\n '
    \\n' +\n ' {{agreementPricingDetail.agreement.subscriptionPrice | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-pod/sent-leads/sent-leads.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You haven\\'t sent any leads\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
      \\n' +\n '
    • \\n' +\n ' {{label}}\\n' +\n '
    • \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Sent toDate sentNameStatusDetails
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Date sent
    \\n' +\n ' {{row.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Name
    \\n' +\n ' {{row.firstName}} {{row.lastName}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Status
    \\n' +\n ' {{sentLeads.statuses[row.status]}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Details
    \\n' +\n ' View lead\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{row.dateSent | date:\\'d MMM yyyy\\'}}{{row.firstName}} {{row.lastName}}{{sentLeads.statuses[row.status]}}\\n' +\n ' View lead\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-pod/send-invite/send-invite-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Send Invite\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Invite the vendor into your pod, so you can start sending the leads and claim the rewards.\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' If you have the Reward Code, enter it\\n' +\n ' here\\n' +\n ' here\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid Reward Code.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    OR
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Try to search for the business in our directory.\\n' +\n ' Use Search\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Try Search Again\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Seems like the business you want to send a lead to is not yet registered. You can provide the details of the business manually\\n' +\n ' here.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Business Contact Details:\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing first name.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing phone number.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing email.
    \\n' +\n '
    This is not a valid email.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' {{alert.message}}\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-pod/members/members.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You have no people in your pod\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Send invites to your business partners to join your pod. Click \"Invite to my Pod\" to start sending invites.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
      \\n' +\n '
    • \\n' +\n ' {{label}}\\n' +\n '
    • \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    NameIndustryReward (up to)Reward type
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Industry
    \\n' +\n ' {{row.member.industry.name}}\\n' +\n ' \\n' +\n '
    {{row.member.subIndustry.name}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Reward (up to)
    \\n' +\n ' {{row.highestContractReward | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Reward type
    \\n' +\n ' {{row.contractType}}\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{row.member.industry.name}}\\n' +\n ' \\n' +\n '
    {{row.member.subIndustry.name}}\\n' +\n '
    \\n' +\n '
    {{row.highestContractReward | currency:\\'$\\':0}}{{row.contractType}}
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/send-reward/send-reward.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Send Reward

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Add reward\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid reward value\\n' +\n '
    \\n' +\n '
    Missing reward value\\n' +\n '
    \\n' +\n '
    Reward value must not be negative\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Reward amount\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{sendReward.data.reward | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Processing fee\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{sendReward.processingFee | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' GST\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{sendReward.tax | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Total charged\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{sendReward.total | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Payment details\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Select recipient\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{row.owner.industry.name}}\\n' +\n ' \\n' +\n '
    {{row.owner.subIndustry.name}}\\n' +\n '
    \\n' +\n '
    {{row.rewardType}}
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Select above to add recipient\\n' +\n '
    {{sendReward.selectedRecipient.firstName}} {{sendReward.selectedRecipient.lastName}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You don\\'t have any connections\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Join pods and start receiving leads.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Message\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/import/import.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Contacts Import\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Upload and invite people to join your Reward Program.\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Drop file here or use the \"Select\" button.\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Success, you\\'ve invited your contacts to join your Reward Program.\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Importing:\\n' +\n ' {{import.importProgressPercent}}%\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n ' \\n' +\n ' 5 && !import.alertsExpanded\">\\n' +\n ' {{\\'and \\' + (import.alerts.getList().length - 5) + \\' more\\'}}\\n' +\n ' \\n' +\n '
    5 && import.alertsExpanded\">\\n' +\n ' {{alert.message}}\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/reward-program/welcome-modal-template.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Welcome to MyLeadPod.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Well done!\\n' +\n '
    \\n' +\n ' You are pretty much set up now to encourage others to send you leads!\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' The step you have just completed has set up your base Rewards Program with its Reward Code.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Rewards Program
    \\n' +\n '
    \\n' +\n ' You can update your Rewards Program to have multiple levels, e.g. different $ rewards for different services.\\n' +\n '\\n' +\n ' You can also set up multi level Custom Rewards for special referrers or sales channels.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Get Traction!
    \\n' +\n '
    \\n' +\n ' Once you are happy with your cash reward offers, the key next step is inviting your past clients, friends and family to send you leads. Also add codes to your website, email signature etc.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Learn\\n' +\n '
    \\n' +\n ' Learn to work with MyLeadPod. Follow the links below or check out\\n' +\n ' our blog or\\n' +\n ' video tutorials.\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Reward Program vs Reward Code
    \\n' +\n '
    Learn the difference between your Reward Program and Custom Rewards.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Bulk invite potential referrers
    \\n' +\n '
    Learn how to import the database of your clients.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Add my codes to digital assets
    \\n' +\n '
    Learn how to share your Reward Codes
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/reward-program/setup.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Rewards Program

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Add new, modify or remove rewards.\\n' +\n ' ?\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' No rewards.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n '
    TitleSuccessful Lead Reward
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Needs more details ...\\n' +\n '
    \\n' +\n '
    {{rewardProgramsSetup.data.options[$index].name}}
    \\n' +\n '
    $ {{rewardProgramsSetup.data.options[$index].successfulLeadPrice}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' 1\">\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    Missing name
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    Invalid lead reward value
    \\n' +\n '
    Missing lead reward value
    \\n' +\n '
    Successful lead reward value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Missing name
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Invalid lead reward value
    \\n' +\n '
    Missing lead reward value
    \\n' +\n '
    Successful lead reward value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' 1\">\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    0\">\\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' To create or view your Reward Codes, go to Reward Codes page.\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/reward-program/reward-program.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Add new or view your Reward Codes. Use Reward Codes for promoting your rewards in digital advertising and for tracking your leads.\\n' +\n ' ?\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
      \\n' +\n '
    • \\n' +\n ' {{label}}\\n' +\n '
    • \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You have not created any Reward Codes\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Reward CodeShared withClicksRegistrationsDetails
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    {{row.rewardCode}}\\n' +\n ' Archived\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Clicks\\n' +\n ' {{row.viewsCounter}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Registrations\\n' +\n ' {{row.registrationsCounter}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' Share\\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' View\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Shared with\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' -\\n' +\n '
    \\n' +\n ' {{row.viewsCounter}}\\n' +\n ' \\n' +\n ' {{row.registrationsCounter}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' Share\\n' +\n ' \\n' +\n '\\n' +\n ' View\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' To modify your Rewards Program, go to the Rewards Program page.\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/reward-program/reward-code-embed.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Embed Reward Code\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Show Preview\\n' +\n ' Hide Preview\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/reward-program/reward-code-detail.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Archived\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' {{rewardCodeDetail.rewardCode.rewardCode}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    {{rewardCodeDetail.rewardCode.viewsCounter}}
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    {{rewardCodeDetail.rewardCode.registrationsCounter}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Share on Social Media
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Link
    \\n' +\n '
    \\n' +\n ' {{rewardCodeDetail.getUrl()}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    Link (short)
    \\n' +\n '
    \\n' +\n ' {{rewardCodeDetail.shortUrl}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Available Rewards
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    {{option.name}}
    \\n' +\n '
    ..............................................................................................................................
    \\n' +\n '
    {{option.successfulLeadPrice | currency:\"$\":0}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Saving description...
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    Description
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' No description\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    An error occurred, try again please.
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    {{rewardCodeDetail.searchingUser}}
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    Shared with
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' This Reward Code is not shared with another user\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    {{rewardCodeDetail.searchingAssociatedUser}}
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    Associated with
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    0\">\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' This Reward Code is not associated with another users\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/reward-program/reward-code-create-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Create Reward Code\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide the details of a Reward Code and share with other member(s) of MyLeadPod\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide the Reward Code name and description\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    Missing Reward Code
    \\n' +\n '
    Reward Code must be at least 5 characters long
    \\n' +\n '
    Reward Code must not be longer than 20 characters
    \\n' +\n '
    This Reward Code is not available, try another one
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Description is for your own reference only and it\\'s not visible to public.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' Rewards\\n' +\n ' \\n' +\n ' ?\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Select reward type for this code\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Your Rewards Program is not set up. Click here to manage\\n' +\n ' \\n' +\n ' 0\">\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    {{option.name}}{{option.successfulLeadPrice | currency:\"$\":0}}
    \\n' +\n ' Click here to manage\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing name
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid successful lead value
    \\n' +\n '
    Missing successful lead value
    \\n' +\n '
    Successful lead value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' 1\">\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' Sharing incoming leads\\n' +\n ' \\n' +\n ' ?\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Type in the email of an existing user with business subscription (max.1) (optional)\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    0\">\\n' +\n '
    \\n' +\n '
    \\n' +\n ' This Reward Code will be shared with:\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' There are no associated users to this Reward Code.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' Associated Users\\n' +\n ' \\n' +\n ' ?\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Search for the business users you\\'d like to associate this Reward Code with.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Associated Users\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' There are no associated users to this Reward Code.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/received-leads/received-leads.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You haven\\'t received any leads\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Received fromDate receivedNameStatusDetails
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Date received
    \\n' +\n ' {{row.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Name
    \\n' +\n ' {{row.firstName}} {{row.lastName}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Status
    \\n' +\n ' \\n' +\n ' {{receivedLeads.statuses[row.status]}}\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Details
    \\n' +\n ' View lead\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{row.dateSent | date:\\'d MMM yyyy\\'}}{{row.firstName}} {{row.lastName}}\\n' +\n ' \\n' +\n ' {{receivedLeads.statuses[row.status]}} (shared)\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    View lead
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/memberships/memberships.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You don\\'t have any connections\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Join pods and start receiving leads. Click \"Ask for Leads\" to add your first connection.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Pod ownerIndustryJoin dateReward type
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Industry
    \\n' +\n ' {{row.owner.industry.name}}\\n' +\n '
    {{row.owner.subIndustry.name}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Join date
    \\n' +\n ' {{row.startDate | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Reward type
    \\n' +\n ' {{row.contractType}}\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{row.owner.industry.name}}\\n' +\n ' \\n' +\n '
    {{row.owner.subIndustry.name}}\\n' +\n '
    \\n' +\n '
    {{row.startDate | date:\\'d MMM yyyy\\'}}{{row.contractType}}
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/join-pod/join-pod-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Ask for Leads\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' How would you like to pay for the received leads\\n' +\n ' from {{joinPod.targetUser.fullName}}?\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/stats/stats.tpl.html',\n '
    \\n' +\n '\t
    \\n' +\n '\t\t\\n' +\n '\t\t\\n' +\n '\t
    \\n' +\n '\t
    \\n' +\n '\t\t\\n' +\n '\t\t\\n' +\n '\t
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\t
    \\n' +\n '\t\t 0 || stats.earningsValue == 0 && stats.donationsValue == 0\">\\n' +\n '\t\t\\n' +\n ' 0\">>\\n' +\n ' \\n' +\n '\t
    \\n' +\n '\t
    \\n' +\n '\t\t\\n' +\n '\t\t\\n' +\n '\t
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/ui/prompt-dialog.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' {{promptDialog.onConfirmMessage}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/ui/credit-card-directive.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{cc.scope.creditCard.number}}\\n' +\n ' \\n' +\n ' ({{cc.scope.creditCard.expiryMonth}}/{{cc.scope.creditCard.expiryYear}})\\n' +\n ' \\n' +\n '
    \\n' +\n ' Change\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide credit card details:\\n' +\n '
    \\n' +\n ' Use Registered Card\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \"eWAY\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing name on card.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing card number.
    \\n' +\n '
    Invalid card number.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Invalid expiry date.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing Expiry month.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing Expiry year.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/ui/apps-store-links-directive.tpl.html',\n '
    \\n' +\n ' Download MyLeadPod app from store\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    ');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/ui/action-toolbar-directive.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/pod/pod.tpl.html',\n '\\n' +\n '
    \\n' +\n '

    My Pod

    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You have no people in your pod\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Send invites to your business partners to join your pod. Click \"Invite to my Pod\" to start sending invites.\\n' +\n '
    \\n' +\n ' Invite to my Pod\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/pod/pod-members-list-directive.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    People in my Pod

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\t\t
    \\n' +\n '\t\t \\n' +\n '\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t \\n' +\n '\t
    \\n' +\n '\t\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t \\n' +\n '\t\t
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\t\t\t
    \\n' +\n '\t\t
    \\n' +\n '\t\t

    \\n' +\n '\t\t\t 4\">All people\\n' +\n '\t\t

    \\n' +\n '\t
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/pod/pod-earnings-graph-directive.tpl.html',\n '
    \\n' +\n '\t
    \\n' +\n '\t\t

    Earnings

    \\n' +\n '\t
    \\n' +\n '\t
    \\n' +\n '\t\t\\n' +\n '\t\t\\n' +\n '\t
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/memberships/received-leads-list-directive.tpl.html',\n '
    \\n' +\n '\t
    \\n' +\n '\t

    Newest received leads

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\t\t
    \\n' +\n '\t\t \\n' +\n '\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t\t \\n' +\n '\t\t \\n' +\n '\t\t
    \\n' +\n '\t\t\t \\n' +\n '\t\t\t\t\t\t\t\t\\n' +\n '\t\t\t\t\t\t\t\t\t\\n' +\n '\t\t\t\t\t\t\t\t\\n' +\n ' \t
    \\n' +\n '\t\t\t\t\t\t\t\t\t\t
    \\n' +\n '\t\t\t\t\t\t\t\t\t\t\\n' +\n '\t\t\t\t\t\t\t\t\t
    \\n' +\n '\t\t\t
    \\n' +\n '\t\t\t \tView lead\\n' +\n '\t\t\t
    \\n' +\n '\t
    \\n' +\n '\t

    \\n' +\n '\t\t\t 4\">All received leads\\n' +\n '\t\t

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/memberships/received-leads-graph-directive.tpl.html',\n '
    \\n' +\n '\t
    \\n' +\n '\t\t

    Received leads

    \\n' +\n '\t
    \\n' +\n '\t
    \\n' +\n '\t\\n' +\n '\t\t\\n' +\n '\t
    \\n' +\n '
    ');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/memberships/memberships.tpl.html',\n '
    \\n' +\n '\t

    My Business

    \\n' +\n '\\n' +\n '\t
    \\n' +\n '\t\t
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You have not received any leads\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Join pods and start receiving leads. Click \"Ask for Leads\" to grow your network.\\n' +\n '
    \\n' +\n ' Ask for Leads\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\t
    \\n' +\n '\t\t
    \\n' +\n '\t\t\t\\n' +\n '\t\t
    \\n' +\n '\t\t
    \\n' +\n '\t\t\t\\n' +\n '\t\t
    \\n' +\n '\t
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/profile/profile.tpl.html',\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' Design by Hoekstra\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{profile.userProfile.fullName}}\\n' +\n ' |\\n' +\n ' {{profile.userProfile.businessName}}\\n' +\n ' \\n' +\n '
    {{profile.userProfile.industry.name}}{{profile.userProfile.subIndustry ? \\' - \\' + profile.userProfile.subIndustry.name : \\'\\'}}
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Only for illustration
    \\n' +\n ' Send Message\\n' +\n ' Send Reward\\n' +\n ' Send Lead\\n' +\n ' Register Lead\\n' +\n ' Donate\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' Send Message\\n' +\n ' Send Reward\\n' +\n ' Send Lead\\n' +\n ' Register Lead\\n' +\n ' Donate\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    Updating your profile...
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\'Cancel\\' will clear all your edits.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' The image is too small (min. width required is 500px)\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' Uploaded images must be at least 500px wide. The dimensions of the area for the cover picture are 1140x215px.\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Move around the crop area in the content below. change the background colour to add some interesting effects.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Headline colour\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Keep pattern\\n' +\n '
    \\n' +\n '
    Yes\\n' +\n '
    \\n' +\n '
    No\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Pick background color from palette\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' This will remove all the current settings. Do you wish to proceed?\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Upload your photo\\n' +\n '

    Photo should be at least 300 x 300px

    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Basic information\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your first name.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your last name.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your email.
    \\n' +\n '
    This is not a valid email.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your mobile.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Change password\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Passwords do not match.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Business information\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your location.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Billing details\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Deactivate Account\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Follow the link to deactive your account.\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/profile/photo-upload.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/profile/deactivate-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Account Deactivation\\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Account to Remove\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Feedback\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Deactivate\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Deactivate Business Account\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' By clicking Continue, you will start the process of deactivating your business account and you will no longer need to pay subscription fees.
    \\n' +\n ' Other MyLeadPod members will no longer be able to locate your business on MyLeadPod app and will not be able to send you leads.
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Deactivate my account.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' By clicking Continue, you will start the process of deactivating your MyLeadPod account and will no longer be able to send the leads and to be rewarded.
    \\n' +\n ' You will also be unsubscribed from all MyLeadPod marketing communication.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' We are sorry that you are leaving us. We\\'d love to hear how we could improve MyLeadPod with your valuable feedback below.\\n' +\n ' Thank you.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Confirm the deactivation of your MyLeadPod account.\\n' +\n ' Confirm the deactivation of your MyLeadPod business account.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' Cancel\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Cancel\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/billing/credit-card.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{creditCard.isAdd() ? \\'Add Credit Card\\' : \\'Change Credit Card\\'}}\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \"eWAY\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing name on card.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing card number.
    \\n' +\n '
    Invalid card number.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Invalid expiry date.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing Expiry month.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing Expiry year.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/billing/billing.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Credit card details\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Looks like you don\\'t have a credit card on file\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '

    {{billing.creditCard.holderName}}

    \\n' +\n '

    {{billing.creditCard.number}}

    \\n' +\n '

    Expires {{billing.creditCard.expiryMonth}} / {{billing.creditCard.expiryYear}}

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Invoice history\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' There are no invoices to show\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Invoice dateAmountInvoice
    {{invoice.dateInvoice | date:\\'d MMM yyyy\\'}}\\n' +\n ' {{invoice.dateInvoice | date:\\'d MMM yyyy\\'}}
    \\n' +\n ' {{invoice.totalInclTax | currency:\"$\":2}}\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/preferences/preferences-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Preferences\\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' {{alert.message}}\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Mailing Lists\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{list.label}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{list.description}}
    \\n' +\n ' You are currently\\n' +\n ' subscribed to the mailing list\\n' +\n ' not subscribed to the mailing list\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    ON\\n' +\n '
    \\n' +\n '
    OFF\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/preferences/mailing-list-unsubscribe.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You have been unsubscribed from the weekly mailing list. You can subscribe back anytime using the preferences.\\n' +\n '
    \\n' +\n ' MyLeadPod\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' The update in subscription was not successful. Please try again or contact us.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/password/reset.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Set New Password

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing password.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing password.
    \\n' +\n '
    Passwords do not match.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Password Reset

    \\n' +\n '
    \\n' +\n ' Your password has been successfully updated!\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Login\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/password/recover.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Enter your email and we\\'ll get you back on track

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your email.
    \\n' +\n '
    This is not a valid email.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Password Reset

    \\n' +\n '

    We have sent {{recoverCtrl.data.email}} an email with reset instructions

    \\n' +\n '

    \\n' +\n ' If the email does not arrive soon, check your spam folder. The email was sent from confirm@myleadpod.com\\n' +\n '

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Back to login\\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/feedback/feedback-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Feedback\\n' +\n ' Need Help?\\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' {{alert.message}}\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' We would like to hear from you! Please let us know how we can improve MyLeadPod\\n' +\n ' Please provide your name, email and the issue description\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Your name is required
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Email address is required
    \\n' +\n '
    Invalid email address
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing feedback
    \\n' +\n '
    Missing issue description
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/earnings/withdraw.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Withdraw Earnings

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' At MyLeadPod we encourage people to support local communities, sports clubs and charities and we offer the option of donating to a charity.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Would you like to donate now?\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Withdraw value\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' The minimum withdrawal limit is {{withdraw.minLimit | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid amount\\n' +\n '
    \\n' +\n '
    Missing amount\\n' +\n '
    \\n' +\n '
    You can not withdraw more than your balance\\n' +\n '
    \\n' +\n '
    You have to withdraw more than minimum withdraw limit\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Recalculating
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Current balance\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{withdraw.balance | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Processing fee\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{withdraw.processingFee ? (withdraw.processingFee | currency:\"$\":2) : \"...\"}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Withdrawal amount\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{withdraw.receivedAmount ? (withdraw.receivedAmount| currency:\"$\":2) : \"...\"}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Remaining balance\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{withdraw.remainingBalance ? (withdraw.remainingBalance | currency:\"$\":2) : \"...\"}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Payment details\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide recipient\\'s bank account details\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Account holder.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Account BSB.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Account
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/earnings/earnings.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{earnings.summaries.lastMonthEarnings | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' last month\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{earnings.summaries.totalEarnings | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' total earnings\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{earnings.summaries.withdrawals | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' withdrawn\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{earnings.summaries.actualEarnings | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' current balance\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' There\\'s nothing to show, your wallet is empty!\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
      \\n' +\n '
    • \\n' +\n ' {{label}}\\n' +\n '
    • \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    Received fromDateAmountDetails
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Date
    \\n' +\n ' {{row.date | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Amount
    \\n' +\n ' {{row.amount | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Details
    \\n' +\n ' View lead\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{row.date | date:\\'d MMM yyyy\\'}}{{row.amount | currency:\\'$\\':0}}View lead
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You haven\\'t made any withdrawals\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    DateAmount
    {{row.date | date:\\'d MMM yyyy\\'}}\\n' +\n ' {{row.date | date:\\'d MMM yyyy\\'}}
    \\n' +\n ' {{row.amount | currency:\\'$\\':0}}\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/user.tpl.html',\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{user.userProfile.fullName}}\\n' +\n ' {{user.userProfile.businessName}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{user.userProfile.industry.name}}{{user.userProfile.subIndustry ? \\' - \\' + user.userProfile.subIndustry.name : \\'\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{user.getAddress()}}
    \\n' +\n '
    {{user.userProfile.phoneMobile}}
    \\n' +\n '
    {{user.userProfile.email}}
    \\n' +\n '
    {{user.userProfile.website}}
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Send Message\\n' +\n ' Send Reward\\n' +\n ' Register Lead\\n' +\n ' Send Lead\\n' +\n ' Donate\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Design by Hoekstra\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{user.userProfile.fullName}}\\n' +\n ' |\\n' +\n ' {{user.userProfile.businessName}}\\n' +\n '\\n' +\n ' \\n' +\n '
    {{user.userProfile.industry.name}}{{user.userProfile.subIndustry ? \\' - \\' + user.userProfile.subIndustry.name : \\'\\'}}
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' Send Message\\n' +\n ' Send Reward\\n' +\n ' Send Lead\\n' +\n ' Register Lead\\n' +\n ' Donate\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' Send Message\\n' +\n ' Send Reward\\n' +\n ' Send Lead\\n' +\n ' Register Lead\\n' +\n ' Donate\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' Send Reward\\n' +\n ' Send Lead\\n' +\n ' Register Lead\\n' +\n ' Ask for Leads\\n' +\n ' Donate\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/user-avatar-directive.tpl.html',\n '\\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('user/about.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('toolbar/toolbar.tpl.html',\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('toolbar/business-suggestion-directive.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Do you want to receive leads for your own business?\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' You are eligible for a trial business subscription, subscribe now and start receiving leads!\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Your trial business account subscription {{suggestion.trialData.trialExpiresIn}}\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('social-share/social-share-directive.tpl.html',\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('search/search-bar-directive.tpl.html',\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('search/search-bar-autocomplete-result-template.tpl.html',\n '
    \\n' +\n ' VAJCO! + {{result.value}}\\n' +\n '
    ');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('search/search-autocomplete-directive.tpl.html',\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    1 && hasCategoryFilter\">\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Narrow your search by choosing the search categories:\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    0\"\\n' +\n ' style=\"cursor: inherit;\">\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' Your last selected items:\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{result.description}}
    \\n' +\n '
    \\n' +\n '
    {{ result.title }}
    \\n' +\n '
    {{result.description2}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    1 && hasCategoryFilter\">\\n' +\n '
    Filter:
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{category.name}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{result.description}}
    \\n' +\n '
    \\n' +\n '
    {{ result.title }}
    \\n' +\n '
    {{result.description2}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('notifications/notification-center-directive.tpl.html',\n '\\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    0 || nc.filterActive) && nc.filterCategories && nc.filterCategories.length > 1\">\\n' +\n '
    \\n' +\n '
    Filter:
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{category.name}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Mark as read\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{n.userName}}\\n' +\n ' \\n' +\n ' {{n.description}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{n.value}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{n.timeFormatted}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' You have no new notifications.\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' You have no notifications in this category.\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' This is your notification center. Click the notification to display the details or swipe left or right to dismiss it!\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-pod/my-pod.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    My Pod

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Invite to my Pod\\n' +\n ' Send Lead\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' Invite to my Pod\\n' +\n ' Send Lead\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/reward-selector-directive.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' Your Rewards Program is not set up. Set up your Rewards Program here to be able to ask for the leads with this option.\\n' +\n ' \\n' +\n ' 0\">\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    {{option.name}}{{option.successfulLeadPrice | currency:\"$\":0}}
    \\n' +\n ' Click here to manage\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Select Reward Code
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Invalid successful lead value
    \\n' +\n '
    Missing successful lead value
    \\n' +\n '
    Successful lead value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Invalid subscription value
    \\n' +\n '
    Missing subscription value
    \\n' +\n '
    Subscription value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('my-memberships/my-memberships.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    You are currently evaluating the business account. This trial subscription will expire on {{myMemberships.trialData.trialExpiryDate | date:\\'d MMM yyyy\\'}}
    \\n' +\n '
    \\n' +\n '
    To purchase the full subscription now, click the button below
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    My Business

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' You are eligible for the trial business subscription\\n' +\n ' \\n' +\n '
    \\n' +\n ' Ask for Leads\\n' +\n ' Register Lead\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Need leads for your business?\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Invite people to recommend your business. You can join their pod and grow your connections. Click \"Activate\" to\\n' +\n ' start receiving leads.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    You are eligible for the trial business subscription
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n ' Activate\\n' +\n ' Ask for Leads\\n' +\n ' Register Lead\\n' +\n ' \\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('lead/send-lead.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    {{sendLead.isRegister ? \\'Register Lead\\' : \\'Send Lead\\'}}

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{sendLead.isRegister ? \\'Select sender\\' : \\'Select recipient\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Select businesses\\n' +\n ' (or invite new)\\n' +\n ' that will receive your lead:\\n' +\n ' \\n' +\n ' Select user\\n' +\n ' (or invite new)\\n' +\n ' who sent you the lead above:\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Either select an existing person or invite a new one
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Seems like the business you want to send a lead to is not yet a member of MyLeadPod. You can provide the details of the business manually\\n' +\n ' here.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide the details of the person\\n' +\n ' (s) you\\'d like to invite, or\\n' +\n ' try Search again:\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Contact Details:\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    First name is missing
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Email is missing
    \\n' +\n '
    This is not a valid email
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing phone number.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' Change reward agreement (more details)\\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' 0\">Recipients\\n' +\n '
    \\n' +\n ' {{user.firstName}} {{user.lastName}} \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{user.firstName}} new \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('lead/send-lead-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('lead/send-lead-form-partial.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' Lead details\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide the details of the person that this business should get in touch with. \\n' +\n ' 1)\" class=\"sub-title-description\">Provide the details of the person that these businesses should get in touch with. \\n' +\n ' Provide the details of the person that the businesses should get in touch with. \\n' +\n ' Try to search for the person\\'s contact details to pre-fill the form automatically, or use the form to manually enter the required information.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide the details of the customer this lead was related to:\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    No results were returned, please enter the person\\'s details manually
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    At least one of first name or last name is required
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    At least one of phone or valid email address is required
    \\n' +\n '
    Invalid email address
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing note
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('lead/lead-view.tpl.html',\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('lead/lead-detail.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{leadDetail.leadType == \\'sent\\' ? \\'Sent Lead\\' : \\'Received Lead\\'}}\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{leadDetail.lead.dateSent | date:\\'d MMM yyyy\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' {{leadDetail.leadType === \\'sent\\' ? \\'To\\' : \\'From\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Reward\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' #{{leadDetail.lead.rewardCode.rewardCode}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Details\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{leadDetail.lead.details}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Contact\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{leadDetail.lead.firstName}} {{leadDetail.lead.lastName}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{leadDetail.lead.phone}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{leadDetail.lead.email}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Sharing\\n' +\n '
    \\n' +\n '
    \\n' +\n ' This lead is not shared with another user\\n' +\n ' \\n' +\n ' This lead is shared with {{leadDetail.lead.coOwner.firstName}} {{leadDetail.lead.coOwner.lastName}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' You will share this lead with:\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('lead/close-lead.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Successful lead reward payment\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Select Reward\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Additional Reward\\n' +\n '
    \\n' +\n '\\n' +\n '
    = 1 || closeLead.data.bonusReward\">\\n' +\n ' \\n' +\n '
    \\n' +\n '
    = 1 || closeLead.data.bonusReward\">\\n' +\n ' Review and Payment\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    = 1\">\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Select a reward for this lead:\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' The reward contract between you and {{closeLead.lead.sender.fullName}} is based on SUBSCRIPTION model.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' This user is rewarded periodically an amount of:\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' If you\\'d like to pay the extra reward, enter the amount below:\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid optional reward\\n' +\n '
    \\n' +\n '
    Optional reward must not be negative\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Provide any additional feedback / comment / appraisal to {{closeLead.lead.sender.fullName}}:\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing feedback
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    = 1\">\\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Payment Review:\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Successful lead reward\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{closeLead.getSuccessfulLeadPrice() | currency:\\'$\\':2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Bonus reward\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{closeLead.data.bonusReward | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Processing fee\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{closeLead.processingFee | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' GST\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{closeLead.tax | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Total charged\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{closeLead.total | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Payment Details:\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Unsuccessful Lead\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Are you sure you want to close this lead as \\'UNSUCCESSFUL\\'?\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Please provide feedback for this lead\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing feedback
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('mlp-marketplace/marketplace.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Marketplace

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Sign up to deals and services advertised by MyLeadPod business subscribers. (To advertise, please\\n' +\n ' contact us\\n' +\n ' to set you up for MyLeadPod Marketplace.)\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    0\">\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' MyLeadPod Deals and Services\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Marketplace\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('mlp-marketplace/marketplace-listings-directive.tpl.html',\n '
    \\n' +\n ' \\n' +\n ' {{alert.message}}\\n' +\n '\\n' +\n ' \\n' +\n '
    0\"\\n' +\n ' ng-repeat=\"item in marketplace.items\">\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{item.label}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Price\\n' +\n ' {{item.isFree ? \\'FREE\\' : (item.priceMonthly | currency:\\'$\\':0)}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Company\\n' +\n ' {{item.owner.fullName + ((item.owner.businessName && item.owner.fullName !== item.owner.businessName) ? \\' | \\' + item.owner.businessName : \\'\\' )}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{item.description}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' {{item.isFree ? \\'FREE\\' : (item.priceMonthly | currency:\\'$\\':0)}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Unsubscribe\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{item.description}}\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('mlp-marketplace/marketplace-info-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{marketplaceInfo.item.label}} - {{marketplaceInfo.item.isFree ? \\'FREE\\' : ((marketplaceInfo.item.priceMonthly | currency:\\'$\\':0))}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' {{marketplaceInfo.item.isFree ? \\'FREE\\' : (marketplaceInfo.item.priceMonthly | currency:\\'$\\':0)}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Unsubscribe\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Subscribed \\n' +\n ' Not subscribed\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Owner\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Price\\n' +\n ' {{marketplaceInfo.item.isFree ? \\'FREE\\' : (marketplaceInfo.item.priceMonthly | currency:\\'$\\':0)}}\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Description\\n' +\n ' {{marketplaceInfo.item.description}}\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('mlp-marketplace/marketplace-activation-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' {{marketplaceActivation.item.label}}\\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Payment Summary

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Subscription fee\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{marketplaceActivation.paymentSummary.price | currency:\\'$\\':2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' GST\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{marketplaceActivation.paymentSummary.tax | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Total\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{marketplaceActivation.paymentSummary.total | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Payment Options

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('mlp-charity/donate-modal.tpl.html',\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Donation\\n' +\n '
    \\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    Making Donation..
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Loading your Credit Card
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' Charity receiving your donation\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    {{ donation.charityProfile.businessName ? donation.charityProfile.businessName : donation.charityProfile.firstName }}
    \\n' +\n ' Change\\n' +\n ' Done\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    0\">\\n' +\n '
    Last donations
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Search within MyLeadPod
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Payment options\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Please provide the donation amount\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid value
    \\n' +\n '
    Missing value
    \\n' +\n '
    Donation value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    0\">\\n' +\n '
    \\n' +\n ' Payment Summary\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Recalculating
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Donation\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{donation.data.amount | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Processing fee\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{donation.summary.fee >= 0 ? (donation.summary.fee | currency:\"$\":2) : \"...\"}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Tax\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{donation.summary.tax >= 0 ? (donation.summary.tax| currency:\"$\":2) : \"...\"}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Payment Total\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{donation.summary.total >= 0 ? (donation.summary.total | currency:\"$\":2) : \"...\"}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    Loading Charity Info
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' {{ donation.charityProfile.businessName ? donation.charityProfile.businessName : donation.charityProfile.firstName }}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' No Charity selected\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('messaging/messaging-form-directive.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Loading Messages
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    Sending...
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' No Messages.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Send the first message!\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    0 && !msg.error\">\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{m.created}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Unable to load messages.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{msg.notification}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('dashboard/dashboard.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Dashboard

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Invite to my Pod\\n' +\n ' Send Lead\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' Invite to my Pod\\n' +\n ' Send Lead\\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('components/stat-block-directive.tpl.html',\n '
    \\n' +\n '\t
    {{statBlock.stat}}
    \\n' +\n '\t
    {{statBlock.subtext}}
    \\n' +\n '\t
    \\n' +\n '\t\t{{statBlock.buttonText}}\\n' +\n '\t
    \\n' +\n '
    ');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/sign-up.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '

    \\n' +\n ' Join in less than a minute. No credit card required.\\n' +\n '

    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '

    \\n' +\n ' \\n' +\n ' Join {{signUp.invitationSender.fullName}} and start earning cash for sending leads.\\n' +\n ' \\n' +\n ' \\n' +\n ' Join {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? \\', \\' + signUp.invitationSender.businessName : \\'\\'}} Rewards Program.\\n' +\n ' \\n' +\n '

    \\n' +\n '

    \\n' +\n ' Join {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? \\', \\' + signUp.invitationSender.businessName : \\'\\'}} Rewards Program.\\n' +\n '

    \\n' +\n '

    \\n' +\n ' {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? \\', \\' + signUp.invitationSender.businessName : \\'\\'}} would like to send you business leads.\\n' +\n '

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' You can now earn up to ${{signUp.invitationSender.highestReward}} by sending MyLeadPod a successful lead!\\n' +\n '
    \\n' +\n ' Search and join different businesses and their Rewards Program on MyLeadPod to start earning cash for sending leads.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    You can now earn up to ${{signUp.invitationSender.highestReward}} by sending just one lead!
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    Expand your business by registering with MyLeadPod, fast-growing business referral network system.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    \\n' +\n ' Sign up for your free trial.\\n' +\n '

    \\n' +\n '

    \\n' +\n ' Join {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? \\', \\' + signUp.invitationSender.businessName : \\'\\'}} on MyLeadPod. Sign up and..\\n' +\n '

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Activate your {{signUp.trialDuration}} free business subscription.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' You are only a few steps away from creating your own cash Reward Program for your business.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' .. send your first lead.\\n' +\n '
    \\n' +\n '
    You can now earn up to ${{signUp.invitationSender.highestReward}} by sending just one lead!
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' .. receive {{signUp.trialDuration}} free business trial.\\n' +\n '
    \\n' +\n '
    \\n' +\n ' You are only a few steps away from creating your own cash Reward Program and starting receiving leads for your business.\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Do you have a Reward Code?\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid Reward Code.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Join {{signUp.rewardCardOwner.fullName}}{{signUp.rewardCardOwner.businessName ? \\', \\' + signUp.rewardCardOwner.businessName : \\'\\'}} Rewards Program.

    \\n' +\n '
    \\n' +\n '
    You can now earn up to ${{signUp.rewardCardOwner.highestReward}} by sending just one lead!
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    Sorry, Reward Code was not found or is not longer available.
    \\n' +\n '
    You can try again, or join and search for the business in the app to send the lead(s)!
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n ' Reward Code is optional and not required for joining.\\n' +\n ' Reward Card may differ.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Try another Reward Code\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Join the quick way\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    OR
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Join with your email\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your email.
    \\n' +\n '
    This is not a valid email.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Please type in your new password.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' By clicking \\'Create Account\\' button, you agree to MyLeadPod\\'s Terms & Conditions and Privacy Policy\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Thanks for joining!

    \\n' +\n '

    \\n' +\n ' Please check your email and click Verify Email in the message we just sent to\\n' +\n '
    \\n' +\n ' {{signUp.data.email}}\\n' +\n '
    \\n' +\n ' Once your email has been verified you\\'ll get access to your account.\\n' +\n '

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/sign-in.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Login

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    OR
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your email.
    \\n' +\n '
    This is not a valid email.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing password.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' Forgot?\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' Don\\'t have an account? Sign up\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/business-account.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Activate Business Account\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' {{alert.message}}\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Company Details\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Subscription Type\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Reward Code\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Payment Details\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Company Details

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Company /\\n' +\n ' Organisation is a required field.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Classification is a required field.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' There was an issue while trying to find your location.
    \\n' +\n ' Make sure the Location is allowed on your device and try again, or type in your address.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Your current address is set to:\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{businessAccount.data.addressPostal | address:\\'au\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' We don\\'t have any of your address information on file yet, please type in the address or use the Geolocation button and provide us with the following information\\n' +\n ' \\n' +\n ' \\n' +\n ' Even though you have provided some address information, we still need you to provide us with the additional info\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Street Number\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Street Name\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Suburb\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Postcode\\n' +\n '
    \\n' +\n '
    \\n' +\n ' State\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Country\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Subscription

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' Currently there is only one plan to choose from. Click \\'Next\\' to continue.\\n' +\n ' \\n' +\n ' 1\">\\n' +\n ' Select (click on) the subscription type:\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Set up your own Reward Code:\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing Reward Code
    \\n' +\n '
    Reward Code must be at least 5 characters long
    \\n' +\n '
    Reward Code must not be longer than 20 characters
    \\n' +\n '
    This Reward Code is not available, try another one
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Set the Reward Code value (for successful lead):\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid successful lead value
    \\n' +\n '
    Missing successful lead value
    \\n' +\n '
    Successful lead value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' * Reward cards are purchased separately.
    \\n' +\n ' For more information please contact the sales support.\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Payment Summary

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Subscription fee\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{businessAccount.paymentSummary.price | currency:\\'$\\':2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' GST\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{businessAccount.paymentSummary.tax | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Total*\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{businessAccount.paymentSummary.total | currency:\"$\":2}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' * You will be periodically charged this amount based on the chosen subscription type\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Payment Options

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/business-account-trial.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Activate Business Account (Trial)\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' {{alert.message}}\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Company Details\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Reward Code\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' Confirmation\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '

    Company Details

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Company /\\n' +\n ' Organisation is a required field.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Classification is a required field.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Address is Incomplete.\\n' +\n ' (type in or use the geolocation)\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n ' There was an issue while trying to find your location.
    \\n' +\n ' Make sure the Location is allowed on your device and try again, or type in your address.\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Your current address is set to:\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{businessAccount.data.addressPostal | address:\\'au\\'}}\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' We don\\'t have any of your address information on file yet, please type in the address or use the Geolocation button and provide us with the following information\\n' +\n ' \\n' +\n ' \\n' +\n ' Even though you have provided some address information, we still need you to provide us with the additional info\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Street Number\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Street Name\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Suburb\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Postcode\\n' +\n '
    \\n' +\n '
    \\n' +\n ' State\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Country\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' Set up your own Reward Code:\\n' +\n ' ?\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Missing Reward Code
    \\n' +\n '
    Reward Code must be at least 5 characters long
    \\n' +\n '
    Reward Code must not be longer than 20 characters
    \\n' +\n '
    This Reward Code is not available, try another one
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' Set the Reward Code value (for successful lead):\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Invalid successful lead value
    \\n' +\n '
    Missing successful lead value
    \\n' +\n '
    Successful lead value must not be negative
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' * Reward cards are purchased separately.
    \\n' +\n ' For more information please contact the sales support.\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '

    You are now ready to start your trial business account subscription with

    \\n' +\n ' \\n' +\n '
    This evaluation subscription will expire on {{businessAccount.trialData.trialExpiryDate | date:\\'d MMM yyyy\\'}}
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/activate.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Activate your account

    \\n' +\n '
    \\n' +\n ' Please fill in the form to activate your account\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' {{alert.message}}\\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your email.
    \\n' +\n '
    This is not a valid email.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your first name.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your last name.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Tell us your mobile phone number.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n ' \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/activate-update-password.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    Set Password

    \\n' +\n '
    \\n' +\n ' Welcome to MyLeadPod!\\n' +\n '
    \\n' +\n ' In order to continue to use this account, we need you to setup the password...\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    Passwords do not match.
    \\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/account.tpl.html',\n '
    \\n' +\n '
    \\n' +\n '

    My Account

    \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '');\n}]);\n\nangular.module('myLeadPod').run(['$templateCache', function($templateCache) {\n $templateCache.put('account/account-header.tpl.html',\n '');\n}]);\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui.tabs\n * @description\n *\n */\n angular\n .module('components.ui.tabs', []);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.tabs.directive:tabsManager\n * @restrict EA\n * @element\n */\n angular\n .module('components.ui.tabs')\n .directive('tabsManager', tabsManager);\n\n function tabsManager() {\n return {\n restrict: 'EA',\n scope: {\n // Tab id\n tabId: '@',\n // Configuration object with all the tabs that this directive will have\n tabsConfig: '=',\n // Default tab value\n defaultTab: '@',\n // Tab Manager instance. This can be user by the implementing scope to get the instance of this directive in parent controller.\n tabManager: '=',\n // On change callback\n change: '&onChange',\n // Target in action toolbar (primary:default or secondary) that this instance will be relocated to in xs devices\n target: '@',\n // Whether to block the relocation into the action toolbar for xs devices\n blockXsRelocation: '='\n },\n templateUrl: 'components/ui/tabs/tabs-manager-directive.tpl.html',\n replace: true,\n controllerAs: 'tabsManager',\n controller: ['$scope', '$document', '$compile', 'RouterHelper', 'Tabs', function ($scope, $document, $compile, RouterHelper, Tabs) {\n var vm = this,\n lastLabel;\n\n vm.tabId = angular.isDefined($scope.tabId) ? $scope.tabId : (new Date()).getTime();\n vm.tabsConfig = angular.isDefined($scope.tabsConfig) ? $scope.tabsConfig : [];\n vm.blockXsRelocation = angular.isDefined($scope.blockXsRelocation) ? $scope.blockXsRelocation : false;\n vm.tabs = _.pluck(vm.tabsConfig, 'value');\n vm.isScrolling = false;\n\n if (!vm.tabs || vm.tabs.length === 0 || !vm.tabId) {\n throw new Error('[tabs-manager-directive]: List of names must not be empty');\n }\n vm.defaultTab = angular.isDefined($scope.defaultTab) ? $scope.defaultTab : vm.tabsConfig[0].value;\n vm.target = $scope.target ? $scope.target : 'primary';\n\n // Create the tab manager\n vm.tabManager = Tabs.create(vm.tabId, vm.tabs, vm.defaultTab, $scope);\n\n // Re-assign the value to parent controller so we can show/hide the templated content.\n $scope.tabManager = vm.tabManager;\n\n // Default value for the dropdown visibility\n vm.isDropDownOpen = false;\n\n // Set the currently selected tab (default tab value) and then watch the tabs-factory ActiveTab value\n vm.currentTabLabel = _.find(vm.tabsConfig, {value: vm.defaultTab}).label;\n\n vm.openTab = function (tabName, checkScroll, $event) {\n var el;\n\n if (checkScroll && $event) {\n // This is the scenario where openTab is invoked through click on the action toolbar's tab. (xs devices)\n el = $event.currentTarget;\n vm.scrollToTab(el);\n }\n else if (checkScroll) {\n // This is the scenario where openTab is invoked through RouterHelper\n // Check for the element. if the element exists, it means we are in the xs size and we need to scroll to the tab\n el = angular.element('[data-tab-name=\"' + vm.tabId + '-' + tabName + '\"] a');\n if (el && el[0] && !vm.isScrolling) {\n vm.scrollToTab(el[0]);\n }\n }\n\n if (tabName) {\n // Finally set the tab active in any scenrio\n vm.tabManager.openTab(tabName);\n }\n };\n\n vm.scrollToTab = function (element) {\n var parent,\n vw,\n elWidth,\n elLeft,\n scrollLeft,\n diff;\n\n if (!element || vm.isScrolling) {\n return;\n }\n parent = element.parentElement;\n if (parent) {\n // Means we are in xs view (very likely). Get the parent Element and its parent and comparet to scroll vals\n vw = $document[0].documentElement.clientWidth;\n elWidth = parent.clientWidth;\n elLeft = angular.element(parent).position().left;\n scrollLeft = parent.parentElement.scrollLeft;\n diff = elLeft + elWidth / 2 - vw / 2;\n vm.isScrolling = true;\n angular.element(parent.parentElement).animate({scrollLeft: scrollLeft + diff}, {\n easing: 'linear',\n duration: 200,\n complete: function () {\n vm.isScrolling = false;\n }\n });\n }\n };\n\n vm.getActiveLabel = function () {\n var label;\n\n if (!vm.tabManager.activeTab) {\n return null;\n }\n\n label = _.find(vm.tabsConfig, {value: vm.tabManager.activeTab}).label;\n if (lastLabel !== label) {\n $scope.change({activeTab: vm.tabManager.activeTab});\n lastLabel = label;\n }\n return label;\n };\n\n // Subscribe\n angular.forEach(vm.tabs, function (tabName) {\n // Maybe the event has been already triggered\n if (RouterHelper.lastEvent && RouterHelper.lastEvent.id === 'event:' + vm.tabId + '-open-tab-' + tabName) {\n vm.openTab(tabName, true);\n }\n\n $scope.$on('event:' + vm.tabId + '-open-tab-' + tabName, function () {\n vm.openTab(tabName, true);\n });\n });\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.tabs.directive:tabAdditionalContent\n * @restrict EA\n * @element\n */\n tabAdditionalContent.$inject = [\"$compile\"];\n angular\n .module('components.ui.tabs')\n .directive('tabAdditionalContent', tabAdditionalContent);\n\n function tabAdditionalContent($compile) {\n return {\n restrict: 'EA',\n template: '',\n replace: true,\n scope: {\n rawHtml: '=html'\n },\n link: function (scope, elem) {\n scope.$watch('rawHtml', function (value) {\n var newElem;\n if (!value || !angular.isString(value)) {\n return;\n }\n // we want to use the scope OUTSIDE of this directive\n // (which itself is an isolate scope).\n newElem = $compile(value)(scope.$parent);\n elem.contents().remove();\n elem.append(newElem);\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui.table\n * @description\n *\n */\n angular\n .module('components.ui.table', []);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:tableUserDetails\n * @restrict E\n * @element\n */\n tableUserDetails.$inject = [\"$timeout\", \"$templateRequest\", \"$compile\", \"$sce\"];\n angular\n .module('components.ui.table')\n .directive('tableUserDetails', tableUserDetails);\n\n function tableUserDetails($timeout, $templateRequest, $compile, $sce) {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n isLink: '=?',\n descriptionKey: '=?',\n stopPropagation: '=?',\n hasDetails: '=?',\n nameOnly: '=?',\n addClass: '='\n },\n replace: true,\n transclude: false,\n templateUrl: 'components/ui/table/table-user-details-directive.tpl.html',\n compile: function (element, attrs) {\n return {\n pre: function preLink(scope) {\n if (!attrs.isLink) {\n scope.isLink = true;\n }\n if (!attrs.hasDetails) {\n scope.hasDetails = false;\n }\n if (!attrs.nameOnly) {\n scope.nameOnly = false;\n }\n if (!attrs.descriptionKey) {\n scope.descriptionKey = 'businessName';\n }\n if (!attrs.stopPropagation) {\n scope.stopPropagation = true;\n }\n\n if (scope.user) {\n scope.user.mlpUserDetails = {\n showAdvanced: scope.nameOnly,\n descriptionText: scope.user[scope.descriptionKey]\n };\n }\n // Pre-assign the detailsVisible property to false\n scope.detailsVisible = false;\n },\n post: function postLink(scope, iElement) {\n var templateUrl;\n if (iElement.parent()) {\n iElement.parent().addClass('table-user-detail-holder');\n }\n if (scope.stopPropagation) {\n iElement.bind('click', function (evt) {\n evt.stopPropagation();\n });\n }\n templateUrl = $sce.getTrustedResourceUrl('components/ui/table/table-user-popover.tpl.html');\n if (scope.hasDetails) {\n $templateRequest(templateUrl).then(function (template) {\n var el = angular.element(template)[0],\n linked = $compile(el)(scope);\n $timeout(function () {\n scope.$apply();\n scope.htmlPopover = $sce.trustAsHtml(linked.html());\n }, 100, false);\n }, function () {\n // An error has occurred here\n });\n }\n }\n };\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:singleExpand\n * @restrict A\n * @element\n */\n singleExpand.$inject = [\"ComponentsUtil\"];\n angular\n .module('components.ui.table')\n .directive('singleExpand', singleExpand);\n\n function singleExpand(ComponentsUtil) {\n return {\n restrict: 'A',\n scope: {\n subContent: '=',\n subContentIdx: '='\n },\n link: function (scope, element) {\n element.addClass('single-expand');\n element.bind('click', function () {\n scope.subContent = ComponentsUtil.toggleSubContent(scope.subContent, scope.subContentIdx);\n scope.$apply();\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:headerCheck\n * @restrict A\n * @element\n * @description After the last ng-repeat is rendered, the directive checks for the scrollbar. if present, it adds the padding to the header.\n */\n headerCheck.$inject = [\"$timeout\"];\n angular\n .module('components.ui.table')\n .directive('headerCheck', headerCheck);\n\n function headerCheck($timeout) {\n return {\n restrict: 'A',\n link: function (scope, element) {\n var tbody,\n thead,\n scrollBarWidth;\n\n if (scope.$last === true) {\n $timeout(function () {\n // Grab the element (which should be the row), its parent (thead), check for the scroll.\n // If scroll exists, do the padding (if thead is visible)\n if (!tbody) {\n tbody = element.parent();\n thead = tbody.parent().find('thead');\n }\n\n if (tbody[0].scrollHeight > tbody.height()) {\n if (!scrollBarWidth) {\n scrollBarWidth = tbody.width() - tbody[0].scrollWidth;\n thead.css({'padding-right': scrollBarWidth + 'px'});\n }\n }\n else {\n thead.css({'padding-right': null});\n }\n });\n }\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.messages\n * @description\n *\n */\n angular\n .module('user.messages', [\n 'ui.router',\n 'mlp-messaging'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('user.messages')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.messages', angular.extend({}, configOptions.defaultStateParams, {\n url: '/messages',\n templateUrl: 'user/messages/messages.tpl.html',\n controller: 'MessagesCtrl',\n controllerAs: 'msg',\n onEnter: ['$rootScope', '$timeout', '$window', '$document', 'RouterHelper', 'notificationConst', 'userProfile', function ($rootScope, $timeout, $window, $document, RouterHelper, notificationConst, userProfile) {\n RouterHelper.activateTab('user', 'messages');\n // $rootScope.$broadcast('event:slider-do-layout', {delay: 100, stepTo: 0});\n $rootScope.$broadcast('event:slider-do-layout', {delay: 100});\n\n // Broadcast to all scroll-navigators to do the check. Not ideal but I don't know how to target only those on this relevant page.\n $rootScope.$broadcast('event:check-scroll-navigator', 'all', 1000);\n\n // Broadcast to the NotificationCentre to check any notifications related to messages for this user.\n $rootScope.$broadcast('event:notifications-check', {\n userId: userProfile.idUser,\n category: notificationConst.categoryMessages,\n type: notificationConst.typeDirectMessage\n });\n }],\n onExit: ['$rootScope', function ($rootScope) {\n $rootScope.$broadcast('event:check-scroll-navigator', 'all', 200);\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.leads.controller:UserReceivedLeadsCtrl\n *\n * @description\n *\n */\n MessagesCtrl.$inject = [\"$rootScope\", \"$scope\", \"$document\", \"$window\", \"$q\", \"$timeout\", \"$uibModal\", \"Restangular\", \"Leads\", \"smoothScroll\"];\n angular\n .module('user.messages')\n .controller('MessagesCtrl', MessagesCtrl);\n\n function MessagesCtrl($rootScope, $scope, $document, $window, $q, $timeout, $uibModal, Restangular, Leads, smoothScroll) {\n var vm = this,\n promises = [];\n\n vm.isLoadingLeads = false;\n vm.isLoadingMsg = false;\n vm.userProfile = $scope.user.userProfile;\n vm.openInfo = false;\n vm.currentLead = null;\n vm.modalInstance = null;\n vm.targetMsgContainer = 'direct-messages-text-input';\n\n vm.loadLeads = function () {\n // Get the leads\n vm.isLoadingLeads = true;\n\n promises.push(Restangular.one('Leads').getList('index', {\n type: 'sent',\n idUser: vm.userProfile.id,\n status: 'open',\n limit: -1\n }));\n\n promises.push(Restangular.one('Leads').getList('index', {\n type: 'received',\n idUser: vm.userProfile.id,\n status: 'open',\n limit: -1\n }));\n\n $q.all(promises).then(function (resultsArray) {\n vm.sentLeads = resultsArray[0].plain();\n _.each(vm.sentLeads, function (lead) {\n lead.leadType = 'sent';\n });\n\n vm.receivedLeads = resultsArray[1].plain();\n _.each(vm.receivedLeads, function (lead) {\n lead.leadType = 'received';\n });\n\n vm.leads = _.union(vm.sentLeads, vm.receivedLeads);\n vm.leads = _.sortBy(vm.leads, 'dateSent').reverse();\n\n vm.isLoadingLeads = false;\n });\n };\n\n vm.openDetails = function (lead, type) {\n if (!lead && !type) {\n lead = vm.currentLead;\n }\n Leads.openDetail(lead, lead.leadType, null);\n };\n\n vm.navigateTo = function (hash, options, lead) {\n if (vm.isLoadingMsg || vm.currentLead === lead) {\n // Come back later. Otherwise the messages directive will load the latest incoming request which might be not right.\n return;\n }\n vm.isLoadingMsg = true;\n vm.currentLead = lead;\n vm.openInfo = false;\n if (angular.isDefined(vm.stepTo)) {\n vm.stepTo({data: 1});\n }\n if (vm.modalInstance) {\n vm.modalInstance.close();\n vm.modalInstance = null;\n }\n vm.targetMsgContainer = 'lead-messages-text-input';\n };\n\n vm.switchToDirect = function () {\n vm.currentLead = null;\n vm.openInfo = false;\n if (angular.isDefined(vm.stepTo)) {\n vm.stepTo({data: 0});\n }\n if (vm.modalInstance) {\n vm.modalInstance.close();\n vm.modalInstance = null;\n }\n vm.targetMsgContainer = 'direct-messages-text-input';\n };\n\n vm.openModal = function () {\n vm.modalInstance = $uibModal.open({\n animation: true,\n appendTo: angular.element($document[0].body),\n templateUrl: 'user/messages/messages-list-modal.tpl.html',\n scope: $scope,\n size: 'lg',\n windowClass: 'from-center'\n });\n };\n\n vm.scrollTo = function (elementId) {\n var el = $document[0].getElementById(elementId);\n if (el) {\n smoothScroll(el, {\n callbackAfter: function () {\n if (el && el.focus) {\n el.focus();\n }\n }\n });\n }\n };\n\n vm.onMessagesLoad = function () {\n promises = [];\n vm.isLoadingMsg = false;\n };\n\n vm.onDirectMessagesLoad = function () {\n if (!vm.checkedScroll) {\n $rootScope.$broadcast('event:check-scroll-navigator', 'all');\n vm.checkedScroll = true;\n }\n };\n\n // Load leads\n vm.loadLeads();\n\n // Subscribe on events\n vm.watchHandle1 = $rootScope.$on('event:lead-sent', function () {\n vm.loadLeads();\n });\n vm.watchHandle2 = $rootScope.$on('event:lead-closed', function () {\n vm.loadLeads();\n });\n $scope.$on('$destroy', function () {\n vm.watchHandle1();\n vm.watchHandle2();\n });\n\n // Unfortunately we have to use the timeout here\n $timeout(function () {\n vm.stepTo = $scope.stepTo;\n }, 100);\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.marketplace\n * @description\n *\n */\n angular\n .module('user.marketplace', [\n 'ui.router',\n 'mlpMarketplace'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('user.marketplace')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.marketplace', angular.extend({}, configOptions.defaultStateParams, {\n url: '/marketplace',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'marketplace');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.marketplace.controller:UserMarketplaceCtrl\n *\n * @description\n *\n */\n UserMarketplaceCtrl.$inject = [\"$scope\", \"Marketplace\"];\n angular\n .module('user.marketplace')\n .controller('UserMarketplaceCtrl', UserMarketplaceCtrl);\n\n function UserMarketplaceCtrl($scope, Marketplace) {\n var vm = this;\n\n vm.userProfile = $scope.user.userProfile;\n vm.items = $scope.user.userProfile.marketplace;\n\n vm.openMarketplace = function () {\n Marketplace.open();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.leads\n * @description\n *\n */\n angular\n .module('user.leads', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.leads.controller:UserSentLeadsCtrl\n *\n * @description\n *\n */\n UserSentLeadsCtrl.$inject = [\"$scope\", \"DataTable\", \"Leads\"];\n angular\n .module('user.leads')\n .controller('UserSentLeadsCtrl', UserSentLeadsCtrl);\n\n function UserSentLeadsCtrl($scope, DataTable, Leads) {\n var vm = this;\n vm.userProfile = $scope.user.userProfile;\n vm.statuses = {\n all: 'All leads',\n open: 'Delivered',\n new: 'Notified',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'sent',\n idUser: vm.userProfile.id\n }\n });\n\n vm.openDetail = function ($index) {\n Leads.openDetail(vm.list.getRecords()[$index], 'sent', 'user-sent-leads-ctrl-container');\n };\n\n $scope.$on('sentLeads-success', function () {\n if (vm.list) {\n vm.list.reload();\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.leads.controller:UserReceivedLeadsCtrl\n *\n * @description\n *\n */\n UserReceivedLeadsCtrl.$inject = [\"$scope\", \"$state\", \"Session\", \"DataTable\", \"MyMemberships\", \"Leads\"];\n angular\n .module('user.leads')\n .controller('UserReceivedLeadsCtrl', UserReceivedLeadsCtrl);\n\n function UserReceivedLeadsCtrl($scope, $state, Session, DataTable, MyMemberships, Leads) {\n var vm = this;\n vm.userProfile = $scope.user.userProfile;\n vm.myProfile = null;\n vm.receiveLeads = $scope.user.agreementsDetails.receiveLeads;\n\n // Watch the property\n $scope.$watch('user.agreementsDetails.receiveLeads', function (receiveLeads) {\n vm.receiveLeads = receiveLeads;\n });\n\n Session.getUserProfile().then(function (profile) {\n vm.myProfile = profile;\n });\n\n vm.statuses = {\n all: 'All leads',\n open: 'Open',\n new: 'New',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'received',\n idUser: vm.userProfile.id\n }\n });\n\n vm.openDetail = function ($index) {\n var detailInstance = Leads.openDetail(vm.list.getRecords()[$index], 'received', 'user-received-leads-ctrl-container');\n if (angular.isDefined(detailInstance)) {\n detailInstance.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.lead)) {\n vm.list.getRecords()[$index] = result.lead;\n }\n });\n }\n };\n\n vm.closeLead = function ($index, status) {\n Leads.closeLead(vm.list.getRecords()[$index], status, 'user-received-leads-ctrl-container')\n .then(function () {\n vm.list.getRecords()[$index].status = status;\n });\n };\n\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(vm.myProfile, vm.userProfile);\n modalInstance.then(function (receiveLeads) {\n $scope.user.agreementsDetails.receiveLeads = receiveLeads;\n vm.receiveLeads = receiveLeads;\n });\n };\n\n $scope.$on('event:receive-leads-contract-accepted', function (event, data) {\n angular.forEach(vm.list.getRecords(), function (record) {\n if (record.sender.idUser === data.idUser) {\n record.acceptedReceiveLeadsContractExists = true;\n }\n });\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('user.leads')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.sentLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/sent-leads',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'sentLeads');\n }]\n }))\n .state('user.receivedLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/received-leads',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'receivedLeads');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.connections\n * @description\n *\n */\n angular\n .module('user.connections', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('user.connections')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.connections', angular.extend({}, configOptions.defaultStateParams, {\n url: '/connections',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'connections');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.connections.controller:ConnectionsCtrl\n *\n * @description\n *\n */\n ConnectionsCtrl.$inject = [\"$scope\", \"Notification\", \"MyPod\"];\n angular\n .module('user.connections')\n .controller('ConnectionsCtrl', ConnectionsCtrl);\n\n function ConnectionsCtrl($scope, Notification, MyPod) {\n var vm = this;\n\n vm.userProfile = $scope.user.userProfile;\n vm.searchName = '';\n vm.invitePendingFor = -1;\n vm.invitePending = false;\n vm.lastSearched = null;\n\n // use the data table initialised in the parent scope\n vm.list = $scope.user.connectionsList;\n\n // Search/Filter function for the search/filter form\n vm.search = function () {\n if (vm.searchName === vm.lastSearched) {\n return;\n }\n vm.lastSearched = vm.searchName;\n vm.list.reload({\n search: vm.searchName\n });\n };\n\n // Will directly join the other user's pod (using the default rewards program)\n vm.quickJoin = function ($index) {\n var user = vm.list.getRecords()[$index].member;\n\n // Let's start pending...\n vm.invitePendingFor = $index;\n vm.invitePending = true;\n\n MyPod.quickJoin(user.idUser).then(function () {\n user.acceptedSendLeadsContractExists = true;\n vm.invitePendingFor = -1;\n vm.invitePending = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function (err) {\n vm.invitePendingFor = -1;\n vm.invitePending = false;\n Notification({message: 'The registration was unsuccessful.'}, 'error');\n throw new Error(err);\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.agreements\n * @description\n *\n */\n angular\n .module('user.agreements', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('user.agreements')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.agreements', angular.extend({}, configOptions.defaultStateParams, {\n url: '/agreements',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'agreements');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.agreements.controller:AgreementsCtrl\n *\n * @description\n *\n */\n AgreementsCtrl.$inject = [\"$rootScope\", \"$scope\", \"$timeout\", \"$state\", \"Restangular\", \"$uibModal\", \"Notification\", \"MyMemberships\", \"MyPod\", \"Leads\", \"$document\", \"BusinessAccount\"];\n angular\n .module('user.agreements')\n .controller('AgreementsCtrl', AgreementsCtrl);\n\n function AgreementsCtrl($rootScope, $scope, $timeout, $state, Restangular, $uibModal,\n Notification, MyMemberships, MyPod, Leads, $document, BusinessAccount) {\n var vm = this,\n body;\n\n vm.userProfile = $scope.user.userProfile;\n vm.myProfile = $scope.user.myProfile;\n vm.receiveLeads = $scope.user.agreementsDetails.receiveLeads;\n vm.sendLeads = $scope.user.agreementsDetails.sendLeads;\n vm.isLoading = false;\n vm.trialData = null;\n\n // Watch the sendLeads property of the scope's parent 'user' property (in user controller) as the change in the user controller sendLeads is not propagated to the child controller.\n $scope.$watch('user.agreementsDetails.sendLeads', function (newSendLeads) {\n vm.sendLeads = newSendLeads;\n });\n\n // Watch the property\n $scope.$watch('user.agreementsDetails.receiveLeads', function (receiveLeads) {\n vm.receiveLeads = receiveLeads;\n });\n\n vm.data = {\n receiveLeads: {},\n sendLeads: {}\n };\n\n function getScrollingElement() {\n var d = $document[0];\n return d.documentElement.scrollHeight > d.body.scrollHeight && d.compatMode.indexOf('CSS1') === 0 ? d.documentElement : d.body;\n }\n\n function reviseAgreement(data) {\n data.idUser = vm.userProfile.id;\n vm.isLoading = true;\n Restangular.one('Contracts').customPUT(data, 'revise')\n .then(function (agreements) {\n vm.receiveLeads = agreements.receiveLeads;\n vm.sendLeads = agreements.sendLeads;\n $scope.user.agreementsDetails.receiveLeads = agreements.receiveLeads;\n $scope.user.agreementsDetails.sendLeads = agreements.sendLeads;\n $rootScope.$broadcast('event:user-agreements-updated');\n vm.isLoading = false;\n vm.data = {\n receiveLeads: {},\n sendLeads: {}\n };\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n });\n }\n\n function accept(contractPurpose) {\n var data = {\n idUser: vm.userProfile.id,\n contractPurpose: contractPurpose\n };\n vm.isLoading = true;\n Restangular.one('Contracts').customPUT(data, 'accept')\n .then(function (agreements) {\n vm.receiveLeads = agreements.receiveLeads;\n vm.sendLeads = agreements.sendLeads;\n $scope.user.agreementsDetails.receiveLeads = agreements.receiveLeads;\n $scope.user.agreementsDetails.sendLeads = agreements.sendLeads;\n $rootScope.$broadcast('event:user-agreements-updated');\n vm.isLoading = false;\n vm.data = {\n receiveLeads: {},\n sendLeads: {}\n };\n\n Notification({message: 'Success'}, 'confirmation');\n\n if (contractPurpose === 'receiveLeads') {\n $rootScope.$broadcast('event:receive-leads-contract-accepted', {\n idUser: vm.userProfile.id\n });\n }\n\n if (angular.isDefined(agreements.idLead) && angular.isNumber(agreements.idLead)) {\n $state.go('leadDetail', {id: agreements.idLead});\n }\n }, function () {\n vm.isLoading = false;\n });\n }\n\n function acceptAgreement(contractPurpose) {\n var modalInstance;\n if (contractPurpose === 'receiveLeads' && vm.receiveLeads.contractType === 'Subscription' && !vm.myProfile.isCCSet) {\n modalInstance = $uibModal.open({\n animation: false,\n templateUrl: 'account/billing/credit-card.tpl.html',\n controller: 'CreditCardCtrl',\n controllerAs: 'creditCard',\n size: 'lg',\n windowClass: 'modal-credit-card',\n resolve: {\n operation: function () {\n return 'add';\n }\n }\n });\n\n modalInstance.result.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.creditCard) && angular.isDefined(result.creditCard.number)) {\n accept(contractPurpose);\n }\n });\n }\n else {\n accept(contractPurpose);\n }\n }\n\n function scrollTo(btnId) {\n var btn;\n body = body || $document[0].scrollingElement || getScrollingElement();\n\n if (!btnId) {\n return;\n }\n\n btn = angular.element('#' + btnId);\n if (btn && btn.offset().top > $document[0].documentElement.clientHeight + body.scrollTop) {\n angular.element(body).animate({\n scrollTop: body.scrollTop + btn.offset().top + btn.outerHeight() + 10 - $document[0].documentElement.clientHeight\n }, 200);\n }\n }\n\n vm.reviseReceiveLeads = function () {\n var data = angular.extend({}, vm.data.receiveLeads, {\n contractPurpose: 'receiveLeads'\n });\n reviseAgreement(data);\n };\n\n vm.reviseSendLeads = function () {\n var data = angular.extend({}, vm.data.sendLeads, {\n contractPurpose: 'sendLeads'\n });\n reviseAgreement(data);\n };\n\n vm.acceptReceiveLeads = function () {\n acceptAgreement('receiveLeads');\n };\n\n vm.acceptSendLeads = function () {\n acceptAgreement('sendLeads');\n };\n\n vm.isBusinessAccountActive = function () {\n return angular.isDefined(vm.myProfile.isBusinessAccountActive) && vm.myProfile.isBusinessAccountActive === true;\n };\n\n vm.cancelReceiveLeadsRevision = function () {\n vm.receiveLeads.revise = false;\n vm.data.receiveLeads = {};\n };\n\n vm.cancelSendLeadsRevision = function () {\n vm.sendLeads.revise = false;\n vm.data.sendLeads = {};\n };\n\n vm.switchReviseSendLeadsContent = function () {\n vm.sendLeads.revise = !vm.sendLeads.revise;\n if (vm.sendLeads.revise) {\n $timeout(function () {\n scrollTo('reviseSendLeadsBtn');\n }, 200);\n }\n };\n\n vm.switchReviseReceiveLeadsContent = function () {\n vm.receiveLeads.revise = !vm.receiveLeads.revise;\n if (vm.receiveLeads.revise) {\n $timeout(function () {\n scrollTo('reviseReceiveLeadsBtn');\n }, 200);\n }\n };\n\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(vm.myProfile, vm.userProfile);\n modalInstance.then(function (receiveLeads) {\n $scope.user.agreementsDetails.receiveLeads = receiveLeads;\n vm.receiveLeads = receiveLeads;\n });\n };\n\n vm.openSendInvite = function () {\n var modalInstance = MyPod.openSendInvite(vm.myProfile, vm.userProfile);\n modalInstance.then(function (sendLeads) {\n vm.sendLeads = sendLeads;\n });\n };\n\n vm.onRewardSelectionChangeReceiveLeads = function (data, isFormValid) {\n _.extend(vm.data.receiveLeads, data);\n vm.isReceiveLeadsRewardsFormValid = isFormValid;\n };\n\n vm.onRewardSelectionChangeSendLeads = function (data, isFormValid) {\n _.extend(vm.data.sendLeads, data);\n vm.isSendLeadsRewardsFormValid = isFormValid;\n };\n\n // Will directly join the other user's pod (using the default rewards program)\n vm.quickJoin = function () {\n // Let's start pending...\n vm.invitePending = true;\n\n MyPod.quickJoin(vm.userProfile.idUser).then(function (response) {\n vm.sendLeads = response.sendLeads;\n $scope.user.agreementsDetails.sendLeads = response.sendLeads;\n $rootScope.$broadcast('event:user-agreements-updated');\n vm.invitePending = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function (err) {\n vm.invitePending = false;\n Notification({message: 'Joining the Rewards Program was unsuccessful.' + (err.data && err.data.errorMessage ? '
    ' + err.data.errorMessage : '')}, 'error');\n throw new Error(err);\n });\n };\n\n vm.activateBusinessAccount = function () {\n BusinessAccount.initiateActivation($document[0].body, vm.trialData.isEligibleForTrial);\n };\n\n // Send Lead\n vm.sendLead = function () {\n Leads.openSendLead(vm.userProfile, false);\n };\n\n //\n if (!vm.isBusinessAccountActive()) {\n vm.trialData = BusinessAccount.getTrialData(vm.myProfile);\n }\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name user.agreements.directive:agreementPricingDetail\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('user.agreements')\n .directive('agreementPricingDetail', agreementPricingDetail);\n\n function agreementPricingDetail() {\n return {\n restrict: 'EA',\n scope: {\n agreement: '=',\n label: '='\n },\n templateUrl: 'user/agreements/agreement-pricing-detail-directive.tpl.html',\n replace: false,\n controllerAs: 'agreementPricingDetail',\n controller: [\"$scope\", function ($scope) {\n var vm = this;\n vm.agreement = $scope.agreement;\n vm.label = $scope.label;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n /* @ngdoc object\n * @name socialShare.providers\n * @description\n *\n */\n angular\n .module('socialShare.providers', [\n 'angularLoad'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:TwitterSocialShare\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('TwitterSocialShare', TwitterSocialShare);\n\n function TwitterSocialShare() {\n var config = {\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', function ($q, $window) {\n var $twitter = $q.defer();\n\n $twitter.init = function (newConfig) {\n setConfig(newConfig);\n $twitter.resolve(true);\n };\n\n $twitter.share = function (data) {\n var url = '//twitter.com/share?url=' + encodeURIComponent(data.url),\n text = '';\n\n text += data.name;\n\n if (data.description) {\n text += ' - ' + data.description;\n }\n\n url += '&text=' + encodeURIComponent(text);\n\n if (data.source) {\n url += '&via=' + encodeURI(data.source);\n }\n\n if (data.hashTags) {\n url += '&hashtags=' + encodeURI(data.hashTags);\n }\n\n $window.open(url\n , 'sharer', 'toolbar=0,status=0,width=' + config.popupWidth + ',height=' + config.popupHeight);\n };\n\n return $twitter;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:LinkedinSocialShare\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('LinkedinSocialShare', LinkedinSocialShare);\n\n function LinkedinSocialShare() {\n var config = {\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', function ($q, $window) {\n var $linkedin = $q.defer();\n\n $linkedin.init = function (newConfig) {\n setConfig(newConfig);\n $linkedin.resolve(true);\n };\n\n $linkedin.share = function (data) {\n var url = '//www.linkedin.com/shareArticle?mini=true&url=' + encodeURIComponent(data.url);\n\n if (data.name) {\n url += '&title=' + encodeURI(data.name);\n }\n\n if (data.description) {\n url += '&summary=' + encodeURI(data.description);\n }\n\n if (data.source) {\n url += '&source=' + encodeURI(data.source);\n }\n $window.open(url\n , 'sharer', 'toolbar=0,status=0,width=' + config.popupWidth + ',height=' + config.popupHeight);\n };\n\n return $linkedin;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:GooglePlusSocialShare\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('GooglePlusSocialShare', GooglePlusSocialShare);\n\n function GooglePlusSocialShare() {\n var config = {\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', function ($q, $window) {\n var $googlePlus = $q.defer();\n\n $googlePlus.init = function (newConfig) {\n setConfig(newConfig);\n $googlePlus.resolve(true);\n };\n\n $googlePlus.share = function (data) {\n $window.open(\n '//plus.google.com/share?' +\n 'url=' + encodeURIComponent(data.url)\n , 'sharer', 'toolbar=0,status=0,width=' + config.popupWidth + ',height=' + config.popupHeight);\n };\n\n return $googlePlus;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:Facebook\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('FacebookSocialShare', FacebookSocialShare);\n\n function FacebookSocialShare() {\n var config = {\n appId: null,\n version: 'v2.3',\n xfbml: true,\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', '$rootScope', 'angularLoad', function ($q, $window, $rootScope, angularLoad) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var $facebook = $q.defer(),\n fbInitHandler;\n\n $facebook.init = function (newConfig) {\n setConfig(newConfig);\n\n if (angular.isUndefined(config.appId) || config.appId === null) {\n throw new Error('Missing APP ID');\n }\n\n if (!$window.FB) {\n angularLoad.loadScript('//connect.facebook.net/en_US/sdk.js')\n .then(function () {\n $window.FB.init({\n appId: config.appId,\n version: config.version,\n xfbml: config.xfbml\n });\n $rootScope.$broadcast('fb.init');\n });\n }\n };\n\n fbInitHandler = $rootScope.$on('fb.init', function () {\n $facebook.resolve(true);\n });\n\n $facebook.share = function (data) {\n var params = {\n method: 'feed',\n link: data.url\n };\n if (data.title) {\n params.caption = data.title;\n }\n\n if (data.name) {\n params.name = data.name;\n }\n\n if (data.description) {\n params.description = data.description;\n }\n\n if (data.picture) {\n params.picture = data.picture;\n }\n\n $window.FB.ui(params);\n };\n\n return $facebook;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod.sentLeads\n * @description\n *\n */\n angular\n .module('myPod.sentLeads', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('myPod.sentLeads')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myPod.sentLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/sent-leads',\n templateUrl: 'my-pod/my-pod.tpl.html',\n controller: 'MyPodCtrl',\n controllerAs: 'myPod',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myPod', 'sentLeads');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.sentLeads.controller:SentLeadsCtrl\n *\n * @description\n *\n */\n SentLeadsCtrl.$inject = [\"DataTable\", \"Leads\"];\n angular\n .module('myPod.sentLeads')\n .controller('SentLeadsCtrl', SentLeadsCtrl);\n\n function SentLeadsCtrl(DataTable, Leads) {\n var vm = this,\n filter;\n vm.statuses = {\n all: 'All leads',\n open: 'Delivered',\n new: 'Notified',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.searchLead = '';\n vm.selectedStatus = 'all';\n vm.selectedStatusLabel = 'All leads';\n vm.lastSearched = null;\n\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'sent'\n }\n });\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n search: vm.searchLead\n });\n };\n\n vm.selectStatus = function (leadStatus) {\n vm.selectedStatus = leadStatus;\n vm.selectedStatusLabel = vm.statuses[leadStatus];\n filter();\n };\n\n vm.search = function () {\n if (vm.selectedStatus + vm.searchLead === vm.lastSearched) {\n return;\n }\n filter();\n vm.lastSearched = vm.selectedStatus + vm.searchLead;\n };\n\n vm.openDetail = function ($index) {\n Leads.openDetail(vm.list.getRecords()[$index], 'sent', 'sent-leads-ctrl-container');\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod.sendInvite\n * @description\n *\n */\n angular\n .module('myPod.sendInvite', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('myPod.sendInvite')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myPodSendInvite', {\n url: '/my-pod/send-invite',\n template: '',\n controller: 'SendInviteCtrl',\n controllerAs: 'sendInvite',\n authenticate: true,\n params: {\n user: null\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.sendInvite.controller:SendInviteModalCtrl\n *\n * @description\n *\n */\n SendInviteModalCtrl.$inject = [\"$state\", \"$timeout\", \"Restangular\", \"Notification\", \"FormAlerts\", \"$uibModalInstance\", \"userProfile\"];\n angular\n .module('myPod.sendInvite')\n .controller('SendInviteModalCtrl', SendInviteModalCtrl);\n\n function SendInviteModalCtrl($state, $timeout, Restangular, Notification, FormAlerts, $uibModalInstance, userProfile) {\n var vm = this;\n vm.isLoading = false;\n vm.isLoadingUserData = false;\n vm.searchControlName = 'sendInviteSearchControl';\n vm.data = {\n firstName: null,\n email: null,\n phoneMobile: null\n };\n vm.alerts = new FormAlerts();\n vm.displayContactDetails = false;\n vm.hasRewardCode = true;\n vm.isRewardCodeValid = false;\n vm.isRewardCodeInvalid = false;\n vm.targetUser = userProfile;\n vm.emptyResults = false;\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n if (angular.isDefined(userProfile) && angular.isObject(userProfile)) {\n vm.data.firstName = userProfile.firstName;\n vm.data.email = userProfile.email;\n vm.data.phoneMobile = userProfile.phoneMobile;\n }\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.send = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n\n Restangular.one('Members').post('index', vm.data)\n .then(function (response) {\n vm.isLoading = false;\n $uibModalInstance.close(response.sendLeads);\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to send');\n $uibModalInstance.dismiss();\n });\n };\n\n vm.checkRewardCode = function () {\n if (vm.isRewardCodeValid) {\n vm.rewardCode = null;\n vm.isRewardCodeInvalid = false;\n vm.isRewardCodeValid = false;\n }\n else {\n vm.rewardCode = vm.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.isCheckingCode = true;\n Restangular.one('RewardCodes').one('validate').get({rewardCode: vm.rewardCode})\n .then(function (result) {\n vm.isRewardCodeInvalid = !result.valid;\n vm.isRewardCodeValid = result.valid;\n Restangular.one('RewardCodes').post('activate', {\n rewardCode: vm.rewardCode\n })\n .then(function (activationResult) {\n if (angular.isObject(activationResult) && angular.isDefined(activationResult.idUser) && activationResult.idUser > 0) {\n $uibModalInstance.close({isRedirecting: true});\n Notification({message: 'Success'}, 'confirmation');\n $state.go('user.agreements', {id: activationResult.idUser});\n }\n else {\n vm.isLoading = false;\n vm.isRewardCodeInvalid = true;\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n }\n }, function () {\n vm.isLoading = false;\n vm.isRewardCodeInvalid = true;\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n });\n }, function () {\n vm.isRewardCodeInvalid = true;\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n });\n }\n };\n\n vm.onRewardCodeEnter = function ($event) {\n if ($event.key === 'Enter') {\n $event.stopImmediatePropagation();\n vm.checkRewardCode();\n }\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n vm.userInvitedProfile = null;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item) {\n return;\n }\n vm.displayContactDetails = true;\n vm.isLoadingUserData = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n profile = profile.plain();\n vm.data.phoneMobile = profile.phoneMobile;\n vm.data.firstName = profile.firstName;\n vm.data.email = profile.email;\n vm.userInvitedProfile = profile;\n vm.isLoadingUserData = false;\n });\n };\n\n vm.clearContactData = function (focus) {\n vm.displayContactDetails = false;\n vm.data.email = null;\n vm.data.phoneMobile = null;\n vm.data.firstName = null;\n if (focus) {\n $timeout(function () {\n angular.element('[name=\\'' + vm.searchControlName + '\\']').focus();\n }, 200);\n }\n };\n\n vm.checkContactData = function () {\n if (vm.displayContactDetails === true) {\n return vm.data.email && vm.data.firstName;\n }\n\n return true;\n };\n\n vm.openSearch = function () {\n vm.onlySearch = true;\n vm.onlyRewards = false;\n\n $timeout(function () {\n angular.element('[name=\\'' + vm.searchControlName + '\\']').focus();\n }, 200);\n };\n\n vm.focusIn = function () {\n vm.hasRewardCode = false;\n vm.onlyRewards = false;\n vm.onlySearch = true;\n };\n\n vm.openRewardCode = function () {\n vm.hasRewardCode = true;\n vm.clearContactData(false);\n $timeout(function () {\n angular.element('#rewardCode').focus();\n }, 200);\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.sendInvite.controller:SendInviteCtrl\n *\n * @description\n *\n */\n SendInviteCtrl.$inject = [\"$state\", \"$stateParams\", \"MyPod\"];\n angular\n .module('myPod.sendInvite')\n .controller('SendInviteCtrl', SendInviteCtrl);\n\n function SendInviteCtrl($state, $stateParams, MyPod) {\n MyPod.openSendInvite().then(function (result) {\n if (result && !result.isRedirecting) {\n $state.go('myPod');\n }\n },\n function () {\n // When this is an error or just simply closed, redirect to my-pod.\n $state.go('myPod');\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod.members\n * @description\n *\n */\n angular\n .module('myPod.members', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('myPod.members')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myPod.members', angular.extend({}, configOptions.defaultStateParams, {\n url: '/members',\n templateUrl: 'my-pod/my-pod.tpl.html',\n controller: 'MyPodCtrl',\n controllerAs: 'myPod',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myPod', 'members');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.members.controller:MembersCtrl\n *\n * @description\n *\n */\n MembersCtrl.$inject = [\"DataTable\"];\n angular\n .module('myPod.members')\n .controller('MembersCtrl', MembersCtrl);\n\n function MembersCtrl(DataTable) {\n var vm = this,\n filter;\n vm.statuses = {\n active: 'Active',\n past: 'Past',\n pending: 'Pending invites'\n };\n vm.searchName = '';\n vm.selectedStatus = 'active';\n vm.selectedStatusLabel = 'Active';\n vm.lastSearched = null;\n\n vm.list = DataTable.create('Members', 'index', {\n status: 'active'\n }, {\n basicParams: {}\n });\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n search: vm.searchName\n });\n };\n\n vm.selectStatus = function (status) {\n vm.selectedStatus = status;\n vm.selectedStatusLabel = vm.statuses[status];\n filter();\n };\n\n vm.search = function () {\n if (vm.lastSearched === vm.selectedStatus + vm.searchName) {\n return;\n }\n filter();\n vm.lastSearched = vm.selectedStatus + vm.searchName;\n };\n\n vm.list.isReady.then(function () {\n if (vm.list.recordsExist() && vm.list.getRecords() < 1) {\n vm.selectStatus('past');\n }\n else if (!vm.list.recordsExist()) {\n vm.selectStatus('pending');\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.sendReward\n * @description\n *\n */\n angular\n .module('myMemberships.sendReward', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('myMemberships.sendReward')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myMembershipsSendReward', {\n url: '/my-memberships/send-reward',\n templateUrl: 'my-memberships/send-reward/send-reward.tpl.html',\n controller: 'SendRewardCtrl',\n controllerAs: 'sendReward',\n authenticate: true,\n resolve: {\n creditCard: ['Restangular', function (Restangular) {\n return Restangular.one('Billing').one('creditCard').get()\n .then(function (creditCard) {\n if (!creditCard.number || !creditCard.expiryMonth || !creditCard.expiryYear) {\n return null;\n }\n return creditCard.plain();\n }, function () {\n return null;\n });\n }],\n membershipsSubIndustries: ['Restangular', function (Restangular) {\n return Restangular.one('Industries').getList('getMembershipsSubIndustries')\n .then(function (result) {\n var subIndustries = [];\n angular.forEach(result, function (value) {\n subIndustries.push(value);\n });\n return subIndustries;\n });\n }]\n },\n params: {\n user: null\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.sendReward.controller:SendRewardCtrl\n *\n * @description\n *\n */\n SendRewardCtrl.$inject = [\"$state\", \"$stateParams\", \"Restangular\", \"Notification\", \"DataTable\", \"FormAlerts\", \"creditCard\", \"Industries\", \"membershipsSubIndustries\"];\n angular\n .module('myMemberships.sendReward')\n .controller('SendRewardCtrl', SendRewardCtrl);\n\n function SendRewardCtrl($state, $stateParams, Restangular, Notification, DataTable, FormAlerts, creditCard,\n Industries, membershipsSubIndustries) {\n var vm = this,\n filter;\n\n vm.isLoading = false;\n vm.alerts = new FormAlerts();\n vm.processingFee = 0;\n vm.total = 0;\n vm.tax = 0;\n vm.showTotal = false;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.list = DataTable.create('Memberships', 'index');\n vm.selectedRecipient = null;\n vm.searchName = '';\n vm.idIndustry = '';\n vm.creditCard = creditCard;\n\n if (angular.isDefined($stateParams.user) && angular.isObject($stateParams.user)) {\n vm.selectedRecipient = $stateParams.user;\n }\n\n vm.data = {\n paymentDetails: {\n method: angular.isObject(creditCard) && angular.isDefined(creditCard.number) ? null : 'new'\n },\n idUserRecipient: 0,\n message: 'Thank you for your leads!'\n };\n Industries.isReady.then(function () {\n vm.industries = Industries.getConsolidatedFilteredList(membershipsSubIndustries);\n });\n\n filter = function () {\n var idIndustry = parseInt(vm.idIndustry, 10);\n if (idIndustry <= 0 || isNaN(idIndustry)) {\n idIndustry = 0;\n }\n\n vm.list.reload({\n search: vm.searchName,\n idIndustry: idIndustry\n });\n };\n\n vm.search = function ($event) {\n $event.stopImmediatePropagation();\n filter();\n };\n\n vm.filterByIndustry = function () {\n filter();\n };\n\n vm.cancel = function () {\n $state.go('myMemberships.memberships');\n };\n\n vm.selectRecipient = function ($index) {\n vm.selectedRecipient = vm.list.getRecords()[$index].owner;\n };\n\n vm.deselectRecipient = function () {\n vm.selectedRecipient = null;\n };\n\n vm.isUserSelected = function ($index) {\n var user = vm.list.getRecords()[$index].owner;\n return angular.isObject(vm.selectedRecipient) && vm.selectedRecipient.id === user.id;\n };\n\n vm.send = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Restangular.one('Earnings').post('sendReward', angular.extend({}, vm.data, {\n idUserRecipient: vm.selectedRecipient.id\n }))\n .then(function () {\n $state.go('myMemberships.memberships');\n Notification({message: 'Success'}, 'confirmation');\n }, function (responseData) {\n vm.isLoading = false;\n if (responseData.data.errorCode === 701 || responseData.data.errorCode === 702 || responseData.data.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to send: ' + responseData.data.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to send, try again later please');\n }\n });\n };\n\n vm.onRewardChange = function () {\n vm.showTotal = false;\n vm.calculationRequired = true;\n };\n\n vm.calculateTotal = function () {\n if (vm.data.reward > 0) {\n vm.calculating = true;\n Restangular.one('Earnings').one('calculateRewardTotal').get({\n reward: vm.data.reward\n })\n .then(function (result) {\n vm.processingFee = result.fees;\n vm.total = result.total;\n vm.tax = result.tax;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.showTotal = true;\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.rewardProgram\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram', [\n 'ui.router',\n 'ngclipboard'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:WelcomeModalCtrl\n *\n * @description\n *\n */\n WelcomeModalCtrl.$inject = [\"$window\", \"$scope\", \"$uibModalInstance\"];\n angular\n .module('myMemberships.rewardProgram')\n .controller('WelcomeModalCtrl', WelcomeModalCtrl);\n\n function WelcomeModalCtrl($window, $scope, $uibModalInstance) {\n var vm = this;\n\n // Listen to the broadcast of 'close-modal-instance';\n $scope.$on('close-modal-instance', function () {\n $uibModalInstance.dismiss();\n });\n\n vm.close = function () {\n $uibModalInstance.close();\n };\n\n vm.openLink = function (linkUrl) {\n $window.open(linkUrl, '_blank');\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardProgramsSetupCtrl\n *\n * @description\n *\n */\n RewardProgramsSetupCtrl.$inject = [\"$scope\", \"$timeout\", \"$filter\", \"Notification\", \"$state\", \"FormAlerts\", \"defaultOptions\", \"RewardCodes\"];\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardProgramsSetupCtrl', RewardProgramsSetupCtrl);\n\n function RewardProgramsSetupCtrl($scope, $timeout, $filter, Notification, $state, FormAlerts, defaultOptions, RewardCodes) {\n var vm = this;\n\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.rewardProgramHelp = 'This is where you can configure different cash rewards for different products and/or services you can link to your Reward Codes. Examples: Book Keeping $100, Tax Return $200, Financial Planning $300';\n\n vm.data = {\n options: []\n };\n\n function getIdForOption() {\n var d = new Date();\n return d.getTime();\n }\n\n function initData() {\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n }\n\n if ($state.params.openInvite) {\n RewardCodes.openWelcome();\n }\n\n // Subscribe to the update of the user profile.\n $scope.$on('event:user-updateLocalProfile', function () {\n // We cannot use state.reload as that would possibly open a WelcomeScreen again.\n $state.transitionTo('myMembershipsRewardProgramsSetup', {\n openInvite: false\n });\n });\n\n // Render reward program option\n vm.renderRewardProgramOptions = function (options) {\n if (options && options.length > 0) {\n angular.forEach(options, function (option) {\n var uiId = getIdForOption() * Math.random();\n vm.data.options.push(angular.extend({}, option, {\n uiId: uiId.toString().replace('.', '')\n }));\n });\n vm.data.options = $filter('orderBy')(vm.data.options, 'successfulLeadPrice');\n }\n else {\n initData();\n }\n };\n vm.renderRewardProgramOptions(defaultOptions);\n\n vm.addOption = function () {\n var optionId,\n idx,\n input;\n\n optionId = getIdForOption();\n\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n\n idx = vm.data.options.length - 1;\n\n $timeout(function () {\n // There might be two different inputs available. First try the desktop one. If visible, just focus it.\n input = angular.element('#name' + optionId + ':visible');\n if (input.length === 0) {\n // This must be the input hidden inside the panel (xs,sm devices)\n input = angular.element('#name2' + optionId);\n vm.tableSubContentVisible = {};\n vm.tableSubContentVisible[idx] = true;\n\n if (input.length === 1) {\n input.closest('.table-cell-sub-content-container').css('display', 'block');\n input[0].focus();\n }\n }\n else {\n input[0].focus();\n }\n }, 200);\n };\n\n vm.deleteOption = function ($index, form) {\n // This is to fix the shifting index in the xs,sm devices that keeps opening incorrect panels\n vm.tableSubContentVisible = {};\n // Remove the option from the data\n vm.data.options.splice($index, 1);\n\n if (form) {\n form.$setDirty();\n }\n };\n\n vm.save = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n RewardCodes.saveDefaultRewardOptions(vm.data.options)\n .then(function () {\n RewardCodes.updateRewardProgramsAndCodes(true, function () {\n vm.isLoading = false;\n Notification({message: 'Success'}, 'confirmation');\n });\n }, function (errorCode) {\n if (errorCode === 609) {\n vm.alerts.add('danger', 'Unable to save: Rewards program is still being updated, please try again later.');\n }\n else {\n vm.alerts.add('danger', 'Unable to save');\n }\n vm.isLoading = false;\n });\n };\n\n vm.toggleSubContent = function (idx) {\n if (!vm.tableSubContentVisible) {\n vm.tableSubContentVisible = {};\n vm.tableSubContentVisible[idx] = true;\n }\n else if (_.contains(_.keys(vm.tableSubContentVisible), idx.toString())) {\n // Check if the incoming idx is already added, Just toggle it.\n vm.tableSubContentVisible[idx] = !vm.tableSubContentVisible[idx];\n }\n else {\n // Delete everything and set as new\n vm.tableSubContentVisible = {};\n vm.tableSubContentVisible[idx] = true;\n }\n };\n\n vm.openWelcomeScreen = function () {\n RewardCodes.openWelcome();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('myMemberships.rewardProgram')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.rewardPrograms', angular.extend({}, configOptions.defaultStateParams, {\n url: '/reward-programs',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'rewardPrograms');\n }]\n }))\n .state('myMembershipsRewardProgramsSetup', angular.extend({}, configOptions.defaultStateParams, {\n url: '/my-memberships/reward-programs/setup',\n templateUrl: 'my-memberships/reward-program/setup.tpl.html',\n controller: 'RewardProgramsSetupCtrl',\n controllerAs: 'rewardProgramsSetup',\n params: {\n openInvite: {\n value: false,\n dynamic: true\n }\n },\n resolve: {\n defaultOptions: ['Session', function (Session) {\n return Session.getUserProfile().then(function (user) {\n return user.defaultRewardProgram;\n });\n }]\n }\n }))\n .state('myMembershipsRewardProgramCode', {\n url: '/reward-program/join/{code}',\n resolve: {\n rewardCode: ['$state', '$stateParams', 'Restangular', 'Notification', 'Auth', function ($state, $stateParams, Restangular, Notification, Auth) {\n Restangular.one('RewardCodes').one('viewsCounter').get({rewardCode: $stateParams.code});\n Auth.isAuthenticated()\n .then(function (isAuthenticated) {\n if (isAuthenticated) {\n Restangular.one('RewardCodes').post('activate', {\n rewardCode: $stateParams.code\n })\n .then(function (result) {\n if (angular.isObject(result) && angular.isDefined(result.idUser) && result.idUser > 0) {\n Notification({message: 'You are now joined with this business!'}, 'success');\n $state.go('user.agreements', {id: result.idUser});\n }\n else {\n Notification({message: 'The Reward Code does not exist or is no longer valid.'}, 'warning');\n $state.go('dashboard');\n }\n }, function () {\n $state.go('dashboard');\n });\n }\n else {\n $state.go('accountSignInUp.accountSignUp', {rewardCode: $stateParams.code});\n }\n }, function () {\n $state.go('accountSignInUp.accountSignUp', {rewardCode: $stateParams.code});\n });\n }]\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardProgramCtrl\n *\n * @description\n *\n */\n RewardProgramCtrl.$inject = [\"$interpolate\", \"DataTable\", \"RewardCodes\", \"configOptions\", \"SocialShare\", \"BitlyUrlShortener\"];\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardProgramCtrl', RewardProgramCtrl);\n\n function RewardProgramCtrl($interpolate, DataTable, RewardCodes, configOptions, SocialShare, BitlyUrlShortener) {\n var vm = this,\n filter;\n\n vm.selectedStatus = 'active';\n vm.selectedStatusLabel = 'Active';\n vm.rewardCodeHelp = 'In this screen you can set up new Reward Codes and apply the Reward Program payouts, or alternatively select \\'Customise Rewards\\' to set up a totally new cash reward offering';\n vm.urlToShare = null;\n vm.emailBody = null;\n\n vm.statuses = {\n active: 'Active',\n archived: 'Archived',\n all: 'All'\n };\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n limit: 15\n });\n };\n\n vm.selectStatus = function (status, forceReload) {\n if (status !== vm.selectedStatus || forceReload === true) {\n vm.selectedStatus = status;\n vm.selectedStatusLabel = vm.statuses[status];\n filter();\n }\n };\n\n vm.list = DataTable.create('RewardCodes', 'index', {\n status: vm.selectedStatus,\n limit: 15\n }, {\n basicParams: {}\n });\n\n vm.openDetail = function ($index) {\n RewardCodes.openDetail(vm.list.getRecords()[$index])\n .then(function (result) {\n if (angular.isObject(result) && angular.isDefined(result.updatedRecord) && angular.isObject(result.updatedRecord)) {\n if (vm.selectedStatus === 'active' && result.updatedRecord.isArchived) {\n vm.list.getRecords().splice($index, 1);\n }\n else {\n angular.extend(vm.list.getRecords()[$index], result.updatedRecord);\n }\n }\n });\n };\n\n vm.openCreateCodeModal = function () {\n var result = RewardCodes.openRewardCreateModal();\n\n // The following will run only if the modal instance is closed (not dismissed).\n result.then(function (response) {\n var newSelectedStatus = vm.selectedStatus;\n if (angular.isDefined(response) && response === 'success') {\n if (vm.selectedStatus === 'archived') {\n newSelectedStatus = 'active';\n }\n vm.selectStatus(newSelectedStatus, true);\n }\n });\n };\n\n vm.list.isReady.then(function () {\n if (vm.list.recordsExist() && vm.list.getRecords() < 1) {\n vm.selectStatus('archived');\n }\n });\n\n vm.setUrl = function (rewardCode) {\n vm.isLoadingLink = true;\n BitlyUrlShortener.shorten(RewardCodes.getRewardCodeUrl(rewardCode))\n .then(function (result) {\n var exp = $interpolate(configOptions.defaultEmailMessage);\n vm.urlToShare = result;\n vm.emailBody = encodeURIComponent(exp({link: vm.urlToShare}));\n vm.isLoadingLink = false;\n });\n };\n\n vm.share = function (socialService) {\n SocialShare.share(socialService, {\n url: vm.urlToShare,\n name: configOptions.defaultShareName,\n description: configOptions.defaultShareMessage,\n source: 'MyLeadPod',\n picture: configOptions.appUrl + '/images/touch-icon-192x192.png'\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name myMemberships.rewardProgram.service:RewardCodes\n *\n * @description\n *\n */\n RewardCodes.$inject = [\"$document\", \"$q\", \"$state\", \"$uibModal\", \"Session\", \"Restangular\", \"configOptions\", \"$httpParamSerializer\"];\n angular\n .module('myMemberships.rewardProgram')\n .service('RewardCodes', RewardCodes);\n\n function RewardCodes($document, $q, $state, $uibModal, Session, Restangular, configOptions, $httpParamSerializer) {\n var self = this;\n\n self.openDetail = function (rewardCode, parentElementId) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'my-memberships/reward-program/reward-code-detail.tpl.html',\n controller: 'RewardCodeDetailCtrl',\n controllerAs: 'rewardCodeDetail',\n size: 'md',\n resolve: {\n rewardCode: function () {\n return rewardCode;\n }\n }\n };\n if (angular.isDefined(parentElementId) && !!parentElementId) {\n params.appendTo = angular.element($document[0].getElementById(parentElementId));\n }\n modalInstance = $uibModal.open(params);\n\n return modalInstance.result;\n };\n\n self.openWelcome = function () {\n var params = {\n animation: true,\n templateUrl: 'my-memberships/reward-program/welcome-modal-template.tpl.html',\n controller: 'WelcomeModalCtrl',\n controllerAs: 'welcome',\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n };\n $uibModal.open(params);\n };\n\n self.openEmbed = function (rewardCode, parentElementId) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'my-memberships/reward-program/reward-code-embed.tpl.html',\n controller: 'RewardCodeEmbedCtrl',\n controllerAs: 'rewardCodeEmbed',\n size: 'lg',\n resolve: {\n rewardCode: function () {\n return rewardCode;\n }\n }\n };\n if (angular.isDefined(parentElementId) && !!parentElementId) {\n params.appendTo = angular.element($document[0].getElementById(parentElementId));\n }\n modalInstance = $uibModal.open(params);\n\n return modalInstance.result;\n };\n\n self.create = function (rewardCode, rewardType, options, description, userShareEmail, associatedUserIds) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').post('index', {\n rewardCode: rewardCode,\n rewardType: rewardType,\n options: options,\n description: description,\n userShareEmail: userShareEmail,\n associatedUsers: associatedUserIds\n })\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.update = function (idRewardCode, data) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').customPUT(data, 'index?id=' + idRewardCode)\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.getRewardCodeUrl = function (rewardCode) {\n return $state.href('myMembershipsRewardProgramCode', {code: rewardCode}, {absolute: true});\n };\n\n self.isRewardCodeUnique = function (rewardCode) {\n return Restangular.one('RewardCodes').one('unique').get({rewardCode: rewardCode})\n .then(function (result) {\n return result.unique;\n }, function () {\n return false;\n });\n };\n\n self.isUserShareEmailValid = function (userShareEmail) {\n return Restangular.one('RewardCodes').one('checkUserShareEmail').get({email: userShareEmail})\n .then(function (result) {\n return result.isValid;\n }, function () {\n return false;\n });\n };\n\n self.getDefaultRewardOptions = function () {\n return Restangular.one('RewardCodes').getList('pricingOptionsTemplate')\n .then(function (result) {\n var options = [];\n angular.forEach(result, function (value) {\n options.push(value.plain());\n });\n return options;\n }, function () {\n return [];\n });\n };\n\n self.getRewardCodes = function () {\n return Restangular.one('RewardCodes').getList('index?' + $httpParamSerializer({\n limit: -1,\n orderby: 'rewardCode'\n })).then(function (result) {\n var options = [];\n angular.forEach(result, function (value) {\n options.push(value.plain());\n });\n return options;\n });\n };\n\n self.saveDefaultRewardOptions = function (options) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').customPUT({\n options: options\n }, 'pricingOptionsTemplate')\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.getRegistrationFormCode = function (rewardCode) {\n return '';\n };\n\n self.openRewardCreateModal = function () {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'my-memberships/reward-program/reward-code-create-modal.tpl.html',\n controller: 'RewardCodeCreateCtrl',\n controllerAs: 'rewardProgram',\n size: 'md'\n });\n\n return modalInstance.result;\n };\n\n self.archive = function (idRewardCode) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').customPUT({}, 'archive?id=' + idRewardCode)\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.updateRewardProgramsAndCodes = function (broadcast, callback) {\n var programDeferred = $q.defer(),\n codesDeferred = $q.defer();\n\n // Get the default reward program\n self.getDefaultRewardOptions().then(function (response) {\n programDeferred.resolve(response);\n });\n\n // Get the reward codes.\n self.getRewardCodes().then(function (response) {\n codesDeferred.resolve(response);\n });\n\n $q.all({program: programDeferred.promise, codes: codesDeferred.promise})\n .then(function (result) {\n Session.updateLocalUserProfile({\n defaultRewardProgram: result.program,\n rewardCodes: result.codes\n }, broadcast);\n if (angular.isDefined(callback) && angular.isFunction(callback)) {\n callback.apply();\n }\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardCodeEmbedCtrl\n *\n * @description\n *\n */\n RewardCodeEmbedCtrl.$inject = [\"$sce\", \"$uibModalInstance\", \"RewardCodes\", \"rewardCode\"];\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardCodeEmbedCtrl', RewardCodeEmbedCtrl);\n\n function RewardCodeEmbedCtrl($sce, $uibModalInstance, RewardCodes, rewardCode) {\n var vm = this;\n vm.embedCode = $sce.trustAsHtml(RewardCodes.getRegistrationFormCode(rewardCode.rewardCode));\n vm.previewVisible = false;\n\n vm.close = function () {\n $uibModalInstance.close();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardCodeDetailCtrl\n *\n * @description\n *\n */\n RewardCodeDetailCtrl.$inject = [\"$timeout\", \"$interpolate\", \"$uibModalInstance\", \"SocialShare\", \"BitlyUrlShortener\", \"Restangular\", \"Notification\", \"configOptions\", \"RewardCodes\", \"rewardCode\"];\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardCodeDetailCtrl', RewardCodeDetailCtrl);\n\n function RewardCodeDetailCtrl($timeout, $interpolate, $uibModalInstance, SocialShare, BitlyUrlShortener, Restangular, Notification, configOptions, RewardCodes, rewardCode) {\n var vm = this;\n vm.rewardCode = _.clone(rewardCode);\n // vm.rewardCode.originalUserShare = rewardCode.userShare;\n vm.rewardCode.originalDescription = rewardCode.description;\n vm.data = {\n description: vm.rewardCode.description,\n userShareEmail: ''\n };\n\n // Associated Users\n vm.associatedUsers = vm.rewardCode.associatedUsers || [];\n vm.associatedUsersClone = _.clone(rewardCode.associatedUsers || []);\n\n vm.userShareEmailHelp = 'Type in the email address of another MyLeadPod user you want to share the Reward Code with.';\n vm.isCopyToClipboardSuccessful = false;\n vm.editDescriptionVisible = false;\n vm.editUserShareVisible = false;\n vm.editAssociatedUsersVisible = false;\n vm.isSavingDescription = false;\n vm.isSavingUserShare = false;\n vm.userShareEmailChecked = false;\n vm.userShareEmailValid = false;\n vm.userShareEmailValidating = false;\n vm.isArchiving = false;\n vm.shortUrl = null;\n vm.emailBody = null;\n\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n if (angular.isDefined(rewardCode.userShare) && angular.isObject(rewardCode.userShare)) {\n vm.data.userShareEmail = rewardCode.userShare.email;\n vm.userShareEmailValid = true;\n vm.userShareEmailChecked = true;\n }\n\n vm.close = function () {\n $uibModalInstance.close({\n updatedRecord: vm.rewardCode\n });\n };\n\n vm.archive = function () {\n vm.isArchiving = true;\n RewardCodes.archive(rewardCode.id)\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.isArchiving = false;\n }, function () {\n vm.isArchiving = false;\n });\n };\n\n vm.getUrl = function () {\n return RewardCodes.getRewardCodeUrl(rewardCode.rewardCode);\n };\n\n vm.share = function (socialService) {\n SocialShare.share(socialService, {\n url: vm.shortUrl,\n name: configOptions.defaultShareName,\n description: configOptions.defaultShareMessage,\n source: 'MyLeadPod',\n picture: configOptions.appUrl + '/images/touch-icon-192x192.png'\n });\n };\n\n vm.saveDescription = function () {\n vm.isSavingDescription = true;\n vm.editDescriptionError = false;\n RewardCodes.update(rewardCode.id, {\n description: vm.data.description\n })\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.isSavingDescription = false;\n vm.editDescriptionVisible = false;\n vm.rewardCode.originalDescription = rewardCode.description;\n }, function () {\n vm.isSavingDescription = false;\n vm.editDescriptionError = 'An error occurred';\n });\n };\n\n vm.openUserShare = function () {\n vm.editUserShareVisible = true;\n console.log(angular.element('#share-autocomplete_value'));\n $timeout(function () {\n angular.element('#share-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.saveUserShare = function (userMsg) {\n vm.isSavingUserShare = true;\n vm.editUserShareError = false;\n\n vm.searchingUser = userMsg || 'Saving the changes...';\n return RewardCodes.update(rewardCode.id, {\n userShareEmail: vm.data.userShareEmail\n })\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.editUserShareVisible = false;\n vm.isSavingUserShare = false;\n vm.rewardCode.originalDescription = rewardCode.description;\n\n // MGA - #37545\n vm.searchingUser = false;\n vm.editUserShareVisible = false;\n }, function () {\n vm.isSavingUserShare = false;\n vm.editUserShareError = 'An error occurred';\n\n // MGA - #37545\n vm.searchingUser = false;\n vm.editUserShareVisible = false;\n });\n };\n\n vm.removeUserShare = function () {\n vm.data.userShareEmail = '';\n vm.saveUserShare('Removing sharing with the user..').then(function () {\n vm.rewardCode.userShare = null;\n }, function () {\n // Do what?\n vm.data.userShareEmail = vm.rewardCode.userShare.email;\n });\n };\n\n vm.isUserShareEmailValid = function () {\n if (vm.data.userShareEmail.length === 0) {\n return true;\n }\n\n return vm.userShareEmailValid;\n };\n\n vm.onSearchSharedItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingUser = 'Retrieving the user profile';\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n if (!profile) {\n return;\n }\n profile = profile.plain();\n vm.data.userShareEmail = profile.email;\n vm.saveUserShare().then(function () {\n vm.rewardCode.userShare = profile;\n });\n }, function () {\n vm.searchingUser = false;\n });\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n /**\n * Copy success callback\n */\n vm.onSuccess = function () {\n Notification({message: 'Copied into clipboard!'}, 'success');\n };\n\n vm.hasEditsAssociatedUsers = function () {\n var diff1 = _.difference(vm.associatedUsersClone, vm.associatedUsers),\n diff2 = _.difference(vm.associatedUsers, vm.associatedUsersClone);\n return diff1.length > 0 || diff2.length > 0 ? true : false;\n };\n\n vm.openAssociatedUser = function () {\n vm.editAssociatedUsersVisible = true;\n $timeout(function () {\n angular.element('#associated-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.addAssociatedUser = function (userProfile) {\n if (_.where(vm.associatedUsers, {idUser: userProfile.idUser}).length === 0) {\n vm.associatedUsers.push(userProfile);\n }\n };\n\n vm.onAssociatedItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingAssociatedUser = 'Retrieving the user profile';\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n if (!profile) {\n return;\n }\n profile = profile.plain();\n vm.addAssociatedUser(profile);\n vm.searchingAssociatedUser = false;\n }, function () {\n vm.searchingAssociatedUser = false;\n });\n };\n\n vm.onAssociatedUsersCancel = function () {\n vm.editAssociatedUsersVisible = false;\n vm.associatedUsers = _.clone(vm.associatedUsersClone);\n };\n\n vm.saveAssociatedUsers = function () {\n vm.isSavingAssociatedUsers = true;\n vm.editAssociatedUsersError = false;\n\n vm.searchingAssociatedUser = 'Saving the changes...';\n return RewardCodes.update(rewardCode.id, {\n associatedUsers: _.map(vm.associatedUsers, function (user) {\n return user.id;\n })\n })\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.associatedUsers = vm.rewardCode.associatedUsers || [];\n vm.associatedUsersClone = _.clone(rewardCode.associatedUsers || []);\n vm.editAssociatedUsersVisible = false;\n vm.isSavingAssociatedUsers = false;\n vm.rewardCode.originalDescription = rewardCode.description;\n\n // MGA - #37545\n vm.searchingAssociatedUser = false;\n vm.editAssociatedUsersVisible = false;\n }, function () {\n vm.editAssociatedUsersError = false;\n vm.editUserShareError = 'An error occurred';\n\n // MGA - #37545\n vm.searchingAssociatedUser = false;\n vm.editAssociatedUsersVisible = false;\n });\n };\n\n vm.removeAssociatedUser = function ($index) {\n vm.associatedUsers.splice($index, 1);\n vm.editAssociatedUsersVisible = true;\n };\n\n vm.embed = function () {\n RewardCodes.openEmbed(rewardCode);\n };\n\n BitlyUrlShortener.shorten(vm.getUrl())\n .then(function (result) {\n var exp = $interpolate(configOptions.defaultEmailMessage);\n vm.shortUrl = result;\n vm.emailBody = encodeURIComponent(exp({link: vm.shortUrl}));\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardCodeCreate.controller:RewardCodeCreateCtrl\n *\n * @description\n *\n */\n RewardCodeCreateCtrl.$inject = [\"$scope\", \"$document\", \"$timeout\", \"$filter\", \"Notification\", \"FormAlerts\", \"Restangular\", \"Session\", \"RewardCodes\", \"$uibModalInstance\"];\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardCodeCreateCtrl', RewardCodeCreateCtrl);\n\n function RewardCodeCreateCtrl($scope, $document, $timeout, $filter, Notification, FormAlerts, Restangular, Session, RewardCodes, $uibModalInstance) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.rewardCodeChecked = false;\n vm.userShareEmailChecked = false;\n vm.rewardCodeValid = false;\n vm.rewardCodeValidating = false;\n vm.rewardsProgramSetup = [];\n vm.isRewardsProgramDetailVisible = false;\n vm.detailsVisible = false;\n vm.sharingVisible = false;\n vm.associatedUsersVisible = false;\n vm.associatedUsers = [];\n vm.sharedUsers = [];\n vm.data = {\n options: [],\n rewardType: 'rewardsProgram',\n userShareEmail: null\n };\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n // Subscribe to the local update\n $scope.$on('event:user-updateLocalProfile', function () {\n if (vm.user.defaultRewardProgram) {\n vm.renderRewardProgramOptions(vm.user.defaultRewardProgram);\n }\n });\n\n function getIdForOption() {\n var d = new Date();\n return d.getTime();\n }\n\n function initData() {\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n }\n\n // Render reward program option\n vm.renderRewardProgramOptions = function (options) {\n if (options && options.length > 0) {\n angular.forEach(options, function (option) {\n var uiId = getIdForOption() * Math.random();\n vm.rewardsProgramSetup.push(option);\n vm.data.options.push(angular.extend({}, option, {\n uiId: uiId.toString().replace('.', '')\n }));\n });\n vm.data.options = $filter('orderBy')(vm.data.options, 'successfulLeadPrice');\n }\n else {\n initData();\n vm.isRewardsProgramDetailVisible = true;\n }\n };\n Session.getUserProfile().then(function (user) {\n vm.user = user;\n if (user.defaultRewardProgram) {\n vm.renderRewardProgramOptions(user.defaultRewardProgram);\n }\n });\n\n vm.rewardCodeHelp = 'You can create your own Reward Codes.\\n\\nExamples: MYCOMPANYNAME123, CODE123, SUMMERPROMOTION, ...\\n\\nPlease choose between 5 to 20 characters.';\n vm.userShareEmailHelp = 'Type in the email address of another MyLeadPod user you want to share the Reward Code with.';\n vm.rewardsHelp = 'Change the Reward Program for this Reward Code. Users joining you via this Reward Code will be connected to the assigned Reward Program.';\n vm.shareHelp = 'Any leads that you will receive via this Reward Code will be shared with the designated user.';\n vm.associatedUsersHelp = 'Associated users is the group of businesses that the user registering through this Reward Code will be automatically connected with.';\n\n vm.addOption = function () {\n var optionId = getIdForOption();\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n\n $timeout(function () {\n angular.element($document[0].getElementById('name' + optionId))[0].focus();\n }, 0);\n };\n\n vm.deleteOption = function ($index) {\n vm.data.options.splice($index, 1);\n };\n\n vm.onRewardCodeChange = function () {\n vm.rewardCodeChecked = false;\n vm.rewardCodeValidating = false;\n vm.rewardCodeValid = false;\n };\n\n vm.validateRewardCode = function () {\n var code;\n vm.rewardCodeChecked = false;\n if (vm.data.rewardCode && vm.data.rewardCode.length >= 5 && vm.data.rewardCode.length <= 20) {\n code = vm.data.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.data.rewardCode = code.replace(/[-]+/g, '-');\n vm.rewardCodeValidating = true;\n RewardCodes.isRewardCodeUnique(vm.data.rewardCode)\n .then(function (isUnique) {\n vm.rewardCodeChecked = true;\n vm.rewardCodeValidating = false;\n vm.rewardCodeValid = isUnique;\n // Please don't remove. This could be the workaround if the $digest takes too long to apply changes to watchers. _.defer(function(){$scope.$apply();});\n });\n }\n };\n\n vm.create = function () {\n var associatedUsersIds = _.map(vm.associatedUsers, function (user) {\n return user.id;\n });\n vm.isLoading = true;\n vm.alerts.reset();\n RewardCodes.create(vm.data.rewardCode.toUpperCase(), vm.data.rewardType, vm.data.options, vm.data.description, vm.data.userShareEmail, associatedUsersIds)\n .then(function () {\n // Force the refresh of the reward program and code for the local user\n RewardCodes.updateRewardProgramsAndCodes(true);\n Notification({message: 'Success'}, 'confirmation');\n $uibModalInstance.close('success');\n }, function (errorCode) {\n if (errorCode === 601) {\n vm.alerts.add('danger', 'This Reward Code is already used. Please choose another one.');\n }\n else {\n vm.alerts.add('danger', 'Unable to create');\n }\n vm.isLoading = false;\n });\n };\n\n vm.toggleRewardsProgramDetailVisibility = function () {\n vm.isRewardsProgramDetailVisible = !vm.isRewardsProgramDetailVisible;\n };\n\n vm.toggleMoreDetailsVisibility = function () {\n vm.detailsVisible = !vm.detailsVisible;\n vm.associatedUsersVisible = false;\n vm.sharingVisible = false;\n if (!vm.detailsVisible) {\n vm.isRewardsProgramDetailVisible = false;\n }\n };\n\n vm.toggleSharingVisibility = function () {\n vm.sharingVisible = !vm.sharingVisible;\n vm.associatedUsersVisible = false;\n vm.detailsVisible = false;\n $timeout(function () {\n angular.element('#share-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.toggleAssociatedUsersVisibility = function () {\n vm.associatedUsersVisible = !vm.associatedUsersVisible;\n vm.detailsVisible = false;\n vm.sharingVisible = false;\n $timeout(function () {\n angular.element('#associate-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.closeCreateCodeModal = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.onSearchSharedItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingUser = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingUser = false;\n profile = profile.plain();\n vm.addShareUser(profile);\n });\n };\n\n vm.onSearchItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingUser = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingUser = false;\n if (!profile) {\n return;\n }\n profile = profile.plain();\n vm.addUser(profile);\n });\n };\n\n vm.addShareUser = function (userProfile) {\n if (vm.sharedUsers.length === 0 && _.where(vm.sharedUsers, {idUser: userProfile.idUser}).length === 0) {\n vm.sharedUsers.push(userProfile);\n vm.data.userShareEmail = userProfile.email;\n }\n };\n\n vm.removeUserShare = function () {\n vm.sharedUsers = [];\n vm.data.userShareEmail = null;\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.addUser = function (userProfile) {\n if (_.where(vm.associatedUsers, {idUser: userProfile.idUser}).length === 0) {\n vm.associatedUsers.push(userProfile);\n }\n };\n\n vm.showButton = function (index) {\n var r = $document[0].querySelector('[data-delete-btn=\\'' + index + '\\']');\n if (r) {\n angular.element(r).addClass('btn-flip');\n r.querySelector('button').focus();\n }\n };\n\n vm.hideButton = function (index, btn, evt) {\n try {\n angular.element(evt.currentTarget.parentElement).removeClass('btn-flip');\n }\n catch (ex) {\n console.error(ex);\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.receivedLeads\n * @description\n *\n */\n angular\n .module('myMemberships.receivedLeads', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('myMemberships.receivedLeads')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.receivedLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/received-leads',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n params: {\n leadToOpen: null\n },\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'receivedLeads');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.receivedLeads.controller:ReceivedLeadsCtrl\n *\n * @description\n *\n */\n ReceivedLeadsCtrl.$inject = [\"$stateParams\", \"DataTable\", \"Leads\"];\n angular\n .module('myMemberships.receivedLeads')\n .controller('ReceivedLeadsCtrl', ReceivedLeadsCtrl);\n\n function ReceivedLeadsCtrl($stateParams, DataTable, Leads) {\n var vm = this,\n filter;\n vm.statuses = {\n all: 'All leads',\n open: 'Open',\n new: 'New',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.searchLead = '';\n vm.selectedStatus = 'all';\n vm.selectedStatusLabel = 'All leads';\n vm.lastSearched = null;\n\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'received'\n }\n });\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n search: vm.searchLead\n });\n };\n\n vm.selectStatus = function (leadStatus) {\n vm.selectedStatus = leadStatus;\n vm.selectedStatusLabel = vm.statuses[leadStatus];\n filter();\n };\n\n vm.search = function () {\n if (vm.selectedStatus + vm.searchLead === vm.lastSearched) {\n return;\n }\n filter();\n vm.lastSearched = vm.selectedStatus + vm.searchLead;\n };\n\n vm.openDetail = function ($index) {\n var detailInstance = Leads.openDetail(vm.list.getRecords()[$index], 'received', 'received-leads-ctrl-container');\n if (angular.isDefined(detailInstance)) {\n detailInstance.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.lead)) {\n vm.list.getRecords()[$index] = result.lead;\n }\n });\n }\n };\n\n vm.closeLead = function ($index, status) {\n var result = Leads.closeLead(vm.list.getRecords()[$index], status, 'received-leads-ctrl-container');\n if (result) {\n result.then(function () {\n vm.list.getRecords()[$index].status = status;\n });\n }\n };\n\n if (angular.isObject($stateParams.leadToOpen) && angular.isNumber($stateParams.leadToOpen.id)) {\n Leads.openDetail($stateParams.leadToOpen, 'received', 'received-leads-ctrl-container');\n }\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.memberships\n * @description\n *\n */\n angular\n .module('myMemberships.memberships', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('myMemberships.memberships')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.memberships', angular.extend({}, configOptions.defaultStateParams, {\n url: '/memberships',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'memberships');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.memberships.controller:MembershipsCtrl\n *\n * @description\n *\n */\n MembershipsCtrl.$inject = [\"DataTable\"];\n angular\n .module('myMemberships.memberships')\n .controller('MembershipsCtrl', MembershipsCtrl);\n\n function MembershipsCtrl(DataTable) {\n var vm = this;\n vm.searchName = '';\n vm.tableSubContentVisible = null;\n vm.lastSearched = null;\n vm.list = DataTable.create('Memberships', 'index');\n vm.search = function () {\n if (vm.lastSearched === vm.searchName) {\n return;\n }\n vm.list.reload({\n search: vm.searchName\n });\n vm.lastSearched = vm.searchName;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.joinPod\n * @description\n *\n */\n angular\n .module('myMemberships.joinPod', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('myMemberships.joinPod')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myMembershipsJoinPod', {\n url: '/my-memberships/join-pod',\n template: '',\n controller: 'JoinPodCtrl',\n controllerAs: 'joinPod',\n authenticate: true,\n params: {\n user: null,\n nextState: null\n },\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.joinPod.controller:JoinPodModalCtrl\n *\n * @description\n *\n */\n JoinPodModalCtrl.$inject = [\"Restangular\", \"Notification\", \"FormAlerts\", \"$uibModalInstance\", \"myProfile\", \"userProfile\"];\n angular\n .module('myMemberships.joinPod')\n .controller('JoinPodModalCtrl', JoinPodModalCtrl);\n\n function JoinPodModalCtrl(Restangular, Notification,\n FormAlerts, $uibModalInstance, myProfile, userProfile) {\n var vm = this;\n vm.isLoading = false;\n\n vm.rewardCodes = {};\n vm.selectedRewardCode = '';\n vm.selectedRewardCodeLabel = 'Reward Code';\n vm.alerts = new FormAlerts();\n vm.user = myProfile;\n vm.targetUser = userProfile;\n vm.isRewardsFormValid = false;\n\n vm.data = {\n firstName: vm.targetUser ? vm.targetUser.firstName : null,\n email: vm.targetUser ? vm.targetUser.email : null,\n creditCard: {},\n phoneMobile: vm.targetUser ? vm.targetUser.phoneMobile : null\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.join = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Restangular.one('Memberships').post('index', vm.data)\n .then(function (response) {\n $uibModalInstance.close(response.receiveLeads);\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to send');\n });\n };\n\n vm.onRewardSelectionChange = function (data, isFormValid) {\n _.extend(vm.data, data);\n vm.isRewardsFormValid = isFormValid;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.joinPod.controller:JoinPodCtrl\n *\n * @description\n *\n */\n JoinPodCtrl.$inject = [\"$state\", \"MyMemberships\", \"userProfile\"];\n angular\n .module('myMemberships.joinPod')\n .controller('JoinPodCtrl', JoinPodCtrl);\n\n function JoinPodCtrl($state, MyMemberships, userProfile) {\n var vm = this;\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(userProfile, null);\n modalInstance.then(function () {\n $state.go('myMemberships');\n }, function () {\n $state.go('myMemberships');\n });\n };\n vm.openAskForLeads();\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.import\n * @description\n *\n */\n angular\n .module('myMemberships.import', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('myMemberships.import')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.import', angular.extend({}, configOptions.defaultStateParams, {\n url: '/import',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n params: {\n leadToOpen: null\n },\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'import');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.import.controller:ImportCtrl\n *\n * @description\n *\n */\n ImportCtrl.$inject = [\"Upload\", \"Auth\", \"FormAlerts\", \"Notification\"];\n angular\n .module('myMemberships.import')\n .controller('ImportCtrl', ImportCtrl);\n\n function ImportCtrl(Upload, Auth, FormAlerts, Notification) {\n var vm = this;\n vm.downloadTemplateUrl = '/Memberships/importTemplate';\n vm.acceptedFiles = 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,*.xls,*.xlsx';\n vm.isUploading = false;\n vm.importProgressPercent = 0;\n vm.alerts = new FormAlerts();\n vm.importFinished = false;\n vm.alertsExpanded = false;\n\n vm.upload = function (files) {\n if (!vm.isUploading && files && files[0]) {\n vm.isUploading = true;\n vm.importProgressPercent = 0;\n vm.alerts.reset();\n Upload.upload({\n url: Auth.fixApiEndpointUrl('/Memberships/import'),\n data: {file: files[0]},\n method: 'POST'\n })\n .then(function (result) {\n if (result.data.content.status === true) {\n vm.importFinished = true;\n Notification({message: 'Success'}, 'confirmation');\n }\n else {\n angular.forEach(result.data.content.errors, function (item) {\n vm.alerts.add('danger', item.message);\n });\n }\n vm.isUploading = false;\n }, function () {\n vm.alerts.add('danger', 'Unable to import');\n vm.isUploading = false;\n }, function (evt) {\n vm.importProgressPercent = parseInt(100.0 * evt.loaded / evt.total, 10);\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard.memberships\n * @description\n *\n */\n angular\n .module('dashboard.memberships', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.memberships.directive:receivedLeadsList\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.memberships')\n .directive('receivedLeadsList', receivedLeadsList);\n\n function receivedLeadsList() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/memberships/received-leads-list-directive.tpl.html',\n replace: false,\n controllerAs: 'receivedLeadsList',\n controller: [\"$scope\", \"$uibModal\", \"Leads\", function ($scope, $uibModal, Leads) {\n var vm = this;\n vm.name = 'receivedLeadsList';\n vm.list = $scope.list;\n\n vm.openDetail = function ($index) {\n Leads.openDetail(vm.list.records[$index], 'received');\n };\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.memberships.directive:receivedLeadsGraph\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.memberships')\n .directive('receivedLeadsGraph', receivedLeadsGraph);\n\n function receivedLeadsGraph() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/memberships/received-leads-graph-directive.tpl.html',\n replace: false,\n controllerAs: 'receivedLeadsGraph',\n controller: [\"$scope\", \"$filter\", function ($scope, $filter) {\n var vm = this;\n\n vm.chartData = {\n labels: _.map($scope.list, function (day) {\n return $filter('date')(day.date, 'd/M');\n }),\n series: [_.map($scope.list, function (day) {\n return day.leads;\n })]\n };\n\n vm.chartOptions = {\n axisX: {\n showGrid: false,\n showLabel: false\n },\n axisY: {\n showGrid: true,\n showLabel: true,\n low: 0,\n onlyInteger: true\n },\n lineSmooth: false,\n scaleMinSpace: 10,\n height: 400\n };\n\n vm.chartEvents = {\n draw: function (data) {\n var circle;\n if (data.type === 'point') {\n circle = new Chartist.Svg('circle', {\n cx: [data.x],\n cy: [data.y],\n r: [5]\n }, 'ct-circle');\n data.element.replace(circle);\n }\n }\n };\n\n vm.responsiveOptions = [\n ['screen and (min-width: 768px) and (max-width: 991px)', {\n width: 646\n }],\n ['screen and (min-width: 992px) and (max-width: 1199px)', {\n width: 487\n }],\n ['screen and (min-width: 1200px)', {\n width: 590\n }]\n ];\n }],\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n angular\n .module('dashboard.memberships')\n .config(config);\n\n function config() {\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.memberships.controller:DashboardMembershipsCtrl\n *\n * @description\n *\n */\n DashboardMembershipsCtrl.$inject = [\"$scope\"];\n angular\n .module('dashboard.memberships')\n .controller('DashboardMembershipsCtrl', DashboardMembershipsCtrl);\n\n function DashboardMembershipsCtrl($scope) {\n var vm = this;\n vm.dailyStats = $scope.dashboard.leadsDailyStats;\n vm.list = $scope.dashboard.receivedLeads;\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard.stats\n * @description\n *\n */\n angular\n .module('dashboard.stats', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n angular\n .module('dashboard.stats')\n .config(config);\n\n function config() {\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.stats.controller:StatsCtrl\n *\n * @description\n *\n */\n StatsCtrl.$inject = [\"$scope\", \"$filter\", \"Charities\"];\n angular\n .module('dashboard.stats')\n .controller('StatsCtrl', StatsCtrl);\n\n function StatsCtrl($scope, $filter, Charities) {\n var vm = this;\n\n vm.membersCount = $scope.dashboard.membersCount;\n vm.membershipsCount = $scope.dashboard.membershipsCount;\n vm.sentLeadsCount = $scope.dashboard.sentLeadsCount;\n vm.donations = $filter('currency')($scope.dashboard.donations, '$', 0);\n vm.earnings = $filter('currency')($scope.dashboard.earnings.lastMonthEarnings, '$', 0);\n vm.balance = $filter('currency')($scope.dashboard.earnings.actualEarnings, '$', 0);\n vm.isBusinessAccountActive = $scope.dashboard.isBusinessAccountActive;\n\n vm.donationsValue = $scope.dashboard.donations;\n vm.earningsValue = $scope.dashboard.earnings.lastMonthEarnings;\n\n vm.getLatestPods = function () {\n return [];\n };\n\n vm.getMembers = function () {\n return [];\n };\n\n vm.getEarnings = function () {\n return 0;\n };\n\n vm.getBalance = function () {\n return 0;\n };\n\n vm.getDonations = function () {\n return 0;\n };\n\n vm.openDonate = function () {\n Charities.openDonate();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard.pod\n * @description\n *\n */\n angular\n .module('dashboard.pod', [\n 'ui.router',\n 'angular-chartist'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n angular\n .module('dashboard.pod')\n .config(config);\n\n function config() {\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.pod.directive:podMembersList\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.pod')\n .directive('podMembersList', podMembersList);\n\n function podMembersList() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/pod/pod-members-list-directive.tpl.html',\n replace: false,\n controllerAs: 'podMembersList',\n controller: [\"$scope\", function ($scope) {\n var vm = this;\n vm.list = $scope.list;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.pod.directive:podEarningsGraph\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.pod')\n .directive('podEarningsGraph', podEarningsGraph);\n\n function podEarningsGraph() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/pod/pod-earnings-graph-directive.tpl.html',\n replace: false,\n controllerAs: 'podEarningsGraph',\n controller: [\"$scope\", \"$filter\", function ($scope, $filter) {\n var vm = this;\n\n vm.chartData = {\n labels: _.map($scope.list, function (day) {\n return $filter('date')(day.date, 'd/M');\n }),\n series: [_.map($scope.list, function (day) {\n return day.cumulativeEarnings;\n })]\n };\n\n vm.chartOptions = {\n axisX: {\n showGrid: false,\n showLabel: false\n },\n axisY: {\n showGrid: true,\n showLabel: true,\n low: 0,\n onlyInteger: true\n },\n lineSmooth: false,\n scaleMinSpace: 10,\n showArea: true,\n height: 400,\n stretch: true\n };\n\n vm.chartEvents = {\n draw: function (data) {\n var circle;\n if (data.type === 'point') {\n circle = new Chartist.Svg('circle', {\n cx: [data.x],\n cy: [data.y],\n r: [5]\n }, 'ct-circle');\n data.element.replace(circle);\n }\n }\n };\n\n vm.responsiveOptions = [\n ['screen and (min-width: 768px) and (max-width: 991px)', {\n width: 646\n }],\n ['screen and (min-width: 992px) and (max-width: 1199px)', {\n width: 570\n }],\n ['screen and (min-width: 1200px)', {\n width: 688\n }]\n ];\n }],\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.pod.controller:PodCtrl\n *\n * @description\n *\n */\n PodCtrl.$inject = [\"$scope\"];\n angular\n .module('dashboard.pod')\n .controller('PodCtrl', PodCtrl);\n\n function PodCtrl($scope) {\n var vm = this;\n vm.dailyStats = $scope.dashboard.earningsDailyStats;\n vm.list = $scope.dashboard.members;\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui\n * @description\n *\n */\n angular\n .module('components.ui', [\n 'components.ui.table',\n 'components.ui.tabs'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.ui.service:PromptDialog\n *\n * @description\n *\n */\n PromptDialog.$inject = [\"$document\", \"$uibModal\"];\n angular\n .module('components.ui')\n .service('PromptDialog', PromptDialog);\n\n function PromptDialog($document, $uibModal) {\n var self = this;\n\n /**\n * Opens up a modal dialog\n * @param {string} content Content message\n * @param {string} onConfirmMessage Confirmation message\n * @param {string} confirmButtonLabel Label to display on confirm button\n * @param {string} cancelButtonLabel Label to display on cancel button\n * @returns {*} Modal instance\n */\n self.open = function (content, onConfirmMessage, confirmButtonLabel, cancelButtonLabel) {\n var instance;\n\n instance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'components/ui/prompt-dialog.tpl.html',\n controller: 'PromptDialogCtrl',\n controllerAs: 'promptDialog',\n size: 'md',\n resolve: {\n content: function () {\n return content;\n },\n onConfirmMessage: function () {\n return onConfirmMessage;\n },\n cancelButtonLabel: function () {\n return cancelButtonLabel;\n },\n confirmButtonLabel: function () {\n return confirmButtonLabel;\n }\n }\n });\n\n return instance.result;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name components.ui.controller:PromptDialogCtrl\n *\n * @description\n *\n */\n PromptDialogCtrl.$inject = [\"$timeout\", \"$uibModalInstance\", \"content\", \"onConfirmMessage\", \"cancelButtonLabel\", \"confirmButtonLabel\"];\n angular\n .module('components.ui')\n .controller('PromptDialogCtrl', PromptDialogCtrl);\n\n function PromptDialogCtrl($timeout, $uibModalInstance, content, onConfirmMessage, cancelButtonLabel, confirmButtonLabel) {\n var vm = this;\n\n vm.content = content;\n vm.onConfirmMessage = onConfirmMessage;\n vm.isConfirmed = false;\n vm.cancelButtonLabel = cancelButtonLabel ? cancelButtonLabel : 'No';\n vm.confirmButtonLabel = confirmButtonLabel ? confirmButtonLabel : 'Yes';\n\n vm.confirm = function () {\n vm.isConfirmed = true;\n if (vm.onConfirmMessage) {\n $timeout(function () {\n $uibModalInstance.close();\n }, 3000);\n }\n else {\n $uibModalInstance.close();\n }\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:creditCard\n * @restrict E\n * @element\n */\n angular\n .module('components.ui')\n .directive('creditCard', creditCard);\n\n function creditCard() {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n ccData: '=',\n ccShowForm: '&',\n creditCard: '='\n },\n\n // creditCard - is the existing credit card info\n // ccData - is the object into which the new credit card info will be stored (two-way)\n // ccShowForm - whether to show the new ccForm or not\n // user - userProfile from which the data will be source. might be duplicated as creditCard is directly belonging to him already.\n\n replace: true,\n transclude: false,\n templateUrl: 'components/ui/credit-card-directive.tpl.html',\n controllerAs: 'cc',\n controller: ['$scope', 'CreditCardUtil', function ($scope, CreditCardUtil) {\n var vm = this;\n vm.months = CreditCardUtil.getExpiryMonths();\n vm.years = CreditCardUtil.getExpiryYears();\n vm.cards = CreditCardUtil.getAcceptedCards();\n\n // Scope variables in the controller\n vm.scope = $scope;\n\n if (vm.scope.ccData) {\n vm.scope.ccData = {\n method: angular.isObject(vm.scope.creditCard) && angular.isDefined(vm.scope.creditCard.number) ? 'old' : 'new'\n };\n }\n\n //\n vm.showCCForm = function (form) {\n var showForm = false;\n if (angular.isFunction(vm.scope.ccShowForm) && angular.isDefined(vm.scope.ccShowForm())) {\n showForm = vm.newCard || vm.scope.ccShowForm();\n }\n else if (vm.scope.creditCard && vm.scope.creditCard.number && !vm.newCard) {\n showForm = false;\n }\n else if (vm.scope.creditCard && vm.scope.creditCard.number && vm.newCard) {\n showForm = true;\n }\n else if (!vm.scope.creditCard || !vm.scope.creditCard.number) {\n showForm = true;\n }\n if (!showForm && form) {\n vm.clearForm(form);\n }\n return showForm;\n };\n\n //\n vm.closeCCForm = function (form) {\n vm.scope.ccData = {};\n vm.newCard = false;\n if (form) {\n vm.clearForm(form);\n }\n vm.scope.ccData.method = 'old';\n };\n\n //\n vm.clearForm = function (form) {\n delete form.$error.ccExp;\n delete form.$error.ccNumber;\n delete form.$error.ccNumberType;\n delete form.$error.ccExpMonth;\n delete form.$error.ccExpYear;\n\n if (form.$$parentForm) {\n delete form.$$parentForm.$error.ccExp;\n delete form.$$parentForm.$error.ccNumber;\n delete form.$$parentForm.$error.ccNumberType;\n delete form.$$parentForm.$error.ccExpMonth;\n delete form.$$parentForm.$error.ccExpYear;\n }\n };\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n contentSlider.$inject = [\"$rootScope\", \"$window\", \"$timeout\"];\n angular\n .module('components.ui')\n .directive('contentSlider', contentSlider);\n\n function contentSlider($rootScope, $window, $timeout) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n\n var contents,\n container,\n headers,\n buttons,\n el,\n parseContents,\n computeSize,\n width,\n currentStep = 0,\n currentContent,\n stepToClickHandler,\n manageHeightAndVisibility,\n updateHeader,\n eventHandler;\n\n stepToClickHandler = function (btn, stepId) {\n angular.element(btn).click(stepId, scope.stepTo);\n };\n\n updateHeader = function () {\n angular.forEach(headers, function (header) {\n var headerStep;\n header = angular.element(header);\n headerStep = header.attr('data-step-id');\n\n if (angular.isUndefined(headerStep)) {\n return;\n }\n headerStep = Number(headerStep);\n if (headerStep <= currentStep) {\n header.addClass('active');\n }\n else {\n header.removeClass('active');\n }\n });\n };\n\n manageHeightAndVisibility = function (isResize) {\n var lastContent = currentContent;\n\n angular.forEach(contents, function (content) {\n var targetStep;\n content = angular.element(content);\n targetStep = angular.element(content).attr('data-step-id');\n if (angular.isUndefined(targetStep)) {\n return;\n }\n targetStep = Number(targetStep);\n\n if (targetStep === currentStep) {\n computeSize(content);\n currentContent = content;\n\n if (lastContent && !isResize) {\n // The currentContent becomes previous content. Hide it.\n lastContent.css({\n visibility: 'hidden',\n height: '0px',\n opacity: 0\n });\n }\n }\n });\n };\n\n computeSize = function (content) {\n var contentHeight;\n // Fix the height so it doesn't 'jump' when setting the child content to 'auto'\n container.css({\n height: container[0].clientHeight + 'px'\n });\n\n // Set the target content to be visible, non-transparent and reset its height\n // Try to calculate the height. Temporarily set it to auto, calculate content and apply.\n content.css('height', 'auto');\n contentHeight = content[0].clientHeight;\n\n content.css({\n visibility: 'visible',\n opacity: 1,\n height: contentHeight + 'px'\n });\n container.css({\n height: contentHeight + 'px'\n });\n\n // That will last 0.2s and apply auto height (due to the dynamic content that might be there. You don't\n // want fixed height then\n $timeout(function () {\n content.css('height', 'auto');\n container.css('height', 'auto');\n }, 200);\n };\n\n parseContents = function (isResize, stepTo) {\n el = element;\n\n // These are the containers\n contents = angular.element('.step-content', el);\n container = angular.element('.stepped-container', el);\n buttons = angular.element('button[data-step-to], a[data-step-to]', el);\n headers = angular.element('.step[data-step-id]');\n\n if (contents.length === 0 || container.length === 0) {\n // Not much to do\n return;\n }\n\n // First, make sure we stretch the container to some width wide enough so the scrollbar doesn't appear as that would\n // wrongly calculate the width with the scrollbar included to our contents.\n container.width('10000px');\n\n width = el.width();\n\n // Calculate the width of the individual contents\n contents.css({\n width: width + 'px'\n });\n\n // Calculate the width of the wrapper\n container.css({\n width: width * contents.length + 'px',\n overflow: 'hidden',\n position: 'relative',\n transform: 'translateX(0px)',\n transition: 'all 0.2s ease-in-out',\n whiteSpace: 'nowrap'\n });\n\n if (!isResize) {\n // We must set the visibility: hidden so the focus on elements is disabled!\n angular.forEach(contents, function (cnt, idx) {\n if (idx !== 0) {\n angular.element(cnt).css({\n visibility: 'hidden'\n });\n }\n });\n\n // Bind the step to to our function\n angular.forEach(buttons, function (btn) {\n var stepId = angular.element(btn).attr('data-step-to');\n if (angular.isUndefined(stepId)) {\n return;\n }\n stepToClickHandler(btn, Number(stepId));\n });\n\n // Set the first content to\n currentContent = angular.element(contents[0]);\n currentContent.css({\n height: 'auto',\n visibility: 'visible'\n });\n container.css('height', 'auto');\n updateHeader();\n }\n else {\n scope.stepTo({\n data: angular.isDefined(stepTo) ? stepTo : currentStep,\n isResize: true\n });\n }\n };\n\n scope.stepTo = function (evt) {\n var stepId = evt.data,\n shiftBy = -1 * stepId * width;\n\n if (stepId === currentStep && !evt.isResize) {\n return;\n }\n\n container.css('transform', 'translateX(' + shiftBy + 'px)');\n currentStep = stepId;\n manageHeightAndVisibility(evt.isResize);\n updateHeader();\n };\n\n angular.element($window).on('resize', function () {\n parseContents(true);\n });\n\n eventHandler = $rootScope.$on('event:slider-do-layout', function (evtName, data) {\n $timeout(function () {\n if (data && data.stepTo >= 0) {\n parseContents(true, data.stepTo);\n }\n else {\n parseContents(true, currentStep ? currentStep : 0);\n }\n }, data && data.delay ? data.delay : 100);\n });\n scope.$on('$destroy', eventHandler);\n\n $timeout(function () {\n parseContents();\n }, 100);\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.directive:appsStoreLinks\n * @restrict EA\n * @element\n *\n */\n appsStoreLinks.$inject = [\"$window\", \"$document\", \"$rootScope\"];\n angular\n .module('components.ui')\n .directive('appsStoreLinks', appsStoreLinks);\n\n function appsStoreLinks($window, $document, $rootScope) {\n return {\n restrict: 'EA',\n scope: {},\n replace: true,\n templateUrl: 'components/ui/apps-store-links-directive.tpl.html',\n link: function (scope) {\n var watchHandle;\n scope.isAvailable = true;\n scope.isAuthenticated = $rootScope.isAuthenticated;\n\n // Check if the navigator has the \"gonative\" userAgent to determine whether it's the \"app\" or the \"web\"\n if ($window.navigator.userAgent.indexOf('gonative') > -1) {\n scope.isAvailable = false;\n }\n else if (!scope.isAuthenticated) {\n // Add the css class to adjust the app content a little\n angular.element($document[0].body).addClass('has-appsdownload-links');\n }\n watchHandle = $rootScope.$watch('isAuthenticated', function () {\n scope.isAuthenticated = $rootScope.isAuthenticated;\n if (scope.isAvailable) {\n if (scope.isAuthenticated) {\n angular.element($document[0].body).removeClass('has-appsdownload-links');\n }\n else {\n angular.element($document[0].body).addClass('has-appsdownload-links');\n }\n }\n });\n $rootScope.$on('$destroy', watchHandle);\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.directive:actionToolbar\n * @restrict A\n * @element\n *\n * @description\n *\n */\n actionToolbar.$inject = [\"$window\", \"$rootScope\", \"$document\", \"$timeout\", \"Raven\"];\n angular\n .module('components.ui')\n .directive('actionToolbar', actionToolbar);\n\n function actionToolbar($window, $rootScope, $document, $timeout, Raven) {\n var toolbarEl,\n primaryContainer,\n secondaryContainer,\n angularRootScope,\n angularTimeout,\n scrollingElement,\n isPrimaryVisible = false,\n isSecondaryVisible = false,\n checkScrollFn,\n setVisibilityFn,\n checkVisibilityFn,\n checkVisibilityValsFn,\n lastScrollTop = 0,\n stateChanging = false,\n timeoutPromise,\n instances = {\n primary: {},\n secondary: {}\n };\n\n function getScrollingElement() {\n var d = $document[0];\n return d.documentElement.scrollHeight > d.body.scrollHeight && d.compatMode.indexOf('CSS1') === 0 ? d.documentElement : d.body;\n }\n\n //\n checkScrollFn = function () {\n var scrollTop,\n diff;\n\n // Get the document's scrolling element. Sometimes it's HTML and sometime body.\n scrollingElement = scrollingElement || $document[0].scrollingElement || getScrollingElement();\n\n if (!scrollingElement) {\n // Something is not right.\n Raven.captureMessage('actionToolbar: unable to get the scrolling element.', {\n level: 'warning'\n });\n return;\n }\n\n scrollTop = scrollingElement.scrollTop;\n diff = Math.abs(lastScrollTop - scrollTop);\n\n if (scrollTop < 0 || diff < 20) {\n return;\n }\n\n if (lastScrollTop > scrollTop) {\n setVisibilityFn(true, null, true);\n }\n else {\n setVisibilityFn(false, null, true);\n }\n\n lastScrollTop = scrollTop;\n };\n\n //\n checkVisibilityValsFn = function () {\n // If the state is changing then just forget it\n if (stateChanging) {\n return;\n }\n\n // And finally set the action toolbar's visibility if any of those are visible (primary / secondary)\n if (isPrimaryVisible || isSecondaryVisible) {\n setVisibilityFn(true, null, true);\n }\n else {\n setVisibilityFn(false, null, true);\n }\n };\n\n //\n setVisibilityFn = function (visible, container, broadcast) {\n var el = container || toolbarEl;\n if (visible) {\n el.addClass('visible');\n if (broadcast) {\n angularTimeout(function () {\n angularRootScope.$broadcast('event:action-toolbar-visible', el[0].clientHeight);\n }, 200);\n }\n }\n else {\n el.removeClass('visible');\n if (broadcast) {\n angularTimeout(function () {\n angularRootScope.$broadcast('event:action-toolbar-hidden');\n }, 200);\n }\n }\n };\n\n // Check if there is any elements at all.\n checkVisibilityFn = function (isSecondary) {\n var container = isSecondary ? secondaryContainer : primaryContainer,\n transcludedContainer,\n isVisible = false;\n\n // Check if the container has any nodes.\n // The structure of these has changed since implementing the scroll-check directive. we need to travarse few more nodes.\n transcludedContainer = angular.element('.transcluded-content', container[0]);\n if (container[0] && transcludedContainer[1] && transcludedContainer[1].childElementCount > 0) {\n isVisible = true;\n }\n\n if (isSecondary && (!isSecondaryVisible && isVisible || isSecondaryVisible && !isVisible)) {\n isSecondaryVisible = isVisible;\n setVisibilityFn(isVisible, container, false);\n checkVisibilityValsFn();\n }\n else if (!isSecondary && (!isPrimaryVisible && isVisible || isPrimaryVisible && !isVisible)) {\n isPrimaryVisible = isVisible;\n setVisibilityFn(isVisible, container, false);\n checkVisibilityValsFn();\n }\n };\n\n return {\n restrict: 'E',\n scope: true,\n transclude: true,\n replace: true,\n templateUrl: 'components/ui/action-toolbar-directive.tpl.html',\n link: function (scope, element, attrs) {\n var windowScrollHandle,\n stateChangingHandle,\n stateChangedHandle,\n watchHandle,\n transcludedContainer,\n isSecondary = attrs.atTarget && attrs.atTarget === 'secondary',\n id = (new Date()).getTime();\n\n scope.id = id;\n\n // Main Element. First instance ever.\n if (!toolbarEl) {\n toolbarEl = angular.element('
    ');\n $document[0].body.appendChild(toolbarEl[0]);\n // Append to toolbar element\n toolbarEl.append(element);\n\n // Get the primary and secondary container\n primaryContainer = angular.element('.primary-container', toolbarEl);\n secondaryContainer = angular.element('.secondary-container', toolbarEl);\n\n // Some references for angular functions\n angularRootScope = $rootScope;\n angularTimeout = $timeout;\n }\n\n if (!isPrimaryVisible && !isSecondaryVisible) {\n // Subscribe to the scroll event. just once is enough as this widget will never be actually destroyed\n windowScrollHandle = angular.element($window.document).on('scroll', checkScrollFn);\n\n // Let's try this\n watchHandle = $rootScope.$watch(function () {\n if (timeoutPromise) {\n $window.clearTimeout(timeoutPromise);\n }\n timeoutPromise = $window.setTimeout(function () {\n checkVisibilityFn(true);\n checkVisibilityFn(false);\n }, 150);\n });\n\n // Subsribe to our state changing events\n stateChangingHandle = $rootScope.$on('event:app-state-changing', function () {\n stateChanging = true;\n setVisibilityFn(false);\n });\n stateChangedHandle = $rootScope.$on('event:app-state-changed', function () {\n stateChanging = false;\n checkVisibilityFn(isSecondary);\n });\n }\n\n // Get the element references.\n transcludedContainer = angular.element('#at-transcluded', element);\n\n // Check the attrs for the target and extract and reposition the data and update the instances content\n if (isSecondary) {\n secondaryContainer[0].innerHTML = '';\n secondaryContainer.append(transcludedContainer);\n instances.secondary[id] = transcludedContainer;\n }\n else {\n primaryContainer[0].innerHTML = '';\n primaryContainer.append(transcludedContainer);\n instances.primary[id] = transcludedContainer;\n }\n checkVisibilityFn(isSecondary);\n\n scope.$on('$destroy', function () {\n // Ok we have to recognize what type of target has just been destroyed. (primary, secondary..?)\n if (isSecondary) {\n instances.secondary[id].remove();\n }\n else {\n instances.primary[id].remove();\n }\n checkVisibilityFn(isSecondary);\n\n if (!isPrimaryVisible && !isSecondaryVisible) {\n if (angular.isFunction(watchHandle)) {\n watchHandle();\n }\n if (angular.isFunction(windowScrollHandle)) {\n windowScrollHandle();\n }\n if (angular.isFunction(stateChangingHandle)) {\n stateChangingHandle();\n }\n if (angular.isFunction(stateChangedHandle)) {\n stateChangedHandle();\n }\n }\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.profile\n * @description\n *\n */\n angular\n .module('account.profile', [\n 'ui.router',\n 'ngFileUpload',\n 'uiCropper',\n 'ngjsColorPicker',\n 'colorpicker.module'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('account.profile')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('account.profile', angular.extend({}, configOptions.defaultStateParams, {\n url: '/profile',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('account', 'profile');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.profile.controller:ProfileCtrl\n *\n * @description\n *\n */\n ProfileCtrl.$inject = [\"$document\", \"$rootScope\", \"$scope\", \"$timeout\", \"$state\", \"$uibModal\", \"Notification\", \"configOptions\", \"Restangular\", \"Location\", \"Session\", \"FormAlerts\", \"Industries\"];\n angular\n .module('account.profile')\n .controller('ProfileCtrl', ProfileCtrl);\n\n function ProfileCtrl($document, $rootScope, $scope, $timeout, $state, $uibModal, Notification, configOptions, Restangular, Location, Session, FormAlerts, Industries) {\n var vm = this,\n configDefaults;\n vm.alerts = new FormAlerts();\n vm.isBusinessAccount = false;\n vm.isLoading = true;\n vm.isLoadingBackgroundImg = false;\n vm.isSavingBackgound = false;\n vm.photoFile = null;\n vm.backgroundFile = null;\n vm.imageEditMode = false;\n vm.isDragging = false;\n vm.backgroundStyleBkp = null;\n vm.resetRequested = false;\n\n // options for color picker\n vm.customOptions = {\n size: 28,\n roundCorners: true\n };\n vm.customColors = [null, '#000000', '#ffffff', '#ffc0cb', '#008080', '#ffe4e1', '#ff0000', '#ffd700', '#d3ffce', '#00ffff', '#ff7373', '#40d0e0', '#e6e6fa'];\n vm.customHeadlineColors = ['#3b374b', '#ffffff'];\n\n configDefaults = {\n selectedColor: '#fffffa',\n headlineColor: '#3b374a',\n keepPattern: true,\n backgroundFile: null\n };\n\n vm.defaults = _.clone(configDefaults);\n\n // Background Edits\n vm.edits = {\n patternEdited: false,\n colorEdited: false,\n headlineEdited: false,\n imageEdited: false\n };\n\n vm.data = {\n address: {},\n addressPostal: {}\n };\n Industries.isReady.then(function () {\n vm.industries = Industries.getConsolidatedList();\n });\n vm.getCountries = Location.getCountries;\n vm.getStates = function () {\n return Location.getStates(vm.data.addressPostal.idCountryPostal);\n };\n\n Session.getUserProfile()\n .then(function (userProfile) {\n vm.userProfile = userProfile;\n vm.data.firstName = vm.userProfile.firstName;\n vm.data.lastName = vm.userProfile.lastName;\n vm.data.email = vm.userProfile.email;\n vm.data.phoneMobile = vm.userProfile.phoneMobile;\n vm.data.businessName = vm.userProfile.businessName;\n vm.data.description = vm.userProfile.description;\n vm.data.website = vm.userProfile.website;\n vm.data.location = vm.userProfile.location;\n vm.data.address.streetAddress = vm.userProfile.streetAddress;\n vm.data.address.suburb = vm.userProfile.suburb;\n vm.data.address.state = vm.userProfile.state;\n vm.data.address.postCode = vm.userProfile.postCode;\n vm.data.address.country = vm.userProfile.country;\n vm.data.addressPostal = vm.userProfile.addressPostal;\n if (angular.isObject(vm.userProfile.addressPostal) && angular.isDefined(vm.userProfile.addressPostal.idCountryPostal) && !!vm.userProfile.addressPostal.idCountryPostal) {\n vm.data.addressPostal.idCountryPostal = vm.userProfile.addressPostal.idCountryPostal.toString();\n }\n if (angular.isObject(vm.userProfile.addressPostal) && angular.isDefined(vm.userProfile.addressPostal.idStatePostal) && !!vm.userProfile.addressPostal.idStatePostal) {\n vm.data.addressPostal.idStatePostal = vm.userProfile.addressPostal.idStatePostal.toString();\n }\n\n if (vm.userProfile && vm.userProfile.isBusinessAccountActive) {\n vm.isBusinessAccount = true;\n }\n\n vm.selectedClassification = {};\n\n if (angular.isObject(vm.userProfile.industry)) {\n vm.data.idClassification = vm.userProfile.industry.id.toString();\n vm.selectedClassification = {id: vm.userProfile.industry.id, name: vm.userProfile.industry.name};\n }\n if (angular.isObject(vm.userProfile.subIndustry)) {\n vm.data.idClassification = vm.userProfile.subIndustry.id.toString();\n vm.selectedClassification = {id: vm.userProfile.subIndustry.id, name: vm.userProfile.industry.name + ' - ' + vm.userProfile.subIndustry.name};\n }\n else {\n vm.data.idClassification = null;\n }\n\n // We need to hold the background style object as the backup.\n vm.backgroundStyleBkp = _.clone(vm.getCoverStyle(vm.userProfile));\n vm.clearData();\n\n vm.isLoading = false;\n });\n\n vm.save = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Session.updateUserProfile(vm.data)\n .then(function (profile) {\n vm.userProfile = profile;\n $state.reload();\n Notification({message: 'Your profile has been successfully updated'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to save');\n });\n };\n\n vm.hasPhoto = function () {\n return !!vm.userProfile.imageToken;\n };\n\n vm.removePhoto = function () {\n vm.isLoading = true;\n Session.removePhoto()\n .then(function (profile) {\n vm.userProfile = profile;\n $state.reload();\n Notification({message: 'Your photo has been removed'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n });\n };\n\n vm.uploadPhoto = function () {\n var modalInstance;\n if (vm.photoFile !== null) {\n modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].getElementById('profile-ctrl-container')),\n templateUrl: 'account/profile/photo-upload.tpl.html',\n controller: 'PhotoUploadCtrl',\n controllerAs: 'photoUpload',\n size: 'lg',\n resolve: {\n photoFile: vm.photoFile\n }\n });\n\n modalInstance.result.then(function (result) {\n if (angular.isDefined(result.userProfile)) {\n Notification({message: 'Your photo has been successfully updated'}, 'confirmation');\n vm.userProfile = result.userProfile;\n }\n });\n }\n };\n\n vm.placeChangedCallback = function (address) {\n vm.data.address = address;\n };\n\n vm.onCountryChange = function () {\n vm.data.addressPostal.idStatePostal = '';\n };\n\n vm.onClassificationSelect = function (classification) {\n if (angular.isObject(classification) && angular.isObject(classification.originalObject)) {\n vm.data.idClassification = classification.originalObject.id;\n }\n };\n\n vm.getAddress = function () {\n var addressParts = [];\n if (vm.userProfile.suburb) {\n addressParts.push(vm.userProfile.suburb);\n }\n if (vm.userProfile.state) {\n addressParts.push(vm.userProfile.state);\n }\n if (vm.userProfile.country) {\n addressParts.push(vm.userProfile.country);\n }\n\n vm.addressLink = vm.userProfile.addressPostal && vm.userProfile.addressPostal.addressPostal ? vm.userProfile.addressPostal.addressPostal + ', ' + addressParts.join(', ') : addressParts.join(', ');\n return addressParts.join(', ');\n };\n\n vm.formatWebsiteUrl = function () {\n var url = '';\n if (angular.isDefined(vm.userProfile) && angular.isString(vm.userProfile.website)) {\n url = vm.userProfile.website;\n if (url !== '') {\n if ((url.slice(0, 4)).toLowerCase() !== 'http') {\n url = 'http://' + vm.userProfile.website;\n }\n }\n }\n\n return url;\n };\n\n vm.deactivateAccount = function () {\n // Let's open the modal.\n $uibModal.open({\n animation: false,\n templateUrl: 'account/profile/deactivate-modal.tpl.html',\n controller: 'DeactivateModalCtrl',\n controllerAs: 'ctrl',\n size: 'md',\n resolve: {\n userProfile: vm.userProfile\n }\n });\n };\n\n /*\n Background Editing\n */\n\n vm.resetToDefault = function () {\n vm.resetRequested = true;\n vm.changingColor = false;\n vm.bkgData.backgroundFile = null;\n vm.backgroundFile = null;\n };\n\n vm.uploadBackgroundPhoto = function () {\n if (vm.backgroundFile) {\n vm.imageUploadMode = true;\n vm.edits.imageEdited = true;\n // We need to clear the color\n if (vm.bkgData.selectedColor === vm.defaults.selectedColor) {\n vm.edits.colorEdited = true;\n }\n vm.bkgData.selectedColor = null;\n }\n else {\n vm.imageUploadMode = false;\n }\n };\n\n vm.removeBkgPhoto = function () {\n if (vm.bkgData.backgroundFile === vm.defaults.backgroundFile) {\n vm.edits.imageEdited = true;\n }\n\n vm.backgroundFile = null;\n vm.bkgData.backgroundFile = null;\n vm.imageUploadMode = false;\n };\n\n vm.getProfileStyle = function () {\n var obj = _.clone(vm.backgroundStyleBkp) || {\n 'background-color': 'none',\n 'background-blend-mode': 'inherit'\n };\n\n if (vm.resetRequested) {\n return {};\n }\n\n if (vm.imageEditMode) {\n obj = {\n 'background-color': vm.bkgData.selectedColor\n };\n\n if (vm.bkgData.selectedColor !== vm.defaults.selectedColor) {\n vm.edits.colorEdited = true;\n }\n }\n\n if (!vm.imageEditMode || !vm.edits.patternEdited && !vm.edits.colorEdited && !vm.edits.imageEdited) {\n return vm.backgroundStyleBkp;\n }\n\n if (vm.bkgData.keepPattern || vm.edits.colorEdited && vm.bkgData.selectedColor !== vm.defaults.selectedColor) {\n if (vm.bkgData.keepPattern) {\n obj.backgroundImage = 'url(\"/images/user-profile-pattern.png\")';\n obj.backgroundBlendMode = 'luminosity';\n obj.backgroundPosition = 'center center';\n }\n else {\n obj.backgroundImage = 'none';\n }\n }\n else {\n obj.backgroundImage = 'none';\n }\n\n if (vm.bkgData.backgroundFile) {\n obj.backgroundImage = 'url(\"' + vm.bkgData.backgroundFile + '\")';\n obj.backgroundBlendMode = 'luminosity';\n obj.backgroundPosition = 'center center';\n }\n\n return obj;\n };\n\n vm.getHeadlineStyle = function () {\n var obj = {\n color: vm.bkgData.headlineColor\n };\n\n if (vm.resetRequested) {\n return {};\n }\n\n if (vm.bkgData.headlineColor !== vm.defaults.headlineColor) {\n vm.edits.headlineEdited = true;\n return obj;\n }\n return obj;\n };\n\n vm.clearColourSettings = function () {\n // vm.bkgData.selectedColor = vm.defaults.selectedColor;\n // vm.bkgData.headlineColor = vm.defaults.headlineColor;\n if (vm.bkgData.selectedColor === vm.defaults.selectedColor) {\n vm.edits.colorEdited = true;\n }\n\n if (vm.bkgData.headlineColor === vm.defaults.headlineColor) {\n vm.edits.headlineColorEdited = true;\n }\n\n vm.bkgData.selectedColor = null;\n vm.bkgData.headlineColor = null;\n };\n\n vm.clearData = function () {\n vm.bkgData = {\n selectedColor: vm.defaults.selectedColor,\n keepPattern: vm.defaults.keepPattern,\n headlineColor: vm.defaults.headlineColor,\n backgroundFile: vm.defaults.backgroundFile\n };\n\n vm.edits = {\n patternEdited: false,\n colorEdited: false,\n headlineColorEdited: false,\n imageEdited: false\n };\n\n vm.backgroundFile = null;\n vm.imageUploadMode = false;\n vm.changingColor = false;\n vm.resetRequested = false;\n };\n\n vm.close = function () {\n vm.clearData();\n vm.imageEditMode = false;\n vm.imageUploadMode = false;\n vm.backgroundFile = null;\n };\n\n vm.hasEdits = function () {\n var hasEdits = false;\n angular.forEach(Object.keys(vm.edits), function (key) {\n if (!hasEdits) {\n hasEdits = vm.edits[key];\n }\n });\n return hasEdits;\n };\n\n /*\n This will revert any changes and remove any records for the user in the backend so it will display the default image only\n */\n vm.resetBackgroundData = function () {\n vm.isSavingBackgound = true;\n Restangular.one('UserConfiguration').customDELETE('cover').then(function () {\n Session.updateLocalUserProfile({\n profileConfiguration: {\n coverBackground: null\n }\n }, true);\n Notification({message: 'Success'}, 'success');\n vm.userProfile.profileConfiguration.coverBackground = null;\n // Store the backgup\n vm.backgroundStyleBkp = _.clone(vm.getCoverStyle(vm.userProfile));\n // Close and clear data.\n vm.close();\n }, function () {\n Notification({message: 'Failed to reset the profile'}, 'error');\n }).finally(function () {\n vm.isSavingBackgound = false;\n });\n };\n\n vm.saveBackgroundEdits = function () {\n var data;\n vm.isSavingBackgound = true;\n\n // Get the data\n data = {\n config: {\n keepPattern: vm.bkgData.keepPattern,\n backgroundColor: vm.bkgData.selectedColor !== configDefaults.selectedColor ? vm.bkgData.selectedColor : null,\n textColor: vm.bkgData.headlineColor !== configDefaults.headlineColor ? vm.bkgData.headlineColor : null\n }\n };\n\n if (vm.bkgData.backgroundFile && vm.edits.imageEdited) {\n data.image = vm.bkgData.backgroundFile;\n }\n else if (!vm.bkgData.backgroundFile && !vm.bkgData.keepPattern) {\n data.image = null;\n }\n else if (!vm.bkgData.backgroundFile && vm.edits.imageEdited) {\n data.image = null;\n }\n\n Restangular.one('UserConfiguration').customPUT(data, 'cover')\n .then(function (result) {\n // Update the global profile object\n Session.updateLocalUserProfile({\n profileConfiguration: {\n coverBackground: {\n imageToken: result.plain().imageToken,\n config: result.plain().config\n }\n }\n }, true);\n Notification({message: 'Success'}, 'success');\n vm.userProfile.profileConfiguration.coverBackground.imageToken = result.plain().imageToken;\n vm.userProfile.profileConfiguration.coverBackground.config = result.plain().config;\n // Store the backgup\n vm.backgroundStyleBkp = _.clone(vm.getCoverStyle(vm.userProfile));\n // Close and clear data.\n vm.close();\n }, function () {\n Notification({message: 'Failed to update the profile'}, 'error');\n }).finally(function () {\n vm.isSavingBackgound = false;\n });\n };\n\n vm.getCoverStyle = function (profile) {\n var coverCss = {};\n // Reset vm defaults\n vm.defaults = {\n selectedColor: null,\n headlineColor: null,\n keepPattern: null,\n backgroundFile: null\n };\n // Set the user profile style from style config\n if (profile.profileConfiguration && profile.profileConfiguration.coverBackground) {\n // Start with the pattern as that has lower priority than the background file.\n if (profile.profileConfiguration.coverBackground.config && profile.profileConfiguration.coverBackground.config.keepPattern) {\n coverCss.backgroundImage = 'url(\"/images/user-profile-pattern.png\")';\n vm.defaults.keepPattern = true;\n }\n else {\n coverCss.backgroundImage = 'none';\n vm.defaults.keepPattern = false;\n }\n\n // Check if the user opted for his own background image or wants to use provided pattern or plain color. Color can be combined with both\n // so it's in separate 'if' statement.\n if (profile.profileConfiguration.coverBackground.imageToken) {\n coverCss.backgroundImage = 'url(\"' + configOptions.baseUrl + '/UserConfiguration/coverPicture/' + profile.profileConfiguration.coverBackground.imageToken + '\")';\n coverCss.backgroundPosition = 'center top';\n coverCss.backgroundSize = '1140px 215px';\n vm.defaults.backgroundFile = configOptions.baseUrl + '/UserConfiguration/coverPicture/' + profile.profileConfiguration.coverBackground.imageToken;\n }\n\n if (profile.profileConfiguration.coverBackground.config) {\n if (profile.profileConfiguration.coverBackground.config.backgroundColor) {\n coverCss.backgroundColor = profile.profileConfiguration.coverBackground.config.backgroundColor;\n coverCss.backgroundBlendMode = 'luminosity';\n vm.defaults.selectedColor = profile.profileConfiguration.coverBackground.config.backgroundColor;\n }\n if (profile.profileConfiguration.coverBackground.config.textColor) {\n vm.defaults.headlineColor = profile.profileConfiguration.coverBackground.config.textColor;\n }\n }\n }\n else {\n vm.defaults = _.clone(configDefaults);\n }\n return coverCss;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.profile.controller:PhotoUploadCtrl\n *\n * @description\n *\n */\n PhotoUploadCtrl.$inject = [\"$uibModalInstance\", \"Session\", \"photoFile\"];\n angular\n .module('account.profile')\n .controller('PhotoUploadCtrl', PhotoUploadCtrl);\n\n function PhotoUploadCtrl($uibModalInstance, Session, photoFile) {\n var vm = this;\n vm.photoFile = photoFile || '';\n vm.croppedDataUrl = '';\n vm.isLoading = false;\n\n vm.ok = function () {\n vm.isLoading = true;\n Session.updatePhoto(vm.croppedDataUrl)\n .then(function (userProfile) {\n $uibModalInstance.close({userProfile: userProfile});\n }, function () {\n vm.isLoading = true;\n });\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.preferences\n * @description\n *\n */\n angular\n .module('account.preferences', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.profile.controller:DeactivateModalCtrl\n *\n * @description\n *\n */\n DeactivateModalCtrl.$inject = [\"$rootScope\", \"$state\", \"$timeout\", \"$uibModalInstance\", \"Restangular\", \"Notification\", \"Auth\", \"userProfile\", \"Session\"];\n angular\n .module('account.preferences')\n .controller('DeactivateModalCtrl', DeactivateModalCtrl);\n\n function DeactivateModalCtrl($rootScope, $state, $timeout, $uibModalInstance, Restangular, Notification, Auth, userProfile, Session) {\n var vm = this;\n vm.isDeactivating = false;\n vm.isBusinessAccount = false;\n vm.timeOut = Auth.localSignoutTimeout + 10;\n vm.user = angular.copy(userProfile);\n\n if (vm.user && vm.user.isBusinessAccountActive) {\n vm.isBusinessAccount = true;\n }\n\n vm.data = {\n wholeAccount: !vm.isBusinessAccount,\n message: ''\n };\n\n vm.deactivate = function () {\n vm.isDeactivating = true;\n\n if (vm.data.wholeAccount) {\n Restangular.one('Users').customPUT({message: vm.data.feedback}, 'deactivate').then(function () {\n Notification({message: 'Deactivation was successful'}, 'confirmation');\n signOutAndRedirect('accountSignInUp.accountSignIn');\n }).catch(function () {\n Notification({message: 'Unable to deactivate your account, please try again or contact us.'}, 'error');\n $uibModalInstance.close();\n });\n }\n else {\n // Use the business deactivation api\n Restangular.one('BusinessAccount').customPUT({message: vm.data.feedback}, 'deactivate').then(function (result) {\n var profile = result.profile;\n profile.isBusinessAccountActive = result.isBusinessAccountActive;\n Session.create(profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n Notification({message: 'Deactivation was successful'}, 'confirmation');\n $state.go('dashboard');\n $uibModalInstance.close();\n }).catch(function () {\n Notification({message: 'Unable to deactivate your business account account, please try again or contact us.'}, 'error');\n $uibModalInstance.close();\n });\n }\n };\n\n function signOutAndRedirect(redirectTo) {\n Auth.signOut(false);\n\n // We have to do this in the timeout as the AUTH service uses timeout as well due to some rendering issues.\n $timeout(function () {\n $state.go(redirectTo);\n $uibModalInstance.close();\n }, vm.timeOut);\n }\n\n vm.close = function () {\n $uibModalInstance.close();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.preferences.controller:PreferencesCtrl\n *\n * @description\n *\n */\n PreferencesCtrl.$inject = [\"$uibModalInstance\", \"Session\", \"Notification\", \"Restangular\", \"FormAlerts\", \"userProfile\"];\n angular\n .module('account.preferences')\n .controller('PreferencesCtrl', PreferencesCtrl);\n\n function PreferencesCtrl($uibModalInstance, Session, Notification, Restangular, FormAlerts, userProfile) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isLoading = true;\n vm.isSaving = false;\n vm.userProfile = userProfile;\n vm.data = {\n mailingLists: {},\n marketplace: {}\n };\n\n vm.updatePreferences = function () {\n if (!vm.userProfile) {\n return;\n }\n if (vm.userProfile.preferences && vm.userProfile.preferences.mailingLists) {\n vm.data.mailingLists = vm.userProfile.preferences.mailingLists;\n }\n\n if (vm.userProfile.preferences && vm.userProfile.preferences.marketplace) {\n vm.data.marketplace = vm.userProfile.preferences.marketplace;\n }\n vm.dataBkp = angular.copy(vm.data);\n };\n\n vm.changeSettings = function (key, value) {\n var lastProperty = null;\n key = key.split('.');\n if (key.length === 1) {\n vm.data[key[0]] = value;\n }\n else {\n lastProperty = vm.data;\n angular.forEach(key, function (keyName, index, array) {\n if (index === array.length - 1) {\n // This is the last key in the list.\n lastProperty[keyName] = value;\n }\n else if (_.has(lastProperty, keyName)) {\n // Key already exists in the data\n lastProperty = lastProperty[keyName];\n }\n else {\n // There is no such key, create one.\n lastProperty = lastProperty[keyName] = {};\n }\n });\n }\n vm.hasChanges = !_.isEqual(vm.data, vm.dataBkp);\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.saveChanges = function () {\n vm.isSaving = true;\n vm.alerts.reset();\n Restangular.one('Preferences').customPUT(vm.data, 'index')\n .then(function (preferences) {\n if (preferences) {\n vm.userProfile.preferences = preferences.plain();\n Session.updateLocalUserProfile(vm.userProfile, false);\n }\n vm.isSaving = false;\n Notification({message: 'Success'}, 'confirmation');\n $uibModalInstance.close();\n }, function () {\n vm.isSaving = false;\n vm.alerts.add('danger', 'Unable to save the changes.');\n });\n };\n\n // init\n if (!vm.userProfile) {\n Session.getUserProfile().then(function (up) {\n vm.userProfile = up;\n vm.updatePreferences(vm.userProfile);\n });\n }\n else {\n vm.updatePreferences(vm.userProfile);\n }\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.preferences.controller:PreferencesCtrl\n *\n * @description\n *\n */\n MailingListUnsubscribeCtrl.$inject = [\"$scope\", \"$document\", \"AccountService\", \"Restangular\", \"$stateParams\"];\n angular\n .module('account.preferences')\n .controller('MailingListUnsubscribeCtrl', MailingListUnsubscribeCtrl);\n\n function MailingListUnsubscribeCtrl($scope, $document, AccountService, Restangular, $stateParams) {\n var vm = this;\n vm.isSaving = false;\n vm.isError = false;\n vm.isContactOpen = false;\n vm.data = {\n userId: $stateParams.userId,\n subscriptionId: $stateParams.subscriptionId\n };\n\n vm.saveChanges = function () {\n vm.isSaving = true;\n\n Restangular.one('Preferences').one('mailingListSubscription').remove(vm.data)\n .then(function () {\n vm.isSaving = false;\n }, function () {\n vm.isSaving = false;\n vm.isError = true;\n });\n };\n\n vm.openFeedback = function () {\n AccountService.openFeedback(null, true);\n };\n\n // init\n vm.saveChanges();\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.password\n * @description\n *\n */\n angular\n .module('account.password', [\n 'vcRecaptcha',\n 'validation.match'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.password.controller:ResetCtrl\n *\n * @description\n *\n */\n ResetCtrl.$inject = [\"$stateParams\", \"Restangular\", \"FormAlerts\"];\n angular\n .module('account.password')\n .controller('ResetCtrl', ResetCtrl);\n\n function ResetCtrl($stateParams, Restangular, FormAlerts) {\n var vm = this;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.showMessage = false;\n vm.isLoading = false;\n\n vm.reset = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Restangular.one('Users').customPUT({\n token: $stateParams.token,\n password: vm.data.password\n }, 'lostPassword')\n .then(function () {\n vm.showMessage = true;\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to reset');\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.password.controller:RecoverCtrl\n *\n * @description\n *\n */\n RecoverCtrl.$inject = [\"Restangular\", \"vcRecaptchaService\", \"FormAlerts\", \"configOptions\"];\n angular\n .module('account.password')\n .controller('RecoverCtrl', RecoverCtrl);\n\n function RecoverCtrl(Restangular, vcRecaptchaService, FormAlerts, configOptions) {\n var vm = this;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.reCaptchaSiteKey = configOptions.reCaptchaSiteKey;\n vm.showMessage = false;\n vm.isLoading = false;\n\n vm.recover = function () {\n var reCaptchaResponse;\n vm.alerts.reset();\n try {\n reCaptchaResponse = vcRecaptchaService.getResponse();\n }\n catch (err) {\n vcRecaptchaService.reload();\n vm.alerts.add('danger', 'Unable to verify that you are not a robot. Please try again');\n return;\n }\n\n vm.isLoading = true;\n Restangular.one('Users').post('lostPassword', {\n email: vm.data.email,\n reCaptchaResponse: reCaptchaResponse\n })\n .then(function () {\n vm.showMessage = true;\n }, function () {\n vm.isLoading = false;\n vcRecaptchaService.reload();\n vm.alerts.add('danger', 'Unable to recover');\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('account.password')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('accountPassword', {\n abstract: true,\n url: '/account/password',\n template: '',\n data: {\n classNames: 'no-help'\n }\n })\n .state('accountPassword.recover', {\n url: '/recover',\n templateUrl: 'account/password/recover.tpl.html',\n controller: 'RecoverCtrl',\n controllerAs: 'recoverCtrl'\n })\n .state('accountPassword.reset', {\n url: '/reset/{token}',\n templateUrl: 'account/password/reset.tpl.html',\n controller: 'ResetCtrl',\n controllerAs: 'resetCtrl'\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.feedback\n * @description\n *\n */\n angular\n .module('account.feedback', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.feedback.controller:FeedbackCtrl\n *\n * @description\n *\n */\n FeedbackCtrl.$inject = [\"$window\", \"$uibModalInstance\", \"Notification\", \"Restangular\", \"Session\", \"FormAlerts\", \"userProfile\", \"helpRequired\", \"configOptions\"];\n angular\n .module('account.feedback')\n .controller('FeedbackCtrl', FeedbackCtrl);\n\n function FeedbackCtrl($window, $uibModalInstance, Notification, Restangular, Session, FormAlerts, userProfile, helpRequired, configOptions) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isSending = false;\n vm.userProfile = userProfile;\n vm.isHelpRequired = helpRequired;\n vm.data = {\n appVersion: configOptions.appVersion,\n isMobileApp: $window.navigator.userAgent.indexOf('gonative') > -1 ? true : false,\n navigatorInfo: $window.navigator.userAgent,\n url: $window.document.location.href,\n feedback: null,\n name: null,\n email: null\n };\n\n vm.updateUserData = function () {\n // vm.userProfile should be available here at the time this is triggered.\n vm.data.name = vm.userProfile.fullName;\n vm.data.email = vm.userProfile.email;\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.send = function () {\n vm.isSending = true;\n vm.alerts.reset();\n Restangular.one('Feedback').post('index', vm.data)\n .then(function () {\n vm.isSaving = false;\n Notification({message: 'Success'}, 'confirmation');\n $uibModalInstance.close();\n }, function () {\n vm.isSaving = false;\n vm.alerts.add('danger', 'Unable to save the changes.');\n });\n };\n\n // User Profile can be provided as the uibModal (or route) resolve. If it's missing, we can always try to get the user from the session.\n if (angular.isUndefined(vm.userProfile) || vm.userProfile === null) {\n Session.getUserProfile().then(function (up) {\n vm.userProfile = up;\n if (vm.userProfile) {\n vm.updateUserData();\n }\n });\n }\n else {\n vm.updateUserData();\n }\n\n // Connect to the event of once the modal instance has rendered and apply focus to the textarea\n $uibModalInstance.rendered.then(function () {\n angular.element('#details')[0].focus();\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.earnings\n * @description\n *\n */\n angular\n .module('account.earnings', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.earnings.controller:WithdrawCtrl\n *\n * @description\n *\n */\n WithdrawCtrl.$inject = [\"$state\", \"Restangular\", \"Notification\", \"FormAlerts\", \"earnings\", \"userProfile\", \"Charities\"];\n angular\n .module('account.earnings')\n .controller('WithdrawCtrl', WithdrawCtrl);\n\n function WithdrawCtrl($state, Restangular, Notification, FormAlerts, earnings, userProfile, Charities) {\n var vm = this;\n vm.isLoading = false;\n vm.showTotal = false;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.minLimit = earnings.minimumWithdrawLimit;\n vm.balance = earnings.actualEarnings;\n vm.processingFee = 0;\n vm.remainingBalance = 0;\n vm.receivedAmount = 0;\n vm.alerts = new FormAlerts();\n vm.data = {\n amount: null,\n accountHolder: userProfile.bankAccountName,\n accountBsb: userProfile.bankCodeDomestic,\n accountNumber: userProfile.bankAccountNumberDomestic\n };\n\n vm.calculate = function () {\n vm.showTotal = true;\n };\n\n vm.cancel = function () {\n $state.go('account.earnings');\n };\n\n vm.onAmountChange = function () {\n vm.showTotal = false;\n vm.calculationRequired = true;\n };\n\n vm.calculate = function () {\n if (vm.data.amount > 0 && vm.data.amount >= earnings.minimumWithdrawLimit && vm.data.amount <= earnings.actualEarnings) {\n vm.calculating = true;\n Restangular.one('Withdrawals').one('calculateWithdrawalFees').get({\n amount: vm.data.amount\n })\n .then(function (result) {\n vm.processingFee = result.fees;\n vm.receivedAmount = result.amountLessFees;\n vm.remainingBalance = result.remainingBalance;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.showTotal = true;\n });\n }\n };\n\n vm.withdraw = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Withdrawals').post('index', vm.data)\n .then(function () {\n userProfile.bankAccountName = vm.data.accountHolder;\n userProfile.bankCodeDomestic = vm.data.accountBsb;\n userProfile.bankAccountNumberDomestic = vm.data.accountNumber;\n $state.go('account.earnings');\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to withdraw');\n });\n };\n\n vm.donate = function () {\n Charities.openDonate();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('account.earnings')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('account.earnings', angular.extend({}, configOptions.defaultStateParams, {\n url: '/earnings',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('account', 'earnings');\n }]\n }))\n .state('accountEarningsWithdraw', angular.extend({}, configOptions.defaultStateParams, {\n url: '/account/earnings/withdraw',\n templateUrl: 'account/earnings/withdraw.tpl.html',\n controller: 'WithdrawCtrl',\n controllerAs: 'withdraw',\n resolve: {\n earnings: ['Restangular', function (Restangular) {\n return Restangular.one('Earnings').one('summaries').get()\n .then(function (result) {\n return result.plain();\n });\n }],\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n }\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.earnings.controller:EarningsCtrl\n *\n * @description\n *\n */\n EarningsCtrl.$inject = [\"$state\", \"Restangular\", \"DataTable\", \"Leads\"];\n angular\n .module('account.earnings')\n .controller('EarningsCtrl', EarningsCtrl);\n\n function EarningsCtrl($state, Restangular, DataTable, Leads) {\n var vm = this;\n vm.summaries = {};\n vm.ranges = {\n all: 'Show all',\n lastMonth: 'Last month',\n lastYear: 'Last year'\n };\n vm.selectedRange = 'all';\n vm.selectedRangeLabel = 'Show all';\n vm.list = DataTable.create('Earnings', 'index');\n vm.withdrawalsList = DataTable.create('Withdrawals', 'index');\n vm.isLoadingSummaries = true;\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Earnings',\n value: 'earnings'\n },\n {\n label: 'Withdrawals',\n value: 'withdrawals'\n }\n ];\n\n Restangular.one('Earnings').one('summaries').get()\n .then(function (result) {\n vm.summaries = result.plain();\n vm.isLoadingSummaries = false;\n }, function () {\n vm.isLoadingSummaries = false;\n });\n\n vm.selectRange = function (range) {\n vm.selectedRange = range;\n vm.selectedRangeLabel = vm.ranges[range];\n vm.list.reload({\n dateRange: range\n });\n };\n\n vm.viewLastMonthEarnings = function () {\n vm.tabManager.openTab('earnings');\n vm.selectRange('lastMonth');\n };\n\n vm.viewAllEarnings = function () {\n vm.tabManager.openTab('earnings');\n vm.selectRange('all');\n };\n\n vm.withdraw = function () {\n $state.go('accountEarningsWithdraw');\n };\n\n vm.openLead = function ($index) {\n var earning = vm.list.getRecords()[$index];\n if (!isNaN(earning.idLead) && parseInt(earning.idLead, 10) > 0) {\n Leads.openDetailById(earning.idLead, 'sent');\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.billing\n * @description\n *\n */\n angular\n .module('account.billing', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.billing.controller:CreditCardCtrl\n *\n * @description\n *\n */\n CreditCardCtrl.$inject = [\"Restangular\", \"$uibModalInstance\", \"CreditCardUtil\", \"Session\", \"operation\"];\n angular\n .module('account.billing')\n .controller('CreditCardCtrl', CreditCardCtrl);\n\n function CreditCardCtrl(Restangular, $uibModalInstance, CreditCardUtil, Session, operation) {\n var\n vm = this;\n vm.isLoading = false;\n vm.months = CreditCardUtil.getExpiryMonths();\n vm.years = CreditCardUtil.getExpiryYears();\n vm.cards = CreditCardUtil.getAcceptedCards();\n vm.data = {};\n\n vm.isAdd = function () {\n return operation === 'add';\n };\n\n vm.ok = function () {\n vm.isLoading = true;\n Restangular.one('Billing').customPUT(vm.data, 'creditCard')\n .then(function (result) {\n Session.updateLocalUserProfile({isCCSet: true});\n $uibModalInstance.close({creditCard: result.plain()});\n }, function () {\n vm.isLoading = false;\n });\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('account.billing')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('account.billing', angular.extend({}, configOptions.defaultStateParams, {\n url: '/billing',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('account', 'billing');\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.billing.controller:BillingCtrl\n *\n * @description\n *\n */\n BillingCtrl.$inject = [\"$document\", \"Restangular\", \"$uibModal\", \"Notification\", \"Session\", \"DataTable\"];\n angular\n .module('account.billing')\n .controller('BillingCtrl', BillingCtrl);\n\n function BillingCtrl($document, Restangular, $uibModal, Notification, Session, DataTable) {\n var vm = this;\n vm.initialisingCard = true;\n vm.cardLoading = false;\n vm.invoicesExist = true;\n vm.creditCard = null;\n vm.invoices = DataTable.create('Invoices', 'index', {}, {\n itemCallback: function (item) {\n item.downloadUrl = '/Invoices/download?id=' + item.idInvoice;\n return item;\n }\n });\n\n Restangular.one('Billing').one('creditCard').get()\n .then(function (creditCard) {\n if (angular.isObject(creditCard) && angular.isDefined(creditCard.number)) {\n vm.creditCard = creditCard.plain();\n }\n vm.initialisingCard = false;\n }, function () {\n vm.initialisingCard = false;\n });\n\n vm.manageCreditCard = function (operation) {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].getElementById('billing-ctrl-container')),\n templateUrl: 'account/billing/credit-card.tpl.html',\n controller: 'CreditCardCtrl',\n controllerAs: 'creditCard',\n size: 'lg',\n windowClass: 'modal-credit-card',\n resolve: {\n operation: function () {\n return operation;\n }\n }\n });\n\n modalInstance.result.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.creditCard) && angular.isDefined(result.creditCard.number)) {\n vm.creditCard = result.creditCard;\n Session.updateLocalUserProfile({isCCSet: true});\n Notification({message: 'Your credit card details have been successfully updated'}, 'confirmation');\n }\n });\n };\n\n vm.removeCreditCard = function () {\n vm.cardLoading = true;\n Restangular.one('Billing').one('creditCard').remove()\n .then(function () {\n vm.creditCard = null;\n vm.cardLoading = false;\n Session.updateLocalUserProfile({isCCSet: false});\n Notification({message: 'Your credit card details have been removed'}, 'confirmation');\n }, function () {\n vm.cardLoading = false;\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user\n * @description\n *\n */\n angular\n .module('user', [\n 'ui.router',\n 'user.leads',\n 'user.agreements',\n 'user.connections',\n 'user.marketplace',\n 'user.messages'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('user')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user', {\n url: '/user/{id}',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n authenticate: true,\n params: {\n isInvite: false\n },\n resolve: {\n userProfile: ['Restangular', '$stateParams', 'Auth', function (Restangular, $stateParams, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Users').one('profile').get({id: $stateParams.id})\n .then(function (profile) {\n return profile.plain();\n });\n }\n return null;\n }, function () {\n return null;\n });\n }],\n agreementsDetails: ['Restangular', '$stateParams', 'Auth', function (Restangular, $stateParams, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Contracts').one('index').get({idUser: $stateParams.id})\n .then(function (agreements) {\n return agreements.plain();\n });\n }\n return null;\n }, function () {\n return null;\n });\n }],\n myProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n },\n onEnter: ['$state', '$stateParams', 'userProfile', 'myProfile', function ($state, $stateParams, userProfile, myProfile) {\n if (userProfile && myProfile && userProfile.id === myProfile.id) {\n $state.go('dashboard');\n }\n else if ($stateParams.isInvite) {\n if (userProfile.marketplace && angular.isArray(userProfile.marketplace) && userProfile.marketplace.length > 0) {\n $state.go('user.marketplace', {id: userProfile.id});\n }\n else {\n $state.go('user.agreements', {id: userProfile.id});\n }\n }\n }]\n })\n .state('user.about', angular.extend({}, configOptions.defaultStateParams, {\n url: '/about',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['$state', 'RouterHelper', 'userProfile', function ($state, RouterHelper, userProfile) {\n if (!userProfile.description) {\n $state.go('user.agreements', {id: userProfile.id});\n }\n else {\n RouterHelper.activateTab('user', 'about');\n }\n }]\n }))\n .state('userJoin', {\n url: '/user/{id}/join',\n authenticate: true,\n onEnter: ['$state', '$stateParams', 'MyPod', 'Notification', function ($state, $stateParams, MyPod, Notification) {\n MyPod.quickJoin($stateParams.id).then(function () {\n Notification({message: 'Success'}, 'confirmation');\n $state.go('user.agreements', {id: $stateParams.id});\n }, function (err) {\n Notification({message: 'The registration was unsuccessful.'}, 'error');\n $state.go('dashboard', {id: $stateParams.id});\n throw new Error(err);\n });\n }]\n })\n .state('userInvitation', angular.extend({}, configOptions.defaultStateParams, {\n url: '/invitation/{token}',\n resolve: {\n invitation: ['Restangular', '$state', '$stateParams', 'Auth', '$q', function (Restangular, $state, $stateParams, Auth, $q) {\n var deferred = $q.defer();\n Restangular.one('Invitations').one('detail').get({token: $stateParams.token})\n .then(function (invitation) {\n Auth.isAuthenticated()\n .then(function (isAuthenticated) {\n if (isAuthenticated) {\n deferred.resolve(invitation.plain());\n }\n else if (invitation.isRegistered) {\n $state.go('accountSignInUp.accountSignIn', {invitationToken: $stateParams.token});\n }\n else {\n $state.go('accountSignInUp.accountSignUp', {invitationToken: $stateParams.token});\n }\n }, function () {\n if (invitation.isRegistered) {\n $state.go('accountSignInUp.accountSignIn', {invitationToken: $stateParams.token});\n }\n else {\n $state.go('accountSignInUp.accountSignUp', {invitationToken: $stateParams.token});\n }\n });\n }, function () {\n Auth.signOut();\n $state.go('accountSignInUp.accountSignIn', {invitationToken: $stateParams.token});\n });\n\n return deferred.promise;\n }]\n },\n onEnter: ['$state', 'invitation', function ($state, invitation) {\n if (angular.isObject(invitation) && angular.isDefined(invitation.idUserSender)) {\n $state.go('user.agreements', {id: invitation.idUserSender});\n }\n else {\n $state.go('dashboard');\n }\n }]\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.controller:UserCtrl\n *\n * @description\n *\n */\n UserCtrl.$inject = [\"$window\", \"$rootScope\", \"$scope\", \"$stateParams\", \"configOptions\", \"Restangular\", \"userProfile\", \"agreementsDetails\", \"myProfile\", \"DataTable\", \"Leads\", \"MyPod\", \"Charities\"];\n angular\n .module('user')\n .controller('UserCtrl', UserCtrl);\n\n function UserCtrl($window, $rootScope, $scope, $stateParams, configOptions, Restangular, userProfile, agreementsDetails, myProfile, DataTable, Leads, MyPod, Charities) {\n var vm = this,\n tabs = ['sentLeads', 'receivedLeads', 'agreements', 'connections', 'marketplace', 'messages'];\n\n vm.isMobile = $window.innerWidth < 768;\n vm.detailsVisible = false;\n vm.userProfile = userProfile;\n vm.myProfile = myProfile;\n vm.agreementsDetails = agreementsDetails;\n vm.eventHandler = null;\n\n // Set the tabs. The About tab's visibility is dynamic and depends on its content\n if (vm.userProfile.description) {\n tabs.unshift('about');\n }\n\n vm.isBusinessAccountActive = function () {\n return angular.isDefined(myProfile.isBusinessAccountActive) && myProfile.isBusinessAccountActive === true;\n };\n\n // Check if this user is the business entity (is registered as the business in MLP)\n // FYI: connectionsList == directoryList, we are keeping the same name in the code (connections) as it was originally planned, but all the UI will display \"Directory\" instead\n if (vm.userProfile.isBusinessAccountActive === true) {\n vm.connectionsList = DataTable.create('Members', 'index', {}, {\n basicParams: {\n idUser: vm.userProfile.id\n }\n });\n }\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'About',\n value: 'about',\n url: 'user.about',\n condition: function () {\n return vm.userProfile.description;\n }\n },\n {\n label: 'Sent Leads',\n value: 'sentLeads',\n url: 'user.sentLeads',\n condition: function () {\n return vm.userProfile.isBusinessAccountActive;\n }\n },\n {\n label: 'Received Leads',\n value: 'receivedLeads',\n url: 'user.receivedLeads',\n condition: function () {\n return vm.isBusinessAccountActive();\n }\n },\n {\n label: 'Agreements',\n value: 'agreements',\n url: 'user.agreements',\n condition: function () {\n return true;\n }\n },\n {\n label: 'Messages',\n value: 'messages',\n url: 'user.messages',\n condition: function () {\n return vm.userProfile.acceptedReceiveLeadsContractExists || vm.userProfile.acceptedSendLeadsContractExists;\n }\n },\n {\n label: vm.userProfile.firstName + '\\'s Directory',\n value: 'connections',\n url: 'user.connections',\n condition: function () {\n return vm.userProfile.isBusinessAccountActive;\n },\n template: '({{tab.data.connectionsList.totalRecords()}})',\n data: {\n userProfile: vm.userProfile,\n connectionsList: vm.connectionsList\n }\n },\n {\n label: 'Marketplace',\n value: 'marketplace',\n url: 'user.marketplace',\n condition: function () {\n return vm.userProfile.marketplace && vm.userProfile.marketplace.length;\n },\n template: '({{tab.data.marketplace.length}})',\n data: {\n userProfile: vm.userProfile,\n marketplace: vm.userProfile.marketplace\n }\n }\n ];\n\n vm.toggleDetails = function () {\n vm.detailsVisible = !vm.detailsVisible;\n };\n\n vm.moreDetailsExist = function () {\n var nonEmptyDetails = 0;\n if (vm.getAddress()) {\n nonEmptyDetails++;\n }\n if (vm.userProfile.phoneMobile) {\n nonEmptyDetails++;\n }\n if (vm.userProfile.email) {\n nonEmptyDetails++;\n }\n if (vm.userProfile.website) {\n nonEmptyDetails++;\n }\n\n return nonEmptyDetails > 1;\n };\n\n vm.getAddress = function () {\n var addressParts = [];\n if (vm.userProfile.suburb) {\n addressParts.push(vm.userProfile.suburb);\n }\n if (vm.userProfile.state) {\n addressParts.push(vm.userProfile.state);\n }\n if (vm.userProfile.country) {\n addressParts.push(vm.userProfile.country);\n }\n\n vm.addressLink = vm.userProfile.addressPostal && vm.userProfile.addressPostal.addressPostal ? vm.userProfile.addressPostal.addressPostal + ', ' + addressParts.join(', ') : addressParts.join(', ');\n return addressParts.join(', ');\n };\n\n vm.formatWebsiteUrl = function () {\n var url = '';\n if (angular.isDefined(vm.userProfile) && angular.isString(vm.userProfile.website)) {\n url = vm.userProfile.website;\n if (url !== '') {\n if ((url.slice(0, 4)).toLowerCase() !== 'http') {\n url = 'http://' + vm.userProfile.website;\n }\n }\n }\n\n return url;\n };\n\n vm.sendLead = function () {\n Leads.openSendLead(vm.userProfile, false);\n };\n\n vm.registerLead = function () {\n Leads.openSendLead(vm.userProfile, true);\n };\n\n vm.sendInvite = function () {\n var uibModal = MyPod.openSendInvite(vm.myProfile, vm.userProfile);\n uibModal.then(function (sendLeads) {\n vm.agreementsDetails.sendLeads = sendLeads;\n });\n };\n\n vm.donate = function () {\n if (vm.userProfile.isCharityAccountActive) {\n Charities.openDonate(vm.userProfile);\n }\n };\n\n vm.reloadProfile = function () {\n Restangular.one('Users').one('profile').get({id: $stateParams.id})\n .then(function (profile) {\n vm.userProfile = profile.plain();\n });\n };\n\n vm.getCoverStyle = function () {\n var coverCss = {};\n // Set the user profile style from style config\n if (vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground) {\n // Check if the user opted for his own background image or wants to use provided pattern or plain color. Color can be combined with both\n // so it's in separate 'if' statement.\n if (vm.userProfile.profileConfiguration.coverBackground.imageToken) {\n coverCss.backgroundImage = 'url(\"' + configOptions.baseUrl + '/UserConfiguration/coverPicture/' + vm.userProfile.profileConfiguration.coverBackground.imageToken + '\")';\n coverCss.backgroundPosition = 'center top';\n coverCss.backgroundSize = '1140px 215px';\n }\n else if (vm.userProfile.profileConfiguration.coverBackground.config && vm.userProfile.profileConfiguration.coverBackground.config.keepPattern) {\n coverCss.backgroundImage = 'url(\"/images/user-profile-pattern.png\")';\n }\n else {\n coverCss.backgroundImage = 'none';\n }\n\n if (vm.userProfile.profileConfiguration.coverBackground.config) {\n if (vm.userProfile.profileConfiguration.coverBackground.config.backgroundColor) {\n coverCss.backgroundColor = vm.userProfile.profileConfiguration.coverBackground.config.backgroundColor;\n coverCss.backgroundBlendMode = 'luminosity';\n }\n }\n return coverCss;\n }\n };\n\n vm.getHeadlineStyle = function () {\n var textCss = {};\n // Set the user profile style from style config\n if (vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground && vm.userProfile.profileConfiguration.coverBackground.config) {\n textCss.color = vm.userProfile.profileConfiguration.coverBackground.config.textColor || 'inherit';\n }\n return textCss;\n };\n\n vm.isCustomBackground = function () {\n return vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground && vm.userProfile.profileConfiguration.coverBackground.imageToken ||\n vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground && vm.userProfile.profileConfiguration.coverBackground.config && !vm.userProfile.profileConfiguration.coverBackground.config.keepPattern;\n };\n\n vm.eventHandler = $rootScope.$on('event:user-agreements-updated', function () {\n vm.reloadProfile();\n });\n vm.stateHandler = $rootScope.$on('close-modal-instance', function () {\n vm.detailsVisible = false;\n });\n $rootScope.$on('$destroy', vm.eventHandler);\n $rootScope.$on('$destroy', vm.stateHandler);\n\n angular.element($window).on('resize', function () {\n vm.isMobile = $window.innerWidth < 768;\n $scope.$apply();\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name user.directive:userAvatar\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('user')\n .directive('userAvatar', userAvatar);\n\n function userAvatar() {\n return {\n restrict: 'EA',\n scope: {\n user: '=user',\n size: '@',\n isLink: '@',\n fixedSize: '@'\n },\n templateUrl: 'user/user-avatar-directive.tpl.html',\n replace: true,\n controllerAs: 'userAvatar',\n controller: ['$scope', 'configOptions', function ($scope, configOptions) {\n var vm = this;\n if ($scope.isLink !== 'true') {\n vm.isLink = false;\n }\n else {\n vm.isLink = true;\n }\n if ($scope.size !== 'small' && $scope.size !== 'large') {\n $scope.size = 'small';\n }\n\n vm.isSmall = function () {\n return $scope.size === 'small';\n };\n\n if ($scope.user) {\n vm.idUser = $scope.user.id;\n vm.initials = $scope.user.firstName.trim().charAt(0);\n }\n else {\n return;\n }\n\n vm.isImage = function () {\n return !!$scope.user.imageToken;\n };\n\n vm.isFixedSize = function () {\n return $scope.fixedSize === 'true';\n };\n\n vm.getStyle = function () {\n var size = vm.isSmall() ? 44 : 120,\n avatarUrl;\n if ($scope.user.imageToken) {\n avatarUrl = configOptions.baseUrl + '/Users/photo/' + $scope.user.imageToken + '?w=' + size + '&h=' + size;\n return {\n 'background-image': 'url(' + avatarUrl + ')'\n };\n }\n\n return {\n 'background-color': $scope.user.color\n };\n };\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.controller:AboutCtrl\n *\n * @description\n *\n */\n AboutCtrl.$inject = [\"$scope\"];\n angular\n .module('user')\n .controller('AboutCtrl', AboutCtrl);\n\n function AboutCtrl($scope) {\n var vm = this;\n vm.userProfile = $scope.user.userProfile;\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlp-notifications\n * @description\n *\n */\n angular\n .module('mlp-notifications', []);\n}());\n\n// jscs:disable requireCamelCaseOrUpperCaseIdentifiers\n/* eslint-disable camelcase */\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlpNotifications.provider:OneSignal\n *\n * @description\n *\n */\n angular\n .module('mlp-notifications')\n .provider('OneSignal', OneSignalProvider);\n\n function OneSignalProvider() {\n var appId,\n safariWebId,\n isLoaded = false,\n OneSignal,\n userIdPromise,\n userId,\n isApp;\n\n return {\n init: function (applicationId, webId) {\n appId = applicationId;\n safariWebId = webId;\n },\n $get: ['$window', '$document', '$http', '$q', 'Restangular', 'Auth', function ($window, $document, $http, $q, Restangular, Auth) {\n var oneSignalApi = $q.defer(),\n scriptElement;\n\n function init() {\n OneSignal = $window.OneSignal;\n if (!OneSignal) {\n OneSignal = $window.OneSignal = [];\n }\n\n // Initialise\n OneSignal.push(['init', {\n appId: appId,\n safari_web_id: safariWebId,\n autoRegister: true,\n notificationClickHandlerMatch: 'origin',\n notifyButton: {\n enable: false\n }\n }]);\n\n // Occurs when the user's subscription changes to a new value.\n OneSignal.push(function () {\n OneSignal.on('subscriptionChange', function (isSubscribed) {\n if (isSubscribed) {\n OneSignal.getUserId().then(function (playerId) {\n userId = playerId;\n if (userIdPromise) {\n userIdPromise.resolve(userId);\n }\n Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n Restangular.one('Users').customPOST(null, 'pushNotifications', {\n oneSignalPlayerId: playerId\n });\n }\n });\n });\n }\n else {\n userId = null;\n }\n });\n });\n\n // Get UserId\n OneSignal.push(function () {\n OneSignal.getUserId().then(function (osUserId) {\n userId = osUserId;\n if (userIdPromise) {\n userIdPromise.resolve(userId);\n }\n });\n });\n\n // Resolve the api (everything is ready and initialized)\n oneSignalApi.resolve();\n }\n\n isApp = $window.navigator.userAgent.indexOf('gonative') > -1;\n userIdPromise = $q.defer();\n\n if (isApp) {\n $window.gonative_onesignal_info = function (info) {\n userIdPromise.resolve(info.oneSignalUserId);\n userId = info.oneSignalUserId;\n };\n oneSignalApi.resolve();\n isLoaded = true;\n }\n else if (!isLoaded) {\n scriptElement = $document[0].createElement('script');\n scriptElement.setAttribute('async', 'async');\n scriptElement.onload = init;\n $document[0].body.appendChild(scriptElement);\n scriptElement.src = 'https://cdn.onesignal.com/sdks/OneSignalSDK.js';\n isLoaded = true;\n }\n else {\n oneSignalApi.resolve();\n }\n\n oneSignalApi.isLoaded = function () {\n return isLoaded;\n };\n\n oneSignalApi.getUserId = function () {\n return userIdPromise.promise;\n };\n\n return oneSignalApi;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpNotifications.directive:notificationSwipeItem\n * @restrict E\n * @element\n */\n notificationSwipeItem.$inject = [\"$swipe\"];\n angular\n .module('mlp-notifications')\n .directive('notificationSwipeItem', notificationSwipeItem);\n\n function notificationSwipeItem($swipe) {\n return {\n restrict: 'AE',\n scope: {\n onSwipeDone: '&',\n onSwiping: '&',\n onSwipeCancel: '&',\n onClick: '&'\n },\n link: function (scope, el, attrs) {\n var id = Number(attrs.notificationId),\n startX = 0,\n dx = 0,\n isMoving;\n\n function reset() {\n // Reset;\n startX = 0;\n dx = 0;\n isMoving = false;\n }\n\n function onStart(coords, event) {\n startX = coords.x;\n\n el.css({\n transition: 'none'\n });\n console.log('onStart:', id, isMoving, event.type);\n if (isMoving) {\n onCancel(event);\n }\n else {\n isMoving = true;\n }\n }\n\n function onMove(coords) {\n dx = coords.x - startX;\n isMoving = true;\n // alter the position now.\n el.css({\n transform: 'translateX(' + dx + 'px)'\n });\n scope.onSwiping({deltaX: dx});\n }\n\n function onEnd(coords, event) {\n var absDx = Math.abs(coords.x - startX),\n preventMouseUp = false;\n\n if (!isMoving) {\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n\n if (absDx >= 0 && absDx < 5) {\n // This is considered as accidental swipe. don't prevent the mouseup. Return the element slowly back\n el.css({\n transform: 'translateX(0px)',\n transition: 'transform 0.2s ease-in-out'\n });\n el.slideUp(200, function () {\n scope.onClick({id: id});\n });\n }\n else if (absDx > 0 && absDx < 50) {\n // This is considered as unfinished swipe. prevent the mouseup but don't clear the notification\n preventMouseUp = true;\n el.css({\n transform: 'translateX(0px)',\n transition: 'transform 0.2s ease-in-out'\n });\n scope.onSwipeCancel({id: id});\n }\n else {\n // This is finished swipe and the notification should be cleared. Prevent mouseup\n preventMouseUp = true;\n el.css({\n transform: 'translateX(' + (coords.x - startX < 0 ? '-1000' : '1000') + 'px)',\n transition: 'transform 0.3s ease-in-out'\n });\n el.slideUp(200);\n scope.onSwipeDone({id: id});\n }\n if (preventMouseUp) {\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n }\n\n reset();\n }\n\n function onCancel(event) {\n // This is considered as unfinished swipe. prevent the mouseup but don't clear the notification\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n\n el.css({\n transform: 'translateX(0px)',\n transition: 'transform 0.2s ease-in-out'\n });\n scope.onSwipeCancel({id: id});\n reset();\n }\n\n $swipe.bind(el, {\n start: onStart,\n move: onMove,\n end: onEnd,\n cancel: onCancel\n }, ['mouse', 'touch']);\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlpNotifications.constant:notificationConst\n *\n * @description\n *\n */\n angular\n .module('mlp-notifications')\n .constant('notificationConst', {\n categoryMessages: 'messages',\n categoryLeads: 'leads',\n typeDirectMessage: 'direct message',\n typeLeadMessage: 'lead message',\n typeNewLead: 'new lead'\n });\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpNotifications.directive:notificationCenter\n * @restrict E\n * @element\n */\n notificationCenter.$inject = [\"$rootScope\", \"$timeout\", \"$sce\", \"$state\", \"Cache\", \"Restangular\", \"notificationConst\", \"Leads\"];\n angular\n .module('mlp-notifications')\n .directive('notificationCenter', notificationCenter);\n\n function notificationCenter($rootScope, $timeout, $sce, $state, Cache, Restangular, notificationConst, Leads) {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n isLink: '=?',\n descriptionKey: '=?',\n stopPropagation: '=?',\n hasDetails: '=?',\n nameOnly: '=?',\n addClass: '='\n },\n replace: true,\n transclude: false,\n templateUrl: 'notifications/notification-center-directive.tpl.html',\n controllerAs: 'nc',\n controller: ['$scope', function ($scope) {\n var watchHandeNewNotification,\n watchHandleClearNotification,\n scope = this,\n cache = Cache.create('notification-centre-help');\n\n scope.notificationsBkp = [];\n scope.notifications = [];\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.displayHelp = false;\n\n scope.filterCategories = [\n {name: 'All', value: 'all'},\n {name: 'Leads', value: 'leads', iconClass: 'fa-paper-plane'},\n {name: 'Messages', value: 'messages', iconClass: 'fa-envelope'}\n ];\n\n // Check if the help was dismissed\n if (!cache.get('helpDismissed')) {\n scope.displayHelp = true;\n }\n\n // to be replaced with data from api\n scope.notificationsData = [];\n\n function generateNotifications(data) {\n var foundCategories = [],\n now = (new Date()).getTime(),\n hasMore = false;\n\n // Alter data\n _.each(data, function (item) {\n // First. Insert the icon-class of the category.\n if (item && item.category && _.find(scope.filterCategories, {value: item.category})) {\n // Icon class\n item.iconClass = _.find(scope.filterCategories, {value: item.category}).iconClass;\n }\n else {\n item.iconClass = 'fa-stop';\n }\n\n // Check if the category is lead. Then change the value to lead url\n if (item && item.category && item.category === 'leads') {\n // item.value = $sce.trustAsHtml('View Lead');\n item.description = 'sent you new lead';\n }\n\n if (item && item.category && item.category === 'messages') {\n hasMore = item && item.count && item.count > 1;\n item.description = hasMore ? 'sent you new ' : 'sent you a new ';\n if (item.data && item.data.leadId) {\n item.description += 'lead ';\n }\n item.description += hasMore ? ' messages [' + item.count + ']' : 'message';\n }\n\n // Format time\n item.timeFormatted = scope.getFormattedTime(now - (new Date(item.time)).getTime());\n\n // Add the category from the item\n foundCategories.push(item.category);\n });\n\n // Clear all categories first\n _.each(scope.filterCategories, function (category) {\n category.hasResults = false;\n });\n\n // Now check the categories\n if (scope.filterCategories && scope.filterCategories.length > 0) {\n // Make the values unique\n foundCategories = _.uniq(foundCategories);\n // Now loop through each category and apply the badge\n angular.forEach(foundCategories, function (category) {\n _.find(scope.filterCategories, {value: category}).hasResults = true;\n });\n }\n\n scope.notificationsBkp = _.clone(data);\n filterNotifications();\n scope.notify();\n\n // Sometimes we have problem with refreshing the DOM.\n $timeout(function () {\n $scope.$apply();\n }, 100);\n }\n\n function filterNotifications(category) {\n var fresults = [];\n\n if (!category && scope.selectedCategories.lastIndexOf('all') > -1 || category === 'all') {\n scope.notifications = _.clone(scope.notificationsBkp);\n return;\n }\n\n if (!category) {\n return;\n }\n\n angular.forEach(scope.notificationsBkp, function (n) {\n if (_.contains(scope.selectedCategories, n.category)) {\n fresults.push(n);\n }\n });\n scope.notifications = fresults;\n }\n\n /**\n * Mark all notifications as read using API\n */\n scope.markRead = function () {\n scope.notifications = [];\n scope.notificationsBkp = [];\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.notify();\n };\n\n scope.notify = function () {\n $rootScope.$broadcast('event:notifications-status', {\n hasNotifications: scope.notifications.length > 0,\n count: scope.notifications.length > 10 ? '+' : scope.notifications.length\n });\n };\n\n /**\n * Clear all notifications\n */\n scope.clearNotifications = function () {\n return;\n };\n\n scope.openNotification = function (item) {\n // Based on the category do what is required\n if (!item) {\n return;\n }\n\n // This is the new lead notification. Only received leads will be visible in NC\n if (item.category && item.category === notificationConst.categoryLeads) {\n Leads.openDetail(item.data.leadId, 'received');\n }\n\n // This is the message within the lead as it contains the lead id in data property\n if (item.category && item.category === notificationConst.categoryMessages && item.data && item.data.leadId) {\n Leads.openDetail(item.data.leadId, 'received', null, 'messages');\n }\n\n // This is the direct message. Open the user profile at the messages tab\n if (item.category && item.category === notificationConst.categoryMessages && item.userId && !item.data) {\n $state.go('user.messages', {id: item.userId}, {reload: true});\n }\n\n scope.clearNotification(item);\n generateNotifications(scope.notificationsData);\n };\n\n scope.openNotificationById = function (id) {\n var item = _.find(scope.notifications, {id: id});\n if (item) {\n scope.openNotification(item);\n }\n };\n\n scope.clearNotification = function (item) {\n var category,\n userId,\n type,\n data,\n filtered;\n\n // Clear the items from the same user within the same category ...\n if (!item || !item.category || !item.userId || !item.type) {\n return;\n }\n category = item.category;\n userId = item.userId;\n type = item.type;\n data = item.data;\n\n if (data) {\n filtered = _.where(scope.notificationsData, {\n category: category,\n userId: userId,\n type: type,\n data: data\n });\n }\n else {\n filtered = _.where(scope.notificationsData, {\n category: category,\n userId: userId,\n type: type\n });\n }\n\n // Use API to remove the notification\n\n scope.notificationsData = _.difference(scope.notificationsData, filtered);\n };\n\n scope.clearNotificationById = function (id) {\n var item = _.find(scope.notifications, {id: id});\n if (item) {\n $timeout(function () {\n scope.clearNotification(item);\n generateNotifications(scope.notificationsData);\n }, 150);\n }\n };\n\n scope.isSelected = function (category) {\n return _.contains(scope.selectedCategories, category);\n };\n\n scope.changeCategory = function (category, evt, isSingleFilter) {\n if (!category) {\n return;\n }\n scope.notifications = [];\n\n if (category === 'all') {\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n }\n else if (isSingleFilter && category) {\n scope.selectedCategories = [category];\n scope.filterActive = true;\n }\n filterNotifications(category);\n };\n\n scope.getFormattedTime = function (timegap) {\n var interval = Math.abs(timegap) / 1000,\n granularity = 1,\n zeroInterval = 'now',\n suffix = '',\n short = false,\n units = null,\n output = '';\n\n units = [\n {seconds: 31536000, singular: 'year', plural: 'years', short: 'y'},\n {seconds: 2592000, singular: 'month', plural: 'months', short: 'm'},\n {seconds: 604800, singular: 'week', plural: 'weeks', short: 'w'},\n {seconds: 86400, singular: 'day', plural: 'days', short: 'd'},\n {seconds: 3600, singular: 'hour', plural: 'hours', short: 'h'},\n {seconds: 60, singular: 'min', plural: 'min', short: 'm'}\n ];\n\n angular.forEach(units, function (unit) {\n var count = null;\n if (granularity === 0) {\n return;\n }\n if (interval >= unit.seconds) {\n count = Math.floor(interval / unit.seconds);\n output += (output ? ' ' : '') + count;\n\n if (short) {\n output += unit.short;\n }\n else {\n output += ' ' + (count > 1 ? unit.plural : unit.singular);\n }\n\n interval %= unit.seconds;\n granularity--;\n }\n });\n\n return output ? output + (suffix === '' ? '' : ' ' + suffix) : zeroInterval;\n };\n\n scope.onSwiping = function (deltaX) {\n scope.isSwipeRight = deltaX > 1;\n $scope.$apply();\n };\n\n scope.dismissHelp = function () {\n cache.put('helpDismissed', 1);\n scope.displayHelp = false;\n };\n\n // Subscribe to the event of the new notification event that this directive will be notified about.\n watchHandeNewNotification = $rootScope.$on('event:notifications-raised', function (event, data) {\n if (data.notifications) {\n scope.notifications = data.notifications;\n }\n });\n\n // Subscribe to the events raised by different routes that will effectively get this directive to check and clear\n // any notifications that might be related to those routes (/messages, /lead/{}/messages etc)\n watchHandleClearNotification = $rootScope.$on('event:notifications-check', function (event, data) {\n scope.clearNotification(data);\n generateNotifications(scope.notificationsData);\n });\n\n $rootScope.$on('$destroy', function () {\n watchHandeNewNotification();\n watchHandleClearNotification();\n });\n\n // INIT\n generateNotifications(scope.notificationsData);\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name urlShorteners\n * @description\n *\n */\n angular\n .module('urlShorteners', [\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name urlShorteners.provider:BitlyUrlShortener\n *\n * @description\n *\n */\n angular\n .module('urlShorteners')\n .provider('BitlyUrlShortener', BitlyUrlShortener);\n\n function BitlyUrlShortener() {\n var config = {\n accessToken: null\n };\n\n return {\n setAccessToken: function (accessToken) {\n config.accessToken = accessToken;\n },\n $get: ['$http', '$httpParamSerializer', 'configOptions', '$q', function ($http, $httpParamSerializer, configOptions, $q) {\n var cache = {};\n return {\n shorten: function (longUrl) {\n var deferred = $q.defer();\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n if (angular.isDefined(cache[longUrl])) {\n deferred.resolve(cache[longUrl]);\n }\n else {\n $http({\n method: 'POST',\n headers: {\n \"Authorization\": \"Bearer \" + configOptions.bitlyGenericAccessToken,\n \"Content-Type\": \"application/json\"\n },\n url: 'https://api-ssl.bitly.com/v4/shorten',\n data:{\n long_url: longUrl\n }\n })\n .then(function (result) {\n cache[longUrl] = result.data.link;\n deferred.resolve(result.data.link);\n });\n }\n\n return deferred.promise;\n }\n };\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name toolbar\n * @description\n *\n */\n angular\n .module('toolbar', [\n 'ui.router',\n 'mlp-notifications'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name toolbar.controller:ToolbarCtrl\n *\n * @description\n *\n */\n ToolbarCtrl.$inject = [\"$rootScope\", \"$scope\", \"$window\", \"$state\", \"$document\", \"$timeout\", \"Marketplace\", \"AccountService\", \"BusinessAccount\", \"Auth\", \"Session\", \"authEvents\"];\n angular\n .module('toolbar')\n .controller('ToolbarCtrl', ToolbarCtrl);\n\n function ToolbarCtrl($rootScope, $scope, $window, $state, $document, $timeout, Marketplace, AccountService, BusinessAccount, Auth, Session, authEvents) {\n var vm = this,\n loginSuccessHandler,\n updateProfileHandler,\n notificationHandler,\n watchHandle;\n\n // Default state for the navbar-collapse\n vm.isCollapsed = true;\n vm.hasNotifications = false;\n vm.notificationsCount = ' ';\n\n notificationHandler = $rootScope.$on('event:notifications-status', function (event, data) {\n vm.hasNotifications = data.hasNotifications;\n if (vm.hasNotifications) {\n vm.notificationsCount = data.count;\n }\n else {\n vm.notificationsCount = ' ';\n if (vm.isMobile) {\n vm.isNCopen = false;\n }\n }\n });\n\n function updateUserData() {\n Session.getUserProfile()\n .then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n vm.trialData = BusinessAccount.getTrialData(vm.userProfile);\n }\n });\n }\n\n function checkForMobile() {\n // This is a simple workaround to find out if we are in the the mobile devices (tablet/phone) according the bootstrap's breakpoints without having to hardcode the breakpoint values,\n // simply use the toggle button (the one with the .navbar-toggle) object and check if it's visible.\n vm.isMobile = angular.element('.navbar-toggle:visible').length === 1;\n vm.isDesktop = !vm.isMobile;\n }\n\n updateUserData();\n\n vm.isLogin = function () {\n return $state.is('accountSignInUp.accountSignIn');\n };\n\n vm.isSignUp = function () {\n return $state.is('accountSignInUp.accountSignUp');\n };\n\n vm.showLoginLink = function () {\n return $state.is('accountSignInUp.accountSignUp') || $state.includes('accountPassword');\n };\n\n vm.isAuthenticated = function () {\n return $rootScope.isAuthenticated;\n };\n\n vm.toggleMenu = function () {\n vm.isCollapsed = !vm.isCollapsed;\n };\n\n vm.closeMenu = function () {\n vm.isCollapsed = true;\n };\n\n vm.signOut = function () {\n vm.closeMenu();\n Auth.signOut();\n $state.params = angular.extend($state.params, {logout: true});\n $state.go('accountSignInUp.accountSignIn');\n };\n\n vm.isBusinessAccountActive = function () {\n return angular.isObject(vm.userProfile) && angular.isDefined(vm.userProfile.isBusinessAccountActive) && vm.userProfile.isBusinessAccountActive === true;\n };\n\n vm.getUserProfile = function () {\n return vm.userProfile;\n };\n\n vm.openFeedback = function (helpNeeded) {\n AccountService.openFeedback(vm.userProfile, helpNeeded);\n vm.closeMenu();\n };\n\n vm.openPreferences = function () {\n AccountService.openPreferences(vm.userProfile);\n vm.closeMenu();\n };\n\n vm.openMarketplace = function () {\n Marketplace.open();\n vm.closeMenu();\n };\n\n vm.toggleNotificationCenter = function (isOpen) {\n vm.isNCopen = isOpen;\n };\n\n vm.toggleProfile = function (isOpen) {\n vm.isProfileOpen = isOpen;\n };\n\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n loginSuccessHandler = $rootScope.$on(authEvents.loginSuccess, function () {\n checkForMobile();\n updateUserData();\n });\n updateProfileHandler = $rootScope.$on('event:user-updateProfile', function (event, data) {\n vm.userProfile = data.profile;\n });\n\n // We have to run the mobile-check after user logs is, as if he is a visitor, we are hiding the toggle button\n watchHandle = $rootScope.$watch('isAuthenticated', function () {\n if ($rootScope.isAuthenticated) {\n vm.isDesktop = false;\n vm.isMobile = false;\n $timeout(function () {\n checkForMobile();\n }, 50);\n }\n else {\n vm.userProfile = undefined;\n }\n });\n $rootScope.$on('$destroy', function () {\n watchHandle();\n notificationHandler();\n });\n\n // Subscribe to the element resize\n angular.element($window).on('resize', function () {\n checkForMobile();\n vm.closeMenu();\n $scope.$apply();\n });\n\n // Do the check for the initial state.\n $document.ready(checkForMobile);\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.directive:businessSuggestion\n * @restrict EA\n * @element\n *\n * @description\n */\n angular\n .module('toolbar')\n .directive('businessSuggestion', businessSuggestion);\n\n function businessSuggestion() {\n return {\n restrict: 'EA',\n scope: {\n user: '=user'\n },\n replace: true,\n templateUrl: 'toolbar/business-suggestion-directive.tpl.html',\n controllerAs: 'suggestion',\n controller: ['$rootScope', '$scope', 'configOptions', 'BusinessAccount', '$document', 'Notification', 'Session', function ($rootScope, $scope, configOptions, BusinessAccount, $document, Notification, Session) {\n var vm = this,\n count = 0,\n trialCount = 0,\n body = angular.element($document[0].body),\n userProfileDeferred = Session.getUserProfile(),\n logoutSuccessHandler;\n\n // Default state of the visibility of this directive's content\n vm.isClosed = true;\n\n logoutSuccessHandler = $rootScope.$on('event:auth-logoutSuccess', function () {\n body.removeClass('has-suggestion');\n });\n\n // Remove the handle once it's all destroyed\n $rootScope.$on('$destroy', logoutSuccessHandler);\n\n // Get the user data from session.\n function updateUserData() {\n userProfileDeferred.then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n vm.trialData = BusinessAccount.getTrialData(vm.userProfile);\n // Trigger the check count as there might be some trial data available\n checkCount();\n // If there is a warning, we will show the directive no matter what.\n if (vm.trialData.isInTrial && vm.trialData.trialWarning) {\n vm.setIsClosed(false);\n }\n }\n });\n }\n\n /**\n * @ngdoc function\n * @name closeSuggestion\n * @methodOf registerSuggestion.controller:suggestion\n * @description Closes the suggestion. At the same time it increases the count in the local storage or sets the new timestamp (if user never signs out)\n */\n vm.closeSuggestion = function () {\n vm.setIsClosed(true);\n BusinessAccount.updateSuggestionCount(count);\n if (vm.trialData && vm.trialData.isEligibleForTrial) {\n BusinessAccount.updateTrialSuggestionCount(trialCount);\n }\n };\n\n /**\n * @ngdoc function\n * @name checkCount\n * @methodOf registerSuggestion.controller:suggestion\n * @description Checks the number of how many times have we bothered the user with the suggestions already. If we have bothered him => than the number in the settings, then keep it closed. If it's less, open the suggestion.\n * @private\n */\n function checkCount() {\n var closeIt = false;\n\n // Get the cached count value for business suggestion and trialSuggestions.\n // Trial suggestions are overriding the business ones.\n count = BusinessAccount.getSuggestionsCount();\n trialCount = BusinessAccount.getTrialSuggestionsCount();\n closeIt = count < configOptions.maxBusinessSuggestions ? false : true;\n if (vm.trialData && vm.trialData.isEligibleForTrial) {\n closeIt = trialCount < configOptions.maxBusinessSuggestions ? false : true;\n }\n vm.setIsClosed(closeIt);\n }\n\n /**\n * Redirects to Business registration\n */\n vm.registerBusiness = function () {\n // Open the popup dialog\n vm.isActivating = true;\n BusinessAccount.initiateActivation(body[0], vm.trialData.isEligibleForTrial)\n .then(function () {\n Notification({message: 'Your business account has been successfully activated.'}, 'confirmation');\n vm.isActivating = false;\n vm.setIsClosed(true);\n }, function () {\n vm.isActivating = false;\n vm.setIsClosed(true);\n });\n };\n\n /**\n * Sets the isClosed model variable to the incoming parameter\n * @param {Boolean} isClosed Whether the suggestion is to be closed now.\n */\n vm.setIsClosed = function (isClosed) {\n if (vm.isClosed !== isClosed) {\n // Do the CSS change on the body so the content knows it needs to shift a little\n if (isClosed) {\n body.removeClass('has-suggestion');\n }\n else {\n body.addClass('has-suggestion');\n }\n }\n vm.isClosed = isClosed;\n };\n\n //\n updateUserData();\n\n // Check the count from cache. This will also reset the visibility status from visible if this has been shown before.\n checkCount();\n }],\n link: function (scope, element, attrs, ctrl) {\n ctrl.element = element;\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name socialShare\n *\n * @description\n *\n */\n run.$inject = [\"SocialShare\"];\n angular\n .module('socialShare', [\n 'socialShare.providers',\n 'urlShorteners'\n ]);\n\n angular\n .module('socialShare')\n .config(config)\n .run(run);\n\n function config() {\n }\n\n function run(SocialShare) {\n SocialShare.init();\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:SocialShare\n *\n * @description SocialShare provider, generic functionality to share content via social service\n *\n */\n angular\n .module('socialShare')\n .provider('SocialShare', SocialShare);\n\n function SocialShare() {\n var socialServices = {\n facebook: 'FacebookSocialShare',\n linkedin: 'LinkedinSocialShare',\n twitter: 'TwitterSocialShare',\n google: 'GooglePlusSocialShare'\n },\n config = {};\n\n /**\n * Get instance name for social service\n * @param {string} name Social service identifier\n * @returns {string} Instance name\n */\n function getInstanceNameForSocialService(name) {\n if (angular.isDefined(socialServices[name])) {\n return socialServices[name];\n }\n\n throw new Error('Unknown provider');\n }\n\n return {\n /**\n * Set configuration\n * @param {string} socialService Social service identifier\n * @param {string} paramName Name of configuration option\n * @param {*} value Value of configuration option\n */\n set: function (socialService, paramName, value) {\n if (angular.isUndefined(config[socialService])) {\n config[socialService] = {};\n }\n\n config[socialService][paramName] = value;\n },\n $get: ['$q', '$rootScope', '$injector',\n function ($q, $rootScope, $injector) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var $socialShare = $q.defer(),\n socialInitHandler;\n\n /**\n * Initialisation - iterates over all supported providers and initialises them\n */\n $socialShare.init = function () {\n var promises = [];\n angular.forEach(socialServices, function (instanceName, name) {\n var instance = $injector.get(instanceName);\n promises.push(instanceName.promise);\n instance.init(config[name] || {});\n });\n\n $q.all(promises).then(function () {\n $rootScope.$broadcast('socialShare-init');\n });\n };\n\n socialInitHandler = $rootScope.$on('socialShare-init', function () {\n $socialShare.resolve();\n });\n\n /**\n * Share a content\n * @param {string} socialService Social service identifier\n * @param {object} data Data to share\n */\n $socialShare.share = function (socialService, data) {\n $injector.get(getInstanceNameForSocialService(socialService)).share(data);\n };\n\n return $socialShare;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name socialShare.directive:socialShare\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('socialShare')\n .directive('socialShare', socialShare);\n\n function socialShare() {\n return {\n restrict: 'EA',\n scope: {\n url: '=',\n shortUrl: '=',\n title: '=',\n name: '=',\n description: '=',\n source: '=',\n picture: '=',\n hashTags: '=',\n buttonId: '='\n },\n templateUrl: 'social-share/social-share-directive.tpl.html',\n replace: false,\n controllerAs: 'socialShare',\n controller: ['$scope', 'SocialShare', '$location', 'BitlyUrlShortener', 'configOptions',\n function ($scope, SocialShare, $location, BitlyUrlShortener, configOptions) {\n var vm = this;\n if ($scope.buttonId) {\n vm.id = $scope.buttonId;\n }\n else {\n vm.id = '';\n }\n vm.share = function (socialService) {\n var url = $scope.url || $location.absUrl();\n if ($scope.shortUrl) {\n SocialShare.share(socialService, {\n url: $scope.shortUrl,\n name: $scope.name || configOptions.defaultShareName,\n title: $scope.title,\n description: $scope.description || configOptions.defaultShareMessage,\n source: $scope.source || 'MyLeadPod',\n picture: $scope.picture || configOptions.appUrl + '/images/touch-icon-192x192.png',\n hashTags: $scope.hashTags\n });\n }\n else {\n BitlyUrlShortener.shorten(url).then(function (shortUrl) {\n SocialShare.share(socialService, {\n url: shortUrl,\n name: $scope.name || configOptions.defaultShareName,\n title: $scope.title,\n description: $scope.description || configOptions.defaultShareMessage,\n source: $scope.source || 'MyLeadPod',\n picture: $scope.picture || configOptions.appUrl + '/images/touch-icon-192x192.png',\n hashTags: $scope.hashTags\n });\n });\n }\n };\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name socialNetwork\n * @description\n *\n */\n config.$inject = [\"configOptions\"];\n angular\n .module('socialNetwork', [\n 'ui.router'\n ]);\n\n angular\n .module('socialNetwork')\n .config(config);\n\n function config(configOptions) {\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n hello.init({\n facebook: configOptions.facebookAppId,\n google: configOptions.googlePlusClientId,\n linkedin: {\n id: configOptions.linkedInClientId,\n scope: {\n basic: 'r_liteprofile',\n email: 'r_emailaddress'\n }\n }\n }, {\n oauth_proxy: configOptions.linkedInProxy\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialNetwork.constant:socialNetworkProvider\n *\n * @description\n *\n */\n angular\n .module('socialNetwork')\n .constant('socialNetworkProvider', {\n google: 'google',\n facebook: 'facebook',\n linkedIn: 'linkedin'\n });\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialNetwork.service:SocialAccount\n *\n * @description\n *\n */\n SocialAccount.$inject = [\"$q\", \"$state\", \"configOptions\", \"socialNetworkProvider\", \"Auth\"];\n angular\n .module('socialNetwork')\n .service('SocialAccount', SocialAccount);\n\n function SocialAccount($q, $state, configOptions, socialNetworkProvider, Auth) {\n var self = this;\n\n /**\n * Signs user in\n *\n * @param {string} provider Social network name\n * @param {Object} options Additional options\n * @param {Object} params Additional parameters\n * @returns {Deferred} Deferred promise\n */\n function signIn(provider, options, params) {\n var deferred = $q.defer();\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n if (!angular.isObject(options)) {\n options = {};\n }\n\n options.redirect_uri = $state.href($state.current, $state.params, {absolute: true});\n hello.login(provider, options, function () {\n var result = hello(provider).getAuthResponse();\n if (angular.isObject(result) && angular.isDefined(result.access_token)) {\n Auth.socialSignIn(provider, result.access_token, params)\n .then(function (signInResult) {\n deferred.resolve(signInResult);\n }, function (reason) {\n deferred.reject(reason);\n });\n }\n else {\n deferred.reject('An error occurred');\n }\n });\n\n return deferred.promise;\n }\n\n /**\n * Google Sign In\n *\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n function googleSignIn(params) {\n return signIn(socialNetworkProvider.google, {\n scope: configOptions.googlePlusScope\n }, params);\n }\n\n /**\n * Facebook Sign In\n *\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n function facebookSignIn(params) {\n return signIn(socialNetworkProvider.facebook, {\n scope: configOptions.facebookScope\n }, params);\n }\n\n /**\n * LinkedIn Sign In\n *\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n function linkedInSignIn(params) {\n return signIn(socialNetworkProvider.linkedIn, {\n scope: configOptions.linkedInScope\n }, params);\n }\n\n /**\n * Signs user in\n *\n * @param {string} provider Social network name\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n self.signIn = function (provider, params) {\n switch (provider) {\n case socialNetworkProvider.google:\n return googleSignIn(params);\n case socialNetworkProvider.facebook:\n return facebookSignIn(params);\n case socialNetworkProvider.linkedIn:\n return linkedInSignIn(params);\n default:\n throw new Error('Unknown social network provider');\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui.search\n * @description\n *\n */\n angular\n .module('mlp-search', []);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlp-search.directive:searchBar\n * @restrict EA\n * @element\n *\n * @description This is the directory search bar that searches across the user's content\n *\n */\n angular\n .module('mlp-search')\n .directive('searchBar', searchBar);\n\n function searchBar() {\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'search/search-bar-directive.tpl.html',\n replace: true,\n controllerAs: 'searchbar',\n controller: ['$scope', '$document', '$state', 'Session', 'Leads', function ($scope, $document, $state, Session, Leads) {\n var vm = this,\n userProfileDeferred = Session.getUserProfile();\n\n function handleLeads(item) {\n Leads.openDetail(item.id, item.leadtype);\n }\n\n //\n vm.searchCategories = [\n {name: 'All', value: 'all'},\n {name: 'My Pod', value: 'myPod', stateTarget: 'user', iconClass: 'fa-user'},\n {name: 'Directory', value: 'businessUsers', stateTarget: 'user.about', iconClass: 'fa-briefcase'},\n {name: 'Leads', value: 'leads', callbackHandler: handleLeads, iconClass: 'fa-paper-plane'},\n {name: 'Charities', value: 'charities', stateTarget: 'user', iconClass: 'fa-heart-o'}\n ];\n\n // Get the user data from session.\n function updateUserData() {\n userProfileDeferred.then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n if (vm.userProfile.isBusinessAccountActive) {\n vm.searchCategories.push({name: 'My Connections', value: 'myConnections', stateTarget: 'user', iconClass: 'fa-user-o'});\n }\n }\n });\n }\n updateUserData();\n\n // For the autocomplete (angucomplete)\n vm.searchbarId = 'directory-searchbar';\n // vm.searchUrl = 'https://admin-pilot.myleadpod.com/dataapi/myleadpod/v1/Members/index?limit=10&offset=0&status=active&search=';\n vm.searchUrl = 'https://admin-pilot.myleadpod.com/dataapi/myleadpod/v1/Search/index?keyword=';\n vm.searchService = 'Search';\n vm.searchServiceEndPoint = 'index';\n\n vm.onSearchItemSelected = function (item) {\n var stateTarget,\n callbackHandler;\n\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item) {\n return;\n }\n\n stateTarget = _.find(vm.searchCategories, {value: item.originalObject.category}).stateTarget;\n callbackHandler = _.find(vm.searchCategories, {value: item.originalObject.category}).callbackHandler;\n if (stateTarget && item.originalObject.id) {\n $state.go(stateTarget, {id: item.originalObject.id});\n }\n else if (callbackHandler) {\n callbackHandler(item.originalObject);\n }\n };\n\n /**\n * Format the reponse coming from the server, channeled via search-autocomplete-directive\n *\n * @param {object} response Raw response object coming from Search REST Endpoint\n *\n * @returns {object} Formatted result item\n */\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n\n r = response.records;\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.leadtype) {\n categoryDescriptionClass += item.leadtype === 'received' ? ' fa-paper-plane-o' : '';\n value += ' | ' + item.leadfullname;\n }\n else if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.focusIn = function () {\n $document.find('.navbar-header').addClass('search-focused');\n };\n vm.focusOut = function () {\n $document.find('.navbar-header').removeClass('search-focused');\n };\n }],\n\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlp-search.directive:searchAutocomplete\n * @restrict EA\n * @element\n *\n * @description This is the directory search bar that searches across the user's content\n *\n */\n searchAutocomplete.$inject = [\"$q\", \"$parse\", \"$http\", \"$sce\", \"$timeout\", \"$templateCache\", \"$interpolate\", \"$window\", \"$document\", \"Restangular\"];\n angular\n .module('mlp-search')\n .directive('searchAutocomplete', searchAutocomplete);\n\n function searchAutocomplete($q, $parse, $http, $sce, $timeout, $templateCache, $interpolate, $window, $document, Restangular) {\n // keyboard events\n var KEY_DW = 40,\n KEY_RT = 39,\n KEY_UP = 38,\n KEY_LF = 37,\n KEY_ES = 27,\n KEY_EN = 13,\n KEY_TAB = 9,\n\n MIN_LENGTH = 3,\n MAX_LENGTH = 524288,\n PAUSE = 300,\n BLUR_TIMEOUT = 200,\n\n REQUIRED_CLASS = 'autocomplete-required',\n TEXT_SEARCHING = 'Searching...',\n TEXT_NORESULTS = 'No results found';\n\n function link(scope, elem, attrs, ctrl) {\n var inputField = elem.find('input'),\n minlength = MIN_LENGTH,\n searchTimer = null,\n hideTimer,\n requiredClassName = REQUIRED_CLASS,\n responseFormatter,\n validState = null,\n httpCanceller = null,\n httpCallInProgress = false,\n dd = elem[0].querySelector('.search-autocomplete-dropdown'),\n isScrollOn = false,\n mousedownOn = null,\n unbindInitialValue,\n displaySearching,\n displayNoResults,\n lastSearchStr,\n bodyClickHandler,\n onBodyClickListener;\n\n // For the filter\n scope.showFilterDropdown = false;\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.searchFocused = false;\n scope.resultsBackup = null;\n scope.showResultsFilter = false;\n scope.hasCategoryFilter = typeof scope.hasCategoryFilter === 'undefined';\n\n // For the history dropdown\n scope.showHistoryDropdown = false;\n scope.historyItems = [];\n scope.currentHistoryIndex = -1;\n\n // Check if the dropdown is positioned relatively\n if (scope.isDropdownRelative) {\n angular.element(dd).css('position', 'relative');\n }\n\n // Setup the selected categories based on search categories\n if (scope.searchCategories && scope.searchCategories.length === 1) {\n scope.selectedCategories = [scope.searchCategories[0].value];\n }\n\n bodyClickHandler = function (evt) {\n scope.checkFocus(evt, true);\n };\n\n elem.on('mousedown', function (event) {\n if (event.target.id) {\n mousedownOn = event.target.id;\n if (mousedownOn === scope.id + '_dropdown') {\n $document[0].body.addEventListener('click', clickoutHandlerForDropdown);\n }\n }\n else {\n mousedownOn = event.target.className;\n }\n });\n\n scope.currentIndex = scope.focusFirst ? 0 : null;\n scope.searching = false;\n unbindInitialValue = scope.$watch('initialValue', function (newval) {\n if (newval) {\n // remove scope listener\n unbindInitialValue();\n // change input\n handleInputChange(newval, true);\n }\n });\n\n scope.$watch('fieldRequired', function (newval, oldval) {\n if (newval !== oldval) {\n if (!newval) {\n ctrl[scope.inputName].$setValidity(requiredClassName, true);\n }\n else if (!validState || scope.currentIndex === -1) {\n handleRequired(false);\n }\n else {\n handleRequired(true);\n }\n }\n });\n\n scope.$on('search-autocomplete:clearInput', function (event, elementId) {\n if (!elementId || elementId === scope.id) {\n scope.searchStr = null;\n callOrAssign();\n handleRequired(false);\n clearResults();\n }\n });\n\n scope.$on('search-autocomplete:changeInput', function (event, elementId, newval) {\n if (!!elementId && elementId === scope.id) {\n handleInputChange(newval);\n }\n });\n\n function handleInputChange(newval, initial) {\n if (newval) {\n if (angular.isObject(newval)) {\n scope.searchStr = extractTitle(newval);\n callOrAssign({originalObject: newval});\n }\n else if (angular.isString(newval) && newval.length > 0) {\n scope.searchStr = newval;\n }\n else if (console && console.error) {\n console.error('Tried to set ' + (!initial ? 'initial' : '') + ' value of search-autocomplete to', newval, 'which is an invalid value');\n }\n\n handleRequired(true);\n }\n }\n\n // #194 dropdown list not consistent in collapsing (bug).\n function clickoutHandlerForDropdown(event) {\n mousedownOn = null;\n scope.hideResults(event, false);\n $document[0].body.removeEventListener('click', clickoutHandlerForDropdown);\n }\n\n // for IE8 quirkiness about event.which\n function ie8EventNormalizer(event) {\n return event.which ? event.which : event.keyCode;\n }\n\n function callOrAssign(value) {\n if (value && scope.blurOnSelect) {\n inputField.blur();\n $timeout(function () {\n scope.searchFocused = false;\n }, 100);\n }\n\n if (angular.isFunction(scope.selectedObject)) {\n scope.selectedObject(value, scope.selectedObjectData);\n }\n else {\n scope.selectedObject = value;\n }\n\n if (value) {\n handleRequired(true);\n }\n else {\n handleRequired(false);\n }\n }\n\n function callFunctionOrIdentity(fn) {\n return function (data) {\n return scope[fn] ? scope[fn](data) : data;\n };\n }\n\n function setInputString(str) {\n callOrAssign({originalObject: str});\n\n if (scope.clearSelected) {\n scope.searchStr = null;\n }\n clearResults();\n }\n\n function extractTitle(data) {\n // split title fields and run extractValue for each and join with ' '\n return scope.titleField.split(',')\n .map(function (field) {\n return extractValue(data, field);\n })\n .join(' ');\n }\n\n function extractValue(obj, key) {\n var keys, result, i;\n if (key) {\n keys = key.split('.');\n result = obj;\n for (i = 0; i < keys.length; i++) {\n result = result[keys[i]];\n }\n }\n else {\n result = obj;\n }\n return result;\n }\n\n function findMatchString(target, str) {\n var result, matches, re;\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n // Escape user input to be treated as a literal string within a regular expression\n re = new RegExp(str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'i');\n if (!target) {\n return null;\n }\n if (!target.match || !target.replace) {\n target = target.toString();\n }\n matches = target.match(re);\n if (matches) {\n result = target.replace(re, '' + matches[0] + '');\n }\n else {\n result = target;\n }\n return $sce.trustAsHtml(result);\n }\n\n function handleRequired(valid) {\n scope.notEmpty = valid;\n validState = scope.searchStr;\n if (scope.fieldRequired && ctrl && scope.inputName) {\n ctrl[scope.inputName].$setValidity(requiredClassName, valid);\n }\n }\n\n /* eslint complexity: [2, 25]*/\n function keyupHandler(event) {\n var which = ie8EventNormalizer(event);\n if (which === KEY_LF || which === KEY_RT) {\n // do nothing\n return;\n }\n\n if (which === KEY_UP || which === KEY_EN) {\n event.preventDefault();\n }\n else if (which === KEY_DW) {\n event.preventDefault();\n\n if (scope.searchStr && scope.searchStr === lastSearchStr && scope.results.length > 0) {\n // So there is a result object, the search string is the same as per the last search string and user pressed DWN button. ->\n // open the dropdown with results then without invoking a new search\n scope.searching = false;\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n scope.showHistoryDropdown = false;\n scope.$apply();\n }\n else if (!scope.showDropdown && scope.searchStr && scope.searchStr.length >= minlength) {\n initResults();\n scope.searching = true;\n resetCategories();\n searchTimerComplete(scope.searchStr);\n }\n else if (scope.historyItems && scope.hasHistory) {\n if (!scope.showHistoryDropdown) {\n scope.currentHistoryIndex = -1;\n }\n scope.showHistoryDropdown = true;\n scope.$apply();\n }\n }\n else if (which === KEY_ES) {\n if (scope.results && scope.showDropdown) {\n scope.showDropdown = false;\n }\n else if (scope.results && !scope.showDropdown) {\n clearResults();\n scope.searchStr = null;\n }\n scope.showHistoryDropdown = false;\n scope.$apply(function () {\n inputField.val(scope.searchStr);\n });\n }\n else {\n if (minlength === 0 && !scope.searchStr) {\n return;\n }\n\n lastSearchStr = scope.searchStr;\n if (scope.searchStr && scope.searchStr.length >= minlength) {\n initResults();\n\n if (searchTimer) {\n $timeout.cancel(searchTimer);\n }\n\n scope.searching = true;\n resetCategories();\n searchTimer = $timeout(function () {\n searchTimerComplete(scope.searchStr);\n }, scope.pause);\n }\n else if (!scope.searchStr || scope.searchStr === '' || scope.searchStr.length < minlength) {\n scope.showDropdown = false;\n if (searchTimer) {\n $timeout.cancel(searchTimer);\n }\n scope.searching = false;\n }\n\n if (validState && validState !== scope.searchStr && !scope.clearSelected) {\n scope.$apply(function () {\n callOrAssign();\n });\n }\n }\n }\n\n function keydownHandler(event) {\n if (scope.results && scope.results.length > 0) {\n handleKeyDown(event, scope.results, scope.currentIndex, scope.showDropdown, false);\n }\n else if (scope.historyItems && scope.historyItems.length > 0) {\n handleKeyDown(event, scope.historyItems, scope.currentHistoryIndex, scope.showHistoryDropdown, true);\n }\n }\n\n function handleKeyDown(event, results, currentIndex, showDropdown, isHistory) {\n var which = ie8EventNormalizer(event),\n row = null,\n rowTop = null;\n\n // Straightaway is this is a history, and it's not TAB, KEYDOWN, KEYUP or Enter then just hide it.\n if (isHistory && which !== KEY_EN && which !== KEY_DW && which !== KEY_UP && which !== KEY_TAB) {\n scope.showHistoryDropdown = false;\n return;\n }\n\n if (which === KEY_EN && results) {\n if (currentIndex >= 0 && currentIndex < results.length) {\n event.preventDefault();\n if (isHistory) {\n scope.selectHistoryItem(results[currentIndex]);\n }\n else {\n scope.selectResult(results[currentIndex]);\n }\n }\n else {\n handleOverrideSuggestions(event);\n }\n scope.$apply();\n }\n else if (which === KEY_DW && results && currentIndex + 1 < results.length && showDropdown) {\n event.preventDefault();\n scope.$apply(function () {\n currentIndex += 1;\n updateCurrentIndexByOne(false, isHistory);\n updateInputField(results, currentIndex);\n });\n\n if (isScrollOn) {\n row = dropdownRow(currentIndex);\n if (dropdownHeight() < row.getBoundingClientRect().bottom) {\n dropdownScrollTopTo(dropdownRowOffsetHeight(row));\n }\n }\n }\n else if (which === KEY_UP && results) {\n event.preventDefault();\n if (currentIndex >= 1) {\n scope.$apply(function () {\n currentIndex -= 1;\n updateCurrentIndexByOne(true, isHistory);\n updateInputField(results, currentIndex);\n });\n\n if (isScrollOn) {\n rowTop = dropdownRowTop(isHistory ? scope.currentIndex : scope.currentHistoryIndex);\n if (rowTop < 0) {\n dropdownScrollTopTo(rowTop - 1);\n }\n }\n }\n else if (currentIndex === 0) {\n scope.$apply(function () {\n currentIndex -= 1;\n updateCurrentIndexByOne(true, isHistory);\n inputField.val(scope.searchStr);\n });\n }\n }\n else if (which === KEY_TAB) {\n if (results && results.length > 0 && showDropdown) {\n if (currentIndex === -1 && scope.overrideSuggestions) {\n // intentionally not sending event so that it does not\n // prevent default tab behavior\n handleOverrideSuggestions();\n }\n else {\n if (currentIndex === -1) {\n currentIndex = 0;\n updateCurrentIndexByOne(0, isHistory);\n }\n if (isHistory) {\n scope.selectHistoryItem(results[currentIndex]);\n }\n else {\n scope.selectResult(results[currentIndex]);\n }\n\n scope.$apply();\n }\n }\n else if (scope.searchStr && scope.searchStr.length > 0) {\n // no results\n // intentionally not sending event so that it does not\n // prevent default tab behavior\n handleOverrideSuggestions();\n }\n }\n else if (which === KEY_ES) {\n // This is very specific to IE10/11 #272\n // without this, IE clears the input text\n event.preventDefault();\n }\n }\n\n function updateCurrentIndexByOne(negative, isHistory) {\n if (isHistory) {\n if (negative === 0) {\n scope.currentHistoryIndex = 0;\n }\n else if (negative === true) {\n scope.currentHistoryIndex -= 1;\n }\n else {\n scope.currentHistoryIndex += 1;\n }\n return;\n }\n\n if (negative === 0) {\n scope.currentIndex = 0;\n }\n else if (negative === true) {\n scope.currentIndex -= 1;\n }\n else {\n scope.currentIndex += 1;\n }\n }\n\n function handleOverrideSuggestions(event) {\n if (scope.overrideSuggestions &&\n !(scope.selectedObject && scope.selectedObject.originalObject === scope.searchStr)) {\n if (event) {\n event.preventDefault();\n }\n\n // cancel search timer\n $timeout.cancel(searchTimer);\n // cancel http request\n cancelHttpRequest();\n\n setInputString(scope.searchStr);\n }\n }\n\n function dropdownRowOffsetHeight(row) {\n var css = $window.getComputedStyle(row);\n return row.offsetHeight +\n parseInt(css.marginTop, 10) + parseInt(css.marginBottom, 10);\n }\n\n function dropdownHeight() {\n return dd.getBoundingClientRect().top +\n parseInt($window.getComputedStyle(dd).maxHeight, 10);\n }\n\n function dropdownRow(currentIndex) {\n return elem[0].querySelectorAll('.search-autocomplete-row')[currentIndex];\n }\n\n function dropdownRowTop(currentIndex) {\n return dropdownRow(currentIndex).getBoundingClientRect().top -\n (dd.getBoundingClientRect().top +\n parseInt($window.getComputedStyle(dd).paddingTop, 10));\n }\n\n function dropdownScrollTopTo(offset) {\n dd.scrollTop += offset;\n }\n\n function updateInputField(results, currentIndex) {\n var current = null;\n if (!results && !currentIndex) {\n results = scope.results;\n currentIndex = scope.currentIndex;\n }\n current = results[currentIndex];\n if (scope.matchClass) {\n inputField.val(extractTitle(current.originalObject));\n }\n else {\n inputField.val(current.title);\n }\n }\n\n function httpSuccessCallbackGen(str) {\n return function (responseData, status, headers, config) {\n // normalize return obejct from promise\n if (!status && !headers && !config && responseData.data) {\n responseData = responseData.data;\n }\n scope.searching = false;\n processResults(\n extractValue(responseFormatter(responseData), scope.remoteUrlDataField),\n str);\n };\n }\n\n function httpErrorCallback(errorRes, status, headers, config) {\n scope.searching = httpCallInProgress;\n\n // normalize return obejct from promise\n if (!status && !headers && !config) {\n status = errorRes.status;\n }\n\n // cancelled/aborted\n if (status === 0 || status === -1) {\n return;\n }\n if (scope.remoteUrlErrorCallback) {\n scope.remoteUrlErrorCallback(errorRes, status, headers, config);\n }\n else if (console && console.error) {\n console.error('http error');\n }\n }\n\n function cancelHttpRequest() {\n if (httpCanceller) {\n httpCanceller.resolve();\n }\n }\n\n function getRemoteResults(str) {\n var params = {},\n url = scope.remoteUrl + encodeURIComponent(str);\n\n if (scope.remoteUrl) {\n if (scope.remoteUrlRequestFormatter) {\n params = {\n params: scope.remoteUrlRequestFormatter(str)\n };\n url = scope.remoteUrl;\n }\n\n if (!scope.remoteUrlRequestWithCredentials) {\n params.withCredentials = true;\n }\n cancelHttpRequest();\n httpCanceller = $q.defer();\n params.timeout = httpCanceller.promise;\n httpCallInProgress = true;\n $http.get(url, params)\n .then(httpSuccessCallbackGen(str))\n .catch(httpErrorCallback)\n .finally(function () {\n httpCallInProgress = false;\n });\n }\n else if (scope.searchService && scope.searchServiceEndPoint) {\n Restangular.all(scope.searchService).get(scope.searchServiceEndPoint, {\n keyword: str,\n categories: scope.selectedCategories && scope.selectedCategories.length > 0 ? scope.selectedCategories.toString() : 'all'\n }).then(httpSuccessCallbackGen(str), httpErrorCallback).finally(function () {\n httpCallInProgress = false;\n });\n }\n }\n\n function getRemoteResultsWithCustomHandler(str) {\n cancelHttpRequest();\n\n httpCanceller = $q.defer();\n\n scope.remoteApiHandler(str, httpCanceller.promise)\n .then(httpSuccessCallbackGen(str))\n .catch(httpErrorCallback);\n\n /* IE8 compatible\n scope.remoteApiHandler(str, httpCanceller.promise)\n ['then'](httpSuccessCallbackGen(str))\n ['catch'](httpErrorCallback);\n */\n }\n\n function clearResults(hideOnly) {\n scope.showDropdown = false;\n if (!hideOnly) {\n lastSearchStr = null;\n scope.results = [];\n scope.showResultsFilter = false;\n if (dd) {\n dd.scrollTop = 0;\n }\n }\n }\n\n function initResults() {\n scope.showDropdown = displaySearching;\n scope.currentIndex = scope.focusFirst ? 0 : -1;\n /* scope.results = [];*/\n }\n\n function getLocalResults(str) {\n var i, match, s, value,\n searchFields = scope.searchFields.split(','),\n matches = [];\n\n if (typeof scope.parseInput() !== 'undefined') {\n str = scope.parseInput()(str);\n }\n for (i = 0; i < scope.localData.length; i++) {\n match = false;\n\n for (s = 0; s < searchFields.length; s++) {\n value = extractValue(scope.localData[i], searchFields[s]) || '';\n match = match || value.toString().toLowerCase().indexOf(str.toString().toLowerCase()) >= 0;\n }\n\n if (match) {\n matches[matches.length] = scope.localData[i];\n }\n }\n return matches;\n }\n\n function checkExactMatch(result, obj, str) {\n var key;\n\n if (!str) {\n return false;\n }\n for (key in obj) {\n if (obj[key].toLowerCase() === str.toLowerCase()) {\n scope.selectResult(result);\n return true;\n }\n }\n return false;\n }\n\n function searchTimerComplete(str) {\n // Begin the search\n if (!str || str.length < minlength) {\n return;\n }\n if (scope.localData) {\n scope.$apply(function () {\n var matches;\n if (typeof scope.localSearch() !== 'undefined') {\n matches = scope.localSearch()(str, scope.localData);\n }\n else {\n matches = getLocalResults(str);\n }\n scope.searching = false;\n processResults(matches, str);\n });\n }\n else if (scope.remoteApiHandler) {\n getRemoteResultsWithCustomHandler(str);\n }\n else {\n getRemoteResults(str);\n }\n }\n\n function resetCategories() {\n // Reset all search categories focusFirst\n if (!scope.searchCategories) {\n return;\n }\n angular.forEach(scope.searchCategories, function (sc) {\n sc.hasResults = false;\n });\n $timeout(function () {\n scope.$apply();\n });\n }\n\n function processResults(responseData, str, isHistory) {\n var i,\n item,\n description,\n description2,\n image, text,\n formattedText,\n formattedDesc,\n foundCategories = [];\n\n if (responseData && responseData.length > 0) {\n scope.results = [];\n\n for (i = 0; i < responseData.length; i++) {\n if (scope.titleField && scope.titleField !== '') {\n text = formattedText = extractTitle(responseData[i]);\n }\n\n description = '';\n if (scope.descriptionField) {\n description = formattedDesc = extractValue(responseData[i], scope.descriptionField);\n }\n\n if (scope.descriptionField2) {\n description2 = extractValue(responseData[i], scope.descriptionField2);\n }\n\n image = '';\n if (scope.imageField) {\n image = extractValue(responseData[i], scope.imageField);\n }\n\n if (scope.matchClass) {\n formattedText = findMatchString(text, str);\n // formattedDesc = findMatchString(description, str);\n }\n\n // Now check the category so we can update the badge on the category filter.\n if (scope.categoryField) {\n foundCategories.push(responseData[i][scope.categoryField]);\n }\n\n item = {\n title: formattedText,\n description: formattedDesc,\n description2: description2,\n image: image,\n originalObject: responseData[i]\n };\n\n if (!isHistory) {\n scope.results[scope.results.length] = item;\n }\n else {\n scope.historyItems[scope.historyItems.length] = item;\n }\n }\n\n // Now check the categories\n if (!isHistory && scope.searchCategories && scope.searchCategories.length > 0) {\n // Make the values unique\n foundCategories = _.uniq(foundCategories);\n // Now loop through each category and apply the badge\n angular.forEach(foundCategories, function (category) {\n _.find(scope.searchCategories, {value: category}).hasResults = true;\n });\n }\n }\n else {\n scope.results = [];\n }\n\n // Update the showResultsFilter value\n if (!isHistory) {\n scope.showResultsFilter = scope.searchCategories && scope.results;\n\n if (scope.autoMatch && scope.results.length === 1 &&\n checkExactMatch(scope.results[0],\n {title: text, desc: description || ''}, scope.searchStr)) {\n scope.showDropdown = false;\n }\n else if (scope.results.length === 0 && !displayNoResults) {\n scope.showDropdown = false;\n }\n else {\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n scope.showHistoryDropdown = false;\n }\n\n // Make the backup\n scope.resultsBackup = {\n categories: _.clone(scope.selectedCategories),\n results: _.clone(scope.results)\n };\n }\n }\n\n function showAll() {\n if (scope.localData) {\n scope.searching = false;\n processResults(scope.localData, '');\n }\n else if (scope.remoteApiHandler) {\n scope.searching = true;\n resetCategories();\n getRemoteResultsWithCustomHandler('');\n }\n else {\n scope.searching = true;\n resetCategories();\n getRemoteResults('');\n }\n }\n\n scope.onFocusHandler = function () {\n if (scope.focusIn) {\n scope.focusIn();\n }\n scope.showFilterDropdown = false;\n if (minlength === 0 && (!scope.searchStr || scope.searchStr.length === 0)) {\n scope.currentIndex = scope.focusFirst ? 0 : scope.currentIndex;\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n showAll();\n }\n if (scope.searchStr && scope.searchStr === lastSearchStr && scope.results.length > 0) {\n // So there is a result object, the search string is the same as per the last search string and user pressed DWN button. ->\n // open the dropdown with results then without invoking a new search\n scope.searching = false;\n scope.showDropdown = true;\n }\n else if (scope.hasHistory && scope.historyItems) {\n scope.showHistoryDropdown = true;\n scope.currentHistoryIndex = -1;\n }\n };\n\n scope.hideResults = function (event, hideOnly) {\n var element = angular.element(event.relatedTarget);\n if (mousedownOn &&\n (mousedownOn === scope.id + '_dropdown' ||\n mousedownOn.indexOf('search-autocomplete') >= 0)) {\n mousedownOn = null;\n }\n else if (!element.closest('.search-autocomplete-holder')) {\n // If the element is the child of the autocomplete holder, don't lose the focus\n hideTimer = $timeout(function () {\n clearResults(hideOnly);\n scope.$apply(function () {\n if (scope.searchStr && scope.searchStr.length > 0) {\n inputField.val(scope.searchStr);\n }\n });\n }, BLUR_TIMEOUT);\n cancelHttpRequest();\n\n if (scope.focusOut) {\n scope.focusOut();\n }\n\n if (scope.overrideSuggestions) {\n if (scope.searchStr && scope.searchStr.length > 0 && scope.currentIndex === -1) {\n handleOverrideSuggestions();\n }\n }\n }\n };\n\n scope.resetHideResults = function () {\n if (hideTimer) {\n $timeout.cancel(hideTimer);\n }\n };\n\n scope.hoverRow = function (index, isHistory) {\n if (isHistory) {\n scope.currentHistoryIndex = index;\n }\n else {\n scope.currentIndex = index;\n }\n };\n\n scope.removeHover = function (isHistory) {\n if (isHistory) {\n scope.currentHistoryIndex = -1;\n }\n else {\n scope.currentIndex = -1;\n }\n };\n\n scope.selectResult = function (result) {\n // Restore original values\n if (scope.matchClass) {\n result.title = extractTitle(result.originalObject);\n result.description = extractValue(result.originalObject, scope.descriptionField);\n }\n\n if (scope.clearSelected) {\n scope.searchStr = null;\n }\n else if (scope.updateInputOnSelect) {\n updateInputField();\n }\n else {\n inputField.val(scope.searchStr);\n }\n callOrAssign(result);\n clearResults(!scope.clearSelected);\n saveHistoryItem(result);\n };\n\n scope.selectHistoryItem = function (item) {\n scope.searchStr = null;\n scope.showHistoryDropdown = false;\n // Restore original values\n if (scope.matchClass) {\n item.title = extractTitle(item.originalObject);\n item.description = extractValue(item.originalObject, scope.descriptionField);\n }\n callOrAssign(item);\n };\n\n scope.inputChangeHandler = function (str) {\n if (str.length < minlength) {\n cancelHttpRequest();\n clearResults();\n }\n else if (str.length === 0 && minlength === 0) {\n showAll();\n }\n\n if (scope.inputChanged) {\n str = scope.inputChanged(str);\n }\n return str;\n };\n\n //\n // Filter\n //\n scope.changeCategory = function (category, evt, isSingleFilter) {\n if (!category || scope.searching) {\n return;\n }\n\n if (evt) {\n evt.stopImmediatePropagation();\n evt.preventDefault();\n }\n\n if (category === 'all') {\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.checkLastSearchedCategories(category);\n return;\n }\n\n if (isSingleFilter && category) {\n scope.selectedCategories = [category];\n scope.filterActive = true;\n scope.checkLastSearchedCategories(category);\n return;\n }\n\n if (_.contains(scope.selectedCategories, category)) {\n scope.selectedCategories = _.without(scope.selectedCategories, category);\n }\n else {\n if (_.contains(scope.selectedCategories, 'all')) {\n scope.selectedCategories = [];\n }\n scope.selectedCategories.push(category);\n scope.filterActive = true;\n }\n\n if (scope.selectedCategories.length === 0) {\n scope.selectedCategories.push('all');\n scope.filterActive = false;\n }\n\n scope.checkLastSearchedCategories(category);\n\n // if the evt is null, it's comming from the main filter content, so if there are any results. just pop them out.\n // but do this in a little timeout to give it some time to render.\n if (!evt && scope.results && scope.results.length > 0) {\n $timeout(function () {\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n }, 100);\n }\n };\n\n scope.checkLastSearchedCategories = function (category) {\n // Check what was searched last time. If the incoming (clicked) category is not in selectedCategories, then re-run the search.\n\n // Check if there is anything in the input box (will indicate whether the search was already ran or not)\n if (!scope.searchStr || scope.searchStr.length < minlength || !scope.resultsBackup) {\n return;\n }\n\n if (scope.resultsBackup.categories[0] === 'all' && scope.selectedCategories.lastIndexOf('all') === -1) {\n // This means that the last search was done using the 'all' categories keyword. Any incoming category was already included in the search. Just alter the results\n scope.filterResults(category);\n }\n else if (scope.resultsBackup.categories[0] === 'all' && scope.selectedCategories.lastIndexOf('all') > -1) {\n // Show all of them again\n scope.results = _.clone(scope.resultsBackup.results);\n }\n else if (_.contains(scope.resultsBackup.categories, category)) {\n // Read from backup\n scope.filterResults(category);\n }\n else {\n // Do the new search!\n scope.searching = true;\n resetCategories();\n searchTimerComplete(scope.searchStr);\n }\n };\n\n scope.filterResults = function () {\n var fresults = [];\n angular.forEach(scope.resultsBackup.results, function (result) {\n if (_.contains(scope.selectedCategories, result.originalObject.category)) {\n fresults.push(result);\n }\n });\n scope.results = fresults;\n };\n\n scope.openFilter = function () {\n scope.showHistoryDropdown = false;\n scope.showFilterDropdown = !scope.showFilterDropdown;\n if (scope.showFilterDropdown) {\n scope.showDropdown = false;\n }\n if (scope.focusIn) {\n scope.focusIn();\n }\n };\n\n scope.clearInput = function () {\n scope.searchStr = null;\n clearResults();\n inputField.focus();\n };\n\n scope.backBtnClicked = function () {\n scope.searchStr = null;\n cancelHttpRequest();\n clearResults();\n if (scope.focusOut) {\n scope.focusOut();\n }\n $timeout(function () {\n scope.searchFocused = false;\n }, 100);\n };\n\n scope.checkInput = function () {\n return scope.searchStr && scope.searchStr.length > 0 && !scope.searching;\n };\n\n scope.checkSearch = function () {\n return !scope.searchStr || scope.searchStr.length === 0;\n };\n\n scope.isSelected = function (category) {\n return _.contains(scope.selectedCategories, category);\n };\n\n scope.checkFocus = function (evt, isBodyClick) {\n var el;\n\n if (isBodyClick) {\n el = $document[0].getElementById(scope.controlId);\n scope.searchFocused = _.contains(evt.path, el);\n if (!scope.searchFocused) {\n // Remove the listener.\n scope.showFilterDropdown = false;\n scope.showDropdown = false;\n scope.showHistoryDropdown = false;\n angular.element($document[0].body).off('click', bodyClickHandler);\n onBodyClickListener = null;\n if (scope.focusOut) {\n scope.focusOut();\n }\n scope.$apply();\n }\n }\n else {\n scope.searchFocused = evt.currentTarget.id === scope.controlId;\n if (scope.searchFocused && !onBodyClickListener) {\n // Create listener\n onBodyClickListener = angular.element($document[0].body).on('click', bodyClickHandler);\n }\n evt.stopImmediatePropagation();\n }\n };\n\n function checkHistoryItems() {\n // Entry point for the history items. Check with server for this particular input.\n scope.loadingHistory = true;\n Restangular.all(scope.searchService).get('history', {\n searchId: scope.controlId\n }).then(function (results) {\n if (results && results.plain().records) {\n processResults(results.plain().records, '', true);\n }\n }).finally(function () {\n scope.loadingHistory = false;\n });\n }\n\n function saveHistoryItem(result) {\n // Entry point for saving the selected item into history.\n // We shall provide the input name so we can get the different history items for different instances of this directive\n if (scope.hasHistory && result && result.originalObject) {\n Restangular.one(scope.searchService).customPOST(result.originalObject, 'history?searchId=' + scope.controlId)\n .then(function (results) {\n if (results && results.records) {\n scope.historyItems = [];\n processResults(results.records, '', true);\n }\n });\n }\n }\n\n // check required\n if (scope.fieldRequiredClass && scope.fieldRequiredClass !== '') {\n requiredClassName = scope.fieldRequiredClass;\n }\n\n // check min length\n if (scope.minlength && scope.minlength !== '') {\n minlength = parseInt(scope.minlength, 10);\n }\n\n // check pause time\n if (!scope.pause) {\n scope.pause = PAUSE;\n }\n\n // check clearSelected\n if (!scope.clearSelected) {\n scope.clearSelected = false;\n }\n\n // check override suggestions\n if (!scope.overrideSuggestions) {\n scope.overrideSuggestions = false;\n }\n\n // check required field\n if (scope.fieldRequired && ctrl) {\n // check initial value, if given, set validitity to true\n if (scope.initialValue) {\n handleRequired(true);\n }\n else {\n handleRequired(false);\n }\n }\n\n scope.inputType = attrs.type ? attrs.type : 'text';\n\n // set strings for \"Searching...\" and \"No results\"\n scope.textSearching = attrs.textSearching ? attrs.textSearching : TEXT_SEARCHING;\n scope.textNoResults = attrs.textNoResults ? attrs.textNoResults : TEXT_NORESULTS;\n displaySearching = scope.textSearching === 'false' ? false : true;\n displayNoResults = scope.textNoResults === 'false' ? false : true;\n\n // set max length (default to maxlength deault from html\n scope.maxlength = attrs.maxlength ? attrs.maxlength : MAX_LENGTH;\n\n // register events\n inputField.on('keydown', keydownHandler);\n inputField.on('keyup compositionend', keyupHandler);\n\n // set response formatter\n responseFormatter = callFunctionOrIdentity('remoteUrlResponseFormatter');\n\n // set isScrollOn\n $timeout(function () {\n var css = $window.getComputedStyle(dd);\n isScrollOn = css.maxHeight && css.overflowY === 'auto';\n });\n\n // Process history items. Shall be removed for PILOT and PROD!\n checkHistoryItems();\n }\n\n return {\n restrict: 'EA',\n require: '^?form',\n replace: true,\n transclude: true,\n scope: {\n selectedObject: '=',\n selectedObjectData: '=',\n disableInput: '=',\n initialValue: '=',\n localData: '=',\n localSearch: '&',\n remoteUrlRequestFormatter: '=',\n remoteUrlRequestWithCredentials: '@',\n remoteUrlResponseFormatter: '=',\n remoteUrlErrorCallback: '=',\n remoteApiHandler: '=',\n controlId: '@',\n type: '@',\n placeholder: '@',\n textSearching: '@',\n textNoResults: '@',\n remoteUrl: '@',\n remoteUrlDataField: '@',\n titleField: '@',\n subtitleField: '@',\n descriptionField: '@',\n descriptionField2: '@',\n categoryField: '@',\n imageField: '@',\n inputClass: '@',\n pause: '@',\n searchFields: '@',\n minlength: '@',\n matchClass: '@',\n clearSelected: '=',\n overrideSuggestions: '@',\n fieldRequired: '=',\n fieldRequiredClass: '@',\n inputChanged: '=',\n autoMatch: '@',\n focusOut: '&',\n focusIn: '&',\n fieldTabindex: '@',\n inputName: '@',\n focusFirst: '@',\n parseInput: '&',\n searchCategories: '=',\n blurOnSelect: '=',\n searchServiceEndPoint: '@',\n searchService: '@',\n resultTemplateUrl: '@',\n hasBackButton: '=',\n updateInputOnSelect: '=',\n isDropdownRelative: '=',\n hasCategoryFilter: '=?',\n hasHistory: '=?'\n },\n templateUrl: 'search/search-autocomplete-directive.tpl.html',\n /* templateUrl: function (element, attrs) {\n return attrs.templateUrl || TEMPLATE_URL;\n }, */\n compile: function (tElement) {\n var startSym = $interpolate.startSymbol(),\n endSym = $interpolate.endSymbol(),\n interpolatedHtml = null;\n\n if (!(startSym === '{{' && endSym === '}}')) {\n interpolatedHtml = tElement.html()\n .replace(/\\{\\{/g, startSym)\n .replace(/\\}\\}/g, endSym);\n tElement.html(interpolatedHtml);\n }\n return link;\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name lead\n * @description\n *\n */\n angular\n .module('lead', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name myPod.service:MyPod\n *\n * @description\n *\n */\n MyPod.$inject = [\"Restangular\", \"$document\", \"$uibModal\"];\n angular\n .module('lead')\n .service('MyPod', MyPod);\n\n function MyPod(Restangular, $document, $uibModal) {\n var self = this;\n\n /**\n * Joins the currently logged in user to the other user's pod and his default reward program.\n *\n * @param {string} userId Id of the user that current user will join (will become member of his pod)\n * @return {Deferred} Deferred promise\n */\n self.quickJoin = function (userId) {\n return Restangular.one('Members').post('joinRewardProgram', {idUser: userId});\n };\n\n /**\n * Opens the modal dialog and sends invite to the business so the logged-in user can start sending the leads.\n * @param {string} myProfile Profile of the logged in user\n * @param {string} userProfile Profile of the targeted user (business)\n * @return {Deferred} Deferred promise\n */\n self.openSendInvite = function (myProfile, userProfile) {\n var slModalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'my-pod/send-invite/send-invite-modal.tpl.html',\n controller: 'SendInviteModalCtrl',\n controllerAs: 'sendInvite',\n size: 'md',\n resolve: {\n myProfile: function () {\n return myProfile;\n },\n userProfile: function () {\n return userProfile;\n }\n }\n });\n\n return slModalInstance.result;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod\n * @description\n *\n */\n angular\n .module('myPod', [\n 'ui.router',\n 'myPod.members',\n 'myPod.sentLeads',\n 'myPod.sendInvite'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('myPod')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myPod', {\n url: '/my-pod',\n templateUrl: 'my-pod/my-pod.tpl.html',\n controller: 'MyPodCtrl',\n controllerAs: 'myPod',\n authenticate: true\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.controller:MyPodCtrl\n *\n * @description\n *\n */\n MyPodCtrl.$inject = [\"Session\", \"MyPod\"];\n angular\n .module('myPod')\n .controller('MyPodCtrl', MyPodCtrl);\n\n function MyPodCtrl(Session, MyPod) {\n var vm = this;\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'People in my Pod',\n value: 'members',\n url: 'myPod.members'\n },\n {\n label: 'Sent Leads',\n value: 'sentLeads',\n url: 'myPod.sentLeads'\n }\n ];\n\n Session.getUserProfile().then(function (userProfile) {\n vm.userProfile = userProfile;\n });\n\n vm.sendInvite = function () {\n MyPod.openSendInvite(vm.userProfile);\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships\n * @description\n *\n */\n angular\n .module('myMemberships', [\n 'ui.router',\n 'myMemberships.memberships',\n 'myMemberships.receivedLeads',\n 'myMemberships.joinPod',\n 'myMemberships.sendReward',\n 'myMemberships.rewardProgram',\n 'myMemberships.import'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name myMemberships.directive:rewardSelector\n * @restrict EA\n * @element\n */\n angular\n .module('myMemberships')\n .directive('rewardSelector', rewardSelector);\n\n function rewardSelector() {\n return {\n restrict: 'EA',\n scope: {\n user: '=user',\n change: '&onChange',\n hasMonthlySubscription: '@',\n hasCode: '@',\n hasDefaultProgram: '@',\n hasPayPerLead: '@',\n hasCreditCard: '@',\n hasCancelAgreement: '@',\n clearOnBroadcast: '@',\n default: '@'\n },\n templateUrl: 'my-memberships/reward-selector-directive.tpl.html',\n replace: true,\n transclude: true,\n controllerAs: 'rewards',\n controller: ['$scope', '$filter', '$timeout', '$document', function ($scope, $filter, $timeout, $document) {\n var vm = this;\n\n vm.hasUser = angular.isDefined($scope.user) ? $scope.user : false;\n vm.hasDefaultProgram = angular.isDefined($scope.hasDefaultProgram) ? $scope.hasDefaultProgram === 'true' : true;\n vm.hasCode = angular.isDefined($scope.hasCode) ? $scope.hasCode === 'true' : true;\n vm.hasPayPerLead = angular.isDefined($scope.hasPayPerLead) ? $scope.hasPayPerLead === 'true' : true;\n vm.hasMonthlySubscription = angular.isDefined($scope.hasMonthlySubscription) ? $scope.hasMonthlySubscription === 'true' : true;\n vm.hasCC = angular.isDefined($scope.hasCreditCard) ? $scope.hasCreditCard === 'true' : true;\n vm.hasCancelAgreement = angular.isDefined($scope.hasCancelAgreement) ? $scope.hasCancelAgreement === 'true' : false;\n vm.clearOnBroadcast = angular.isDefined($scope.clearOnBroadcast) ? $scope.clearOnBroadcast : null;\n\n // Important. If the selector has default program, but no user is specified (it's most likely someone else's program other than the logged-in user)\n // then lock the default program (don't list the values!)\n if (vm.hasDefaultProgram && !vm.hasUser) {\n vm.hasLockedDefaultProgram = true;\n }\n\n if (vm.clearOnBroadcast) {\n $scope.$on(vm.clearOnBroadcast, function () {\n // Clear the form\n vm.data = {\n contractType: $scope.default || (vm.hasDefaultProgram ? 'Rewards Program' : null),\n leadPrice: null,\n successfulLeadPrice: null,\n subscriptionPrice: null,\n creditCard: {},\n rewardCode: null\n };\n });\n }\n\n vm.user = $scope.user;\n\n vm.isFormValid = false;\n vm.data = {\n contractType: $scope.default || (vm.hasDefaultProgram ? 'Rewards Program' : null),\n leadPrice: null,\n successfulLeadPrice: null,\n subscriptionPrice: null,\n creditCard: {},\n rewardCode: null\n };\n vm.rewardsProgramSetup = [];\n vm.rewardCodes = {};\n vm.selectedRewardCode = '';\n vm.selectedRewardCodeLabel = 'Reward Code';\n vm.isRewardsProgramDetailVisible = false;\n\n if (vm.hasCC) {\n vm.showCCForm = !vm.user.isCCSet;\n }\n\n // Setup the Reward selectors id, value, desc\n vm.selectors = {\n default: {\n id: 'rewardsProgram',\n value: 'Rewards Program',\n desc: 'Rewards Program'\n },\n code: {\n id: 'rewardCodeSelector',\n value: 'Reward Code',\n desc: 'Reward Code'\n },\n payPerLead: {\n id: 'payPerLead',\n value: 'Pay Per Lead',\n desc: 'Pay Per Lead'\n },\n subscription: {\n id: 'monthlySubscription',\n value: 'Subscription',\n desc: 'Monthly Subscription'\n },\n cancel: {\n id: 'cancelAgreement',\n value: 'Cancel',\n desc: 'Cancel Agreement'\n }\n };\n\n // Subscribe to the local update\n $scope.$on('event:user-updateLocalProfile', function () {\n if ($scope.user.rewardCodes) {\n vm.renderRewardCodes($scope.user.rewardCodes);\n }\n if (vm.hasDefaultProgram && !vm.hasLockedDefaultProgram && $scope.user.defaultRewardProgram) {\n vm.renderRewardProgramOptions($scope.user.defaultRewardProgram);\n }\n });\n\n // Render the reward codes.\n vm.renderRewardCodes = function (rewardCodes) {\n angular.forEach(rewardCodes, function (item) {\n var options = [];\n angular.forEach($filter('orderBy')(item.pricingOptions, 'successfulLeadPrice'), function (option) {\n options.push(option.name + ': ' + $filter('currency')(option.successfulLeadPrice, '$', 0));\n });\n vm.rewardCodes[item.rewardCode] = item.rewardCode + ' - ' + options.join(', ');\n });\n };\n if (vm.hasCode && $scope.user.rewardCodes) {\n vm.renderRewardCodes($scope.user.rewardCodes);\n }\n\n // Render reward program option\n vm.renderRewardProgramOptions = function (options) {\n if (options && options.length > 0) {\n angular.forEach(options, function (option) {\n vm.rewardsProgramSetup.push(option);\n });\n }\n else {\n vm.isRewardsProgramDetailVisible = true;\n }\n };\n if (vm.hasDefaultProgram && !vm.hasLockedDefaultProgram && $scope.user.defaultRewardProgram) {\n vm.renderRewardProgramOptions($scope.user.defaultRewardProgram);\n }\n\n vm.onContractTypeChange = function (value, form, evt) {\n var elementToFocus;\n if (vm.data.contractType === value) {\n return;\n }\n\n vm.data.contractType = value;\n if (vm.data.contractType === 'Pay Per Lead' || vm.data.contractType === 'Reward Code' || vm.data.contractType === 'Rewards Program') {\n delete form.$error.ccExp;\n delete form.$error.ccNumber;\n delete form.$error.ccNumberType;\n delete form.$error.ccExpMonth;\n delete form.$error.ccExpYear;\n }\n\n switch (vm.data.contractType) {\n case 'Pay Per Lead':\n elementToFocus = 'successfulLeadPrice';\n break;\n case 'Subscription':\n elementToFocus = 'subscriptionPrice';\n break;\n case 'Reward Code':\n elementToFocus = 'rewardCode';\n break;\n default:\n elementToFocus = null;\n break;\n }\n\n if (elementToFocus !== null) {\n $timeout(function () {\n angular.element($document[0].getElementById(elementToFocus))[0].focus();\n }, 200);\n }\n\n if (evt) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n vm.onValueChanged();\n };\n\n vm.toggleRewardsProgramDetailVisibility = function () {\n vm.isRewardsProgramDetailVisible = !vm.isRewardsProgramDetailVisible;\n };\n\n vm.isValid = function () {\n var isValid = true;\n\n if (!vm.data.contractType) {\n isValid = false;\n return isValid;\n }\n\n if (vm.data.contractType === 'Rewards Program' && vm.hasUser && (!vm.rewardsProgramSetup || vm.rewardsProgramSetup.length === 0) ||\n vm.data.contractType === 'Reward Code' && !vm.data.rewardCode ||\n vm.data.contractType === 'Pay Per Lead' && !vm.data.successfulLeadPrice) {\n isValid = false;\n }\n // Do the CC separately\n if (vm.data.contractType === 'Subscription') {\n if (!vm.data.subscriptionPrice) {\n isValid = false;\n }\n else if (vm.showCCForm && (!vm.data.creditCard.holderName || !vm.data.creditCard.number || !vm.data.creditCard.expiryMonth || !vm.data.creditCard.expiryYear)) {\n isValid = false;\n }\n }\n return isValid;\n };\n\n vm.checkValidity = function () {\n // This is being run by the watcher in the dom (ngClass). It's here to check on the initial state of the form and will notify change callback only if the validity changes.\n var isValid = vm.isValid();\n if (vm.isFormValid !== isValid) {\n $scope.change({formData: vm.data, isFormValid: isValid});\n vm.isFormValid = isValid;\n }\n };\n\n vm.onValueChanged = function () {\n // This is being triggered by every change of any of the inputs. Will trigger the change callback each time.\n var isValid = vm.isValid();\n $scope.change({formData: vm.data, isFormValid: isValid});\n };\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name myMemberships.service:MyMemberships\n *\n * @description\n *\n */\n MyMemberships.$inject = [\"$document\", \"$uibModal\"];\n angular\n .module('myMemberships')\n .service('MyMemberships', MyMemberships);\n\n function MyMemberships($document, $uibModal) {\n var self = this;\n\n self.openAskForLeads = function (myProfile, userProfile) {\n var slModalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'my-memberships/join-pod/join-pod-modal.tpl.html',\n controller: 'JoinPodModalCtrl',\n controllerAs: 'joinPod',\n size: 'md',\n resolve: {\n myProfile: function () {\n return myProfile;\n },\n userProfile: function () {\n return userProfile;\n }\n }\n });\n\n return slModalInstance.result;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('myMemberships')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myMemberships', {\n url: '/my-memberships',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n authenticate: true,\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.controller:MyMembershipsCtrl\n *\n * @description\n *\n */\n MyMembershipsCtrl.$inject = [\"Notification\", \"userProfile\", \"BusinessAccount\", \"Auth\", \"MyMemberships\"];\n angular\n .module('myMemberships')\n .controller('MyMembershipsCtrl', MyMembershipsCtrl);\n\n function MyMembershipsCtrl(Notification, userProfile, BusinessAccount, Auth, MyMemberships) {\n var vm = this;\n vm.isActivating = false;\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Connections',\n value: 'memberships',\n url: 'myMemberships.memberships'\n },\n {\n label: 'Received Leads',\n value: 'receivedLeads',\n url: 'myMemberships.receivedLeads'\n },\n {\n label: 'Reward Codes',\n value: 'rewardPrograms',\n url: 'myMemberships.rewardPrograms'\n },\n {\n label: 'Import',\n value: 'import',\n url: 'myMemberships.import',\n condition: function () {\n return vm.isImportAllowed();\n }\n }\n ];\n\n // Get the trial subscription data (if any)\n vm.trialData = BusinessAccount.getTrialData(userProfile);\n\n vm.isBusinessAccountActive = function () {\n return angular.isObject(userProfile) && angular.isDefined(userProfile.isBusinessAccountActive) && userProfile.isBusinessAccountActive === true;\n };\n\n vm.isImportAllowed = function () {\n return Auth.hasUserPermission(userProfile, 'importMemberships');\n };\n\n vm.activateBusinessAccount = function () {\n vm.isActivating = true;\n BusinessAccount.initiateActivation('my-memberships-ctrl-container', vm.trialData.isEligibleForTrial)\n .then(function (newUserProfile) {\n Notification({message: 'Your business account has been successfully activated.'}, 'confirmation');\n vm.isActivating = false;\n userProfile = newUserProfile;\n }, function () {\n vm.isActivating = false;\n });\n };\n\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(userProfile, null);\n modalInstance.then(function (receiveLeads) {\n vm.receiveLeads = receiveLeads;\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlpMarketplace\n * @description\n *\n */\n angular\n .module('mlpMarketplace', [\n 'ui.router'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('mlpMarketplace')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('marketplace', {\n url: '/marketplace/:id',\n templateUrl: 'mlp-marketplace/marketplace.tpl.html',\n controller: 'MarketplaceCtrl',\n controllerAs: 'marketplace',\n authenticate: true,\n params: {\n id: {\n value: null,\n squash: true\n }\n },\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n marketplaceItem: ['$stateParams', 'Restangular', 'Auth', function ($stateParams, Restangular, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n // If no ID is provided, we will show all marketplace addons\n if (!$stateParams.id) {\n return null;\n }\n // If ID is provided, then we will try to load the marketplace item. If not found, display a message\n return Restangular.one('Marketplace').one('index').get({id: $stateParams.id})\n .then(function (addon) {\n return addon.plain();\n }, function () {\n return false;\n });\n }\n return null;\n }, function () {\n return null;\n });\n }]\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlpMarketplace.service:Marketplace\n * @requires $document\n * @requires $uibModal\n * @requires Restangular\n * @requires Notification\n * @requires Session\n * @description\n *\n */\n Marketplace.$inject = [\"$rootScope\", \"$document\", \"$state\", \"$uibModal\", \"Restangular\", \"Notification\", \"Session\"];\n angular\n .module('mlpMarketplace')\n .service('Marketplace', Marketplace);\n\n function Marketplace($rootScope, $document, $state, $uibModal, Restangular, Notification, Session) {\n var self = this;\n\n /**\n * Opens the modal dialog for the preferences settings\n *\n * @param {object} userProfile object User profile for which the preferences will be loaded\n */\n self.open = function () {\n $state.go('marketplace');\n };\n\n self.openInfo = function (item) {\n return $uibModal.open({\n animation: false,\n templateUrl: 'mlp-marketplace/marketplace-info-modal.tpl.html',\n controller: 'MarketplaceInfoCtrl',\n controllerAs: 'marketplaceInfo',\n size: 'lg',\n resolve: {\n marketplaceItem: function () {\n return item;\n }\n },\n appendTo: angular.element($document[0].body)\n }).result;\n };\n\n self.deactivate = function (item) {\n return Restangular.one('Marketplace').customDELETE('deactivate', {\n id: item.id\n });\n };\n\n /**\n * @ngdoc function\n * @name initiateActivation\n * @methodOf mlpMarketplace.service:Marketplace\n * @param {Object} item Marketplace item\n *\n * @returns {Promise} Modal dialog result\n */\n self.initiateActivation = function (item) {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'mlp-marketplace/marketplace-activation-modal.tpl.html',\n controller: 'MarketplaceActivationCtrl',\n controllerAs: 'marketplaceActivation',\n size: 'lg',\n backdrop: 'static',\n resolve: {\n marketplaceItem: function () {\n return item;\n }\n }\n });\n\n return modalInstance.result;\n };\n\n /**\n * @ngdoc function\n * @name activate\n * @methodOf mlpMarketplace.service:Marketplace\n * @param {Object} item Marketplace item\n * @param {Object} creditCard CC data\n * @returns {Promise} Restangular promise\n */\n self.activate = function (item, creditCard) {\n return Restangular.one('Marketplace').customPOST({\n id: item.id,\n creditCard: creditCard\n }, 'activate')\n .then(function (result) {\n var profile = Session.updateLocalUserProfile({\n marketplace: result.plain().marketplace\n }, true);\n Notification({message: 'Success'}, 'success');\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpMarketplace.directive:MarketplaceListings\n * @requires $timeout\n * @requires $uibModalInstance\n * @requires userProfile\n * @requires components.ui.PromptDialog\n * @requires components.FormAlerts\n * @requires mlpMarketplace.Marketplace\n * @description\n *\n */\n angular\n .module('mlpMarketplace')\n .directive('marketplaceListings', marketplaceListings);\n\n function marketplaceListings() {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n items: '=',\n hasUserAvatar: '='\n },\n\n replace: true,\n transclude: false,\n templateUrl: 'mlp-marketplace/marketplace-listings-directive.tpl.html',\n controllerAs: 'marketplace',\n controller: ['$scope', '$timeout', 'PromptDialog', 'FormAlerts', 'Marketplace', function ($scope, $timeout, PromptDialog, FormAlerts, Marketplace) {\n var vm = this;\n vm.userProfile = $scope.user;\n vm.hasUserAvatar = $scope.hasUserAvatar || false;\n\n vm.items = $scope.items || vm.userProfile.marketplace;\n vm.isLoading = [];\n vm.isProcessing = false;\n vm.alerts = new FormAlerts();\n\n vm.switchSubscription = function ($index) {\n if (vm.isLoading[$index]) {\n return;\n }\n if (vm.items[$index].isSubscribed) {\n vm.deactivate($index);\n }\n else {\n vm.activate($index);\n }\n };\n\n vm.activate = function ($index) {\n var item = vm.items[$index];\n if (!item.isSubscribed) {\n vm.isLoading[$index] = true;\n vm.isProcessing = true;\n Marketplace.initiateActivation(vm.items[$index])\n .then(function (result) {\n if (result.active) {\n item.isSubscribed = true;\n }\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n }, function () {\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n });\n }\n };\n\n vm.deactivate = function ($index) {\n var item = vm.items[$index];\n if (item.isSubscribed) {\n vm.alerts.reset();\n PromptDialog.open('By clicking Deactivate, you will immediately cancel your subscription', null, 'Deactivate', 'Cancel')\n .then(function () {\n vm.isLoading[$index] = true;\n vm.isProcessing = true;\n Marketplace.deactivate(item)\n .then(function () {\n item.isSubscribed = false;\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n }, function () {\n vm.alerts.add('danger', 'Unable to deactivate subscription.');\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n });\n });\n }\n };\n\n vm.openInfo = function ($index) {\n Marketplace.openInfo(vm.items[$index]);\n };\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name mlpMarketplace.controller:MarketplaceInfoCtrl\n *\n * @description\n *\n */\n MarketplaceInfoCtrl.$inject = [\"$scope\", \"$sce\", \"$uibModalInstance\", \"marketplaceItem\", \"Restangular\", \"PromptDialog\", \"Marketplace\", \"Notification\"];\n angular\n .module('mlpMarketplace')\n .controller('MarketplaceInfoCtrl', MarketplaceInfoCtrl);\n\n function MarketplaceInfoCtrl($scope, $sce, $uibModalInstance, marketplaceItem, Restangular, PromptDialog, Marketplace, Notification) {\n var vm = this;\n vm.item = marketplaceItem;\n vm.isLoading = false;\n vm.isUpdating = false;\n\n if (!marketplaceItem.info) {\n vm.isLoading = true;\n\n Restangular.one('Marketplace').one('index').get({id: marketplaceItem.id})\n .then(function (result) {\n marketplaceItem.info = $sce.trustAsHtml(result.info);\n vm.isLoading = false;\n }, function () {\n vm.isLoading = false;\n });\n }\n\n // Listen to the broadcast of 'close-modal-instance'\n $scope.$on('close-modal-instance', function () {\n $uibModalInstance.dismiss();\n });\n\n vm.close = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.switchSubscription = function () {\n if (vm.isUpdating) {\n return;\n }\n if (vm.item.isSubscribed) {\n vm.deactivate();\n }\n else {\n vm.activate();\n }\n };\n\n vm.activate = function () {\n var item = vm.item;\n if (!item.isSubscribed) {\n vm.isUpdating = true;\n Marketplace.initiateActivation(item)\n .then(function (result) {\n if (result.active) {\n item.isSubscribed = true;\n }\n vm.isUpdating = false;\n }, function () {\n vm.isUpdating = false;\n });\n }\n };\n\n vm.deactivate = function () {\n var item = vm.item;\n if (item.isSubscribed) {\n PromptDialog.open('By clicking Deactivate, you will immediately cancel your subscription', null, 'Deactivate', 'Cancel')\n .then(function () {\n vm.isUpdating = true;\n vm.isProcessing = true;\n Marketplace.deactivate(item)\n .then(function () {\n Notification({message: 'Success'}, 'confirmation');\n item.isSubscribed = false;\n vm.isUpdating = false;\n }, function () {\n Notification({message: 'Unable to unsubscribe.'}, 'warning');\n vm.isUpdating = false;\n });\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name mlpMarketplace.controller:MarketplaceCtrl\n * @requires $timeout\n * @requires $uibModalInstance\n * @requires userProfile\n * @requires components.ui.PromptDialog\n * @requires components.FormAlerts\n * @requires mlpMarketplace.Marketplace\n * @description\n *\n */\n MarketplaceCtrl.$inject = [\"Marketplace\", \"userProfile\", \"marketplaceItem\", \"Notification\"];\n angular\n .module('mlpMarketplace')\n .controller('MarketplaceCtrl', MarketplaceCtrl);\n\n function MarketplaceCtrl(Marketplace, userProfile, marketplaceItem, Notification) {\n var vm = this,\n items = userProfile.marketplace,\n mlpFilter;\n\n vm.isGrid = true;\n vm.viewMLP = true;\n vm.userProfile = userProfile;\n\n // MLP Items have priority\n mlpFilter = _.filter(items, function (item) {\n return angular.isObject(item.owner) && ((/cs(\\+([\\s\\S]*?))?@myleadpod\\.com/).test(item.owner.email) || item.owner.email === 'sales@myleadpod.com');\n });\n vm.mlpItems = _.sortBy(mlpFilter, 'label');\n\n // Other Marketplace items\n vm.items = _.filter(items, function (item) {\n return !angular.isObject(item.owner) || !(/cs(\\+([\\s\\S]*?))?@myleadpod\\.com/).test(item.owner.email) && item.owner.email !== 'sales@myleadpod.com';\n });\n\n // Check if we are opening the whole marketplace or details of the addon directly\n if (angular.isObject(marketplaceItem)) {\n // Seems like we have the addon object. open the details\n Marketplace.openInfo(marketplaceItem);\n }\n else if (marketplaceItem === false) {\n // Display notification that the marketplace addon doesn't exist\n Notification({message: 'The requested Marketplace Item is invalid or it doesn\\'t exist.', duration: 5000}, 'warning');\n }\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name mlpMarketplace.controller:MarketplaceInfoCtrl\n * @requires $uibModelInstance\n * @requires FormAlerts\n * @requires marketplaceItem\n * @requires Restangular\n * @requires mlpMarketplace.Marketplace\n * @description\n *\n */\n MarketplaceActivationCtrl.$inject = [\"$timeout\", \"$uibModalInstance\", \"FormAlerts\", \"marketplaceItem\", \"Restangular\", \"Marketplace\"];\n angular\n .module('mlpMarketplace')\n .controller('MarketplaceActivationCtrl', MarketplaceActivationCtrl);\n\n function MarketplaceActivationCtrl($timeout, $uibModalInstance, FormAlerts, marketplaceItem, Restangular, Marketplace) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.item = marketplaceItem;\n vm.isPaymentRequired = !vm.item.isFree;\n vm.isLoading = false;\n vm.isCCLoading = false;\n vm.creditCard = null;\n vm.data = {\n creditCard: {}\n };\n\n vm.paymentSummary = {\n price: vm.item.priceMonthly,\n tax: vm.item.priceMonthlyInclGst - vm.item.priceMonthly,\n total: vm.item.priceMonthlyInclGst\n };\n\n if (vm.isPaymentRequired) {\n vm.isCCLoading = true;\n Restangular.one('Billing').one('creditCard').get()\n .then(function (cc) {\n cc = cc.plain();\n vm.data.creditCard.method = angular.isObject(cc) && angular.isDefined(cc.number) ? 'old' : 'new';\n vm.creditCard = cc;\n $timeout(function () {\n vm.isCCLoading = false;\n }, 300);\n }, function () {\n vm.isCCLoading = false;\n });\n }\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.activate = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Marketplace.activate(vm.item, vm.data.creditCard)\n .then(function () {\n vm.isLoading = false;\n $uibModalInstance.close({active: true});\n }, function () {\n vm.alerts.add('danger', 'Unable to activate subscription.');\n vm.isLoading = false;\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlp-messaging\n * @description\n *\n */\n angular\n .module('mlp-messaging', []);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name lead.service:Leads\n *\n * @description\n *\n */\n Messaging.$inject = [\"$rootScope\", \"$document\", \"$state\", \"$q\", \"Notification\", \"$uibModal\", \"Restangular\"];\n angular\n .module('mlp-messaging')\n .service('Messaging', Messaging);\n\n function Messaging($rootScope, $document, $state, $q, Notification, $uibModal, Restangular) {\n var self = this;\n\n self.getMessages = function (params) {\n return Restangular.one('Messages').one('index').get(params)\n .then(function (result) {\n return result.plain();\n }, function (error) {\n return {\n error: error\n };\n });\n };\n\n self.postMessage = function (idUser, params) {\n return Restangular.one('Messages').post('index', params, {idUser: idUser})\n .then(function (result) {\n return result.plain();\n }, function (error) {\n return {\n error: error\n };\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpMessaging.directive:messagingFormDirective\n * @restrict EA\n * @element\n *\n */\n messagingForm.$inject = [\"$timeout\"];\n angular\n .module('mlp-messaging')\n .directive('messagingForm', messagingForm);\n\n function messagingForm($timeout) {\n return {\n restrict: 'EA',\n scope: {\n msgId: '=?',\n msgRequestParams: '=?',\n msgRecipient: '=?',\n msgGrouping: '=?',\n msgWatchParams: '=?',\n msgLoadCallback: '='\n },\n replace: true,\n templateUrl: 'messaging/messaging-form-directive.tpl.html',\n controllerAs: 'msg',\n link: {\n post: function (scope, elem, attrs, ctrl) {\n // Check the scroll of the element containing the message so we could pull more.\n $timeout(function () {\n var messagesContainer = elem.find('.messages-container.has-data')[0];\n messagesContainer.onscroll = function () {\n if (messagesContainer.scrollTop === 0 && !ctrl.loading && ctrl.lastDataCount >= ctrl.limit) {\n // get new data\n ctrl.loadMore();\n }\n };\n }, 10);\n }\n },\n controller: ['$scope', '$document', '$interval', 'Session', 'Messaging', 'configOptions', function ($scope, $document, $interval, Session, Messaging) {\n var vm = this,\n messageIntervalUpdate = null;\n\n vm.sender = null;\n vm.recipient = $scope.msgRecipient;\n vm.grouping = $scope.msgGrouping;\n vm.watchParams = $scope.msgWatchParams;\n vm.onLoadCallback = $scope.msgLoadCallback;\n vm.id = $scope.msgId ? $scope.msgId : 'msg';\n\n vm.messageStr = null;\n vm.messages = [];\n vm.loading = false;\n vm.hasError = false;\n vm.requestParams = $scope.msgRequestParams ? angular.copy($scope.msgRequestParams) : {};\n vm.postParams = {\n message: null\n };\n vm.notification = null;\n vm.lastDataCount = 0;\n vm.limit = 20;\n vm.offset = 0;\n vm.offsetIncrement = 20;\n vm.appendMessages = false;\n vm.savingMessages = {};\n\n if (!vm.recipient) {\n vm.hasError = true;\n vm.notification = 'Unknown recipient';\n return;\n }\n\n // Check the scroll of the element containing the message so we could pull more.\n // console.log(vm.element);\n\n // Mixin the value from requestParam into the postParam so we have the correct object to send.\n if (vm.requestParams) {\n angular.forEach(vm.requestParams, function (value, key) {\n vm.postParams[key] = value;\n });\n }\n\n vm.loadMessages = function (append) {\n // For UI\n vm.loading = true;\n vm.hasError = false;\n vm.appendMessages = append || false;\n\n // Update the request param object\n vm.requestParams.limit = vm.limit;\n vm.requestParams.offset = vm.offset;\n\n // Get the messages\n Messaging.getMessages(vm.requestParams).then(vm.formatMessages);\n };\n\n vm.formatMessages = function (data) {\n $timeout(function () {\n vm.loading = false;\n vm.appendMessages = false;\n if (vm.onLoadCallback) {\n vm.onLoadCallback.apply();\n }\n }, 100);\n\n if (data && data.error) {\n vm.hasError = true;\n return;\n }\n if (data && data.records && data.records.length > 0) {\n // Try to reformat the messages\n angular.forEach(data.records, function (record) {\n record.message = record.message.replace(/(\\r)?\\n/g, '
    ');\n });\n\n vm.lastDataCount = data.records.length;\n if (vm.appendMessages) {\n vm.messages = vm.messages.concat(data.records);\n }\n else {\n vm.messages = data.records;\n }\n }\n else if (data && data.records && data.records.length === 0) {\n vm.messages = [];\n vm.lastDataCount = 0;\n }\n else {\n vm.lastDataCount = 0;\n }\n };\n\n vm.addMessage = function (message, isTemp) {\n vm.saving = false;\n if (message.error) {\n vm.notification = 'Unable to send the message. Try again.';\n return;\n }\n if (isTemp) {\n vm.savingMessages[message.dateCreated] = message;\n }\n // Sending the message was successful. Clear the textbox\n vm.messageStr = null;\n message.created = vm.getFormattedTime((new Date()).getTime() - (new Date(message.dateCreated)).getTime());\n message.message = message.message.replace(/(\\r)?\\n/g, '
    ');\n vm.messages.unshift(message);\n };\n\n vm.messageSaved = function (message, timeStamp) {\n delete vm.savingMessages[timeStamp];\n };\n\n vm.reload = function () {\n vm.offset = 0;\n vm.loadMessages();\n };\n\n vm.loadMore = function () {\n vm.offset += vm.offsetIncrement;\n vm.loadMessages(true);\n };\n\n vm.send = function () {\n var timeStamp = (new Date()).getTime();\n if (vm.messageStr) {\n vm.saving = true;\n vm.notification = null;\n vm.postParams.message = vm.messageStr;\n vm.addMessage({\n message: vm.messageStr,\n dateCreated: timeStamp\n }, true);\n Messaging.postMessage(vm.recipient.idUser, vm.postParams).then(function (message) {\n vm.messageSaved(message, timeStamp);\n });\n }\n };\n\n vm.updateMessageTimes = function () {\n var now = (new Date()).getTime();\n angular.forEach(vm.messages, function (message) {\n message.created = vm.getFormattedTime(now - (new Date(message.dateCreated)).getTime());\n });\n };\n\n vm.getFormattedTime = function (timegap) {\n var interval = Math.abs(timegap) / 1000,\n granularity = 1,\n zeroInterval = 'now',\n suffix = '',\n short = false,\n units = null,\n output = '';\n\n units = [\n {seconds: 31536000, singular: 'year', plural: 'years', short: 'y'},\n {seconds: 2592000, singular: 'month', plural: 'months', short: 'm'},\n {seconds: 604800, singular: 'week', plural: 'weeks', short: 'w'},\n {seconds: 86400, singular: 'day', plural: 'days', short: 'd'},\n {seconds: 3600, singular: 'hour', plural: 'hours', short: 'h'},\n {seconds: 60, singular: 'min', plural: 'min', short: 'm'}\n ];\n\n angular.forEach(units, function (unit) {\n var count = null;\n if (granularity === 0) {\n return;\n }\n if (interval >= unit.seconds) {\n count = Math.floor(interval / unit.seconds);\n output += (output ? ' ' : '') + count;\n\n if (short) {\n output += unit.short;\n }\n else {\n output += ' ' + (count > 1 ? unit.plural : unit.singular);\n }\n\n interval %= unit.seconds;\n granularity--;\n }\n });\n\n return output ? output + (suffix === '' ? '' : ' ' + suffix) : zeroInterval;\n };\n\n vm.itemRender = function (item, index) {\n var currentGroup,\n lastGroup,\n nextGroup;\n\n if (!vm.grouping || !item) {\n return;\n }\n\n currentGroup = item.groupId;\n lastGroup = vm.messages[index - 1] ? vm.messages[index - 1] : null;\n nextGroup = vm.messages[index + 1] ? vm.messages[index + 1] : null;\n\n item.opensGroup = currentGroup !== lastGroup;\n item.closesGroup = currentGroup !== nextGroup;\n item.noGroup = currentGroup === null;\n };\n\n Session.getUserProfile().then(function (user) {\n vm.user = user;\n vm.requestParams.idUser = vm.recipient.idUser;\n if (angular.isDefined(vm.recipient)) {\n vm.loadMessages();\n }\n });\n\n // we are now all set. Now watch for the msgParameter change so we can update the content.\n if (vm.watchParams) {\n $scope.$watch('msgRequestParams', function (oldVal, newVal) {\n if (oldVal !== newVal) {\n vm.requestParams = $scope.msgRequestParams ? angular.copy($scope.msgRequestParams) : {};\n vm.requestParams.idUser = vm.recipient.idUser;\n if (vm.requestParams) {\n angular.forEach(vm.requestParams, function (value, key) {\n vm.postParams[key] = value;\n });\n }\n vm.loadMessages();\n }\n else if (vm.onLoadCallback) {\n vm.onLoadCallback.apply();\n }\n });\n }\n\n // Setup time formatting interval\n messageIntervalUpdate = $interval(vm.updateMessageTimes, 60000);\n // Clear the message interval upon destroy\n $scope.$on('$destroy', function () {\n $interval.cancel(messageIntervalUpdate);\n });\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlp-charity\n * @description\n *\n */\n angular\n .module('mlp-charity', [\n 'ng-drag-scroll'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name charity.controller:DonateCtrl\n *\n * @description\n *\n */\n DonateCtrl.$inject = [\"$rootScope\", \"$timeout\", \"$q\", \"$uibModalInstance\", \"Notification\", \"Restangular\", \"userProfile\", \"charityProfile\", \"donationsHistory\"];\n angular\n .module('mlp-charity')\n .controller('DonateCtrl', DonateCtrl);\n\n function DonateCtrl($rootScope, $timeout, $q, $uibModalInstance, Notification, Restangular, userProfile, charityProfile, donationsHistory) {\n var vm = this;\n\n vm.isLoading = false;\n vm.isCCLoading = true;\n vm.isLoadingCharity = false;\n vm.isCalculating = false;\n vm.hasError = false;\n vm.userProfile = userProfile;\n vm.charityProfile = charityProfile;\n vm.creditCard = null;\n vm.isSearchVisible = !charityProfile;\n vm.canceler = null;\n\n vm.lastCharities = donationsHistory;\n\n // For Search Autocomplete\n vm.searchCategories = [\n {name: 'Charities', value: 'charities', stateTarget: 'user', iconClass: 'fa-heart-o'}\n ];\n\n // For posting the data\n vm.data = {\n paymentDetails: {\n method: null\n },\n idUserRecipient: charityProfile ? charityProfile.idUser : 0,\n amount: null\n };\n\n // For payment summary\n vm.summary = {\n fee: null,\n tax: null,\n total: null\n };\n\n // Load the Credit Card data\n Restangular.one('Billing').one('creditCard').get()\n .then(function (cc) {\n cc = cc.plain();\n vm.data.paymentDetails.method = angular.isObject(cc) && angular.isDefined(cc.number) ? 'old' : 'new';\n vm.creditCard = cc;\n $timeout(function () {\n vm.isCCLoading = false;\n }, 300);\n }, function () {\n vm.isCCLoading = false;\n });\n\n /**\n * Dismisses the modal dialog\n */\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n /**\n * Sets the charityProfile and populates the title and image in the chosen charity container\n * @param {Object} item Item to pre-fill with\n */\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n if (!item || !item.originalObject || angular.isString(item.originalObject)) {\n return;\n }\n vm.isLoadingCharity = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.isLoadingCharity = false;\n profile = profile.plain();\n // Pre-fill the data now.\n vm.charityProfile = profile;\n vm.isSearchVisible = false;\n });\n };\n\n /**\n * Formats the search response\n *\n * @param {Object} response Response object\n * @returns {Object} Formatted response\n */\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n\n r = response.records;\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = null,\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.leadtype) {\n categoryDescriptionClass += item.leadtype === 'received' ? ' rotate-90' : '';\n value += ' | ' + item.leadfullname;\n }\n else if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n /**\n * Make the donation payment\n */\n vm.donate = function () {\n // Make sure the user recipient is correct\n vm.data.idUserRecipient = vm.charityProfile.idUser;\n vm.isLoading = true;\n\n // Do the request\n Restangular.one('Donations').post('donate', vm.data)\n .then(function () {\n $uibModalInstance.close();\n vm.isLoading = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function (responseData) {\n vm.isLoading = false;\n Notification({message: 'Donation Payment Failed'}, 'error');\n if (responseData.data.errorCode === 701 || responseData.data.errorCode === 702 || responseData.data.errorCode === 703) {\n console.error('Unable to send: ' + responseData.data.errorMessage);\n }\n else {\n console.error('danger', 'Unable to send, try again later please');\n }\n });\n };\n\n /**\n * Sets the incoming profile as the destination / target charity profile\n * @param {object} profile Charity profile receiving the donation\n */\n vm.selectCharity = function (profile) {\n if (vm.charityProfile === profile) {\n return;\n }\n vm.charityProfile = profile;\n vm.isSearchVisible = false;\n };\n\n /**\n * Sets the timer for the search to avoid the unnecessary requests. Once given a go it sends the request to server.\n * @param {boolean} noTimer Indicates whether the trigger of the search should wait or fire immediately.\n */\n vm.calculate = function (noTimer) {\n if (!vm.data.amount) {\n return;\n }\n\n if (noTimer === true) {\n vm.sendCalculate(vm.data.amount);\n return;\n }\n\n if (vm.searchTimer) {\n $timeout.cancel(vm.searchTimer);\n }\n\n vm.isCalculating = true;\n vm.searchTimer = $timeout(function () {\n vm.sendCalculate(vm.data.amount);\n }, 500);\n };\n\n /**\n * Send the request to get the payment summary\n * @param {int} value Value to get the summary calculated for\n */\n vm.sendCalculate = function (value) {\n if (vm.isCalculating && vm.canceler) {\n vm.canceler.resolve();\n }\n\n vm.hasError = false;\n vm.isCalculating = true;\n\n vm.canceler = $q.defer();\n vm.canceler.value = value;\n Restangular.one('Donations').withHttpConfig({timeout: vm.canceler.promise}).one('calculateDonationTotal').get({\n amount: vm.data.amount\n }).then(function (result) {\n var data = result.plain();\n\n if (vm.data.amount !== value) {\n // This will prevent the undesired effect of quickly changing the text in the summary\n // since the canceller doesn't work\n return;\n }\n vm.isCalculating = false;\n try {\n vm.summary.total = Number(data.total);\n vm.summary.fee = Number(data.fees);\n vm.summary.tax = Number(data.tax);\n vm.hasError = false;\n }\n catch (err) {\n vm.hasError = true;\n }\n }, function () {\n vm.isCalculating = false;\n vm.hasError = true;\n });\n };\n\n /**\n * Immediately sends the summary request for the provided value\n * @param {int} value Value to calculate the summary for.\n */\n vm.calculateWith = function (value) {\n if (value && angular.isNumber(value)) {\n vm.data.amount = value;\n vm.calculate(true);\n }\n };\n\n /**\n * On ngKeyPress event handler for the donation amount input.\n * @param {object} $event ngKeyPress event\n */\n vm.onKeyPress = function ($event) {\n if ($event.key === 'Enter') {\n vm.calculate(true);\n }\n };\n\n vm.openSelector = function () {\n vm.isSearchVisible = true;\n };\n\n vm.checkScroll = function () {\n $timeout(function () {\n $rootScope.$broadcast('event:check-scroll');\n }, 100);\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlp-charity.service:Charities\n *\n * @description\n *\n */\n Charities.$inject = [\"$rootScope\", \"$document\", \"$state\", \"$q\", \"Notification\", \"$uibModal\"];\n angular\n .module('mlp-charity')\n .service('Charities', Charities);\n\n function Charities($rootScope, $document, $state, $q, Notification, $uibModal) {\n var self = this;\n\n /**\n * Opens the Modal dialog for donation to charity\n * @param {int} charityId Can be a charity Id (number) or directly a userProfile\n * @returns {*} Modal instance result\n */\n self.openDonate = function (charityId) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'mlp-charity/donate-modal.tpl.html',\n controller: 'DonateCtrl',\n controllerAs: 'donation',\n size: 'lg',\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n charityProfile: ['Restangular', function (Restangular) {\n if (angular.isObject(charityId) && charityId.isCharityAccountActive) {\n return charityId;\n }\n\n if (angular.isNumber(charityId)) {\n return Restangular.one('Users').one('profile').get({id: charityId})\n .then(function (profile) {\n return profile;\n });\n }\n\n return null;\n }],\n donationsHistory: ['Restangular', function (Restangular) {\n return Restangular.one('Donations').getList('lastRecipients')\n .then(function (lastRecipients) {\n return lastRecipients.plain();\n });\n }]\n }\n };\n\n params.appendTo = angular.element($document[0].body);\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:SendLeadCtrl\n *\n * @description\n *\n */\n SendLeadCtrl.$inject = [\"$rootScope\", \"$scope\", \"$document\", \"$timeout\", \"$state\", \"$stateParams\", \"Session\", \"Restangular\", \"Notification\", \"userProfile\", \"isRegister\", \"onCancelCallback\", \"onSentCallback\"];\n angular\n .module('lead')\n .controller('SendLeadCtrl', SendLeadCtrl);\n\n function SendLeadCtrl($rootScope, $scope, $document, $timeout, $state, $stateParams, Session, Restangular, Notification,\n userProfile, isRegister, onCancelCallback, onSentCallback) {\n var vm = this;\n\n vm.isLoading = false;\n vm.validateRecipient = false;\n vm.searchName = '';\n vm.idIndustry = '';\n vm.selectedUsers = [];\n vm.isRegister = isRegister;\n vm.detailsVisible = false;\n vm.controlName = vm.isRegister ? 'register-lead' : 'send-lead';\n if (!vm.isRegister) {\n vm.isRewardsFormValid = true;\n }\n\n vm.emptyResults = false;\n vm.showPrompt = false;\n vm.searchCategories = [\n {name: 'All', value: 'all'},\n {name: 'My Pod', value: 'myPod', iconClass: 'fa-user'},\n {name: 'Directory', value: 'businessUsers', iconClass: 'fa-briefcase'},\n {name: 'Charities', value: 'charities', stateTarget: 'user', iconClass: 'fa-heart-o'},\n {name: 'Leads', value: 'leads', iconClass: 'fa-paper-plane'}\n ];\n vm.userSearchCategories = [];\n\n if (isRegister) {\n vm.userSearchCategories = [\n {name: 'My Connections', value: 'myConnections', iconClass: 'fa-user-o'}\n ];\n }\n else {\n vm.userSearchCategories = [\n {name: 'My Pod', value: 'myPod', iconClass: 'fa-user'}\n ];\n }\n\n vm.selectors = {\n payPerLead: {\n id: 'payPerLead',\n value: 'Pay Per Lead',\n desc: 'Pay Per Lead'\n },\n subscription: {\n id: 'monthlySubscription',\n value: 'Subscription',\n desc: 'Monthly Subscription'\n }\n };\n\n Session.getUserProfile().then(function (profile) {\n if (profile) {\n vm.user = profile;\n if (vm.user.isBusinessAccountActive) {\n vm.searchCategories.push({name: 'My Connections', value: 'myConnections', iconClass: 'fa-user-o'});\n }\n }\n });\n\n vm.data = {\n invitation: {}\n };\n vm.invitations = [];\n\n // If the userProfile is not undefined, this is coming from the send-lead-modal where the user to which the lead is about to be sent is already known.\n if (angular.isDefined(userProfile)) {\n vm.selectedUser = userProfile;\n }\n else if (angular.isDefined($stateParams.user) && angular.isObject($stateParams.user)) {\n vm.selectedUsers.push($stateParams.user);\n }\n\n if (angular.isDefined($stateParams.lead) && angular.isObject($stateParams.lead)) {\n vm.data.firstName = $stateParams.lead.firstName;\n vm.data.lastName = $stateParams.lead.lastName;\n vm.data.email = $stateParams.lead.email;\n vm.data.phone = $stateParams.lead.phone;\n vm.data.details = $stateParams.lead.details;\n }\n\n vm.isValidName = function () {\n return !!vm.data.firstName || !!vm.data.lastName;\n };\n\n vm.isValidContact = function () {\n return !!vm.data.email || !!vm.data.phone;\n };\n\n vm.removeUser = function ($index) {\n vm.selectedUsers.splice($index, 1);\n };\n\n vm.isEmptyNewRecipient = function () {\n var isEmpty = true;\n\n if (angular.isDefined(vm.data.invitation)) {\n if (angular.isDefined(vm.data.invitation.firstName) && !!vm.data.invitation.firstName) {\n isEmpty = false;\n }\n if (angular.isDefined(vm.data.invitation.email) && !!vm.data.invitation.email) {\n isEmpty = false;\n }\n if (angular.isDefined(vm.data.invitation.contractType) && !!vm.data.invitation.contractType) {\n isEmpty = false;\n }\n if (vm.data.invitation.contractType === 'Pay Per Lead') {\n if (angular.isDefined(vm.data.invitation.successfulLeadPrice) && !isNaN(parseFloat(vm.data.invitation.successfulLeadPrice)) && parseFloat(vm.data.invitation.successfulLeadPrice) >= 0) {\n isEmpty = false;\n }\n }\n if (vm.data.invitation.contractType === 'Subscription') {\n if (angular.isDefined(vm.data.invitation.subscriptionPrice) && !isNaN(parseFloat(vm.data.invitation.subscriptionPrice)) && parseFloat(vm.data.invitation.subscriptionPrice) >= 0) {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n };\n\n vm.isValidNewRecipient = function () {\n var isValid = true;\n\n if (!vm.isEmptyNewRecipient()) {\n if (angular.isUndefined(vm.data.invitation.firstName) || !vm.data.invitation.firstName) {\n isValid = false;\n }\n if (angular.isUndefined(vm.data.invitation.email) || !vm.data.invitation.email) {\n isValid = false;\n }\n if (vm.isRegister && (angular.isUndefined(vm.data.invitation.contractType) || !vm.data.invitation.contractType)) {\n isValid = false;\n }\n\n if (vm.data.invitation.contractType === 'Pay Per Lead') {\n if (angular.isUndefined(vm.data.invitation.successfulLeadPrice) || isNaN(parseFloat(vm.data.invitation.successfulLeadPrice)) || parseFloat(vm.data.invitation.successfulLeadPrice) < 0) {\n isValid = false;\n }\n }\n if (vm.data.invitation.contractType === 'Subscription') {\n if (angular.isUndefined(vm.data.invitation.subscriptionPrice) || isNaN(parseFloat(vm.data.invitation.subscriptionPrice)) || parseFloat(vm.data.invitation.subscriptionPrice) < 0) {\n isValid = false;\n }\n }\n }\n\n return isValid;\n };\n\n vm.isValidRecipient = function () {\n return !vm.isEmptyNewRecipient() && vm.isValidNewRecipient() || (vm.selectedUser || vm.selectedUsers.length > 0);\n };\n\n vm.send = function () {\n var data,\n recipientUserIds = [];\n vm.validateRecipient = true;\n\n if (vm.selectedUser) {\n vm.selectedUsers = [vm.selectedUser];\n }\n\n // Extract the userids from the selected users\n angular.forEach(vm.selectedUsers, function (user) {\n recipientUserIds.push(user.id);\n });\n\n // Get the new invitees array into the 'invitation' parameter\n if (!vm.invitations || vm.invitations.length === 0) {\n delete vm.data.invitation;\n }\n else {\n // Bastardise the original 'invitation' parameter to include the array of new invitations.\n vm.data.invitation = _.clone(vm.invitations);\n }\n\n // Finally get the post data object\n data = angular.extend({}, vm.data, {recipientUserIds: recipientUserIds});\n\n vm.isLoading = true;\n Restangular.one('Leads').post('index', data)\n .then(function (result) {\n var failedUsers = [],\n failedUsersIds = [];\n vm.data.invitation = {};\n if (!result.success) {\n angular.forEach(result.failedUsers, function (user) {\n failedUsersIds.push(user.id);\n Notification({message: 'Unable to send lead to ' + user.fullName}, 'error');\n });\n failedUsers = _.remove(vm.selectedUsers, function (u) {\n return failedUsersIds.indexOf(u.id) > -1;\n });\n vm.selectedUsers = failedUsers;\n vm.isLoading = false;\n }\n else {\n $rootScope.$broadcast('event:lead-sent');\n if (vm.selectedUser && onSentCallback) {\n onSentCallback.apply();\n }\n else {\n $state.go('myPod.sentLeads');\n }\n Notification({message: 'Success'}, 'success');\n }\n }, function () {\n vm.isLoading = false;\n Notification({message: 'Unable to send'}, 'error');\n });\n };\n\n vm.register = function () {\n var data;\n vm.validateRecipient = true;\n if (vm.isValidRecipient()) {\n if (vm.selectedUser) {\n vm.selectedUsers = [vm.selectedUser];\n }\n data = angular.extend({}, vm.data, {\n senderUserId: vm.selectedUsers.length === 1 ? vm.selectedUsers[0].id : 0\n });\n if (vm.isEmptyNewRecipient()) {\n delete vm.data.invitation;\n }\n vm.isLoading = true;\n Restangular.one('Leads').post('register', data)\n .then(function (result) {\n vm.data.invitation = {};\n if (!result.success) {\n Notification({message: 'Unable to register the lead for ' + vm.selectedUsers[0].fullName}, 'error');\n vm.isLoading = false;\n }\n else {\n if (vm.selectedUser && onSentCallback) {\n onSentCallback.apply();\n }\n else if (vm.isRegister) {\n $state.go('myMemberships.receivedLeads');\n }\n else {\n $state.go('myPod.sentLeads');\n }\n\n Notification({message: 'Success'}, 'confirmation');\n }\n }, function () {\n vm.isLoading = false;\n Notification({message: 'Unable to register the lead'}, 'error');\n });\n }\n };\n\n vm.cancel = function () {\n // MGA - if there is a single user provided (very likely \"Send Lead\" clicked directly from the user's profile), then on cancel don't go anywhere (we should do the update though)\n if (vm.selectedUser && onCancelCallback) {\n onCancelCallback.apply();\n }\n else if (vm.isRegister) {\n $state.go('myMemberships.receivedLeads');\n }\n else {\n $state.go('myPod.sentLeads');\n }\n };\n\n vm.onContractTypeChange = function () {\n if (vm.data.invitation.contractType === 'Pay Per Lead') {\n $timeout(function () {\n angular.element($document[0].getElementById('inviteSuccessfulLeadPrice'))[0].focus();\n }, 200);\n }\n else if (vm.data.invitation.contractType === 'Subscription') {\n $timeout(function () {\n angular.element($document[0].getElementById('inviteSubscriptionPrice'))[0].focus();\n }, 200);\n }\n };\n\n vm.changeContractType = function (value, evt) {\n vm.data.invitation.contractType = value;\n vm.onContractTypeChange(evt);\n evt.stopPropagation();\n evt.preventDefault();\n };\n\n vm.toggleMoreDetailsVisibility = function () {\n vm.detailsVisible = !vm.detailsVisible;\n };\n\n vm.onRewardSelectionChange = function (data, isFormValid) {\n _.extend(vm.data.invitation, data);\n vm.isRewardsFormValid = isFormValid;\n };\n\n /**\n * Adds the to-be-invited recipient to the recipients list. Uses the current form values that are used to create an object and clears the form in the end.\n * @param {Object} form New user form that will have to have the errors cleared\n */\n vm.addNewRecipient = function (form) {\n if (!_.find(vm.invitations, {email: vm.data.invitation.email})) {\n vm.invitations.push(_.clone(vm.data.invitation));\n vm.data.invitation = {};\n if (form) {\n form.$setPristine();\n form.$setUntouched();\n }\n // We need to broadcast the clear to the reward selector as well...\n $scope.$broadcast('clearRewardSelector');\n }\n };\n\n /**\n * Removes the recipient from the list of new invitees that will recieve the lead.\n * @param {int} $index List index.\n */\n vm.removeNewRecipient = function ($index) {\n vm.invitations.splice($index, 1);\n };\n\n /**\n * Pre-fills the lead detail using search\n * @param {Object} item Item to pre-fill with\n */\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item || !item.originalObject || angular.isString(item.originalObject)) {\n return;\n }\n vm.searchingUser = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingUser = false;\n profile = profile.plain();\n // Pre-fill the data now.\n vm.data.firstName = profile.firstName;\n vm.data.lastName = profile.lastName;\n vm.data.email = profile.email;\n vm.data.phone = profile.phoneMobile;\n angular.element('#details').focus();\n });\n };\n\n /**\n * OnSelect event of the recipient search autocomplete control\n * @param {Object} item Item to pre-fill with\n */\n vm.onRecipientItemSelected = function (item) {\n if (!item || !item.originalObject || angular.isString(item.originalObject)) {\n return;\n }\n vm.searchingRecipient = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingRecipient = false;\n profile = profile.plain();\n // Add to selected users\n // If this isRegister and there is already someone selected, we have to clear it.\n if (isRegister && vm.selectedUsers.length > 0) {\n vm.selectedUsers = [];\n }\n if (!_.find(vm.selectedUsers, {id: profile.id})) {\n vm.selectedUsers.push(profile);\n }\n });\n };\n\n /**\n * Formats the search response\n *\n * @param {Object} response Response object\n * @returns {Object} Formatted response\n */\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n if (vm.activeSearch === 'clients') {\n $timeout(function () {\n vm.emptyResults = false;\n }, 5000);\n }\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject,\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.showInviteNew = function () {\n if (isRegister) {\n vm.selectedUsers = [];\n }\n vm.showInviteForm = true;\n vm.activeSearch = 'recipients';\n vm.emptyResults = true;\n };\n\n vm.showSearchForm = function () {\n vm.showInviteForm = false;\n vm.emptyResults = false;\n if (isRegister) {\n vm.data.invitation = {};\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name lead.service:Leads\n *\n * @description\n *\n */\n Leads.$inject = [\"$rootScope\", \"$document\", \"$state\", \"$q\", \"Notification\", \"$uibModal\", \"Restangular\"];\n angular\n .module('lead')\n .service('Leads', Leads);\n\n function Leads($rootScope, $document, $state, $q, Notification, $uibModal, Restangular) {\n var self = this;\n\n self.closeLead = function (lead, status) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'lead/close-lead.tpl.html',\n controller: 'CloseLeadCtrl',\n controllerAs: 'closeLead',\n size: 'md',\n resolve: {\n lead: function () {\n return lead;\n },\n status: function () {\n return status;\n },\n contract: function () {\n return Restangular.one('Leads').one('receiveLeadsContract').get({idUserSender: lead.sender.id})\n .then(function (contract) {\n return contract.plain();\n }, function () {\n return null;\n });\n },\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n leadPriceBreakdown: function () {\n if (status === 'successful') {\n return Restangular.one('Leads').one('calculateRewardTotal').get({\n idUserSender: lead.sender.id\n })\n .then(function (result) {\n return result.plain();\n }, function () {\n return null;\n });\n }\n return null;\n }\n }\n };\n if (lead.acceptedReceiveLeadsContractExists !== true) {\n $state.go('user.agreements', {\n id: lead.sender.id,\n '#': 'receive-leads-agreements-container'\n });\n Notification({message: 'Lead can be accessed with a valid agreement.'}, 'confirmation');\n return null;\n }\n\n params.appendTo = angular.element($document[0].body);\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n\n self.openDetail = function (lead, type, parentElementId, tabToOpen) {\n var modalInstance,\n params = {\n animation: true,\n templateUrl: 'lead/lead-detail.tpl.html',\n controller: 'LeadDetailCtrl',\n controllerAs: 'leadDetail',\n size: 'lg',\n resolve: {\n lead: function () {\n if (lead && angular.isDefined(lead.id)) {\n // The incoming lead is an object.\n return lead;\n }\n else if (angular.isDefined(lead) && angular.isNumber(lead) && angular.isDefined(type)) {\n // This is the id. Get the lead from the server.\n return Restangular.one('Leads').one('index').get({id: lead}).then(function (result) {\n return result.plain();\n });\n }\n },\n leadType: function () {\n return type;\n },\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n tabToOpen: function () {\n return tabToOpen;\n }\n }\n };\n\n if (lead && lead.sender && type === 'received' && lead.acceptedReceiveLeadsContractExists !== true && !lead.isCoOwner) {\n $state.go('user.agreements', {\n id: lead.sender.id,\n '#': 'receive-leads-agreements-container'\n });\n\n Notification({message: 'Lead can be accessed with a valid agreement.'}, 'confirmation');\n }\n else {\n params.appendTo = angular.element($document[0].body);\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n }\n return modalInstance;\n };\n\n self.openDetailById = function (id, type) {\n Restangular.one('Leads').one('index').get({id: id})\n .then(function (lead) {\n self.openDetail(lead.plain(), type);\n });\n };\n\n self.resend = function (id) {\n return Restangular.one('Leads').post('resend', {id: id});\n };\n\n self.acknowledge = function (id) {\n return Restangular.one('Leads').post('acknowledge', {id: id});\n };\n\n self.update = function (id, data) {\n var deferred = $q.defer();\n Restangular.one('Leads').customPUT(data, 'index?id=' + id)\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.openSendLead = function (userProfile, isRegister, onCancelCallback, onSentCallback) {\n var slModalInstance,\n cancelCallback,\n sentCallback;\n\n cancelCallback = function () {\n if (slModalInstance) {\n slModalInstance.close();\n }\n if (onCancelCallback && angular.isFunction(onCancelCallback)) {\n onCancelCallback.apply();\n }\n };\n\n sentCallback = function () {\n if (slModalInstance) {\n slModalInstance.close();\n }\n if (onSentCallback && angular.isFunction(onSentCallback)) {\n onSentCallback.apply();\n }\n $rootScope.$broadcast('sentLeads-success');\n };\n\n slModalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'lead/send-lead-modal.tpl.html',\n controller: 'SendLeadCtrl',\n controllerAs: 'sendLead',\n size: 'lg',\n resolve: {\n userProfile: function () {\n return userProfile;\n },\n isRegister: function () {\n return isRegister;\n },\n membersSubIndustries: null,\n onCancelCallback: function () {\n return cancelCallback;\n },\n onSentCallback: function () {\n return sentCallback;\n }\n }\n });\n\n return slModalInstance;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:LeadViewCtrl\n *\n * @description This is just a dummy view whoe only purpose is to provide background for the modal dialog for the incoming lead\n *\n */\n LeadViewCtrl.$inject = [\"$state\", \"$stateParams\", \"Session\", \"Leads\", \"leadToOpen\"];\n angular\n .module('lead')\n .controller('LeadViewCtrl', LeadViewCtrl);\n\n function LeadViewCtrl($state, $stateParams, Session, Leads, leadToOpen) {\n var vm = this,\n modalInstance;\n\n vm.lead = leadToOpen;\n vm.leadType = null;\n vm.tabToOpen = $stateParams.tabName;\n\n Session.getUserProfile().then(function (user) {\n vm.user = user;\n if (vm.lead.sender.fullName === vm.user.fullName) {\n vm.leadType = 'sent';\n }\n else {\n vm.leadType = 'received';\n }\n\n // We have a lead. Now open the modal dialog.\n // Once the modal is open, then handle the close and re-direct to the relevant section (my-pod, myBusiness) depending on the lead type\n if (angular.isDefined(vm.lead)) {\n modalInstance = Leads.openDetail(vm.lead, vm.leadType, null, vm.tabToOpen);\n if (angular.isDefined(modalInstance)) {\n modalInstance.then(function () {\n // We don't care much about the result. Just redirect to where it's required to go.\n if (vm.leadType === 'sent') {\n $state.go('myPod.sentLeads');\n }\n else {\n $state.go('myMemberships.receivedLeads');\n }\n });\n }\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\", \"configOptions\"];\n angular\n .module('lead')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('leadSend', {\n url: '/lead/send',\n templateUrl: 'lead/send-lead.tpl.html',\n controller: 'SendLeadCtrl',\n controllerAs: 'sendLead',\n authenticate: true,\n params: {\n user: null,\n lead: null\n },\n resolve: {\n // This the flag that will control whether the templates (and controller) will act as \"sending the leads\" or \"registering the lead\"\n isRegister: function () {\n return false;\n },\n // This is required for if the template is being used in the popup. The leads content is being requested via uiRouter, then provide the user details in the \"user\" param\n // If the isRegister == true, then the userProfile is the user in behalf who we are registering the lead. Otherwise it's the business user that the lead will be sent to.\n userProfile: function () {\n return null;\n },\n onCancelCallback: function () {\n return null;\n },\n onSentCallback: function () {\n return null;\n }\n }\n })\n .state('leadRegister', {\n url: '/lead/register',\n templateUrl: 'lead/send-lead.tpl.html',\n controller: 'SendLeadCtrl',\n controllerAs: 'sendLead',\n authenticate: true,\n params: {\n user: null,\n lead: null\n },\n resolve: {\n isRegister: function () {\n return true;\n },\n // This is required for if the template is being used in the popup. The leads content is being requested via uiRouter, then provide the user details in the \"user\" param\n userProfile: function () {\n return null;\n },\n onCancelCallback: function () {\n return null;\n },\n onSentCallback: function () {\n return null;\n }\n }\n })\n .state('leadDetail', angular.extend({}, configOptions.defaultStateParams, {\n url: '/lead/{id}/{tabName}',\n templateUrl: 'lead/lead-view.tpl.html',\n controller: 'LeadViewCtrl',\n controllerAs: 'leadView',\n authenticate: true,\n resolve: {\n leadToOpen: ['$stateParams', 'Restangular', 'Auth', function ($stateParams, Restangular, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Leads').one('index').get({id: $stateParams.id})\n .then(function (lead) {\n return lead.plain();\n }, function () {\n return null;\n });\n }\n return null;\n }, function () {\n return null;\n });\n }]\n }\n }));\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:LeadDetailCtrl\n *\n * @description\n *\n */\n LeadDetailCtrl.$inject = [\"$rootScope\", \"$scope\", \"$uibModalInstance\", \"$state\", \"lead\", \"leadType\", \"userProfile\", \"tabToOpen\", \"Leads\", \"Notification\", \"FormAlerts\", \"RewardCodes\", \"Restangular\", \"notificationConst\"];\n angular\n .module('lead')\n .controller('LeadDetailCtrl', LeadDetailCtrl);\n\n function LeadDetailCtrl($rootScope, $scope, $uibModalInstance, $state, lead, leadType, userProfile, tabToOpen,\n Leads, Notification, FormAlerts, RewardCodes, Restangular, notificationConst) {\n var vm = this;\n vm.lead = lead;\n vm.leadType = leadType;\n vm.tabName = 'details';\n vm.isSending = false;\n vm.isAcknowledging = false;\n vm.alerts = new FormAlerts();\n vm.closeData = {};\n vm.isSavingUserShare = false;\n vm.userShareEmailChecked = false;\n vm.userShareEmailValid = false;\n vm.userShareEmailValidating = false;\n vm.userShareEmail = null;\n vm.userShareSectionVisible = false;\n vm.userShareEmailHelp = 'Type in the email address of another MyLeadPod user you want to share the lead with.';\n if (angular.isDefined(lead.coOwner) && angular.isObject(lead.coOwner)) {\n vm.userShareEmail = lead.coOwner.email;\n vm.userShareEmailValid = true;\n vm.userShareEmailChecked = true;\n }\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n // Check tab name\n if (angular.isDefined(tabToOpen)) {\n vm.tabName = tabToOpen.lastIndexOf('detail') > -1 ? 'details' : tabToOpen;\n }\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Details',\n value: 'details'\n },\n {\n label: 'Messages',\n value: 'messages'\n }\n ];\n\n // Listen to the broadcast of 'close-modal-instance'\n $scope.$on('close-modal-instance', function () {\n $uibModalInstance.dismiss();\n });\n\n vm.close = function () {\n $uibModalInstance.close(vm.closeData);\n };\n\n vm.getUser = function () {\n if (leadType === 'sent') {\n return lead.recipient;\n }\n\n return lead.sender;\n };\n\n vm.showResendButton = function () {\n return leadType === 'sent' && lead.sender.id === userProfile.id && (lead.status === 'open' || lead.status === 'new');\n };\n\n vm.resend = function () {\n vm.isSending = true;\n vm.alerts.reset();\n Leads.resend(lead.id)\n .then(function () {\n vm.isSending = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isSending = false;\n vm.alerts.add('danger', 'An error occurred, try again later please');\n });\n };\n\n vm.showAcknowledgeButton = function () {\n return leadType === 'received' && lead && lead.recipient && lead.recipient.id === userProfile.id && lead.status === 'new';\n };\n\n vm.acknowledge = function () {\n vm.isAcknowledging = true;\n vm.alerts.reset();\n Leads.acknowledge(lead.id)\n .then(function (result) {\n vm.lead = result;\n vm.isAcknowledging = false;\n lead = result.plain();\n vm.closeData.lead = lead;\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isAcknowledging = false;\n vm.alerts.add('danger', 'An error occurred, try again later please');\n });\n };\n\n vm.saveUserShare = function () {\n vm.isSavingUserShare = true;\n vm.editUserShareError = false;\n Leads.update(lead.id, {\n userShareEmail: vm.userShareEmail\n })\n .then(function (result) {\n vm.lead = result;\n lead = result;\n vm.closeData.lead = lead;\n vm.editUserShareVisible = false;\n vm.isSavingUserShare = false;\n vm.shareWithProfile = null;\n }, function () {\n vm.isSavingUserShare = false;\n vm.editUserShareError = 'An error occurred';\n });\n };\n\n vm.removeSharing = function () {\n vm.isRemovingShare = true;\n vm.userShareEmail = null;\n Leads.update(lead.id, {\n userShareEmail: vm.userShareEmail\n })\n .then(function (result) {\n vm.lead = result;\n lead = result;\n vm.closeData.lead = lead;\n vm.editUserShareVisible = false;\n vm.isSavingUserShare = false;\n vm.isRemovingShare = false;\n }, function () {\n vm.isRemovingShare = false;\n vm.isSavingUserShare = false;\n vm.editUserShareError = 'An error occurred';\n });\n };\n\n vm.onUserShareEmailChange = function () {\n vm.userShareEmailChecked = false;\n vm.userShareEmailValid = false;\n vm.userShareEmailValidating = false;\n };\n\n vm.validateUserShareEmail = function () {\n if (vm.userShareEmailValidating) {\n // This user email check fn can be triggered by blur and by the 'check' click. To avoid double requests return from here.\n return;\n }\n if (vm.userShareEmail && vm.userShareEmail.length >= 0) {\n vm.userShareEmailValidating = true;\n RewardCodes.isUserShareEmailValid(vm.userShareEmail)\n .then(function (isValid) {\n vm.userShareEmailValid = isValid;\n vm.userShareEmailValidating = false;\n vm.userShareEmailChecked = true;\n });\n }\n };\n\n vm.isUserShareEmailValid = function () {\n if (vm.userShareEmail !== null && vm.userShareEmail.length === 0) {\n return true;\n }\n\n return vm.userShareEmailValid;\n };\n\n vm.forward = function () {\n $uibModalInstance.dismiss();\n $state.go('leadSend', {\n lead: lead\n });\n };\n\n vm.closeLead = function (status) {\n Leads.closeLead(lead, status)\n .then(function () {\n lead.status = status;\n vm.lead.status = status;\n });\n };\n\n vm.getUserDetailClass = function () {\n if (vm.tabManager) {\n return vm.tabManager.isOpen('messages') ? 'table-user-detail-opaque' : '';\n }\n return '';\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n vm.userInvitedProfile = null;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item) {\n return;\n }\n vm.displayContactDetails = true;\n vm.isLoadingUserData = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n profile = profile.plain();\n vm.userShareEmail = profile.email;\n vm.shareWithProfile = profile;\n vm.isLoadingUserData = false;\n });\n };\n\n // Broadcast to NotificationCentre that it can clear notifications related to this lead.\n // Broadcast to the NotificationCentre to check any notifications related to messages for this user.\n vm.onTabChange = function (activeTab) {\n var obj;\n if (activeTab === 'details') {\n obj = {\n userId: vm.getUser().idUser,\n category: notificationConst.categoryLeads,\n type: notificationConst.typeNewLead,\n data: {\n leadId: lead.id\n }\n };\n }\n else {\n obj = {\n userId: vm.getUser().idUser,\n category: notificationConst.categoryMessages,\n type: notificationConst.typeLeadMessage,\n data: {\n leadId: lead.id\n }\n };\n }\n $rootScope.$broadcast('event:notifications-check', obj);\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:CloseLeadCtrl\n *\n * @description\n *\n */\n CloseLeadCtrl.$inject = [\"$rootScope\", \"Restangular\", \"$uibModalInstance\", \"Notification\", \"FormAlerts\", \"lead\", \"status\", \"contract\", \"userProfile\", \"leadPriceBreakdown\"];\n angular\n .module('lead')\n .controller('CloseLeadCtrl', CloseLeadCtrl);\n\n function CloseLeadCtrl($rootScope, Restangular, $uibModalInstance, Notification, FormAlerts,\n lead, status, contract, userProfile, leadPriceBreakdown) {\n var vm = this;\n vm.lead = lead;\n vm.status = status;\n vm.contract = contract;\n vm.isLoading = false;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.selectedPricingOption = null;\n vm.user = userProfile;\n if (angular.isObject(leadPriceBreakdown)) {\n vm.processingFee = leadPriceBreakdown.fees;\n vm.tax = leadPriceBreakdown.tax;\n vm.total = leadPriceBreakdown.total;\n }\n else {\n vm.processingFee = 0;\n vm.tax = 0;\n vm.total = 0;\n }\n\n vm.showTotal = false;\n vm.data = {\n status: status,\n id: lead.id,\n creditCard: {},\n feedback: status === 'successful' ? 'Thank you for your lead!' : 'Thanks for your lead, it was not successful this time'\n };\n vm.alerts = new FormAlerts();\n\n if (contract && contract.pricingOptions) {\n // Sort the pricing options\n contract.pricingOptions = _.sortBy(contract.pricingOptions, 'successfulLeadPrice');\n if (contract.pricingOptions.length === 1) {\n vm.selectedPricingOption = contract.pricingOptions[0];\n vm.data.idPricingOption = contract.pricingOptions[0].id;\n }\n }\n\n Restangular.one('Billing').one('creditCard').get()\n .then(function (creditCard) {\n if (angular.isObject(creditCard) && angular.isDefined(creditCard.number)) {\n vm.creditCard = creditCard.plain();\n }\n vm.initialisingCard = false;\n }, function () {\n vm.initialisingCard = false;\n });\n\n vm.isSuccessful = function () {\n return status === 'successful';\n };\n\n vm.chargeForSuccessfulLead = function () {\n return angular.isObject(contract) && vm.isSuccessful() && (contract.contractType === 'Pay Per Lead' && contract.successfulLeadPrice > 0 ||\n contract.contractType === 'Rewards Program' || contract.contractType === 'Custom Rewards'\n );\n };\n\n vm.enableBonusReward = function () {\n return vm.isSuccessful() && angular.isObject(contract);\n };\n\n vm.showPriceBreakdown = function () {\n if (vm.isSuccessful()) {\n if (vm.chargeForSuccessfulLead()) {\n if (contract.contractType === 'Rewards Program' || contract.contractType === 'Custom Rewards') {\n return angular.isObject(vm.selectedPricingOption);\n }\n\n return true;\n }\n\n return vm.chargeForSuccessfulLead() ? true : vm.showTotal;\n }\n\n return false;\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.close = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Leads').post('close', vm.data)\n .then(function () {\n $uibModalInstance.close();\n $rootScope.$broadcast('event:lead-closed');\n Notification({message: 'Success'}, 'confirmation');\n }, function (responseData) {\n vm.isLoading = false;\n if (responseData.data.errorCode === 701 || responseData.data.errorCode === 702 || responseData.data.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to close the lead: ' + responseData.data.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to close the lead, try again later please');\n }\n });\n };\n\n vm.calculateTotal = function () {\n if (vm.calculationRequired) {\n vm.calculating = true;\n Restangular.one('Leads').one('calculateRewardTotal').get({\n reward: vm.data.bonusReward,\n idUserSender: lead.sender.id,\n idPricingOption: vm.data.idPricingOption\n })\n .then(function (result) {\n vm.processingFee = result.fees;\n vm.total = result.total;\n vm.tax = result.tax;\n vm.calculationRequired = false;\n vm.calculating = false;\n vm.showTotal = true;\n });\n }\n };\n\n vm.showCCForm = function () {\n if (!userProfile.isCCSet) {\n return angular.isObject(contract) && vm.isSuccessful() && (contract.contractType === 'Pay Per Lead' && contract.successfulLeadPrice > 0 ||\n contract.contractType === 'Rewards Program' || contract.contractType === 'Custom Rewards') || parseFloat(vm.data.bonusReward) > 0;\n }\n\n return false;\n };\n\n vm.onBonusRewardChange = function (form) {\n vm.showTotal = false;\n vm.calculationRequired = true;\n if (!vm.showCCForm()) {\n delete form.$error.ccExp;\n delete form.$error.ccNumber;\n delete form.$error.ccNumberType;\n delete form.$error.ccExpMonth;\n delete form.$error.ccExpYear;\n }\n };\n\n vm.onPricingOptionChange = function (form, $index) {\n vm.data.idPricingOption = contract.pricingOptions[$index].id;\n vm.selectedPricingOption = contract.pricingOptions[$index];\n vm.onBonusRewardChange(form);\n // vm.calculateTotal();\n };\n\n vm.getSuccessfulLeadPrice = function () {\n switch (contract.contractType) {\n case 'Pay Per Lead':\n return vm.contract.pricingOptions[0].successfulLeadPrice;\n case 'Rewards Program':\n case 'Custom Rewards':\n return vm.selectedPricingOption.successfulLeadPrice;\n default:\n return 0;\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard\n * @description\n *\n */\n angular\n .module('dashboard', [\n 'ui.router',\n 'dashboard.pod',\n 'dashboard.memberships',\n 'dashboard.stats'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('dashboard')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('dashboard', {\n url: '/?imTopic',\n templateUrl: 'dashboard/dashboard.tpl.html',\n controller: 'DashboardCtrl',\n controllerAs: 'dashboard',\n authenticate: true,\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n dashboardData: ['Restangular', 'Auth', function (Restangular, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Dashboard').one('index').get()\n .then(function (result) {\n return result.plain();\n });\n }\n\n return null;\n }, function () {\n return null;\n });\n }]\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.controller:DashboardCtrl\n *\n * @description\n *\n */\n DashboardCtrl.$inject = [\"userProfile\", \"dashboardData\"];\n angular\n .module('dashboard')\n .controller('DashboardCtrl', DashboardCtrl);\n\n function DashboardCtrl(userProfile, dashboardData) {\n var vm = this;\n vm.earnings = dashboardData.earnings;\n vm.donations = dashboardData.donations;\n vm.membersCount = dashboardData.membersCount;\n vm.membershipsCount = dashboardData.membershipsCount;\n vm.leadsDailyStats = dashboardData.leadsDailyStats;\n vm.earningsDailyStats = dashboardData.earningsDailyStats;\n vm.sentLeadsCount = dashboardData.sentLeadsCount;\n vm.members = dashboardData.members;\n vm.receivedLeads = dashboardData.receivedLeads;\n vm.userProfile = userProfile;\n\n vm.isBusinessAccountActive = function () {\n return angular.isObject(userProfile) && angular.isDefined(userProfile.isBusinessAccountActive) && userProfile.isBusinessAccountActive === true;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name configuration\n * @description\n *\n */\n angular\n .module('configuration', [\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name configuration.constant:configOptions\n *\n * @description\n *\n */\n angular\n .module('configuration')\n .constant('configOptions', {\n appVersion: '1.48.31',\n appUrl: 'https://app.myleadpod.com',\n baseUrl: 'https://admin.myleadpod.com/dataapi/myleadpod/v1',\n facebookAppId: '1035645753160080',\n facebookScope: 'email,public_profile',\n linkedInClientId: '75ys9solm6v8dj',\n linkedInProxy: 'https://admin.myleadpod.com/dataapi/myleadpod/v1/Users/linkedinOAuthProxy?X-Ff3-Api-Key=zRsMeAwjthhgoLoC3EHkUKmiFFnHkRtXF6oTCMHcoocqfVMDGP',\n googlePlusClientId: '1004778931844-jkjmvpe9b0b3vc21ok9m4kgn6j04if9g.apps.googleusercontent.com',\n googleMapApiKey: 'AIzaSyCpM94BmNGcG9P13TnstvbeCTA5zwiMj5M',\n googleMapLibraries: 'places',\n passwordPattern: '^.*(?=.{6,}).*$',\n passwordMessage: 'Invalid format of password, it must be at least 6 characters long',\n apiKey: 'zRsMeAwjthhgoLoC3EHkUKmiFFnHkRtXF6oTCMHcoocqfVMDGP',\n oneSignalAppId: '6aad642a-9027-48f5-b2d2-19ab65c3d53d',\n oneSignalSafariWebId: 'web.onesignal.auto.5ccade99-0f35-4775-9ae0-5e2c3bfd110b',\n linkedInScope: 'r_liteprofile,r_emailaddress',\n googlePlusScope: 'https://www.googleapis.com/auth/userinfo.email,' +\n 'https://www.googleapis.com/auth/userinfo.profile',\n maxFileUploadSize: 10485760,\n maxFileUploadMessage: 'Max allowed size of file is 10M',\n reCaptchaSiteKey: '6LdZhRYTAAAAAMwGIVoEZzkuJ4bi1HH7bADw7I_n',\n defaultStateParams: {\n params: {nextSteps: []},\n authenticate: true\n },\n bitlyGenericAccessToken: '13b7cba3c05015f378f7cc2a084856063f7519c5',\n defaultShareName: 'Send leads. Be rewarded.',\n defaultShareMessage: 'MyLeadPod is a professional reward platform for individuals and businesses sending and receiving leads.',\n defaultEmailMessage: 'We are using MyLeadPod to reward successful leads provided by business associates, ' +\n 'friends and family. Click the link below to take the simple steps (a minute or two) to ' +\n 'join our cash rewards program.\\r\\r\\n Visit \\r\\n {{link}} \\r\\r\\n' +\n 'If you run a business yourself, check out MyLeadPod as your very own simple-to-use cash ' +\n 'reward program to incentivise word-of-mouth referrals. \\r\\r\\n We look forward to rewarding you in cash!',\n maxBusinessSuggestions: 1,\n reportRegistration: function () {\n gtag('event', 'conversion', {'send_to': 'AW-830376296/JR2hCNe53o8BEOiS-osD'});fbq('track', 'PageView');\n }\n });\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components\n * @description\n *\n */\n angular\n .module('components', [\n 'components.ui'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:Tabs\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('Tabs', Tabs);\n\n function Tabs() {\n var TabsBase = {};\n\n function TabsManager(id, tabNames, activeTab) {\n var self = this;\n self.activeTab = activeTab;\n self.tabNames = tabNames;\n self.id = id;\n\n self.openTab = function (tabName) {\n if (self.activeTab !== tabName) {\n self.activeTab = tabName;\n }\n };\n\n self.isOpen = function (tabName) {\n return self.activeTab === tabName;\n };\n }\n\n TabsBase.create = function (id, tabNames, activeTab, $scope) {\n if (!angular.isArray(tabNames) || tabNames.length < 1) {\n throw new Error('List of names must not be empty');\n }\n\n if (angular.isUndefined(activeTab) && angular.isDefined($scope.tab)) {\n activeTab = $scope.tab;\n }\n\n return new TabsManager(id, tabNames, activeTab);\n };\n\n return TabsBase;\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:staticInclude\n * @restrict EA\n * @element\n *\n */\n staticInclude.$inject = [\"$templateRequest\", \"$compile\"];\n angular\n .module('components')\n .directive('staticInclude', staticInclude);\n\n function staticInclude($templateRequest, $compile) {\n return {\n restrict: 'A',\n transclude: true,\n replace: true,\n scope: false,\n link: function ($scope, element, attrs) {\n var templatePath = attrs.staticInclude;\n\n $templateRequest(templatePath)\n .then(function (response) {\n var contents = element.html(response).contents();\n $compile(contents)($scope.$new(false, $scope.$parent));\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:stateClass\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n stateClass.$inject = [\"$rootScope\"];\n angular\n .module('components')\n .directive('stateClass', stateClass);\n\n function stateClass($rootScope) {\n return {\n restrict: 'A',\n scope: {},\n link: function (scope, element, attrs) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var stateChangeStartHandler = $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {\n var fromClassNames = angular.isDefined(fromState.data) && angular.isDefined(fromState.data.classNames) ? fromState.data.classNames : null,\n toClassNames = angular.isDefined(toState.data) && angular.isDefined(toState.data.classNames) ? toState.data.classNames : null;\n\n // don't do anything if they are the same\n if (fromClassNames !== toClassNames) {\n if (fromClassNames) {\n element.removeClass(fromClassNames);\n }\n\n if (toClassNames) {\n element.addClass(toClassNames);\n }\n }\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:statBlock\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('components')\n .directive('statBlock', statBlock);\n\n function statBlock() {\n return {\n restrict: 'EA',\n scope: {\n stat: '@',\n subtext: '@?',\n buttonText: '@?',\n buttonLink: '@?'\n },\n templateUrl: 'components/stat-block-directive.tpl.html',\n replace: false,\n controllerAs: 'statBlock',\n controller: function () {\n var vm = this;\n vm.stat = 0;\n vm.subtext = '-';\n vm.buttonText = 'View All';\n vm.buttonLink = '#';\n },\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n ctrl.stat = attrs.stat;\n ctrl.subtext = attrs.subtext;\n ctrl.buttonText = attrs.buttonText;\n ctrl.buttonLink = attrs.buttonLink;\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:stPaginationScroll\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n stPaginationScroll.$inject = [\"$timeout\"];\n angular\n .module('components')\n .directive('stPaginationScroll', stPaginationScroll);\n\n function stPaginationScroll($timeout) {\n return {\n require: 'stTable',\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n\n var itemByPage = 10,\n pagination = ctrl.tableState().pagination,\n lengthThreshold = 50,\n timeThreshold = 400,\n promise = null,\n lastRemaining = 9999,\n container;\n\n if (element.closest('.fixed-header').length > 0) {\n container = element.find('> tbody');\n }\n else {\n container = element.parent();\n }\n\n function handler() {\n ctrl.slice(pagination.start + itemByPage, itemByPage);\n }\n\n container.bind('scroll', function () {\n var remaining = container[0].scrollHeight - (container[0].clientHeight + container[0].scrollTop);\n // if we have reached the threshold and we scroll down\n if (remaining < lengthThreshold && remaining - lastRemaining < 0) {\n // if there is already a timer running which has no expired yet we have to cancel it and restart the timer\n if (promise !== null) {\n $timeout.cancel(promise);\n }\n promise = $timeout(function () {\n handler();\n promise = null;\n }, timeThreshold);\n }\n lastRemaining = remaining;\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:scrollNavigator\n * @restrict A\n * @element\n *\n * @description Directive that checks if the element is within the viewport and if not, it displays the message to scroll\n *\n */\n scrollNavigator.$inject = [\"$window\", \"$rootScope\", \"$document\", \"$timeout\", \"$uibPosition\"];\n angular\n .module('components')\n .directive('scrollNavigator', scrollNavigator);\n\n function scrollNavigator($window, $rootScope, $document, $timeout, $uibPosition) {\n return {\n restrict: 'AE',\n scope: {\n autoRun: '=',\n onClickCallback: '=',\n scrollTargetElementId: '=',\n scrollTargetChangeDelay: '='\n },\n link: function (scope, element, attrs) {\n var targetElement,\n checkScroll,\n navigatorElement,\n watchHandle,\n watchToolbarHandleVisible,\n watchToolbarHandleHidden,\n windowScrollHandle,\n windowResizeHandle,\n windowFn,\n timeoutPromise,\n navigatorOffsetX,\n navigatorOffsetY,\n actionToolbarOffset = 0,\n scrollingElement;\n\n function getScrollingElement() {\n var d = $document[0];\n return d.documentElement.scrollHeight > d.body.scrollHeight && d.compatMode.indexOf('CSS1') === 0 ? d.documentElement : d.body;\n }\n\n // Function\n checkScroll = function () {\n var offset;\n targetElement = $document[0].getElementById(scope.scrollTargetElementId);\n if (!targetElement) {\n return false;\n }\n offset = $uibPosition.viewportOffset(targetElement, true);\n\n if (offset.bottom < actionToolbarOffset) {\n // Means the target element is completely or partially out of view. Display the message.\n if (offset.bottom < targetElement.clientHeight * -1 + actionToolbarOffset) {\n // It's completely out\n navigatorElement.css({\n top: $window.innerHeight - navigatorElement.outerHeight() + navigatorOffsetY - actionToolbarOffset + 'px',\n left: offset.left + navigatorOffsetX + 'px',\n position: 'fixed'\n });\n }\n /*\n else {\n // Partially invisible. As the user might have been scrolling further from completely invisible to partially invisible (here)\n // the calculation and transition of the element are causing undesireable 'jump' effect. Let's check that\n navigatorElement.css({\n top: $window.innerHeight + (offset.top - $window.innerHeight) - navigatorElement.outerHeight() + $window.scrollY + navigatorOffsetY - actionToolbarOffset + 'px',\n left: offset.left + navigatorOffsetX + 'px',\n position: 'absolute'\n });\n }\n */\n navigatorElement.addClass('visible');\n scope.$apply();\n }\n else if (offset.bottom > 0) {\n navigatorElement.removeClass('visible');\n scope.$apply();\n }\n };\n\n // Get target element\n if (angular.isDefined(scope.scrollTargetElementId)) {\n // Create the navigator element\n navigatorElement = angular.element('
    ');\n navigatorElement[0].innerHTML = '' + attrs.scrollMessage + '';\n $document[0].body.appendChild(navigatorElement[0]);\n\n //\n navigatorOffsetX = attrs.scrollOffsetX ? parseInt(attrs.scrollOffsetX, 10) : 0;\n navigatorOffsetY = attrs.scrollOffsetY ? parseInt(attrs.scrollOffsetY, 10) : 0;\n\n //\n if (scope.onClickCallback) {\n navigatorElement.addClass('cursor-pointer');\n navigatorElement.on('click', function () {\n // Assuming the click will scroll the element in...\n // navigatorElement.removeClass('visible');\n // scope.$apply();\n // Call the callback function\n scope.onClickCallback(scope.scrollTargetElementId);\n });\n }\n\n //\n windowFn = function () {\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n scrollingElement = scrollingElement || getScrollingElement();\n if (scrollingElement.scrollTop < 0) {\n // This applies especially to iOS safar's elastic scroll that can go negative. don't do anything then.\n return;\n }\n timeoutPromise = $timeout(function () {\n checkScroll();\n }, 50);\n };\n\n windowScrollHandle = angular.element($window.document).on('scroll', windowFn);\n windowResizeHandle = angular.element($window.document).on('resize', windowFn);\n\n if (scope.autoRun) {\n checkScroll();\n }\n }\n\n //\n scope.$watch('scrollTargetElementId', function (oldVal, newVal) {\n if (oldVal !== newVal) {\n $timeout(function () {\n checkScroll();\n }, scope.scrollTargetChangeDelay ? scope.scrollTargetChangeDelay : 10);\n }\n });\n\n // Subscribe to the command of checking the scroll from parent (?). We shall be passing around the id of the element but no time for that\n watchHandle = $rootScope.$on('event:check-scroll-navigator', function (evt, id, timeout) {\n if (scope.scrollTargetElementId === id || id === 'all') {\n // Do this in the timeout as there might be multiple triggers for checkScroll and we don't know when and if to run scope.apply,\n // hence timeout to try to avoid the diggest errors,\n $timeout(function () {\n checkScroll();\n }, timeout ? timeout : 10);\n }\n else {\n navigatorElement.removeClass('visible');\n }\n });\n watchToolbarHandleVisible = $rootScope.$on('event:action-toolbar-visible', function (evt, height) {\n actionToolbarOffset = height;\n $timeout(function () {\n checkScroll();\n });\n });\n watchToolbarHandleHidden = $rootScope.$on('event:action-toolbar-hidden', function () {\n actionToolbarOffset = 0;\n $timeout(function () {\n checkScroll();\n });\n });\n scope.$on('$destroy', watchHandle);\n scope.$on('$destroy', watchToolbarHandleVisible);\n scope.$on('$destroy', watchToolbarHandleHidden);\n scope.$on('$destroy', function () {\n windowScrollHandle.off('scroll', windowFn);\n windowResizeHandle.off('resize', windowFn);\n navigatorElement.remove();\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:scrollCheck\n * @restrict A\n * @element\n *\n * @description Directive that checks the scroll and provides the css classes based on the location of the scroll\n *\n */\n scrollCheck.$inject = [\"$rootScope\", \"$document\", \"$timeout\"];\n angular\n .module('components')\n .directive('scrollCheck', scrollCheck);\n\n function scrollCheck($rootScope, $document, $timeout) {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, element, attrs) {\n var targetElement,\n checkScroll,\n hasScrollbar,\n watchHandle,\n init;\n\n scope.altElementBreakpoint = attrs.altElementBreakpoint ? parseInt(attrs.altElementBreakpoint, 10) : 1024;\n if (!angular.isNumber(scope.altElementBreakpoint)) {\n scope.altElementBreakpoint = 1024;\n }\n\n // Function\n checkScroll = function () {\n if (!targetElement || !targetElement[0]) {\n hasScrollbar = false;\n return false;\n }\n hasScrollbar = targetElement[0].scrollWidth > targetElement[0].clientWidth;\n\n // Now apply classes\n if (hasScrollbar) {\n element.removeClass('scroll-start');\n element.removeClass('scroll-between');\n element.removeClass('scroll-end');\n // Check the scrollbar position\n if (targetElement[0].scrollLeft === 0) {\n element.addClass('scroll-start');\n }\n else if (targetElement[0].scrollWidth - targetElement[0].scrollLeft === targetElement[0].clientWidth) {\n element.addClass('scroll-end');\n }\n else {\n element.addClass('scroll-between');\n }\n }\n };\n\n init = function () {\n targetElement = angular.element($document[0].getElementById(attrs.targetElementId));\n // Bind to the on scroll event\n targetElement.bind('scroll', function () {\n checkScroll();\n });\n checkScroll();\n };\n\n // Get target element\n if (angular.isDefined(attrs.targetElementId)) {\n if (attrs.withDelay) {\n $timeout(function () {\n init();\n }, Number(attrs.withDelay));\n }\n else {\n init();\n }\n }\n\n // Subscribe to the command of checking the scroll from parent (?). We shall be passing around the id of the element but no time for that\n watchHandle = $rootScope.$on('event:check-scroll', function () {\n checkScroll();\n });\n scope.$on('$destroy', watchHandle);\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:RouterHelper\n *\n * @description\n *\n */\n RouterHelper.$inject = [\"$rootScope\", \"$q\", \"$timeout\", \"QueueManager\", \"QueueItem\"];\n angular\n .module('components')\n .service('RouterHelper', RouterHelper);\n\n function RouterHelper($rootScope, $q, $timeout, QueueManager, QueueItem) {\n var self = this;\n\n self.activateTab = function (id, tabName, params) {\n QueueManager.add(new QueueItem(function (ready) {\n $q.when(ready).then(function () {\n $timeout(function () {\n self.lastEvent = {\n id: 'event:' + id + '-open-tab-' + tabName,\n params: params\n };\n\n $rootScope.$broadcast('event:' + id + '-open-tab-' + tabName, params);\n });\n });\n\n return $q.when(true);\n }));\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:RecordsSet\n *\n * @description\n *\n */\n RecordsSet.$inject = [\"$q\", \"$httpParamSerializer\", \"Restangular\"];\n angular\n .module('components')\n .factory('RecordsSet', RecordsSet);\n\n function RecordsSet($q, $httpParamSerializer, Restangular) {\n var RecordsSetBase = {},\n defaultQueryParams = {\n limit: 10\n };\n\n /**\n * Records set manager\n *\n * @callback itemCallback\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} queryParams Additional parameters\n * @param {Object} options Additional params to configure record set\n * @constructor\n */\n function RecordsSetManager(entity, endPoint, queryParams, options) {\n var self = this,\n loadingEnabled = true,\n totalLoaded = 0,\n initialise,\n deferredInit = $q.defer();\n\n options = angular.isObject(options) ? options : {};\n self.records = [];\n self.isLoading = false;\n self.isInitialised = false;\n self.numberOfSets = 0;\n self.recordsExist = null;\n self.totalRecords = null;\n\n if (angular.isObject(queryParams)) {\n queryParams = angular.extend({}, defaultQueryParams, queryParams);\n }\n else {\n queryParams = angular.extend({}, defaultQueryParams);\n }\n\n if (angular.isDefined(options.basicParams) && angular.isObject(options.basicParams)) {\n queryParams = angular.extend(queryParams, options.basicParams);\n }\n\n if (angular.isUndefined(endPoint) || endPoint.trim() === '') {\n endPoint = 'index';\n }\n\n /**\n * Load records, support for loading additional records\n * @param {Boolean} isReload Forces reload if set to true\n *\n * @returns {Deferred} Deferred promise\n */\n self.load = function (isReload) {\n var deferred = $q.defer();\n if (loadingEnabled) {\n self.isLoading = true;\n Restangular.one(entity).getList(endPoint + '?' + $httpParamSerializer(angular.extend(queryParams, {\n offset: totalLoaded\n }))).then(function (result) {\n angular.forEach(result, function (value) {\n var item = value.plain();\n if (angular.isDefined(options.itemCallback) && angular.isFunction(options.itemCallback)) {\n item = options.itemCallback(item);\n }\n self.records.push(item);\n });\n totalLoaded += result.meta.selectedRecords;\n if (result.meta.totalRecords <= totalLoaded) {\n loadingEnabled = false;\n }\n\n // MGA: there was a reason MSU was setting the totalRecords to 0 and later on keep comparing against null...\n // Let's still support it, but if it's the reload, then just force the update.\n if (!isReload) {\n if (self.totalRecords === null) {\n self.totalRecords = result.meta.totalRecords;\n }\n if (self.recordsExist === null) {\n self.recordsExist = self.records.length > 0;\n }\n }\n else {\n self.totalRecords = result.meta.totalRecords;\n // self.recordsExist = self.records.length > 0;\n }\n\n self.isLoading = false;\n self.isInitialised = true;\n\n if (angular.isDefined(queryParams.limit) && parseInt(queryParams.limit, 10) > 0) {\n self.numberOfSets = Math.ceil(result.meta.totalRecords / queryParams.limit);\n }\n deferred.resolve(self.records);\n }, function (result) {\n deferred.reject(result.data.errorMessage);\n });\n }\n else {\n deferred.resolve([]);\n }\n\n return deferred.promise;\n };\n\n initialise = function () {\n var deferred = $q.defer(),\n keys,\n extraParams,\n performInitQuery = false;\n\n if (!self.isInitialised) {\n if (angular.isDefined(options.basicParams) && angular.isObject(options.basicParams)) {\n keys = _.keys(options.basicParams);\n keys.push('limit');\n keys.push('offset');\n extraParams = _.omit(queryParams, keys);\n performInitQuery = _.keys(extraParams).length > 0;\n }\n\n if (performInitQuery) {\n self.isLoading = true;\n Restangular.one(entity).getList(endPoint + '?' + $httpParamSerializer(options.basicParams))\n .then(function (result) {\n self.recordsExist = result.meta.totalRecords > 0;\n self.totalRecords = result.meta.totalRecords;\n if (self.recordsExist) {\n self.load()\n .then(function () {\n self.isInitialised = true;\n deferred.resolve(true);\n });\n }\n else {\n self.isInitialised = true;\n self.isLoading = false;\n deferred.resolve(true);\n }\n });\n }\n else {\n self.load()\n .then(function () {\n self.isInitialised = true;\n deferred.resolve(true);\n });\n }\n }\n else {\n return deferred.resolve(true);\n }\n\n return deferred.promise;\n };\n\n /**\n *\n * Creates a new record\n *\n * @param {Object} data Data to be sent to server\n * @param {Object} queryParamsOverride Additional query params, if not provided then params used to initialise loader will be used\n * @param {string} appendTo One of 'beginning' or 'end', indicates the position of new record within existing records, if not provided then the record won't be inserted into the list\n * @returns {Deferred} Deferred promise\n */\n self.post = function (data, queryParamsOverride, appendTo) {\n var deferred = $q.defer(),\n qParams = queryParams;\n if (angular.isDefined(queryParamsOverride) && angular.isObject(queryParamsOverride)) {\n qParams = queryParamsOverride;\n }\n\n Restangular.one(entity).customPOST(data, endPoint, qParams)\n .then(function (result) {\n if (appendTo === 'beginning') {\n self.records.unshift(result.plain());\n totalLoaded += 1;\n }\n else if (appendTo === 'end') {\n self.records.push(result.plain());\n totalLoaded += 1;\n }\n deferred.resolve(result.plain());\n }, function (result) {\n deferred.reject(result.data.errorMessage);\n });\n\n return deferred.promise;\n };\n\n /**\n * Reload with new parameters\n * @param {Object} queryParamsOverride Overriding params\n * @param {Boolean} initialReset If true resets also flag indicating existence of records\n * @returns {Deferred} Deferred promise\n */\n self.reload = function (queryParamsOverride, initialReset) {\n self.reset(queryParamsOverride, initialReset);\n\n return self.load(true);\n };\n\n /**\n *\n * @param {string} key Key to sort by\n * @param {string} direction Direction to sort in\n * @returns {Deferred} Deferred promise\n */\n self.sort = function (key, direction) {\n self.records = [];\n totalLoaded = 0;\n loadingEnabled = true;\n queryParams = angular.extend(queryParams, {orderby: key + ' ' + direction});\n\n return self.load();\n };\n\n /**\n * Checks whether there is more records to load\n *\n * @returns {boolean} True or False whether loading is enabled\n */\n self.hasMore = function () {\n return loadingEnabled;\n };\n\n /**\n * Resets the loader, removes already loaded records from the list, resets counter\n *\n * @param {object} queryParamsOverride New params for the loader, overrides initial params from loader initialisation\n * @param {Boolean} initialReset If true resets also flag indicating existence of records\n */\n self.reset = function (queryParamsOverride, initialReset) {\n self.records = [];\n totalLoaded = 0;\n loadingEnabled = true;\n if (angular.isUndefined(initialReset) || initialReset !== true) {\n initialReset = false;\n }\n\n if (initialReset === true) {\n self.recordsExist = null;\n }\n if (angular.isObject(queryParamsOverride)) {\n queryParams = angular.extend({}, defaultQueryParams, queryParamsOverride);\n }\n else {\n queryParams = angular.extend({}, defaultQueryParams);\n }\n\n if (angular.isDefined(options.basicParams) && angular.isObject(options.basicParams)) {\n queryParams = angular.extend(queryParams, options.basicParams);\n }\n };\n\n self.isReady = deferredInit.promise;\n\n initialise().then(function () {\n deferredInit.resolve();\n }, function () {\n deferredInit.reject();\n });\n }\n\n /**\n * Returns instance of records set manager\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} params Additional parameters\n * @param {Object} options Additional params to configure record set\n * @returns {RecordsSetManager} Instance of records set manager\n */\n RecordsSetBase.createLoader = function (entity, endPoint, params, options) {\n return new RecordsSetManager(entity, endPoint, params, options);\n };\n\n return RecordsSetBase;\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:QueueManager\n *\n * @description\n *\n */\n QueueManager.$inject = [\"$timeout\", \"QueueItem\"];\n angular\n .module('components')\n .factory('QueueManager', QueueManager);\n\n function QueueManager($timeout, QueueItem) {\n var QueueManagerBase = {};\n /**\n * List of items that needs to be executed\n * @type {QueueItem[]|Array}\n */\n QueueManagerBase.queue = [];\n\n /**\n * Add new item to the list\n * @param {QueueItem} item Queue Item\n */\n QueueManagerBase.add = function (item) {\n if (!(item instanceof QueueItem)) {\n throw new Error('Only instance of QueueItem is allowed');\n }\n\n this.queue.push(item);\n };\n\n /**\n * Resets queue\n */\n QueueManagerBase.reset = function () {\n this.queue = [];\n };\n\n /**\n * Start processing of items in queue\n */\n QueueManagerBase.start = function () {\n var that = this;\n\n if (this.queue.length === 0) {\n return;\n }\n\n function queueLoop(previousResult) {\n /**\n * Item to process\n * @type {QueueItem}\n */\n var item;\n if (that.queue.length === 0) {\n return;\n }\n\n item = that.queue.shift();\n item.callback(previousResult).then(function (result) {\n var delay = item.options.delay || 0;\n /**\n * Process next item with delay, pass result from current item\n */\n $timeout(function () {\n queueLoop(result);\n }, delay);\n });\n }\n\n queueLoop();\n };\n\n return QueueManagerBase;\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:QueueItem\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('QueueItem', QueueItem);\n\n function QueueItem() {\n /**\n * Creates new instance of QueueItem\n *\n * @param {Function} callback Callback function\n * @param {Object} options Options\n * @constructor\n */\n function QueueItemBase(callback, options) {\n if (!angular.isFunction(callback)) {\n throw new Error('Callback has to be a function');\n }\n\n this.callback = callback;\n this.options = options || {};\n }\n\n return QueueItemBase;\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:nodeRelocator\n * @restrict A\n * @element\n *\n * @description Directive that will handle the relocation of the element into the alternative node if the breakpoint is achieved (in direction from greater to small)\n *\n */\n nodeRelocate.$inject = [\"$window\", \"$document\"];\n angular\n .module('components')\n .directive('nodeRelocate', nodeRelocate);\n\n function nodeRelocate($window, $document) {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n\n var moveElement,\n isMobile;\n\n scope.altElementBreakpoint = attrs.altElementBreakpoint ? parseInt(attrs.altElementBreakpoint, 10) : 1024;\n if (!angular.isNumber(scope.altElementBreakpoint)) {\n scope.altElementBreakpoint = 1024;\n }\n\n moveElement = function (el) {\n // We are moving the target element into 'el' which is either the srcElement or the altElement\n if (!el || !el.append || !scope.srcElement) {\n console.log('The core elements are missing');\n return;\n }\n // Invalidate the new container's display property\n el.css({display: null});\n // Append the target element into the new container\n el.append(element);\n // Make sure the element we are moving the target from is empty\n if (el[0] === scope.srcElement[0]) {\n scope.altElement[0].innerHTML = '';\n }\n else {\n scope.srcElement[0].innerHTML = '';\n }\n };\n\n // Get the alternative elementi\n if (angular.isDefined(attrs.altElementId)) {\n // Try to find it. Unfortunately, the angular.element($document).find doesn't work\n scope.altElement = angular.element($document[0].getElementById(attrs.altElementId));\n scope.srcElement = element.parent();\n\n if (scope.altElement) {\n scope.altElement.addClass('alt-node');\n // Ok now we will have to listen to the change events and then move this directive's element into the alt-element\n // Check if it's mobile already. If it is, then move it straightaway\n isMobile = $window.innerWidth < scope.altElementBreakpoint;\n if (isMobile) {\n moveElement(scope.altElement);\n scope.altElement.addClass('node-relocated');\n }\n else {\n scope.altElement.removeClass('node-relocated');\n }\n\n angular.element($window).on('resize', function () {\n isMobile = $window.innerWidth < scope.altElementBreakpoint;\n if (scope.isMobile !== isMobile && isMobile) {\n moveElement(scope.altElement);\n scope.altElement.addClass('node-relocated');\n }\n else if (scope.isMobile !== isMobile && !isMobile) {\n moveElement(scope.srcElement);\n scope.altElement.removeClass('node-relocated');\n }\n scope.isMobile = isMobile;\n });\n\n scope.isMobile = isMobile;\n }\n }\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc filter\n * @name components.filter:nl2br\n *\n * @description\n *\n * @param {Array} input The array to filter\n * @returns {Array} The filtered array\n *\n */\n angular\n .module('components')\n .filter('nl2br', nl2br);\n\n function nl2br() {\n return function (input) {\n if (input) {\n return (input + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + '
    ' + '$2');\n }\n\n return '';\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:Location\n *\n * @description\n *\n */\n Location.$inject = [\"Restangular\", \"Cache\"];\n angular\n .module('components')\n .service('Location', Location);\n\n function Location(Restangular, Cache) {\n var self = this,\n countries = [],\n states = [];\n\n self.cache = Cache.create('location');\n\n if (!self.cache.get('countries')) {\n Restangular.one('Countries').getList('index?limit=-1')\n .then(function (result) {\n angular.forEach(result, function (country) {\n countries.push(country.plain());\n });\n self.cache.put('countries', countries);\n });\n }\n else {\n countries = self.cache.get('countries');\n }\n\n if (!self.cache.get('states')) {\n Restangular.one('States').getList('index?limit=-1')\n .then(function (result) {\n angular.forEach(result, function (state) {\n states.push(state.plain());\n });\n self.cache.put('states', states);\n });\n }\n else {\n states = self.cache.get('states');\n }\n\n self.getCountries = function () {\n return countries;\n };\n\n self.getStates = function (idCountry) {\n idCountry = parseInt(idCountry, 10);\n if (idCountry > 0) {\n return _.filter(states, function (item) {\n return item.idCountry === idCountry;\n });\n }\n\n return states;\n };\n\n self.getCountryId = function (countryCode) {\n try {\n return _.find(countries, {abbrevation: countryCode}).idCountry;\n }\n catch (ex) {\n return null;\n }\n };\n\n self.getCountryNameById = function (countryId) {\n try {\n return _.find(countries, {idCountry: Number(countryId)}).name;\n }\n catch (ex) {\n return null;\n }\n };\n\n self.getStateId = function (countryId, stateCode) {\n var sts;\n try {\n sts = self.getStates(countryId);\n return _.find(sts, {abbrevation: stateCode}).idState;\n }\n catch (ex) {\n return null;\n }\n };\n\n self.getStateNameById = function (countryId, stateId, shortName) {\n var sts;\n try {\n sts = self .getStates(countryId);\n if (!shortName) {\n return _.find(sts, {idState: Number(stateId)}).name;\n }\n return _.find(sts, {idState: Number(stateId)}).abbrevation;\n }\n catch (ex) {\n return null;\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:locationSearch\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n locationSearch.$inject = [\"$q\", \"GoogleMap\"];\n angular\n .module('components')\n .directive('locationSearch', locationSearch);\n\n function locationSearch($q, GoogleMap) {\n return {\n restrict: 'A',\n scope: {\n inputId: '=',\n placeChangedCallback: '=',\n fullAddress: '='\n },\n replace: false,\n link: function (scope, element) {\n var autocomplete,\n placeSelected;\n\n // This is the place_changed handler which is the google event for the autocomplete input\n placeSelected = function () {\n var place = autocomplete.getPlace(),\n address;\n\n address = GoogleMap.convertAddress(place.address_components);\n address.location = GoogleMap.getFormattedAddress(address, scope.fullAddress);\n scope.placeChangedCallback(address);\n };\n\n GoogleMap.promise.then(function () {\n // Prevent \"Enter\" click to submit the form\n google.maps.event.addDomListener(element[0], 'keydown', function (event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n\n autocomplete = new google.maps.places.Autocomplete(element[0], {\n types: ['geocode']\n });\n autocomplete.addListener('place_changed', placeSelected);\n });\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:Industries\n *\n * @description\n *\n */\n Industries.$inject = [\"$q\", \"Restangular\", \"Cache\"];\n angular\n .module('components')\n .service('Industries', Industries);\n\n function Industries($q, Restangular, Cache) {\n var self = this,\n industries = {},\n subIndustries = [],\n deferred = $q.defer(),\n cache = Cache.create('industries', {\n maxAge: 1800000\n });\n\n self.isReady = deferred.promise;\n\n self.init = function () {\n if (!cache.get('industries') || !cache.get('subIndustries')) {\n Restangular.one('Industries').getList('index?limit=-1&includeAll=true')\n .then(function (result) {\n // Reset subIndustries as it might enter here couple of times within the lifecycle of the app and for example\n // login / logout always triggers the init (as the cache of industries is cleared) and hence adding more\n // and more subindustries\n subIndustries = [];\n\n angular.forEach(result, function (industry) {\n industry = industry.plain();\n if (!isNaN(industry.idIndustryParent) && industry.idIndustryParent > 0) {\n subIndustries.push(industry);\n }\n else {\n industry.options = [];\n industries[industry.id] = industry;\n }\n });\n\n angular.forEach(subIndustries, function (subIndustry) {\n if (angular.isDefined(industries[subIndustry.idIndustryParent])) {\n industries[subIndustry.idIndustryParent].options.push(subIndustry);\n }\n });\n cache.put('industries', industries);\n cache.put('subIndustries', subIndustries);\n deferred.resolve();\n });\n }\n else {\n industries = cache.get('industries');\n subIndustries = cache.get('subIndustries');\n deferred.resolve();\n }\n };\n\n self.init();\n\n self.getMainList = function () {\n return industries;\n };\n\n self.getSubList = function (idParent) {\n idParent = parseInt(idParent, 10);\n if (idParent > 0) {\n return _.filter(subIndustries, function (item) {\n return item.idIndustryParent === idParent;\n });\n }\n\n return subIndustries;\n };\n\n self.getFilteredList = function (subIndustriesFilter) {\n var filteredList = {};\n if (angular.isArray(subIndustriesFilter) && subIndustriesFilter.length > 0) {\n angular.forEach(subIndustriesFilter, function (item) {\n if (angular.isUndefined(filteredList[item.idIndustryParent])) {\n filteredList[item.idIndustryParent] = angular.extend({}, industries[item.idIndustryParent], {options: []});\n }\n filteredList[item.idIndustryParent].options.push(item);\n });\n }\n\n return _.values(filteredList);\n };\n\n self.getConsolidatedList = function () {\n var list = [];\n angular.forEach(industries, function (industry) {\n if (industry.options.length > 0) {\n angular.forEach(industry.options, function (subIndustry) {\n list.push({\n id: subIndustry.id,\n name: industry.name + ' - ' + subIndustry.name\n });\n });\n }\n else {\n list.push({\n id: industry.id,\n name: industry.name\n });\n }\n });\n\n return list;\n };\n\n self.getConsolidatedFilteredList = function (subIndustriesFilter) {\n var filteredList = {};\n\n if (angular.isArray(subIndustriesFilter) && subIndustriesFilter.length > 0) {\n filteredList = _.filter(self.getConsolidatedList(), function (item) {\n return _.findIndex(subIndustriesFilter, {id: item.id}) > -1;\n });\n }\n\n return filteredList;\n };\n\n self.reload = function () {\n cache.removeAll();\n self.init();\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.provider:GoogleMap\n *\n * @description\n *\n */\n angular\n .module('components')\n .provider('GoogleMap', GoogleMap);\n\n function GoogleMap() {\n var apiKey,\n libraries,\n isLoaded = false;\n\n return {\n init: function (key, libs) {\n apiKey = key;\n libraries = libs;\n },\n $get: ['$window', '$document', '$http', '$q', function ($window, $document, $http, $q) {\n var googleMapApi = $q.defer(),\n scriptElement;\n if (!isLoaded) {\n $window.googleMapInitCallback = function () {\n $window.googleMapInitCallback = null;\n isLoaded = true;\n googleMapApi.resolve();\n };\n\n scriptElement = $document[0].createElement('script');\n scriptElement.src = 'https://maps.googleapis.com/maps/api/js?callback=googleMapInitCallback&key=' + apiKey + '&libraries=' + libraries;\n $document[0].body.appendChild(scriptElement);\n }\n else {\n googleMapApi.resolve();\n }\n\n /**\n * Special location formatting for automatically detected location\n * @param {Object} address Structured address\n * @param {Boolean} preciseAddress Structured address\n * @returns {string} Formatted address\n */\n googleMapApi.getFormattedAddress = function (address, preciseAddress) {\n var parts = [],\n subParts = [];\n\n if (preciseAddress && address.streetNumber) {\n parts.push(address.streetNumber);\n }\n\n if (address.streetAddress) {\n parts.push(address.streetAddress);\n }\n\n if (address.suburb) {\n subParts.push(address.suburb);\n }\n\n if (address.state) {\n subParts.push(address.state);\n }\n\n if (address.postCode) {\n subParts.push(address.postCode);\n }\n\n if (subParts.length > 0) {\n parts.push(subParts.join(' '));\n }\n\n if (address.country) {\n parts.push(address.country);\n }\n\n return parts.join(', ');\n };\n\n googleMapApi.convertAddress = function (inputAddress) {\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n var address = {},\n i,\n val,\n addressType,\n mappings,\n typeMappings,\n loopFunc;\n\n mappings = [\n {\n typeKey: 'street_number',\n targetKey: 'streetNumber',\n sourceKey: 'short_name'\n },\n {\n typeKey: 'route',\n targetKey: 'streetAddress',\n sourceKey: 'long_name'\n },\n {\n typeKey: 'locality',\n targetKey: 'suburb',\n sourceKey: 'long_name'\n },\n {\n typeKey: 'administrative_area_level_1',\n targetKey: 'state',\n sourceKey: 'short_name'\n },\n {\n typeKey: 'country',\n targetKey: 'country',\n sourceKey: 'long_name'\n },\n {\n typeKey: 'country',\n targetKey: 'country_id',\n sourceKey: 'short_name'\n },\n {\n typeKey: 'postal_code',\n targetKey: 'postCode',\n sourceKey: 'short_name'\n }];\n\n loopFunc = function (mapping) {\n val = inputAddress[i][mapping.sourceKey];\n address[mapping.targetKey] = val;\n };\n\n for (i = 0; i < inputAddress.length; i++) {\n addressType = inputAddress[i].types[0];\n typeMappings = _.where(mappings, {typeKey: addressType});\n angular.forEach(typeMappings, loopFunc);\n }\n\n return address;\n };\n\n googleMapApi.getCurrentLocation = function (preciseAddress) {\n var deferred = $q.defer();\n if ('geolocation' in $window.navigator) {\n $window.navigator.geolocation.getCurrentPosition(function (position) {\n var geocoder = new google.maps.Geocoder(),\n gcRequest = {\n location: new google.maps.LatLng(position.coords.latitude, position.coords.longitude)\n };\n geocoder.geocode(\n gcRequest,\n function (gcResult, gcStatus) {\n var address;\n if (gcStatus === google.maps.GeocoderStatus.OK) {\n address = googleMapApi.convertAddress(gcResult[0].address_components);\n address.location = googleMapApi.getFormattedAddress(address, preciseAddress);\n if (gcResult[0].geometry) {\n address.geometry = {\n lat: gcResult[0].geometry.location.lat(),\n lng: gcResult[0].geometry.location.lng()\n };\n }\n deferred.resolve(address);\n }\n }\n );\n }, function () {\n deferred.reject();\n });\n }\n else {\n deferred.reject();\n }\n\n return deferred.promise;\n };\n\n googleMapApi.getStaticMapAsBase64 = function (address, options) {\n // Keep in mind that STATIC MAPS API will be constrain to only 640px if the key is not the business google maps license.\n // Check here https://developers.google.com/maps/documentation/static-maps/usage-limits\n\n var fileReader,\n deferred = $q.defer();\n\n if (!angular.isObject(options)) {\n deferred.reject();\n }\n\n try {\n $http({\n method: 'GET',\n url: 'https://maps.googleapis.com/maps/api/staticmap?format=png32¢er=' + address + '&zoom=15&size=' + options.w + 'x' + options.h + '&maptype=roadmap',\n responseType: 'blob'\n }).then(function (response) {\n fileReader = new FileReader();\n fileReader.onload = function () {\n deferred.resolve(fileReader.result);\n };\n fileReader.readAsDataURL(response.data);\n });\n }\n catch (err) {\n deferred.reject();\n }\n\n return deferred.promise;\n };\n\n return googleMapApi;\n }]\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:FormAlerts\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('FormAlerts', FormAlerts);\n\n function FormAlerts() {\n function FormAlertsBase() {\n this.alerts = [];\n this.someMethod = function () {\n return 'FormAlerts';\n };\n this.getList = function () {\n return this.alerts;\n };\n\n this.add = function (type, message) {\n this.alerts.push({type: type, message: message});\n };\n\n this.remove = function (index) {\n this.alerts.splice(index, 1);\n };\n\n this.reset = function () {\n this.alerts = [];\n };\n }\n\n return FormAlertsBase;\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:fileDownload\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n fileDownload.$inject = [\"$window\", \"$compile\", \"Auth\"];\n angular\n .module('components')\n .directive('fileDownload', fileDownload);\n\n function fileDownload($window, $compile, Auth) {\n return {\n restrict: 'EA',\n scope: {\n url: '=',\n label: '='\n },\n replace: true,\n link: function (scope, element, attrs) {\n var template = '{{label}}',\n e;\n scope.class = attrs.class;\n scope.title = attrs.title || 'Click to download';\n scope.download = function () {\n $window.open(Auth.fixApiEndpointUrl(scope.url));\n };\n\n e = $compile(template)(scope);\n element.replaceWith(e);\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:DataTable\n *\n * @description\n *\n */\n DataTable.$inject = [\"$q\", \"RecordsSet\"];\n angular\n .module('components')\n .factory('DataTable', DataTable);\n\n function DataTable($q, RecordsSet) {\n var DataTableBase = {};\n\n /**\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} params Additional parameters\n * @param {Object} options Additional params to configure record set\n * @constructor\n */\n function DataTableManager(entity, endPoint, params, options) {\n var self = this,\n dataLoader = RecordsSet.createLoader(entity, endPoint, params, options),\n lastTableState = {},\n loadingMoreRecords = false,\n deferredInit = $q.defer();\n\n self.isReady = deferredInit.promise;\n\n // Wait for the data loader to initialise. Then the promise will be fulfilled and the self.isReady by be set.\n dataLoader.isReady.then(function () {\n deferredInit.resolve();\n }, function () {\n deferredInit.reject();\n });\n\n /**\n * Loads the data\n * @param {Object} tableState Table state from the Smart Table\n */\n self.load = function (tableState) {\n // var key, direction;\n if (!self.isLoading()) {\n loadingMoreRecords = true;\n dataLoader.load()\n .then(function () {\n tableState.pagination.numberOfPages = dataLoader.numberOfSets;\n loadingMoreRecords = false;\n }, function () {\n loadingMoreRecords = false;\n });\n\n // if (angular.isObject(tableState.sort) && angular.isDefined(tableState.sort.predicate)) {\n // if (angular.isUndefined(lastTableState.sort) || !angular.equals(tableState.sort, lastTableState.sort)) {\n // key = tableState.sort.predicate;\n // direction = tableState.sort.reverse ? 'DESC' : 'ASC';\n // dataLoader.sort(key, direction)\n // .then(function () {\n // tableState.pagination.numberOfPages = dataLoader.numberOfSets;\n // });\n // }\n // }\n // else {\n // dataLoader.load()\n // .then(function () {\n // tableState.pagination.numberOfPages = dataLoader.numberOfSets;\n // });\n // }\n\n lastTableState = tableState;\n }\n };\n\n /**\n * Reloads the records with new parameters\n * @param {Object} reloadParams New parameters\n * @param {Boolean} initialReset If true resets also flag indicating existence of records\n *\n * @returns {Object} Result\n */\n self.reload = function (reloadParams, initialReset) {\n if (!self.isLoading()) {\n if (angular.isObject(lastTableState) && angular.isObject(lastTableState.sort) && angular.isDefined(lastTableState.sort.predicate)) {\n reloadParams.orderby = lastTableState.sort.predicate + ' ' + (lastTableState.sort.reverse ? 'DESC' : 'ASC');\n }\n return dataLoader.reload(reloadParams, initialReset)\n .then(function (result) {\n if (angular.isObject(lastTableState) && angular.isObject(lastTableState.pagination)) {\n lastTableState.pagination.numberOfPages = dataLoader.numberOfSets;\n\n return $q.when(result);\n }\n });\n }\n\n return $q.when(false);\n };\n\n /**\n * Returns the records\n * @returns {Array} Records\n */\n self.getRecords = function () {\n return dataLoader.records;\n };\n\n /**\n * Checks if the data table is loading the data\n * @returns {boolean} Flag if records are loading\n */\n self.isLoading = function () {\n return dataLoader.isLoading;\n };\n\n /**\n * Checks if loading more records - pagination\n *\n * @returns {boolean} Flag if loading more records\n */\n self.isLoadingMoreRecords = function () {\n return loadingMoreRecords;\n };\n\n /**\n * Checks if the data table is initialised\n * @returns {boolean} Flag if records are initialised\n */\n self.isInitialised = function () {\n return dataLoader.isInitialised;\n };\n\n /**\n * Checks if records exist\n *\n * @returns {boolean} Flag if records exist\n */\n self.recordsExist = function () {\n return dataLoader.recordsExist;\n };\n\n /**\n * Returns number of total records\n * @returns {integer} Number of total records\n */\n self.totalRecords = function () {\n return dataLoader.totalRecords;\n };\n }\n\n /**\n * Returns instance of data table manager\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} params Additional parameters\n * @param {Object} options Additional params to configure record set\n * @returns {DataTableManager} Instance of data table manager\n */\n DataTableBase.create = function (entity, endPoint, params, options) {\n return new DataTableManager(entity, endPoint, params, options);\n };\n\n return DataTableBase;\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:CreditCardUtil\n *\n * @description\n *\n */\n angular\n .module('components')\n .service('CreditCardUtil', CreditCardUtil);\n\n function CreditCardUtil() {\n var self = this,\n acceptedCreditCards = ['Visa', 'MasterCard', 'American Express'],\n expiryMonths = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],\n currentYear = new Date().getFullYear(),\n expiryYears = _.range(currentYear, currentYear + 20, 1);\n\n /**\n * Returns list of accepted credit cards\n *\n * @returns {string[]} Array of accepted credit cards\n */\n self.getAcceptedCards = function () {\n return acceptedCreditCards;\n };\n\n /**\n * Returns expiry months\n *\n * @returns {string[]} Array of months\n */\n self.getExpiryMonths = function () {\n return expiryMonths;\n };\n\n /**\n * Returns expiry years\n *\n * @returns {integer[]} Array of valid years\n */\n self.getExpiryYears = function () {\n return expiryYears;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc factory\n * @name components.factory:ComponentsUtil\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('ComponentsUtil', ComponentsUtilFactory);\n\n function ComponentsUtilFactory() {\n return {\n\n /**\n * Returns the updated tableSubContentVisible object used across the MLP for tables in xs (sm) devices\n * @param {Object} subContent Subcontent\n * @param {int} idx Index\n * @return {Object} Updated content object.\n */\n toggleSubContent: function (subContent, idx) {\n if (!subContent) {\n subContent = {};\n subContent[idx] = true;\n }\n else if (_.contains(_.keys(subContent), idx.toString())) {\n // Check if the incoming idx is already added, Just toggle it.\n subContent[idx] = !subContent[idx];\n }\n else {\n // Delete everything and set as new\n subContent = {};\n subContent[idx] = true;\n }\n return subContent;\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc filter\n * @name components.filter:address\n *\n * @description\n *\n * @param {Object} input The address object\n * @returns {String} Formatted Address\n *\n */\n angular\n .module('components')\n .filter('address', addressFilter);\n\n function addressFilter() {\n return function (input, locale) {\n var address = input,\n formats = {\n au: [['numberPostal', 'addressPostal'], ['suburbPostal', 'statePostalShort', 'postCodePostal'], 'countryPostal'],\n us: [['numberPostal', 'addressPostal'], 'suburbPostal', 'statePostalShort', 'postCodePostal', 'countryPostal']\n },\n format,\n output,\n innerOutput;\n\n format = formats[locale];\n if (!format) {\n format = formats.au;\n }\n\n if (address) {\n angular.forEach(format, function (key) {\n if (angular.isArray(key)) {\n // Keys in array are not separated by divider\n angular.forEach(key, function (k) {\n innerOutput = (innerOutput ? innerOutput + ' ' : '') + (address[k] ? address[k] : '');\n });\n if (innerOutput) {\n output = (output ? output + ', ' : '') + innerOutput;\n }\n innerOutput = '';\n }\n else if (address[key]) {\n output = (output ? output + ', ' : '') + address[key];\n }\n });\n return output;\n }\n\n return '';\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name cache\n * @description\n *\n */\n config.$inject = [\"CacheFactoryProvider\"];\n angular\n .module('cache', [\n 'angular-cache'\n ]);\n\n angular\n .module('cache')\n .config(config);\n\n function config(CacheFactoryProvider) {\n angular.extend(CacheFactoryProvider.defaults, {\n storagePrefix: 'myleadpod.',\n maxAge: 864000000\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name cache.service:Cache\n *\n * @description\n *\n */\n Cache.$inject = [\"CacheFactory\"];\n angular\n .module('cache')\n .service('Cache', Cache);\n\n function Cache(CacheFactory) {\n var self = this;\n\n self.create = function (name, options) {\n var cacheInstance = CacheFactory.get(name);\n if (!cacheInstance) {\n cacheInstance = CacheFactory.createCache(name, angular.extend({\n deleteOnExpire: 'aggressive',\n storageMode: 'localStorage'\n }, options));\n }\n\n return cacheInstance;\n };\n\n self.get = CacheFactory.get;\n }\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name api\n * @description\n *\n */\n angular\n .module('api', [\n 'cache'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.service:Session\n *\n * @description\n *\n */\n Session.$inject = [\"$rootScope\", \"$q\", \"Restangular\"];\n angular\n .module('api')\n .service('Session', Session);\n\n function Session($rootScope, $q, Restangular) {\n var self = this;\n\n self.data = {\n profile: null\n };\n self.loaded = false;\n self.loading = false;\n self.deferred = null;\n\n /**\n * Returns user profile\n *\n * @returns {Object} User profile\n */\n self.getUserProfile = function () {\n return self.getSession()\n .then(function (session) {\n return session.data.profile;\n });\n };\n\n /**\n * Updates user's profile\n *\n * @param {Object} profileData New profile data\n * @returns {Deferred} Deferred promise\n */\n self.updateUserProfile = function (profileData) {\n var deferred = $q.defer();\n Restangular.one('Users').customPUT(profileData, 'profile')\n .then(function (profile) {\n self.create(profile.plain());\n $rootScope.$broadcast('event:user-updateProfile', {profile: self.data.profile});\n deferred.resolve(self.data.profile);\n }, function () {\n deferred.reject();\n });\n\n return deferred.promise;\n };\n\n /**\n * Update local user's profile with new params\n *\n * @param {Object} params Update parameters\n * @param {boolean} broadcast Whether this new get requests should broadcast the event of the local user profile update\n * @returns {Object} User's profile\n */\n self.updateLocalUserProfile = function (params, broadcast) {\n if (angular.isObject(params)) {\n self.data.profile = angular.extend(self.data.profile, params);\n if (broadcast) {\n $rootScope.$broadcast('event:user-updateLocalProfile', params);\n }\n }\n\n return self.data.profile;\n };\n\n /**\n * Populates session from the provided data\n *\n * @param {Object} profile User's profile\n */\n self.create = function (profile) {\n self.destroy();\n if (angular.isObject(profile) && angular.isDefined(profile.idUser)) {\n self.data.profile = profile;\n self.data.profile.fullName = profile.firstName + ' ' + profile.lastName;\n }\n self.loaded = true;\n self.loading = false;\n if (self.deferred) {\n self.deferred.resolve(self);\n }\n };\n\n /**\n * Destroys the session\n */\n self.destroy = function () {\n self.data = {\n profile: null\n };\n };\n\n /**\n * Loads the Session\n *\n * @returns {Session} Current Session\n */\n self.loadSession = function () {\n if (!self.isLoading()) {\n self.loading = true;\n self.deferred = $q.defer();\n return Restangular.one('Users').one('check').get()\n .then(function (result) {\n if (result.status === true && angular.isObject(result.profile)) {\n return result.profile;\n }\n\n return null;\n })\n .then(function (userProfile) {\n self.create(userProfile);\n\n return self;\n });\n }\n\n return self.deferred.promise;\n };\n\n /**\n * Returns the Session\n *\n * @returns {Session} Current Session\n */\n self.getSession = function () {\n if (!self.isLoaded()) {\n return self.loadSession();\n }\n\n return $q.when(self);\n };\n\n /**\n * Check if the profile is valid\n *\n * @param {Object} profile Profile data to validate\n * @returns {boolean} Flag if profile is valid\n */\n self.isValidProfile = function (profile) {\n return angular.isObject(profile) && !!profile.idUser;\n };\n\n /**\n * Returns whether the user is signed in\n *\n * @returns {boolean} True or False\n */\n self.isSignedIn = function () {\n return self.getSession()\n .then(function (session) {\n return self.isValidProfile(session.data.profile);\n });\n };\n\n /**\n * Returns whether the session is already loaded\n *\n * @returns {boolean} True or False\n */\n self.isLoaded = function () {\n return !!self.loaded;\n };\n\n /**\n * Returns whether the session is currently loading\n *\n * @returns {boolean} True or False\n */\n self.isLoading = function () {\n return !!self.loading;\n };\n\n /**\n * Removes user's photo\n * @returns {Deferred} Deferred promise\n */\n self.removePhoto = function () {\n var deferred = $q.defer();\n Restangular.one('Users').one('photo').remove()\n .then(function () {\n self.data.profile.imageToken = null;\n $rootScope.$broadcast('event:user-updateProfile', {profile: self.data.profile});\n deferred.resolve(self.data.profile);\n }, function () {\n deferred.reject();\n });\n\n return deferred.promise;\n };\n\n /**\n * Updates user's photo\n * @param {string} dataUri Uri of photo\n * @returns {Deferred} Deferred promise\n */\n self.updatePhoto = function (dataUri) {\n var deferred = $q.defer();\n Restangular.one('Users').customPUT({\n dataUri: dataUri\n }, 'photoBase64')\n .then(function (result) {\n self.data.profile.imageToken = result.imageToken;\n $rootScope.$broadcast('event:user-updateProfile', {profile: self.data.profile});\n deferred.resolve(self.data.profile);\n }, function () {\n deferred.reject();\n });\n\n return deferred.promise;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.factory:Ff3ApiInterceptor\n *\n * @description\n *\n */\n Ff3ApiInterceptor.$inject = [\"$injector\", \"$q\", \"$rootScope\"];\n moduleConfig.$inject = [\"$httpProvider\"];\n angular\n .module('api')\n .factory('Ff3ApiInterceptor', Ff3ApiInterceptor)\n .config(moduleConfig);\n\n function Ff3ApiInterceptor($injector, $q, $rootScope) {\n var Ff3ApiInterceptorBase = {};\n Ff3ApiInterceptorBase.request = function (config) {\n var\n apiParams = $injector.get('Auth').getSecurityParams(),\n baseUrl = $injector.get('configOptions').baseUrl;\n\n if (config.url.indexOf(baseUrl) === -1) {\n return config;\n }\n\n if (config.method === 'GET') {\n // We will be appending all the required parameters as query params\n if (!config.params) {\n config.params = apiParams;\n }\n else {\n angular.forEach(apiParams, function (value, key) {\n config.params[key] = value;\n });\n }\n }\n else {\n config.headers.Accept = 'application/json';\n angular.forEach(apiParams, function (value, key) {\n config.headers[key] = value;\n });\n }\n\n return config;\n };\n\n Ff3ApiInterceptorBase.responseError = function (rejection) {\n if (rejection.status === 403 || rejection.status === 401) {\n $rootScope.$broadcast('event:auth-loginRequired', rejection);\n }\n // otherwise, default behaviour\n return $q.reject(rejection);\n };\n\n return Ff3ApiInterceptorBase;\n }\n\n function moduleConfig($httpProvider) {\n $httpProvider.interceptors.push('Ff3ApiInterceptor');\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.service:Auth\n *\n * @description\n *\n */\n Auth.$inject = [\"$rootScope\", \"$q\", \"$timeout\", \"$httpParamSerializer\", \"$injector\", \"Restangular\", \"configOptions\", \"Cache\", \"Session\"];\n angular\n .module('api')\n .service('Auth', Auth);\n\n function Auth($rootScope, $q, $timeout, $httpParamSerializer, $injector, Restangular, configOptions, Cache, Session) {\n var self = this,\n cache = Cache.create('auth');\n\n self.localSignoutTimeout = 200;\n\n /**\n * Returns the login token\n *\n * @returns {string} Login token\n */\n function getLoginToken() {\n return cache.get('loginToken');\n }\n\n /**\n * Saves the login token\n *\n * @param {string} loginToken Login token\n */\n self.saveLoginToken = function (loginToken) {\n cache.put('loginToken', loginToken);\n };\n\n /**\n * Deletes the login token\n */\n function deleteLoginToken() {\n cache.remove('loginToken');\n }\n\n function localSignOut() {\n deleteLoginToken();\n Session.destroy();\n cache.removeAll();\n $rootScope.$broadcast('event:auth-logoutSuccess');\n }\n\n /**\n * Signs user in\n *\n * @param {string} endPoint API end point\n * @param {Object} data Sign In data\n * @returns {Deferred} Resolved value will be either Session in case of success or reason in case of failure\n */\n function signIn(endPoint, data) {\n var deferred = $q.defer();\n $injector.get('OneSignal').getUserId().then(function (playerId) {\n data.oneSignalPlayerId = playerId;\n });\n Restangular.one('Users').post(endPoint, data)\n .then(function (result) {\n self.saveLoginToken(result.authToken);\n Session.create(result.profile);\n $rootScope.$broadcast('event:auth-loginConfirmed');\n deferred.resolve(Session);\n }, function (result) {\n deferred.reject({\n errorMessage: result.data.errorMessage,\n errorCode: result.data.errorCode\n });\n });\n\n return deferred.promise;\n }\n\n /**\n * Returns whether the user is authenticated\n *\n * @returns {boolean} True or False\n */\n self.isAuthenticated = function () {\n return Session.isSignedIn();\n };\n\n /**\n * Signs user out\n *\n * @param {boolean} serverLogout If false server side sign out will not be performed as well, default true\n *\n * @returns {void}\n */\n self.signOut = function (serverLogout) {\n var data = {};\n if (angular.isUndefined(serverLogout)) {\n serverLogout = true;\n }\n if (serverLogout) {\n $injector.get('OneSignal').getUserId().then(function (playerId) {\n data.oneSignalPlayerId = playerId;\n });\n Restangular.one('Users').post('signOut', data);\n }\n $timeout(localSignOut, self.localSignoutTimeout);\n };\n\n /**\n * Signs user in using username and password\n *\n * @param {string} username Username\n * @param {string} password Password\n * @returns {Deferred} Resolved value will be either Session in case of success or reason in case of failure\n */\n self.passwordSignIn = function (username, password) {\n return signIn('signIn', {\n username: username,\n password: password\n });\n };\n\n /**\n * Signs user in through social services (OAuth2)\n *\n * @param {string} provider Social service provider\n * @param {string} accessToken OAuth2 Access Token\n * @param {Object} params Additional parameters\n * @returns {Deferred} Resolved value will be either Session in case of success or reason in case of failure\n */\n self.socialSignIn = function (provider, accessToken, params) {\n var deferred = $q.defer();\n if (!angular.isObject(params)) {\n params = {};\n }\n Restangular.one('Users').post('socialNetworkSignIn', angular.extend({}, {\n oauth2: {\n accessToken: accessToken,\n provider: provider\n }\n }, params))\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n deferred.resolve({\n activationToken: result.activationToken\n });\n }\n else {\n self.saveLoginToken(result.authToken);\n Session.create(result.profile);\n $rootScope.$broadcast('event:auth-loginConfirmed');\n deferred.resolve(Session);\n }\n }, function (result) {\n deferred.reject(result.data.errorMessage);\n });\n\n return deferred.promise;\n };\n\n /**\n * Activates user account\n *\n * @param {string} token Activation token\n * @param {Object} userProfile User profile data\n * @returns {Deferred} Deferred promise\n */\n self.activateAccount = function (token, userProfile) {\n return signIn('activate', {\n token: token,\n account: userProfile\n });\n };\n\n /**\n * Returns security params necessary to access an API endpoint via URL\n * @returns {{X-Jwt-Assertion: string, X-Ff3-Api-Key: string}} Object with security params\n */\n self.getSecurityParams = function () {\n var params = {\n 'X-Ff3-Api-Key': configOptions.apiKey\n },\n token = getLoginToken();\n if (angular.isDefined(token) && token !== null && token !== '') {\n params['X-Jwt-Assertion'] = token;\n }\n\n return params;\n };\n\n /**\n * Fixes API endpoint URL\n * @param {string} apiEndpoint API Endpoint\n * @return {string} Full API endpoint including base url and auth params\n */\n self.fixApiEndpointUrl = function (apiEndpoint) {\n var tempUrl = configOptions.baseUrl,\n paramsStr = $httpParamSerializer(self.getSecurityParams());\n\n tempUrl += apiEndpoint;\n if (paramsStr !== '') {\n if (tempUrl.indexOf('?') !== -1) {\n tempUrl += '&' + paramsStr;\n }\n else {\n tempUrl += '?' + paramsStr;\n }\n }\n\n return tempUrl;\n };\n\n /**\n * Check if user has permission\n *\n * @param {Object} userProfile User's profile\n * @param {string} permission Name of permission to check\n * @return {boolean} Flag indicating if user has the permission or not\n */\n self.hasUserPermission = function (userProfile, permission) {\n if (angular.isObject(userProfile) && angular.isString(permission)) {\n if (angular.isObject(userProfile.permissions) && angular.isDefined(userProfile.permissions[permission])) {\n return userProfile.permissions[permission] === true;\n }\n }\n return false;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.constant:authEvents\n *\n * @description\n *\n */\n angular\n .module('api')\n .constant('authEvents', {\n loginSuccess: 'event:auth-loginConfirmed',\n loginFailed: 'event:auth-loginFailed',\n loginCancelled: 'event:auth-loginCancelled',\n logoutSuccess: 'event:auth-logoutSuccess',\n sessionTimeout: 'event:auth-sessionTimeout',\n sessionLoaded: 'event:auth-sessionLoaded',\n notAuthenticated: 'event:auth-loginRequired',\n notAuthorised: 'event:auth-notAuthorised'\n });\n}());\n\n(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name auth\n * @description\n *\n */\n angular\n .module('account', [\n 'ui.router',\n 'account.password',\n 'account.profile',\n 'account.billing',\n 'account.earnings',\n 'account.feedback',\n 'account.preferences'\n ]);\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:SignUpCtrl\n *\n * @description\n *\n */\n SignUpCtrl.$inject = [\"$state\", \"$stateParams\", \"Restangular\", \"FormAlerts\", \"SocialAccount\", \"invitation\", \"rewardCode\"];\n angular\n .module('account')\n .controller('SignUpCtrl', SignUpCtrl);\n\n function SignUpCtrl($state, $stateParams, Restangular, FormAlerts, SocialAccount, invitation, rewardCode) {\n var vm = this;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.showMessage = false;\n vm.isLoading = false;\n vm.invitationSender = null;\n vm.invitationType = null;\n\n // For trial content to display.\n vm.trialEligible = false;\n vm.trialDuration = null;\n\n // Reward Code\n vm.rewardCode = null;\n vm.rewardCodeChecked = false;\n vm.isRewardCodeValid = false;\n\n // If it's coming as BOOL false val, then we tried to retrieve it in reward-program-routes but was not found\n if (rewardCode === false) {\n vm.rewardCodeChecked = true;\n }\n\n if (angular.isObject(invitation) && angular.isDefined(invitation.email)) {\n vm.invitationSender = invitation.userSender;\n vm.invitationType = invitation.invitationType;\n vm.data.email = invitation.email;\n }\n else if (angular.isObject(rewardCode) && angular.isDefined(rewardCode.owner)) {\n vm.invitationSender = rewardCode.owner;\n vm.invitationType = 'Reward Code';\n vm.rewardCode = $stateParams.rewardCode;\n if (rewardCode.rewardCode) {\n vm.trialEligible = rewardCode.rewardCode.isEligibleForBusinessAccountTrial;\n vm.trialDuration = rewardCode.rewardCode.businessAccountTrialDuration;\n }\n }\n\n vm.passwordSignUp = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Users').post('signUp', {\n email: vm.data.email,\n password: vm.data.password,\n invitationToken: $stateParams.invitationToken,\n rewardCode: $stateParams.rewardCode || vm.rewardCode\n })\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n $state.go('accountActivate', {\n token: result.activationToken,\n invitationToken: $stateParams.invitationToken\n });\n }\n else {\n vm.showMessage = true;\n }\n }, function (error) {\n vm.isLoading = false;\n if (error.data && error.data.errorCode === 107) {\n vm.alerts.add('danger', 'This email is already registered. You can login here.');\n }\n else {\n vm.alerts.add('danger', 'Unable to sign up');\n }\n console.log(error);\n });\n };\n\n vm.socialSignIn = function (provider) {\n vm.isLoading = true;\n vm.alerts.reset();\n SocialAccount.signIn(provider, {\n invitationToken: $stateParams.invitationToken,\n rewardCode: $stateParams.rewardCode\n })\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n $state.go('accountActivate', {\n token: result.activationToken,\n invitationToken: $stateParams.invitationToken\n });\n }\n else if (angular.isDefined($stateParams.invitationToken) && angular.isString($stateParams.invitationToken)) {\n $state.go('userInvitation', {token: $stateParams.invitationToken});\n }\n else {\n $state.go('dashboard');\n }\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to sign up');\n });\n };\n\n vm.checkRewardCode = function () {\n if (!vm.rewardCode) {\n vm.isRewardCodeValid = false;\n vm.rewardCodeChecked = false;\n return;\n }\n if (vm.rewardCode === vm.lastChecked) {\n return;\n }\n vm.rewardCardOwner = null;\n vm.lastChecked = vm.rewardCode;\n vm.rewardCode = vm.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.isCheckingCode = true;\n Restangular.one('RewardCodes').one('detail').get({rewardCode: vm.rewardCode})\n .then(function (result) {\n vm.rewardCardOwner = result.owner;\n vm.rewardCodeChecked = true;\n vm.isCheckingCode = false;\n vm.isRewardCodeValid = true;\n }, function () {\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n vm.rewardCodeChecked = true;\n });\n };\n\n vm.onRewardCodeEnter = function ($event) {\n if ($event.key === 'Enter') {\n vm.lastChecked = null;\n vm.checkRewardCode();\n }\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:SignInCtrl\n *\n * @description\n *\n */\n SignInCtrl.$inject = [\"$state\", \"$stateParams\", \"FormAlerts\", \"Auth\", \"SocialAccount\"];\n angular\n .module('account')\n .controller('SignInCtrl', SignInCtrl);\n\n function SignInCtrl($state, $stateParams, FormAlerts, Auth, SocialAccount) {\n var vm = this,\n afterSignInCallback;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n\n afterSignInCallback = function () {\n if (angular.isDefined($stateParams.invitationToken) && angular.isString($stateParams.invitationToken)) {\n $state.go('userInvitation', {token: $stateParams.invitationToken});\n }\n else if (angular.isDefined($stateParams.rewardCode) && angular.isString($stateParams.rewardCode)) {\n $state.go('myMembershipsRewardProgramCode', {code: $stateParams.rewardCode});\n }\n else if (angular.isDefined($stateParams.nextState) && angular.isObject($stateParams.nextState) && angular.isDefined($stateParams.nextState.name)) {\n $state.go($stateParams.nextState.name, $stateParams.nextState.params || {});\n }\n else {\n $state.go('dashboard');\n }\n };\n\n vm.passwordSignIn = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Auth.passwordSignIn(vm.data.username, vm.data.password)\n .then(afterSignInCallback, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to login');\n });\n };\n\n vm.socialSignIn = function (provider) {\n vm.isLoading = true;\n vm.alerts.reset();\n SocialAccount.signIn(provider)\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n $state.go('accountActivate', {\n token: result.activationToken,\n nextState: $stateParams.nextState,\n invitationToken: $stateParams.invitationToken\n });\n }\n else {\n afterSignInCallback();\n }\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to login');\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name account.service:BusinessAccount\n *\n * @description\n *\n */\n BusinessAccount.$inject = [\"$rootScope\", \"$document\", \"$q\", \"$uibModal\", \"Restangular\", \"Auth\", \"Session\", \"Cache\", \"authEvents\"];\n angular\n .module('account')\n .service('BusinessAccount', BusinessAccount);\n\n function BusinessAccount($rootScope, $document, $q, $uibModal, Restangular, Auth, Session, Cache, authEvents) {\n var self = this,\n userProfile = Session.getUserProfile(),\n loginWatchHandle = null;\n\n // Get the cache that keeps the businessSuggestion records at the init of this service.\n self.suggestionCache = Cache.create('businessSuggestion');\n\n // Subscribe to the update of the user profile.\n loginWatchHandle = $rootScope.$on(authEvents.loginSuccess, function () {\n userProfile = Session.getUserProfile();\n });\n\n // Remove the handle once it's all destroyed\n $rootScope.$on('$destroy', loginWatchHandle);\n\n function openBusinessAccountPopup(domNode, isTrial) {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: domNode,\n templateUrl: isTrial ? 'account/business-account-trial.tpl.html' : 'account/business-account.tpl.html',\n controller: 'BusinessAccountCtrl',\n controllerAs: 'businessAccount',\n size: 'md',\n windowClass: 'modal-business-account',\n backdrop: 'static',\n resolve: {\n userProfile: function () {\n return Session.getUserProfile();\n },\n pricingDetails: function () {\n return Restangular.one('BusinessAccount').one('pricingDetails').get();\n },\n isTrial: function () {\n return isTrial;\n }\n }\n });\n\n return modalInstance;\n }\n\n function getDomNode(n) {\n var dn = null;\n if (angular.isUndefined(n)) {\n console.error('The target domNode is not specified.');\n return null;\n }\n\n if (angular.isString(n)) {\n dn = angular.element($document[0].getElementById(n));\n }\n else if (n.nodeName) {\n dn = angular.element(n);\n }\n else {\n console.error('Unsupported type for the target domNode. Please provide the ID or the HTMLElement reference');\n return null;\n }\n return dn;\n }\n\n /**\n * Activates user's business account\n *\n * @param {Object} data New profile data\n * @param {Bool} skipPayment Flag indicating if payment can be skipped\n * @return {Deferred} Deferred promise\n */\n self.activate = function (data, skipPayment) {\n var deferred = $q.defer(),\n action = 'activate';\n\n if (!angular.isObject(data)) {\n data = {};\n }\n\n if (angular.isUndefined(skipPayment) && skipPayment !== true && skipPayment !== false) {\n skipPayment = false;\n }\n\n if (skipPayment === true) {\n action = 'activateWithoutPayment';\n }\n\n Restangular.one('BusinessAccount').customPUT(data, action)\n .then(function (result) {\n var profile = result.profile;\n profile.isBusinessAccountActive = result.isBusinessAccountActive;\n Session.create(profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n deferred.resolve(profile);\n }, function (responseData) {\n deferred.reject({\n errorCode: responseData.data.errorCode,\n errorMessage: responseData.data.errorMessage\n });\n });\n\n return deferred.promise;\n };\n\n self.activateTrial = function (data) {\n var deferred = $q.defer(),\n action = 'activateTrial';\n\n if (!angular.isObject(data)) {\n data = {};\n }\n\n Restangular.one('BusinessAccount').customPUT(data, action)\n .then(function (result) {\n var profile = result.profile;\n profile.isBusinessAccountActive = result.isBusinessAccountActive;\n Session.create(profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n deferred.resolve(profile);\n }, function (responseData) {\n deferred.reject({\n errorCode: responseData.data.errorCode,\n errorMessage: responseData.data.errorMessage\n });\n });\n\n return deferred.promise;\n };\n\n /**\n * Initiate activation\n *\n * @param {string | HTMLElement} domNode Id of the dom node or the HTML Element directly into which the popup will be populated\n * @param {bool} isTrial If the template to be loaded should be the one for the TRIAL activation (evaluation subscription)\n * @return {IPromise} Deferred promise\n */\n self.initiateActivation = function (domNode, isTrial) {\n var deferred = $q.defer(),\n dn = getDomNode(domNode);\n\n if (!dn) {\n throw new Error('The target domNode for the popup is not specified or is unrecognized.');\n }\n\n userProfile.then(function (profile) {\n if (Auth.hasUserPermission(profile, 'activateBusinessAccountWithoutPayment')) {\n self.activate({}, true)\n .then(function (result) {\n deferred.resolve(result);\n }, function () {\n deferred.reject();\n });\n }\n else {\n openBusinessAccountPopup(dn, isTrial).result.then(function (result) {\n if (result) {\n deferred.resolve(result);\n }\n else {\n deferred.reject();\n }\n }, function () {\n deferred.reject();\n });\n }\n });\n\n return deferred.promise;\n };\n\n /**\n * Returns the suggestions count\n * @returns {number} Suggestions count\n */\n self.getSuggestionsCount = function () {\n var count = 0;\n if (angular.isDefined(self.suggestionCache) && self.suggestionCache.get('count')) {\n count = self.suggestionCache.get('count');\n }\n return count;\n };\n\n /**\n * Returns trial suggestions count\n * @returns {number} Trial suggestions count\n */\n self.getTrialSuggestionsCount = function () {\n var count = 0;\n if (angular.isDefined(self.suggestionCache) && self.suggestionCache.get('trialCount')) {\n count = self.suggestionCache.get('trialCount');\n }\n return count;\n };\n\n /**\n * Updates the suggestion count in the cache.\n * @param {number} count Initial count\n */\n self.updateSuggestionCount = function (count) {\n if (angular.isDefined(self.suggestionCache)) {\n self.suggestionCache.put('count', count + 1);\n self.suggestionCache.put('trialCount', count + 1);\n }\n };\n\n /**\n * Updates trial suggestions count\n * @param {number} count Initial count\n */\n self.updateTrialSuggestionCount = function (count) {\n if (angular.isDefined(self.suggestionCache)) {\n self.suggestionCache.put('trialCount', count + 1);\n }\n };\n\n /**\n * Returns the trial data\n * @param {Object} profile User's profile\n * @returns {Object} Trial data\n */\n self.getTrialData = function (profile) {\n var data;\n\n if (!profile) {\n return {};\n }\n\n data = {\n isEligibleForTrial: profile.businessAccount.isEligibleForTrial,\n isInTrial: profile.businessAccount.isInTrial,\n expiresIn: profile.businessAccount.trialExpiresInDays,\n trialWarning: profile.businessAccount.trialExpiresInDays <= 7,\n trialExpiresIn: null,\n trialExpiryDate: new Date(profile.businessAccount.trialExpiryDate)\n };\n\n if (data.isInTrial) {\n if (data.expiresIn === 0) {\n data.trialExpiresIn = ' expires today';\n }\n else if (data.expiresIn === 1) {\n data.trialExpiresIn = ' will expire in 1 day';\n }\n else {\n data.trialExpiresIn = ' will expire in ' + data.expiresIn + ' days';\n }\n }\n\n return data;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:BusinessAccountCtrl\n *\n * @description\n *\n */\n BusinessAccountCtrl.$inject = [\"$window\", \"$scope\", \"$timeout\", \"$uibModalInstance\", \"$state\", \"PromptDialog\", \"BusinessAccount\", \"FormAlerts\", \"userProfile\", \"pricingDetails\", \"Industries\", \"RewardCodes\", \"Location\", \"GoogleMap\", \"Restangular\", \"addressFilter\", \"isTrial\"];\n angular\n .module('account')\n .controller('BusinessAccountCtrl', BusinessAccountCtrl);\n\n function BusinessAccountCtrl($window, $scope, $timeout, $uibModalInstance, $state, PromptDialog, BusinessAccount, FormAlerts, userProfile,\n pricingDetails, Industries, RewardCodes, Location, GoogleMap, Restangular, addressFilter, isTrial) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.hasRewardCode = false;\n vm.rewardCodeChecked = false;\n vm.rewardCodeValid = false;\n vm.rewardCodeValidating = false;\n vm.rewardCodeHelp1 = 'Create your first Reward Code to offer to your referral network (one word, alpha numeric). With this step your default Reward Program will be created and used for this Reward Code';\n vm.rewardCodeHelp2 = 'Examples: MYCOMPANYNAME123, CODE123, SUMMERPROMOTION, ...\\n\\nPlease choose between 5 to 20 characters.';\n vm.getCountries = Location.getCountries;\n vm.pricingDetails = pricingDetails.pricingOptions;\n vm.getStates = function () {\n return Location.getStates(vm.data.addressPostal.idCountryPostal);\n };\n vm.showRewardCard = true;\n vm.data = {\n businessName: userProfile.businessName,\n idClassification: null,\n businessMarketingPayment: vm.pricingDetails && vm.pricingDetails[0] ? vm.pricingDetails[0].id : -1,\n creditCard: {\n method: null\n },\n address: null,\n addressPostal: {\n address: null,\n numberPostal: null,\n addressPostal: userProfile.addressPostal.addressPostal,\n suburbPostal: userProfile.addressPostal.suburbPostal,\n postCodePostal: userProfile.addressPostal.postCodePostal,\n idStatePostal: angular.isDefined(userProfile.addressPostal.idStatePostal) && userProfile.addressPostal.idStatePostal !== null ? userProfile.addressPostal.idStatePostal.toString() : '',\n idCountryPostal: angular.isDefined(userProfile.addressPostal.idCountryPostal) && userProfile.addressPostal.idCountryPostal !== null ? userProfile.addressPostal.idCountryPostal.toString() : '',\n statePostal: userProfile.addressPostal.idCountryPostal && userProfile.addressPostal.idStatePostal ? Location.getStateNameById(userProfile.addressPostal.idCountryPostal, userProfile.addressPostal.idStatePostal) : '',\n statePostalShort: userProfile.addressPostal.idCountryPostal && userProfile.addressPostal.idStatePostal ? Location.getStateNameById(userProfile.addressPostal.idCountryPostal, userProfile.addressPostal.idStatePostal, true) : '',\n countryPostal: userProfile.addressPostal.idCountryPostal ? Location.getCountryNameById(userProfile.addressPostal.idCountryPostal) : ''\n }\n };\n\n vm.paymentSummary = {\n price: null,\n tax: null,\n total: null\n };\n\n Restangular.one('Billing').one('creditCard').get()\n .then(function (cc) {\n cc = cc.plain();\n vm.data.creditCard.method = angular.isObject(cc) && angular.isDefined(cc.number) ? 'old' : 'new';\n vm.creditCard = cc;\n return cc;\n }, function () {\n return null;\n });\n\n vm.formatAddress = function () {\n vm.data.addressPostal.address = addressFilter(vm.data.addressPostal);\n };\n\n // Get the industry\n if (angular.isObject(userProfile.subIndustry)) {\n vm.data.idClassification = userProfile.subIndustry.id.toString();\n vm.selectedClassification = {id: userProfile.subIndustry.id, name: userProfile.industry.name + ' - ' + userProfile.subIndustry.name};\n }\n else if (angular.isObject(userProfile.industry)) {\n vm.data.idClassification = userProfile.industry.id.toString();\n vm.selectedClassification = {id: userProfile.industry.id, name: userProfile.industry.name};\n }\n\n // Check if the user already has a reward code so we can skip the reward code step\n if (userProfile && userProfile.rewardCodes && _.where(userProfile.rewardCodes, {isArchived: false}).length > 0) {\n vm.hasRewardCode = true;\n }\n\n // Get the trial data for the user. We only need the expiry date\n if (userProfile) {\n vm.trialData = BusinessAccount.getTrialData(userProfile);\n }\n\n Industries.isReady.then(function () {\n vm.industries = Industries.getConsolidatedList();\n });\n\n vm.onClassificationSelect = function (classification) {\n if (angular.isObject(classification) && angular.isObject(classification.originalObject)) {\n vm.data.idClassification = classification.originalObject.id;\n }\n };\n\n vm.onRewardCodeChange = function () {\n vm.rewardCodeChecked = false;\n };\n\n vm.onCountryChange = function (form) {\n vm.data.addressPostal.idStatePostal = '';\n if (form && form.idStatePostal) {\n delete form.idStatePostal.$touched;\n delete form.idStatePostal.$error.required;\n }\n };\n\n vm.validateRewardCode = function () {\n var code;\n if (vm.data.rewardCode && vm.data.rewardCode.length >= 5 && vm.data.rewardCode.length <= 20) {\n code = vm.data.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.data.rewardCode = code.replace(/[-]+/g, '-');\n vm.onDataChange('code');\n vm.rewardCodeValidating = true;\n RewardCodes.isRewardCodeUnique(vm.data.rewardCode)\n .then(function (isUnique) {\n vm.rewardCodeValid = isUnique;\n vm.rewardCodeValidating = false;\n vm.rewardCodeChecked = true;\n });\n }\n };\n\n vm.isLeadPriceValid = function () {\n return !isNaN(vm.data.successfulLeadPrice) && vm.data.successfulLeadPrice >= 0;\n };\n\n vm.cancel = function () {\n PromptDialog.open('Are you sure you\\'d like to cancel the activation?
    You can access this activation window again from Profile Menu -> Business Account', null, 'Cancel Activation', 'Go Back')\n .then(function () {\n $uibModalInstance.dismiss();\n });\n };\n\n vm.onDataChange = function (type) {\n var el,\n value;\n try {\n if (type === 'name') {\n el = angular.element('#RewardCard-front')[0].contentDocument.getElementById('RewardCard-CompanyName');\n value = vm.data.businessName;\n if (value.length > 20) {\n value = value.substr(0, 20) + '..';\n }\n }\n if (type === 'code') {\n el = angular.element('#RewardCard-back')[0].contentDocument.getElementById('RewardCard-Code');\n value = vm.data.rewardCode || '';\n if (value.length > 15) {\n el.style.fontSize = '18px';\n }\n else {\n el.style.fontSize = '20px';\n }\n }\n if (type === 'value') {\n el = angular.element('#RewardCard-front')[0].contentDocument.getElementById('RewardCard-RewardValue').firstElementChild;\n value = vm.data.successfulLeadPrice || 0;\n if (Number(value) > 999) {\n el.style.fontSize = '24px';\n }\n else {\n el.style.fontSize = '36px';\n }\n }\n\n if (el) {\n el.innerHTML = value;\n }\n vm.showRewardCard = true;\n }\n catch (ex) {\n console.log(ex);\n vm.showRewardCard = false;\n }\n };\n\n vm.isAddressIncomplete = function () {\n return !vm.data.addressPostal.addressPostal ||\n !vm.data.addressPostal.suburbPostal ||\n !vm.data.addressPostal.postCodePostal ||\n !vm.data.addressPostal.idStatePostal ||\n !vm.data.addressPostal.idCountryPostal;\n };\n\n vm.getUserLocationAddress = function () {\n // From geolocation\n vm.isGeolocating = true;\n GoogleMap.promise.then(function () {\n GoogleMap.getCurrentLocation(true).then(function (result) {\n // result.location\n vm.data.addressPostal.address = result.location;\n vm.data.addressPostal.numberPostal = result.streetNumber;\n vm.data.addressPostal.addressPostal = result.streetAddress;\n vm.data.addressPostal.suburbPostal = result.suburb;\n vm.data.addressPostal.postCodePostal = result.postCode;\n vm.data.addressPostal.statePostalShort = result.state;\n vm.data.addressPostal.countryPostal = result.country;\n vm.updateStateCountryIds(result);\n vm.formatAddress();\n vm.isGeolocating = false;\n // vm.getLocationScreenshot();\n }, vm.geolocationFailCallback);\n }, vm.geolocationFailCallback);\n };\n\n vm.geolocationFailCallback = function () {\n // There is some issue with the geolocation. disable the button.\n vm.isGeolocationDisabled = true;\n vm.isGeolocating = false;\n $timeout(function () {\n $scope.$apply();\n }, 0);\n };\n\n vm.placeChangedCallback = function (data) {\n // From google maps geocoding (autocomplete)\n vm.data.addressPostal.address = data.location;\n vm.data.addressPostal.numberPostal = data.streetNumber;\n vm.data.addressPostal.addressPostal = data.streetAddress;\n vm.data.addressPostal.suburbPostal = data.suburb;\n vm.data.addressPostal.postCodePostal = data.postCode;\n vm.data.addressPostal.statePostalShort = data.state;\n vm.data.addressPostal.countryPostal = data.country;\n vm.updateStateCountryIds(data);\n vm.formatAddress();\n $scope.$apply();\n // vm.getLocationScreenshot();\n };\n\n vm.updateStateCountryIds = function (result) {\n vm.data.addressPostal.idCountryPostal = Location.getCountryId(result.country_id);\n vm.data.addressPostal.idStatePostal = Location.getStateId(vm.data.addressPostal.idCountryPostal, result.state);\n vm.data.addressPostal.idCountryPostal = vm.data.addressPostal.idCountryPostal ? vm.data.addressPostal.idCountryPostal.toString() : null;\n vm.data.addressPostal.idStatePostal = vm.data.addressPostal.idStatePostal ? vm.data.addressPostal.idStatePostal.toString() : null;\n };\n\n vm.getLocationScreenshot = function () {\n var el;\n vm.isRenderingLocation = true;\n try {\n el = angular.element('.location-screenshot');\n console.log(el.height(), el.width());\n GoogleMap.getStaticMapAsBase64(vm.data.addressPostal.address, {\n w: el.width(),\n h: el.height()\n }).then(function (base64) {\n angular.element('img', el)[0].src = base64;\n vm.isRenderingLocation = false;\n });\n }\n catch (ex) {\n vm.isRenderingLocation = false;\n }\n };\n\n vm.updateSummary = function () {\n // Get the active pricing option\n var p = _.find(vm.pricingDetails, {id: vm.data.businessMarketingPayment});\n if (p) {\n vm.paymentSummary.price = p.price;\n vm.paymentSummary.total = p.priceInclGst;\n vm.paymentSummary.tax = vm.paymentSummary.total - vm.paymentSummary.price;\n }\n };\n\n vm.save = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n\n if (isTrial) {\n BusinessAccount.activateTrial(vm.data).then(function (profile) {\n $uibModalInstance.close(profile);\n $state.go('myMembershipsRewardProgramsSetup', {openInvite: true});\n }, function (error) {\n vm.isLoading = false;\n if (error.errorCode === 701 || error.errorCode === 702 || error.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to activate the trial: ' + error.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to activate the trial, try again later please');\n }\n });\n }\n else {\n BusinessAccount.activate(vm.data).then(function (profile) {\n $uibModalInstance.close(profile);\n // Navigate to Rewards Program Page\n $state.go('myMembershipsRewardProgramsSetup', {openInvite: true});\n }, function (error) {\n vm.isLoading = false;\n if (error.errorCode === 701 || error.errorCode === 702 || error.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to activate: ' + error.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to activate, try again later please');\n }\n });\n }\n };\n\n vm.formatAddress();\n vm.isMobile = $window.innerWidth < 768;\n angular.element($window).on('resize', function () {\n vm.isMobile = $window.innerWidth < 768;\n $scope.$apply();\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:ActivateUpdatePasswordCtrl\n *\n * @description\n *\n */\n ActivateUpdatePasswordCtrl.$inject = [\"$rootScope\", \"$state\", \"Restangular\", \"Auth\", \"Session\", \"FormAlerts\", \"userProfile\", \"OneSignal\", \"configOptions\"];\n angular\n .module('account')\n .controller('ActivateUpdatePasswordCtrl', ActivateUpdatePasswordCtrl);\n\n function ActivateUpdatePasswordCtrl($rootScope, $state, Restangular, Auth, Session, FormAlerts, userProfile, OneSignal, configOptions) {\n var vm = this,\n oneSignalPlayerId;\n\n OneSignal.getUserId().then(function (playerId) {\n oneSignalPlayerId = playerId;\n });\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.userProfile = userProfile;\n vm.data = {\n password: null,\n confirmPassword: null\n };\n\n vm.activate = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Users').customPUT({\n newPassword: vm.data.password,\n oneSignalPlayerId: oneSignalPlayerId\n }, 'password')\n .then(function (result) {\n configOptions.reportRegistration();\n result = result.plain();\n vm.isLoading = false;\n Auth.saveLoginToken(result.authToken);\n Session.create(result.profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: result.profile});\n $rootScope.$broadcast('event:auth-loginConfirmed');\n $state.go('dashboard');\n }, function () {\n vm.alerts.add('danger', 'Unable to save');\n vm.isLoading = false;\n });\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:ActivateCtrl\n *\n * @description\n *\n */\n ActivateCtrl.$inject = [\"$document\", \"$state\", \"$stateParams\", \"FormAlerts\", \"Auth\", \"BusinessAccount\", \"userRegistration\", \"GoogleMap\", \"configOptions\"];\n angular\n .module('account')\n .controller('ActivateCtrl', ActivateCtrl);\n\n function ActivateCtrl($document, $state, $stateParams, FormAlerts, Auth, BusinessAccount, userRegistration, GoogleMap, configOptions) {\n var vm = this;\n\n vm.data = userRegistration;\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.data.newsletter = true;\n vm.data.rewardCode = userRegistration.rewardCode;\n vm.rewardCodeReadOnly = !!userRegistration.rewardCode;\n vm.rewardCodeLabel = userRegistration.rewardCode;\n vm.emailVisible = !userRegistration.email;\n vm.passwordVisible = !userRegistration.isPasswordSet;\n\n // Help texts\n vm.rewardCodeHelp = 'If you have a Reward Code from an existing MyLeadPod business, enter it below to directly connect with this business after activation. (Optional)';\n\n vm.data.address = {\n streetAddress: userRegistration.streetAddress,\n suburb: userRegistration.suburb,\n state: userRegistration.state,\n postCode: userRegistration.postCode,\n country: userRegistration.country\n };\n\n vm.activate = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Auth.activateAccount($stateParams.token, {\n firstName: vm.data.firstName,\n lastName: vm.data.lastName,\n businessName: vm.data.businessName,\n address: vm.data.address,\n phoneMobile: vm.data.phoneMobile,\n newsletter: vm.data.newsletter,\n rewardCode: vm.data.rewardCode,\n email: vm.data.email,\n password: vm.data.password\n })\n .then(function (newSession) {\n var userProfile = newSession.data.profile;\n\n configOptions.reportRegistration();\n\n if (angular.isDefined($stateParams.invitationToken) && angular.isString($stateParams.invitationToken)) {\n $state.go('userInvitation', {\n token: $stateParams.invitationToken\n });\n }\n else if (angular.isDefined(userRegistration.idUserRewardCodeOwner) && userRegistration.idUserRewardCodeOwner !== null && angular.isDefined(userRegistration.redirectToUserProfile) && userRegistration.redirectToUserProfile === true) {\n $state.go('user', {id: userRegistration.idUserRewardCodeOwner, isInvite: true});\n }\n else {\n $state.go('dashboard');\n\n if (angular.isObject(userProfile.businessAccount) && userProfile.businessAccount.isEligibleForTrial === true) {\n BusinessAccount.initiateActivation(angular.element($document[0].body)[0], true);\n }\n }\n }, function (error) {\n vm.isLoading = false;\n if (angular.isObject(error) && error.errorCode === 602) {\n vm.alerts.add('danger', 'Invalid Reward Code');\n }\n else {\n vm.alerts.add('danger', 'Unable to activate');\n }\n });\n };\n\n vm.placeChangedCallback = function (address) {\n vm.data.address = address;\n };\n\n if (!vm.data.address.streetAddress) {\n GoogleMap.promise.then(function () {\n GoogleMap.getCurrentLocation().then(function (result) {\n vm.data.location = result.location;\n vm.data.address = result;\n });\n });\n }\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name account.service:AccountService\n *\n * @description\n *\n */\n AccountService.$inject = [\"$uibModal\", \"$document\", \"Session\"];\n angular\n .module('account')\n .service('AccountService', AccountService);\n\n function AccountService($uibModal, $document, Session) {\n var scope = this;\n\n /**\n * Opens the modal dialog for the preferences settings\n *\n * @param {object} userProfile object User profile for which the preferences will be loaded\n * @returns {object} UibModalInstance result\n */\n scope.openPreferences = function (userProfile) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'account/preferences/preferences-modal.tpl.html',\n controller: 'PreferencesCtrl',\n controllerAs: 'preferences',\n size: 'lg',\n resolve: {\n userProfile: function () {\n return userProfile;\n }\n },\n appendTo: angular.element($document[0].body)\n };\n\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n\n scope.openFeedback = function (userProfile, helpRequired) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'account/feedback/feedback-modal.tpl.html',\n controller: 'FeedbackCtrl',\n controllerAs: 'feedback',\n size: 'lg',\n resolve: {\n userProfile: function () {\n if (userProfile) {\n return userProfile;\n }\n return Session.getUserProfile();\n },\n helpRequired: function () {\n return helpRequired;\n }\n },\n appendTo: angular.element($document[0].body)\n };\n\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n }\n}());\n\n(function () {\n 'use strict';\n\n config.$inject = [\"$stateProvider\"];\n angular\n .module('account')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('account', {\n url: '/account',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account'\n })\n .state('accountSignInUp', {\n abstract: true,\n template: '',\n params: {\n invitationToken: null,\n rewardCode: null\n },\n resolve: {\n rewardCode: ['Restangular', '$stateParams', function (Restangular, $stateParams) {\n if ($stateParams.rewardCode && angular.isString($stateParams.rewardCode) && $stateParams.rewardCode.length > 0) {\n return Restangular.one('RewardCodes').one('detail').get({rewardCode: $stateParams.rewardCode})\n .then(function (rewardCode) {\n return rewardCode.plain();\n }, function () {\n return false;\n });\n }\n return null;\n }]\n },\n data: {\n classNames: 'no-help'\n }\n })\n .state('accountSignInUp.accountSignIn', {\n url: '/account/signin',\n templateUrl: 'account/sign-in.tpl.html',\n controller: 'SignInCtrl',\n controllerAs: 'signIn',\n params: {\n nextState: {}\n },\n data: {\n classNames: 'no-help requires-login'\n }\n })\n .state('accountSignInUp.accountSignUp', {\n url: '/account/signup',\n templateUrl: 'account/sign-up.tpl.html',\n controller: 'SignUpCtrl',\n controllerAs: 'signUp',\n resolve: {\n invitation: ['Restangular', '$stateParams', function (Restangular, $stateParams) {\n if ($stateParams.invitationToken) {\n return Restangular.one('Invitations').one('detail').get({token: $stateParams.invitationToken})\n .then(function (invitation) {\n return invitation.plain();\n }, function () {\n return null;\n });\n }\n\n return null;\n }]\n },\n data: {\n classNames: 'no-help requires-signup'\n }\n })\n .state('accountActivate', {\n url: '/account/activate/{token}',\n templateUrl: 'account/activate.tpl.html',\n controller: 'ActivateCtrl',\n controllerAs: 'activate',\n params: {\n invitationToken: null\n },\n resolve: {\n userRegistration: ['$stateParams', '$state', 'Restangular', function ($stateParams, $state, Restangular) {\n return Restangular.one('Users').one('activate').get({token: $stateParams.token})\n .then(function (result) {\n return result.plain();\n }, function () {\n $state.go('accountSignInUp.accountSignIn');\n });\n }]\n }\n })\n .state('accountVerifyRegistration', {\n url: '/account/verify/{token}',\n templateUrl: 'account/activate-update-password.tpl.html',\n controller: 'ActivateUpdatePasswordCtrl',\n controllerAs: 'activate',\n params: {\n invitationToken: null\n },\n resolve: {\n userProfile: ['$stateParams', '$state', '$q', 'Auth', 'Session', 'Restangular', function ($stateParams, $state, $q, Auth, Session, Restangular) {\n var userProfileDeferred = $q.defer();\n Auth.signOut(false);\n Restangular.one('Users').one('verify').get({token: $stateParams.token})\n .then(function (result) {\n var userProfile = result.profile,\n token = result.authToken;\n\n // If this is not a valid token, then just go to sign in.\n if (!token || !userProfile) {\n $state.go('accountSignInUp.accountSignIn');\n return;\n }\n\n // Save it into the cache\n Auth.saveLoginToken(result.authToken);\n\n // Create the session\n Session.create(userProfile);\n\n // If this is the first time and user needs to provide the password, go ahead\n if (!userProfile.isPasswordSet) {\n userProfileDeferred.resolve(userProfile);\n }\n else {\n // Forward him to sign in. That should in turn go to dashboard?\n $state.go('accountSignInUp.accountSignIn');\n }\n }, function () {\n $state.params = angular.extend($state.params, {logout: true});\n $state.go('accountSignInUp.accountSignIn');\n });\n\n return userProfileDeferred.promise;\n }]\n }\n })\n .state('accountUnsubscribe', {\n url: '/account/mailing-list/unsubscribe/{userId}/{subscriptionId}',\n templateUrl: 'account/preferences/mailing-list-unsubscribe.tpl.html',\n controller: 'MailingListUnsubscribeCtrl',\n controllerAs: 'preferences',\n data: {\n classNames: 'mailing-list-unsubscribe'\n }\n });\n }\n}());\n\n(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:AccountCtrl\n *\n * @description\n *\n */\n AccountCtrl.$inject = [\"Session\"];\n angular\n .module('account')\n .controller('AccountCtrl', AccountCtrl);\n\n function AccountCtrl(Session) {\n var vm = this;\n\n Session.getUserProfile()\n .then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n }\n });\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Profile',\n value: 'profile',\n url: 'account.profile'\n },\n {\n label: 'Billing',\n value: 'billing',\n url: 'account.billing',\n condition: function () {\n return vm.userProfile.isBusinessAccountActive;\n }\n },\n {\n label: 'Earnings',\n value: 'earnings',\n url: 'account.earnings'\n }\n ];\n }\n}());\n\n(function () {\n 'use strict';\n\n angular\n .module('mlp-animations', ['ngAnimate'])\n .animation('.slide', slide)\n .animation('.slide-fast', slideFast)\n .animation('.slide-if', slideIf)\n .animation('.slide-if-reversed', slideIfReversed)\n .animation('.slide-if-flex', slideIfFlex)\n .animation('.slide-left', slideLeft)\n .animation('.slide-right', slideRight)\n .animation('.opacity-if', opacityIf)\n .animation('.opacity-slow-if', opacitySlowIf);\n\n function slide() {\n return {\n addClass: function (element, className, done) {\n element.css('display', 'none');\n angular.element(element).slideDown('fast', done);\n },\n removeClass: function (element, className, done) {\n angular.element(element).slideUp('fast', done);\n }\n };\n }\n\n function slideFast() {\n return {\n addClass: function (element, className, done) {\n element.css('display', 'none');\n angular.element(element).slideDown(100, done);\n },\n removeClass: function (element, className, done) {\n angular.element(element).slideUp(100, done);\n }\n };\n }\n\n function slideIf() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n angular.element(element).slideDown('fast', done);\n },\n move: function (element, done) {\n angular.element(element).slideDown('fast', done);\n },\n leave: function (element, done) {\n angular.element(element).slideUp('fast', done);\n }\n };\n }\n\n function slideIfReversed() {\n return {\n enter: function (element, done) {\n angular.element(element).slideUp('fast', done);\n },\n move: function (element, done) {\n angular.element(element).slideUp('fast', done);\n },\n leave: function (element, done) {\n angular.element(element).slideDown('fast', done);\n }\n };\n }\n\n function slideIfFlex() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n angular.element(element).css('display', 'flex');\n angular.element(element).slideDown('fast', done);\n },\n move: function (element, done) {\n angular.element(element).slideDown('fast', done);\n },\n leave: function (element, done) {\n angular.element(element).slideUp('fast', done);\n }\n };\n }\n\n function slideLeft() {\n return {\n addClass: function (element, className, done) {\n var el = angular.element(element);\n el.css({\n display: 'block',\n transform: 'translate(-' + (el.offset().left + el.outerWidth()) + 'px, 0px)'\n });\n done();\n }\n };\n }\n\n function slideRight() {\n return {\n addClass: function (element, className, done) {\n angular.element(element).css({\n display: 'block',\n transform: 'translate(0px, 0px)'\n });\n done();\n }\n };\n }\n\n function opacityIf() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n angular.element(element).fadeIn(100, function (args) {\n element.css('opacity', 1);\n done(args);\n });\n },\n leave: function (element, done) {\n angular.element(element).fadeOut(100, function (args) {\n element.css('opacity', 0);\n done(args);\n });\n }\n };\n }\n\n function opacitySlowIf() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n element.css('display', 'none');\n angular.element(element).fadeIn(500, done);\n },\n leave: function (element, done) {\n angular.element(element).fadeOut(500, done);\n }\n };\n }\n}());\n\nvar $windowInstance = angular.injector(['ng']).get('$window');\n\nRaven.addPlugin(Raven.Plugins.Angular);\n\n$windowInstance.deferredBootstrapper.bootstrap({\n element: $windowInstance.document,\n module: 'myLeadPod',\n bootstrapConfig: {\n strictDi: !false\n },\n injectorModules: ['restangular', 'api', 'configuration'],\n resolve: {\n PreloadedUserProfile: ['$q', 'Restangular', 'configOptions', 'Session', 'Auth',\n function ($q, Restangular, configOptions, Session, Auth) {\n 'use strict';\n var deferred;\n Restangular.setBaseUrl(configOptions.baseUrl);\n Restangular.addResponseInterceptor(function (data, operation) {\n var extractedData;\n if (operation === 'getList') {\n extractedData = data.content.records;\n extractedData.meta = data.content.recordsInfo;\n }\n else {\n extractedData = angular.extend({}, data.content);\n }\n extractedData.contentEtag = data.contentEtag;\n extractedData.responseStatus = {\n code: data.content.statusCode,\n text: data.content.statusText\n };\n\n return extractedData;\n });\n Restangular.setDefaultHeaders({Accept: 'application/json'});\n deferred = $q.defer();\n Session.getUserProfile().then(function (userProfile) {\n if (angular.isObject(userProfile) && !!userProfile.idUser) {\n deferred.resolve(userProfile);\n }\n else {\n Auth.signOut(false);\n deferred.resolve(null);\n }\n }, function () {\n Auth.signOut(false);\n deferred.resolve(null);\n });\n\n return deferred.promise;\n }]\n }\n});\n\n(function () {\n 'use strict';\n\n angular\n .module('myLeadPod')\n .config(config);\n\n function config() {\n\n }\n}());\n","
    \n
    \n
    \n Please enter the details of the person you are asking for the leads\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing first name.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing email.
    \n
    This is not a valid email.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing phone number.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n","
    \n
    \n \n
    \n
    \n
    \n {{tabsManager.getActiveLabel()}}\n
    \n \n \n \n
    \n \n
    \n
    \n \n
    \n","
    \n
    \n
    \n \n
    \n

    \n \n {{user.mlpUserDetails.descriptionText}}\n

    \n

    {{user.phoneMobile}}

    \n

    {{user.email}}

    \n
    \n
    \n","\n","
    \n
    \n\n\n
    \n\n \n
    \n \n
    Loading Leads
    \n
    \n\n
    \n
    \n\n
    \n \n\n
    \n
    \n\n\n
    \n
    \n
    \n
    \n

    Direct Messages

    \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n
    \n
    \n Lead Messages\n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n

    Lead Messages

    \n \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    \n
    \n
    \n
    \n \n Details\n
    \n
    \n {{messages.currentLead.details}}\n
    \n
    \n\n
    \n
    \n \n Contact\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n {{messages.currentLead.firstName}} {{messages.currentLead.lastName}}\n
    \n
    \n
    \n\n
    \n
    \n \n
    \n \n
    \n\n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n\n\n
    \n \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n
    \n

    Messages List

    \n
    \n
    \n\n
    \n
    \n # Direct Messages\n
    \n
    \n
    \n \n
    \n
    \n
    \n\n
    \n
    \n # Lead Messages\n
    \n
    \n\n
    \n
    \n\n
    \n You have no leads (sent or received).\n
    \n\n
    \n
    \n \n
    \n
    \n
    {{lead.firstName}} {{lead.lastName}}
    \n
    {{lead.dateSent | date:'d MMM yyyy'}}
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n","
    \n
    \n \n
    \n
    \n
    \n \n Open Marketplace for all available subscription packages.\n \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n \n
    \n You haven't sent any leads to {{userSentLeads.userProfile.fullName}}\n
    \n
    \n
    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n
    Date sentNameStatusDetails
    \n \n \n \n \n \n \n
    \n {{row.dateSent | date:'d MMM yyyy'}}\n {{row.dateSent | date:'d MMM yyyy'}}
    \n {{row.firstName}} {{row.lastName}}\n
    \n \n \n \n
    \n
    \n
    \n Status
    \n {{userSentLeads.statuses[row.status]}}\n
    \n
    \n Details
    \n \n View lead\n \n
    \n
    \n
    {{row.firstName}} {{row.lastName}}{{userSentLeads.statuses[row.status]}}\n View lead\n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n","
    \n
    \n
    \n
    \n
    \n \n
    \n You have no leads from {{userReceivedLeads.userProfile.fullName}}\n
    \n \n
    \n
    \n Waiting for user to accept the agreement proposal.\n
    \n
    \n
    \n
    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n
    Date receivedNameStatusDetails
    \n \n \n \n \n \n \n
    \n {{row.dateSent | date:'d MMM yyyy'}}\n {{row.dateSent | date:'d MMM yyyy'}}
    \n {{row.firstName}} {{row.lastName}}\n
    \n \n \n \n
    \n
    \n
    \n Status
    \n \n {{userReceivedLeads.statuses[row.status]}} (shared)\n \n
    \n \n \n
    \n
    \n
    \n Details
    \n View lead\n
    \n
    \n
    {{row.firstName}} {{row.lastName}}\n \n {{userReceivedLeads.statuses[row.status]}}\n \n
    \n \n \n
    \n
    View lead
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n","
    \n
    \n\n \n
    \n
    \n
    \n \n
    \n {{connections.userProfile.fullName}} doesn't have any connections.\n
    \n
    \n
    \n
    \n\n \n
    \n
    \n Following is the list of businesses that {{connections.userProfile.firstName}} is sending leads to\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameIndustryReward (up to)Join
    \n \n \n \n \n \n \n
    \n \n \n \n \n \n
    \n\n \n
    \n
    \n Industry
    \n {{row.member.industry.name}}\n
    {{row.member.subIndustry.name}}
    \n
    \n
    \n Reward (up to)
    \n {{row.member.highestReward | currency:'$':0}}\n
    \n
    \n \n \n \n \n (Connected)\n \n
    \n
    \n
    \n {{row.member.industry.name}}\n \n
    {{row.member.subIndustry.name}}\n
    \n
    \n {{row.member.highestReward | currency:'$':0}}\n \n \n \n \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n\n
    \n
    \n","
    \n\n
    \n
    \n
    \n
    \n
    Send leads to {{agreements.userProfile.fullName}}
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n Accept the suggested reward from {{agreements.userProfile.fullName}} or revise the agreement.\n
    \n
    \n
    \n
    \n
    \n
    \n You sent a proposal to {{agreements.userProfile.fullName}} on {{agreements.sendLeads.dateSent | date:'d MMM yyyy'}}\n
    \n
    \n
    \n\n
    \n \n
    \n \n\n
    \n \n Accept\n \n
    \n
    \n\n
    \n
    \n \n \n
    \n
    \n Accept\n \n
    \n
    \n\n
    \n
    \n You sent a revised proposal to {{agreements.userProfile.fullName}} on\n {{agreements.sendLeads.revision.dateSent | date:'d MMM yyyy'}}\n
    \n \n
    \n\n
    \n \n
    \n\n
    \n
    \n
    \n
    \n Revise\n
    \n
    \n
    \n \n \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n Join {{agreements.userProfile.fullName}}'s Rewards Program and receive up to {{agreements.userProfile.highestReward | currency: '$':0}}\n
    \n\n
    \n \n \n \n \n Join\n \n
    \n
    \n
    \n\n
    \n\n
    \n\n
    \n
    \n
    \n
    Receive leads from {{agreements.userProfile.fullName}}
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n You need to activate Business Account in order to be able to receive leads.\n
    \n (You are eligible for {{agreements.trialData.expiresIn}}-day Business Account Trial)\n
    \n
    \n \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n Accept the suggested reward from {{agreements.userProfile.fullName}} or revise the agreement.\n
    \n
    \n
    \n
    \n
    \n
    \n You sent a proposal to {{agreements.userProfile.fullName}} on {{agreements.receiveLeads.dateSent | date:'d MMM yyyy'}}\n
    \n
    \n
    \n\n
    \n\n
    \n \n \n\n
    \n \n Accept\n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n Accept\n \n
    \n
    \n\n
    \n
    \n You sent a revised proposal to {{agreements.userProfile.fullName}} on\n {{agreements.receiveLeads.revision.dateSent | date:'d MMM yyyy'}}\n
    \n \n
    \n\n
    \n \n
    \n\n
    \n
    \n
    \n
    \n Revise\n
    \n
    \n
    \n \n \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n Would you like to receive leads from {{agreements.userProfile.fullName}}?\n
    \n \n
    \n
    \n
    \n\n
    \n\n
    \n","
    \n \n \n \n \n \n \n \n \n \n
    Reward{{agreementPricingDetail.label}}
    {{option.name}}{{option.successfulLeadPrice | currency:'$':0}}
    \n
    \n\n
    \n Reward\n
    \n {{agreementPricingDetail.agreement.contractType}}\n
    \n\n
    \n {{agreementPricingDetail.label}}\n
    \n {{agreementPricingDetail.agreement.subscriptionPrice | currency:'$':0}}\n
    \n","
    \n
    \n
    \n
    \n
    \n \n
    \n You haven't sent any leads\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Sent toDate sentNameStatusDetails
    \n \n \n \n \n \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n Date sent
    \n {{row.dateSent | date:'d MMM yyyy'}}\n
    \n
    \n Name
    \n {{row.firstName}} {{row.lastName}}\n
    \n
    \n Status
    \n {{sentLeads.statuses[row.status]}}\n
    \n
    \n Details
    \n View lead\n
    \n
    \n
    {{row.dateSent | date:'d MMM yyyy'}}{{row.firstName}} {{row.lastName}}{{sentLeads.statuses[row.status]}}\n View lead\n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n","
    \n
    \n
    \n \n
    \n
    \n Send Invite\n
    \n
    \n \n\n \n
    \n
    \n\n\n
    \n\n
    \n
    \n Invite the vendor into your pod, so you can start sending the leads and claim the rewards.\n
    \n
    \n\n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n If you have the Reward Code, enter it\n here\n here\n
    \n
    \n\n \n\n \n
    \n
    Invalid Reward Code.
    \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n
    OR
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n Try to search for the business in our directory.\n Use Search\n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n Seems like the business you want to send a lead to is not yet registered. You can provide the details of the business manually\n here.\n
    \n
    \n
    \n
    \n
    \n \n
    \n\n
    \n \n
    \n
    \n Business Contact Details:\n
    \n\n
    \n
    \n \n \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing first name.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Missing phone number.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    \n \n
    \n
    Missing email.
    \n
    This is not a valid email.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n {{alert.message}}\n\n
    \n
    \n \n\n
    \n
    \n\n
    \n
    \n \n \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n \n
    \n You have no people in your pod\n
    \n
    \n Send invites to your business partners to join your pod. Click \"Invite to my Pod\" to start sending invites.\n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameIndustryReward (up to)Reward type
    \n \n \n \n \n \n \n \n
    \n \n \n \n \n \n \n \n
    \n
    \n
    \n Industry
    \n {{row.member.industry.name}}\n \n
    {{row.member.subIndustry.name}}\n
    \n
    \n
    \n Reward (up to)
    \n {{row.highestContractReward | currency:'$':0}}\n
    \n
    \n Reward type
    \n {{row.contractType}}\n
    \n \n \n \n \n
    \n
    \n {{row.member.industry.name}}\n \n
    {{row.member.subIndustry.name}}\n
    \n
    {{row.highestContractReward | currency:'$':0}}{{row.contractType}}
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n\n","
    \n
    \n

    Send Reward

    \n
    \n
    \n\n
    \n
    \n
    \n {{alert.message}}\n
    \n
    \n
    \n Add reward\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Invalid reward value\n
    \n
    Missing reward value\n
    \n
    Reward value must not be negative\n
    \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n Reward amount\n
    \n
    \n {{sendReward.data.reward | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n Processing fee\n
    \n
    \n {{sendReward.processingFee | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n GST\n
    \n
    \n {{sendReward.tax | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n Total charged\n
    \n
    \n {{sendReward.total | currency:\"$\":2}}\n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n Payment details\n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n Select recipient\n
    \n
    \n\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n \n \n
    \n\n
    \n
    \n\n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n \n \n \n
    \n \n
    \n
    \n {{row.owner.industry.name}}\n \n
    {{row.owner.subIndustry.name}}\n
    \n
    {{row.rewardType}}
    \n \n
    \n
    \n
    \n\n
    \n
    \n
    \n Select above to add recipient\n
    {{sendReward.selectedRecipient.firstName}} {{sendReward.selectedRecipient.lastName}}
    \n
    \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n You don't have any connections\n
    \n
    \n Join pods and start receiving leads.\n
    \n
    \n
    \n\n
    \n
    \n Message\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n\n
    \n
    \n Contacts Import\n
    \n
    \n\n
    \n
    \n Upload and invite people to join your Reward Program.\n \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n Drop file here or use the \"Select\" button.\n
    \n\n
    \n \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n Success, you've invited your contacts to join your Reward Program.\n
    \n\n
    \n \n
    \n
    \n
    \n\n
    \n Importing:\n {{import.importProgressPercent}}%\n
    \n
    \n\n
    \n {{alert.message}}\n \n 5 && !import.alertsExpanded\">\n {{'and ' + (import.alerts.getList().length - 5) + ' more'}}\n \n
    5 && import.alertsExpanded\">\n {{alert.message}}\n \n
    \n
    \n\n\n
    \n
    \n","
    \n
    \n
    \n Welcome to MyLeadPod.\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n\n
    \n Well done!\n
    \n You are pretty much set up now to encourage others to send you leads!\n
    \n\n
    \n
    \n The step you have just completed has set up your base Rewards Program with its Reward Code.\n
    \n
    \n
    \n
    Rewards Program
    \n
    \n You can update your Rewards Program to have multiple levels, e.g. different $ rewards for different services.\n\n You can also set up multi level Custom Rewards for special referrers or sales channels.\n
    \n
    \n
    \n
    Get Traction!
    \n
    \n Once you are happy with your cash reward offers, the key next step is inviting your past clients, friends and family to send you leads. Also add codes to your website, email signature etc.\n
    \n
    \n
    \n
    \n\n \n\n
    \n
    \n\n
    \n
    \n
    \n Learn\n
    \n Learn to work with MyLeadPod. Follow the links below or check out\n our blog or\n video tutorials.\n
    \n\n
    \n
    \n
    \n \n
    \n
    \n
    Reward Program vs Reward Code
    \n
    Learn the difference between your Reward Program and Custom Rewards.
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    Bulk invite potential referrers
    \n
    Learn how to import the database of your clients.
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    Add my codes to digital assets
    \n
    Learn how to share your Reward Codes
    \n
    \n
    \n
    \n\n \n\n
    \n\n\n
    \n\n\n\n
    \n \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n \n
    \n","
    \n
    \n
    \n

    Rewards Program

    \n
    \n
    \n
    \n
    \n
    \n {{alert.message}}\n
    \n
    \n
    \n Add new, modify or remove rewards.\n ?\n
    \n
    \n\n\n\n
    \n
    \n
    \n \n
    \n No rewards.\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n \n \n \n \n \n \n \n \n \n\n\n\n \n\n \n\n\n \n\n \n\n \n \n
    TitleSuccessful Lead Reward
    \n\n \n
    \n
    \n
    \n Needs more details ...\n
    \n
    {{rewardProgramsSetup.data.options[$index].name}}
    \n
    $ {{rewardProgramsSetup.data.options[$index].successfulLeadPrice}}
    \n
    \n
    \n
    \n 1\">\n
    \n \n
    \n
    \n\n \n
    \n\n
    \n\n
    \n
    Missing name
    \n
    \n
    \n \n \n
    \n
    \n\n\n
    \n\n
    \n
    Invalid lead reward value
    \n
    Missing lead reward value
    \n
    Successful lead reward value must not be negative
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    Missing name
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    Invalid lead reward value
    \n
    Missing lead reward value
    \n
    Successful lead reward value must not be negative
    \n
    \n
    \n \n \n
    \n
    \n 1\">\n
    \n
    \n
    \n\n
    \n
    0\">\n \n \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n \n To create or view your Reward Codes, go to Reward Codes page.\n \n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n\n
    \n\n
    \n
    \n Add new or view your Reward Codes. Use Reward Codes for promoting your rewards in digital advertising and for tracking your leads.\n ?\n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n\n
    \n \n
    \n You have not created any Reward Codes\n
    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Reward CodeShared withClicksRegistrationsDetails
    \n \n \n \n \n \n \n
    {{row.rewardCode}}\n Archived\n \n \n \n
    \n\n
    \n
    \n
    \n Clicks\n {{row.viewsCounter}}\n
    \n
    \n Registrations\n {{row.registrationsCounter}}\n
    \n
    \n \n \n \n Share\n \n \n
    \n
    \n View\n
    \n
    \n Shared with\n \n \n \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n\n\n
    \n \n \n \n \n
    \n \n
    \n -\n
    \n {{row.viewsCounter}}\n \n {{row.registrationsCounter}}\n \n \n \n Share\n \n\n View\n
    \n \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n\n \n \n\n
    \n
    \n
    \n \n To modify your Rewards Program, go to the Rewards Program page.\n \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n \n Embed Reward Code\n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n\n \n\n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n Archived\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n {{rewardCodeDetail.rewardCode.rewardCode}}\n
    \n
    \n
    \n
    \n \n
    {{rewardCodeDetail.rewardCode.viewsCounter}}
    \n
    \n\n
    \n \n
    {{rewardCodeDetail.rewardCode.registrationsCounter}}
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n
    Share on Social Media
    \n\n \n
    \n
    \n \n \n \n \n \n \n
    \n \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n
    Link
    \n
    \n {{rewardCodeDetail.getUrl()}}\n \n \n \n
    \n
    \n\n
    \n
    Link (short)
    \n
    \n {{rewardCodeDetail.shortUrl}}\n \n \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    Available Rewards
    \n
    \n
    \n \n
    {{option.name}}
    \n
    ..............................................................................................................................
    \n
    {{option.successfulLeadPrice | currency:\"$\":0}}
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n\n \n
    \n \n
    Saving description...
    \n
    \n\n \n
    Description
    \n\n \n
    \n \n
    \n
    \n No description\n \n
    \n
    \n \n\n \n \n
    \n
    \n\n \n
    \n
    \n \n
    \n\n
    \n
    An error occurred, try again please.
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n\n \n\n
    \n
    \n \n
    \n \n
    {{rewardCodeDetail.searchingUser}}
    \n
    \n\n \n
    Shared with
    \n\n
    \n \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n This Reward Code is not shared with another user\n
    \n\n
    \n \n \n \n\n
    \n\n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n \n
    \n \n
    {{rewardCodeDetail.searchingAssociatedUser}}
    \n
    \n\n \n
    Associated with
    \n\n \n
    \n
    \n
    \n
    \n
    0\">\n \n
    \n \n
    \n
    \n
    \n \n This Reward Code is not associated with another users\n \n
    \n\n
    \n \n \n \n \n\n
    \n\n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n \n\n \n\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n","
    \n
    \n
    \n \n Create Reward Code\n \n
    \n
    \n
    \n Provide the details of a Reward Code and share with other member(s) of MyLeadPod\n
    \n
    \n
    \n
    \n {{alert.message}}\n
    \n \n
    \n
    \n Provide the Reward Code name and description\n
    \n
    \n
    \n
    \n
    \n
    \n\n \n\n
    \n
    Missing Reward Code
    \n
    Reward Code must be at least 5 characters long
    \n
    Reward Code must not be longer than 20 characters
    \n
    This Reward Code is not available, try another one
    \n
    \n\n
    \n \n \n \n \n\n \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n Description is for your own reference only and it's not visible to public.\n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n \n \n Rewards\n \n ?\n
    \n
    \n
    \n
    \n Select reward type for this code\n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n Your Rewards Program is not set up. Click here to manage\n \n 0\">\n \n \n \n \n \n \n \n
    {{option.name}}{{option.successfulLeadPrice | currency:\"$\":0}}
    \n Click here to manage\n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n\n \n\n
    \n\n
    \n\n
    \n
    \n \n
    \n
    Missing name
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    Invalid successful lead value
    \n
    Missing successful lead value
    \n
    Successful lead value must not be negative
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n
    \n 1\">\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n\n
    \n
    \n\n \n
    \n
    \n \n \n Sharing incoming leads\n \n ?\n
    \n
    \n
    \n \n
    \n
    \n
    \n Type in the email of an existing user with business subscription (max.1) (optional)\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    0\">\n
    \n
    \n This Reward Code will be shared with:\n
    \n
    \n
    \n There are no associated users to this Reward Code.\n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n \n \n Associated Users\n \n ?\n
    \n
    \n
    \n
    \n Search for the business users you'd like to associate this Reward Code with.\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n Associated Users\n \n
    \n
    \n
    \n There are no associated users to this Reward Code.\n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n \n
    \n You haven't received any leads\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n
    Received fromDate receivedNameStatusDetails
    \n \n \n \n \n \n \n
    \n \n \n \n \n \n \n
    \n
    \n
    \n Date received
    \n {{row.dateSent | date:'d MMM yyyy'}}\n
    \n
    \n Name
    \n {{row.firstName}} {{row.lastName}}\n
    \n
    \n Status
    \n \n {{receivedLeads.statuses[row.status]}}\n \n
    \n \n \n
    \n
    \n
    \n Details
    \n View lead\n
    \n
    \n
    {{row.dateSent | date:'d MMM yyyy'}}{{row.firstName}} {{row.lastName}}\n \n {{receivedLeads.statuses[row.status]}} (shared)\n \n
    \n \n \n
    \n
    View lead
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n","
    \n
    \n\n
    \n
    \n
    \n \n
    \n You don't have any connections\n
    \n
    \n Join pods and start receiving leads. Click \"Ask for Leads\" to add your first connection.\n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Pod ownerIndustryJoin dateReward type
    \n \n \n \n \n \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n Industry
    \n {{row.owner.industry.name}}\n
    {{row.owner.subIndustry.name}}
    \n
    \n
    \n Join date
    \n {{row.startDate | date:'d MMM yyyy'}}\n
    \n
    \n Reward type
    \n {{row.contractType}}\n
    \n \n \n \n \n
    \n
    \n
    \n {{row.owner.industry.name}}\n \n
    {{row.owner.subIndustry.name}}\n
    \n
    {{row.startDate | date:'d MMM yyyy'}}{{row.contractType}}
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n","
    \n
    \n
    \n \n
    \n
    \n Ask for Leads\n
    \n
    \n \n\n \n
    \n
    \n\n
    \n\n {{alert.message}}\n
    \n
    \n How would you like to pay for the received leads\n from {{joinPod.targetUser.fullName}}?\n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n\n
    \n
    \n\n
    \n
    \n \n \n
    \n
    \n
    \n","
    \n\t
    \n\t\t\n\t\t\n\t
    \n\t
    \n\t\t\n\t\t\n\t
    \n
    \n \n \n
    \n\t
    \n\t\t 0 || stats.earningsValue == 0 && stats.donationsValue == 0\">\n\t\t\n 0\">>\n \n\t
    \n\t
    \n\t\t\n\t\t\n\t
    \n
    \n","
    \n
    \n \n \n \n \n \n\n \n
    \n
    \n
    \n \n\n
    \n\n
    \n
    \n \n \n
    \n
    \n\n
    \n {{promptDialog.onConfirmMessage}}\n
    \n
    \n\n\n","
    \n
    \n \n
    \n
    \n
    \n \n {{cc.scope.creditCard.number}}\n \n ({{cc.scope.creditCard.expiryMonth}}/{{cc.scope.creditCard.expiryYear}})\n \n
    \n Change\n
    \n
    \n\n \n
    \n
    \n
    \n\n \n
    \n
    \n Provide credit card details:\n
    \n Use Registered Card\n
    \n\n \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \"eWAY\n \n
    \n
    \n \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing name on card.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing card number.
    \n
    Invalid card number.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    Invalid expiry date.
    \n
    \n
    \n
    \n
    \n \n
    \n
    Missing Expiry month.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n\n
    \n
    \n \n
    \n
    Missing Expiry year.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n","
    \n Download MyLeadPod app from store\n
    \n \n \n \n \n
    \n
    ","
    \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n","\n
    \n

    My Pod

    \n\n
    \n
    \n
    \n
    \n \n
    \n You have no people in your pod\n
    \n
    \n Send invites to your business partners to join your pod. Click \"Invite to my Pod\" to start sending invites.\n \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n\n
    \n\n","
    \n
    \n

    People in my Pod

    \n
    \n
    \n\t\t
    \n\t\t \n\t\t \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t \n\t
    \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t \n\t\t
    \n \n
    \n\t\t\t
    \n\t\t
    \n\t\t

    \n\t\t\t 4\">All people\n\t\t

    \n\t
    \n
    \n","
    \n\t
    \n\t\t

    Earnings

    \n\t
    \n\t
    \n\t\t\n\t\t\n\t
    \n
    \n","
    \n\t
    \n\t

    Newest received leads

    \n
    \n
    \n\t\t
    \n\t\t \n\t\t \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t \n\t\t
    \n\t\t\t \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n \t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t
    \n\t\t\t \tView lead\n\t\t\t
    \n\t
    \n\t

    \n\t\t\t 4\">All received leads\n\t\t

    \n
    \n
    \n","
    \n\t
    \n\t\t

    Received leads

    \n\t
    \n\t
    \n\t\n\t\t\n\t
    \n
    ","
    \n\t

    My Business

    \n\n\t
    \n\t\t
    \n
    \n
    \n \n
    \n You have not received any leads\n
    \n
    \n Join pods and start receiving leads. Click \"Ask for Leads\" to grow your network.\n \n
    \n
    \n
    \n
    \n\n\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\n
    \n\n","
    \n\n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n Design by Hoekstra\n
    \n
    \n \n
    \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n {{profile.userProfile.fullName}}\n |\n {{profile.userProfile.businessName}}\n \n
    {{profile.userProfile.industry.name}}{{profile.userProfile.subIndustry ? ' - ' + profile.userProfile.subIndustry.name : ''}}
    \n
    \n \n \n \n
    \n
    Only for illustration
    \n Send Message\n Send Reward\n Send Lead\n Register Lead\n Donate\n
    \n
    \n
    \n
    \n\n \n \n
    \n
    \n
    \n\n
    \n\n\n
    \n
    \n\n
    \n \n
    Updating your profile...
    \n
    \n\n
    \n \n \n \n
    'Cancel' will clear all your edits.
    \n
    \n
    \n \n\n
    \n
    \n The image is too small (min. width required is 500px)\n \n \n \n \n \n Uploaded images must be at least 500px wide. The dimensions of the area for the cover picture are 1140x215px.\n
    \n
    \n\n
    \n
    \n
    \n Move around the crop area in the content below. change the background colour to add some interesting effects.\n
    \n
    \n Headline colour\n \n
    \n
    \n Keep pattern\n
    \n
    Yes\n
    \n
    No\n
    \n
    \n
    \n
    \n Pick background color from palette\n
    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n\n
    \n
    \n This will remove all the current settings. Do you wish to proceed?\n \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n\n\n
    \n
    \n
    \n
    \n
    \n
    \n Upload your photo\n

    Photo should be at least 300 x 300px

    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n Basic information\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Tell us your first name.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Tell us your last name.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Tell us your email.
    \n
    This is not a valid email.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Tell us your mobile.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n Change password\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Passwords do not match.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n Business information\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Tell us your location.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n
    \n
    \n Billing details\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n Deactivate Account\n
    \n
    \n\n
    \n
    \n Follow the link to deactive your account.\n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n\n","
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n","
    \n
    \n \n
    \n Account Deactivation\n
    \n \n\n \n\n
    \n
    \n
    \n
    \n Account to Remove\n
    \n
    \n \n
    \n
    \n Feedback\n
    \n
    \n \n
    \n
    \n Deactivate\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n Deactivate Business Account\n
    \n\n
    \n By clicking Continue, you will start the process of deactivating your business account and you will no longer need to pay subscription fees.
    \n Other MyLeadPod members will no longer be able to locate your business on MyLeadPod app and will not be able to send you leads.
    \n \n
    \n\n \n\n
    \n \n
    \n\n
    \n
    \n
    \n Deactivate my account.\n
    \n
    \n By clicking Continue, you will start the process of deactivating your MyLeadPod account and will no longer be able to send the leads and to be rewarded.
    \n You will also be unsubscribed from all MyLeadPod marketing communication.\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n We are sorry that you are leaving us. We'd love to hear how we could improve MyLeadPod with your valuable feedback below.\n Thank you.\n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n\n\n
    \n\n
    \n
    \n Confirm the deactivation of your MyLeadPod account.\n Confirm the deactivation of your MyLeadPod business account.\n
    \n
    \n \n
    \n
    \n
    \n \n \n Cancel\n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n Cancel\n \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n \n {{creditCard.isAdd() ? 'Add Credit Card' : 'Change Credit Card'}}\n \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \"eWAY\n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Missing name on card.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing card number.
    \n
    Invalid card number.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    Invalid expiry date.
    \n
    \n
    \n
    \n
    \n \n
    \n
    Missing Expiry month.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    Missing Expiry year.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n","
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n \n
    \n
    \n Credit card details\n
    \n \n
    \n Looks like you don't have a credit card on file\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n
    \n \n \n \n \n \n
    \n \n \n

    {{billing.creditCard.holderName}}

    \n

    {{billing.creditCard.number}}

    \n

    Expires {{billing.creditCard.expiryMonth}} / {{billing.creditCard.expiryYear}}

    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n Invoice history\n
    \n \n
    \n There are no invoices to show\n
    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Invoice dateAmountInvoice
    {{invoice.dateInvoice | date:'d MMM yyyy'}}\n {{invoice.dateInvoice | date:'d MMM yyyy'}}
    \n {{invoice.totalInclTax | currency:\"$\":2}}\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n \n
    \n Preferences\n
    \n \n\n \n {{alert.message}}\n\n \n
    \n
    \n Mailing Lists\n
    \n\n
    \n\n
    \n
    \n {{list.label}}\n
    \n
    \n
    {{list.description}}
    \n You are currently\n subscribed to the mailing list\n not subscribed to the mailing list\n
    \n
    \n
    \n
    \n
    ON\n
    \n
    OFF\n
    \n
    \n
    \n\n
    \n
    \n \n
    \n\n
    \n
    \n \n \n
    \n
    \n
    \n\n\n","
    \n
    \n \n
    \n \n
    \n You have been unsubscribed from the weekly mailing list. You can subscribe back anytime using the preferences.\n
    \n MyLeadPod\n
    \n
    \n
    \n The update in subscription was not successful. Please try again or contact us.\n
    \n
    \n \n
    \n
    \n
    \n
    \n","
    \n
    \n

    Set New Password

    \n
    \n
    \n\n
    \n
    \n {{alert.message}}\n
    \n
    \n \n
    \n
    Missing password.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n
    Missing password.
    \n
    Passwords do not match.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n

    Password Reset

    \n
    \n Your password has been successfully updated!\n
    \n
    \n Login\n
    \n
    \n
    \n
    \n
    \n\n","
    \n
    \n

    Enter your email and we'll get you back on track

    \n
    \n
    \n\n
    \n
    \n {{alert.message}}\n
    \n
    \n \n
    \n
    Tell us your email.
    \n
    This is not a valid email.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n

    Password Reset

    \n

    We have sent {{recoverCtrl.data.email}} an email with reset instructions

    \n

    \n If the email does not arrive soon, check your spam folder. The email was sent from confirm@myleadpod.com\n

    \n
    \n
    \n
    \n
    \n\n
    \n \n
    \n","
    \n
    \n \n
    \n Feedback\n Need Help?\n
    \n \n\n \n {{alert.message}}\n\n \n
    \n
    \n We would like to hear from you! Please let us know how we can improve MyLeadPod\n Please provide your name, email and the issue description\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Your name is required
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Email address is required
    \n
    Invalid email address
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n \n
    \n
    Missing feedback
    \n
    Missing issue description
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n
    \n \n
    \n\n
    \n
    \n \n \n
    \n
    \n
    \n\n\n","
    \n
    \n

    Withdraw Earnings

    \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n At MyLeadPod we encourage people to support local communities, sports clubs and charities and we offer the option of donating to a charity.\n
    \n
    \n Would you like to donate now?\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n {{alert.message}}\n
    \n\n
    \n \n
    \n
    \n Withdraw value\n
    \n
    \n
    \n
    \n The minimum withdrawal limit is {{withdraw.minLimit | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Invalid amount\n
    \n
    Missing amount\n
    \n
    You can not withdraw more than your balance\n
    \n
    You have to withdraw more than minimum withdraw limit\n
    \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n\n \n
    \n\n \n
    \n \n
    Recalculating
    \n
    \n\n
    \n
    \n Current balance\n
    \n
    \n {{withdraw.balance | currency:\"$\":2}}\n
    \n
    \n \n
    \n
    \n Processing fee\n
    \n
    \n {{withdraw.processingFee ? (withdraw.processingFee | currency:\"$\":2) : \"...\"}}\n
    \n
    \n
    \n
    \n Withdrawal amount\n
    \n
    \n {{withdraw.receivedAmount ? (withdraw.receivedAmount| currency:\"$\":2) : \"...\"}}\n
    \n
    \n
    \n
    \n Remaining balance\n
    \n
    \n {{withdraw.remainingBalance ? (withdraw.remainingBalance | currency:\"$\":2) : \"...\"}}\n
    \n
    \n\n
    \n\n\n
    \n\n
    \n\n \n
    \n
    \n Payment details\n
    \n
    \n\n
    \n
    \n Provide recipient's bank account details\n
    \n\n
    \n
    \n \n
    \n
    Account holder.\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Account BSB.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Account
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n
    \n \n {{earnings.summaries.lastMonthEarnings | currency:'$':0}}\n
    \n
    \n last month\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n {{earnings.summaries.totalEarnings | currency:'$':0}}\n
    \n
    \n total earnings\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n {{earnings.summaries.withdrawals | currency:'$':0}}\n
    \n
    \n withdrawn\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n {{earnings.summaries.actualEarnings | currency:'$':0}}\n
    \n
    \n current balance\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n There's nothing to show, your wallet is empty!\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Received fromDateAmountDetails
    \n \n \n \n \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n Date
    \n {{row.date | date:'d MMM yyyy'}}\n
    \n
    \n Amount
    \n {{row.amount | currency:'$':0}}\n
    \n
    \n Details
    \n View lead\n
    \n
    \n
    {{row.date | date:'d MMM yyyy'}}{{row.amount | currency:'$':0}}View lead
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n You haven't made any withdrawals\n
    \n
    \n \n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    DateAmount
    {{row.date | date:'d MMM yyyy'}}\n {{row.date | date:'d MMM yyyy'}}
    \n {{row.amount | currency:'$':0}}\n
    \n \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n\n","
    \n\n
    \n
    \n
    \n
    \n
    \n
    \n {{user.userProfile.fullName}}\n {{user.userProfile.businessName}}\n
    \n
    \n {{user.userProfile.industry.name}}{{user.userProfile.subIndustry ? ' - ' + user.userProfile.subIndustry.name : ''}}\n
    \n
    \n
    \n
    \n \n\n
    \n
    \n
    \n
    \n Design by Hoekstra\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n {{user.userProfile.fullName}}\n |\n {{user.userProfile.businessName}}\n\n \n
    {{user.userProfile.industry.name}}{{user.userProfile.subIndustry ? ' - ' + user.userProfile.subIndustry.name : ''}}
    \n
    \n \n \n \n \n
    \n
    \n
    \n\n \n \n\n \n \n\n
    \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n
    \n
    \n
    \n\n\n Send Reward\n Send Lead\n Register Lead\n Ask for Leads\n Donate\n\n","\n \n \n\n","
    \n
    \n
    \n
    \n","
    \n \n\n \n \n
    \n","
    \n
    \n\n
    \n Do you want to receive leads for your own business?\n \n
    \n\n
    \n You are eligible for a trial business subscription, subscribe now and start receiving leads!\n \n
    \n\n
    \n Your trial business account subscription {{suggestion.trialData.trialExpiresIn}}\n \n
    \n\n
    \n \n
    \n
    \n
    \n","\n","
    \n \n\n \n
    \n","
    \n VAJCO! + {{result.value}}\n
    ","
    \n\n
    \n
    \n \n
    \n \n\n
    \n
    1 && hasCategoryFilter\">\n \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n\n
    \n Narrow your search by choosing the search categories:\n \n
    \n\n
    0\"\n style=\"cursor: inherit;\">\n\n \n
    \n Your last selected items:\n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    {{result.description}}
    \n
    \n
    {{ result.title }}
    \n
    {{result.description2}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n \n\n \n
    1 && hasCategoryFilter\">\n
    Filter:
    \n
    \n
    \n
    {{category.name}}\n
    \n
    \n
    \n\n \n
    \n\n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    {{result.description}}
    \n
    \n
    {{ result.title }}
    \n
    {{result.description2}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n","\n\n\n\n\n\n
    \n
    0 || nc.filterActive) && nc.filterCategories && nc.filterCategories.length > 1\">\n
    \n
    Filter:
    \n
    \n
    \n
    {{category.name}}\n
    \n
    \n Mark as read\n
    \n\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n {{n.userName}}\n \n {{n.description}}\n
    \n
    \n
    \n {{n.value}}\n
    \n
    \n \n {{n.timeFormatted}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n\n
    \n You have no new notifications.\n
    \n\n
    \n You have no notifications in this category.\n
    \n\n
    \n
    \n This is your notification center. Click the notification to display the details or swipe left or right to dismiss it!\n
    \n \n
    \n
    \n","
    \n
    \n

    My Pod

    \n
    \n \n
    \n\n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n\n Invite to my Pod\n Send Lead\n\n","
    \n
    \n
    \n
    \n
    \n\n \n \n\n
    \n \n Your Rewards Program is not set up. Set up your Rewards Program here to be able to ask for the leads with this option.\n \n 0\">\n \n \n \n \n \n \n \n
    {{option.name}}{{option.successfulLeadPrice | currency:\"$\":0}}
    \n Click here to manage\n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n\n
    \n
    \n\n \n
    \n
    \n
    Select Reward Code
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n\n \n
    \n
    \n
    Invalid successful lead value
    \n
    Missing successful lead value
    \n
    Successful lead value must not be negative
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n\n \n
    \n
    \n
    Invalid subscription value
    \n
    Missing subscription value
    \n
    Subscription value must not be negative
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n
    \n
    You are currently evaluating the business account. This trial subscription will expire on {{myMemberships.trialData.trialExpiryDate | date:'d MMM yyyy'}}
    \n
    \n
    To purchase the full subscription now, click the button below
    \n \n
    \n
    \n
    \n
    \n
    \n

    My Business

    \n
    \n
    \n
    \n
    \n You are eligible for the trial business subscription\n \n
    \n Ask for Leads\n Register Lead\n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n Need leads for your business?\n
    \n
    \n Invite people to recommend your business. You can join their pod and grow your connections. Click \"Activate\" to\n start receiving leads.\n
    \n
    \n
    You are eligible for the trial business subscription
    \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n \n Activate\n Ask for Leads\n Register Lead\n \n\n\n\n
    \n","
    \n
    \n

    {{sendLead.isRegister ? 'Register Lead' : 'Send Lead'}}

    \n
    \n
    \n\n
    \n
    \n
    \n\n \n
    \n \n \n\n
    \n
    \n
    \n {{sendLead.isRegister ? 'Select sender' : 'Select recipient'}}\n
    \n
    \n\n
    \n
    \n Select businesses\n (or invite new)\n that will receive your lead:\n \n Select user\n (or invite new)\n who sent you the lead above:\n \n
    \n
    \n\n
    \n
    \n
    Either select an existing person or invite a new one
    \n
    \n
    \n\n \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n Seems like the business you want to send a lead to is not yet a member of MyLeadPod. You can provide the details of the business manually\n here.\n
    \n
    \n
    \n
    \n \n\n \n
    \n
    \n
    \n Provide the details of the person\n (s) you'd like to invite, or\n try Search again:\n \n
    \n\n
    \n\n
    \n \n
    \n\n
    \n Contact Details:\n
    \n\n \n
    \n
    \n
    \n \n
    \n
    First name is missing
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    \n \n
    \n
    Email is missing
    \n
    This is not a valid email
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    \n \n
    \n
    Missing phone number.
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n\n
    \n \n
    \n \n
    \n\n
    \n \n Change reward agreement (more details)\n \n \n
    \n
    \n \n
    \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n\n \n
    \n
    \n
    \n \n
    \n
    \n 0\">Recipients\n
    \n {{user.firstName}} {{user.lastName}} \n
    \n
    \n {{user.firstName}} new \n
    \n
    \n
    \n
    \n\n\n
    \n\n
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n\n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n","
    \n
    \n Lead details\n
    \n
    \n\n
    \n
    \n Provide the details of the person that this business should get in touch with. \n 1)\" class=\"sub-title-description\">Provide the details of the person that these businesses should get in touch with. \n Provide the details of the person that the businesses should get in touch with. \n Try to search for the person's contact details to pre-fill the form automatically, or use the form to manually enter the required information.\n
    \n
    \n Provide the details of the customer this lead was related to:\n
    \n
    \n\n\n
    \n
    \n \n
    No results were returned, please enter the person's details manually
    \n
    \n
    \n\n
    \n\n
    \n \n
    \n\n
    \n
    \n \n
    \n
    At least one of first name or last name is required
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    At least one of phone or valid email address is required
    \n
    Invalid email address
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Missing note
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n","
    \n \n
    \n","
    \n
    \n
    \n\n
    \n
    \n \n {{leadDetail.leadType == 'sent' ? 'Sent Lead' : 'Received Lead'}}\n \n
    \n
    \n
    \n {{leadDetail.lead.dateSent | date:'d MMM yyyy'}}\n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n \n
    \n
    \n
    \n
    \n
    \n \n {{leadDetail.leadType === 'sent' ? 'To' : 'From'}}\n
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n Reward\n
    \n
    \n
    \n #{{leadDetail.lead.rewardCode.rewardCode}}\n
    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    \n
    \n
    \n
    \n \n Details\n
    \n
    \n {{leadDetail.lead.details}}\n
    \n
    \n\n
    \n
    \n \n Contact\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n {{leadDetail.lead.firstName}} {{leadDetail.lead.lastName}}\n
    \n
    \n
    \n\n
    \n
    \n \n
    \n \n
    \n\n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n Sharing\n
    \n
    \n This lead is not shared with another user\n \n This lead is shared with {{leadDetail.lead.coOwner.firstName}} {{leadDetail.lead.coOwner.lastName}}\n \n \n \n \n \n \n \n \n \n \n\n \n
    \n
    \n
    \n \n
    \n\n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n You will share this lead with:\n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n\n
    \n\n
    \n \n \n \n
    \n\n
    \n \n \n
    \n\n
    \n\n
    \n
    \n {{alert.message}}\n
    \n
    \n\n
    \n
    \n\n \n
    \n
    \n
    \n \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n","
    \n
    \n
    \n\n \n
    \n
    \n
    \n \n Successful lead reward payment\n \n
    \n
    \n\n
    \n
    \n {{alert.message}}\n
    \n
    \n\n
    \n
    \n
    \n
    \n Select Reward\n
    \n
    \n \n
    \n\n
    \n Additional Reward\n
    \n\n
    = 1 || closeLead.data.bonusReward\">\n \n
    \n
    = 1 || closeLead.data.bonusReward\">\n Review and Payment\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n
    \n\n \n
    = 1\">\n
    \n
    \n Select a reward for this lead:\n
    \n
    \n
    \n
    \n
    \n\n \n\n \n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n
    \n
    \n
    \n The reward contract between you and {{closeLead.lead.sender.fullName}} is based on SUBSCRIPTION model.\n
    \n
    \n This user is rewarded periodically an amount of:\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n If you'd like to pay the extra reward, enter the amount below:\n
    \n
    \n \n
    \n
    Invalid optional reward\n
    \n
    Optional reward must not be negative\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n Provide any additional feedback / comment / appraisal to {{closeLead.lead.sender.fullName}}:\n
    \n
    \n \n
    \n
    Missing feedback
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n \n
    = 1\">\n \n \n
    \n\n \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n Payment Review:\n
    \n
    \n
    \n
    \n Successful lead reward\n
    \n
    \n {{closeLead.getSuccessfulLeadPrice() | currency:'$':2}}\n
    \n
    \n
    \n
    \n Bonus reward\n
    \n
    \n {{closeLead.data.bonusReward | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n Processing fee\n
    \n
    \n {{closeLead.processingFee | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n GST\n
    \n
    \n {{closeLead.tax | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n Total charged\n
    \n
    \n {{closeLead.total | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n Payment Details:\n
    \n
    \n \n
    \n\n
    \n\n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n\n \n
    \n
    \n
    \n \n Unsuccessful Lead\n \n
    \n
    \n
    \n Are you sure you want to close this lead as 'UNSUCCESSFUL'?\n
    \n
    \n
    \n Please provide feedback for this lead\n
    \n
    \n \n
    \n
    Missing feedback
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n","
    \n
    \n
    \n

    Marketplace

    \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n
    \n Sign up to deals and services advertised by MyLeadPod business subscribers. (To advertise, please\n contact us\n to set you up for MyLeadPod Marketplace.)\n
    \n
    \n\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    0\">\n
    \n
    \n \n MyLeadPod Deals and Services\n
    \n
    \n \n
    \n
    \n
    \n\n\n
    \n
    \n Marketplace\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n\n","
    \n \n {{alert.message}}\n\n \n
    0\"\n ng-repeat=\"item in marketplace.items\">\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n {{item.label}}\n
    \n
    \n
    \n Price\n {{item.isFree ? 'FREE' : (item.priceMonthly | currency:'$':0)}}\n
    \n
    \n Company\n {{item.owner.fullName + ((item.owner.businessName && item.owner.fullName !== item.owner.businessName) ? ' | ' + item.owner.businessName : '' )}}\n
    \n
    \n
    \n
    \n {{item.description}}\n
    \n
    \n
    \n
    \n
    \n\n
    \n \n {{item.isFree ? 'FREE' : (item.priceMonthly | currency:'$':0)}}\n
    \n
    \n \n Unsubscribe\n
    \n
    \n
    \n
    \n {{item.description}}\n
    \n\n
    \n
    \n","
    \n
    \n \n
    \n
    \n {{marketplaceInfo.item.label}} - {{marketplaceInfo.item.isFree ? 'FREE' : ((marketplaceInfo.item.priceMonthly | currency:'$':0))}}\n
    \n
    \n\n
    \n {{marketplaceInfo.item.isFree ? 'FREE' : (marketplaceInfo.item.priceMonthly | currency:'$':0)}}\n
    \n
    \n Unsubscribe\n
    \n
    \n
    \n Subscribed \n Not subscribed\n
    \n
    \n
    \n
    \n
    \n
    \n Owner\n \n \n \n
    \n
    \n Price\n {{marketplaceInfo.item.isFree ? 'FREE' : (marketplaceInfo.item.priceMonthly | currency:'$':0)}}\n
    \n \n
    \n Description\n {{marketplaceInfo.item.description}}\n
    \n\n
    \n
    \n
    \n \n\n \n\n
    \n
    \n \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n\n\n","
    \n
    \n \n
    \n {{marketplaceActivation.item.label}}\n
    \n \n\n \n
    \n\n
    \n
    \n
    \n
    \n
    \n

    Payment Summary

    \n
    \n
    \n
    \n
    \n Subscription fee\n
    \n
    \n {{marketplaceActivation.paymentSummary.price | currency:'$':2}}\n
    \n
    \n\n\n
    \n
    \n GST\n
    \n
    \n {{marketplaceActivation.paymentSummary.tax | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n Total\n
    \n
    \n {{marketplaceActivation.paymentSummary.total | currency:\"$\":2}}\n
    \n
    \n \n
    \n\n
    \n
    \n

    Payment Options

    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n\n \n
    \n\n
    \n
    \n \n \n
    \n
    \n
    \n\n\n","
    \n
    \n \n
    \n Donation\n
    \n \n\n
    \n\n
    \n \n
    Making Donation..
    \n
    \n\n
    \n
    \n\n \n
    \n \n
    Loading your Credit Card
    \n
    \n\n \n
    \n Charity receiving your donation\n
    \n
    \n
    \n
    {{ donation.charityProfile.businessName ? donation.charityProfile.businessName : donation.charityProfile.firstName }}
    \n Change\n Done\n
    \n
    \n
    0\">\n
    Last donations
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    Search within MyLeadPod
    \n \n
    \n
    \n
    \n\n \n
    \n
    \n Payment options\n
    \n \n
    \n\n \n
    \n
    \n Please provide the donation amount\n
    \n
    \n \n
    \n
    Invalid value
    \n
    Missing value
    \n
    Donation value must not be negative
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n\n \n
    0\">\n
    \n Payment Summary\n
    \n
    \n\n \n
    \n \n
    Recalculating
    \n
    \n\n
    \n
    \n Donation\n
    \n
    \n {{donation.data.amount | currency:\"$\":2}}\n
    \n
    \n \n
    \n
    \n Processing fee\n
    \n
    \n {{donation.summary.fee >= 0 ? (donation.summary.fee | currency:\"$\":2) : \"...\"}}\n
    \n
    \n
    \n
    \n Tax\n
    \n
    \n {{donation.summary.tax >= 0 ? (donation.summary.tax| currency:\"$\":2) : \"...\"}}\n
    \n
    \n
    \n
    \n Payment Total\n
    \n
    \n {{donation.summary.total >= 0 ? (donation.summary.total | currency:\"$\":2) : \"...\"}}\n
    \n
    \n\n
    \n
    \n
    \n
    \n\n
    \n
    \n\n
    \n \n
    Loading Charity Info
    \n
    \n\n
    \n \n
    \n {{ donation.charityProfile.businessName ? donation.charityProfile.businessName : donation.charityProfile.firstName }}\n
    \n
    \n
    \n
    \n No Charity selected\n
    \n
    \n\n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n","
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    Loading Messages
    \n
    \n
    \n \n
    Sending...
    \n
    \n
    \n
    \n \n
    \n No Messages.\n
    \n
    \n Send the first message!\n
    \n
    \n
    0 && !msg.error\">\n \n
    \n\n \n \n
    \n
    \n \n
    \n
    \n
    \n {{m.created}}\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n Unable to load messages.\n
    \n
    \n \n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n
    \n {{msg.notification}}\n
    \n
    \n","
    \n
    \n

    Dashboard

    \n
    \n \n
    \n\n\n Invite to my Pod\n Send Lead\n\n\n
    \n\n
    \n\n
    \n\n\n\n\n\n","
    \n\t
    {{statBlock.stat}}
    \n\t
    {{statBlock.subtext}}
    \n\t\n
    ","
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n\n

    \n Join in less than a minute. No credit card required.\n

    \n\n\n
    \n
    \n

    \n \n Join {{signUp.invitationSender.fullName}} and start earning cash for sending leads.\n \n \n Join {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? ', ' + signUp.invitationSender.businessName : ''}} Rewards Program.\n \n

    \n

    \n Join {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? ', ' + signUp.invitationSender.businessName : ''}} Rewards Program.\n

    \n

    \n {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? ', ' + signUp.invitationSender.businessName : ''}} would like to send you business leads.\n

    \n
    \n
    \n
    \n You can now earn up to ${{signUp.invitationSender.highestReward}} by sending MyLeadPod a successful lead!\n
    \n Search and join different businesses and their Rewards Program on MyLeadPod to start earning cash for sending leads.\n
    \n
    \n
    \n
    You can now earn up to ${{signUp.invitationSender.highestReward}} by sending just one lead!
    \n
    \n
    \n
    \n
    Expand your business by registering with MyLeadPod, fast-growing business referral network system.
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n

    \n Sign up for your free trial.\n

    \n

    \n Join {{signUp.invitationSender.fullName}}{{signUp.invitationSender.businessName ? ', ' + signUp.invitationSender.businessName : ''}} on MyLeadPod. Sign up and..\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n Activate your {{signUp.trialDuration}} free business subscription.\n
    \n
    \n You are only a few steps away from creating your own cash Reward Program for your business.\n
    \n
    \n
    \n
    \n
    \n
    \n .. send your first lead.\n
    \n
    You can now earn up to ${{signUp.invitationSender.highestReward}} by sending just one lead!
    \n
    \n
    \n \n
    \n .. receive {{signUp.trialDuration}} free business trial.\n
    \n
    \n You are only a few steps away from creating your own cash Reward Program and starting receiving leads for your business.\n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n Do you have a Reward Code?\n
    \n
    \n\n \n
    \n
    Invalid Reward Code.
    \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n
    \n

    Join {{signUp.rewardCardOwner.fullName}}{{signUp.rewardCardOwner.businessName ? ', ' + signUp.rewardCardOwner.businessName : ''}} Rewards Program.

    \n
    \n
    You can now earn up to ${{signUp.rewardCardOwner.highestReward}} by sending just one lead!
    \n
    \n
    \n\n \n
    \n
    Sorry, Reward Code was not found or is not longer available.
    \n
    You can try again, or join and search for the business in the app to send the lead(s)!
    \n
    \n\n \n
    \n Reward Code is optional and not required for joining.\n Reward Card may differ.\n
    \n
    \n \n
    \n\n
    \n
    \n
    \n Join the quick way\n
    \n
    \n
    \n \n
    \n\n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    OR
    \n
    \n
    \n
    \n\n
    \n
    \n Join with your email\n
    \n
    \n \n
    \n
    \n \n
    \n
    Tell us your email.
    \n
    This is not a valid email.
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n
    Please type in your new password.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n\n
    \n
    \n By clicking 'Create Account' button, you agree to MyLeadPod's Terms & Conditions and Privacy Policy\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n

    Thanks for joining!

    \n

    \n Please check your email and click Verify Email in the message we just sent to\n
    \n {{signUp.data.email}}\n
    \n Once your email has been verified you'll get access to your account.\n

    \n
    \n
    \n
    \n
    \n\n","
    \n
    \n

    Login

    \n
    \n
    \n\n
    \n\n
    \n
    \n \n
    \n\n
    \n \n
    \n\n
    \n \n
    \n
    \n\n
    \n
    \n
    \n
    OR
    \n
    \n
    \n
    \n\n
    \n
    \n {{alert.message}}\n
    \n
    \n \n
    \n
    Tell us your email.
    \n
    This is not a valid email.
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n
    Missing password.
    \n
    \n
    \n \n \n Forgot?\n
    \n
    \n
    \n \n
    \n Don't have an account? Sign up\n
    \n
    \n
    \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n Activate Business Account\n
    \n
    \n\n {{alert.message}}\n\n
    \n
    \n
    \n\n
    \n Company Details\n
    \n
    \n \n
    \n\n
    \n Subscription Type\n
    \n
    \n \n
    \n\n
    \n Reward Code\n
    \n
    \n \n
    \n\n
    \n Payment Details\n
    \n
    \n
    \n
    \n\n\n
    \n\n \n
    \n
    \n\n \n
    \n
    \n
    \n

    Company Details

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Company /\n Organisation is a required field.\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    Classification is a required field.\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n\n \n
    \n
    \n \n
    \n \n \n \n \n \n \n
    \n There was an issue while trying to find your location.
    \n Make sure the Location is allowed on your device and try again, or type in your address.\n
    \n
    \n
    \n
    \n\n \n\n \n
    \n
    \n
    \n
    \n Your current address is set to:\n
    \n
    \n {{businessAccount.data.addressPostal | address:'au'}}\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n We don't have any of your address information on file yet, please type in the address or use the Geolocation button and provide us with the following information\n \n \n Even though you have provided some address information, we still need you to provide us with the additional info\n \n
    \n
    \n
    \n Street Number\n
    \n
    \n Street Name\n
    \n
    \n Suburb\n
    \n
    \n Postcode\n
    \n
    \n State\n
    \n
    \n Country\n
    \n
    \n
    \n
    \n
    \n\n\n
    \n\n \n
    \n
    \n\n\n \n
    \n
    \n
    \n
    \n

    Subscription

    \n
    \n
    \n\n
    \n
    \n
    \n \n Currently there is only one plan to choose from. Click 'Next' to continue.\n \n 1\">\n Select (click on) the subscription type:\n \n
    \n
    \n\n
    \n \n
    \n
    \n
    \n\n
    \n \n \n
    \n
    \n\n\n \n
    \n
    \n
    \n
    \n
    \n Set up your own Reward Code:\n
    \n
    \n \n
    \n
    Missing Reward Code
    \n
    Reward Code must be at least 5 characters long
    \n
    Reward Code must not be longer than 20 characters
    \n
    This Reward Code is not available, try another one
    \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n\n
    \n
    \n Set the Reward Code value (for successful lead):\n
    \n
    \n \n
    \n
    Invalid successful lead value
    \n
    Missing successful lead value
    \n
    Successful lead value must not be negative
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n * Reward cards are purchased separately.
    \n For more information please contact the sales support.\n
    \n
    \n\n
    \n \n \n
    \n
    \n
    \n\n\n \n
    \n\n
    \n
    \n
    \n

    Payment Summary

    \n
    \n
    \n
    \n
    \n Subscription fee\n
    \n
    \n {{businessAccount.paymentSummary.price | currency:'$':2}}\n
    \n
    \n\n\n
    \n
    \n GST\n
    \n
    \n {{businessAccount.paymentSummary.tax | currency:\"$\":2}}\n
    \n
    \n
    \n
    \n Total*\n
    \n
    \n {{businessAccount.paymentSummary.total | currency:\"$\":2}}\n
    \n
    \n
    \n * You will be periodically charged this amount based on the chosen subscription type\n
    \n
    \n\n
    \n
    \n

    Payment Options

    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n \n \n
    \n\n
    \n\n
    \n
    \n\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n","
    \n
    \n
    \n
    \n
    \n Activate Business Account (Trial)\n
    \n \n
    \n
    \n
    \n\n {{alert.message}}\n\n
    \n
    \n
    \n
    \n Company Details\n
    \n
    \n \n
    \n\n
    \n Reward Code\n
    \n
    \n \n
    \n\n
    \n Confirmation\n
    \n
    \n
    \n
    \n\n\n
    \n\n \n
    \n
    \n\n \n
    \n
    \n
    \n

    Company Details

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    Company /\n Organisation is a required field.\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    Classification is a required field.\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n \n\n \n
    \n
    \n \n
    \n
    Address is Incomplete.\n (type in or use the geolocation)\n
    \n
    \n
    \n \n \n \n \n \n \n
    \n There was an issue while trying to find your location.
    \n Make sure the Location is allowed on your device and try again, or type in your address.\n
    \n
    \n
    \n
    \n\n \n\n \n
    \n
    \n
    \n
    \n Your current address is set to:\n
    \n
    \n {{businessAccount.data.addressPostal | address:'au'}}\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n We don't have any of your address information on file yet, please type in the address or use the Geolocation button and provide us with the following information\n \n \n Even though you have provided some address information, we still need you to provide us with the additional info\n \n
    \n
    \n
    \n Street Number\n
    \n
    \n Street Name\n
    \n
    \n Suburb\n
    \n
    \n Postcode\n
    \n
    \n State\n
    \n
    \n Country\n
    \n
    \n
    \n
    \n
    \n\n
    \n\n \n
    \n
    \n\n\n \n
    \n
    \n
    \n
    \n Set up your own Reward Code:\n ?\n
    \n
    \n \n
    \n
    Missing Reward Code
    \n
    Reward Code must be at least 5 characters long
    \n
    Reward Code must not be longer than 20 characters
    \n
    This Reward Code is not available, try another one
    \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n\n
    \n
    \n Set the Reward Code value (for successful lead):\n
    \n
    \n \n
    \n
    Invalid successful lead value
    \n
    Missing successful lead value
    \n
    Successful lead value must not be negative
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n * Reward cards are purchased separately.
    \n For more information please contact the sales support.\n
    \n
    \n\n
    \n \n \n
    \n
    \n\n\n \n
    \n\n
    \n
    \n

    You are now ready to start your trial business account subscription with

    \n \n
    This evaluation subscription will expire on {{businessAccount.trialData.trialExpiryDate | date:'d MMM yyyy'}}
    \n
    \n
    \n\n
    \n \n \n
    \n\n
    \n\n
    \n
    \n\n
    \n
    \n
    \n \n
    \n","
    \n
    \n

    Activate your account

    \n
    \n Please fill in the form to activate your account\n
    \n
    \n
    \n\n
    \n
    \n {{alert.message}}\n
    \n\n
    \n \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n
    Tell us your email.
    \n
    This is not a valid email.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n
    Tell us your first name.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n
    Tell us your last name.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n
    Tell us your mobile phone number.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n
    \n
    \n\n \n\n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n","
    \n
    \n

    Set Password

    \n
    \n Welcome to MyLeadPod!\n
    \n In order to continue to use this account, we need you to setup the password...\n
    \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n \n
    \n \n \n
    \n
    \n\n\n
    \n \n
    \n
    Passwords do not match.
    \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n\n
    \n
    \n
    \n","
    \n
    \n

    My Account

    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n\n
    \n
    \n\n
    \n
    \n","","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui.tabs\n * @description\n *\n */\n angular\n .module('components.ui.tabs', []);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.tabs.directive:tabsManager\n * @restrict EA\n * @element\n */\n angular\n .module('components.ui.tabs')\n .directive('tabsManager', tabsManager);\n\n function tabsManager() {\n return {\n restrict: 'EA',\n scope: {\n // Tab id\n tabId: '@',\n // Configuration object with all the tabs that this directive will have\n tabsConfig: '=',\n // Default tab value\n defaultTab: '@',\n // Tab Manager instance. This can be user by the implementing scope to get the instance of this directive in parent controller.\n tabManager: '=',\n // On change callback\n change: '&onChange',\n // Target in action toolbar (primary:default or secondary) that this instance will be relocated to in xs devices\n target: '@',\n // Whether to block the relocation into the action toolbar for xs devices\n blockXsRelocation: '='\n },\n templateUrl: 'components/ui/tabs/tabs-manager-directive.tpl.html',\n replace: true,\n controllerAs: 'tabsManager',\n controller: ['$scope', '$document', '$compile', 'RouterHelper', 'Tabs', function ($scope, $document, $compile, RouterHelper, Tabs) {\n var vm = this,\n lastLabel;\n\n vm.tabId = angular.isDefined($scope.tabId) ? $scope.tabId : (new Date()).getTime();\n vm.tabsConfig = angular.isDefined($scope.tabsConfig) ? $scope.tabsConfig : [];\n vm.blockXsRelocation = angular.isDefined($scope.blockXsRelocation) ? $scope.blockXsRelocation : false;\n vm.tabs = _.pluck(vm.tabsConfig, 'value');\n vm.isScrolling = false;\n\n if (!vm.tabs || vm.tabs.length === 0 || !vm.tabId) {\n throw new Error('[tabs-manager-directive]: List of names must not be empty');\n }\n vm.defaultTab = angular.isDefined($scope.defaultTab) ? $scope.defaultTab : vm.tabsConfig[0].value;\n vm.target = $scope.target ? $scope.target : 'primary';\n\n // Create the tab manager\n vm.tabManager = Tabs.create(vm.tabId, vm.tabs, vm.defaultTab, $scope);\n\n // Re-assign the value to parent controller so we can show/hide the templated content.\n $scope.tabManager = vm.tabManager;\n\n // Default value for the dropdown visibility\n vm.isDropDownOpen = false;\n\n // Set the currently selected tab (default tab value) and then watch the tabs-factory ActiveTab value\n vm.currentTabLabel = _.find(vm.tabsConfig, {value: vm.defaultTab}).label;\n\n vm.openTab = function (tabName, checkScroll, $event) {\n var el;\n\n if (checkScroll && $event) {\n // This is the scenario where openTab is invoked through click on the action toolbar's tab. (xs devices)\n el = $event.currentTarget;\n vm.scrollToTab(el);\n }\n else if (checkScroll) {\n // This is the scenario where openTab is invoked through RouterHelper\n // Check for the element. if the element exists, it means we are in the xs size and we need to scroll to the tab\n el = angular.element('[data-tab-name=\"' + vm.tabId + '-' + tabName + '\"] a');\n if (el && el[0] && !vm.isScrolling) {\n vm.scrollToTab(el[0]);\n }\n }\n\n if (tabName) {\n // Finally set the tab active in any scenrio\n vm.tabManager.openTab(tabName);\n }\n };\n\n vm.scrollToTab = function (element) {\n var parent,\n vw,\n elWidth,\n elLeft,\n scrollLeft,\n diff;\n\n if (!element || vm.isScrolling) {\n return;\n }\n parent = element.parentElement;\n if (parent) {\n // Means we are in xs view (very likely). Get the parent Element and its parent and comparet to scroll vals\n vw = $document[0].documentElement.clientWidth;\n elWidth = parent.clientWidth;\n elLeft = angular.element(parent).position().left;\n scrollLeft = parent.parentElement.scrollLeft;\n diff = elLeft + elWidth / 2 - vw / 2;\n vm.isScrolling = true;\n angular.element(parent.parentElement).animate({scrollLeft: scrollLeft + diff}, {\n easing: 'linear',\n duration: 200,\n complete: function () {\n vm.isScrolling = false;\n }\n });\n }\n };\n\n vm.getActiveLabel = function () {\n var label;\n\n if (!vm.tabManager.activeTab) {\n return null;\n }\n\n label = _.find(vm.tabsConfig, {value: vm.tabManager.activeTab}).label;\n if (lastLabel !== label) {\n $scope.change({activeTab: vm.tabManager.activeTab});\n lastLabel = label;\n }\n return label;\n };\n\n // Subscribe\n angular.forEach(vm.tabs, function (tabName) {\n // Maybe the event has been already triggered\n if (RouterHelper.lastEvent && RouterHelper.lastEvent.id === 'event:' + vm.tabId + '-open-tab-' + tabName) {\n vm.openTab(tabName, true);\n }\n\n $scope.$on('event:' + vm.tabId + '-open-tab-' + tabName, function () {\n vm.openTab(tabName, true);\n });\n });\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.tabs.directive:tabAdditionalContent\n * @restrict EA\n * @element\n */\n angular\n .module('components.ui.tabs')\n .directive('tabAdditionalContent', tabAdditionalContent);\n\n function tabAdditionalContent($compile) {\n return {\n restrict: 'EA',\n template: '',\n replace: true,\n scope: {\n rawHtml: '=html'\n },\n link: function (scope, elem) {\n scope.$watch('rawHtml', function (value) {\n var newElem;\n if (!value || !angular.isString(value)) {\n return;\n }\n // we want to use the scope OUTSIDE of this directive\n // (which itself is an isolate scope).\n newElem = $compile(value)(scope.$parent);\n elem.contents().remove();\n elem.append(newElem);\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui.table\n * @description\n *\n */\n angular\n .module('components.ui.table', []);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:tableUserDetails\n * @restrict E\n * @element\n */\n angular\n .module('components.ui.table')\n .directive('tableUserDetails', tableUserDetails);\n\n function tableUserDetails($timeout, $templateRequest, $compile, $sce) {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n isLink: '=?',\n descriptionKey: '=?',\n stopPropagation: '=?',\n hasDetails: '=?',\n nameOnly: '=?',\n addClass: '='\n },\n replace: true,\n transclude: false,\n templateUrl: 'components/ui/table/table-user-details-directive.tpl.html',\n compile: function (element, attrs) {\n return {\n pre: function preLink(scope) {\n if (!attrs.isLink) {\n scope.isLink = true;\n }\n if (!attrs.hasDetails) {\n scope.hasDetails = false;\n }\n if (!attrs.nameOnly) {\n scope.nameOnly = false;\n }\n if (!attrs.descriptionKey) {\n scope.descriptionKey = 'businessName';\n }\n if (!attrs.stopPropagation) {\n scope.stopPropagation = true;\n }\n\n if (scope.user) {\n scope.user.mlpUserDetails = {\n showAdvanced: scope.nameOnly,\n descriptionText: scope.user[scope.descriptionKey]\n };\n }\n // Pre-assign the detailsVisible property to false\n scope.detailsVisible = false;\n },\n post: function postLink(scope, iElement) {\n var templateUrl;\n if (iElement.parent()) {\n iElement.parent().addClass('table-user-detail-holder');\n }\n if (scope.stopPropagation) {\n iElement.bind('click', function (evt) {\n evt.stopPropagation();\n });\n }\n templateUrl = $sce.getTrustedResourceUrl('components/ui/table/table-user-popover.tpl.html');\n if (scope.hasDetails) {\n $templateRequest(templateUrl).then(function (template) {\n var el = angular.element(template)[0],\n linked = $compile(el)(scope);\n $timeout(function () {\n scope.$apply();\n scope.htmlPopover = $sce.trustAsHtml(linked.html());\n }, 100, false);\n }, function () {\n // An error has occurred here\n });\n }\n }\n };\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:singleExpand\n * @restrict A\n * @element\n */\n angular\n .module('components.ui.table')\n .directive('singleExpand', singleExpand);\n\n function singleExpand(ComponentsUtil) {\n return {\n restrict: 'A',\n scope: {\n subContent: '=',\n subContentIdx: '='\n },\n link: function (scope, element) {\n element.addClass('single-expand');\n element.bind('click', function () {\n scope.subContent = ComponentsUtil.toggleSubContent(scope.subContent, scope.subContentIdx);\n scope.$apply();\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:headerCheck\n * @restrict A\n * @element\n * @description After the last ng-repeat is rendered, the directive checks for the scrollbar. if present, it adds the padding to the header.\n */\n angular\n .module('components.ui.table')\n .directive('headerCheck', headerCheck);\n\n function headerCheck($timeout) {\n return {\n restrict: 'A',\n link: function (scope, element) {\n var tbody,\n thead,\n scrollBarWidth;\n\n if (scope.$last === true) {\n $timeout(function () {\n // Grab the element (which should be the row), its parent (thead), check for the scroll.\n // If scroll exists, do the padding (if thead is visible)\n if (!tbody) {\n tbody = element.parent();\n thead = tbody.parent().find('thead');\n }\n\n if (tbody[0].scrollHeight > tbody.height()) {\n if (!scrollBarWidth) {\n scrollBarWidth = tbody.width() - tbody[0].scrollWidth;\n thead.css({'padding-right': scrollBarWidth + 'px'});\n }\n }\n else {\n thead.css({'padding-right': null});\n }\n });\n }\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.messages\n * @description\n *\n */\n angular\n .module('user.messages', [\n 'ui.router',\n 'mlp-messaging'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('user.messages')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.messages', angular.extend({}, configOptions.defaultStateParams, {\n url: '/messages',\n templateUrl: 'user/messages/messages.tpl.html',\n controller: 'MessagesCtrl',\n controllerAs: 'msg',\n onEnter: ['$rootScope', '$timeout', '$window', '$document', 'RouterHelper', 'notificationConst', 'userProfile', function ($rootScope, $timeout, $window, $document, RouterHelper, notificationConst, userProfile) {\n RouterHelper.activateTab('user', 'messages');\n // $rootScope.$broadcast('event:slider-do-layout', {delay: 100, stepTo: 0});\n $rootScope.$broadcast('event:slider-do-layout', {delay: 100});\n\n // Broadcast to all scroll-navigators to do the check. Not ideal but I don't know how to target only those on this relevant page.\n $rootScope.$broadcast('event:check-scroll-navigator', 'all', 1000);\n\n // Broadcast to the NotificationCentre to check any notifications related to messages for this user.\n $rootScope.$broadcast('event:notifications-check', {\n userId: userProfile.idUser,\n category: notificationConst.categoryMessages,\n type: notificationConst.typeDirectMessage\n });\n }],\n onExit: ['$rootScope', function ($rootScope) {\n $rootScope.$broadcast('event:check-scroll-navigator', 'all', 200);\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.leads.controller:UserReceivedLeadsCtrl\n *\n * @description\n *\n */\n angular\n .module('user.messages')\n .controller('MessagesCtrl', MessagesCtrl);\n\n function MessagesCtrl($rootScope, $scope, $document, $window, $q, $timeout, $uibModal, Restangular, Leads, smoothScroll) {\n var vm = this,\n promises = [];\n\n vm.isLoadingLeads = false;\n vm.isLoadingMsg = false;\n vm.userProfile = $scope.user.userProfile;\n vm.openInfo = false;\n vm.currentLead = null;\n vm.modalInstance = null;\n vm.targetMsgContainer = 'direct-messages-text-input';\n\n vm.loadLeads = function () {\n // Get the leads\n vm.isLoadingLeads = true;\n\n promises.push(Restangular.one('Leads').getList('index', {\n type: 'sent',\n idUser: vm.userProfile.id,\n status: 'open',\n limit: -1\n }));\n\n promises.push(Restangular.one('Leads').getList('index', {\n type: 'received',\n idUser: vm.userProfile.id,\n status: 'open',\n limit: -1\n }));\n\n $q.all(promises).then(function (resultsArray) {\n vm.sentLeads = resultsArray[0].plain();\n _.each(vm.sentLeads, function (lead) {\n lead.leadType = 'sent';\n });\n\n vm.receivedLeads = resultsArray[1].plain();\n _.each(vm.receivedLeads, function (lead) {\n lead.leadType = 'received';\n });\n\n vm.leads = _.union(vm.sentLeads, vm.receivedLeads);\n vm.leads = _.sortBy(vm.leads, 'dateSent').reverse();\n\n vm.isLoadingLeads = false;\n });\n };\n\n vm.openDetails = function (lead, type) {\n if (!lead && !type) {\n lead = vm.currentLead;\n }\n Leads.openDetail(lead, lead.leadType, null);\n };\n\n vm.navigateTo = function (hash, options, lead) {\n if (vm.isLoadingMsg || vm.currentLead === lead) {\n // Come back later. Otherwise the messages directive will load the latest incoming request which might be not right.\n return;\n }\n vm.isLoadingMsg = true;\n vm.currentLead = lead;\n vm.openInfo = false;\n if (angular.isDefined(vm.stepTo)) {\n vm.stepTo({data: 1});\n }\n if (vm.modalInstance) {\n vm.modalInstance.close();\n vm.modalInstance = null;\n }\n vm.targetMsgContainer = 'lead-messages-text-input';\n };\n\n vm.switchToDirect = function () {\n vm.currentLead = null;\n vm.openInfo = false;\n if (angular.isDefined(vm.stepTo)) {\n vm.stepTo({data: 0});\n }\n if (vm.modalInstance) {\n vm.modalInstance.close();\n vm.modalInstance = null;\n }\n vm.targetMsgContainer = 'direct-messages-text-input';\n };\n\n vm.openModal = function () {\n vm.modalInstance = $uibModal.open({\n animation: true,\n appendTo: angular.element($document[0].body),\n templateUrl: 'user/messages/messages-list-modal.tpl.html',\n scope: $scope,\n size: 'lg',\n windowClass: 'from-center'\n });\n };\n\n vm.scrollTo = function (elementId) {\n var el = $document[0].getElementById(elementId);\n if (el) {\n smoothScroll(el, {\n callbackAfter: function () {\n if (el && el.focus) {\n el.focus();\n }\n }\n });\n }\n };\n\n vm.onMessagesLoad = function () {\n promises = [];\n vm.isLoadingMsg = false;\n };\n\n vm.onDirectMessagesLoad = function () {\n if (!vm.checkedScroll) {\n $rootScope.$broadcast('event:check-scroll-navigator', 'all');\n vm.checkedScroll = true;\n }\n };\n\n // Load leads\n vm.loadLeads();\n\n // Subscribe on events\n vm.watchHandle1 = $rootScope.$on('event:lead-sent', function () {\n vm.loadLeads();\n });\n vm.watchHandle2 = $rootScope.$on('event:lead-closed', function () {\n vm.loadLeads();\n });\n $scope.$on('$destroy', function () {\n vm.watchHandle1();\n vm.watchHandle2();\n });\n\n // Unfortunately we have to use the timeout here\n $timeout(function () {\n vm.stepTo = $scope.stepTo;\n }, 100);\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.marketplace\n * @description\n *\n */\n angular\n .module('user.marketplace', [\n 'ui.router',\n 'mlpMarketplace'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('user.marketplace')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.marketplace', angular.extend({}, configOptions.defaultStateParams, {\n url: '/marketplace',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'marketplace');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.marketplace.controller:UserMarketplaceCtrl\n *\n * @description\n *\n */\n angular\n .module('user.marketplace')\n .controller('UserMarketplaceCtrl', UserMarketplaceCtrl);\n\n function UserMarketplaceCtrl($scope, Marketplace) {\n var vm = this;\n\n vm.userProfile = $scope.user.userProfile;\n vm.items = $scope.user.userProfile.marketplace;\n\n vm.openMarketplace = function () {\n Marketplace.open();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.leads\n * @description\n *\n */\n angular\n .module('user.leads', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.leads.controller:UserSentLeadsCtrl\n *\n * @description\n *\n */\n angular\n .module('user.leads')\n .controller('UserSentLeadsCtrl', UserSentLeadsCtrl);\n\n function UserSentLeadsCtrl($scope, DataTable, Leads) {\n var vm = this;\n vm.userProfile = $scope.user.userProfile;\n vm.statuses = {\n all: 'All leads',\n open: 'Delivered',\n new: 'Notified',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'sent',\n idUser: vm.userProfile.id\n }\n });\n\n vm.openDetail = function ($index) {\n Leads.openDetail(vm.list.getRecords()[$index], 'sent', 'user-sent-leads-ctrl-container');\n };\n\n $scope.$on('sentLeads-success', function () {\n if (vm.list) {\n vm.list.reload();\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.leads.controller:UserReceivedLeadsCtrl\n *\n * @description\n *\n */\n angular\n .module('user.leads')\n .controller('UserReceivedLeadsCtrl', UserReceivedLeadsCtrl);\n\n function UserReceivedLeadsCtrl($scope, $state, Session, DataTable, MyMemberships, Leads) {\n var vm = this;\n vm.userProfile = $scope.user.userProfile;\n vm.myProfile = null;\n vm.receiveLeads = $scope.user.agreementsDetails.receiveLeads;\n\n // Watch the property\n $scope.$watch('user.agreementsDetails.receiveLeads', function (receiveLeads) {\n vm.receiveLeads = receiveLeads;\n });\n\n Session.getUserProfile().then(function (profile) {\n vm.myProfile = profile;\n });\n\n vm.statuses = {\n all: 'All leads',\n open: 'Open',\n new: 'New',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'received',\n idUser: vm.userProfile.id\n }\n });\n\n vm.openDetail = function ($index) {\n var detailInstance = Leads.openDetail(vm.list.getRecords()[$index], 'received', 'user-received-leads-ctrl-container');\n if (angular.isDefined(detailInstance)) {\n detailInstance.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.lead)) {\n vm.list.getRecords()[$index] = result.lead;\n }\n });\n }\n };\n\n vm.closeLead = function ($index, status) {\n Leads.closeLead(vm.list.getRecords()[$index], status, 'user-received-leads-ctrl-container')\n .then(function () {\n vm.list.getRecords()[$index].status = status;\n });\n };\n\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(vm.myProfile, vm.userProfile);\n modalInstance.then(function (receiveLeads) {\n $scope.user.agreementsDetails.receiveLeads = receiveLeads;\n vm.receiveLeads = receiveLeads;\n });\n };\n\n $scope.$on('event:receive-leads-contract-accepted', function (event, data) {\n angular.forEach(vm.list.getRecords(), function (record) {\n if (record.sender.idUser === data.idUser) {\n record.acceptedReceiveLeadsContractExists = true;\n }\n });\n });\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('user.leads')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.sentLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/sent-leads',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'sentLeads');\n }]\n }))\n .state('user.receivedLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/received-leads',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'receivedLeads');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.connections\n * @description\n *\n */\n angular\n .module('user.connections', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('user.connections')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.connections', angular.extend({}, configOptions.defaultStateParams, {\n url: '/connections',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'connections');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.connections.controller:ConnectionsCtrl\n *\n * @description\n *\n */\n angular\n .module('user.connections')\n .controller('ConnectionsCtrl', ConnectionsCtrl);\n\n function ConnectionsCtrl($scope, Notification, MyPod) {\n var vm = this;\n\n vm.userProfile = $scope.user.userProfile;\n vm.searchName = '';\n vm.invitePendingFor = -1;\n vm.invitePending = false;\n vm.lastSearched = null;\n\n // use the data table initialised in the parent scope\n vm.list = $scope.user.connectionsList;\n\n // Search/Filter function for the search/filter form\n vm.search = function () {\n if (vm.searchName === vm.lastSearched) {\n return;\n }\n vm.lastSearched = vm.searchName;\n vm.list.reload({\n search: vm.searchName\n });\n };\n\n // Will directly join the other user's pod (using the default rewards program)\n vm.quickJoin = function ($index) {\n var user = vm.list.getRecords()[$index].member;\n\n // Let's start pending...\n vm.invitePendingFor = $index;\n vm.invitePending = true;\n\n MyPod.quickJoin(user.idUser).then(function () {\n user.acceptedSendLeadsContractExists = true;\n vm.invitePendingFor = -1;\n vm.invitePending = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function (err) {\n vm.invitePendingFor = -1;\n vm.invitePending = false;\n Notification({message: 'The registration was unsuccessful.'}, 'error');\n throw new Error(err);\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user.agreements\n * @description\n *\n */\n angular\n .module('user.agreements', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('user.agreements')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user.agreements', angular.extend({}, configOptions.defaultStateParams, {\n url: '/agreements',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('user', 'agreements');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.agreements.controller:AgreementsCtrl\n *\n * @description\n *\n */\n angular\n .module('user.agreements')\n .controller('AgreementsCtrl', AgreementsCtrl);\n\n function AgreementsCtrl($rootScope, $scope, $timeout, $state, Restangular, $uibModal,\n Notification, MyMemberships, MyPod, Leads, $document, BusinessAccount) {\n var vm = this,\n body;\n\n vm.userProfile = $scope.user.userProfile;\n vm.myProfile = $scope.user.myProfile;\n vm.receiveLeads = $scope.user.agreementsDetails.receiveLeads;\n vm.sendLeads = $scope.user.agreementsDetails.sendLeads;\n vm.isLoading = false;\n vm.trialData = null;\n\n // Watch the sendLeads property of the scope's parent 'user' property (in user controller) as the change in the user controller sendLeads is not propagated to the child controller.\n $scope.$watch('user.agreementsDetails.sendLeads', function (newSendLeads) {\n vm.sendLeads = newSendLeads;\n });\n\n // Watch the property\n $scope.$watch('user.agreementsDetails.receiveLeads', function (receiveLeads) {\n vm.receiveLeads = receiveLeads;\n });\n\n vm.data = {\n receiveLeads: {},\n sendLeads: {}\n };\n\n function getScrollingElement() {\n var d = $document[0];\n return d.documentElement.scrollHeight > d.body.scrollHeight && d.compatMode.indexOf('CSS1') === 0 ? d.documentElement : d.body;\n }\n\n function reviseAgreement(data) {\n data.idUser = vm.userProfile.id;\n vm.isLoading = true;\n Restangular.one('Contracts').customPUT(data, 'revise')\n .then(function (agreements) {\n vm.receiveLeads = agreements.receiveLeads;\n vm.sendLeads = agreements.sendLeads;\n $scope.user.agreementsDetails.receiveLeads = agreements.receiveLeads;\n $scope.user.agreementsDetails.sendLeads = agreements.sendLeads;\n $rootScope.$broadcast('event:user-agreements-updated');\n vm.isLoading = false;\n vm.data = {\n receiveLeads: {},\n sendLeads: {}\n };\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n });\n }\n\n function accept(contractPurpose) {\n var data = {\n idUser: vm.userProfile.id,\n contractPurpose: contractPurpose\n };\n vm.isLoading = true;\n Restangular.one('Contracts').customPUT(data, 'accept')\n .then(function (agreements) {\n vm.receiveLeads = agreements.receiveLeads;\n vm.sendLeads = agreements.sendLeads;\n $scope.user.agreementsDetails.receiveLeads = agreements.receiveLeads;\n $scope.user.agreementsDetails.sendLeads = agreements.sendLeads;\n $rootScope.$broadcast('event:user-agreements-updated');\n vm.isLoading = false;\n vm.data = {\n receiveLeads: {},\n sendLeads: {}\n };\n\n Notification({message: 'Success'}, 'confirmation');\n\n if (contractPurpose === 'receiveLeads') {\n $rootScope.$broadcast('event:receive-leads-contract-accepted', {\n idUser: vm.userProfile.id\n });\n }\n\n if (angular.isDefined(agreements.idLead) && angular.isNumber(agreements.idLead)) {\n $state.go('leadDetail', {id: agreements.idLead});\n }\n }, function () {\n vm.isLoading = false;\n });\n }\n\n function acceptAgreement(contractPurpose) {\n var modalInstance;\n if (contractPurpose === 'receiveLeads' && vm.receiveLeads.contractType === 'Subscription' && !vm.myProfile.isCCSet) {\n modalInstance = $uibModal.open({\n animation: false,\n templateUrl: 'account/billing/credit-card.tpl.html',\n controller: 'CreditCardCtrl',\n controllerAs: 'creditCard',\n size: 'lg',\n windowClass: 'modal-credit-card',\n resolve: {\n operation: function () {\n return 'add';\n }\n }\n });\n\n modalInstance.result.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.creditCard) && angular.isDefined(result.creditCard.number)) {\n accept(contractPurpose);\n }\n });\n }\n else {\n accept(contractPurpose);\n }\n }\n\n function scrollTo(btnId) {\n var btn;\n body = body || $document[0].scrollingElement || getScrollingElement();\n\n if (!btnId) {\n return;\n }\n\n btn = angular.element('#' + btnId);\n if (btn && btn.offset().top > $document[0].documentElement.clientHeight + body.scrollTop) {\n angular.element(body).animate({\n scrollTop: body.scrollTop + btn.offset().top + btn.outerHeight() + 10 - $document[0].documentElement.clientHeight\n }, 200);\n }\n }\n\n vm.reviseReceiveLeads = function () {\n var data = angular.extend({}, vm.data.receiveLeads, {\n contractPurpose: 'receiveLeads'\n });\n reviseAgreement(data);\n };\n\n vm.reviseSendLeads = function () {\n var data = angular.extend({}, vm.data.sendLeads, {\n contractPurpose: 'sendLeads'\n });\n reviseAgreement(data);\n };\n\n vm.acceptReceiveLeads = function () {\n acceptAgreement('receiveLeads');\n };\n\n vm.acceptSendLeads = function () {\n acceptAgreement('sendLeads');\n };\n\n vm.isBusinessAccountActive = function () {\n return angular.isDefined(vm.myProfile.isBusinessAccountActive) && vm.myProfile.isBusinessAccountActive === true;\n };\n\n vm.cancelReceiveLeadsRevision = function () {\n vm.receiveLeads.revise = false;\n vm.data.receiveLeads = {};\n };\n\n vm.cancelSendLeadsRevision = function () {\n vm.sendLeads.revise = false;\n vm.data.sendLeads = {};\n };\n\n vm.switchReviseSendLeadsContent = function () {\n vm.sendLeads.revise = !vm.sendLeads.revise;\n if (vm.sendLeads.revise) {\n $timeout(function () {\n scrollTo('reviseSendLeadsBtn');\n }, 200);\n }\n };\n\n vm.switchReviseReceiveLeadsContent = function () {\n vm.receiveLeads.revise = !vm.receiveLeads.revise;\n if (vm.receiveLeads.revise) {\n $timeout(function () {\n scrollTo('reviseReceiveLeadsBtn');\n }, 200);\n }\n };\n\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(vm.myProfile, vm.userProfile);\n modalInstance.then(function (receiveLeads) {\n $scope.user.agreementsDetails.receiveLeads = receiveLeads;\n vm.receiveLeads = receiveLeads;\n });\n };\n\n vm.openSendInvite = function () {\n var modalInstance = MyPod.openSendInvite(vm.myProfile, vm.userProfile);\n modalInstance.then(function (sendLeads) {\n vm.sendLeads = sendLeads;\n });\n };\n\n vm.onRewardSelectionChangeReceiveLeads = function (data, isFormValid) {\n _.extend(vm.data.receiveLeads, data);\n vm.isReceiveLeadsRewardsFormValid = isFormValid;\n };\n\n vm.onRewardSelectionChangeSendLeads = function (data, isFormValid) {\n _.extend(vm.data.sendLeads, data);\n vm.isSendLeadsRewardsFormValid = isFormValid;\n };\n\n // Will directly join the other user's pod (using the default rewards program)\n vm.quickJoin = function () {\n // Let's start pending...\n vm.invitePending = true;\n\n MyPod.quickJoin(vm.userProfile.idUser).then(function (response) {\n vm.sendLeads = response.sendLeads;\n $scope.user.agreementsDetails.sendLeads = response.sendLeads;\n $rootScope.$broadcast('event:user-agreements-updated');\n vm.invitePending = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function (err) {\n vm.invitePending = false;\n Notification({message: 'Joining the Rewards Program was unsuccessful.' + (err.data && err.data.errorMessage ? '
    ' + err.data.errorMessage : '')}, 'error');\n throw new Error(err);\n });\n };\n\n vm.activateBusinessAccount = function () {\n BusinessAccount.initiateActivation($document[0].body, vm.trialData.isEligibleForTrial);\n };\n\n // Send Lead\n vm.sendLead = function () {\n Leads.openSendLead(vm.userProfile, false);\n };\n\n //\n if (!vm.isBusinessAccountActive()) {\n vm.trialData = BusinessAccount.getTrialData(vm.myProfile);\n }\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name user.agreements.directive:agreementPricingDetail\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('user.agreements')\n .directive('agreementPricingDetail', agreementPricingDetail);\n\n function agreementPricingDetail() {\n return {\n restrict: 'EA',\n scope: {\n agreement: '=',\n label: '='\n },\n templateUrl: 'user/agreements/agreement-pricing-detail-directive.tpl.html',\n replace: false,\n controllerAs: 'agreementPricingDetail',\n controller: function ($scope) {\n var vm = this;\n vm.agreement = $scope.agreement;\n vm.label = $scope.label;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n /* @ngdoc object\n * @name socialShare.providers\n * @description\n *\n */\n angular\n .module('socialShare.providers', [\n 'angularLoad'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:TwitterSocialShare\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('TwitterSocialShare', TwitterSocialShare);\n\n function TwitterSocialShare() {\n var config = {\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', function ($q, $window) {\n var $twitter = $q.defer();\n\n $twitter.init = function (newConfig) {\n setConfig(newConfig);\n $twitter.resolve(true);\n };\n\n $twitter.share = function (data) {\n var url = '//twitter.com/share?url=' + encodeURIComponent(data.url),\n text = '';\n\n text += data.name;\n\n if (data.description) {\n text += ' - ' + data.description;\n }\n\n url += '&text=' + encodeURIComponent(text);\n\n if (data.source) {\n url += '&via=' + encodeURI(data.source);\n }\n\n if (data.hashTags) {\n url += '&hashtags=' + encodeURI(data.hashTags);\n }\n\n $window.open(url\n , 'sharer', 'toolbar=0,status=0,width=' + config.popupWidth + ',height=' + config.popupHeight);\n };\n\n return $twitter;\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:LinkedinSocialShare\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('LinkedinSocialShare', LinkedinSocialShare);\n\n function LinkedinSocialShare() {\n var config = {\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', function ($q, $window) {\n var $linkedin = $q.defer();\n\n $linkedin.init = function (newConfig) {\n setConfig(newConfig);\n $linkedin.resolve(true);\n };\n\n $linkedin.share = function (data) {\n var url = '//www.linkedin.com/shareArticle?mini=true&url=' + encodeURIComponent(data.url);\n\n if (data.name) {\n url += '&title=' + encodeURI(data.name);\n }\n\n if (data.description) {\n url += '&summary=' + encodeURI(data.description);\n }\n\n if (data.source) {\n url += '&source=' + encodeURI(data.source);\n }\n $window.open(url\n , 'sharer', 'toolbar=0,status=0,width=' + config.popupWidth + ',height=' + config.popupHeight);\n };\n\n return $linkedin;\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:GooglePlusSocialShare\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('GooglePlusSocialShare', GooglePlusSocialShare);\n\n function GooglePlusSocialShare() {\n var config = {\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', function ($q, $window) {\n var $googlePlus = $q.defer();\n\n $googlePlus.init = function (newConfig) {\n setConfig(newConfig);\n $googlePlus.resolve(true);\n };\n\n $googlePlus.share = function (data) {\n $window.open(\n '//plus.google.com/share?' +\n 'url=' + encodeURIComponent(data.url)\n , 'sharer', 'toolbar=0,status=0,width=' + config.popupWidth + ',height=' + config.popupHeight);\n };\n\n return $googlePlus;\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:Facebook\n *\n * @description\n *\n */\n angular\n .module('socialShare.providers')\n .provider('FacebookSocialShare', FacebookSocialShare);\n\n function FacebookSocialShare() {\n var config = {\n appId: null,\n version: 'v2.3',\n xfbml: true,\n popupHeight: 500,\n popupWidth: 500\n };\n\n function setConfig(newConfig) {\n if (angular.isObject(newConfig)) {\n angular.forEach(newConfig, function (value, paramName) {\n if (angular.isDefined(config[paramName])) {\n config[paramName] = value;\n }\n else {\n throw new Error('Invalid configuration option');\n }\n });\n }\n }\n\n return {\n $get: ['$q', '$window', '$rootScope', 'angularLoad', function ($q, $window, $rootScope, angularLoad) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var $facebook = $q.defer(),\n fbInitHandler;\n\n $facebook.init = function (newConfig) {\n setConfig(newConfig);\n\n if (angular.isUndefined(config.appId) || config.appId === null) {\n throw new Error('Missing APP ID');\n }\n\n if (!$window.FB) {\n angularLoad.loadScript('//connect.facebook.net/en_US/sdk.js')\n .then(function () {\n $window.FB.init({\n appId: config.appId,\n version: config.version,\n xfbml: config.xfbml\n });\n $rootScope.$broadcast('fb.init');\n });\n }\n };\n\n fbInitHandler = $rootScope.$on('fb.init', function () {\n $facebook.resolve(true);\n });\n\n $facebook.share = function (data) {\n var params = {\n method: 'feed',\n link: data.url\n };\n if (data.title) {\n params.caption = data.title;\n }\n\n if (data.name) {\n params.name = data.name;\n }\n\n if (data.description) {\n params.description = data.description;\n }\n\n if (data.picture) {\n params.picture = data.picture;\n }\n\n $window.FB.ui(params);\n };\n\n return $facebook;\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod.sentLeads\n * @description\n *\n */\n angular\n .module('myPod.sentLeads', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myPod.sentLeads')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myPod.sentLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/sent-leads',\n templateUrl: 'my-pod/my-pod.tpl.html',\n controller: 'MyPodCtrl',\n controllerAs: 'myPod',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myPod', 'sentLeads');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.sentLeads.controller:SentLeadsCtrl\n *\n * @description\n *\n */\n angular\n .module('myPod.sentLeads')\n .controller('SentLeadsCtrl', SentLeadsCtrl);\n\n function SentLeadsCtrl(DataTable, Leads) {\n var vm = this,\n filter;\n vm.statuses = {\n all: 'All leads',\n open: 'Delivered',\n new: 'Notified',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.searchLead = '';\n vm.selectedStatus = 'all';\n vm.selectedStatusLabel = 'All leads';\n vm.lastSearched = null;\n\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'sent'\n }\n });\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n search: vm.searchLead\n });\n };\n\n vm.selectStatus = function (leadStatus) {\n vm.selectedStatus = leadStatus;\n vm.selectedStatusLabel = vm.statuses[leadStatus];\n filter();\n };\n\n vm.search = function () {\n if (vm.selectedStatus + vm.searchLead === vm.lastSearched) {\n return;\n }\n filter();\n vm.lastSearched = vm.selectedStatus + vm.searchLead;\n };\n\n vm.openDetail = function ($index) {\n Leads.openDetail(vm.list.getRecords()[$index], 'sent', 'sent-leads-ctrl-container');\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod.sendInvite\n * @description\n *\n */\n angular\n .module('myPod.sendInvite', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myPod.sendInvite')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myPodSendInvite', {\n url: '/my-pod/send-invite',\n template: '',\n controller: 'SendInviteCtrl',\n controllerAs: 'sendInvite',\n authenticate: true,\n params: {\n user: null\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.sendInvite.controller:SendInviteModalCtrl\n *\n * @description\n *\n */\n angular\n .module('myPod.sendInvite')\n .controller('SendInviteModalCtrl', SendInviteModalCtrl);\n\n function SendInviteModalCtrl($state, $timeout, Restangular, Notification, FormAlerts, $uibModalInstance, userProfile) {\n var vm = this;\n vm.isLoading = false;\n vm.isLoadingUserData = false;\n vm.searchControlName = 'sendInviteSearchControl';\n vm.data = {\n firstName: null,\n email: null,\n phoneMobile: null\n };\n vm.alerts = new FormAlerts();\n vm.displayContactDetails = false;\n vm.hasRewardCode = true;\n vm.isRewardCodeValid = false;\n vm.isRewardCodeInvalid = false;\n vm.targetUser = userProfile;\n vm.emptyResults = false;\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n if (angular.isDefined(userProfile) && angular.isObject(userProfile)) {\n vm.data.firstName = userProfile.firstName;\n vm.data.email = userProfile.email;\n vm.data.phoneMobile = userProfile.phoneMobile;\n }\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.send = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n\n Restangular.one('Members').post('index', vm.data)\n .then(function (response) {\n vm.isLoading = false;\n $uibModalInstance.close(response.sendLeads);\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to send');\n $uibModalInstance.dismiss();\n });\n };\n\n vm.checkRewardCode = function () {\n if (vm.isRewardCodeValid) {\n vm.rewardCode = null;\n vm.isRewardCodeInvalid = false;\n vm.isRewardCodeValid = false;\n }\n else {\n vm.rewardCode = vm.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.isCheckingCode = true;\n Restangular.one('RewardCodes').one('validate').get({rewardCode: vm.rewardCode})\n .then(function (result) {\n vm.isRewardCodeInvalid = !result.valid;\n vm.isRewardCodeValid = result.valid;\n Restangular.one('RewardCodes').post('activate', {\n rewardCode: vm.rewardCode\n })\n .then(function (activationResult) {\n if (angular.isObject(activationResult) && angular.isDefined(activationResult.idUser) && activationResult.idUser > 0) {\n $uibModalInstance.close({isRedirecting: true});\n Notification({message: 'Success'}, 'confirmation');\n $state.go('user.agreements', {id: activationResult.idUser});\n }\n else {\n vm.isLoading = false;\n vm.isRewardCodeInvalid = true;\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n }\n }, function () {\n vm.isLoading = false;\n vm.isRewardCodeInvalid = true;\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n });\n }, function () {\n vm.isRewardCodeInvalid = true;\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n });\n }\n };\n\n vm.onRewardCodeEnter = function ($event) {\n if ($event.key === 'Enter') {\n $event.stopImmediatePropagation();\n vm.checkRewardCode();\n }\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n vm.userInvitedProfile = null;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item) {\n return;\n }\n vm.displayContactDetails = true;\n vm.isLoadingUserData = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n profile = profile.plain();\n vm.data.phoneMobile = profile.phoneMobile;\n vm.data.firstName = profile.firstName;\n vm.data.email = profile.email;\n vm.userInvitedProfile = profile;\n vm.isLoadingUserData = false;\n });\n };\n\n vm.clearContactData = function (focus) {\n vm.displayContactDetails = false;\n vm.data.email = null;\n vm.data.phoneMobile = null;\n vm.data.firstName = null;\n if (focus) {\n $timeout(function () {\n angular.element('[name=\\'' + vm.searchControlName + '\\']').focus();\n }, 200);\n }\n };\n\n vm.checkContactData = function () {\n if (vm.displayContactDetails === true) {\n return vm.data.email && vm.data.firstName;\n }\n\n return true;\n };\n\n vm.openSearch = function () {\n vm.onlySearch = true;\n vm.onlyRewards = false;\n\n $timeout(function () {\n angular.element('[name=\\'' + vm.searchControlName + '\\']').focus();\n }, 200);\n };\n\n vm.focusIn = function () {\n vm.hasRewardCode = false;\n vm.onlyRewards = false;\n vm.onlySearch = true;\n };\n\n vm.openRewardCode = function () {\n vm.hasRewardCode = true;\n vm.clearContactData(false);\n $timeout(function () {\n angular.element('#rewardCode').focus();\n }, 200);\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.sendInvite.controller:SendInviteCtrl\n *\n * @description\n *\n */\n angular\n .module('myPod.sendInvite')\n .controller('SendInviteCtrl', SendInviteCtrl);\n\n function SendInviteCtrl($state, $stateParams, MyPod) {\n MyPod.openSendInvite().then(function (result) {\n if (result && !result.isRedirecting) {\n $state.go('myPod');\n }\n },\n function () {\n // When this is an error or just simply closed, redirect to my-pod.\n $state.go('myPod');\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod.members\n * @description\n *\n */\n angular\n .module('myPod.members', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myPod.members')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myPod.members', angular.extend({}, configOptions.defaultStateParams, {\n url: '/members',\n templateUrl: 'my-pod/my-pod.tpl.html',\n controller: 'MyPodCtrl',\n controllerAs: 'myPod',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myPod', 'members');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.members.controller:MembersCtrl\n *\n * @description\n *\n */\n angular\n .module('myPod.members')\n .controller('MembersCtrl', MembersCtrl);\n\n function MembersCtrl(DataTable) {\n var vm = this,\n filter;\n vm.statuses = {\n active: 'Active',\n past: 'Past',\n pending: 'Pending invites'\n };\n vm.searchName = '';\n vm.selectedStatus = 'active';\n vm.selectedStatusLabel = 'Active';\n vm.lastSearched = null;\n\n vm.list = DataTable.create('Members', 'index', {\n status: 'active'\n }, {\n basicParams: {}\n });\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n search: vm.searchName\n });\n };\n\n vm.selectStatus = function (status) {\n vm.selectedStatus = status;\n vm.selectedStatusLabel = vm.statuses[status];\n filter();\n };\n\n vm.search = function () {\n if (vm.lastSearched === vm.selectedStatus + vm.searchName) {\n return;\n }\n filter();\n vm.lastSearched = vm.selectedStatus + vm.searchName;\n };\n\n vm.list.isReady.then(function () {\n if (vm.list.recordsExist() && vm.list.getRecords() < 1) {\n vm.selectStatus('past');\n }\n else if (!vm.list.recordsExist()) {\n vm.selectStatus('pending');\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.sendReward\n * @description\n *\n */\n angular\n .module('myMemberships.sendReward', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myMemberships.sendReward')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myMembershipsSendReward', {\n url: '/my-memberships/send-reward',\n templateUrl: 'my-memberships/send-reward/send-reward.tpl.html',\n controller: 'SendRewardCtrl',\n controllerAs: 'sendReward',\n authenticate: true,\n resolve: {\n creditCard: ['Restangular', function (Restangular) {\n return Restangular.one('Billing').one('creditCard').get()\n .then(function (creditCard) {\n if (!creditCard.number || !creditCard.expiryMonth || !creditCard.expiryYear) {\n return null;\n }\n return creditCard.plain();\n }, function () {\n return null;\n });\n }],\n membershipsSubIndustries: ['Restangular', function (Restangular) {\n return Restangular.one('Industries').getList('getMembershipsSubIndustries')\n .then(function (result) {\n var subIndustries = [];\n angular.forEach(result, function (value) {\n subIndustries.push(value);\n });\n return subIndustries;\n });\n }]\n },\n params: {\n user: null\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.sendReward.controller:SendRewardCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.sendReward')\n .controller('SendRewardCtrl', SendRewardCtrl);\n\n function SendRewardCtrl($state, $stateParams, Restangular, Notification, DataTable, FormAlerts, creditCard,\n Industries, membershipsSubIndustries) {\n var vm = this,\n filter;\n\n vm.isLoading = false;\n vm.alerts = new FormAlerts();\n vm.processingFee = 0;\n vm.total = 0;\n vm.tax = 0;\n vm.showTotal = false;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.list = DataTable.create('Memberships', 'index');\n vm.selectedRecipient = null;\n vm.searchName = '';\n vm.idIndustry = '';\n vm.creditCard = creditCard;\n\n if (angular.isDefined($stateParams.user) && angular.isObject($stateParams.user)) {\n vm.selectedRecipient = $stateParams.user;\n }\n\n vm.data = {\n paymentDetails: {\n method: angular.isObject(creditCard) && angular.isDefined(creditCard.number) ? null : 'new'\n },\n idUserRecipient: 0,\n message: 'Thank you for your leads!'\n };\n Industries.isReady.then(function () {\n vm.industries = Industries.getConsolidatedFilteredList(membershipsSubIndustries);\n });\n\n filter = function () {\n var idIndustry = parseInt(vm.idIndustry, 10);\n if (idIndustry <= 0 || isNaN(idIndustry)) {\n idIndustry = 0;\n }\n\n vm.list.reload({\n search: vm.searchName,\n idIndustry: idIndustry\n });\n };\n\n vm.search = function ($event) {\n $event.stopImmediatePropagation();\n filter();\n };\n\n vm.filterByIndustry = function () {\n filter();\n };\n\n vm.cancel = function () {\n $state.go('myMemberships.memberships');\n };\n\n vm.selectRecipient = function ($index) {\n vm.selectedRecipient = vm.list.getRecords()[$index].owner;\n };\n\n vm.deselectRecipient = function () {\n vm.selectedRecipient = null;\n };\n\n vm.isUserSelected = function ($index) {\n var user = vm.list.getRecords()[$index].owner;\n return angular.isObject(vm.selectedRecipient) && vm.selectedRecipient.id === user.id;\n };\n\n vm.send = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Restangular.one('Earnings').post('sendReward', angular.extend({}, vm.data, {\n idUserRecipient: vm.selectedRecipient.id\n }))\n .then(function () {\n $state.go('myMemberships.memberships');\n Notification({message: 'Success'}, 'confirmation');\n }, function (responseData) {\n vm.isLoading = false;\n if (responseData.data.errorCode === 701 || responseData.data.errorCode === 702 || responseData.data.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to send: ' + responseData.data.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to send, try again later please');\n }\n });\n };\n\n vm.onRewardChange = function () {\n vm.showTotal = false;\n vm.calculationRequired = true;\n };\n\n vm.calculateTotal = function () {\n if (vm.data.reward > 0) {\n vm.calculating = true;\n Restangular.one('Earnings').one('calculateRewardTotal').get({\n reward: vm.data.reward\n })\n .then(function (result) {\n vm.processingFee = result.fees;\n vm.total = result.total;\n vm.tax = result.tax;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.showTotal = true;\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.rewardProgram\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram', [\n 'ui.router',\n 'ngclipboard'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:WelcomeModalCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram')\n .controller('WelcomeModalCtrl', WelcomeModalCtrl);\n\n function WelcomeModalCtrl($window, $scope, $uibModalInstance) {\n var vm = this;\n\n // Listen to the broadcast of 'close-modal-instance';\n $scope.$on('close-modal-instance', function () {\n $uibModalInstance.dismiss();\n });\n\n vm.close = function () {\n $uibModalInstance.close();\n };\n\n vm.openLink = function (linkUrl) {\n $window.open(linkUrl, '_blank');\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardProgramsSetupCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardProgramsSetupCtrl', RewardProgramsSetupCtrl);\n\n function RewardProgramsSetupCtrl($scope, $timeout, $filter, Notification, $state, FormAlerts, defaultOptions, RewardCodes) {\n var vm = this;\n\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.rewardProgramHelp = 'This is where you can configure different cash rewards for different products and/or services you can link to your Reward Codes. Examples: Book Keeping $100, Tax Return $200, Financial Planning $300';\n\n vm.data = {\n options: []\n };\n\n function getIdForOption() {\n var d = new Date();\n return d.getTime();\n }\n\n function initData() {\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n }\n\n if ($state.params.openInvite) {\n RewardCodes.openWelcome();\n }\n\n // Subscribe to the update of the user profile.\n $scope.$on('event:user-updateLocalProfile', function () {\n // We cannot use state.reload as that would possibly open a WelcomeScreen again.\n $state.transitionTo('myMembershipsRewardProgramsSetup', {\n openInvite: false\n });\n });\n\n // Render reward program option\n vm.renderRewardProgramOptions = function (options) {\n if (options && options.length > 0) {\n angular.forEach(options, function (option) {\n var uiId = getIdForOption() * Math.random();\n vm.data.options.push(angular.extend({}, option, {\n uiId: uiId.toString().replace('.', '')\n }));\n });\n vm.data.options = $filter('orderBy')(vm.data.options, 'successfulLeadPrice');\n }\n else {\n initData();\n }\n };\n vm.renderRewardProgramOptions(defaultOptions);\n\n vm.addOption = function () {\n var optionId,\n idx,\n input;\n\n optionId = getIdForOption();\n\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n\n idx = vm.data.options.length - 1;\n\n $timeout(function () {\n // There might be two different inputs available. First try the desktop one. If visible, just focus it.\n input = angular.element('#name' + optionId + ':visible');\n if (input.length === 0) {\n // This must be the input hidden inside the panel (xs,sm devices)\n input = angular.element('#name2' + optionId);\n vm.tableSubContentVisible = {};\n vm.tableSubContentVisible[idx] = true;\n\n if (input.length === 1) {\n input.closest('.table-cell-sub-content-container').css('display', 'block');\n input[0].focus();\n }\n }\n else {\n input[0].focus();\n }\n }, 200);\n };\n\n vm.deleteOption = function ($index, form) {\n // This is to fix the shifting index in the xs,sm devices that keeps opening incorrect panels\n vm.tableSubContentVisible = {};\n // Remove the option from the data\n vm.data.options.splice($index, 1);\n\n if (form) {\n form.$setDirty();\n }\n };\n\n vm.save = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n RewardCodes.saveDefaultRewardOptions(vm.data.options)\n .then(function () {\n RewardCodes.updateRewardProgramsAndCodes(true, function () {\n vm.isLoading = false;\n Notification({message: 'Success'}, 'confirmation');\n });\n }, function (errorCode) {\n if (errorCode === 609) {\n vm.alerts.add('danger', 'Unable to save: Rewards program is still being updated, please try again later.');\n }\n else {\n vm.alerts.add('danger', 'Unable to save');\n }\n vm.isLoading = false;\n });\n };\n\n vm.toggleSubContent = function (idx) {\n if (!vm.tableSubContentVisible) {\n vm.tableSubContentVisible = {};\n vm.tableSubContentVisible[idx] = true;\n }\n else if (_.contains(_.keys(vm.tableSubContentVisible), idx.toString())) {\n // Check if the incoming idx is already added, Just toggle it.\n vm.tableSubContentVisible[idx] = !vm.tableSubContentVisible[idx];\n }\n else {\n // Delete everything and set as new\n vm.tableSubContentVisible = {};\n vm.tableSubContentVisible[idx] = true;\n }\n };\n\n vm.openWelcomeScreen = function () {\n RewardCodes.openWelcome();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myMemberships.rewardProgram')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.rewardPrograms', angular.extend({}, configOptions.defaultStateParams, {\n url: '/reward-programs',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'rewardPrograms');\n }]\n }))\n .state('myMembershipsRewardProgramsSetup', angular.extend({}, configOptions.defaultStateParams, {\n url: '/my-memberships/reward-programs/setup',\n templateUrl: 'my-memberships/reward-program/setup.tpl.html',\n controller: 'RewardProgramsSetupCtrl',\n controllerAs: 'rewardProgramsSetup',\n params: {\n openInvite: {\n value: false,\n dynamic: true\n }\n },\n resolve: {\n defaultOptions: ['Session', function (Session) {\n return Session.getUserProfile().then(function (user) {\n return user.defaultRewardProgram;\n });\n }]\n }\n }))\n .state('myMembershipsRewardProgramCode', {\n url: '/reward-program/join/{code}',\n resolve: {\n rewardCode: ['$state', '$stateParams', 'Restangular', 'Notification', 'Auth', function ($state, $stateParams, Restangular, Notification, Auth) {\n Restangular.one('RewardCodes').one('viewsCounter').get({rewardCode: $stateParams.code});\n Auth.isAuthenticated()\n .then(function (isAuthenticated) {\n if (isAuthenticated) {\n Restangular.one('RewardCodes').post('activate', {\n rewardCode: $stateParams.code\n })\n .then(function (result) {\n if (angular.isObject(result) && angular.isDefined(result.idUser) && result.idUser > 0) {\n Notification({message: 'You are now joined with this business!'}, 'success');\n $state.go('user.agreements', {id: result.idUser});\n }\n else {\n Notification({message: 'The Reward Code does not exist or is no longer valid.'}, 'warning');\n $state.go('dashboard');\n }\n }, function () {\n $state.go('dashboard');\n });\n }\n else {\n $state.go('accountSignInUp.accountSignUp', {rewardCode: $stateParams.code});\n }\n }, function () {\n $state.go('accountSignInUp.accountSignUp', {rewardCode: $stateParams.code});\n });\n }]\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardProgramCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardProgramCtrl', RewardProgramCtrl);\n\n function RewardProgramCtrl($interpolate, DataTable, RewardCodes, configOptions, SocialShare, BitlyUrlShortener) {\n var vm = this,\n filter;\n\n vm.selectedStatus = 'active';\n vm.selectedStatusLabel = 'Active';\n vm.rewardCodeHelp = 'In this screen you can set up new Reward Codes and apply the Reward Program payouts, or alternatively select \\'Customise Rewards\\' to set up a totally new cash reward offering';\n vm.urlToShare = null;\n vm.emailBody = null;\n\n vm.statuses = {\n active: 'Active',\n archived: 'Archived',\n all: 'All'\n };\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n limit: 15\n });\n };\n\n vm.selectStatus = function (status, forceReload) {\n if (status !== vm.selectedStatus || forceReload === true) {\n vm.selectedStatus = status;\n vm.selectedStatusLabel = vm.statuses[status];\n filter();\n }\n };\n\n vm.list = DataTable.create('RewardCodes', 'index', {\n status: vm.selectedStatus,\n limit: 15\n }, {\n basicParams: {}\n });\n\n vm.openDetail = function ($index) {\n RewardCodes.openDetail(vm.list.getRecords()[$index])\n .then(function (result) {\n if (angular.isObject(result) && angular.isDefined(result.updatedRecord) && angular.isObject(result.updatedRecord)) {\n if (vm.selectedStatus === 'active' && result.updatedRecord.isArchived) {\n vm.list.getRecords().splice($index, 1);\n }\n else {\n angular.extend(vm.list.getRecords()[$index], result.updatedRecord);\n }\n }\n });\n };\n\n vm.openCreateCodeModal = function () {\n var result = RewardCodes.openRewardCreateModal();\n\n // The following will run only if the modal instance is closed (not dismissed).\n result.then(function (response) {\n var newSelectedStatus = vm.selectedStatus;\n if (angular.isDefined(response) && response === 'success') {\n if (vm.selectedStatus === 'archived') {\n newSelectedStatus = 'active';\n }\n vm.selectStatus(newSelectedStatus, true);\n }\n });\n };\n\n vm.list.isReady.then(function () {\n if (vm.list.recordsExist() && vm.list.getRecords() < 1) {\n vm.selectStatus('archived');\n }\n });\n\n vm.setUrl = function (rewardCode) {\n vm.isLoadingLink = true;\n BitlyUrlShortener.shorten(RewardCodes.getRewardCodeUrl(rewardCode))\n .then(function (result) {\n var exp = $interpolate(configOptions.defaultEmailMessage);\n vm.urlToShare = result;\n vm.emailBody = encodeURIComponent(exp({link: vm.urlToShare}));\n vm.isLoadingLink = false;\n });\n };\n\n vm.share = function (socialService) {\n SocialShare.share(socialService, {\n url: vm.urlToShare,\n name: configOptions.defaultShareName,\n description: configOptions.defaultShareMessage,\n source: 'MyLeadPod',\n picture: configOptions.appUrl + '/images/touch-icon-192x192.png'\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name myMemberships.rewardProgram.service:RewardCodes\n *\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram')\n .service('RewardCodes', RewardCodes);\n\n function RewardCodes($document, $q, $state, $uibModal, Session, Restangular, configOptions, $httpParamSerializer) {\n var self = this;\n\n self.openDetail = function (rewardCode, parentElementId) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'my-memberships/reward-program/reward-code-detail.tpl.html',\n controller: 'RewardCodeDetailCtrl',\n controllerAs: 'rewardCodeDetail',\n size: 'md',\n resolve: {\n rewardCode: function () {\n return rewardCode;\n }\n }\n };\n if (angular.isDefined(parentElementId) && !!parentElementId) {\n params.appendTo = angular.element($document[0].getElementById(parentElementId));\n }\n modalInstance = $uibModal.open(params);\n\n return modalInstance.result;\n };\n\n self.openWelcome = function () {\n var params = {\n animation: true,\n templateUrl: 'my-memberships/reward-program/welcome-modal-template.tpl.html',\n controller: 'WelcomeModalCtrl',\n controllerAs: 'welcome',\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n };\n $uibModal.open(params);\n };\n\n self.openEmbed = function (rewardCode, parentElementId) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'my-memberships/reward-program/reward-code-embed.tpl.html',\n controller: 'RewardCodeEmbedCtrl',\n controllerAs: 'rewardCodeEmbed',\n size: 'lg',\n resolve: {\n rewardCode: function () {\n return rewardCode;\n }\n }\n };\n if (angular.isDefined(parentElementId) && !!parentElementId) {\n params.appendTo = angular.element($document[0].getElementById(parentElementId));\n }\n modalInstance = $uibModal.open(params);\n\n return modalInstance.result;\n };\n\n self.create = function (rewardCode, rewardType, options, description, userShareEmail, associatedUserIds) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').post('index', {\n rewardCode: rewardCode,\n rewardType: rewardType,\n options: options,\n description: description,\n userShareEmail: userShareEmail,\n associatedUsers: associatedUserIds\n })\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.update = function (idRewardCode, data) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').customPUT(data, 'index?id=' + idRewardCode)\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.getRewardCodeUrl = function (rewardCode) {\n return $state.href('myMembershipsRewardProgramCode', {code: rewardCode}, {absolute: true});\n };\n\n self.isRewardCodeUnique = function (rewardCode) {\n return Restangular.one('RewardCodes').one('unique').get({rewardCode: rewardCode})\n .then(function (result) {\n return result.unique;\n }, function () {\n return false;\n });\n };\n\n self.isUserShareEmailValid = function (userShareEmail) {\n return Restangular.one('RewardCodes').one('checkUserShareEmail').get({email: userShareEmail})\n .then(function (result) {\n return result.isValid;\n }, function () {\n return false;\n });\n };\n\n self.getDefaultRewardOptions = function () {\n return Restangular.one('RewardCodes').getList('pricingOptionsTemplate')\n .then(function (result) {\n var options = [];\n angular.forEach(result, function (value) {\n options.push(value.plain());\n });\n return options;\n }, function () {\n return [];\n });\n };\n\n self.getRewardCodes = function () {\n return Restangular.one('RewardCodes').getList('index?' + $httpParamSerializer({\n limit: -1,\n orderby: 'rewardCode'\n })).then(function (result) {\n var options = [];\n angular.forEach(result, function (value) {\n options.push(value.plain());\n });\n return options;\n });\n };\n\n self.saveDefaultRewardOptions = function (options) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').customPUT({\n options: options\n }, 'pricingOptionsTemplate')\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.getRegistrationFormCode = function (rewardCode) {\n return '';\n };\n\n self.openRewardCreateModal = function () {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'my-memberships/reward-program/reward-code-create-modal.tpl.html',\n controller: 'RewardCodeCreateCtrl',\n controllerAs: 'rewardProgram',\n size: 'md'\n });\n\n return modalInstance.result;\n };\n\n self.archive = function (idRewardCode) {\n var deferred = $q.defer();\n Restangular.one('RewardCodes').customPUT({}, 'archive?id=' + idRewardCode)\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.updateRewardProgramsAndCodes = function (broadcast, callback) {\n var programDeferred = $q.defer(),\n codesDeferred = $q.defer();\n\n // Get the default reward program\n self.getDefaultRewardOptions().then(function (response) {\n programDeferred.resolve(response);\n });\n\n // Get the reward codes.\n self.getRewardCodes().then(function (response) {\n codesDeferred.resolve(response);\n });\n\n $q.all({program: programDeferred.promise, codes: codesDeferred.promise})\n .then(function (result) {\n Session.updateLocalUserProfile({\n defaultRewardProgram: result.program,\n rewardCodes: result.codes\n }, broadcast);\n if (angular.isDefined(callback) && angular.isFunction(callback)) {\n callback.apply();\n }\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardCodeEmbedCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardCodeEmbedCtrl', RewardCodeEmbedCtrl);\n\n function RewardCodeEmbedCtrl($sce, $uibModalInstance, RewardCodes, rewardCode) {\n var vm = this;\n vm.embedCode = $sce.trustAsHtml(RewardCodes.getRegistrationFormCode(rewardCode.rewardCode));\n vm.previewVisible = false;\n\n vm.close = function () {\n $uibModalInstance.close();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardProgram.controller:RewardCodeDetailCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardCodeDetailCtrl', RewardCodeDetailCtrl);\n\n function RewardCodeDetailCtrl($timeout, $interpolate, $uibModalInstance, SocialShare, BitlyUrlShortener, Restangular, Notification, configOptions, RewardCodes, rewardCode) {\n var vm = this;\n vm.rewardCode = _.clone(rewardCode);\n // vm.rewardCode.originalUserShare = rewardCode.userShare;\n vm.rewardCode.originalDescription = rewardCode.description;\n vm.data = {\n description: vm.rewardCode.description,\n userShareEmail: ''\n };\n\n // Associated Users\n vm.associatedUsers = vm.rewardCode.associatedUsers || [];\n vm.associatedUsersClone = _.clone(rewardCode.associatedUsers || []);\n\n vm.userShareEmailHelp = 'Type in the email address of another MyLeadPod user you want to share the Reward Code with.';\n vm.isCopyToClipboardSuccessful = false;\n vm.editDescriptionVisible = false;\n vm.editUserShareVisible = false;\n vm.editAssociatedUsersVisible = false;\n vm.isSavingDescription = false;\n vm.isSavingUserShare = false;\n vm.userShareEmailChecked = false;\n vm.userShareEmailValid = false;\n vm.userShareEmailValidating = false;\n vm.isArchiving = false;\n vm.shortUrl = null;\n vm.emailBody = null;\n\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n if (angular.isDefined(rewardCode.userShare) && angular.isObject(rewardCode.userShare)) {\n vm.data.userShareEmail = rewardCode.userShare.email;\n vm.userShareEmailValid = true;\n vm.userShareEmailChecked = true;\n }\n\n vm.close = function () {\n $uibModalInstance.close({\n updatedRecord: vm.rewardCode\n });\n };\n\n vm.archive = function () {\n vm.isArchiving = true;\n RewardCodes.archive(rewardCode.id)\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.isArchiving = false;\n }, function () {\n vm.isArchiving = false;\n });\n };\n\n vm.getUrl = function () {\n return RewardCodes.getRewardCodeUrl(rewardCode.rewardCode);\n };\n\n vm.share = function (socialService) {\n SocialShare.share(socialService, {\n url: vm.shortUrl,\n name: configOptions.defaultShareName,\n description: configOptions.defaultShareMessage,\n source: 'MyLeadPod',\n picture: configOptions.appUrl + '/images/touch-icon-192x192.png'\n });\n };\n\n vm.saveDescription = function () {\n vm.isSavingDescription = true;\n vm.editDescriptionError = false;\n RewardCodes.update(rewardCode.id, {\n description: vm.data.description\n })\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.isSavingDescription = false;\n vm.editDescriptionVisible = false;\n vm.rewardCode.originalDescription = rewardCode.description;\n }, function () {\n vm.isSavingDescription = false;\n vm.editDescriptionError = 'An error occurred';\n });\n };\n\n vm.openUserShare = function () {\n vm.editUserShareVisible = true;\n console.log(angular.element('#share-autocomplete_value'));\n $timeout(function () {\n angular.element('#share-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.saveUserShare = function (userMsg) {\n vm.isSavingUserShare = true;\n vm.editUserShareError = false;\n\n vm.searchingUser = userMsg || 'Saving the changes...';\n return RewardCodes.update(rewardCode.id, {\n userShareEmail: vm.data.userShareEmail\n })\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.editUserShareVisible = false;\n vm.isSavingUserShare = false;\n vm.rewardCode.originalDescription = rewardCode.description;\n\n // MGA - #37545\n vm.searchingUser = false;\n vm.editUserShareVisible = false;\n }, function () {\n vm.isSavingUserShare = false;\n vm.editUserShareError = 'An error occurred';\n\n // MGA - #37545\n vm.searchingUser = false;\n vm.editUserShareVisible = false;\n });\n };\n\n vm.removeUserShare = function () {\n vm.data.userShareEmail = '';\n vm.saveUserShare('Removing sharing with the user..').then(function () {\n vm.rewardCode.userShare = null;\n }, function () {\n // Do what?\n vm.data.userShareEmail = vm.rewardCode.userShare.email;\n });\n };\n\n vm.isUserShareEmailValid = function () {\n if (vm.data.userShareEmail.length === 0) {\n return true;\n }\n\n return vm.userShareEmailValid;\n };\n\n vm.onSearchSharedItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingUser = 'Retrieving the user profile';\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n if (!profile) {\n return;\n }\n profile = profile.plain();\n vm.data.userShareEmail = profile.email;\n vm.saveUserShare().then(function () {\n vm.rewardCode.userShare = profile;\n });\n }, function () {\n vm.searchingUser = false;\n });\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n /**\n * Copy success callback\n */\n vm.onSuccess = function () {\n Notification({message: 'Copied into clipboard!'}, 'success');\n };\n\n vm.hasEditsAssociatedUsers = function () {\n var diff1 = _.difference(vm.associatedUsersClone, vm.associatedUsers),\n diff2 = _.difference(vm.associatedUsers, vm.associatedUsersClone);\n return diff1.length > 0 || diff2.length > 0 ? true : false;\n };\n\n vm.openAssociatedUser = function () {\n vm.editAssociatedUsersVisible = true;\n $timeout(function () {\n angular.element('#associated-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.addAssociatedUser = function (userProfile) {\n if (_.where(vm.associatedUsers, {idUser: userProfile.idUser}).length === 0) {\n vm.associatedUsers.push(userProfile);\n }\n };\n\n vm.onAssociatedItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingAssociatedUser = 'Retrieving the user profile';\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n if (!profile) {\n return;\n }\n profile = profile.plain();\n vm.addAssociatedUser(profile);\n vm.searchingAssociatedUser = false;\n }, function () {\n vm.searchingAssociatedUser = false;\n });\n };\n\n vm.onAssociatedUsersCancel = function () {\n vm.editAssociatedUsersVisible = false;\n vm.associatedUsers = _.clone(vm.associatedUsersClone);\n };\n\n vm.saveAssociatedUsers = function () {\n vm.isSavingAssociatedUsers = true;\n vm.editAssociatedUsersError = false;\n\n vm.searchingAssociatedUser = 'Saving the changes...';\n return RewardCodes.update(rewardCode.id, {\n associatedUsers: _.map(vm.associatedUsers, function (user) {\n return user.id;\n })\n })\n .then(function (result) {\n vm.rewardCode = result;\n rewardCode = result;\n vm.associatedUsers = vm.rewardCode.associatedUsers || [];\n vm.associatedUsersClone = _.clone(rewardCode.associatedUsers || []);\n vm.editAssociatedUsersVisible = false;\n vm.isSavingAssociatedUsers = false;\n vm.rewardCode.originalDescription = rewardCode.description;\n\n // MGA - #37545\n vm.searchingAssociatedUser = false;\n vm.editAssociatedUsersVisible = false;\n }, function () {\n vm.editAssociatedUsersError = false;\n vm.editUserShareError = 'An error occurred';\n\n // MGA - #37545\n vm.searchingAssociatedUser = false;\n vm.editAssociatedUsersVisible = false;\n });\n };\n\n vm.removeAssociatedUser = function ($index) {\n vm.associatedUsers.splice($index, 1);\n vm.editAssociatedUsersVisible = true;\n };\n\n vm.embed = function () {\n RewardCodes.openEmbed(rewardCode);\n };\n\n BitlyUrlShortener.shorten(vm.getUrl())\n .then(function (result) {\n var exp = $interpolate(configOptions.defaultEmailMessage);\n vm.shortUrl = result;\n vm.emailBody = encodeURIComponent(exp({link: vm.shortUrl}));\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.rewardCodeCreate.controller:RewardCodeCreateCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.rewardProgram')\n .controller('RewardCodeCreateCtrl', RewardCodeCreateCtrl);\n\n function RewardCodeCreateCtrl($scope, $document, $timeout, $filter, Notification, FormAlerts, Restangular, Session, RewardCodes, $uibModalInstance) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.rewardCodeChecked = false;\n vm.userShareEmailChecked = false;\n vm.rewardCodeValid = false;\n vm.rewardCodeValidating = false;\n vm.rewardsProgramSetup = [];\n vm.isRewardsProgramDetailVisible = false;\n vm.detailsVisible = false;\n vm.sharingVisible = false;\n vm.associatedUsersVisible = false;\n vm.associatedUsers = [];\n vm.sharedUsers = [];\n vm.data = {\n options: [],\n rewardType: 'rewardsProgram',\n userShareEmail: null\n };\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n // Subscribe to the local update\n $scope.$on('event:user-updateLocalProfile', function () {\n if (vm.user.defaultRewardProgram) {\n vm.renderRewardProgramOptions(vm.user.defaultRewardProgram);\n }\n });\n\n function getIdForOption() {\n var d = new Date();\n return d.getTime();\n }\n\n function initData() {\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n }\n\n // Render reward program option\n vm.renderRewardProgramOptions = function (options) {\n if (options && options.length > 0) {\n angular.forEach(options, function (option) {\n var uiId = getIdForOption() * Math.random();\n vm.rewardsProgramSetup.push(option);\n vm.data.options.push(angular.extend({}, option, {\n uiId: uiId.toString().replace('.', '')\n }));\n });\n vm.data.options = $filter('orderBy')(vm.data.options, 'successfulLeadPrice');\n }\n else {\n initData();\n vm.isRewardsProgramDetailVisible = true;\n }\n };\n Session.getUserProfile().then(function (user) {\n vm.user = user;\n if (user.defaultRewardProgram) {\n vm.renderRewardProgramOptions(user.defaultRewardProgram);\n }\n });\n\n vm.rewardCodeHelp = 'You can create your own Reward Codes.\\n\\nExamples: MYCOMPANYNAME123, CODE123, SUMMERPROMOTION, ...\\n\\nPlease choose between 5 to 20 characters.';\n vm.userShareEmailHelp = 'Type in the email address of another MyLeadPod user you want to share the Reward Code with.';\n vm.rewardsHelp = 'Change the Reward Program for this Reward Code. Users joining you via this Reward Code will be connected to the assigned Reward Program.';\n vm.shareHelp = 'Any leads that you will receive via this Reward Code will be shared with the designated user.';\n vm.associatedUsersHelp = 'Associated users is the group of businesses that the user registering through this Reward Code will be automatically connected with.';\n\n vm.addOption = function () {\n var optionId = getIdForOption();\n vm.data.options.push({\n name: null,\n successfulLeadPrice: null,\n uiId: getIdForOption()\n });\n\n $timeout(function () {\n angular.element($document[0].getElementById('name' + optionId))[0].focus();\n }, 0);\n };\n\n vm.deleteOption = function ($index) {\n vm.data.options.splice($index, 1);\n };\n\n vm.onRewardCodeChange = function () {\n vm.rewardCodeChecked = false;\n vm.rewardCodeValidating = false;\n vm.rewardCodeValid = false;\n };\n\n vm.validateRewardCode = function () {\n var code;\n vm.rewardCodeChecked = false;\n if (vm.data.rewardCode && vm.data.rewardCode.length >= 5 && vm.data.rewardCode.length <= 20) {\n code = vm.data.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.data.rewardCode = code.replace(/[-]+/g, '-');\n vm.rewardCodeValidating = true;\n RewardCodes.isRewardCodeUnique(vm.data.rewardCode)\n .then(function (isUnique) {\n vm.rewardCodeChecked = true;\n vm.rewardCodeValidating = false;\n vm.rewardCodeValid = isUnique;\n // Please don't remove. This could be the workaround if the $digest takes too long to apply changes to watchers. _.defer(function(){$scope.$apply();});\n });\n }\n };\n\n vm.create = function () {\n var associatedUsersIds = _.map(vm.associatedUsers, function (user) {\n return user.id;\n });\n vm.isLoading = true;\n vm.alerts.reset();\n RewardCodes.create(vm.data.rewardCode.toUpperCase(), vm.data.rewardType, vm.data.options, vm.data.description, vm.data.userShareEmail, associatedUsersIds)\n .then(function () {\n // Force the refresh of the reward program and code for the local user\n RewardCodes.updateRewardProgramsAndCodes(true);\n Notification({message: 'Success'}, 'confirmation');\n $uibModalInstance.close('success');\n }, function (errorCode) {\n if (errorCode === 601) {\n vm.alerts.add('danger', 'This Reward Code is already used. Please choose another one.');\n }\n else {\n vm.alerts.add('danger', 'Unable to create');\n }\n vm.isLoading = false;\n });\n };\n\n vm.toggleRewardsProgramDetailVisibility = function () {\n vm.isRewardsProgramDetailVisible = !vm.isRewardsProgramDetailVisible;\n };\n\n vm.toggleMoreDetailsVisibility = function () {\n vm.detailsVisible = !vm.detailsVisible;\n vm.associatedUsersVisible = false;\n vm.sharingVisible = false;\n if (!vm.detailsVisible) {\n vm.isRewardsProgramDetailVisible = false;\n }\n };\n\n vm.toggleSharingVisibility = function () {\n vm.sharingVisible = !vm.sharingVisible;\n vm.associatedUsersVisible = false;\n vm.detailsVisible = false;\n $timeout(function () {\n angular.element('#share-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.toggleAssociatedUsersVisibility = function () {\n vm.associatedUsersVisible = !vm.associatedUsersVisible;\n vm.detailsVisible = false;\n vm.sharingVisible = false;\n $timeout(function () {\n angular.element('#associate-autocomplete_value')[0].focus();\n }, 200);\n };\n\n vm.closeCreateCodeModal = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.onSearchSharedItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingUser = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingUser = false;\n profile = profile.plain();\n vm.addShareUser(profile);\n });\n };\n\n vm.onSearchItemSelected = function (item) {\n if (!item) {\n return;\n }\n vm.searchingUser = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingUser = false;\n if (!profile) {\n return;\n }\n profile = profile.plain();\n vm.addUser(profile);\n });\n };\n\n vm.addShareUser = function (userProfile) {\n if (vm.sharedUsers.length === 0 && _.where(vm.sharedUsers, {idUser: userProfile.idUser}).length === 0) {\n vm.sharedUsers.push(userProfile);\n vm.data.userShareEmail = userProfile.email;\n }\n };\n\n vm.removeUserShare = function () {\n vm.sharedUsers = [];\n vm.data.userShareEmail = null;\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.addUser = function (userProfile) {\n if (_.where(vm.associatedUsers, {idUser: userProfile.idUser}).length === 0) {\n vm.associatedUsers.push(userProfile);\n }\n };\n\n vm.showButton = function (index) {\n var r = $document[0].querySelector('[data-delete-btn=\\'' + index + '\\']');\n if (r) {\n angular.element(r).addClass('btn-flip');\n r.querySelector('button').focus();\n }\n };\n\n vm.hideButton = function (index, btn, evt) {\n try {\n angular.element(evt.currentTarget.parentElement).removeClass('btn-flip');\n }\n catch (ex) {\n console.error(ex);\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.receivedLeads\n * @description\n *\n */\n angular\n .module('myMemberships.receivedLeads', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myMemberships.receivedLeads')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.receivedLeads', angular.extend({}, configOptions.defaultStateParams, {\n url: '/received-leads',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n params: {\n leadToOpen: null\n },\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'receivedLeads');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.receivedLeads.controller:ReceivedLeadsCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.receivedLeads')\n .controller('ReceivedLeadsCtrl', ReceivedLeadsCtrl);\n\n function ReceivedLeadsCtrl($stateParams, DataTable, Leads) {\n var vm = this,\n filter;\n vm.statuses = {\n all: 'All leads',\n open: 'Open',\n new: 'New',\n successful: 'Successful',\n unsuccessful: 'Unsuccessful'\n };\n vm.searchLead = '';\n vm.selectedStatus = 'all';\n vm.selectedStatusLabel = 'All leads';\n vm.lastSearched = null;\n\n vm.list = DataTable.create('Leads', 'index', {}, {\n basicParams: {\n type: 'received'\n }\n });\n\n filter = function () {\n vm.list.reload({\n status: vm.selectedStatus,\n search: vm.searchLead\n });\n };\n\n vm.selectStatus = function (leadStatus) {\n vm.selectedStatus = leadStatus;\n vm.selectedStatusLabel = vm.statuses[leadStatus];\n filter();\n };\n\n vm.search = function () {\n if (vm.selectedStatus + vm.searchLead === vm.lastSearched) {\n return;\n }\n filter();\n vm.lastSearched = vm.selectedStatus + vm.searchLead;\n };\n\n vm.openDetail = function ($index) {\n var detailInstance = Leads.openDetail(vm.list.getRecords()[$index], 'received', 'received-leads-ctrl-container');\n if (angular.isDefined(detailInstance)) {\n detailInstance.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.lead)) {\n vm.list.getRecords()[$index] = result.lead;\n }\n });\n }\n };\n\n vm.closeLead = function ($index, status) {\n var result = Leads.closeLead(vm.list.getRecords()[$index], status, 'received-leads-ctrl-container');\n if (result) {\n result.then(function () {\n vm.list.getRecords()[$index].status = status;\n });\n }\n };\n\n if (angular.isObject($stateParams.leadToOpen) && angular.isNumber($stateParams.leadToOpen.id)) {\n Leads.openDetail($stateParams.leadToOpen, 'received', 'received-leads-ctrl-container');\n }\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.memberships\n * @description\n *\n */\n angular\n .module('myMemberships.memberships', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myMemberships.memberships')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.memberships', angular.extend({}, configOptions.defaultStateParams, {\n url: '/memberships',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'memberships');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.memberships.controller:MembershipsCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.memberships')\n .controller('MembershipsCtrl', MembershipsCtrl);\n\n function MembershipsCtrl(DataTable) {\n var vm = this;\n vm.searchName = '';\n vm.tableSubContentVisible = null;\n vm.lastSearched = null;\n vm.list = DataTable.create('Memberships', 'index');\n vm.search = function () {\n if (vm.lastSearched === vm.searchName) {\n return;\n }\n vm.list.reload({\n search: vm.searchName\n });\n vm.lastSearched = vm.searchName;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.joinPod\n * @description\n *\n */\n angular\n .module('myMemberships.joinPod', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myMemberships.joinPod')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myMembershipsJoinPod', {\n url: '/my-memberships/join-pod',\n template: '',\n controller: 'JoinPodCtrl',\n controllerAs: 'joinPod',\n authenticate: true,\n params: {\n user: null,\n nextState: null\n },\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.joinPod.controller:JoinPodModalCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.joinPod')\n .controller('JoinPodModalCtrl', JoinPodModalCtrl);\n\n function JoinPodModalCtrl(Restangular, Notification,\n FormAlerts, $uibModalInstance, myProfile, userProfile) {\n var vm = this;\n vm.isLoading = false;\n\n vm.rewardCodes = {};\n vm.selectedRewardCode = '';\n vm.selectedRewardCodeLabel = 'Reward Code';\n vm.alerts = new FormAlerts();\n vm.user = myProfile;\n vm.targetUser = userProfile;\n vm.isRewardsFormValid = false;\n\n vm.data = {\n firstName: vm.targetUser ? vm.targetUser.firstName : null,\n email: vm.targetUser ? vm.targetUser.email : null,\n creditCard: {},\n phoneMobile: vm.targetUser ? vm.targetUser.phoneMobile : null\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.join = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Restangular.one('Memberships').post('index', vm.data)\n .then(function (response) {\n $uibModalInstance.close(response.receiveLeads);\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to send');\n });\n };\n\n vm.onRewardSelectionChange = function (data, isFormValid) {\n _.extend(vm.data, data);\n vm.isRewardsFormValid = isFormValid;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.joinPod.controller:JoinPodCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.joinPod')\n .controller('JoinPodCtrl', JoinPodCtrl);\n\n function JoinPodCtrl($state, MyMemberships, userProfile) {\n var vm = this;\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(userProfile, null);\n modalInstance.then(function () {\n $state.go('myMemberships');\n }, function () {\n $state.go('myMemberships');\n });\n };\n vm.openAskForLeads();\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships.import\n * @description\n *\n */\n angular\n .module('myMemberships.import', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myMemberships.import')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('myMemberships.import', angular.extend({}, configOptions.defaultStateParams, {\n url: '/import',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n params: {\n leadToOpen: null\n },\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('myMemberships', 'import');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.import.controller:ImportCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships.import')\n .controller('ImportCtrl', ImportCtrl);\n\n function ImportCtrl(Upload, Auth, FormAlerts, Notification) {\n var vm = this;\n vm.downloadTemplateUrl = '/Memberships/importTemplate';\n vm.acceptedFiles = 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,*.xls,*.xlsx';\n vm.isUploading = false;\n vm.importProgressPercent = 0;\n vm.alerts = new FormAlerts();\n vm.importFinished = false;\n vm.alertsExpanded = false;\n\n vm.upload = function (files) {\n if (!vm.isUploading && files && files[0]) {\n vm.isUploading = true;\n vm.importProgressPercent = 0;\n vm.alerts.reset();\n Upload.upload({\n url: Auth.fixApiEndpointUrl('/Memberships/import'),\n data: {file: files[0]},\n method: 'POST'\n })\n .then(function (result) {\n if (result.data.content.status === true) {\n vm.importFinished = true;\n Notification({message: 'Success'}, 'confirmation');\n }\n else {\n angular.forEach(result.data.content.errors, function (item) {\n vm.alerts.add('danger', item.message);\n });\n }\n vm.isUploading = false;\n }, function () {\n vm.alerts.add('danger', 'Unable to import');\n vm.isUploading = false;\n }, function (evt) {\n vm.importProgressPercent = parseInt(100.0 * evt.loaded / evt.total, 10);\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard.memberships\n * @description\n *\n */\n angular\n .module('dashboard.memberships', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.memberships.directive:receivedLeadsList\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.memberships')\n .directive('receivedLeadsList', receivedLeadsList);\n\n function receivedLeadsList() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/memberships/received-leads-list-directive.tpl.html',\n replace: false,\n controllerAs: 'receivedLeadsList',\n controller: function ($scope, $uibModal, Leads) {\n var vm = this;\n vm.name = 'receivedLeadsList';\n vm.list = $scope.list;\n\n vm.openDetail = function ($index) {\n Leads.openDetail(vm.list.records[$index], 'received');\n };\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.memberships.directive:receivedLeadsGraph\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.memberships')\n .directive('receivedLeadsGraph', receivedLeadsGraph);\n\n function receivedLeadsGraph() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/memberships/received-leads-graph-directive.tpl.html',\n replace: false,\n controllerAs: 'receivedLeadsGraph',\n controller: function ($scope, $filter) {\n var vm = this;\n\n vm.chartData = {\n labels: _.map($scope.list, function (day) {\n return $filter('date')(day.date, 'd/M');\n }),\n series: [_.map($scope.list, function (day) {\n return day.leads;\n })]\n };\n\n vm.chartOptions = {\n axisX: {\n showGrid: false,\n showLabel: false\n },\n axisY: {\n showGrid: true,\n showLabel: true,\n low: 0,\n onlyInteger: true\n },\n lineSmooth: false,\n scaleMinSpace: 10,\n height: 400\n };\n\n vm.chartEvents = {\n draw: function (data) {\n var circle;\n if (data.type === 'point') {\n circle = new Chartist.Svg('circle', {\n cx: [data.x],\n cy: [data.y],\n r: [5]\n }, 'ct-circle');\n data.element.replace(circle);\n }\n }\n };\n\n vm.responsiveOptions = [\n ['screen and (min-width: 768px) and (max-width: 991px)', {\n width: 646\n }],\n ['screen and (min-width: 992px) and (max-width: 1199px)', {\n width: 487\n }],\n ['screen and (min-width: 1200px)', {\n width: 590\n }]\n ];\n },\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('dashboard.memberships')\n .config(config);\n\n function config() {\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.memberships.controller:DashboardMembershipsCtrl\n *\n * @description\n *\n */\n angular\n .module('dashboard.memberships')\n .controller('DashboardMembershipsCtrl', DashboardMembershipsCtrl);\n\n function DashboardMembershipsCtrl($scope) {\n var vm = this;\n vm.dailyStats = $scope.dashboard.leadsDailyStats;\n vm.list = $scope.dashboard.receivedLeads;\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard.stats\n * @description\n *\n */\n angular\n .module('dashboard.stats', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('dashboard.stats')\n .config(config);\n\n function config() {\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.stats.controller:StatsCtrl\n *\n * @description\n *\n */\n angular\n .module('dashboard.stats')\n .controller('StatsCtrl', StatsCtrl);\n\n function StatsCtrl($scope, $filter, Charities) {\n var vm = this;\n\n vm.membersCount = $scope.dashboard.membersCount;\n vm.membershipsCount = $scope.dashboard.membershipsCount;\n vm.sentLeadsCount = $scope.dashboard.sentLeadsCount;\n vm.donations = $filter('currency')($scope.dashboard.donations, '$', 0);\n vm.earnings = $filter('currency')($scope.dashboard.earnings.lastMonthEarnings, '$', 0);\n vm.balance = $filter('currency')($scope.dashboard.earnings.actualEarnings, '$', 0);\n vm.isBusinessAccountActive = $scope.dashboard.isBusinessAccountActive;\n\n vm.donationsValue = $scope.dashboard.donations;\n vm.earningsValue = $scope.dashboard.earnings.lastMonthEarnings;\n\n vm.getLatestPods = function () {\n return [];\n };\n\n vm.getMembers = function () {\n return [];\n };\n\n vm.getEarnings = function () {\n return 0;\n };\n\n vm.getBalance = function () {\n return 0;\n };\n\n vm.getDonations = function () {\n return 0;\n };\n\n vm.openDonate = function () {\n Charities.openDonate();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard.pod\n * @description\n *\n */\n angular\n .module('dashboard.pod', [\n 'ui.router',\n 'angular-chartist'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('dashboard.pod')\n .config(config);\n\n function config() {\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.pod.directive:podMembersList\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.pod')\n .directive('podMembersList', podMembersList);\n\n function podMembersList() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/pod/pod-members-list-directive.tpl.html',\n replace: false,\n controllerAs: 'podMembersList',\n controller: function ($scope) {\n var vm = this;\n vm.list = $scope.list;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.pod.directive:podEarningsGraph\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('dashboard.pod')\n .directive('podEarningsGraph', podEarningsGraph);\n\n function podEarningsGraph() {\n return {\n restrict: 'EA',\n scope: {\n list: '=list'\n },\n templateUrl: 'dashboard/pod/pod-earnings-graph-directive.tpl.html',\n replace: false,\n controllerAs: 'podEarningsGraph',\n controller: function ($scope, $filter) {\n var vm = this;\n\n vm.chartData = {\n labels: _.map($scope.list, function (day) {\n return $filter('date')(day.date, 'd/M');\n }),\n series: [_.map($scope.list, function (day) {\n return day.cumulativeEarnings;\n })]\n };\n\n vm.chartOptions = {\n axisX: {\n showGrid: false,\n showLabel: false\n },\n axisY: {\n showGrid: true,\n showLabel: true,\n low: 0,\n onlyInteger: true\n },\n lineSmooth: false,\n scaleMinSpace: 10,\n showArea: true,\n height: 400,\n stretch: true\n };\n\n vm.chartEvents = {\n draw: function (data) {\n var circle;\n if (data.type === 'point') {\n circle = new Chartist.Svg('circle', {\n cx: [data.x],\n cy: [data.y],\n r: [5]\n }, 'ct-circle');\n data.element.replace(circle);\n }\n }\n };\n\n vm.responsiveOptions = [\n ['screen and (min-width: 768px) and (max-width: 991px)', {\n width: 646\n }],\n ['screen and (min-width: 992px) and (max-width: 1199px)', {\n width: 570\n }],\n ['screen and (min-width: 1200px)', {\n width: 688\n }]\n ];\n },\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.pod.controller:PodCtrl\n *\n * @description\n *\n */\n angular\n .module('dashboard.pod')\n .controller('PodCtrl', PodCtrl);\n\n function PodCtrl($scope) {\n var vm = this;\n vm.dailyStats = $scope.dashboard.earningsDailyStats;\n vm.list = $scope.dashboard.members;\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui\n * @description\n *\n */\n angular\n .module('components.ui', [\n 'components.ui.table',\n 'components.ui.tabs'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.ui.service:PromptDialog\n *\n * @description\n *\n */\n angular\n .module('components.ui')\n .service('PromptDialog', PromptDialog);\n\n function PromptDialog($document, $uibModal) {\n var self = this;\n\n /**\n * Opens up a modal dialog\n * @param {string} content Content message\n * @param {string} onConfirmMessage Confirmation message\n * @param {string} confirmButtonLabel Label to display on confirm button\n * @param {string} cancelButtonLabel Label to display on cancel button\n * @returns {*} Modal instance\n */\n self.open = function (content, onConfirmMessage, confirmButtonLabel, cancelButtonLabel) {\n var instance;\n\n instance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'components/ui/prompt-dialog.tpl.html',\n controller: 'PromptDialogCtrl',\n controllerAs: 'promptDialog',\n size: 'md',\n resolve: {\n content: function () {\n return content;\n },\n onConfirmMessage: function () {\n return onConfirmMessage;\n },\n cancelButtonLabel: function () {\n return cancelButtonLabel;\n },\n confirmButtonLabel: function () {\n return confirmButtonLabel;\n }\n }\n });\n\n return instance.result;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name components.ui.controller:PromptDialogCtrl\n *\n * @description\n *\n */\n angular\n .module('components.ui')\n .controller('PromptDialogCtrl', PromptDialogCtrl);\n\n function PromptDialogCtrl($timeout, $uibModalInstance, content, onConfirmMessage, cancelButtonLabel, confirmButtonLabel) {\n var vm = this;\n\n vm.content = content;\n vm.onConfirmMessage = onConfirmMessage;\n vm.isConfirmed = false;\n vm.cancelButtonLabel = cancelButtonLabel ? cancelButtonLabel : 'No';\n vm.confirmButtonLabel = confirmButtonLabel ? confirmButtonLabel : 'Yes';\n\n vm.confirm = function () {\n vm.isConfirmed = true;\n if (vm.onConfirmMessage) {\n $timeout(function () {\n $uibModalInstance.close();\n }, 3000);\n }\n else {\n $uibModalInstance.close();\n }\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.table.directive:creditCard\n * @restrict E\n * @element\n */\n angular\n .module('components.ui')\n .directive('creditCard', creditCard);\n\n function creditCard() {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n ccData: '=',\n ccShowForm: '&',\n creditCard: '='\n },\n\n // creditCard - is the existing credit card info\n // ccData - is the object into which the new credit card info will be stored (two-way)\n // ccShowForm - whether to show the new ccForm or not\n // user - userProfile from which the data will be source. might be duplicated as creditCard is directly belonging to him already.\n\n replace: true,\n transclude: false,\n templateUrl: 'components/ui/credit-card-directive.tpl.html',\n controllerAs: 'cc',\n controller: ['$scope', 'CreditCardUtil', function ($scope, CreditCardUtil) {\n var vm = this;\n vm.months = CreditCardUtil.getExpiryMonths();\n vm.years = CreditCardUtil.getExpiryYears();\n vm.cards = CreditCardUtil.getAcceptedCards();\n\n // Scope variables in the controller\n vm.scope = $scope;\n\n if (vm.scope.ccData) {\n vm.scope.ccData = {\n method: angular.isObject(vm.scope.creditCard) && angular.isDefined(vm.scope.creditCard.number) ? 'old' : 'new'\n };\n }\n\n //\n vm.showCCForm = function (form) {\n var showForm = false;\n if (angular.isFunction(vm.scope.ccShowForm) && angular.isDefined(vm.scope.ccShowForm())) {\n showForm = vm.newCard || vm.scope.ccShowForm();\n }\n else if (vm.scope.creditCard && vm.scope.creditCard.number && !vm.newCard) {\n showForm = false;\n }\n else if (vm.scope.creditCard && vm.scope.creditCard.number && vm.newCard) {\n showForm = true;\n }\n else if (!vm.scope.creditCard || !vm.scope.creditCard.number) {\n showForm = true;\n }\n if (!showForm && form) {\n vm.clearForm(form);\n }\n return showForm;\n };\n\n //\n vm.closeCCForm = function (form) {\n vm.scope.ccData = {};\n vm.newCard = false;\n if (form) {\n vm.clearForm(form);\n }\n vm.scope.ccData.method = 'old';\n };\n\n //\n vm.clearForm = function (form) {\n delete form.$error.ccExp;\n delete form.$error.ccNumber;\n delete form.$error.ccNumberType;\n delete form.$error.ccExpMonth;\n delete form.$error.ccExpYear;\n\n if (form.$$parentForm) {\n delete form.$$parentForm.$error.ccExp;\n delete form.$$parentForm.$error.ccNumber;\n delete form.$$parentForm.$error.ccNumberType;\n delete form.$$parentForm.$error.ccExpMonth;\n delete form.$$parentForm.$error.ccExpYear;\n }\n };\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('components.ui')\n .directive('contentSlider', contentSlider);\n\n function contentSlider($rootScope, $window, $timeout) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n\n var contents,\n container,\n headers,\n buttons,\n el,\n parseContents,\n computeSize,\n width,\n currentStep = 0,\n currentContent,\n stepToClickHandler,\n manageHeightAndVisibility,\n updateHeader,\n eventHandler;\n\n stepToClickHandler = function (btn, stepId) {\n angular.element(btn).click(stepId, scope.stepTo);\n };\n\n updateHeader = function () {\n angular.forEach(headers, function (header) {\n var headerStep;\n header = angular.element(header);\n headerStep = header.attr('data-step-id');\n\n if (angular.isUndefined(headerStep)) {\n return;\n }\n headerStep = Number(headerStep);\n if (headerStep <= currentStep) {\n header.addClass('active');\n }\n else {\n header.removeClass('active');\n }\n });\n };\n\n manageHeightAndVisibility = function (isResize) {\n var lastContent = currentContent;\n\n angular.forEach(contents, function (content) {\n var targetStep;\n content = angular.element(content);\n targetStep = angular.element(content).attr('data-step-id');\n if (angular.isUndefined(targetStep)) {\n return;\n }\n targetStep = Number(targetStep);\n\n if (targetStep === currentStep) {\n computeSize(content);\n currentContent = content;\n\n if (lastContent && !isResize) {\n // The currentContent becomes previous content. Hide it.\n lastContent.css({\n visibility: 'hidden',\n height: '0px',\n opacity: 0\n });\n }\n }\n });\n };\n\n computeSize = function (content) {\n var contentHeight;\n // Fix the height so it doesn't 'jump' when setting the child content to 'auto'\n container.css({\n height: container[0].clientHeight + 'px'\n });\n\n // Set the target content to be visible, non-transparent and reset its height\n // Try to calculate the height. Temporarily set it to auto, calculate content and apply.\n content.css('height', 'auto');\n contentHeight = content[0].clientHeight;\n\n content.css({\n visibility: 'visible',\n opacity: 1,\n height: contentHeight + 'px'\n });\n container.css({\n height: contentHeight + 'px'\n });\n\n // That will last 0.2s and apply auto height (due to the dynamic content that might be there. You don't\n // want fixed height then\n $timeout(function () {\n content.css('height', 'auto');\n container.css('height', 'auto');\n }, 200);\n };\n\n parseContents = function (isResize, stepTo) {\n el = element;\n\n // These are the containers\n contents = angular.element('.step-content', el);\n container = angular.element('.stepped-container', el);\n buttons = angular.element('button[data-step-to], a[data-step-to]', el);\n headers = angular.element('.step[data-step-id]');\n\n if (contents.length === 0 || container.length === 0) {\n // Not much to do\n return;\n }\n\n // First, make sure we stretch the container to some width wide enough so the scrollbar doesn't appear as that would\n // wrongly calculate the width with the scrollbar included to our contents.\n container.width('10000px');\n\n width = el.width();\n\n // Calculate the width of the individual contents\n contents.css({\n width: width + 'px'\n });\n\n // Calculate the width of the wrapper\n container.css({\n width: width * contents.length + 'px',\n overflow: 'hidden',\n position: 'relative',\n transform: 'translateX(0px)',\n transition: 'all 0.2s ease-in-out',\n whiteSpace: 'nowrap'\n });\n\n if (!isResize) {\n // We must set the visibility: hidden so the focus on elements is disabled!\n angular.forEach(contents, function (cnt, idx) {\n if (idx !== 0) {\n angular.element(cnt).css({\n visibility: 'hidden'\n });\n }\n });\n\n // Bind the step to to our function\n angular.forEach(buttons, function (btn) {\n var stepId = angular.element(btn).attr('data-step-to');\n if (angular.isUndefined(stepId)) {\n return;\n }\n stepToClickHandler(btn, Number(stepId));\n });\n\n // Set the first content to\n currentContent = angular.element(contents[0]);\n currentContent.css({\n height: 'auto',\n visibility: 'visible'\n });\n container.css('height', 'auto');\n updateHeader();\n }\n else {\n scope.stepTo({\n data: angular.isDefined(stepTo) ? stepTo : currentStep,\n isResize: true\n });\n }\n };\n\n scope.stepTo = function (evt) {\n var stepId = evt.data,\n shiftBy = -1 * stepId * width;\n\n if (stepId === currentStep && !evt.isResize) {\n return;\n }\n\n container.css('transform', 'translateX(' + shiftBy + 'px)');\n currentStep = stepId;\n manageHeightAndVisibility(evt.isResize);\n updateHeader();\n };\n\n angular.element($window).on('resize', function () {\n parseContents(true);\n });\n\n eventHandler = $rootScope.$on('event:slider-do-layout', function (evtName, data) {\n $timeout(function () {\n if (data && data.stepTo >= 0) {\n parseContents(true, data.stepTo);\n }\n else {\n parseContents(true, currentStep ? currentStep : 0);\n }\n }, data && data.delay ? data.delay : 100);\n });\n scope.$on('$destroy', eventHandler);\n\n $timeout(function () {\n parseContents();\n }, 100);\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.directive:appsStoreLinks\n * @restrict EA\n * @element\n *\n */\n angular\n .module('components.ui')\n .directive('appsStoreLinks', appsStoreLinks);\n\n function appsStoreLinks($window, $document, $rootScope) {\n return {\n restrict: 'EA',\n scope: {},\n replace: true,\n templateUrl: 'components/ui/apps-store-links-directive.tpl.html',\n link: function (scope) {\n var watchHandle;\n scope.isAvailable = true;\n scope.isAuthenticated = $rootScope.isAuthenticated;\n\n // Check if the navigator has the \"gonative\" userAgent to determine whether it's the \"app\" or the \"web\"\n if ($window.navigator.userAgent.indexOf('gonative') > -1) {\n scope.isAvailable = false;\n }\n else if (!scope.isAuthenticated) {\n // Add the css class to adjust the app content a little\n angular.element($document[0].body).addClass('has-appsdownload-links');\n }\n watchHandle = $rootScope.$watch('isAuthenticated', function () {\n scope.isAuthenticated = $rootScope.isAuthenticated;\n if (scope.isAvailable) {\n if (scope.isAuthenticated) {\n angular.element($document[0].body).removeClass('has-appsdownload-links');\n }\n else {\n angular.element($document[0].body).addClass('has-appsdownload-links');\n }\n }\n });\n $rootScope.$on('$destroy', watchHandle);\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.ui.directive:actionToolbar\n * @restrict A\n * @element\n *\n * @description\n *\n */\n angular\n .module('components.ui')\n .directive('actionToolbar', actionToolbar);\n\n function actionToolbar($window, $rootScope, $document, $timeout, Raven) {\n var toolbarEl,\n primaryContainer,\n secondaryContainer,\n angularRootScope,\n angularTimeout,\n scrollingElement,\n isPrimaryVisible = false,\n isSecondaryVisible = false,\n checkScrollFn,\n setVisibilityFn,\n checkVisibilityFn,\n checkVisibilityValsFn,\n lastScrollTop = 0,\n stateChanging = false,\n timeoutPromise,\n instances = {\n primary: {},\n secondary: {}\n };\n\n function getScrollingElement() {\n var d = $document[0];\n return d.documentElement.scrollHeight > d.body.scrollHeight && d.compatMode.indexOf('CSS1') === 0 ? d.documentElement : d.body;\n }\n\n //\n checkScrollFn = function () {\n var scrollTop,\n diff;\n\n // Get the document's scrolling element. Sometimes it's HTML and sometime body.\n scrollingElement = scrollingElement || $document[0].scrollingElement || getScrollingElement();\n\n if (!scrollingElement) {\n // Something is not right.\n Raven.captureMessage('actionToolbar: unable to get the scrolling element.', {\n level: 'warning'\n });\n return;\n }\n\n scrollTop = scrollingElement.scrollTop;\n diff = Math.abs(lastScrollTop - scrollTop);\n\n if (scrollTop < 0 || diff < 20) {\n return;\n }\n\n if (lastScrollTop > scrollTop) {\n setVisibilityFn(true, null, true);\n }\n else {\n setVisibilityFn(false, null, true);\n }\n\n lastScrollTop = scrollTop;\n };\n\n //\n checkVisibilityValsFn = function () {\n // If the state is changing then just forget it\n if (stateChanging) {\n return;\n }\n\n // And finally set the action toolbar's visibility if any of those are visible (primary / secondary)\n if (isPrimaryVisible || isSecondaryVisible) {\n setVisibilityFn(true, null, true);\n }\n else {\n setVisibilityFn(false, null, true);\n }\n };\n\n //\n setVisibilityFn = function (visible, container, broadcast) {\n var el = container || toolbarEl;\n if (visible) {\n el.addClass('visible');\n if (broadcast) {\n angularTimeout(function () {\n angularRootScope.$broadcast('event:action-toolbar-visible', el[0].clientHeight);\n }, 200);\n }\n }\n else {\n el.removeClass('visible');\n if (broadcast) {\n angularTimeout(function () {\n angularRootScope.$broadcast('event:action-toolbar-hidden');\n }, 200);\n }\n }\n };\n\n // Check if there is any elements at all.\n checkVisibilityFn = function (isSecondary) {\n var container = isSecondary ? secondaryContainer : primaryContainer,\n transcludedContainer,\n isVisible = false;\n\n // Check if the container has any nodes.\n // The structure of these has changed since implementing the scroll-check directive. we need to travarse few more nodes.\n transcludedContainer = angular.element('.transcluded-content', container[0]);\n if (container[0] && transcludedContainer[1] && transcludedContainer[1].childElementCount > 0) {\n isVisible = true;\n }\n\n if (isSecondary && (!isSecondaryVisible && isVisible || isSecondaryVisible && !isVisible)) {\n isSecondaryVisible = isVisible;\n setVisibilityFn(isVisible, container, false);\n checkVisibilityValsFn();\n }\n else if (!isSecondary && (!isPrimaryVisible && isVisible || isPrimaryVisible && !isVisible)) {\n isPrimaryVisible = isVisible;\n setVisibilityFn(isVisible, container, false);\n checkVisibilityValsFn();\n }\n };\n\n return {\n restrict: 'E',\n scope: true,\n transclude: true,\n replace: true,\n templateUrl: 'components/ui/action-toolbar-directive.tpl.html',\n link: function (scope, element, attrs) {\n var windowScrollHandle,\n stateChangingHandle,\n stateChangedHandle,\n watchHandle,\n transcludedContainer,\n isSecondary = attrs.atTarget && attrs.atTarget === 'secondary',\n id = (new Date()).getTime();\n\n scope.id = id;\n\n // Main Element. First instance ever.\n if (!toolbarEl) {\n toolbarEl = angular.element('
    ');\n $document[0].body.appendChild(toolbarEl[0]);\n // Append to toolbar element\n toolbarEl.append(element);\n\n // Get the primary and secondary container\n primaryContainer = angular.element('.primary-container', toolbarEl);\n secondaryContainer = angular.element('.secondary-container', toolbarEl);\n\n // Some references for angular functions\n angularRootScope = $rootScope;\n angularTimeout = $timeout;\n }\n\n if (!isPrimaryVisible && !isSecondaryVisible) {\n // Subscribe to the scroll event. just once is enough as this widget will never be actually destroyed\n windowScrollHandle = angular.element($window.document).on('scroll', checkScrollFn);\n\n // Let's try this\n watchHandle = $rootScope.$watch(function () {\n if (timeoutPromise) {\n $window.clearTimeout(timeoutPromise);\n }\n timeoutPromise = $window.setTimeout(function () {\n checkVisibilityFn(true);\n checkVisibilityFn(false);\n }, 150);\n });\n\n // Subsribe to our state changing events\n stateChangingHandle = $rootScope.$on('event:app-state-changing', function () {\n stateChanging = true;\n setVisibilityFn(false);\n });\n stateChangedHandle = $rootScope.$on('event:app-state-changed', function () {\n stateChanging = false;\n checkVisibilityFn(isSecondary);\n });\n }\n\n // Get the element references.\n transcludedContainer = angular.element('#at-transcluded', element);\n\n // Check the attrs for the target and extract and reposition the data and update the instances content\n if (isSecondary) {\n secondaryContainer[0].innerHTML = '';\n secondaryContainer.append(transcludedContainer);\n instances.secondary[id] = transcludedContainer;\n }\n else {\n primaryContainer[0].innerHTML = '';\n primaryContainer.append(transcludedContainer);\n instances.primary[id] = transcludedContainer;\n }\n checkVisibilityFn(isSecondary);\n\n scope.$on('$destroy', function () {\n // Ok we have to recognize what type of target has just been destroyed. (primary, secondary..?)\n if (isSecondary) {\n instances.secondary[id].remove();\n }\n else {\n instances.primary[id].remove();\n }\n checkVisibilityFn(isSecondary);\n\n if (!isPrimaryVisible && !isSecondaryVisible) {\n if (angular.isFunction(watchHandle)) {\n watchHandle();\n }\n if (angular.isFunction(windowScrollHandle)) {\n windowScrollHandle();\n }\n if (angular.isFunction(stateChangingHandle)) {\n stateChangingHandle();\n }\n if (angular.isFunction(stateChangedHandle)) {\n stateChangedHandle();\n }\n }\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.profile\n * @description\n *\n */\n angular\n .module('account.profile', [\n 'ui.router',\n 'ngFileUpload',\n 'uiCropper',\n 'ngjsColorPicker',\n 'colorpicker.module'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('account.profile')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('account.profile', angular.extend({}, configOptions.defaultStateParams, {\n url: '/profile',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('account', 'profile');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.profile.controller:ProfileCtrl\n *\n * @description\n *\n */\n angular\n .module('account.profile')\n .controller('ProfileCtrl', ProfileCtrl);\n\n function ProfileCtrl($document, $rootScope, $scope, $timeout, $state, $uibModal, Notification, configOptions, Restangular, Location, Session, FormAlerts, Industries) {\n var vm = this,\n configDefaults;\n vm.alerts = new FormAlerts();\n vm.isBusinessAccount = false;\n vm.isLoading = true;\n vm.isLoadingBackgroundImg = false;\n vm.isSavingBackgound = false;\n vm.photoFile = null;\n vm.backgroundFile = null;\n vm.imageEditMode = false;\n vm.isDragging = false;\n vm.backgroundStyleBkp = null;\n vm.resetRequested = false;\n\n // options for color picker\n vm.customOptions = {\n size: 28,\n roundCorners: true\n };\n vm.customColors = [null, '#000000', '#ffffff', '#ffc0cb', '#008080', '#ffe4e1', '#ff0000', '#ffd700', '#d3ffce', '#00ffff', '#ff7373', '#40d0e0', '#e6e6fa'];\n vm.customHeadlineColors = ['#3b374b', '#ffffff'];\n\n configDefaults = {\n selectedColor: '#fffffa',\n headlineColor: '#3b374a',\n keepPattern: true,\n backgroundFile: null\n };\n\n vm.defaults = _.clone(configDefaults);\n\n // Background Edits\n vm.edits = {\n patternEdited: false,\n colorEdited: false,\n headlineEdited: false,\n imageEdited: false\n };\n\n vm.data = {\n address: {},\n addressPostal: {}\n };\n Industries.isReady.then(function () {\n vm.industries = Industries.getConsolidatedList();\n });\n vm.getCountries = Location.getCountries;\n vm.getStates = function () {\n return Location.getStates(vm.data.addressPostal.idCountryPostal);\n };\n\n Session.getUserProfile()\n .then(function (userProfile) {\n vm.userProfile = userProfile;\n vm.data.firstName = vm.userProfile.firstName;\n vm.data.lastName = vm.userProfile.lastName;\n vm.data.email = vm.userProfile.email;\n vm.data.phoneMobile = vm.userProfile.phoneMobile;\n vm.data.businessName = vm.userProfile.businessName;\n vm.data.description = vm.userProfile.description;\n vm.data.website = vm.userProfile.website;\n vm.data.location = vm.userProfile.location;\n vm.data.address.streetAddress = vm.userProfile.streetAddress;\n vm.data.address.suburb = vm.userProfile.suburb;\n vm.data.address.state = vm.userProfile.state;\n vm.data.address.postCode = vm.userProfile.postCode;\n vm.data.address.country = vm.userProfile.country;\n vm.data.addressPostal = vm.userProfile.addressPostal;\n if (angular.isObject(vm.userProfile.addressPostal) && angular.isDefined(vm.userProfile.addressPostal.idCountryPostal) && !!vm.userProfile.addressPostal.idCountryPostal) {\n vm.data.addressPostal.idCountryPostal = vm.userProfile.addressPostal.idCountryPostal.toString();\n }\n if (angular.isObject(vm.userProfile.addressPostal) && angular.isDefined(vm.userProfile.addressPostal.idStatePostal) && !!vm.userProfile.addressPostal.idStatePostal) {\n vm.data.addressPostal.idStatePostal = vm.userProfile.addressPostal.idStatePostal.toString();\n }\n\n if (vm.userProfile && vm.userProfile.isBusinessAccountActive) {\n vm.isBusinessAccount = true;\n }\n\n vm.selectedClassification = {};\n\n if (angular.isObject(vm.userProfile.industry)) {\n vm.data.idClassification = vm.userProfile.industry.id.toString();\n vm.selectedClassification = {id: vm.userProfile.industry.id, name: vm.userProfile.industry.name};\n }\n if (angular.isObject(vm.userProfile.subIndustry)) {\n vm.data.idClassification = vm.userProfile.subIndustry.id.toString();\n vm.selectedClassification = {id: vm.userProfile.subIndustry.id, name: vm.userProfile.industry.name + ' - ' + vm.userProfile.subIndustry.name};\n }\n else {\n vm.data.idClassification = null;\n }\n\n // We need to hold the background style object as the backup.\n vm.backgroundStyleBkp = _.clone(vm.getCoverStyle(vm.userProfile));\n vm.clearData();\n\n vm.isLoading = false;\n });\n\n vm.save = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Session.updateUserProfile(vm.data)\n .then(function (profile) {\n vm.userProfile = profile;\n $state.reload();\n Notification({message: 'Your profile has been successfully updated'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to save');\n });\n };\n\n vm.hasPhoto = function () {\n return !!vm.userProfile.imageToken;\n };\n\n vm.removePhoto = function () {\n vm.isLoading = true;\n Session.removePhoto()\n .then(function (profile) {\n vm.userProfile = profile;\n $state.reload();\n Notification({message: 'Your photo has been removed'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n });\n };\n\n vm.uploadPhoto = function () {\n var modalInstance;\n if (vm.photoFile !== null) {\n modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].getElementById('profile-ctrl-container')),\n templateUrl: 'account/profile/photo-upload.tpl.html',\n controller: 'PhotoUploadCtrl',\n controllerAs: 'photoUpload',\n size: 'lg',\n resolve: {\n photoFile: vm.photoFile\n }\n });\n\n modalInstance.result.then(function (result) {\n if (angular.isDefined(result.userProfile)) {\n Notification({message: 'Your photo has been successfully updated'}, 'confirmation');\n vm.userProfile = result.userProfile;\n }\n });\n }\n };\n\n vm.placeChangedCallback = function (address) {\n vm.data.address = address;\n };\n\n vm.onCountryChange = function () {\n vm.data.addressPostal.idStatePostal = '';\n };\n\n vm.onClassificationSelect = function (classification) {\n if (angular.isObject(classification) && angular.isObject(classification.originalObject)) {\n vm.data.idClassification = classification.originalObject.id;\n }\n };\n\n vm.getAddress = function () {\n var addressParts = [];\n if (vm.userProfile.suburb) {\n addressParts.push(vm.userProfile.suburb);\n }\n if (vm.userProfile.state) {\n addressParts.push(vm.userProfile.state);\n }\n if (vm.userProfile.country) {\n addressParts.push(vm.userProfile.country);\n }\n\n vm.addressLink = vm.userProfile.addressPostal && vm.userProfile.addressPostal.addressPostal ? vm.userProfile.addressPostal.addressPostal + ', ' + addressParts.join(', ') : addressParts.join(', ');\n return addressParts.join(', ');\n };\n\n vm.formatWebsiteUrl = function () {\n var url = '';\n if (angular.isDefined(vm.userProfile) && angular.isString(vm.userProfile.website)) {\n url = vm.userProfile.website;\n if (url !== '') {\n if ((url.slice(0, 4)).toLowerCase() !== 'http') {\n url = 'http://' + vm.userProfile.website;\n }\n }\n }\n\n return url;\n };\n\n vm.deactivateAccount = function () {\n // Let's open the modal.\n $uibModal.open({\n animation: false,\n templateUrl: 'account/profile/deactivate-modal.tpl.html',\n controller: 'DeactivateModalCtrl',\n controllerAs: 'ctrl',\n size: 'md',\n resolve: {\n userProfile: vm.userProfile\n }\n });\n };\n\n /*\n Background Editing\n */\n\n vm.resetToDefault = function () {\n vm.resetRequested = true;\n vm.changingColor = false;\n vm.bkgData.backgroundFile = null;\n vm.backgroundFile = null;\n };\n\n vm.uploadBackgroundPhoto = function () {\n if (vm.backgroundFile) {\n vm.imageUploadMode = true;\n vm.edits.imageEdited = true;\n // We need to clear the color\n if (vm.bkgData.selectedColor === vm.defaults.selectedColor) {\n vm.edits.colorEdited = true;\n }\n vm.bkgData.selectedColor = null;\n }\n else {\n vm.imageUploadMode = false;\n }\n };\n\n vm.removeBkgPhoto = function () {\n if (vm.bkgData.backgroundFile === vm.defaults.backgroundFile) {\n vm.edits.imageEdited = true;\n }\n\n vm.backgroundFile = null;\n vm.bkgData.backgroundFile = null;\n vm.imageUploadMode = false;\n };\n\n vm.getProfileStyle = function () {\n var obj = _.clone(vm.backgroundStyleBkp) || {\n 'background-color': 'none',\n 'background-blend-mode': 'inherit'\n };\n\n if (vm.resetRequested) {\n return {};\n }\n\n if (vm.imageEditMode) {\n obj = {\n 'background-color': vm.bkgData.selectedColor\n };\n\n if (vm.bkgData.selectedColor !== vm.defaults.selectedColor) {\n vm.edits.colorEdited = true;\n }\n }\n\n if (!vm.imageEditMode || !vm.edits.patternEdited && !vm.edits.colorEdited && !vm.edits.imageEdited) {\n return vm.backgroundStyleBkp;\n }\n\n if (vm.bkgData.keepPattern || vm.edits.colorEdited && vm.bkgData.selectedColor !== vm.defaults.selectedColor) {\n if (vm.bkgData.keepPattern) {\n obj.backgroundImage = 'url(\"/images/user-profile-pattern.png\")';\n obj.backgroundBlendMode = 'luminosity';\n obj.backgroundPosition = 'center center';\n }\n else {\n obj.backgroundImage = 'none';\n }\n }\n else {\n obj.backgroundImage = 'none';\n }\n\n if (vm.bkgData.backgroundFile) {\n obj.backgroundImage = 'url(\"' + vm.bkgData.backgroundFile + '\")';\n obj.backgroundBlendMode = 'luminosity';\n obj.backgroundPosition = 'center center';\n }\n\n return obj;\n };\n\n vm.getHeadlineStyle = function () {\n var obj = {\n color: vm.bkgData.headlineColor\n };\n\n if (vm.resetRequested) {\n return {};\n }\n\n if (vm.bkgData.headlineColor !== vm.defaults.headlineColor) {\n vm.edits.headlineEdited = true;\n return obj;\n }\n return obj;\n };\n\n vm.clearColourSettings = function () {\n // vm.bkgData.selectedColor = vm.defaults.selectedColor;\n // vm.bkgData.headlineColor = vm.defaults.headlineColor;\n if (vm.bkgData.selectedColor === vm.defaults.selectedColor) {\n vm.edits.colorEdited = true;\n }\n\n if (vm.bkgData.headlineColor === vm.defaults.headlineColor) {\n vm.edits.headlineColorEdited = true;\n }\n\n vm.bkgData.selectedColor = null;\n vm.bkgData.headlineColor = null;\n };\n\n vm.clearData = function () {\n vm.bkgData = {\n selectedColor: vm.defaults.selectedColor,\n keepPattern: vm.defaults.keepPattern,\n headlineColor: vm.defaults.headlineColor,\n backgroundFile: vm.defaults.backgroundFile\n };\n\n vm.edits = {\n patternEdited: false,\n colorEdited: false,\n headlineColorEdited: false,\n imageEdited: false\n };\n\n vm.backgroundFile = null;\n vm.imageUploadMode = false;\n vm.changingColor = false;\n vm.resetRequested = false;\n };\n\n vm.close = function () {\n vm.clearData();\n vm.imageEditMode = false;\n vm.imageUploadMode = false;\n vm.backgroundFile = null;\n };\n\n vm.hasEdits = function () {\n var hasEdits = false;\n angular.forEach(Object.keys(vm.edits), function (key) {\n if (!hasEdits) {\n hasEdits = vm.edits[key];\n }\n });\n return hasEdits;\n };\n\n /*\n This will revert any changes and remove any records for the user in the backend so it will display the default image only\n */\n vm.resetBackgroundData = function () {\n vm.isSavingBackgound = true;\n Restangular.one('UserConfiguration').customDELETE('cover').then(function () {\n Session.updateLocalUserProfile({\n profileConfiguration: {\n coverBackground: null\n }\n }, true);\n Notification({message: 'Success'}, 'success');\n vm.userProfile.profileConfiguration.coverBackground = null;\n // Store the backgup\n vm.backgroundStyleBkp = _.clone(vm.getCoverStyle(vm.userProfile));\n // Close and clear data.\n vm.close();\n }, function () {\n Notification({message: 'Failed to reset the profile'}, 'error');\n }).finally(function () {\n vm.isSavingBackgound = false;\n });\n };\n\n vm.saveBackgroundEdits = function () {\n var data;\n vm.isSavingBackgound = true;\n\n // Get the data\n data = {\n config: {\n keepPattern: vm.bkgData.keepPattern,\n backgroundColor: vm.bkgData.selectedColor !== configDefaults.selectedColor ? vm.bkgData.selectedColor : null,\n textColor: vm.bkgData.headlineColor !== configDefaults.headlineColor ? vm.bkgData.headlineColor : null\n }\n };\n\n if (vm.bkgData.backgroundFile && vm.edits.imageEdited) {\n data.image = vm.bkgData.backgroundFile;\n }\n else if (!vm.bkgData.backgroundFile && !vm.bkgData.keepPattern) {\n data.image = null;\n }\n else if (!vm.bkgData.backgroundFile && vm.edits.imageEdited) {\n data.image = null;\n }\n\n Restangular.one('UserConfiguration').customPUT(data, 'cover')\n .then(function (result) {\n // Update the global profile object\n Session.updateLocalUserProfile({\n profileConfiguration: {\n coverBackground: {\n imageToken: result.plain().imageToken,\n config: result.plain().config\n }\n }\n }, true);\n Notification({message: 'Success'}, 'success');\n vm.userProfile.profileConfiguration.coverBackground.imageToken = result.plain().imageToken;\n vm.userProfile.profileConfiguration.coverBackground.config = result.plain().config;\n // Store the backgup\n vm.backgroundStyleBkp = _.clone(vm.getCoverStyle(vm.userProfile));\n // Close and clear data.\n vm.close();\n }, function () {\n Notification({message: 'Failed to update the profile'}, 'error');\n }).finally(function () {\n vm.isSavingBackgound = false;\n });\n };\n\n vm.getCoverStyle = function (profile) {\n var coverCss = {};\n // Reset vm defaults\n vm.defaults = {\n selectedColor: null,\n headlineColor: null,\n keepPattern: null,\n backgroundFile: null\n };\n // Set the user profile style from style config\n if (profile.profileConfiguration && profile.profileConfiguration.coverBackground) {\n // Start with the pattern as that has lower priority than the background file.\n if (profile.profileConfiguration.coverBackground.config && profile.profileConfiguration.coverBackground.config.keepPattern) {\n coverCss.backgroundImage = 'url(\"/images/user-profile-pattern.png\")';\n vm.defaults.keepPattern = true;\n }\n else {\n coverCss.backgroundImage = 'none';\n vm.defaults.keepPattern = false;\n }\n\n // Check if the user opted for his own background image or wants to use provided pattern or plain color. Color can be combined with both\n // so it's in separate 'if' statement.\n if (profile.profileConfiguration.coverBackground.imageToken) {\n coverCss.backgroundImage = 'url(\"' + configOptions.baseUrl + '/UserConfiguration/coverPicture/' + profile.profileConfiguration.coverBackground.imageToken + '\")';\n coverCss.backgroundPosition = 'center top';\n coverCss.backgroundSize = '1140px 215px';\n vm.defaults.backgroundFile = configOptions.baseUrl + '/UserConfiguration/coverPicture/' + profile.profileConfiguration.coverBackground.imageToken;\n }\n\n if (profile.profileConfiguration.coverBackground.config) {\n if (profile.profileConfiguration.coverBackground.config.backgroundColor) {\n coverCss.backgroundColor = profile.profileConfiguration.coverBackground.config.backgroundColor;\n coverCss.backgroundBlendMode = 'luminosity';\n vm.defaults.selectedColor = profile.profileConfiguration.coverBackground.config.backgroundColor;\n }\n if (profile.profileConfiguration.coverBackground.config.textColor) {\n vm.defaults.headlineColor = profile.profileConfiguration.coverBackground.config.textColor;\n }\n }\n }\n else {\n vm.defaults = _.clone(configDefaults);\n }\n return coverCss;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.profile.controller:PhotoUploadCtrl\n *\n * @description\n *\n */\n angular\n .module('account.profile')\n .controller('PhotoUploadCtrl', PhotoUploadCtrl);\n\n function PhotoUploadCtrl($uibModalInstance, Session, photoFile) {\n var vm = this;\n vm.photoFile = photoFile || '';\n vm.croppedDataUrl = '';\n vm.isLoading = false;\n\n vm.ok = function () {\n vm.isLoading = true;\n Session.updatePhoto(vm.croppedDataUrl)\n .then(function (userProfile) {\n $uibModalInstance.close({userProfile: userProfile});\n }, function () {\n vm.isLoading = true;\n });\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.preferences\n * @description\n *\n */\n angular\n .module('account.preferences', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.profile.controller:DeactivateModalCtrl\n *\n * @description\n *\n */\n angular\n .module('account.preferences')\n .controller('DeactivateModalCtrl', DeactivateModalCtrl);\n\n function DeactivateModalCtrl($rootScope, $state, $timeout, $uibModalInstance, Restangular, Notification, Auth, userProfile, Session) {\n var vm = this;\n vm.isDeactivating = false;\n vm.isBusinessAccount = false;\n vm.timeOut = Auth.localSignoutTimeout + 10;\n vm.user = angular.copy(userProfile);\n\n if (vm.user && vm.user.isBusinessAccountActive) {\n vm.isBusinessAccount = true;\n }\n\n vm.data = {\n wholeAccount: !vm.isBusinessAccount,\n message: ''\n };\n\n vm.deactivate = function () {\n vm.isDeactivating = true;\n\n if (vm.data.wholeAccount) {\n Restangular.one('Users').customPUT({message: vm.data.feedback}, 'deactivate').then(function () {\n Notification({message: 'Deactivation was successful'}, 'confirmation');\n signOutAndRedirect('accountSignInUp.accountSignIn');\n }).catch(function () {\n Notification({message: 'Unable to deactivate your account, please try again or contact us.'}, 'error');\n $uibModalInstance.close();\n });\n }\n else {\n // Use the business deactivation api\n Restangular.one('BusinessAccount').customPUT({message: vm.data.feedback}, 'deactivate').then(function (result) {\n var profile = result.profile;\n profile.isBusinessAccountActive = result.isBusinessAccountActive;\n Session.create(profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n Notification({message: 'Deactivation was successful'}, 'confirmation');\n $state.go('dashboard');\n $uibModalInstance.close();\n }).catch(function () {\n Notification({message: 'Unable to deactivate your business account account, please try again or contact us.'}, 'error');\n $uibModalInstance.close();\n });\n }\n };\n\n function signOutAndRedirect(redirectTo) {\n Auth.signOut(false);\n\n // We have to do this in the timeout as the AUTH service uses timeout as well due to some rendering issues.\n $timeout(function () {\n $state.go(redirectTo);\n $uibModalInstance.close();\n }, vm.timeOut);\n }\n\n vm.close = function () {\n $uibModalInstance.close();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.preferences.controller:PreferencesCtrl\n *\n * @description\n *\n */\n angular\n .module('account.preferences')\n .controller('PreferencesCtrl', PreferencesCtrl);\n\n function PreferencesCtrl($uibModalInstance, Session, Notification, Restangular, FormAlerts, userProfile) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isLoading = true;\n vm.isSaving = false;\n vm.userProfile = userProfile;\n vm.data = {\n mailingLists: {},\n marketplace: {}\n };\n\n vm.updatePreferences = function () {\n if (!vm.userProfile) {\n return;\n }\n if (vm.userProfile.preferences && vm.userProfile.preferences.mailingLists) {\n vm.data.mailingLists = vm.userProfile.preferences.mailingLists;\n }\n\n if (vm.userProfile.preferences && vm.userProfile.preferences.marketplace) {\n vm.data.marketplace = vm.userProfile.preferences.marketplace;\n }\n vm.dataBkp = angular.copy(vm.data);\n };\n\n vm.changeSettings = function (key, value) {\n var lastProperty = null;\n key = key.split('.');\n if (key.length === 1) {\n vm.data[key[0]] = value;\n }\n else {\n lastProperty = vm.data;\n angular.forEach(key, function (keyName, index, array) {\n if (index === array.length - 1) {\n // This is the last key in the list.\n lastProperty[keyName] = value;\n }\n else if (_.has(lastProperty, keyName)) {\n // Key already exists in the data\n lastProperty = lastProperty[keyName];\n }\n else {\n // There is no such key, create one.\n lastProperty = lastProperty[keyName] = {};\n }\n });\n }\n vm.hasChanges = !_.isEqual(vm.data, vm.dataBkp);\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.saveChanges = function () {\n vm.isSaving = true;\n vm.alerts.reset();\n Restangular.one('Preferences').customPUT(vm.data, 'index')\n .then(function (preferences) {\n if (preferences) {\n vm.userProfile.preferences = preferences.plain();\n Session.updateLocalUserProfile(vm.userProfile, false);\n }\n vm.isSaving = false;\n Notification({message: 'Success'}, 'confirmation');\n $uibModalInstance.close();\n }, function () {\n vm.isSaving = false;\n vm.alerts.add('danger', 'Unable to save the changes.');\n });\n };\n\n // init\n if (!vm.userProfile) {\n Session.getUserProfile().then(function (up) {\n vm.userProfile = up;\n vm.updatePreferences(vm.userProfile);\n });\n }\n else {\n vm.updatePreferences(vm.userProfile);\n }\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.preferences.controller:PreferencesCtrl\n *\n * @description\n *\n */\n angular\n .module('account.preferences')\n .controller('MailingListUnsubscribeCtrl', MailingListUnsubscribeCtrl);\n\n function MailingListUnsubscribeCtrl($scope, $document, AccountService, Restangular, $stateParams) {\n var vm = this;\n vm.isSaving = false;\n vm.isError = false;\n vm.isContactOpen = false;\n vm.data = {\n userId: $stateParams.userId,\n subscriptionId: $stateParams.subscriptionId\n };\n\n vm.saveChanges = function () {\n vm.isSaving = true;\n\n Restangular.one('Preferences').one('mailingListSubscription').remove(vm.data)\n .then(function () {\n vm.isSaving = false;\n }, function () {\n vm.isSaving = false;\n vm.isError = true;\n });\n };\n\n vm.openFeedback = function () {\n AccountService.openFeedback(null, true);\n };\n\n // init\n vm.saveChanges();\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.password\n * @description\n *\n */\n angular\n .module('account.password', [\n 'vcRecaptcha',\n 'validation.match'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.password.controller:ResetCtrl\n *\n * @description\n *\n */\n angular\n .module('account.password')\n .controller('ResetCtrl', ResetCtrl);\n\n function ResetCtrl($stateParams, Restangular, FormAlerts) {\n var vm = this;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.showMessage = false;\n vm.isLoading = false;\n\n vm.reset = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Restangular.one('Users').customPUT({\n token: $stateParams.token,\n password: vm.data.password\n }, 'lostPassword')\n .then(function () {\n vm.showMessage = true;\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to reset');\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.password.controller:RecoverCtrl\n *\n * @description\n *\n */\n angular\n .module('account.password')\n .controller('RecoverCtrl', RecoverCtrl);\n\n function RecoverCtrl(Restangular, vcRecaptchaService, FormAlerts, configOptions) {\n var vm = this;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.reCaptchaSiteKey = configOptions.reCaptchaSiteKey;\n vm.showMessage = false;\n vm.isLoading = false;\n\n vm.recover = function () {\n var reCaptchaResponse;\n vm.alerts.reset();\n try {\n reCaptchaResponse = vcRecaptchaService.getResponse();\n }\n catch (err) {\n vcRecaptchaService.reload();\n vm.alerts.add('danger', 'Unable to verify that you are not a robot. Please try again');\n return;\n }\n\n vm.isLoading = true;\n Restangular.one('Users').post('lostPassword', {\n email: vm.data.email,\n reCaptchaResponse: reCaptchaResponse\n })\n .then(function () {\n vm.showMessage = true;\n }, function () {\n vm.isLoading = false;\n vcRecaptchaService.reload();\n vm.alerts.add('danger', 'Unable to recover');\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('account.password')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('accountPassword', {\n abstract: true,\n url: '/account/password',\n template: '',\n data: {\n classNames: 'no-help'\n }\n })\n .state('accountPassword.recover', {\n url: '/recover',\n templateUrl: 'account/password/recover.tpl.html',\n controller: 'RecoverCtrl',\n controllerAs: 'recoverCtrl'\n })\n .state('accountPassword.reset', {\n url: '/reset/{token}',\n templateUrl: 'account/password/reset.tpl.html',\n controller: 'ResetCtrl',\n controllerAs: 'resetCtrl'\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.feedback\n * @description\n *\n */\n angular\n .module('account.feedback', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.feedback.controller:FeedbackCtrl\n *\n * @description\n *\n */\n angular\n .module('account.feedback')\n .controller('FeedbackCtrl', FeedbackCtrl);\n\n function FeedbackCtrl($window, $uibModalInstance, Notification, Restangular, Session, FormAlerts, userProfile, helpRequired, configOptions) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isSending = false;\n vm.userProfile = userProfile;\n vm.isHelpRequired = helpRequired;\n vm.data = {\n appVersion: configOptions.appVersion,\n isMobileApp: $window.navigator.userAgent.indexOf('gonative') > -1 ? true : false,\n navigatorInfo: $window.navigator.userAgent,\n url: $window.document.location.href,\n feedback: null,\n name: null,\n email: null\n };\n\n vm.updateUserData = function () {\n // vm.userProfile should be available here at the time this is triggered.\n vm.data.name = vm.userProfile.fullName;\n vm.data.email = vm.userProfile.email;\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.send = function () {\n vm.isSending = true;\n vm.alerts.reset();\n Restangular.one('Feedback').post('index', vm.data)\n .then(function () {\n vm.isSaving = false;\n Notification({message: 'Success'}, 'confirmation');\n $uibModalInstance.close();\n }, function () {\n vm.isSaving = false;\n vm.alerts.add('danger', 'Unable to save the changes.');\n });\n };\n\n // User Profile can be provided as the uibModal (or route) resolve. If it's missing, we can always try to get the user from the session.\n if (angular.isUndefined(vm.userProfile) || vm.userProfile === null) {\n Session.getUserProfile().then(function (up) {\n vm.userProfile = up;\n if (vm.userProfile) {\n vm.updateUserData();\n }\n });\n }\n else {\n vm.updateUserData();\n }\n\n // Connect to the event of once the modal instance has rendered and apply focus to the textarea\n $uibModalInstance.rendered.then(function () {\n angular.element('#details')[0].focus();\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.earnings\n * @description\n *\n */\n angular\n .module('account.earnings', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.earnings.controller:WithdrawCtrl\n *\n * @description\n *\n */\n angular\n .module('account.earnings')\n .controller('WithdrawCtrl', WithdrawCtrl);\n\n function WithdrawCtrl($state, Restangular, Notification, FormAlerts, earnings, userProfile, Charities) {\n var vm = this;\n vm.isLoading = false;\n vm.showTotal = false;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.minLimit = earnings.minimumWithdrawLimit;\n vm.balance = earnings.actualEarnings;\n vm.processingFee = 0;\n vm.remainingBalance = 0;\n vm.receivedAmount = 0;\n vm.alerts = new FormAlerts();\n vm.data = {\n amount: null,\n accountHolder: userProfile.bankAccountName,\n accountBsb: userProfile.bankCodeDomestic,\n accountNumber: userProfile.bankAccountNumberDomestic\n };\n\n vm.calculate = function () {\n vm.showTotal = true;\n };\n\n vm.cancel = function () {\n $state.go('account.earnings');\n };\n\n vm.onAmountChange = function () {\n vm.showTotal = false;\n vm.calculationRequired = true;\n };\n\n vm.calculate = function () {\n if (vm.data.amount > 0 && vm.data.amount >= earnings.minimumWithdrawLimit && vm.data.amount <= earnings.actualEarnings) {\n vm.calculating = true;\n Restangular.one('Withdrawals').one('calculateWithdrawalFees').get({\n amount: vm.data.amount\n })\n .then(function (result) {\n vm.processingFee = result.fees;\n vm.receivedAmount = result.amountLessFees;\n vm.remainingBalance = result.remainingBalance;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.showTotal = true;\n });\n }\n };\n\n vm.withdraw = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Withdrawals').post('index', vm.data)\n .then(function () {\n userProfile.bankAccountName = vm.data.accountHolder;\n userProfile.bankCodeDomestic = vm.data.accountBsb;\n userProfile.bankAccountNumberDomestic = vm.data.accountNumber;\n $state.go('account.earnings');\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to withdraw');\n });\n };\n\n vm.donate = function () {\n Charities.openDonate();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('account.earnings')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('account.earnings', angular.extend({}, configOptions.defaultStateParams, {\n url: '/earnings',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('account', 'earnings');\n }]\n }))\n .state('accountEarningsWithdraw', angular.extend({}, configOptions.defaultStateParams, {\n url: '/account/earnings/withdraw',\n templateUrl: 'account/earnings/withdraw.tpl.html',\n controller: 'WithdrawCtrl',\n controllerAs: 'withdraw',\n resolve: {\n earnings: ['Restangular', function (Restangular) {\n return Restangular.one('Earnings').one('summaries').get()\n .then(function (result) {\n return result.plain();\n });\n }],\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n }\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.earnings.controller:EarningsCtrl\n *\n * @description\n *\n */\n angular\n .module('account.earnings')\n .controller('EarningsCtrl', EarningsCtrl);\n\n function EarningsCtrl($state, Restangular, DataTable, Leads) {\n var vm = this;\n vm.summaries = {};\n vm.ranges = {\n all: 'Show all',\n lastMonth: 'Last month',\n lastYear: 'Last year'\n };\n vm.selectedRange = 'all';\n vm.selectedRangeLabel = 'Show all';\n vm.list = DataTable.create('Earnings', 'index');\n vm.withdrawalsList = DataTable.create('Withdrawals', 'index');\n vm.isLoadingSummaries = true;\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Earnings',\n value: 'earnings'\n },\n {\n label: 'Withdrawals',\n value: 'withdrawals'\n }\n ];\n\n Restangular.one('Earnings').one('summaries').get()\n .then(function (result) {\n vm.summaries = result.plain();\n vm.isLoadingSummaries = false;\n }, function () {\n vm.isLoadingSummaries = false;\n });\n\n vm.selectRange = function (range) {\n vm.selectedRange = range;\n vm.selectedRangeLabel = vm.ranges[range];\n vm.list.reload({\n dateRange: range\n });\n };\n\n vm.viewLastMonthEarnings = function () {\n vm.tabManager.openTab('earnings');\n vm.selectRange('lastMonth');\n };\n\n vm.viewAllEarnings = function () {\n vm.tabManager.openTab('earnings');\n vm.selectRange('all');\n };\n\n vm.withdraw = function () {\n $state.go('accountEarningsWithdraw');\n };\n\n vm.openLead = function ($index) {\n var earning = vm.list.getRecords()[$index];\n if (!isNaN(earning.idLead) && parseInt(earning.idLead, 10) > 0) {\n Leads.openDetailById(earning.idLead, 'sent');\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name account.billing\n * @description\n *\n */\n angular\n .module('account.billing', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.billing.controller:CreditCardCtrl\n *\n * @description\n *\n */\n angular\n .module('account.billing')\n .controller('CreditCardCtrl', CreditCardCtrl);\n\n function CreditCardCtrl(Restangular, $uibModalInstance, CreditCardUtil, Session, operation) {\n var\n vm = this;\n vm.isLoading = false;\n vm.months = CreditCardUtil.getExpiryMonths();\n vm.years = CreditCardUtil.getExpiryYears();\n vm.cards = CreditCardUtil.getAcceptedCards();\n vm.data = {};\n\n vm.isAdd = function () {\n return operation === 'add';\n };\n\n vm.ok = function () {\n vm.isLoading = true;\n Restangular.one('Billing').customPUT(vm.data, 'creditCard')\n .then(function (result) {\n Session.updateLocalUserProfile({isCCSet: true});\n $uibModalInstance.close({creditCard: result.plain()});\n }, function () {\n vm.isLoading = false;\n });\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('account.billing')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('account.billing', angular.extend({}, configOptions.defaultStateParams, {\n url: '/billing',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account',\n onEnter: ['RouterHelper', function (RouterHelper) {\n RouterHelper.activateTab('account', 'billing');\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.billing.controller:BillingCtrl\n *\n * @description\n *\n */\n angular\n .module('account.billing')\n .controller('BillingCtrl', BillingCtrl);\n\n function BillingCtrl($document, Restangular, $uibModal, Notification, Session, DataTable) {\n var vm = this;\n vm.initialisingCard = true;\n vm.cardLoading = false;\n vm.invoicesExist = true;\n vm.creditCard = null;\n vm.invoices = DataTable.create('Invoices', 'index', {}, {\n itemCallback: function (item) {\n item.downloadUrl = '/Invoices/download?id=' + item.idInvoice;\n return item;\n }\n });\n\n Restangular.one('Billing').one('creditCard').get()\n .then(function (creditCard) {\n if (angular.isObject(creditCard) && angular.isDefined(creditCard.number)) {\n vm.creditCard = creditCard.plain();\n }\n vm.initialisingCard = false;\n }, function () {\n vm.initialisingCard = false;\n });\n\n vm.manageCreditCard = function (operation) {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].getElementById('billing-ctrl-container')),\n templateUrl: 'account/billing/credit-card.tpl.html',\n controller: 'CreditCardCtrl',\n controllerAs: 'creditCard',\n size: 'lg',\n windowClass: 'modal-credit-card',\n resolve: {\n operation: function () {\n return operation;\n }\n }\n });\n\n modalInstance.result.then(function (result) {\n if (angular.isObject(result) && angular.isObject(result.creditCard) && angular.isDefined(result.creditCard.number)) {\n vm.creditCard = result.creditCard;\n Session.updateLocalUserProfile({isCCSet: true});\n Notification({message: 'Your credit card details have been successfully updated'}, 'confirmation');\n }\n });\n };\n\n vm.removeCreditCard = function () {\n vm.cardLoading = true;\n Restangular.one('Billing').one('creditCard').remove()\n .then(function () {\n vm.creditCard = null;\n vm.cardLoading = false;\n Session.updateLocalUserProfile({isCCSet: false});\n Notification({message: 'Your credit card details have been removed'}, 'confirmation');\n }, function () {\n vm.cardLoading = false;\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name user\n * @description\n *\n */\n angular\n .module('user', [\n 'ui.router',\n 'user.leads',\n 'user.agreements',\n 'user.connections',\n 'user.marketplace',\n 'user.messages'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('user')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('user', {\n url: '/user/{id}',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n authenticate: true,\n params: {\n isInvite: false\n },\n resolve: {\n userProfile: ['Restangular', '$stateParams', 'Auth', function (Restangular, $stateParams, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Users').one('profile').get({id: $stateParams.id})\n .then(function (profile) {\n return profile.plain();\n });\n }\n return null;\n }, function () {\n return null;\n });\n }],\n agreementsDetails: ['Restangular', '$stateParams', 'Auth', function (Restangular, $stateParams, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Contracts').one('index').get({idUser: $stateParams.id})\n .then(function (agreements) {\n return agreements.plain();\n });\n }\n return null;\n }, function () {\n return null;\n });\n }],\n myProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n },\n onEnter: ['$state', '$stateParams', 'userProfile', 'myProfile', function ($state, $stateParams, userProfile, myProfile) {\n if (userProfile && myProfile && userProfile.id === myProfile.id) {\n $state.go('dashboard');\n }\n else if ($stateParams.isInvite) {\n if (userProfile.marketplace && angular.isArray(userProfile.marketplace) && userProfile.marketplace.length > 0) {\n $state.go('user.marketplace', {id: userProfile.id});\n }\n else {\n $state.go('user.agreements', {id: userProfile.id});\n }\n }\n }]\n })\n .state('user.about', angular.extend({}, configOptions.defaultStateParams, {\n url: '/about',\n templateUrl: 'user/user.tpl.html',\n controller: 'UserCtrl',\n controllerAs: 'user',\n onEnter: ['$state', 'RouterHelper', 'userProfile', function ($state, RouterHelper, userProfile) {\n if (!userProfile.description) {\n $state.go('user.agreements', {id: userProfile.id});\n }\n else {\n RouterHelper.activateTab('user', 'about');\n }\n }]\n }))\n .state('userJoin', {\n url: '/user/{id}/join',\n authenticate: true,\n onEnter: ['$state', '$stateParams', 'MyPod', 'Notification', function ($state, $stateParams, MyPod, Notification) {\n MyPod.quickJoin($stateParams.id).then(function () {\n Notification({message: 'Success'}, 'confirmation');\n $state.go('user.agreements', {id: $stateParams.id});\n }, function (err) {\n Notification({message: 'The registration was unsuccessful.'}, 'error');\n $state.go('dashboard', {id: $stateParams.id});\n throw new Error(err);\n });\n }]\n })\n .state('userInvitation', angular.extend({}, configOptions.defaultStateParams, {\n url: '/invitation/{token}',\n resolve: {\n invitation: ['Restangular', '$state', '$stateParams', 'Auth', '$q', function (Restangular, $state, $stateParams, Auth, $q) {\n var deferred = $q.defer();\n Restangular.one('Invitations').one('detail').get({token: $stateParams.token})\n .then(function (invitation) {\n Auth.isAuthenticated()\n .then(function (isAuthenticated) {\n if (isAuthenticated) {\n deferred.resolve(invitation.plain());\n }\n else if (invitation.isRegistered) {\n $state.go('accountSignInUp.accountSignIn', {invitationToken: $stateParams.token});\n }\n else {\n $state.go('accountSignInUp.accountSignUp', {invitationToken: $stateParams.token});\n }\n }, function () {\n if (invitation.isRegistered) {\n $state.go('accountSignInUp.accountSignIn', {invitationToken: $stateParams.token});\n }\n else {\n $state.go('accountSignInUp.accountSignUp', {invitationToken: $stateParams.token});\n }\n });\n }, function () {\n Auth.signOut();\n $state.go('accountSignInUp.accountSignIn', {invitationToken: $stateParams.token});\n });\n\n return deferred.promise;\n }]\n },\n onEnter: ['$state', 'invitation', function ($state, invitation) {\n if (angular.isObject(invitation) && angular.isDefined(invitation.idUserSender)) {\n $state.go('user.agreements', {id: invitation.idUserSender});\n }\n else {\n $state.go('dashboard');\n }\n }]\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.controller:UserCtrl\n *\n * @description\n *\n */\n angular\n .module('user')\n .controller('UserCtrl', UserCtrl);\n\n function UserCtrl($window, $rootScope, $scope, $stateParams, configOptions, Restangular, userProfile, agreementsDetails, myProfile, DataTable, Leads, MyPod, Charities) {\n var vm = this,\n tabs = ['sentLeads', 'receivedLeads', 'agreements', 'connections', 'marketplace', 'messages'];\n\n vm.isMobile = $window.innerWidth < 768;\n vm.detailsVisible = false;\n vm.userProfile = userProfile;\n vm.myProfile = myProfile;\n vm.agreementsDetails = agreementsDetails;\n vm.eventHandler = null;\n\n // Set the tabs. The About tab's visibility is dynamic and depends on its content\n if (vm.userProfile.description) {\n tabs.unshift('about');\n }\n\n vm.isBusinessAccountActive = function () {\n return angular.isDefined(myProfile.isBusinessAccountActive) && myProfile.isBusinessAccountActive === true;\n };\n\n // Check if this user is the business entity (is registered as the business in MLP)\n // FYI: connectionsList == directoryList, we are keeping the same name in the code (connections) as it was originally planned, but all the UI will display \"Directory\" instead\n if (vm.userProfile.isBusinessAccountActive === true) {\n vm.connectionsList = DataTable.create('Members', 'index', {}, {\n basicParams: {\n idUser: vm.userProfile.id\n }\n });\n }\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'About',\n value: 'about',\n url: 'user.about',\n condition: function () {\n return vm.userProfile.description;\n }\n },\n {\n label: 'Sent Leads',\n value: 'sentLeads',\n url: 'user.sentLeads',\n condition: function () {\n return vm.userProfile.isBusinessAccountActive;\n }\n },\n {\n label: 'Received Leads',\n value: 'receivedLeads',\n url: 'user.receivedLeads',\n condition: function () {\n return vm.isBusinessAccountActive();\n }\n },\n {\n label: 'Agreements',\n value: 'agreements',\n url: 'user.agreements',\n condition: function () {\n return true;\n }\n },\n {\n label: 'Messages',\n value: 'messages',\n url: 'user.messages',\n condition: function () {\n return vm.userProfile.acceptedReceiveLeadsContractExists || vm.userProfile.acceptedSendLeadsContractExists;\n }\n },\n {\n label: vm.userProfile.firstName + '\\'s Directory',\n value: 'connections',\n url: 'user.connections',\n condition: function () {\n return vm.userProfile.isBusinessAccountActive;\n },\n template: '({{tab.data.connectionsList.totalRecords()}})',\n data: {\n userProfile: vm.userProfile,\n connectionsList: vm.connectionsList\n }\n },\n {\n label: 'Marketplace',\n value: 'marketplace',\n url: 'user.marketplace',\n condition: function () {\n return vm.userProfile.marketplace && vm.userProfile.marketplace.length;\n },\n template: '({{tab.data.marketplace.length}})',\n data: {\n userProfile: vm.userProfile,\n marketplace: vm.userProfile.marketplace\n }\n }\n ];\n\n vm.toggleDetails = function () {\n vm.detailsVisible = !vm.detailsVisible;\n };\n\n vm.moreDetailsExist = function () {\n var nonEmptyDetails = 0;\n if (vm.getAddress()) {\n nonEmptyDetails++;\n }\n if (vm.userProfile.phoneMobile) {\n nonEmptyDetails++;\n }\n if (vm.userProfile.email) {\n nonEmptyDetails++;\n }\n if (vm.userProfile.website) {\n nonEmptyDetails++;\n }\n\n return nonEmptyDetails > 1;\n };\n\n vm.getAddress = function () {\n var addressParts = [];\n if (vm.userProfile.suburb) {\n addressParts.push(vm.userProfile.suburb);\n }\n if (vm.userProfile.state) {\n addressParts.push(vm.userProfile.state);\n }\n if (vm.userProfile.country) {\n addressParts.push(vm.userProfile.country);\n }\n\n vm.addressLink = vm.userProfile.addressPostal && vm.userProfile.addressPostal.addressPostal ? vm.userProfile.addressPostal.addressPostal + ', ' + addressParts.join(', ') : addressParts.join(', ');\n return addressParts.join(', ');\n };\n\n vm.formatWebsiteUrl = function () {\n var url = '';\n if (angular.isDefined(vm.userProfile) && angular.isString(vm.userProfile.website)) {\n url = vm.userProfile.website;\n if (url !== '') {\n if ((url.slice(0, 4)).toLowerCase() !== 'http') {\n url = 'http://' + vm.userProfile.website;\n }\n }\n }\n\n return url;\n };\n\n vm.sendLead = function () {\n Leads.openSendLead(vm.userProfile, false);\n };\n\n vm.registerLead = function () {\n Leads.openSendLead(vm.userProfile, true);\n };\n\n vm.sendInvite = function () {\n var uibModal = MyPod.openSendInvite(vm.myProfile, vm.userProfile);\n uibModal.then(function (sendLeads) {\n vm.agreementsDetails.sendLeads = sendLeads;\n });\n };\n\n vm.donate = function () {\n if (vm.userProfile.isCharityAccountActive) {\n Charities.openDonate(vm.userProfile);\n }\n };\n\n vm.reloadProfile = function () {\n Restangular.one('Users').one('profile').get({id: $stateParams.id})\n .then(function (profile) {\n vm.userProfile = profile.plain();\n });\n };\n\n vm.getCoverStyle = function () {\n var coverCss = {};\n // Set the user profile style from style config\n if (vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground) {\n // Check if the user opted for his own background image or wants to use provided pattern or plain color. Color can be combined with both\n // so it's in separate 'if' statement.\n if (vm.userProfile.profileConfiguration.coverBackground.imageToken) {\n coverCss.backgroundImage = 'url(\"' + configOptions.baseUrl + '/UserConfiguration/coverPicture/' + vm.userProfile.profileConfiguration.coverBackground.imageToken + '\")';\n coverCss.backgroundPosition = 'center top';\n coverCss.backgroundSize = '1140px 215px';\n }\n else if (vm.userProfile.profileConfiguration.coverBackground.config && vm.userProfile.profileConfiguration.coverBackground.config.keepPattern) {\n coverCss.backgroundImage = 'url(\"/images/user-profile-pattern.png\")';\n }\n else {\n coverCss.backgroundImage = 'none';\n }\n\n if (vm.userProfile.profileConfiguration.coverBackground.config) {\n if (vm.userProfile.profileConfiguration.coverBackground.config.backgroundColor) {\n coverCss.backgroundColor = vm.userProfile.profileConfiguration.coverBackground.config.backgroundColor;\n coverCss.backgroundBlendMode = 'luminosity';\n }\n }\n return coverCss;\n }\n };\n\n vm.getHeadlineStyle = function () {\n var textCss = {};\n // Set the user profile style from style config\n if (vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground && vm.userProfile.profileConfiguration.coverBackground.config) {\n textCss.color = vm.userProfile.profileConfiguration.coverBackground.config.textColor || 'inherit';\n }\n return textCss;\n };\n\n vm.isCustomBackground = function () {\n return vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground && vm.userProfile.profileConfiguration.coverBackground.imageToken ||\n vm.userProfile.profileConfiguration && vm.userProfile.profileConfiguration.coverBackground && vm.userProfile.profileConfiguration.coverBackground.config && !vm.userProfile.profileConfiguration.coverBackground.config.keepPattern;\n };\n\n vm.eventHandler = $rootScope.$on('event:user-agreements-updated', function () {\n vm.reloadProfile();\n });\n vm.stateHandler = $rootScope.$on('close-modal-instance', function () {\n vm.detailsVisible = false;\n });\n $rootScope.$on('$destroy', vm.eventHandler);\n $rootScope.$on('$destroy', vm.stateHandler);\n\n angular.element($window).on('resize', function () {\n vm.isMobile = $window.innerWidth < 768;\n $scope.$apply();\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name user.directive:userAvatar\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('user')\n .directive('userAvatar', userAvatar);\n\n function userAvatar() {\n return {\n restrict: 'EA',\n scope: {\n user: '=user',\n size: '@',\n isLink: '@',\n fixedSize: '@'\n },\n templateUrl: 'user/user-avatar-directive.tpl.html',\n replace: true,\n controllerAs: 'userAvatar',\n controller: ['$scope', 'configOptions', function ($scope, configOptions) {\n var vm = this;\n if ($scope.isLink !== 'true') {\n vm.isLink = false;\n }\n else {\n vm.isLink = true;\n }\n if ($scope.size !== 'small' && $scope.size !== 'large') {\n $scope.size = 'small';\n }\n\n vm.isSmall = function () {\n return $scope.size === 'small';\n };\n\n if ($scope.user) {\n vm.idUser = $scope.user.id;\n vm.initials = $scope.user.firstName.trim().charAt(0);\n }\n else {\n return;\n }\n\n vm.isImage = function () {\n return !!$scope.user.imageToken;\n };\n\n vm.isFixedSize = function () {\n return $scope.fixedSize === 'true';\n };\n\n vm.getStyle = function () {\n var size = vm.isSmall() ? 44 : 120,\n avatarUrl;\n if ($scope.user.imageToken) {\n avatarUrl = configOptions.baseUrl + '/Users/photo/' + $scope.user.imageToken + '?w=' + size + '&h=' + size;\n return {\n 'background-image': 'url(' + avatarUrl + ')'\n };\n }\n\n return {\n 'background-color': $scope.user.color\n };\n };\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name user.controller:AboutCtrl\n *\n * @description\n *\n */\n angular\n .module('user')\n .controller('AboutCtrl', AboutCtrl);\n\n function AboutCtrl($scope) {\n var vm = this;\n vm.userProfile = $scope.user.userProfile;\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlp-notifications\n * @description\n *\n */\n angular\n .module('mlp-notifications', []);\n}());\n","// jscs:disable requireCamelCaseOrUpperCaseIdentifiers\n/* eslint-disable camelcase */\n(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlpNotifications.provider:OneSignal\n *\n * @description\n *\n */\n angular\n .module('mlp-notifications')\n .provider('OneSignal', OneSignalProvider);\n\n function OneSignalProvider() {\n var appId,\n safariWebId,\n isLoaded = false,\n OneSignal,\n userIdPromise,\n userId,\n isApp;\n\n return {\n init: function (applicationId, webId) {\n appId = applicationId;\n safariWebId = webId;\n },\n $get: ['$window', '$document', '$http', '$q', 'Restangular', 'Auth', function ($window, $document, $http, $q, Restangular, Auth) {\n var oneSignalApi = $q.defer(),\n scriptElement;\n\n function init() {\n OneSignal = $window.OneSignal;\n if (!OneSignal) {\n OneSignal = $window.OneSignal = [];\n }\n\n // Initialise\n OneSignal.push(['init', {\n appId: appId,\n safari_web_id: safariWebId,\n autoRegister: true,\n notificationClickHandlerMatch: 'origin',\n notifyButton: {\n enable: false\n }\n }]);\n\n // Occurs when the user's subscription changes to a new value.\n OneSignal.push(function () {\n OneSignal.on('subscriptionChange', function (isSubscribed) {\n if (isSubscribed) {\n OneSignal.getUserId().then(function (playerId) {\n userId = playerId;\n if (userIdPromise) {\n userIdPromise.resolve(userId);\n }\n Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n Restangular.one('Users').customPOST(null, 'pushNotifications', {\n oneSignalPlayerId: playerId\n });\n }\n });\n });\n }\n else {\n userId = null;\n }\n });\n });\n\n // Get UserId\n OneSignal.push(function () {\n OneSignal.getUserId().then(function (osUserId) {\n userId = osUserId;\n if (userIdPromise) {\n userIdPromise.resolve(userId);\n }\n });\n });\n\n // Resolve the api (everything is ready and initialized)\n oneSignalApi.resolve();\n }\n\n isApp = $window.navigator.userAgent.indexOf('gonative') > -1;\n userIdPromise = $q.defer();\n\n if (isApp) {\n $window.gonative_onesignal_info = function (info) {\n userIdPromise.resolve(info.oneSignalUserId);\n userId = info.oneSignalUserId;\n };\n oneSignalApi.resolve();\n isLoaded = true;\n }\n else if (!isLoaded) {\n scriptElement = $document[0].createElement('script');\n scriptElement.setAttribute('async', 'async');\n scriptElement.onload = init;\n $document[0].body.appendChild(scriptElement);\n scriptElement.src = 'https://cdn.onesignal.com/sdks/OneSignalSDK.js';\n isLoaded = true;\n }\n else {\n oneSignalApi.resolve();\n }\n\n oneSignalApi.isLoaded = function () {\n return isLoaded;\n };\n\n oneSignalApi.getUserId = function () {\n return userIdPromise.promise;\n };\n\n return oneSignalApi;\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpNotifications.directive:notificationSwipeItem\n * @restrict E\n * @element\n */\n angular\n .module('mlp-notifications')\n .directive('notificationSwipeItem', notificationSwipeItem);\n\n function notificationSwipeItem($swipe) {\n return {\n restrict: 'AE',\n scope: {\n onSwipeDone: '&',\n onSwiping: '&',\n onSwipeCancel: '&',\n onClick: '&'\n },\n link: function (scope, el, attrs) {\n var id = Number(attrs.notificationId),\n startX = 0,\n dx = 0,\n isMoving;\n\n function reset() {\n // Reset;\n startX = 0;\n dx = 0;\n isMoving = false;\n }\n\n function onStart(coords, event) {\n startX = coords.x;\n\n el.css({\n transition: 'none'\n });\n console.log('onStart:', id, isMoving, event.type);\n if (isMoving) {\n onCancel(event);\n }\n else {\n isMoving = true;\n }\n }\n\n function onMove(coords) {\n dx = coords.x - startX;\n isMoving = true;\n // alter the position now.\n el.css({\n transform: 'translateX(' + dx + 'px)'\n });\n scope.onSwiping({deltaX: dx});\n }\n\n function onEnd(coords, event) {\n var absDx = Math.abs(coords.x - startX),\n preventMouseUp = false;\n\n if (!isMoving) {\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n\n if (absDx >= 0 && absDx < 5) {\n // This is considered as accidental swipe. don't prevent the mouseup. Return the element slowly back\n el.css({\n transform: 'translateX(0px)',\n transition: 'transform 0.2s ease-in-out'\n });\n el.slideUp(200, function () {\n scope.onClick({id: id});\n });\n }\n else if (absDx > 0 && absDx < 50) {\n // This is considered as unfinished swipe. prevent the mouseup but don't clear the notification\n preventMouseUp = true;\n el.css({\n transform: 'translateX(0px)',\n transition: 'transform 0.2s ease-in-out'\n });\n scope.onSwipeCancel({id: id});\n }\n else {\n // This is finished swipe and the notification should be cleared. Prevent mouseup\n preventMouseUp = true;\n el.css({\n transform: 'translateX(' + (coords.x - startX < 0 ? '-1000' : '1000') + 'px)',\n transition: 'transform 0.3s ease-in-out'\n });\n el.slideUp(200);\n scope.onSwipeDone({id: id});\n }\n if (preventMouseUp) {\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n }\n\n reset();\n }\n\n function onCancel(event) {\n // This is considered as unfinished swipe. prevent the mouseup but don't clear the notification\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n\n el.css({\n transform: 'translateX(0px)',\n transition: 'transform 0.2s ease-in-out'\n });\n scope.onSwipeCancel({id: id});\n reset();\n }\n\n $swipe.bind(el, {\n start: onStart,\n move: onMove,\n end: onEnd,\n cancel: onCancel\n }, ['mouse', 'touch']);\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlpNotifications.constant:notificationConst\n *\n * @description\n *\n */\n angular\n .module('mlp-notifications')\n .constant('notificationConst', {\n categoryMessages: 'messages',\n categoryLeads: 'leads',\n typeDirectMessage: 'direct message',\n typeLeadMessage: 'lead message',\n typeNewLead: 'new lead'\n });\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpNotifications.directive:notificationCenter\n * @restrict E\n * @element\n */\n angular\n .module('mlp-notifications')\n .directive('notificationCenter', notificationCenter);\n\n function notificationCenter($rootScope, $timeout, $sce, $state, Cache, Restangular, notificationConst, Leads) {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n isLink: '=?',\n descriptionKey: '=?',\n stopPropagation: '=?',\n hasDetails: '=?',\n nameOnly: '=?',\n addClass: '='\n },\n replace: true,\n transclude: false,\n templateUrl: 'notifications/notification-center-directive.tpl.html',\n controllerAs: 'nc',\n controller: ['$scope', function ($scope) {\n var watchHandeNewNotification,\n watchHandleClearNotification,\n scope = this,\n cache = Cache.create('notification-centre-help');\n\n scope.notificationsBkp = [];\n scope.notifications = [];\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.displayHelp = false;\n\n scope.filterCategories = [\n {name: 'All', value: 'all'},\n {name: 'Leads', value: 'leads', iconClass: 'fa-paper-plane'},\n {name: 'Messages', value: 'messages', iconClass: 'fa-envelope'}\n ];\n\n // Check if the help was dismissed\n if (!cache.get('helpDismissed')) {\n scope.displayHelp = true;\n }\n\n // to be replaced with data from api\n scope.notificationsData = [];\n\n function generateNotifications(data) {\n var foundCategories = [],\n now = (new Date()).getTime(),\n hasMore = false;\n\n // Alter data\n _.each(data, function (item) {\n // First. Insert the icon-class of the category.\n if (item && item.category && _.find(scope.filterCategories, {value: item.category})) {\n // Icon class\n item.iconClass = _.find(scope.filterCategories, {value: item.category}).iconClass;\n }\n else {\n item.iconClass = 'fa-stop';\n }\n\n // Check if the category is lead. Then change the value to lead url\n if (item && item.category && item.category === 'leads') {\n // item.value = $sce.trustAsHtml('View Lead');\n item.description = 'sent you new lead';\n }\n\n if (item && item.category && item.category === 'messages') {\n hasMore = item && item.count && item.count > 1;\n item.description = hasMore ? 'sent you new ' : 'sent you a new ';\n if (item.data && item.data.leadId) {\n item.description += 'lead ';\n }\n item.description += hasMore ? ' messages [' + item.count + ']' : 'message';\n }\n\n // Format time\n item.timeFormatted = scope.getFormattedTime(now - (new Date(item.time)).getTime());\n\n // Add the category from the item\n foundCategories.push(item.category);\n });\n\n // Clear all categories first\n _.each(scope.filterCategories, function (category) {\n category.hasResults = false;\n });\n\n // Now check the categories\n if (scope.filterCategories && scope.filterCategories.length > 0) {\n // Make the values unique\n foundCategories = _.uniq(foundCategories);\n // Now loop through each category and apply the badge\n angular.forEach(foundCategories, function (category) {\n _.find(scope.filterCategories, {value: category}).hasResults = true;\n });\n }\n\n scope.notificationsBkp = _.clone(data);\n filterNotifications();\n scope.notify();\n\n // Sometimes we have problem with refreshing the DOM.\n $timeout(function () {\n $scope.$apply();\n }, 100);\n }\n\n function filterNotifications(category) {\n var fresults = [];\n\n if (!category && scope.selectedCategories.lastIndexOf('all') > -1 || category === 'all') {\n scope.notifications = _.clone(scope.notificationsBkp);\n return;\n }\n\n if (!category) {\n return;\n }\n\n angular.forEach(scope.notificationsBkp, function (n) {\n if (_.contains(scope.selectedCategories, n.category)) {\n fresults.push(n);\n }\n });\n scope.notifications = fresults;\n }\n\n /**\n * Mark all notifications as read using API\n */\n scope.markRead = function () {\n scope.notifications = [];\n scope.notificationsBkp = [];\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.notify();\n };\n\n scope.notify = function () {\n $rootScope.$broadcast('event:notifications-status', {\n hasNotifications: scope.notifications.length > 0,\n count: scope.notifications.length > 10 ? '+' : scope.notifications.length\n });\n };\n\n /**\n * Clear all notifications\n */\n scope.clearNotifications = function () {\n return;\n };\n\n scope.openNotification = function (item) {\n // Based on the category do what is required\n if (!item) {\n return;\n }\n\n // This is the new lead notification. Only received leads will be visible in NC\n if (item.category && item.category === notificationConst.categoryLeads) {\n Leads.openDetail(item.data.leadId, 'received');\n }\n\n // This is the message within the lead as it contains the lead id in data property\n if (item.category && item.category === notificationConst.categoryMessages && item.data && item.data.leadId) {\n Leads.openDetail(item.data.leadId, 'received', null, 'messages');\n }\n\n // This is the direct message. Open the user profile at the messages tab\n if (item.category && item.category === notificationConst.categoryMessages && item.userId && !item.data) {\n $state.go('user.messages', {id: item.userId}, {reload: true});\n }\n\n scope.clearNotification(item);\n generateNotifications(scope.notificationsData);\n };\n\n scope.openNotificationById = function (id) {\n var item = _.find(scope.notifications, {id: id});\n if (item) {\n scope.openNotification(item);\n }\n };\n\n scope.clearNotification = function (item) {\n var category,\n userId,\n type,\n data,\n filtered;\n\n // Clear the items from the same user within the same category ...\n if (!item || !item.category || !item.userId || !item.type) {\n return;\n }\n category = item.category;\n userId = item.userId;\n type = item.type;\n data = item.data;\n\n if (data) {\n filtered = _.where(scope.notificationsData, {\n category: category,\n userId: userId,\n type: type,\n data: data\n });\n }\n else {\n filtered = _.where(scope.notificationsData, {\n category: category,\n userId: userId,\n type: type\n });\n }\n\n // Use API to remove the notification\n\n scope.notificationsData = _.difference(scope.notificationsData, filtered);\n };\n\n scope.clearNotificationById = function (id) {\n var item = _.find(scope.notifications, {id: id});\n if (item) {\n $timeout(function () {\n scope.clearNotification(item);\n generateNotifications(scope.notificationsData);\n }, 150);\n }\n };\n\n scope.isSelected = function (category) {\n return _.contains(scope.selectedCategories, category);\n };\n\n scope.changeCategory = function (category, evt, isSingleFilter) {\n if (!category) {\n return;\n }\n scope.notifications = [];\n\n if (category === 'all') {\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n }\n else if (isSingleFilter && category) {\n scope.selectedCategories = [category];\n scope.filterActive = true;\n }\n filterNotifications(category);\n };\n\n scope.getFormattedTime = function (timegap) {\n var interval = Math.abs(timegap) / 1000,\n granularity = 1,\n zeroInterval = 'now',\n suffix = '',\n short = false,\n units = null,\n output = '';\n\n units = [\n {seconds: 31536000, singular: 'year', plural: 'years', short: 'y'},\n {seconds: 2592000, singular: 'month', plural: 'months', short: 'm'},\n {seconds: 604800, singular: 'week', plural: 'weeks', short: 'w'},\n {seconds: 86400, singular: 'day', plural: 'days', short: 'd'},\n {seconds: 3600, singular: 'hour', plural: 'hours', short: 'h'},\n {seconds: 60, singular: 'min', plural: 'min', short: 'm'}\n ];\n\n angular.forEach(units, function (unit) {\n var count = null;\n if (granularity === 0) {\n return;\n }\n if (interval >= unit.seconds) {\n count = Math.floor(interval / unit.seconds);\n output += (output ? ' ' : '') + count;\n\n if (short) {\n output += unit.short;\n }\n else {\n output += ' ' + (count > 1 ? unit.plural : unit.singular);\n }\n\n interval %= unit.seconds;\n granularity--;\n }\n });\n\n return output ? output + (suffix === '' ? '' : ' ' + suffix) : zeroInterval;\n };\n\n scope.onSwiping = function (deltaX) {\n scope.isSwipeRight = deltaX > 1;\n $scope.$apply();\n };\n\n scope.dismissHelp = function () {\n cache.put('helpDismissed', 1);\n scope.displayHelp = false;\n };\n\n // Subscribe to the event of the new notification event that this directive will be notified about.\n watchHandeNewNotification = $rootScope.$on('event:notifications-raised', function (event, data) {\n if (data.notifications) {\n scope.notifications = data.notifications;\n }\n });\n\n // Subscribe to the events raised by different routes that will effectively get this directive to check and clear\n // any notifications that might be related to those routes (/messages, /lead/{}/messages etc)\n watchHandleClearNotification = $rootScope.$on('event:notifications-check', function (event, data) {\n scope.clearNotification(data);\n generateNotifications(scope.notificationsData);\n });\n\n $rootScope.$on('$destroy', function () {\n watchHandeNewNotification();\n watchHandleClearNotification();\n });\n\n // INIT\n generateNotifications(scope.notificationsData);\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name urlShorteners\n * @description\n *\n */\n angular\n .module('urlShorteners', [\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name urlShorteners.provider:BitlyUrlShortener\n *\n * @description\n *\n */\n angular\n .module('urlShorteners')\n .provider('BitlyUrlShortener', BitlyUrlShortener);\n\n function BitlyUrlShortener() {\n var config = {\n accessToken: null\n };\n\n return {\n setAccessToken: function (accessToken) {\n config.accessToken = accessToken;\n },\n $get: ['$http', '$httpParamSerializer', 'configOptions', '$q', function ($http, $httpParamSerializer, configOptions, $q) {\n var cache = {};\n return {\n shorten: function (longUrl) {\n var deferred = $q.defer();\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n if (angular.isDefined(cache[longUrl])) {\n deferred.resolve(cache[longUrl]);\n }\n else {\n $http({\n method: 'POST',\n headers: {\n \"Authorization\": \"Bearer \" + configOptions.bitlyGenericAccessToken,\n \"Content-Type\": \"application/json\"\n },\n url: 'https://api-ssl.bitly.com/v4/shorten',\n data:{\n long_url: longUrl\n }\n })\n .then(function (result) {\n cache[longUrl] = result.data.link;\n deferred.resolve(result.data.link);\n });\n }\n\n return deferred.promise;\n }\n };\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name toolbar\n * @description\n *\n */\n angular\n .module('toolbar', [\n 'ui.router',\n 'mlp-notifications'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name toolbar.controller:ToolbarCtrl\n *\n * @description\n *\n */\n angular\n .module('toolbar')\n .controller('ToolbarCtrl', ToolbarCtrl);\n\n function ToolbarCtrl($rootScope, $scope, $window, $state, $document, $timeout, Marketplace, AccountService, BusinessAccount, Auth, Session, authEvents) {\n var vm = this,\n loginSuccessHandler,\n updateProfileHandler,\n notificationHandler,\n watchHandle;\n\n // Default state for the navbar-collapse\n vm.isCollapsed = true;\n vm.hasNotifications = false;\n vm.notificationsCount = ' ';\n\n notificationHandler = $rootScope.$on('event:notifications-status', function (event, data) {\n vm.hasNotifications = data.hasNotifications;\n if (vm.hasNotifications) {\n vm.notificationsCount = data.count;\n }\n else {\n vm.notificationsCount = ' ';\n if (vm.isMobile) {\n vm.isNCopen = false;\n }\n }\n });\n\n function updateUserData() {\n Session.getUserProfile()\n .then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n vm.trialData = BusinessAccount.getTrialData(vm.userProfile);\n }\n });\n }\n\n function checkForMobile() {\n // This is a simple workaround to find out if we are in the the mobile devices (tablet/phone) according the bootstrap's breakpoints without having to hardcode the breakpoint values,\n // simply use the toggle button (the one with the .navbar-toggle) object and check if it's visible.\n vm.isMobile = angular.element('.navbar-toggle:visible').length === 1;\n vm.isDesktop = !vm.isMobile;\n }\n\n updateUserData();\n\n vm.isLogin = function () {\n return $state.is('accountSignInUp.accountSignIn');\n };\n\n vm.isSignUp = function () {\n return $state.is('accountSignInUp.accountSignUp');\n };\n\n vm.showLoginLink = function () {\n return $state.is('accountSignInUp.accountSignUp') || $state.includes('accountPassword');\n };\n\n vm.isAuthenticated = function () {\n return $rootScope.isAuthenticated;\n };\n\n vm.toggleMenu = function () {\n vm.isCollapsed = !vm.isCollapsed;\n };\n\n vm.closeMenu = function () {\n vm.isCollapsed = true;\n };\n\n vm.signOut = function () {\n vm.closeMenu();\n Auth.signOut();\n $state.params = angular.extend($state.params, {logout: true});\n $state.go('accountSignInUp.accountSignIn');\n };\n\n vm.isBusinessAccountActive = function () {\n return angular.isObject(vm.userProfile) && angular.isDefined(vm.userProfile.isBusinessAccountActive) && vm.userProfile.isBusinessAccountActive === true;\n };\n\n vm.getUserProfile = function () {\n return vm.userProfile;\n };\n\n vm.openFeedback = function (helpNeeded) {\n AccountService.openFeedback(vm.userProfile, helpNeeded);\n vm.closeMenu();\n };\n\n vm.openPreferences = function () {\n AccountService.openPreferences(vm.userProfile);\n vm.closeMenu();\n };\n\n vm.openMarketplace = function () {\n Marketplace.open();\n vm.closeMenu();\n };\n\n vm.toggleNotificationCenter = function (isOpen) {\n vm.isNCopen = isOpen;\n };\n\n vm.toggleProfile = function (isOpen) {\n vm.isProfileOpen = isOpen;\n };\n\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n loginSuccessHandler = $rootScope.$on(authEvents.loginSuccess, function () {\n checkForMobile();\n updateUserData();\n });\n updateProfileHandler = $rootScope.$on('event:user-updateProfile', function (event, data) {\n vm.userProfile = data.profile;\n });\n\n // We have to run the mobile-check after user logs is, as if he is a visitor, we are hiding the toggle button\n watchHandle = $rootScope.$watch('isAuthenticated', function () {\n if ($rootScope.isAuthenticated) {\n vm.isDesktop = false;\n vm.isMobile = false;\n $timeout(function () {\n checkForMobile();\n }, 50);\n }\n else {\n vm.userProfile = undefined;\n }\n });\n $rootScope.$on('$destroy', function () {\n watchHandle();\n notificationHandler();\n });\n\n // Subscribe to the element resize\n angular.element($window).on('resize', function () {\n checkForMobile();\n vm.closeMenu();\n $scope.$apply();\n });\n\n // Do the check for the initial state.\n $document.ready(checkForMobile);\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name dashboard.directive:businessSuggestion\n * @restrict EA\n * @element\n *\n * @description\n */\n angular\n .module('toolbar')\n .directive('businessSuggestion', businessSuggestion);\n\n function businessSuggestion() {\n return {\n restrict: 'EA',\n scope: {\n user: '=user'\n },\n replace: true,\n templateUrl: 'toolbar/business-suggestion-directive.tpl.html',\n controllerAs: 'suggestion',\n controller: ['$rootScope', '$scope', 'configOptions', 'BusinessAccount', '$document', 'Notification', 'Session', function ($rootScope, $scope, configOptions, BusinessAccount, $document, Notification, Session) {\n var vm = this,\n count = 0,\n trialCount = 0,\n body = angular.element($document[0].body),\n userProfileDeferred = Session.getUserProfile(),\n logoutSuccessHandler;\n\n // Default state of the visibility of this directive's content\n vm.isClosed = true;\n\n logoutSuccessHandler = $rootScope.$on('event:auth-logoutSuccess', function () {\n body.removeClass('has-suggestion');\n });\n\n // Remove the handle once it's all destroyed\n $rootScope.$on('$destroy', logoutSuccessHandler);\n\n // Get the user data from session.\n function updateUserData() {\n userProfileDeferred.then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n vm.trialData = BusinessAccount.getTrialData(vm.userProfile);\n // Trigger the check count as there might be some trial data available\n checkCount();\n // If there is a warning, we will show the directive no matter what.\n if (vm.trialData.isInTrial && vm.trialData.trialWarning) {\n vm.setIsClosed(false);\n }\n }\n });\n }\n\n /**\n * @ngdoc function\n * @name closeSuggestion\n * @methodOf registerSuggestion.controller:suggestion\n * @description Closes the suggestion. At the same time it increases the count in the local storage or sets the new timestamp (if user never signs out)\n */\n vm.closeSuggestion = function () {\n vm.setIsClosed(true);\n BusinessAccount.updateSuggestionCount(count);\n if (vm.trialData && vm.trialData.isEligibleForTrial) {\n BusinessAccount.updateTrialSuggestionCount(trialCount);\n }\n };\n\n /**\n * @ngdoc function\n * @name checkCount\n * @methodOf registerSuggestion.controller:suggestion\n * @description Checks the number of how many times have we bothered the user with the suggestions already. If we have bothered him => than the number in the settings, then keep it closed. If it's less, open the suggestion.\n * @private\n */\n function checkCount() {\n var closeIt = false;\n\n // Get the cached count value for business suggestion and trialSuggestions.\n // Trial suggestions are overriding the business ones.\n count = BusinessAccount.getSuggestionsCount();\n trialCount = BusinessAccount.getTrialSuggestionsCount();\n closeIt = count < configOptions.maxBusinessSuggestions ? false : true;\n if (vm.trialData && vm.trialData.isEligibleForTrial) {\n closeIt = trialCount < configOptions.maxBusinessSuggestions ? false : true;\n }\n vm.setIsClosed(closeIt);\n }\n\n /**\n * Redirects to Business registration\n */\n vm.registerBusiness = function () {\n // Open the popup dialog\n vm.isActivating = true;\n BusinessAccount.initiateActivation(body[0], vm.trialData.isEligibleForTrial)\n .then(function () {\n Notification({message: 'Your business account has been successfully activated.'}, 'confirmation');\n vm.isActivating = false;\n vm.setIsClosed(true);\n }, function () {\n vm.isActivating = false;\n vm.setIsClosed(true);\n });\n };\n\n /**\n * Sets the isClosed model variable to the incoming parameter\n * @param {Boolean} isClosed Whether the suggestion is to be closed now.\n */\n vm.setIsClosed = function (isClosed) {\n if (vm.isClosed !== isClosed) {\n // Do the CSS change on the body so the content knows it needs to shift a little\n if (isClosed) {\n body.removeClass('has-suggestion');\n }\n else {\n body.addClass('has-suggestion');\n }\n }\n vm.isClosed = isClosed;\n };\n\n //\n updateUserData();\n\n // Check the count from cache. This will also reset the visibility status from visible if this has been shown before.\n checkCount();\n }],\n link: function (scope, element, attrs, ctrl) {\n ctrl.element = element;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name socialShare\n *\n * @description\n *\n */\n angular\n .module('socialShare', [\n 'socialShare.providers',\n 'urlShorteners'\n ]);\n\n angular\n .module('socialShare')\n .config(config)\n .run(run);\n\n function config() {\n }\n\n function run(SocialShare) {\n SocialShare.init();\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialShare.provider:SocialShare\n *\n * @description SocialShare provider, generic functionality to share content via social service\n *\n */\n angular\n .module('socialShare')\n .provider('SocialShare', SocialShare);\n\n function SocialShare() {\n var socialServices = {\n facebook: 'FacebookSocialShare',\n linkedin: 'LinkedinSocialShare',\n twitter: 'TwitterSocialShare',\n google: 'GooglePlusSocialShare'\n },\n config = {};\n\n /**\n * Get instance name for social service\n * @param {string} name Social service identifier\n * @returns {string} Instance name\n */\n function getInstanceNameForSocialService(name) {\n if (angular.isDefined(socialServices[name])) {\n return socialServices[name];\n }\n\n throw new Error('Unknown provider');\n }\n\n return {\n /**\n * Set configuration\n * @param {string} socialService Social service identifier\n * @param {string} paramName Name of configuration option\n * @param {*} value Value of configuration option\n */\n set: function (socialService, paramName, value) {\n if (angular.isUndefined(config[socialService])) {\n config[socialService] = {};\n }\n\n config[socialService][paramName] = value;\n },\n $get: ['$q', '$rootScope', '$injector',\n function ($q, $rootScope, $injector) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var $socialShare = $q.defer(),\n socialInitHandler;\n\n /**\n * Initialisation - iterates over all supported providers and initialises them\n */\n $socialShare.init = function () {\n var promises = [];\n angular.forEach(socialServices, function (instanceName, name) {\n var instance = $injector.get(instanceName);\n promises.push(instanceName.promise);\n instance.init(config[name] || {});\n });\n\n $q.all(promises).then(function () {\n $rootScope.$broadcast('socialShare-init');\n });\n };\n\n socialInitHandler = $rootScope.$on('socialShare-init', function () {\n $socialShare.resolve();\n });\n\n /**\n * Share a content\n * @param {string} socialService Social service identifier\n * @param {object} data Data to share\n */\n $socialShare.share = function (socialService, data) {\n $injector.get(getInstanceNameForSocialService(socialService)).share(data);\n };\n\n return $socialShare;\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name socialShare.directive:socialShare\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('socialShare')\n .directive('socialShare', socialShare);\n\n function socialShare() {\n return {\n restrict: 'EA',\n scope: {\n url: '=',\n shortUrl: '=',\n title: '=',\n name: '=',\n description: '=',\n source: '=',\n picture: '=',\n hashTags: '=',\n buttonId: '='\n },\n templateUrl: 'social-share/social-share-directive.tpl.html',\n replace: false,\n controllerAs: 'socialShare',\n controller: ['$scope', 'SocialShare', '$location', 'BitlyUrlShortener', 'configOptions',\n function ($scope, SocialShare, $location, BitlyUrlShortener, configOptions) {\n var vm = this;\n if ($scope.buttonId) {\n vm.id = $scope.buttonId;\n }\n else {\n vm.id = '';\n }\n vm.share = function (socialService) {\n var url = $scope.url || $location.absUrl();\n if ($scope.shortUrl) {\n SocialShare.share(socialService, {\n url: $scope.shortUrl,\n name: $scope.name || configOptions.defaultShareName,\n title: $scope.title,\n description: $scope.description || configOptions.defaultShareMessage,\n source: $scope.source || 'MyLeadPod',\n picture: $scope.picture || configOptions.appUrl + '/images/touch-icon-192x192.png',\n hashTags: $scope.hashTags\n });\n }\n else {\n BitlyUrlShortener.shorten(url).then(function (shortUrl) {\n SocialShare.share(socialService, {\n url: shortUrl,\n name: $scope.name || configOptions.defaultShareName,\n title: $scope.title,\n description: $scope.description || configOptions.defaultShareMessage,\n source: $scope.source || 'MyLeadPod',\n picture: $scope.picture || configOptions.appUrl + '/images/touch-icon-192x192.png',\n hashTags: $scope.hashTags\n });\n });\n }\n };\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name socialNetwork\n * @description\n *\n */\n angular\n .module('socialNetwork', [\n 'ui.router'\n ]);\n\n angular\n .module('socialNetwork')\n .config(config);\n\n function config(configOptions) {\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n hello.init({\n facebook: configOptions.facebookAppId,\n google: configOptions.googlePlusClientId,\n linkedin: {\n id: configOptions.linkedInClientId,\n scope: {\n basic: 'r_liteprofile',\n email: 'r_emailaddress'\n }\n }\n }, {\n oauth_proxy: configOptions.linkedInProxy\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialNetwork.constant:socialNetworkProvider\n *\n * @description\n *\n */\n angular\n .module('socialNetwork')\n .constant('socialNetworkProvider', {\n google: 'google',\n facebook: 'facebook',\n linkedIn: 'linkedin'\n });\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name socialNetwork.service:SocialAccount\n *\n * @description\n *\n */\n angular\n .module('socialNetwork')\n .service('SocialAccount', SocialAccount);\n\n function SocialAccount($q, $state, configOptions, socialNetworkProvider, Auth) {\n var self = this;\n\n /**\n * Signs user in\n *\n * @param {string} provider Social network name\n * @param {Object} options Additional options\n * @param {Object} params Additional parameters\n * @returns {Deferred} Deferred promise\n */\n function signIn(provider, options, params) {\n var deferred = $q.defer();\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n if (!angular.isObject(options)) {\n options = {};\n }\n\n options.redirect_uri = $state.href($state.current, $state.params, {absolute: true});\n hello.login(provider, options, function () {\n var result = hello(provider).getAuthResponse();\n if (angular.isObject(result) && angular.isDefined(result.access_token)) {\n Auth.socialSignIn(provider, result.access_token, params)\n .then(function (signInResult) {\n deferred.resolve(signInResult);\n }, function (reason) {\n deferred.reject(reason);\n });\n }\n else {\n deferred.reject('An error occurred');\n }\n });\n\n return deferred.promise;\n }\n\n /**\n * Google Sign In\n *\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n function googleSignIn(params) {\n return signIn(socialNetworkProvider.google, {\n scope: configOptions.googlePlusScope\n }, params);\n }\n\n /**\n * Facebook Sign In\n *\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n function facebookSignIn(params) {\n return signIn(socialNetworkProvider.facebook, {\n scope: configOptions.facebookScope\n }, params);\n }\n\n /**\n * LinkedIn Sign In\n *\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n function linkedInSignIn(params) {\n return signIn(socialNetworkProvider.linkedIn, {\n scope: configOptions.linkedInScope\n }, params);\n }\n\n /**\n * Signs user in\n *\n * @param {string} provider Social network name\n * @param {Object} params Additional parameters\n *\n * @returns {Deferred} Deferred promise\n */\n self.signIn = function (provider, params) {\n switch (provider) {\n case socialNetworkProvider.google:\n return googleSignIn(params);\n case socialNetworkProvider.facebook:\n return facebookSignIn(params);\n case socialNetworkProvider.linkedIn:\n return linkedInSignIn(params);\n default:\n throw new Error('Unknown social network provider');\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components.ui.search\n * @description\n *\n */\n angular\n .module('mlp-search', []);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlp-search.directive:searchBar\n * @restrict EA\n * @element\n *\n * @description This is the directory search bar that searches across the user's content\n *\n */\n angular\n .module('mlp-search')\n .directive('searchBar', searchBar);\n\n function searchBar() {\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'search/search-bar-directive.tpl.html',\n replace: true,\n controllerAs: 'searchbar',\n controller: ['$scope', '$document', '$state', 'Session', 'Leads', function ($scope, $document, $state, Session, Leads) {\n var vm = this,\n userProfileDeferred = Session.getUserProfile();\n\n function handleLeads(item) {\n Leads.openDetail(item.id, item.leadtype);\n }\n\n //\n vm.searchCategories = [\n {name: 'All', value: 'all'},\n {name: 'My Pod', value: 'myPod', stateTarget: 'user', iconClass: 'fa-user'},\n {name: 'Directory', value: 'businessUsers', stateTarget: 'user.about', iconClass: 'fa-briefcase'},\n {name: 'Leads', value: 'leads', callbackHandler: handleLeads, iconClass: 'fa-paper-plane'},\n {name: 'Charities', value: 'charities', stateTarget: 'user', iconClass: 'fa-heart-o'}\n ];\n\n // Get the user data from session.\n function updateUserData() {\n userProfileDeferred.then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n if (vm.userProfile.isBusinessAccountActive) {\n vm.searchCategories.push({name: 'My Connections', value: 'myConnections', stateTarget: 'user', iconClass: 'fa-user-o'});\n }\n }\n });\n }\n updateUserData();\n\n // For the autocomplete (angucomplete)\n vm.searchbarId = 'directory-searchbar';\n // vm.searchUrl = 'https://admin-pilot.myleadpod.com/dataapi/myleadpod/v1/Members/index?limit=10&offset=0&status=active&search=';\n vm.searchUrl = 'https://admin-pilot.myleadpod.com/dataapi/myleadpod/v1/Search/index?keyword=';\n vm.searchService = 'Search';\n vm.searchServiceEndPoint = 'index';\n\n vm.onSearchItemSelected = function (item) {\n var stateTarget,\n callbackHandler;\n\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item) {\n return;\n }\n\n stateTarget = _.find(vm.searchCategories, {value: item.originalObject.category}).stateTarget;\n callbackHandler = _.find(vm.searchCategories, {value: item.originalObject.category}).callbackHandler;\n if (stateTarget && item.originalObject.id) {\n $state.go(stateTarget, {id: item.originalObject.id});\n }\n else if (callbackHandler) {\n callbackHandler(item.originalObject);\n }\n };\n\n /**\n * Format the reponse coming from the server, channeled via search-autocomplete-directive\n *\n * @param {object} response Raw response object coming from Search REST Endpoint\n *\n * @returns {object} Formatted result item\n */\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n\n r = response.records;\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.leadtype) {\n categoryDescriptionClass += item.leadtype === 'received' ? ' fa-paper-plane-o' : '';\n value += ' | ' + item.leadfullname;\n }\n else if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.focusIn = function () {\n $document.find('.navbar-header').addClass('search-focused');\n };\n vm.focusOut = function () {\n $document.find('.navbar-header').removeClass('search-focused');\n };\n }],\n\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlp-search.directive:searchAutocomplete\n * @restrict EA\n * @element\n *\n * @description This is the directory search bar that searches across the user's content\n *\n */\n angular\n .module('mlp-search')\n .directive('searchAutocomplete', searchAutocomplete);\n\n function searchAutocomplete($q, $parse, $http, $sce, $timeout, $templateCache, $interpolate, $window, $document, Restangular) {\n // keyboard events\n var KEY_DW = 40,\n KEY_RT = 39,\n KEY_UP = 38,\n KEY_LF = 37,\n KEY_ES = 27,\n KEY_EN = 13,\n KEY_TAB = 9,\n\n MIN_LENGTH = 3,\n MAX_LENGTH = 524288,\n PAUSE = 300,\n BLUR_TIMEOUT = 200,\n\n REQUIRED_CLASS = 'autocomplete-required',\n TEXT_SEARCHING = 'Searching...',\n TEXT_NORESULTS = 'No results found';\n\n function link(scope, elem, attrs, ctrl) {\n var inputField = elem.find('input'),\n minlength = MIN_LENGTH,\n searchTimer = null,\n hideTimer,\n requiredClassName = REQUIRED_CLASS,\n responseFormatter,\n validState = null,\n httpCanceller = null,\n httpCallInProgress = false,\n dd = elem[0].querySelector('.search-autocomplete-dropdown'),\n isScrollOn = false,\n mousedownOn = null,\n unbindInitialValue,\n displaySearching,\n displayNoResults,\n lastSearchStr,\n bodyClickHandler,\n onBodyClickListener;\n\n // For the filter\n scope.showFilterDropdown = false;\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.searchFocused = false;\n scope.resultsBackup = null;\n scope.showResultsFilter = false;\n scope.hasCategoryFilter = typeof scope.hasCategoryFilter === 'undefined';\n\n // For the history dropdown\n scope.showHistoryDropdown = false;\n scope.historyItems = [];\n scope.currentHistoryIndex = -1;\n\n // Check if the dropdown is positioned relatively\n if (scope.isDropdownRelative) {\n angular.element(dd).css('position', 'relative');\n }\n\n // Setup the selected categories based on search categories\n if (scope.searchCategories && scope.searchCategories.length === 1) {\n scope.selectedCategories = [scope.searchCategories[0].value];\n }\n\n bodyClickHandler = function (evt) {\n scope.checkFocus(evt, true);\n };\n\n elem.on('mousedown', function (event) {\n if (event.target.id) {\n mousedownOn = event.target.id;\n if (mousedownOn === scope.id + '_dropdown') {\n $document[0].body.addEventListener('click', clickoutHandlerForDropdown);\n }\n }\n else {\n mousedownOn = event.target.className;\n }\n });\n\n scope.currentIndex = scope.focusFirst ? 0 : null;\n scope.searching = false;\n unbindInitialValue = scope.$watch('initialValue', function (newval) {\n if (newval) {\n // remove scope listener\n unbindInitialValue();\n // change input\n handleInputChange(newval, true);\n }\n });\n\n scope.$watch('fieldRequired', function (newval, oldval) {\n if (newval !== oldval) {\n if (!newval) {\n ctrl[scope.inputName].$setValidity(requiredClassName, true);\n }\n else if (!validState || scope.currentIndex === -1) {\n handleRequired(false);\n }\n else {\n handleRequired(true);\n }\n }\n });\n\n scope.$on('search-autocomplete:clearInput', function (event, elementId) {\n if (!elementId || elementId === scope.id) {\n scope.searchStr = null;\n callOrAssign();\n handleRequired(false);\n clearResults();\n }\n });\n\n scope.$on('search-autocomplete:changeInput', function (event, elementId, newval) {\n if (!!elementId && elementId === scope.id) {\n handleInputChange(newval);\n }\n });\n\n function handleInputChange(newval, initial) {\n if (newval) {\n if (angular.isObject(newval)) {\n scope.searchStr = extractTitle(newval);\n callOrAssign({originalObject: newval});\n }\n else if (angular.isString(newval) && newval.length > 0) {\n scope.searchStr = newval;\n }\n else if (console && console.error) {\n console.error('Tried to set ' + (!initial ? 'initial' : '') + ' value of search-autocomplete to', newval, 'which is an invalid value');\n }\n\n handleRequired(true);\n }\n }\n\n // #194 dropdown list not consistent in collapsing (bug).\n function clickoutHandlerForDropdown(event) {\n mousedownOn = null;\n scope.hideResults(event, false);\n $document[0].body.removeEventListener('click', clickoutHandlerForDropdown);\n }\n\n // for IE8 quirkiness about event.which\n function ie8EventNormalizer(event) {\n return event.which ? event.which : event.keyCode;\n }\n\n function callOrAssign(value) {\n if (value && scope.blurOnSelect) {\n inputField.blur();\n $timeout(function () {\n scope.searchFocused = false;\n }, 100);\n }\n\n if (angular.isFunction(scope.selectedObject)) {\n scope.selectedObject(value, scope.selectedObjectData);\n }\n else {\n scope.selectedObject = value;\n }\n\n if (value) {\n handleRequired(true);\n }\n else {\n handleRequired(false);\n }\n }\n\n function callFunctionOrIdentity(fn) {\n return function (data) {\n return scope[fn] ? scope[fn](data) : data;\n };\n }\n\n function setInputString(str) {\n callOrAssign({originalObject: str});\n\n if (scope.clearSelected) {\n scope.searchStr = null;\n }\n clearResults();\n }\n\n function extractTitle(data) {\n // split title fields and run extractValue for each and join with ' '\n return scope.titleField.split(',')\n .map(function (field) {\n return extractValue(data, field);\n })\n .join(' ');\n }\n\n function extractValue(obj, key) {\n var keys, result, i;\n if (key) {\n keys = key.split('.');\n result = obj;\n for (i = 0; i < keys.length; i++) {\n result = result[keys[i]];\n }\n }\n else {\n result = obj;\n }\n return result;\n }\n\n function findMatchString(target, str) {\n var result, matches, re;\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n // Escape user input to be treated as a literal string within a regular expression\n re = new RegExp(str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'i');\n if (!target) {\n return null;\n }\n if (!target.match || !target.replace) {\n target = target.toString();\n }\n matches = target.match(re);\n if (matches) {\n result = target.replace(re, '' + matches[0] + '');\n }\n else {\n result = target;\n }\n return $sce.trustAsHtml(result);\n }\n\n function handleRequired(valid) {\n scope.notEmpty = valid;\n validState = scope.searchStr;\n if (scope.fieldRequired && ctrl && scope.inputName) {\n ctrl[scope.inputName].$setValidity(requiredClassName, valid);\n }\n }\n\n /* eslint complexity: [2, 25]*/\n function keyupHandler(event) {\n var which = ie8EventNormalizer(event);\n if (which === KEY_LF || which === KEY_RT) {\n // do nothing\n return;\n }\n\n if (which === KEY_UP || which === KEY_EN) {\n event.preventDefault();\n }\n else if (which === KEY_DW) {\n event.preventDefault();\n\n if (scope.searchStr && scope.searchStr === lastSearchStr && scope.results.length > 0) {\n // So there is a result object, the search string is the same as per the last search string and user pressed DWN button. ->\n // open the dropdown with results then without invoking a new search\n scope.searching = false;\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n scope.showHistoryDropdown = false;\n scope.$apply();\n }\n else if (!scope.showDropdown && scope.searchStr && scope.searchStr.length >= minlength) {\n initResults();\n scope.searching = true;\n resetCategories();\n searchTimerComplete(scope.searchStr);\n }\n else if (scope.historyItems && scope.hasHistory) {\n if (!scope.showHistoryDropdown) {\n scope.currentHistoryIndex = -1;\n }\n scope.showHistoryDropdown = true;\n scope.$apply();\n }\n }\n else if (which === KEY_ES) {\n if (scope.results && scope.showDropdown) {\n scope.showDropdown = false;\n }\n else if (scope.results && !scope.showDropdown) {\n clearResults();\n scope.searchStr = null;\n }\n scope.showHistoryDropdown = false;\n scope.$apply(function () {\n inputField.val(scope.searchStr);\n });\n }\n else {\n if (minlength === 0 && !scope.searchStr) {\n return;\n }\n\n lastSearchStr = scope.searchStr;\n if (scope.searchStr && scope.searchStr.length >= minlength) {\n initResults();\n\n if (searchTimer) {\n $timeout.cancel(searchTimer);\n }\n\n scope.searching = true;\n resetCategories();\n searchTimer = $timeout(function () {\n searchTimerComplete(scope.searchStr);\n }, scope.pause);\n }\n else if (!scope.searchStr || scope.searchStr === '' || scope.searchStr.length < minlength) {\n scope.showDropdown = false;\n if (searchTimer) {\n $timeout.cancel(searchTimer);\n }\n scope.searching = false;\n }\n\n if (validState && validState !== scope.searchStr && !scope.clearSelected) {\n scope.$apply(function () {\n callOrAssign();\n });\n }\n }\n }\n\n function keydownHandler(event) {\n if (scope.results && scope.results.length > 0) {\n handleKeyDown(event, scope.results, scope.currentIndex, scope.showDropdown, false);\n }\n else if (scope.historyItems && scope.historyItems.length > 0) {\n handleKeyDown(event, scope.historyItems, scope.currentHistoryIndex, scope.showHistoryDropdown, true);\n }\n }\n\n function handleKeyDown(event, results, currentIndex, showDropdown, isHistory) {\n var which = ie8EventNormalizer(event),\n row = null,\n rowTop = null;\n\n // Straightaway is this is a history, and it's not TAB, KEYDOWN, KEYUP or Enter then just hide it.\n if (isHistory && which !== KEY_EN && which !== KEY_DW && which !== KEY_UP && which !== KEY_TAB) {\n scope.showHistoryDropdown = false;\n return;\n }\n\n if (which === KEY_EN && results) {\n if (currentIndex >= 0 && currentIndex < results.length) {\n event.preventDefault();\n if (isHistory) {\n scope.selectHistoryItem(results[currentIndex]);\n }\n else {\n scope.selectResult(results[currentIndex]);\n }\n }\n else {\n handleOverrideSuggestions(event);\n }\n scope.$apply();\n }\n else if (which === KEY_DW && results && currentIndex + 1 < results.length && showDropdown) {\n event.preventDefault();\n scope.$apply(function () {\n currentIndex += 1;\n updateCurrentIndexByOne(false, isHistory);\n updateInputField(results, currentIndex);\n });\n\n if (isScrollOn) {\n row = dropdownRow(currentIndex);\n if (dropdownHeight() < row.getBoundingClientRect().bottom) {\n dropdownScrollTopTo(dropdownRowOffsetHeight(row));\n }\n }\n }\n else if (which === KEY_UP && results) {\n event.preventDefault();\n if (currentIndex >= 1) {\n scope.$apply(function () {\n currentIndex -= 1;\n updateCurrentIndexByOne(true, isHistory);\n updateInputField(results, currentIndex);\n });\n\n if (isScrollOn) {\n rowTop = dropdownRowTop(isHistory ? scope.currentIndex : scope.currentHistoryIndex);\n if (rowTop < 0) {\n dropdownScrollTopTo(rowTop - 1);\n }\n }\n }\n else if (currentIndex === 0) {\n scope.$apply(function () {\n currentIndex -= 1;\n updateCurrentIndexByOne(true, isHistory);\n inputField.val(scope.searchStr);\n });\n }\n }\n else if (which === KEY_TAB) {\n if (results && results.length > 0 && showDropdown) {\n if (currentIndex === -1 && scope.overrideSuggestions) {\n // intentionally not sending event so that it does not\n // prevent default tab behavior\n handleOverrideSuggestions();\n }\n else {\n if (currentIndex === -1) {\n currentIndex = 0;\n updateCurrentIndexByOne(0, isHistory);\n }\n if (isHistory) {\n scope.selectHistoryItem(results[currentIndex]);\n }\n else {\n scope.selectResult(results[currentIndex]);\n }\n\n scope.$apply();\n }\n }\n else if (scope.searchStr && scope.searchStr.length > 0) {\n // no results\n // intentionally not sending event so that it does not\n // prevent default tab behavior\n handleOverrideSuggestions();\n }\n }\n else if (which === KEY_ES) {\n // This is very specific to IE10/11 #272\n // without this, IE clears the input text\n event.preventDefault();\n }\n }\n\n function updateCurrentIndexByOne(negative, isHistory) {\n if (isHistory) {\n if (negative === 0) {\n scope.currentHistoryIndex = 0;\n }\n else if (negative === true) {\n scope.currentHistoryIndex -= 1;\n }\n else {\n scope.currentHistoryIndex += 1;\n }\n return;\n }\n\n if (negative === 0) {\n scope.currentIndex = 0;\n }\n else if (negative === true) {\n scope.currentIndex -= 1;\n }\n else {\n scope.currentIndex += 1;\n }\n }\n\n function handleOverrideSuggestions(event) {\n if (scope.overrideSuggestions &&\n !(scope.selectedObject && scope.selectedObject.originalObject === scope.searchStr)) {\n if (event) {\n event.preventDefault();\n }\n\n // cancel search timer\n $timeout.cancel(searchTimer);\n // cancel http request\n cancelHttpRequest();\n\n setInputString(scope.searchStr);\n }\n }\n\n function dropdownRowOffsetHeight(row) {\n var css = $window.getComputedStyle(row);\n return row.offsetHeight +\n parseInt(css.marginTop, 10) + parseInt(css.marginBottom, 10);\n }\n\n function dropdownHeight() {\n return dd.getBoundingClientRect().top +\n parseInt($window.getComputedStyle(dd).maxHeight, 10);\n }\n\n function dropdownRow(currentIndex) {\n return elem[0].querySelectorAll('.search-autocomplete-row')[currentIndex];\n }\n\n function dropdownRowTop(currentIndex) {\n return dropdownRow(currentIndex).getBoundingClientRect().top -\n (dd.getBoundingClientRect().top +\n parseInt($window.getComputedStyle(dd).paddingTop, 10));\n }\n\n function dropdownScrollTopTo(offset) {\n dd.scrollTop += offset;\n }\n\n function updateInputField(results, currentIndex) {\n var current = null;\n if (!results && !currentIndex) {\n results = scope.results;\n currentIndex = scope.currentIndex;\n }\n current = results[currentIndex];\n if (scope.matchClass) {\n inputField.val(extractTitle(current.originalObject));\n }\n else {\n inputField.val(current.title);\n }\n }\n\n function httpSuccessCallbackGen(str) {\n return function (responseData, status, headers, config) {\n // normalize return obejct from promise\n if (!status && !headers && !config && responseData.data) {\n responseData = responseData.data;\n }\n scope.searching = false;\n processResults(\n extractValue(responseFormatter(responseData), scope.remoteUrlDataField),\n str);\n };\n }\n\n function httpErrorCallback(errorRes, status, headers, config) {\n scope.searching = httpCallInProgress;\n\n // normalize return obejct from promise\n if (!status && !headers && !config) {\n status = errorRes.status;\n }\n\n // cancelled/aborted\n if (status === 0 || status === -1) {\n return;\n }\n if (scope.remoteUrlErrorCallback) {\n scope.remoteUrlErrorCallback(errorRes, status, headers, config);\n }\n else if (console && console.error) {\n console.error('http error');\n }\n }\n\n function cancelHttpRequest() {\n if (httpCanceller) {\n httpCanceller.resolve();\n }\n }\n\n function getRemoteResults(str) {\n var params = {},\n url = scope.remoteUrl + encodeURIComponent(str);\n\n if (scope.remoteUrl) {\n if (scope.remoteUrlRequestFormatter) {\n params = {\n params: scope.remoteUrlRequestFormatter(str)\n };\n url = scope.remoteUrl;\n }\n\n if (!scope.remoteUrlRequestWithCredentials) {\n params.withCredentials = true;\n }\n cancelHttpRequest();\n httpCanceller = $q.defer();\n params.timeout = httpCanceller.promise;\n httpCallInProgress = true;\n $http.get(url, params)\n .then(httpSuccessCallbackGen(str))\n .catch(httpErrorCallback)\n .finally(function () {\n httpCallInProgress = false;\n });\n }\n else if (scope.searchService && scope.searchServiceEndPoint) {\n Restangular.all(scope.searchService).get(scope.searchServiceEndPoint, {\n keyword: str,\n categories: scope.selectedCategories && scope.selectedCategories.length > 0 ? scope.selectedCategories.toString() : 'all'\n }).then(httpSuccessCallbackGen(str), httpErrorCallback).finally(function () {\n httpCallInProgress = false;\n });\n }\n }\n\n function getRemoteResultsWithCustomHandler(str) {\n cancelHttpRequest();\n\n httpCanceller = $q.defer();\n\n scope.remoteApiHandler(str, httpCanceller.promise)\n .then(httpSuccessCallbackGen(str))\n .catch(httpErrorCallback);\n\n /* IE8 compatible\n scope.remoteApiHandler(str, httpCanceller.promise)\n ['then'](httpSuccessCallbackGen(str))\n ['catch'](httpErrorCallback);\n */\n }\n\n function clearResults(hideOnly) {\n scope.showDropdown = false;\n if (!hideOnly) {\n lastSearchStr = null;\n scope.results = [];\n scope.showResultsFilter = false;\n if (dd) {\n dd.scrollTop = 0;\n }\n }\n }\n\n function initResults() {\n scope.showDropdown = displaySearching;\n scope.currentIndex = scope.focusFirst ? 0 : -1;\n /* scope.results = [];*/\n }\n\n function getLocalResults(str) {\n var i, match, s, value,\n searchFields = scope.searchFields.split(','),\n matches = [];\n\n if (typeof scope.parseInput() !== 'undefined') {\n str = scope.parseInput()(str);\n }\n for (i = 0; i < scope.localData.length; i++) {\n match = false;\n\n for (s = 0; s < searchFields.length; s++) {\n value = extractValue(scope.localData[i], searchFields[s]) || '';\n match = match || value.toString().toLowerCase().indexOf(str.toString().toLowerCase()) >= 0;\n }\n\n if (match) {\n matches[matches.length] = scope.localData[i];\n }\n }\n return matches;\n }\n\n function checkExactMatch(result, obj, str) {\n var key;\n\n if (!str) {\n return false;\n }\n for (key in obj) {\n if (obj[key].toLowerCase() === str.toLowerCase()) {\n scope.selectResult(result);\n return true;\n }\n }\n return false;\n }\n\n function searchTimerComplete(str) {\n // Begin the search\n if (!str || str.length < minlength) {\n return;\n }\n if (scope.localData) {\n scope.$apply(function () {\n var matches;\n if (typeof scope.localSearch() !== 'undefined') {\n matches = scope.localSearch()(str, scope.localData);\n }\n else {\n matches = getLocalResults(str);\n }\n scope.searching = false;\n processResults(matches, str);\n });\n }\n else if (scope.remoteApiHandler) {\n getRemoteResultsWithCustomHandler(str);\n }\n else {\n getRemoteResults(str);\n }\n }\n\n function resetCategories() {\n // Reset all search categories focusFirst\n if (!scope.searchCategories) {\n return;\n }\n angular.forEach(scope.searchCategories, function (sc) {\n sc.hasResults = false;\n });\n $timeout(function () {\n scope.$apply();\n });\n }\n\n function processResults(responseData, str, isHistory) {\n var i,\n item,\n description,\n description2,\n image, text,\n formattedText,\n formattedDesc,\n foundCategories = [];\n\n if (responseData && responseData.length > 0) {\n scope.results = [];\n\n for (i = 0; i < responseData.length; i++) {\n if (scope.titleField && scope.titleField !== '') {\n text = formattedText = extractTitle(responseData[i]);\n }\n\n description = '';\n if (scope.descriptionField) {\n description = formattedDesc = extractValue(responseData[i], scope.descriptionField);\n }\n\n if (scope.descriptionField2) {\n description2 = extractValue(responseData[i], scope.descriptionField2);\n }\n\n image = '';\n if (scope.imageField) {\n image = extractValue(responseData[i], scope.imageField);\n }\n\n if (scope.matchClass) {\n formattedText = findMatchString(text, str);\n // formattedDesc = findMatchString(description, str);\n }\n\n // Now check the category so we can update the badge on the category filter.\n if (scope.categoryField) {\n foundCategories.push(responseData[i][scope.categoryField]);\n }\n\n item = {\n title: formattedText,\n description: formattedDesc,\n description2: description2,\n image: image,\n originalObject: responseData[i]\n };\n\n if (!isHistory) {\n scope.results[scope.results.length] = item;\n }\n else {\n scope.historyItems[scope.historyItems.length] = item;\n }\n }\n\n // Now check the categories\n if (!isHistory && scope.searchCategories && scope.searchCategories.length > 0) {\n // Make the values unique\n foundCategories = _.uniq(foundCategories);\n // Now loop through each category and apply the badge\n angular.forEach(foundCategories, function (category) {\n _.find(scope.searchCategories, {value: category}).hasResults = true;\n });\n }\n }\n else {\n scope.results = [];\n }\n\n // Update the showResultsFilter value\n if (!isHistory) {\n scope.showResultsFilter = scope.searchCategories && scope.results;\n\n if (scope.autoMatch && scope.results.length === 1 &&\n checkExactMatch(scope.results[0],\n {title: text, desc: description || ''}, scope.searchStr)) {\n scope.showDropdown = false;\n }\n else if (scope.results.length === 0 && !displayNoResults) {\n scope.showDropdown = false;\n }\n else {\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n scope.showHistoryDropdown = false;\n }\n\n // Make the backup\n scope.resultsBackup = {\n categories: _.clone(scope.selectedCategories),\n results: _.clone(scope.results)\n };\n }\n }\n\n function showAll() {\n if (scope.localData) {\n scope.searching = false;\n processResults(scope.localData, '');\n }\n else if (scope.remoteApiHandler) {\n scope.searching = true;\n resetCategories();\n getRemoteResultsWithCustomHandler('');\n }\n else {\n scope.searching = true;\n resetCategories();\n getRemoteResults('');\n }\n }\n\n scope.onFocusHandler = function () {\n if (scope.focusIn) {\n scope.focusIn();\n }\n scope.showFilterDropdown = false;\n if (minlength === 0 && (!scope.searchStr || scope.searchStr.length === 0)) {\n scope.currentIndex = scope.focusFirst ? 0 : scope.currentIndex;\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n showAll();\n }\n if (scope.searchStr && scope.searchStr === lastSearchStr && scope.results.length > 0) {\n // So there is a result object, the search string is the same as per the last search string and user pressed DWN button. ->\n // open the dropdown with results then without invoking a new search\n scope.searching = false;\n scope.showDropdown = true;\n }\n else if (scope.hasHistory && scope.historyItems) {\n scope.showHistoryDropdown = true;\n scope.currentHistoryIndex = -1;\n }\n };\n\n scope.hideResults = function (event, hideOnly) {\n var element = angular.element(event.relatedTarget);\n if (mousedownOn &&\n (mousedownOn === scope.id + '_dropdown' ||\n mousedownOn.indexOf('search-autocomplete') >= 0)) {\n mousedownOn = null;\n }\n else if (!element.closest('.search-autocomplete-holder')) {\n // If the element is the child of the autocomplete holder, don't lose the focus\n hideTimer = $timeout(function () {\n clearResults(hideOnly);\n scope.$apply(function () {\n if (scope.searchStr && scope.searchStr.length > 0) {\n inputField.val(scope.searchStr);\n }\n });\n }, BLUR_TIMEOUT);\n cancelHttpRequest();\n\n if (scope.focusOut) {\n scope.focusOut();\n }\n\n if (scope.overrideSuggestions) {\n if (scope.searchStr && scope.searchStr.length > 0 && scope.currentIndex === -1) {\n handleOverrideSuggestions();\n }\n }\n }\n };\n\n scope.resetHideResults = function () {\n if (hideTimer) {\n $timeout.cancel(hideTimer);\n }\n };\n\n scope.hoverRow = function (index, isHistory) {\n if (isHistory) {\n scope.currentHistoryIndex = index;\n }\n else {\n scope.currentIndex = index;\n }\n };\n\n scope.removeHover = function (isHistory) {\n if (isHistory) {\n scope.currentHistoryIndex = -1;\n }\n else {\n scope.currentIndex = -1;\n }\n };\n\n scope.selectResult = function (result) {\n // Restore original values\n if (scope.matchClass) {\n result.title = extractTitle(result.originalObject);\n result.description = extractValue(result.originalObject, scope.descriptionField);\n }\n\n if (scope.clearSelected) {\n scope.searchStr = null;\n }\n else if (scope.updateInputOnSelect) {\n updateInputField();\n }\n else {\n inputField.val(scope.searchStr);\n }\n callOrAssign(result);\n clearResults(!scope.clearSelected);\n saveHistoryItem(result);\n };\n\n scope.selectHistoryItem = function (item) {\n scope.searchStr = null;\n scope.showHistoryDropdown = false;\n // Restore original values\n if (scope.matchClass) {\n item.title = extractTitle(item.originalObject);\n item.description = extractValue(item.originalObject, scope.descriptionField);\n }\n callOrAssign(item);\n };\n\n scope.inputChangeHandler = function (str) {\n if (str.length < minlength) {\n cancelHttpRequest();\n clearResults();\n }\n else if (str.length === 0 && minlength === 0) {\n showAll();\n }\n\n if (scope.inputChanged) {\n str = scope.inputChanged(str);\n }\n return str;\n };\n\n //\n // Filter\n //\n scope.changeCategory = function (category, evt, isSingleFilter) {\n if (!category || scope.searching) {\n return;\n }\n\n if (evt) {\n evt.stopImmediatePropagation();\n evt.preventDefault();\n }\n\n if (category === 'all') {\n scope.selectedCategories = ['all'];\n scope.filterActive = false;\n scope.checkLastSearchedCategories(category);\n return;\n }\n\n if (isSingleFilter && category) {\n scope.selectedCategories = [category];\n scope.filterActive = true;\n scope.checkLastSearchedCategories(category);\n return;\n }\n\n if (_.contains(scope.selectedCategories, category)) {\n scope.selectedCategories = _.without(scope.selectedCategories, category);\n }\n else {\n if (_.contains(scope.selectedCategories, 'all')) {\n scope.selectedCategories = [];\n }\n scope.selectedCategories.push(category);\n scope.filterActive = true;\n }\n\n if (scope.selectedCategories.length === 0) {\n scope.selectedCategories.push('all');\n scope.filterActive = false;\n }\n\n scope.checkLastSearchedCategories(category);\n\n // if the evt is null, it's comming from the main filter content, so if there are any results. just pop them out.\n // but do this in a little timeout to give it some time to render.\n if (!evt && scope.results && scope.results.length > 0) {\n $timeout(function () {\n scope.showDropdown = true;\n scope.showFilterDropdown = false;\n }, 100);\n }\n };\n\n scope.checkLastSearchedCategories = function (category) {\n // Check what was searched last time. If the incoming (clicked) category is not in selectedCategories, then re-run the search.\n\n // Check if there is anything in the input box (will indicate whether the search was already ran or not)\n if (!scope.searchStr || scope.searchStr.length < minlength || !scope.resultsBackup) {\n return;\n }\n\n if (scope.resultsBackup.categories[0] === 'all' && scope.selectedCategories.lastIndexOf('all') === -1) {\n // This means that the last search was done using the 'all' categories keyword. Any incoming category was already included in the search. Just alter the results\n scope.filterResults(category);\n }\n else if (scope.resultsBackup.categories[0] === 'all' && scope.selectedCategories.lastIndexOf('all') > -1) {\n // Show all of them again\n scope.results = _.clone(scope.resultsBackup.results);\n }\n else if (_.contains(scope.resultsBackup.categories, category)) {\n // Read from backup\n scope.filterResults(category);\n }\n else {\n // Do the new search!\n scope.searching = true;\n resetCategories();\n searchTimerComplete(scope.searchStr);\n }\n };\n\n scope.filterResults = function () {\n var fresults = [];\n angular.forEach(scope.resultsBackup.results, function (result) {\n if (_.contains(scope.selectedCategories, result.originalObject.category)) {\n fresults.push(result);\n }\n });\n scope.results = fresults;\n };\n\n scope.openFilter = function () {\n scope.showHistoryDropdown = false;\n scope.showFilterDropdown = !scope.showFilterDropdown;\n if (scope.showFilterDropdown) {\n scope.showDropdown = false;\n }\n if (scope.focusIn) {\n scope.focusIn();\n }\n };\n\n scope.clearInput = function () {\n scope.searchStr = null;\n clearResults();\n inputField.focus();\n };\n\n scope.backBtnClicked = function () {\n scope.searchStr = null;\n cancelHttpRequest();\n clearResults();\n if (scope.focusOut) {\n scope.focusOut();\n }\n $timeout(function () {\n scope.searchFocused = false;\n }, 100);\n };\n\n scope.checkInput = function () {\n return scope.searchStr && scope.searchStr.length > 0 && !scope.searching;\n };\n\n scope.checkSearch = function () {\n return !scope.searchStr || scope.searchStr.length === 0;\n };\n\n scope.isSelected = function (category) {\n return _.contains(scope.selectedCategories, category);\n };\n\n scope.checkFocus = function (evt, isBodyClick) {\n var el;\n\n if (isBodyClick) {\n el = $document[0].getElementById(scope.controlId);\n scope.searchFocused = _.contains(evt.path, el);\n if (!scope.searchFocused) {\n // Remove the listener.\n scope.showFilterDropdown = false;\n scope.showDropdown = false;\n scope.showHistoryDropdown = false;\n angular.element($document[0].body).off('click', bodyClickHandler);\n onBodyClickListener = null;\n if (scope.focusOut) {\n scope.focusOut();\n }\n scope.$apply();\n }\n }\n else {\n scope.searchFocused = evt.currentTarget.id === scope.controlId;\n if (scope.searchFocused && !onBodyClickListener) {\n // Create listener\n onBodyClickListener = angular.element($document[0].body).on('click', bodyClickHandler);\n }\n evt.stopImmediatePropagation();\n }\n };\n\n function checkHistoryItems() {\n // Entry point for the history items. Check with server for this particular input.\n scope.loadingHistory = true;\n Restangular.all(scope.searchService).get('history', {\n searchId: scope.controlId\n }).then(function (results) {\n if (results && results.plain().records) {\n processResults(results.plain().records, '', true);\n }\n }).finally(function () {\n scope.loadingHistory = false;\n });\n }\n\n function saveHistoryItem(result) {\n // Entry point for saving the selected item into history.\n // We shall provide the input name so we can get the different history items for different instances of this directive\n if (scope.hasHistory && result && result.originalObject) {\n Restangular.one(scope.searchService).customPOST(result.originalObject, 'history?searchId=' + scope.controlId)\n .then(function (results) {\n if (results && results.records) {\n scope.historyItems = [];\n processResults(results.records, '', true);\n }\n });\n }\n }\n\n // check required\n if (scope.fieldRequiredClass && scope.fieldRequiredClass !== '') {\n requiredClassName = scope.fieldRequiredClass;\n }\n\n // check min length\n if (scope.minlength && scope.minlength !== '') {\n minlength = parseInt(scope.minlength, 10);\n }\n\n // check pause time\n if (!scope.pause) {\n scope.pause = PAUSE;\n }\n\n // check clearSelected\n if (!scope.clearSelected) {\n scope.clearSelected = false;\n }\n\n // check override suggestions\n if (!scope.overrideSuggestions) {\n scope.overrideSuggestions = false;\n }\n\n // check required field\n if (scope.fieldRequired && ctrl) {\n // check initial value, if given, set validitity to true\n if (scope.initialValue) {\n handleRequired(true);\n }\n else {\n handleRequired(false);\n }\n }\n\n scope.inputType = attrs.type ? attrs.type : 'text';\n\n // set strings for \"Searching...\" and \"No results\"\n scope.textSearching = attrs.textSearching ? attrs.textSearching : TEXT_SEARCHING;\n scope.textNoResults = attrs.textNoResults ? attrs.textNoResults : TEXT_NORESULTS;\n displaySearching = scope.textSearching === 'false' ? false : true;\n displayNoResults = scope.textNoResults === 'false' ? false : true;\n\n // set max length (default to maxlength deault from html\n scope.maxlength = attrs.maxlength ? attrs.maxlength : MAX_LENGTH;\n\n // register events\n inputField.on('keydown', keydownHandler);\n inputField.on('keyup compositionend', keyupHandler);\n\n // set response formatter\n responseFormatter = callFunctionOrIdentity('remoteUrlResponseFormatter');\n\n // set isScrollOn\n $timeout(function () {\n var css = $window.getComputedStyle(dd);\n isScrollOn = css.maxHeight && css.overflowY === 'auto';\n });\n\n // Process history items. Shall be removed for PILOT and PROD!\n checkHistoryItems();\n }\n\n return {\n restrict: 'EA',\n require: '^?form',\n replace: true,\n transclude: true,\n scope: {\n selectedObject: '=',\n selectedObjectData: '=',\n disableInput: '=',\n initialValue: '=',\n localData: '=',\n localSearch: '&',\n remoteUrlRequestFormatter: '=',\n remoteUrlRequestWithCredentials: '@',\n remoteUrlResponseFormatter: '=',\n remoteUrlErrorCallback: '=',\n remoteApiHandler: '=',\n controlId: '@',\n type: '@',\n placeholder: '@',\n textSearching: '@',\n textNoResults: '@',\n remoteUrl: '@',\n remoteUrlDataField: '@',\n titleField: '@',\n subtitleField: '@',\n descriptionField: '@',\n descriptionField2: '@',\n categoryField: '@',\n imageField: '@',\n inputClass: '@',\n pause: '@',\n searchFields: '@',\n minlength: '@',\n matchClass: '@',\n clearSelected: '=',\n overrideSuggestions: '@',\n fieldRequired: '=',\n fieldRequiredClass: '@',\n inputChanged: '=',\n autoMatch: '@',\n focusOut: '&',\n focusIn: '&',\n fieldTabindex: '@',\n inputName: '@',\n focusFirst: '@',\n parseInput: '&',\n searchCategories: '=',\n blurOnSelect: '=',\n searchServiceEndPoint: '@',\n searchService: '@',\n resultTemplateUrl: '@',\n hasBackButton: '=',\n updateInputOnSelect: '=',\n isDropdownRelative: '=',\n hasCategoryFilter: '=?',\n hasHistory: '=?'\n },\n templateUrl: 'search/search-autocomplete-directive.tpl.html',\n /* templateUrl: function (element, attrs) {\n return attrs.templateUrl || TEMPLATE_URL;\n }, */\n compile: function (tElement) {\n var startSym = $interpolate.startSymbol(),\n endSym = $interpolate.endSymbol(),\n interpolatedHtml = null;\n\n if (!(startSym === '{{' && endSym === '}}')) {\n interpolatedHtml = tElement.html()\n .replace(/\\{\\{/g, startSym)\n .replace(/\\}\\}/g, endSym);\n tElement.html(interpolatedHtml);\n }\n return link;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name lead\n * @description\n *\n */\n angular\n .module('lead', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name myPod.service:MyPod\n *\n * @description\n *\n */\n angular\n .module('lead')\n .service('MyPod', MyPod);\n\n function MyPod(Restangular, $document, $uibModal) {\n var self = this;\n\n /**\n * Joins the currently logged in user to the other user's pod and his default reward program.\n *\n * @param {string} userId Id of the user that current user will join (will become member of his pod)\n * @return {Deferred} Deferred promise\n */\n self.quickJoin = function (userId) {\n return Restangular.one('Members').post('joinRewardProgram', {idUser: userId});\n };\n\n /**\n * Opens the modal dialog and sends invite to the business so the logged-in user can start sending the leads.\n * @param {string} myProfile Profile of the logged in user\n * @param {string} userProfile Profile of the targeted user (business)\n * @return {Deferred} Deferred promise\n */\n self.openSendInvite = function (myProfile, userProfile) {\n var slModalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'my-pod/send-invite/send-invite-modal.tpl.html',\n controller: 'SendInviteModalCtrl',\n controllerAs: 'sendInvite',\n size: 'md',\n resolve: {\n myProfile: function () {\n return myProfile;\n },\n userProfile: function () {\n return userProfile;\n }\n }\n });\n\n return slModalInstance.result;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myPod\n * @description\n *\n */\n angular\n .module('myPod', [\n 'ui.router',\n 'myPod.members',\n 'myPod.sentLeads',\n 'myPod.sendInvite'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myPod')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myPod', {\n url: '/my-pod',\n templateUrl: 'my-pod/my-pod.tpl.html',\n controller: 'MyPodCtrl',\n controllerAs: 'myPod',\n authenticate: true\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myPod.controller:MyPodCtrl\n *\n * @description\n *\n */\n angular\n .module('myPod')\n .controller('MyPodCtrl', MyPodCtrl);\n\n function MyPodCtrl(Session, MyPod) {\n var vm = this;\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'People in my Pod',\n value: 'members',\n url: 'myPod.members'\n },\n {\n label: 'Sent Leads',\n value: 'sentLeads',\n url: 'myPod.sentLeads'\n }\n ];\n\n Session.getUserProfile().then(function (userProfile) {\n vm.userProfile = userProfile;\n });\n\n vm.sendInvite = function () {\n MyPod.openSendInvite(vm.userProfile);\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name myMemberships\n * @description\n *\n */\n angular\n .module('myMemberships', [\n 'ui.router',\n 'myMemberships.memberships',\n 'myMemberships.receivedLeads',\n 'myMemberships.joinPod',\n 'myMemberships.sendReward',\n 'myMemberships.rewardProgram',\n 'myMemberships.import'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name myMemberships.directive:rewardSelector\n * @restrict EA\n * @element\n */\n angular\n .module('myMemberships')\n .directive('rewardSelector', rewardSelector);\n\n function rewardSelector() {\n return {\n restrict: 'EA',\n scope: {\n user: '=user',\n change: '&onChange',\n hasMonthlySubscription: '@',\n hasCode: '@',\n hasDefaultProgram: '@',\n hasPayPerLead: '@',\n hasCreditCard: '@',\n hasCancelAgreement: '@',\n clearOnBroadcast: '@',\n default: '@'\n },\n templateUrl: 'my-memberships/reward-selector-directive.tpl.html',\n replace: true,\n transclude: true,\n controllerAs: 'rewards',\n controller: ['$scope', '$filter', '$timeout', '$document', function ($scope, $filter, $timeout, $document) {\n var vm = this;\n\n vm.hasUser = angular.isDefined($scope.user) ? $scope.user : false;\n vm.hasDefaultProgram = angular.isDefined($scope.hasDefaultProgram) ? $scope.hasDefaultProgram === 'true' : true;\n vm.hasCode = angular.isDefined($scope.hasCode) ? $scope.hasCode === 'true' : true;\n vm.hasPayPerLead = angular.isDefined($scope.hasPayPerLead) ? $scope.hasPayPerLead === 'true' : true;\n vm.hasMonthlySubscription = angular.isDefined($scope.hasMonthlySubscription) ? $scope.hasMonthlySubscription === 'true' : true;\n vm.hasCC = angular.isDefined($scope.hasCreditCard) ? $scope.hasCreditCard === 'true' : true;\n vm.hasCancelAgreement = angular.isDefined($scope.hasCancelAgreement) ? $scope.hasCancelAgreement === 'true' : false;\n vm.clearOnBroadcast = angular.isDefined($scope.clearOnBroadcast) ? $scope.clearOnBroadcast : null;\n\n // Important. If the selector has default program, but no user is specified (it's most likely someone else's program other than the logged-in user)\n // then lock the default program (don't list the values!)\n if (vm.hasDefaultProgram && !vm.hasUser) {\n vm.hasLockedDefaultProgram = true;\n }\n\n if (vm.clearOnBroadcast) {\n $scope.$on(vm.clearOnBroadcast, function () {\n // Clear the form\n vm.data = {\n contractType: $scope.default || (vm.hasDefaultProgram ? 'Rewards Program' : null),\n leadPrice: null,\n successfulLeadPrice: null,\n subscriptionPrice: null,\n creditCard: {},\n rewardCode: null\n };\n });\n }\n\n vm.user = $scope.user;\n\n vm.isFormValid = false;\n vm.data = {\n contractType: $scope.default || (vm.hasDefaultProgram ? 'Rewards Program' : null),\n leadPrice: null,\n successfulLeadPrice: null,\n subscriptionPrice: null,\n creditCard: {},\n rewardCode: null\n };\n vm.rewardsProgramSetup = [];\n vm.rewardCodes = {};\n vm.selectedRewardCode = '';\n vm.selectedRewardCodeLabel = 'Reward Code';\n vm.isRewardsProgramDetailVisible = false;\n\n if (vm.hasCC) {\n vm.showCCForm = !vm.user.isCCSet;\n }\n\n // Setup the Reward selectors id, value, desc\n vm.selectors = {\n default: {\n id: 'rewardsProgram',\n value: 'Rewards Program',\n desc: 'Rewards Program'\n },\n code: {\n id: 'rewardCodeSelector',\n value: 'Reward Code',\n desc: 'Reward Code'\n },\n payPerLead: {\n id: 'payPerLead',\n value: 'Pay Per Lead',\n desc: 'Pay Per Lead'\n },\n subscription: {\n id: 'monthlySubscription',\n value: 'Subscription',\n desc: 'Monthly Subscription'\n },\n cancel: {\n id: 'cancelAgreement',\n value: 'Cancel',\n desc: 'Cancel Agreement'\n }\n };\n\n // Subscribe to the local update\n $scope.$on('event:user-updateLocalProfile', function () {\n if ($scope.user.rewardCodes) {\n vm.renderRewardCodes($scope.user.rewardCodes);\n }\n if (vm.hasDefaultProgram && !vm.hasLockedDefaultProgram && $scope.user.defaultRewardProgram) {\n vm.renderRewardProgramOptions($scope.user.defaultRewardProgram);\n }\n });\n\n // Render the reward codes.\n vm.renderRewardCodes = function (rewardCodes) {\n angular.forEach(rewardCodes, function (item) {\n var options = [];\n angular.forEach($filter('orderBy')(item.pricingOptions, 'successfulLeadPrice'), function (option) {\n options.push(option.name + ': ' + $filter('currency')(option.successfulLeadPrice, '$', 0));\n });\n vm.rewardCodes[item.rewardCode] = item.rewardCode + ' - ' + options.join(', ');\n });\n };\n if (vm.hasCode && $scope.user.rewardCodes) {\n vm.renderRewardCodes($scope.user.rewardCodes);\n }\n\n // Render reward program option\n vm.renderRewardProgramOptions = function (options) {\n if (options && options.length > 0) {\n angular.forEach(options, function (option) {\n vm.rewardsProgramSetup.push(option);\n });\n }\n else {\n vm.isRewardsProgramDetailVisible = true;\n }\n };\n if (vm.hasDefaultProgram && !vm.hasLockedDefaultProgram && $scope.user.defaultRewardProgram) {\n vm.renderRewardProgramOptions($scope.user.defaultRewardProgram);\n }\n\n vm.onContractTypeChange = function (value, form, evt) {\n var elementToFocus;\n if (vm.data.contractType === value) {\n return;\n }\n\n vm.data.contractType = value;\n if (vm.data.contractType === 'Pay Per Lead' || vm.data.contractType === 'Reward Code' || vm.data.contractType === 'Rewards Program') {\n delete form.$error.ccExp;\n delete form.$error.ccNumber;\n delete form.$error.ccNumberType;\n delete form.$error.ccExpMonth;\n delete form.$error.ccExpYear;\n }\n\n switch (vm.data.contractType) {\n case 'Pay Per Lead':\n elementToFocus = 'successfulLeadPrice';\n break;\n case 'Subscription':\n elementToFocus = 'subscriptionPrice';\n break;\n case 'Reward Code':\n elementToFocus = 'rewardCode';\n break;\n default:\n elementToFocus = null;\n break;\n }\n\n if (elementToFocus !== null) {\n $timeout(function () {\n angular.element($document[0].getElementById(elementToFocus))[0].focus();\n }, 200);\n }\n\n if (evt) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n vm.onValueChanged();\n };\n\n vm.toggleRewardsProgramDetailVisibility = function () {\n vm.isRewardsProgramDetailVisible = !vm.isRewardsProgramDetailVisible;\n };\n\n vm.isValid = function () {\n var isValid = true;\n\n if (!vm.data.contractType) {\n isValid = false;\n return isValid;\n }\n\n if (vm.data.contractType === 'Rewards Program' && vm.hasUser && (!vm.rewardsProgramSetup || vm.rewardsProgramSetup.length === 0) ||\n vm.data.contractType === 'Reward Code' && !vm.data.rewardCode ||\n vm.data.contractType === 'Pay Per Lead' && !vm.data.successfulLeadPrice) {\n isValid = false;\n }\n // Do the CC separately\n if (vm.data.contractType === 'Subscription') {\n if (!vm.data.subscriptionPrice) {\n isValid = false;\n }\n else if (vm.showCCForm && (!vm.data.creditCard.holderName || !vm.data.creditCard.number || !vm.data.creditCard.expiryMonth || !vm.data.creditCard.expiryYear)) {\n isValid = false;\n }\n }\n return isValid;\n };\n\n vm.checkValidity = function () {\n // This is being run by the watcher in the dom (ngClass). It's here to check on the initial state of the form and will notify change callback only if the validity changes.\n var isValid = vm.isValid();\n if (vm.isFormValid !== isValid) {\n $scope.change({formData: vm.data, isFormValid: isValid});\n vm.isFormValid = isValid;\n }\n };\n\n vm.onValueChanged = function () {\n // This is being triggered by every change of any of the inputs. Will trigger the change callback each time.\n var isValid = vm.isValid();\n $scope.change({formData: vm.data, isFormValid: isValid});\n };\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name myMemberships.service:MyMemberships\n *\n * @description\n *\n */\n angular\n .module('myMemberships')\n .service('MyMemberships', MyMemberships);\n\n function MyMemberships($document, $uibModal) {\n var self = this;\n\n self.openAskForLeads = function (myProfile, userProfile) {\n var slModalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'my-memberships/join-pod/join-pod-modal.tpl.html',\n controller: 'JoinPodModalCtrl',\n controllerAs: 'joinPod',\n size: 'md',\n resolve: {\n myProfile: function () {\n return myProfile;\n },\n userProfile: function () {\n return userProfile;\n }\n }\n });\n\n return slModalInstance.result;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('myMemberships')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('myMemberships', {\n url: '/my-memberships',\n templateUrl: 'my-memberships/my-memberships.tpl.html',\n controller: 'MyMembershipsCtrl',\n controllerAs: 'myMemberships',\n authenticate: true,\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }]\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name myMemberships.controller:MyMembershipsCtrl\n *\n * @description\n *\n */\n angular\n .module('myMemberships')\n .controller('MyMembershipsCtrl', MyMembershipsCtrl);\n\n function MyMembershipsCtrl(Notification, userProfile, BusinessAccount, Auth, MyMemberships) {\n var vm = this;\n vm.isActivating = false;\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Connections',\n value: 'memberships',\n url: 'myMemberships.memberships'\n },\n {\n label: 'Received Leads',\n value: 'receivedLeads',\n url: 'myMemberships.receivedLeads'\n },\n {\n label: 'Reward Codes',\n value: 'rewardPrograms',\n url: 'myMemberships.rewardPrograms'\n },\n {\n label: 'Import',\n value: 'import',\n url: 'myMemberships.import',\n condition: function () {\n return vm.isImportAllowed();\n }\n }\n ];\n\n // Get the trial subscription data (if any)\n vm.trialData = BusinessAccount.getTrialData(userProfile);\n\n vm.isBusinessAccountActive = function () {\n return angular.isObject(userProfile) && angular.isDefined(userProfile.isBusinessAccountActive) && userProfile.isBusinessAccountActive === true;\n };\n\n vm.isImportAllowed = function () {\n return Auth.hasUserPermission(userProfile, 'importMemberships');\n };\n\n vm.activateBusinessAccount = function () {\n vm.isActivating = true;\n BusinessAccount.initiateActivation('my-memberships-ctrl-container', vm.trialData.isEligibleForTrial)\n .then(function (newUserProfile) {\n Notification({message: 'Your business account has been successfully activated.'}, 'confirmation');\n vm.isActivating = false;\n userProfile = newUserProfile;\n }, function () {\n vm.isActivating = false;\n });\n };\n\n vm.openAskForLeads = function () {\n var modalInstance = MyMemberships.openAskForLeads(userProfile, null);\n modalInstance.then(function (receiveLeads) {\n vm.receiveLeads = receiveLeads;\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlpMarketplace\n * @description\n *\n */\n angular\n .module('mlpMarketplace', [\n 'ui.router'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('mlpMarketplace')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('marketplace', {\n url: '/marketplace/:id',\n templateUrl: 'mlp-marketplace/marketplace.tpl.html',\n controller: 'MarketplaceCtrl',\n controllerAs: 'marketplace',\n authenticate: true,\n params: {\n id: {\n value: null,\n squash: true\n }\n },\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n marketplaceItem: ['$stateParams', 'Restangular', 'Auth', function ($stateParams, Restangular, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n // If no ID is provided, we will show all marketplace addons\n if (!$stateParams.id) {\n return null;\n }\n // If ID is provided, then we will try to load the marketplace item. If not found, display a message\n return Restangular.one('Marketplace').one('index').get({id: $stateParams.id})\n .then(function (addon) {\n return addon.plain();\n }, function () {\n return false;\n });\n }\n return null;\n }, function () {\n return null;\n });\n }]\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlpMarketplace.service:Marketplace\n * @requires $document\n * @requires $uibModal\n * @requires Restangular\n * @requires Notification\n * @requires Session\n * @description\n *\n */\n angular\n .module('mlpMarketplace')\n .service('Marketplace', Marketplace);\n\n function Marketplace($rootScope, $document, $state, $uibModal, Restangular, Notification, Session) {\n var self = this;\n\n /**\n * Opens the modal dialog for the preferences settings\n *\n * @param {object} userProfile object User profile for which the preferences will be loaded\n */\n self.open = function () {\n $state.go('marketplace');\n };\n\n self.openInfo = function (item) {\n return $uibModal.open({\n animation: false,\n templateUrl: 'mlp-marketplace/marketplace-info-modal.tpl.html',\n controller: 'MarketplaceInfoCtrl',\n controllerAs: 'marketplaceInfo',\n size: 'lg',\n resolve: {\n marketplaceItem: function () {\n return item;\n }\n },\n appendTo: angular.element($document[0].body)\n }).result;\n };\n\n self.deactivate = function (item) {\n return Restangular.one('Marketplace').customDELETE('deactivate', {\n id: item.id\n });\n };\n\n /**\n * @ngdoc function\n * @name initiateActivation\n * @methodOf mlpMarketplace.service:Marketplace\n * @param {Object} item Marketplace item\n *\n * @returns {Promise} Modal dialog result\n */\n self.initiateActivation = function (item) {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'mlp-marketplace/marketplace-activation-modal.tpl.html',\n controller: 'MarketplaceActivationCtrl',\n controllerAs: 'marketplaceActivation',\n size: 'lg',\n backdrop: 'static',\n resolve: {\n marketplaceItem: function () {\n return item;\n }\n }\n });\n\n return modalInstance.result;\n };\n\n /**\n * @ngdoc function\n * @name activate\n * @methodOf mlpMarketplace.service:Marketplace\n * @param {Object} item Marketplace item\n * @param {Object} creditCard CC data\n * @returns {Promise} Restangular promise\n */\n self.activate = function (item, creditCard) {\n return Restangular.one('Marketplace').customPOST({\n id: item.id,\n creditCard: creditCard\n }, 'activate')\n .then(function (result) {\n var profile = Session.updateLocalUserProfile({\n marketplace: result.plain().marketplace\n }, true);\n Notification({message: 'Success'}, 'success');\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpMarketplace.directive:MarketplaceListings\n * @requires $timeout\n * @requires $uibModalInstance\n * @requires userProfile\n * @requires components.ui.PromptDialog\n * @requires components.FormAlerts\n * @requires mlpMarketplace.Marketplace\n * @description\n *\n */\n angular\n .module('mlpMarketplace')\n .directive('marketplaceListings', marketplaceListings);\n\n function marketplaceListings() {\n return {\n restrict: 'E',\n scope: {\n user: '=',\n items: '=',\n hasUserAvatar: '='\n },\n\n replace: true,\n transclude: false,\n templateUrl: 'mlp-marketplace/marketplace-listings-directive.tpl.html',\n controllerAs: 'marketplace',\n controller: ['$scope', '$timeout', 'PromptDialog', 'FormAlerts', 'Marketplace', function ($scope, $timeout, PromptDialog, FormAlerts, Marketplace) {\n var vm = this;\n vm.userProfile = $scope.user;\n vm.hasUserAvatar = $scope.hasUserAvatar || false;\n\n vm.items = $scope.items || vm.userProfile.marketplace;\n vm.isLoading = [];\n vm.isProcessing = false;\n vm.alerts = new FormAlerts();\n\n vm.switchSubscription = function ($index) {\n if (vm.isLoading[$index]) {\n return;\n }\n if (vm.items[$index].isSubscribed) {\n vm.deactivate($index);\n }\n else {\n vm.activate($index);\n }\n };\n\n vm.activate = function ($index) {\n var item = vm.items[$index];\n if (!item.isSubscribed) {\n vm.isLoading[$index] = true;\n vm.isProcessing = true;\n Marketplace.initiateActivation(vm.items[$index])\n .then(function (result) {\n if (result.active) {\n item.isSubscribed = true;\n }\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n }, function () {\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n });\n }\n };\n\n vm.deactivate = function ($index) {\n var item = vm.items[$index];\n if (item.isSubscribed) {\n vm.alerts.reset();\n PromptDialog.open('By clicking Deactivate, you will immediately cancel your subscription', null, 'Deactivate', 'Cancel')\n .then(function () {\n vm.isLoading[$index] = true;\n vm.isProcessing = true;\n Marketplace.deactivate(item)\n .then(function () {\n item.isSubscribed = false;\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n }, function () {\n vm.alerts.add('danger', 'Unable to deactivate subscription.');\n vm.isLoading[$index] = false;\n vm.isProcessing = false;\n });\n });\n }\n };\n\n vm.openInfo = function ($index) {\n Marketplace.openInfo(vm.items[$index]);\n };\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name mlpMarketplace.controller:MarketplaceInfoCtrl\n *\n * @description\n *\n */\n angular\n .module('mlpMarketplace')\n .controller('MarketplaceInfoCtrl', MarketplaceInfoCtrl);\n\n function MarketplaceInfoCtrl($scope, $sce, $uibModalInstance, marketplaceItem, Restangular, PromptDialog, Marketplace, Notification) {\n var vm = this;\n vm.item = marketplaceItem;\n vm.isLoading = false;\n vm.isUpdating = false;\n\n if (!marketplaceItem.info) {\n vm.isLoading = true;\n\n Restangular.one('Marketplace').one('index').get({id: marketplaceItem.id})\n .then(function (result) {\n marketplaceItem.info = $sce.trustAsHtml(result.info);\n vm.isLoading = false;\n }, function () {\n vm.isLoading = false;\n });\n }\n\n // Listen to the broadcast of 'close-modal-instance'\n $scope.$on('close-modal-instance', function () {\n $uibModalInstance.dismiss();\n });\n\n vm.close = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.switchSubscription = function () {\n if (vm.isUpdating) {\n return;\n }\n if (vm.item.isSubscribed) {\n vm.deactivate();\n }\n else {\n vm.activate();\n }\n };\n\n vm.activate = function () {\n var item = vm.item;\n if (!item.isSubscribed) {\n vm.isUpdating = true;\n Marketplace.initiateActivation(item)\n .then(function (result) {\n if (result.active) {\n item.isSubscribed = true;\n }\n vm.isUpdating = false;\n }, function () {\n vm.isUpdating = false;\n });\n }\n };\n\n vm.deactivate = function () {\n var item = vm.item;\n if (item.isSubscribed) {\n PromptDialog.open('By clicking Deactivate, you will immediately cancel your subscription', null, 'Deactivate', 'Cancel')\n .then(function () {\n vm.isUpdating = true;\n vm.isProcessing = true;\n Marketplace.deactivate(item)\n .then(function () {\n Notification({message: 'Success'}, 'confirmation');\n item.isSubscribed = false;\n vm.isUpdating = false;\n }, function () {\n Notification({message: 'Unable to unsubscribe.'}, 'warning');\n vm.isUpdating = false;\n });\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name mlpMarketplace.controller:MarketplaceCtrl\n * @requires $timeout\n * @requires $uibModalInstance\n * @requires userProfile\n * @requires components.ui.PromptDialog\n * @requires components.FormAlerts\n * @requires mlpMarketplace.Marketplace\n * @description\n *\n */\n angular\n .module('mlpMarketplace')\n .controller('MarketplaceCtrl', MarketplaceCtrl);\n\n function MarketplaceCtrl(Marketplace, userProfile, marketplaceItem, Notification) {\n var vm = this,\n items = userProfile.marketplace,\n mlpFilter;\n\n vm.isGrid = true;\n vm.viewMLP = true;\n vm.userProfile = userProfile;\n\n // MLP Items have priority\n mlpFilter = _.filter(items, function (item) {\n return angular.isObject(item.owner) && ((/cs(\\+([\\s\\S]*?))?@myleadpod\\.com/).test(item.owner.email) || item.owner.email === 'sales@myleadpod.com');\n });\n vm.mlpItems = _.sortBy(mlpFilter, 'label');\n\n // Other Marketplace items\n vm.items = _.filter(items, function (item) {\n return !angular.isObject(item.owner) || !(/cs(\\+([\\s\\S]*?))?@myleadpod\\.com/).test(item.owner.email) && item.owner.email !== 'sales@myleadpod.com';\n });\n\n // Check if we are opening the whole marketplace or details of the addon directly\n if (angular.isObject(marketplaceItem)) {\n // Seems like we have the addon object. open the details\n Marketplace.openInfo(marketplaceItem);\n }\n else if (marketplaceItem === false) {\n // Display notification that the marketplace addon doesn't exist\n Notification({message: 'The requested Marketplace Item is invalid or it doesn\\'t exist.', duration: 5000}, 'warning');\n }\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name mlpMarketplace.controller:MarketplaceInfoCtrl\n * @requires $uibModelInstance\n * @requires FormAlerts\n * @requires marketplaceItem\n * @requires Restangular\n * @requires mlpMarketplace.Marketplace\n * @description\n *\n */\n angular\n .module('mlpMarketplace')\n .controller('MarketplaceActivationCtrl', MarketplaceActivationCtrl);\n\n function MarketplaceActivationCtrl($timeout, $uibModalInstance, FormAlerts, marketplaceItem, Restangular, Marketplace) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.item = marketplaceItem;\n vm.isPaymentRequired = !vm.item.isFree;\n vm.isLoading = false;\n vm.isCCLoading = false;\n vm.creditCard = null;\n vm.data = {\n creditCard: {}\n };\n\n vm.paymentSummary = {\n price: vm.item.priceMonthly,\n tax: vm.item.priceMonthlyInclGst - vm.item.priceMonthly,\n total: vm.item.priceMonthlyInclGst\n };\n\n if (vm.isPaymentRequired) {\n vm.isCCLoading = true;\n Restangular.one('Billing').one('creditCard').get()\n .then(function (cc) {\n cc = cc.plain();\n vm.data.creditCard.method = angular.isObject(cc) && angular.isDefined(cc.number) ? 'old' : 'new';\n vm.creditCard = cc;\n $timeout(function () {\n vm.isCCLoading = false;\n }, 300);\n }, function () {\n vm.isCCLoading = false;\n });\n }\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.activate = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Marketplace.activate(vm.item, vm.data.creditCard)\n .then(function () {\n vm.isLoading = false;\n $uibModalInstance.close({active: true});\n }, function () {\n vm.alerts.add('danger', 'Unable to activate subscription.');\n vm.isLoading = false;\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlp-messaging\n * @description\n *\n */\n angular\n .module('mlp-messaging', []);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name lead.service:Leads\n *\n * @description\n *\n */\n angular\n .module('mlp-messaging')\n .service('Messaging', Messaging);\n\n function Messaging($rootScope, $document, $state, $q, Notification, $uibModal, Restangular) {\n var self = this;\n\n self.getMessages = function (params) {\n return Restangular.one('Messages').one('index').get(params)\n .then(function (result) {\n return result.plain();\n }, function (error) {\n return {\n error: error\n };\n });\n };\n\n self.postMessage = function (idUser, params) {\n return Restangular.one('Messages').post('index', params, {idUser: idUser})\n .then(function (result) {\n return result.plain();\n }, function (error) {\n return {\n error: error\n };\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name mlpMessaging.directive:messagingFormDirective\n * @restrict EA\n * @element\n *\n */\n angular\n .module('mlp-messaging')\n .directive('messagingForm', messagingForm);\n\n function messagingForm($timeout) {\n return {\n restrict: 'EA',\n scope: {\n msgId: '=?',\n msgRequestParams: '=?',\n msgRecipient: '=?',\n msgGrouping: '=?',\n msgWatchParams: '=?',\n msgLoadCallback: '='\n },\n replace: true,\n templateUrl: 'messaging/messaging-form-directive.tpl.html',\n controllerAs: 'msg',\n link: {\n post: function (scope, elem, attrs, ctrl) {\n // Check the scroll of the element containing the message so we could pull more.\n $timeout(function () {\n var messagesContainer = elem.find('.messages-container.has-data')[0];\n messagesContainer.onscroll = function () {\n if (messagesContainer.scrollTop === 0 && !ctrl.loading && ctrl.lastDataCount >= ctrl.limit) {\n // get new data\n ctrl.loadMore();\n }\n };\n }, 10);\n }\n },\n controller: ['$scope', '$document', '$interval', 'Session', 'Messaging', 'configOptions', function ($scope, $document, $interval, Session, Messaging) {\n var vm = this,\n messageIntervalUpdate = null;\n\n vm.sender = null;\n vm.recipient = $scope.msgRecipient;\n vm.grouping = $scope.msgGrouping;\n vm.watchParams = $scope.msgWatchParams;\n vm.onLoadCallback = $scope.msgLoadCallback;\n vm.id = $scope.msgId ? $scope.msgId : 'msg';\n\n vm.messageStr = null;\n vm.messages = [];\n vm.loading = false;\n vm.hasError = false;\n vm.requestParams = $scope.msgRequestParams ? angular.copy($scope.msgRequestParams) : {};\n vm.postParams = {\n message: null\n };\n vm.notification = null;\n vm.lastDataCount = 0;\n vm.limit = 20;\n vm.offset = 0;\n vm.offsetIncrement = 20;\n vm.appendMessages = false;\n vm.savingMessages = {};\n\n if (!vm.recipient) {\n vm.hasError = true;\n vm.notification = 'Unknown recipient';\n return;\n }\n\n // Check the scroll of the element containing the message so we could pull more.\n // console.log(vm.element);\n\n // Mixin the value from requestParam into the postParam so we have the correct object to send.\n if (vm.requestParams) {\n angular.forEach(vm.requestParams, function (value, key) {\n vm.postParams[key] = value;\n });\n }\n\n vm.loadMessages = function (append) {\n // For UI\n vm.loading = true;\n vm.hasError = false;\n vm.appendMessages = append || false;\n\n // Update the request param object\n vm.requestParams.limit = vm.limit;\n vm.requestParams.offset = vm.offset;\n\n // Get the messages\n Messaging.getMessages(vm.requestParams).then(vm.formatMessages);\n };\n\n vm.formatMessages = function (data) {\n $timeout(function () {\n vm.loading = false;\n vm.appendMessages = false;\n if (vm.onLoadCallback) {\n vm.onLoadCallback.apply();\n }\n }, 100);\n\n if (data && data.error) {\n vm.hasError = true;\n return;\n }\n if (data && data.records && data.records.length > 0) {\n // Try to reformat the messages\n angular.forEach(data.records, function (record) {\n record.message = record.message.replace(/(\\r)?\\n/g, '
    ');\n });\n\n vm.lastDataCount = data.records.length;\n if (vm.appendMessages) {\n vm.messages = vm.messages.concat(data.records);\n }\n else {\n vm.messages = data.records;\n }\n }\n else if (data && data.records && data.records.length === 0) {\n vm.messages = [];\n vm.lastDataCount = 0;\n }\n else {\n vm.lastDataCount = 0;\n }\n };\n\n vm.addMessage = function (message, isTemp) {\n vm.saving = false;\n if (message.error) {\n vm.notification = 'Unable to send the message. Try again.';\n return;\n }\n if (isTemp) {\n vm.savingMessages[message.dateCreated] = message;\n }\n // Sending the message was successful. Clear the textbox\n vm.messageStr = null;\n message.created = vm.getFormattedTime((new Date()).getTime() - (new Date(message.dateCreated)).getTime());\n message.message = message.message.replace(/(\\r)?\\n/g, '
    ');\n vm.messages.unshift(message);\n };\n\n vm.messageSaved = function (message, timeStamp) {\n delete vm.savingMessages[timeStamp];\n };\n\n vm.reload = function () {\n vm.offset = 0;\n vm.loadMessages();\n };\n\n vm.loadMore = function () {\n vm.offset += vm.offsetIncrement;\n vm.loadMessages(true);\n };\n\n vm.send = function () {\n var timeStamp = (new Date()).getTime();\n if (vm.messageStr) {\n vm.saving = true;\n vm.notification = null;\n vm.postParams.message = vm.messageStr;\n vm.addMessage({\n message: vm.messageStr,\n dateCreated: timeStamp\n }, true);\n Messaging.postMessage(vm.recipient.idUser, vm.postParams).then(function (message) {\n vm.messageSaved(message, timeStamp);\n });\n }\n };\n\n vm.updateMessageTimes = function () {\n var now = (new Date()).getTime();\n angular.forEach(vm.messages, function (message) {\n message.created = vm.getFormattedTime(now - (new Date(message.dateCreated)).getTime());\n });\n };\n\n vm.getFormattedTime = function (timegap) {\n var interval = Math.abs(timegap) / 1000,\n granularity = 1,\n zeroInterval = 'now',\n suffix = '',\n short = false,\n units = null,\n output = '';\n\n units = [\n {seconds: 31536000, singular: 'year', plural: 'years', short: 'y'},\n {seconds: 2592000, singular: 'month', plural: 'months', short: 'm'},\n {seconds: 604800, singular: 'week', plural: 'weeks', short: 'w'},\n {seconds: 86400, singular: 'day', plural: 'days', short: 'd'},\n {seconds: 3600, singular: 'hour', plural: 'hours', short: 'h'},\n {seconds: 60, singular: 'min', plural: 'min', short: 'm'}\n ];\n\n angular.forEach(units, function (unit) {\n var count = null;\n if (granularity === 0) {\n return;\n }\n if (interval >= unit.seconds) {\n count = Math.floor(interval / unit.seconds);\n output += (output ? ' ' : '') + count;\n\n if (short) {\n output += unit.short;\n }\n else {\n output += ' ' + (count > 1 ? unit.plural : unit.singular);\n }\n\n interval %= unit.seconds;\n granularity--;\n }\n });\n\n return output ? output + (suffix === '' ? '' : ' ' + suffix) : zeroInterval;\n };\n\n vm.itemRender = function (item, index) {\n var currentGroup,\n lastGroup,\n nextGroup;\n\n if (!vm.grouping || !item) {\n return;\n }\n\n currentGroup = item.groupId;\n lastGroup = vm.messages[index - 1] ? vm.messages[index - 1] : null;\n nextGroup = vm.messages[index + 1] ? vm.messages[index + 1] : null;\n\n item.opensGroup = currentGroup !== lastGroup;\n item.closesGroup = currentGroup !== nextGroup;\n item.noGroup = currentGroup === null;\n };\n\n Session.getUserProfile().then(function (user) {\n vm.user = user;\n vm.requestParams.idUser = vm.recipient.idUser;\n if (angular.isDefined(vm.recipient)) {\n vm.loadMessages();\n }\n });\n\n // we are now all set. Now watch for the msgParameter change so we can update the content.\n if (vm.watchParams) {\n $scope.$watch('msgRequestParams', function (oldVal, newVal) {\n if (oldVal !== newVal) {\n vm.requestParams = $scope.msgRequestParams ? angular.copy($scope.msgRequestParams) : {};\n vm.requestParams.idUser = vm.recipient.idUser;\n if (vm.requestParams) {\n angular.forEach(vm.requestParams, function (value, key) {\n vm.postParams[key] = value;\n });\n }\n vm.loadMessages();\n }\n else if (vm.onLoadCallback) {\n vm.onLoadCallback.apply();\n }\n });\n }\n\n // Setup time formatting interval\n messageIntervalUpdate = $interval(vm.updateMessageTimes, 60000);\n // Clear the message interval upon destroy\n $scope.$on('$destroy', function () {\n $interval.cancel(messageIntervalUpdate);\n });\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name mlp-charity\n * @description\n *\n */\n angular\n .module('mlp-charity', [\n 'ng-drag-scroll'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name charity.controller:DonateCtrl\n *\n * @description\n *\n */\n angular\n .module('mlp-charity')\n .controller('DonateCtrl', DonateCtrl);\n\n function DonateCtrl($rootScope, $timeout, $q, $uibModalInstance, Notification, Restangular, userProfile, charityProfile, donationsHistory) {\n var vm = this;\n\n vm.isLoading = false;\n vm.isCCLoading = true;\n vm.isLoadingCharity = false;\n vm.isCalculating = false;\n vm.hasError = false;\n vm.userProfile = userProfile;\n vm.charityProfile = charityProfile;\n vm.creditCard = null;\n vm.isSearchVisible = !charityProfile;\n vm.canceler = null;\n\n vm.lastCharities = donationsHistory;\n\n // For Search Autocomplete\n vm.searchCategories = [\n {name: 'Charities', value: 'charities', stateTarget: 'user', iconClass: 'fa-heart-o'}\n ];\n\n // For posting the data\n vm.data = {\n paymentDetails: {\n method: null\n },\n idUserRecipient: charityProfile ? charityProfile.idUser : 0,\n amount: null\n };\n\n // For payment summary\n vm.summary = {\n fee: null,\n tax: null,\n total: null\n };\n\n // Load the Credit Card data\n Restangular.one('Billing').one('creditCard').get()\n .then(function (cc) {\n cc = cc.plain();\n vm.data.paymentDetails.method = angular.isObject(cc) && angular.isDefined(cc.number) ? 'old' : 'new';\n vm.creditCard = cc;\n $timeout(function () {\n vm.isCCLoading = false;\n }, 300);\n }, function () {\n vm.isCCLoading = false;\n });\n\n /**\n * Dismisses the modal dialog\n */\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n /**\n * Sets the charityProfile and populates the title and image in the chosen charity container\n * @param {Object} item Item to pre-fill with\n */\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n if (!item || !item.originalObject || angular.isString(item.originalObject)) {\n return;\n }\n vm.isLoadingCharity = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.isLoadingCharity = false;\n profile = profile.plain();\n // Pre-fill the data now.\n vm.charityProfile = profile;\n vm.isSearchVisible = false;\n });\n };\n\n /**\n * Formats the search response\n *\n * @param {Object} response Response object\n * @returns {Object} Formatted response\n */\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n\n r = response.records;\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = null,\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.leadtype) {\n categoryDescriptionClass += item.leadtype === 'received' ? ' rotate-90' : '';\n value += ' | ' + item.leadfullname;\n }\n else if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n /**\n * Make the donation payment\n */\n vm.donate = function () {\n // Make sure the user recipient is correct\n vm.data.idUserRecipient = vm.charityProfile.idUser;\n vm.isLoading = true;\n\n // Do the request\n Restangular.one('Donations').post('donate', vm.data)\n .then(function () {\n $uibModalInstance.close();\n vm.isLoading = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function (responseData) {\n vm.isLoading = false;\n Notification({message: 'Donation Payment Failed'}, 'error');\n if (responseData.data.errorCode === 701 || responseData.data.errorCode === 702 || responseData.data.errorCode === 703) {\n console.error('Unable to send: ' + responseData.data.errorMessage);\n }\n else {\n console.error('danger', 'Unable to send, try again later please');\n }\n });\n };\n\n /**\n * Sets the incoming profile as the destination / target charity profile\n * @param {object} profile Charity profile receiving the donation\n */\n vm.selectCharity = function (profile) {\n if (vm.charityProfile === profile) {\n return;\n }\n vm.charityProfile = profile;\n vm.isSearchVisible = false;\n };\n\n /**\n * Sets the timer for the search to avoid the unnecessary requests. Once given a go it sends the request to server.\n * @param {boolean} noTimer Indicates whether the trigger of the search should wait or fire immediately.\n */\n vm.calculate = function (noTimer) {\n if (!vm.data.amount) {\n return;\n }\n\n if (noTimer === true) {\n vm.sendCalculate(vm.data.amount);\n return;\n }\n\n if (vm.searchTimer) {\n $timeout.cancel(vm.searchTimer);\n }\n\n vm.isCalculating = true;\n vm.searchTimer = $timeout(function () {\n vm.sendCalculate(vm.data.amount);\n }, 500);\n };\n\n /**\n * Send the request to get the payment summary\n * @param {int} value Value to get the summary calculated for\n */\n vm.sendCalculate = function (value) {\n if (vm.isCalculating && vm.canceler) {\n vm.canceler.resolve();\n }\n\n vm.hasError = false;\n vm.isCalculating = true;\n\n vm.canceler = $q.defer();\n vm.canceler.value = value;\n Restangular.one('Donations').withHttpConfig({timeout: vm.canceler.promise}).one('calculateDonationTotal').get({\n amount: vm.data.amount\n }).then(function (result) {\n var data = result.plain();\n\n if (vm.data.amount !== value) {\n // This will prevent the undesired effect of quickly changing the text in the summary\n // since the canceller doesn't work\n return;\n }\n vm.isCalculating = false;\n try {\n vm.summary.total = Number(data.total);\n vm.summary.fee = Number(data.fees);\n vm.summary.tax = Number(data.tax);\n vm.hasError = false;\n }\n catch (err) {\n vm.hasError = true;\n }\n }, function () {\n vm.isCalculating = false;\n vm.hasError = true;\n });\n };\n\n /**\n * Immediately sends the summary request for the provided value\n * @param {int} value Value to calculate the summary for.\n */\n vm.calculateWith = function (value) {\n if (value && angular.isNumber(value)) {\n vm.data.amount = value;\n vm.calculate(true);\n }\n };\n\n /**\n * On ngKeyPress event handler for the donation amount input.\n * @param {object} $event ngKeyPress event\n */\n vm.onKeyPress = function ($event) {\n if ($event.key === 'Enter') {\n vm.calculate(true);\n }\n };\n\n vm.openSelector = function () {\n vm.isSearchVisible = true;\n };\n\n vm.checkScroll = function () {\n $timeout(function () {\n $rootScope.$broadcast('event:check-scroll');\n }, 100);\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name mlp-charity.service:Charities\n *\n * @description\n *\n */\n angular\n .module('mlp-charity')\n .service('Charities', Charities);\n\n function Charities($rootScope, $document, $state, $q, Notification, $uibModal) {\n var self = this;\n\n /**\n * Opens the Modal dialog for donation to charity\n * @param {int} charityId Can be a charity Id (number) or directly a userProfile\n * @returns {*} Modal instance result\n */\n self.openDonate = function (charityId) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'mlp-charity/donate-modal.tpl.html',\n controller: 'DonateCtrl',\n controllerAs: 'donation',\n size: 'lg',\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n charityProfile: ['Restangular', function (Restangular) {\n if (angular.isObject(charityId) && charityId.isCharityAccountActive) {\n return charityId;\n }\n\n if (angular.isNumber(charityId)) {\n return Restangular.one('Users').one('profile').get({id: charityId})\n .then(function (profile) {\n return profile;\n });\n }\n\n return null;\n }],\n donationsHistory: ['Restangular', function (Restangular) {\n return Restangular.one('Donations').getList('lastRecipients')\n .then(function (lastRecipients) {\n return lastRecipients.plain();\n });\n }]\n }\n };\n\n params.appendTo = angular.element($document[0].body);\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:SendLeadCtrl\n *\n * @description\n *\n */\n angular\n .module('lead')\n .controller('SendLeadCtrl', SendLeadCtrl);\n\n function SendLeadCtrl($rootScope, $scope, $document, $timeout, $state, $stateParams, Session, Restangular, Notification,\n userProfile, isRegister, onCancelCallback, onSentCallback) {\n var vm = this;\n\n vm.isLoading = false;\n vm.validateRecipient = false;\n vm.searchName = '';\n vm.idIndustry = '';\n vm.selectedUsers = [];\n vm.isRegister = isRegister;\n vm.detailsVisible = false;\n vm.controlName = vm.isRegister ? 'register-lead' : 'send-lead';\n if (!vm.isRegister) {\n vm.isRewardsFormValid = true;\n }\n\n vm.emptyResults = false;\n vm.showPrompt = false;\n vm.searchCategories = [\n {name: 'All', value: 'all'},\n {name: 'My Pod', value: 'myPod', iconClass: 'fa-user'},\n {name: 'Directory', value: 'businessUsers', iconClass: 'fa-briefcase'},\n {name: 'Charities', value: 'charities', stateTarget: 'user', iconClass: 'fa-heart-o'},\n {name: 'Leads', value: 'leads', iconClass: 'fa-paper-plane'}\n ];\n vm.userSearchCategories = [];\n\n if (isRegister) {\n vm.userSearchCategories = [\n {name: 'My Connections', value: 'myConnections', iconClass: 'fa-user-o'}\n ];\n }\n else {\n vm.userSearchCategories = [\n {name: 'My Pod', value: 'myPod', iconClass: 'fa-user'}\n ];\n }\n\n vm.selectors = {\n payPerLead: {\n id: 'payPerLead',\n value: 'Pay Per Lead',\n desc: 'Pay Per Lead'\n },\n subscription: {\n id: 'monthlySubscription',\n value: 'Subscription',\n desc: 'Monthly Subscription'\n }\n };\n\n Session.getUserProfile().then(function (profile) {\n if (profile) {\n vm.user = profile;\n if (vm.user.isBusinessAccountActive) {\n vm.searchCategories.push({name: 'My Connections', value: 'myConnections', iconClass: 'fa-user-o'});\n }\n }\n });\n\n vm.data = {\n invitation: {}\n };\n vm.invitations = [];\n\n // If the userProfile is not undefined, this is coming from the send-lead-modal where the user to which the lead is about to be sent is already known.\n if (angular.isDefined(userProfile)) {\n vm.selectedUser = userProfile;\n }\n else if (angular.isDefined($stateParams.user) && angular.isObject($stateParams.user)) {\n vm.selectedUsers.push($stateParams.user);\n }\n\n if (angular.isDefined($stateParams.lead) && angular.isObject($stateParams.lead)) {\n vm.data.firstName = $stateParams.lead.firstName;\n vm.data.lastName = $stateParams.lead.lastName;\n vm.data.email = $stateParams.lead.email;\n vm.data.phone = $stateParams.lead.phone;\n vm.data.details = $stateParams.lead.details;\n }\n\n vm.isValidName = function () {\n return !!vm.data.firstName || !!vm.data.lastName;\n };\n\n vm.isValidContact = function () {\n return !!vm.data.email || !!vm.data.phone;\n };\n\n vm.removeUser = function ($index) {\n vm.selectedUsers.splice($index, 1);\n };\n\n vm.isEmptyNewRecipient = function () {\n var isEmpty = true;\n\n if (angular.isDefined(vm.data.invitation)) {\n if (angular.isDefined(vm.data.invitation.firstName) && !!vm.data.invitation.firstName) {\n isEmpty = false;\n }\n if (angular.isDefined(vm.data.invitation.email) && !!vm.data.invitation.email) {\n isEmpty = false;\n }\n if (angular.isDefined(vm.data.invitation.contractType) && !!vm.data.invitation.contractType) {\n isEmpty = false;\n }\n if (vm.data.invitation.contractType === 'Pay Per Lead') {\n if (angular.isDefined(vm.data.invitation.successfulLeadPrice) && !isNaN(parseFloat(vm.data.invitation.successfulLeadPrice)) && parseFloat(vm.data.invitation.successfulLeadPrice) >= 0) {\n isEmpty = false;\n }\n }\n if (vm.data.invitation.contractType === 'Subscription') {\n if (angular.isDefined(vm.data.invitation.subscriptionPrice) && !isNaN(parseFloat(vm.data.invitation.subscriptionPrice)) && parseFloat(vm.data.invitation.subscriptionPrice) >= 0) {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n };\n\n vm.isValidNewRecipient = function () {\n var isValid = true;\n\n if (!vm.isEmptyNewRecipient()) {\n if (angular.isUndefined(vm.data.invitation.firstName) || !vm.data.invitation.firstName) {\n isValid = false;\n }\n if (angular.isUndefined(vm.data.invitation.email) || !vm.data.invitation.email) {\n isValid = false;\n }\n if (vm.isRegister && (angular.isUndefined(vm.data.invitation.contractType) || !vm.data.invitation.contractType)) {\n isValid = false;\n }\n\n if (vm.data.invitation.contractType === 'Pay Per Lead') {\n if (angular.isUndefined(vm.data.invitation.successfulLeadPrice) || isNaN(parseFloat(vm.data.invitation.successfulLeadPrice)) || parseFloat(vm.data.invitation.successfulLeadPrice) < 0) {\n isValid = false;\n }\n }\n if (vm.data.invitation.contractType === 'Subscription') {\n if (angular.isUndefined(vm.data.invitation.subscriptionPrice) || isNaN(parseFloat(vm.data.invitation.subscriptionPrice)) || parseFloat(vm.data.invitation.subscriptionPrice) < 0) {\n isValid = false;\n }\n }\n }\n\n return isValid;\n };\n\n vm.isValidRecipient = function () {\n return !vm.isEmptyNewRecipient() && vm.isValidNewRecipient() || (vm.selectedUser || vm.selectedUsers.length > 0);\n };\n\n vm.send = function () {\n var data,\n recipientUserIds = [];\n vm.validateRecipient = true;\n\n if (vm.selectedUser) {\n vm.selectedUsers = [vm.selectedUser];\n }\n\n // Extract the userids from the selected users\n angular.forEach(vm.selectedUsers, function (user) {\n recipientUserIds.push(user.id);\n });\n\n // Get the new invitees array into the 'invitation' parameter\n if (!vm.invitations || vm.invitations.length === 0) {\n delete vm.data.invitation;\n }\n else {\n // Bastardise the original 'invitation' parameter to include the array of new invitations.\n vm.data.invitation = _.clone(vm.invitations);\n }\n\n // Finally get the post data object\n data = angular.extend({}, vm.data, {recipientUserIds: recipientUserIds});\n\n vm.isLoading = true;\n Restangular.one('Leads').post('index', data)\n .then(function (result) {\n var failedUsers = [],\n failedUsersIds = [];\n vm.data.invitation = {};\n if (!result.success) {\n angular.forEach(result.failedUsers, function (user) {\n failedUsersIds.push(user.id);\n Notification({message: 'Unable to send lead to ' + user.fullName}, 'error');\n });\n failedUsers = _.remove(vm.selectedUsers, function (u) {\n return failedUsersIds.indexOf(u.id) > -1;\n });\n vm.selectedUsers = failedUsers;\n vm.isLoading = false;\n }\n else {\n $rootScope.$broadcast('event:lead-sent');\n if (vm.selectedUser && onSentCallback) {\n onSentCallback.apply();\n }\n else {\n $state.go('myPod.sentLeads');\n }\n Notification({message: 'Success'}, 'success');\n }\n }, function () {\n vm.isLoading = false;\n Notification({message: 'Unable to send'}, 'error');\n });\n };\n\n vm.register = function () {\n var data;\n vm.validateRecipient = true;\n if (vm.isValidRecipient()) {\n if (vm.selectedUser) {\n vm.selectedUsers = [vm.selectedUser];\n }\n data = angular.extend({}, vm.data, {\n senderUserId: vm.selectedUsers.length === 1 ? vm.selectedUsers[0].id : 0\n });\n if (vm.isEmptyNewRecipient()) {\n delete vm.data.invitation;\n }\n vm.isLoading = true;\n Restangular.one('Leads').post('register', data)\n .then(function (result) {\n vm.data.invitation = {};\n if (!result.success) {\n Notification({message: 'Unable to register the lead for ' + vm.selectedUsers[0].fullName}, 'error');\n vm.isLoading = false;\n }\n else {\n if (vm.selectedUser && onSentCallback) {\n onSentCallback.apply();\n }\n else if (vm.isRegister) {\n $state.go('myMemberships.receivedLeads');\n }\n else {\n $state.go('myPod.sentLeads');\n }\n\n Notification({message: 'Success'}, 'confirmation');\n }\n }, function () {\n vm.isLoading = false;\n Notification({message: 'Unable to register the lead'}, 'error');\n });\n }\n };\n\n vm.cancel = function () {\n // MGA - if there is a single user provided (very likely \"Send Lead\" clicked directly from the user's profile), then on cancel don't go anywhere (we should do the update though)\n if (vm.selectedUser && onCancelCallback) {\n onCancelCallback.apply();\n }\n else if (vm.isRegister) {\n $state.go('myMemberships.receivedLeads');\n }\n else {\n $state.go('myPod.sentLeads');\n }\n };\n\n vm.onContractTypeChange = function () {\n if (vm.data.invitation.contractType === 'Pay Per Lead') {\n $timeout(function () {\n angular.element($document[0].getElementById('inviteSuccessfulLeadPrice'))[0].focus();\n }, 200);\n }\n else if (vm.data.invitation.contractType === 'Subscription') {\n $timeout(function () {\n angular.element($document[0].getElementById('inviteSubscriptionPrice'))[0].focus();\n }, 200);\n }\n };\n\n vm.changeContractType = function (value, evt) {\n vm.data.invitation.contractType = value;\n vm.onContractTypeChange(evt);\n evt.stopPropagation();\n evt.preventDefault();\n };\n\n vm.toggleMoreDetailsVisibility = function () {\n vm.detailsVisible = !vm.detailsVisible;\n };\n\n vm.onRewardSelectionChange = function (data, isFormValid) {\n _.extend(vm.data.invitation, data);\n vm.isRewardsFormValid = isFormValid;\n };\n\n /**\n * Adds the to-be-invited recipient to the recipients list. Uses the current form values that are used to create an object and clears the form in the end.\n * @param {Object} form New user form that will have to have the errors cleared\n */\n vm.addNewRecipient = function (form) {\n if (!_.find(vm.invitations, {email: vm.data.invitation.email})) {\n vm.invitations.push(_.clone(vm.data.invitation));\n vm.data.invitation = {};\n if (form) {\n form.$setPristine();\n form.$setUntouched();\n }\n // We need to broadcast the clear to the reward selector as well...\n $scope.$broadcast('clearRewardSelector');\n }\n };\n\n /**\n * Removes the recipient from the list of new invitees that will recieve the lead.\n * @param {int} $index List index.\n */\n vm.removeNewRecipient = function ($index) {\n vm.invitations.splice($index, 1);\n };\n\n /**\n * Pre-fills the lead detail using search\n * @param {Object} item Item to pre-fill with\n */\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item || !item.originalObject || angular.isString(item.originalObject)) {\n return;\n }\n vm.searchingUser = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingUser = false;\n profile = profile.plain();\n // Pre-fill the data now.\n vm.data.firstName = profile.firstName;\n vm.data.lastName = profile.lastName;\n vm.data.email = profile.email;\n vm.data.phone = profile.phoneMobile;\n angular.element('#details').focus();\n });\n };\n\n /**\n * OnSelect event of the recipient search autocomplete control\n * @param {Object} item Item to pre-fill with\n */\n vm.onRecipientItemSelected = function (item) {\n if (!item || !item.originalObject || angular.isString(item.originalObject)) {\n return;\n }\n vm.searchingRecipient = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n vm.searchingRecipient = false;\n profile = profile.plain();\n // Add to selected users\n // If this isRegister and there is already someone selected, we have to clear it.\n if (isRegister && vm.selectedUsers.length > 0) {\n vm.selectedUsers = [];\n }\n if (!_.find(vm.selectedUsers, {id: profile.id})) {\n vm.selectedUsers.push(profile);\n }\n });\n };\n\n /**\n * Formats the search response\n *\n * @param {Object} response Response object\n * @returns {Object} Formatted response\n */\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n if (vm.activeSearch === 'clients') {\n $timeout(function () {\n vm.emptyResults = false;\n }, 5000);\n }\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject,\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.showInviteNew = function () {\n if (isRegister) {\n vm.selectedUsers = [];\n }\n vm.showInviteForm = true;\n vm.activeSearch = 'recipients';\n vm.emptyResults = true;\n };\n\n vm.showSearchForm = function () {\n vm.showInviteForm = false;\n vm.emptyResults = false;\n if (isRegister) {\n vm.data.invitation = {};\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name lead.service:Leads\n *\n * @description\n *\n */\n angular\n .module('lead')\n .service('Leads', Leads);\n\n function Leads($rootScope, $document, $state, $q, Notification, $uibModal, Restangular) {\n var self = this;\n\n self.closeLead = function (lead, status) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'lead/close-lead.tpl.html',\n controller: 'CloseLeadCtrl',\n controllerAs: 'closeLead',\n size: 'md',\n resolve: {\n lead: function () {\n return lead;\n },\n status: function () {\n return status;\n },\n contract: function () {\n return Restangular.one('Leads').one('receiveLeadsContract').get({idUserSender: lead.sender.id})\n .then(function (contract) {\n return contract.plain();\n }, function () {\n return null;\n });\n },\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n leadPriceBreakdown: function () {\n if (status === 'successful') {\n return Restangular.one('Leads').one('calculateRewardTotal').get({\n idUserSender: lead.sender.id\n })\n .then(function (result) {\n return result.plain();\n }, function () {\n return null;\n });\n }\n return null;\n }\n }\n };\n if (lead.acceptedReceiveLeadsContractExists !== true) {\n $state.go('user.agreements', {\n id: lead.sender.id,\n '#': 'receive-leads-agreements-container'\n });\n Notification({message: 'Lead can be accessed with a valid agreement.'}, 'confirmation');\n return null;\n }\n\n params.appendTo = angular.element($document[0].body);\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n\n self.openDetail = function (lead, type, parentElementId, tabToOpen) {\n var modalInstance,\n params = {\n animation: true,\n templateUrl: 'lead/lead-detail.tpl.html',\n controller: 'LeadDetailCtrl',\n controllerAs: 'leadDetail',\n size: 'lg',\n resolve: {\n lead: function () {\n if (lead && angular.isDefined(lead.id)) {\n // The incoming lead is an object.\n return lead;\n }\n else if (angular.isDefined(lead) && angular.isNumber(lead) && angular.isDefined(type)) {\n // This is the id. Get the lead from the server.\n return Restangular.one('Leads').one('index').get({id: lead}).then(function (result) {\n return result.plain();\n });\n }\n },\n leadType: function () {\n return type;\n },\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n tabToOpen: function () {\n return tabToOpen;\n }\n }\n };\n\n if (lead && lead.sender && type === 'received' && lead.acceptedReceiveLeadsContractExists !== true && !lead.isCoOwner) {\n $state.go('user.agreements', {\n id: lead.sender.id,\n '#': 'receive-leads-agreements-container'\n });\n\n Notification({message: 'Lead can be accessed with a valid agreement.'}, 'confirmation');\n }\n else {\n params.appendTo = angular.element($document[0].body);\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n }\n return modalInstance;\n };\n\n self.openDetailById = function (id, type) {\n Restangular.one('Leads').one('index').get({id: id})\n .then(function (lead) {\n self.openDetail(lead.plain(), type);\n });\n };\n\n self.resend = function (id) {\n return Restangular.one('Leads').post('resend', {id: id});\n };\n\n self.acknowledge = function (id) {\n return Restangular.one('Leads').post('acknowledge', {id: id});\n };\n\n self.update = function (id, data) {\n var deferred = $q.defer();\n Restangular.one('Leads').customPUT(data, 'index?id=' + id)\n .then(function (result) {\n deferred.resolve(result.plain());\n }, function (error) {\n deferred.reject(error.data.errorCode);\n });\n\n return deferred.promise;\n };\n\n self.openSendLead = function (userProfile, isRegister, onCancelCallback, onSentCallback) {\n var slModalInstance,\n cancelCallback,\n sentCallback;\n\n cancelCallback = function () {\n if (slModalInstance) {\n slModalInstance.close();\n }\n if (onCancelCallback && angular.isFunction(onCancelCallback)) {\n onCancelCallback.apply();\n }\n };\n\n sentCallback = function () {\n if (slModalInstance) {\n slModalInstance.close();\n }\n if (onSentCallback && angular.isFunction(onSentCallback)) {\n onSentCallback.apply();\n }\n $rootScope.$broadcast('sentLeads-success');\n };\n\n slModalInstance = $uibModal.open({\n animation: false,\n appendTo: angular.element($document[0].body),\n templateUrl: 'lead/send-lead-modal.tpl.html',\n controller: 'SendLeadCtrl',\n controllerAs: 'sendLead',\n size: 'lg',\n resolve: {\n userProfile: function () {\n return userProfile;\n },\n isRegister: function () {\n return isRegister;\n },\n membersSubIndustries: null,\n onCancelCallback: function () {\n return cancelCallback;\n },\n onSentCallback: function () {\n return sentCallback;\n }\n }\n });\n\n return slModalInstance;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:LeadViewCtrl\n *\n * @description This is just a dummy view whoe only purpose is to provide background for the modal dialog for the incoming lead\n *\n */\n angular\n .module('lead')\n .controller('LeadViewCtrl', LeadViewCtrl);\n\n function LeadViewCtrl($state, $stateParams, Session, Leads, leadToOpen) {\n var vm = this,\n modalInstance;\n\n vm.lead = leadToOpen;\n vm.leadType = null;\n vm.tabToOpen = $stateParams.tabName;\n\n Session.getUserProfile().then(function (user) {\n vm.user = user;\n if (vm.lead.sender.fullName === vm.user.fullName) {\n vm.leadType = 'sent';\n }\n else {\n vm.leadType = 'received';\n }\n\n // We have a lead. Now open the modal dialog.\n // Once the modal is open, then handle the close and re-direct to the relevant section (my-pod, myBusiness) depending on the lead type\n if (angular.isDefined(vm.lead)) {\n modalInstance = Leads.openDetail(vm.lead, vm.leadType, null, vm.tabToOpen);\n if (angular.isDefined(modalInstance)) {\n modalInstance.then(function () {\n // We don't care much about the result. Just redirect to where it's required to go.\n if (vm.leadType === 'sent') {\n $state.go('myPod.sentLeads');\n }\n else {\n $state.go('myMemberships.receivedLeads');\n }\n });\n }\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('lead')\n .config(config);\n\n function config($stateProvider, configOptions) {\n $stateProvider\n .state('leadSend', {\n url: '/lead/send',\n templateUrl: 'lead/send-lead.tpl.html',\n controller: 'SendLeadCtrl',\n controllerAs: 'sendLead',\n authenticate: true,\n params: {\n user: null,\n lead: null\n },\n resolve: {\n // This the flag that will control whether the templates (and controller) will act as \"sending the leads\" or \"registering the lead\"\n isRegister: function () {\n return false;\n },\n // This is required for if the template is being used in the popup. The leads content is being requested via uiRouter, then provide the user details in the \"user\" param\n // If the isRegister == true, then the userProfile is the user in behalf who we are registering the lead. Otherwise it's the business user that the lead will be sent to.\n userProfile: function () {\n return null;\n },\n onCancelCallback: function () {\n return null;\n },\n onSentCallback: function () {\n return null;\n }\n }\n })\n .state('leadRegister', {\n url: '/lead/register',\n templateUrl: 'lead/send-lead.tpl.html',\n controller: 'SendLeadCtrl',\n controllerAs: 'sendLead',\n authenticate: true,\n params: {\n user: null,\n lead: null\n },\n resolve: {\n isRegister: function () {\n return true;\n },\n // This is required for if the template is being used in the popup. The leads content is being requested via uiRouter, then provide the user details in the \"user\" param\n userProfile: function () {\n return null;\n },\n onCancelCallback: function () {\n return null;\n },\n onSentCallback: function () {\n return null;\n }\n }\n })\n .state('leadDetail', angular.extend({}, configOptions.defaultStateParams, {\n url: '/lead/{id}/{tabName}',\n templateUrl: 'lead/lead-view.tpl.html',\n controller: 'LeadViewCtrl',\n controllerAs: 'leadView',\n authenticate: true,\n resolve: {\n leadToOpen: ['$stateParams', 'Restangular', 'Auth', function ($stateParams, Restangular, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Leads').one('index').get({id: $stateParams.id})\n .then(function (lead) {\n return lead.plain();\n }, function () {\n return null;\n });\n }\n return null;\n }, function () {\n return null;\n });\n }]\n }\n }));\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:LeadDetailCtrl\n *\n * @description\n *\n */\n angular\n .module('lead')\n .controller('LeadDetailCtrl', LeadDetailCtrl);\n\n function LeadDetailCtrl($rootScope, $scope, $uibModalInstance, $state, lead, leadType, userProfile, tabToOpen,\n Leads, Notification, FormAlerts, RewardCodes, Restangular, notificationConst) {\n var vm = this;\n vm.lead = lead;\n vm.leadType = leadType;\n vm.tabName = 'details';\n vm.isSending = false;\n vm.isAcknowledging = false;\n vm.alerts = new FormAlerts();\n vm.closeData = {};\n vm.isSavingUserShare = false;\n vm.userShareEmailChecked = false;\n vm.userShareEmailValid = false;\n vm.userShareEmailValidating = false;\n vm.userShareEmail = null;\n vm.userShareSectionVisible = false;\n vm.userShareEmailHelp = 'Type in the email address of another MyLeadPod user you want to share the lead with.';\n if (angular.isDefined(lead.coOwner) && angular.isObject(lead.coOwner)) {\n vm.userShareEmail = lead.coOwner.email;\n vm.userShareEmailValid = true;\n vm.userShareEmailChecked = true;\n }\n vm.searchCategories = [{\n name: 'Directory',\n value: 'businessUsers',\n stateTarget: 'user',\n iconClass: 'fa-briefcase'\n }];\n\n // Check tab name\n if (angular.isDefined(tabToOpen)) {\n vm.tabName = tabToOpen.lastIndexOf('detail') > -1 ? 'details' : tabToOpen;\n }\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Details',\n value: 'details'\n },\n {\n label: 'Messages',\n value: 'messages'\n }\n ];\n\n // Listen to the broadcast of 'close-modal-instance'\n $scope.$on('close-modal-instance', function () {\n $uibModalInstance.dismiss();\n });\n\n vm.close = function () {\n $uibModalInstance.close(vm.closeData);\n };\n\n vm.getUser = function () {\n if (leadType === 'sent') {\n return lead.recipient;\n }\n\n return lead.sender;\n };\n\n vm.showResendButton = function () {\n return leadType === 'sent' && lead.sender.id === userProfile.id && (lead.status === 'open' || lead.status === 'new');\n };\n\n vm.resend = function () {\n vm.isSending = true;\n vm.alerts.reset();\n Leads.resend(lead.id)\n .then(function () {\n vm.isSending = false;\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isSending = false;\n vm.alerts.add('danger', 'An error occurred, try again later please');\n });\n };\n\n vm.showAcknowledgeButton = function () {\n return leadType === 'received' && lead && lead.recipient && lead.recipient.id === userProfile.id && lead.status === 'new';\n };\n\n vm.acknowledge = function () {\n vm.isAcknowledging = true;\n vm.alerts.reset();\n Leads.acknowledge(lead.id)\n .then(function (result) {\n vm.lead = result;\n vm.isAcknowledging = false;\n lead = result.plain();\n vm.closeData.lead = lead;\n Notification({message: 'Success'}, 'confirmation');\n }, function () {\n vm.isAcknowledging = false;\n vm.alerts.add('danger', 'An error occurred, try again later please');\n });\n };\n\n vm.saveUserShare = function () {\n vm.isSavingUserShare = true;\n vm.editUserShareError = false;\n Leads.update(lead.id, {\n userShareEmail: vm.userShareEmail\n })\n .then(function (result) {\n vm.lead = result;\n lead = result;\n vm.closeData.lead = lead;\n vm.editUserShareVisible = false;\n vm.isSavingUserShare = false;\n vm.shareWithProfile = null;\n }, function () {\n vm.isSavingUserShare = false;\n vm.editUserShareError = 'An error occurred';\n });\n };\n\n vm.removeSharing = function () {\n vm.isRemovingShare = true;\n vm.userShareEmail = null;\n Leads.update(lead.id, {\n userShareEmail: vm.userShareEmail\n })\n .then(function (result) {\n vm.lead = result;\n lead = result;\n vm.closeData.lead = lead;\n vm.editUserShareVisible = false;\n vm.isSavingUserShare = false;\n vm.isRemovingShare = false;\n }, function () {\n vm.isRemovingShare = false;\n vm.isSavingUserShare = false;\n vm.editUserShareError = 'An error occurred';\n });\n };\n\n vm.onUserShareEmailChange = function () {\n vm.userShareEmailChecked = false;\n vm.userShareEmailValid = false;\n vm.userShareEmailValidating = false;\n };\n\n vm.validateUserShareEmail = function () {\n if (vm.userShareEmailValidating) {\n // This user email check fn can be triggered by blur and by the 'check' click. To avoid double requests return from here.\n return;\n }\n if (vm.userShareEmail && vm.userShareEmail.length >= 0) {\n vm.userShareEmailValidating = true;\n RewardCodes.isUserShareEmailValid(vm.userShareEmail)\n .then(function (isValid) {\n vm.userShareEmailValid = isValid;\n vm.userShareEmailValidating = false;\n vm.userShareEmailChecked = true;\n });\n }\n };\n\n vm.isUserShareEmailValid = function () {\n if (vm.userShareEmail !== null && vm.userShareEmail.length === 0) {\n return true;\n }\n\n return vm.userShareEmailValid;\n };\n\n vm.forward = function () {\n $uibModalInstance.dismiss();\n $state.go('leadSend', {\n lead: lead\n });\n };\n\n vm.closeLead = function (status) {\n Leads.closeLead(lead, status)\n .then(function () {\n lead.status = status;\n vm.lead.status = status;\n });\n };\n\n vm.getUserDetailClass = function () {\n if (vm.tabManager) {\n return vm.tabManager.isOpen('messages') ? 'table-user-detail-opaque' : '';\n }\n return '';\n };\n\n vm.searchResponseFormatter = function (response) {\n var r,\n records;\n\n vm.userInvitedProfile = null;\n\n if (angular.isUndefined(response) || !response) {\n return null;\n }\n vm.emptyResults = false;\n r = response.records;\n if (r.length === 0) {\n vm.emptyResults = true;\n }\n\n records = _.map(r, function (item) {\n var category = _.find(vm.searchCategories, {value: item.datasource}),\n returnObject = {},\n categoryDescriptionClass,\n value = item.fullname;\n\n categoryDescriptionClass = category.iconClass || 'fa-user';\n if (item.companyname && item.companyname !== item.fullname) {\n value += ' | ' + item.companyname;\n }\n\n returnObject = {\n value: value,\n id: item.id,\n category: item.datasource,\n categoryDescription: '',\n timeDescription: item.datecreatedformatted ? item.datecreatedformatted : '',\n leadtype: item.leadtype\n };\n\n return returnObject;\n });\n\n return records;\n };\n\n vm.onSearchItemSelected = function (item) {\n // Callback on when the user selected the search item.\n // Pull the stateTarget from category\n if (!item) {\n return;\n }\n vm.displayContactDetails = true;\n vm.isLoadingUserData = true;\n Restangular.one('Users').one('profile').get({id: item.originalObject.id})\n .then(function (profile) {\n profile = profile.plain();\n vm.userShareEmail = profile.email;\n vm.shareWithProfile = profile;\n vm.isLoadingUserData = false;\n });\n };\n\n // Broadcast to NotificationCentre that it can clear notifications related to this lead.\n // Broadcast to the NotificationCentre to check any notifications related to messages for this user.\n vm.onTabChange = function (activeTab) {\n var obj;\n if (activeTab === 'details') {\n obj = {\n userId: vm.getUser().idUser,\n category: notificationConst.categoryLeads,\n type: notificationConst.typeNewLead,\n data: {\n leadId: lead.id\n }\n };\n }\n else {\n obj = {\n userId: vm.getUser().idUser,\n category: notificationConst.categoryMessages,\n type: notificationConst.typeLeadMessage,\n data: {\n leadId: lead.id\n }\n };\n }\n $rootScope.$broadcast('event:notifications-check', obj);\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name lead.controller:CloseLeadCtrl\n *\n * @description\n *\n */\n angular\n .module('lead')\n .controller('CloseLeadCtrl', CloseLeadCtrl);\n\n function CloseLeadCtrl($rootScope, Restangular, $uibModalInstance, Notification, FormAlerts,\n lead, status, contract, userProfile, leadPriceBreakdown) {\n var vm = this;\n vm.lead = lead;\n vm.status = status;\n vm.contract = contract;\n vm.isLoading = false;\n vm.calculating = false;\n vm.calculationRequired = false;\n vm.selectedPricingOption = null;\n vm.user = userProfile;\n if (angular.isObject(leadPriceBreakdown)) {\n vm.processingFee = leadPriceBreakdown.fees;\n vm.tax = leadPriceBreakdown.tax;\n vm.total = leadPriceBreakdown.total;\n }\n else {\n vm.processingFee = 0;\n vm.tax = 0;\n vm.total = 0;\n }\n\n vm.showTotal = false;\n vm.data = {\n status: status,\n id: lead.id,\n creditCard: {},\n feedback: status === 'successful' ? 'Thank you for your lead!' : 'Thanks for your lead, it was not successful this time'\n };\n vm.alerts = new FormAlerts();\n\n if (contract && contract.pricingOptions) {\n // Sort the pricing options\n contract.pricingOptions = _.sortBy(contract.pricingOptions, 'successfulLeadPrice');\n if (contract.pricingOptions.length === 1) {\n vm.selectedPricingOption = contract.pricingOptions[0];\n vm.data.idPricingOption = contract.pricingOptions[0].id;\n }\n }\n\n Restangular.one('Billing').one('creditCard').get()\n .then(function (creditCard) {\n if (angular.isObject(creditCard) && angular.isDefined(creditCard.number)) {\n vm.creditCard = creditCard.plain();\n }\n vm.initialisingCard = false;\n }, function () {\n vm.initialisingCard = false;\n });\n\n vm.isSuccessful = function () {\n return status === 'successful';\n };\n\n vm.chargeForSuccessfulLead = function () {\n return angular.isObject(contract) && vm.isSuccessful() && (contract.contractType === 'Pay Per Lead' && contract.successfulLeadPrice > 0 ||\n contract.contractType === 'Rewards Program' || contract.contractType === 'Custom Rewards'\n );\n };\n\n vm.enableBonusReward = function () {\n return vm.isSuccessful() && angular.isObject(contract);\n };\n\n vm.showPriceBreakdown = function () {\n if (vm.isSuccessful()) {\n if (vm.chargeForSuccessfulLead()) {\n if (contract.contractType === 'Rewards Program' || contract.contractType === 'Custom Rewards') {\n return angular.isObject(vm.selectedPricingOption);\n }\n\n return true;\n }\n\n return vm.chargeForSuccessfulLead() ? true : vm.showTotal;\n }\n\n return false;\n };\n\n vm.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n vm.close = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Leads').post('close', vm.data)\n .then(function () {\n $uibModalInstance.close();\n $rootScope.$broadcast('event:lead-closed');\n Notification({message: 'Success'}, 'confirmation');\n }, function (responseData) {\n vm.isLoading = false;\n if (responseData.data.errorCode === 701 || responseData.data.errorCode === 702 || responseData.data.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to close the lead: ' + responseData.data.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to close the lead, try again later please');\n }\n });\n };\n\n vm.calculateTotal = function () {\n if (vm.calculationRequired) {\n vm.calculating = true;\n Restangular.one('Leads').one('calculateRewardTotal').get({\n reward: vm.data.bonusReward,\n idUserSender: lead.sender.id,\n idPricingOption: vm.data.idPricingOption\n })\n .then(function (result) {\n vm.processingFee = result.fees;\n vm.total = result.total;\n vm.tax = result.tax;\n vm.calculationRequired = false;\n vm.calculating = false;\n vm.showTotal = true;\n });\n }\n };\n\n vm.showCCForm = function () {\n if (!userProfile.isCCSet) {\n return angular.isObject(contract) && vm.isSuccessful() && (contract.contractType === 'Pay Per Lead' && contract.successfulLeadPrice > 0 ||\n contract.contractType === 'Rewards Program' || contract.contractType === 'Custom Rewards') || parseFloat(vm.data.bonusReward) > 0;\n }\n\n return false;\n };\n\n vm.onBonusRewardChange = function (form) {\n vm.showTotal = false;\n vm.calculationRequired = true;\n if (!vm.showCCForm()) {\n delete form.$error.ccExp;\n delete form.$error.ccNumber;\n delete form.$error.ccNumberType;\n delete form.$error.ccExpMonth;\n delete form.$error.ccExpYear;\n }\n };\n\n vm.onPricingOptionChange = function (form, $index) {\n vm.data.idPricingOption = contract.pricingOptions[$index].id;\n vm.selectedPricingOption = contract.pricingOptions[$index];\n vm.onBonusRewardChange(form);\n // vm.calculateTotal();\n };\n\n vm.getSuccessfulLeadPrice = function () {\n switch (contract.contractType) {\n case 'Pay Per Lead':\n return vm.contract.pricingOptions[0].successfulLeadPrice;\n case 'Rewards Program':\n case 'Custom Rewards':\n return vm.selectedPricingOption.successfulLeadPrice;\n default:\n return 0;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name dashboard\n * @description\n *\n */\n angular\n .module('dashboard', [\n 'ui.router',\n 'dashboard.pod',\n 'dashboard.memberships',\n 'dashboard.stats'\n ]);\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('dashboard')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('dashboard', {\n url: '/?imTopic',\n templateUrl: 'dashboard/dashboard.tpl.html',\n controller: 'DashboardCtrl',\n controllerAs: 'dashboard',\n authenticate: true,\n resolve: {\n userProfile: ['Session', function (Session) {\n return Session.getUserProfile();\n }],\n dashboardData: ['Restangular', 'Auth', function (Restangular, Auth) {\n return Auth.isAuthenticated().then(function (isAuthenticated) {\n if (isAuthenticated) {\n return Restangular.one('Dashboard').one('index').get()\n .then(function (result) {\n return result.plain();\n });\n }\n\n return null;\n }, function () {\n return null;\n });\n }]\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name dashboard.controller:DashboardCtrl\n *\n * @description\n *\n */\n angular\n .module('dashboard')\n .controller('DashboardCtrl', DashboardCtrl);\n\n function DashboardCtrl(userProfile, dashboardData) {\n var vm = this;\n vm.earnings = dashboardData.earnings;\n vm.donations = dashboardData.donations;\n vm.membersCount = dashboardData.membersCount;\n vm.membershipsCount = dashboardData.membershipsCount;\n vm.leadsDailyStats = dashboardData.leadsDailyStats;\n vm.earningsDailyStats = dashboardData.earningsDailyStats;\n vm.sentLeadsCount = dashboardData.sentLeadsCount;\n vm.members = dashboardData.members;\n vm.receivedLeads = dashboardData.receivedLeads;\n vm.userProfile = userProfile;\n\n vm.isBusinessAccountActive = function () {\n return angular.isObject(userProfile) && angular.isDefined(userProfile.isBusinessAccountActive) && userProfile.isBusinessAccountActive === true;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name configuration\n * @description\n *\n */\n angular\n .module('configuration', [\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name configuration.constant:configOptions\n *\n * @description\n *\n */\n angular\n .module('configuration')\n .constant('configOptions', {\n appVersion: '%APP_VERSION%',\n appUrl: '%APP_URL%',\n baseUrl: '%APP_BASE_URL%',\n facebookAppId: '%FACEBOOK_APP_ID%',\n facebookScope: 'email,public_profile',\n linkedInClientId: '%LINKEDIN_CLIENT_ID%',\n linkedInProxy: '%APP_BASE_URL%/Users/linkedinOAuthProxy?X-Ff3-Api-Key=%API_KEY%',\n googlePlusClientId: '%GOOGLE_PLUS_CLIENT_ID%',\n googleMapApiKey: '%GOOGLE_MAP_API_KEY%',\n googleMapLibraries: 'places',\n passwordPattern: '%PASSWORD_PATTERN%',\n passwordMessage: '%PASSWORD_MESSAGE%',\n apiKey: '%API_KEY%',\n oneSignalAppId: '%ONE_SIGNAL_APP_ID%',\n oneSignalSafariWebId: '%ONE_SIGNAL_SAFARI_WEB_ID%',\n linkedInScope: 'r_liteprofile,r_emailaddress',\n googlePlusScope: 'https://www.googleapis.com/auth/userinfo.email,' +\n 'https://www.googleapis.com/auth/userinfo.profile',\n maxFileUploadSize: 10485760,\n maxFileUploadMessage: 'Max allowed size of file is 10M',\n reCaptchaSiteKey: '%RECAPTCHA_SITE_KEY%',\n defaultStateParams: {\n params: {nextSteps: []},\n authenticate: true\n },\n bitlyGenericAccessToken: '%BITLY_GENERIC_ACCESS_TOKEN%',\n defaultShareName: 'Send leads. Be rewarded.',\n defaultShareMessage: 'MyLeadPod is a professional reward platform for individuals and businesses sending and receiving leads.',\n defaultEmailMessage: 'We are using MyLeadPod to reward successful leads provided by business associates, ' +\n 'friends and family. Click the link below to take the simple steps (a minute or two) to ' +\n 'join our cash rewards program.\\r\\r\\n Visit \\r\\n {{link}} \\r\\r\\n' +\n 'If you run a business yourself, check out MyLeadPod as your very own simple-to-use cash ' +\n 'reward program to incentivise word-of-mouth referrals. \\r\\r\\n We look forward to rewarding you in cash!',\n maxBusinessSuggestions: 1,\n reportRegistration: function () {\n // %GOOGLE_TAG_MANAGER_CONVERSION_SNIPPET%\n }\n });\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name components\n * @description\n *\n */\n angular\n .module('components', [\n 'components.ui'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:Tabs\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('Tabs', Tabs);\n\n function Tabs() {\n var TabsBase = {};\n\n function TabsManager(id, tabNames, activeTab) {\n var self = this;\n self.activeTab = activeTab;\n self.tabNames = tabNames;\n self.id = id;\n\n self.openTab = function (tabName) {\n if (self.activeTab !== tabName) {\n self.activeTab = tabName;\n }\n };\n\n self.isOpen = function (tabName) {\n return self.activeTab === tabName;\n };\n }\n\n TabsBase.create = function (id, tabNames, activeTab, $scope) {\n if (!angular.isArray(tabNames) || tabNames.length < 1) {\n throw new Error('List of names must not be empty');\n }\n\n if (angular.isUndefined(activeTab) && angular.isDefined($scope.tab)) {\n activeTab = $scope.tab;\n }\n\n return new TabsManager(id, tabNames, activeTab);\n };\n\n return TabsBase;\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:staticInclude\n * @restrict EA\n * @element\n *\n */\n angular\n .module('components')\n .directive('staticInclude', staticInclude);\n\n function staticInclude($templateRequest, $compile) {\n return {\n restrict: 'A',\n transclude: true,\n replace: true,\n scope: false,\n link: function ($scope, element, attrs) {\n var templatePath = attrs.staticInclude;\n\n $templateRequest(templatePath)\n .then(function (response) {\n var contents = element.html(response).contents();\n $compile(contents)($scope.$new(false, $scope.$parent));\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:stateClass\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('components')\n .directive('stateClass', stateClass);\n\n function stateClass($rootScope) {\n return {\n restrict: 'A',\n scope: {},\n link: function (scope, element, attrs) {\n /* jshint unused:false */\n /* eslint no-unused-vars: [2, {\"args\": \"none\", \"varsIgnorePattern\": \"Handler\" }]*/\n var stateChangeStartHandler = $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {\n var fromClassNames = angular.isDefined(fromState.data) && angular.isDefined(fromState.data.classNames) ? fromState.data.classNames : null,\n toClassNames = angular.isDefined(toState.data) && angular.isDefined(toState.data.classNames) ? toState.data.classNames : null;\n\n // don't do anything if they are the same\n if (fromClassNames !== toClassNames) {\n if (fromClassNames) {\n element.removeClass(fromClassNames);\n }\n\n if (toClassNames) {\n element.addClass(toClassNames);\n }\n }\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:statBlock\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('components')\n .directive('statBlock', statBlock);\n\n function statBlock() {\n return {\n restrict: 'EA',\n scope: {\n stat: '@',\n subtext: '@?',\n buttonText: '@?',\n buttonLink: '@?'\n },\n templateUrl: 'components/stat-block-directive.tpl.html',\n replace: false,\n controllerAs: 'statBlock',\n controller: function () {\n var vm = this;\n vm.stat = 0;\n vm.subtext = '-';\n vm.buttonText = 'View All';\n vm.buttonLink = '#';\n },\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n ctrl.stat = attrs.stat;\n ctrl.subtext = attrs.subtext;\n ctrl.buttonText = attrs.buttonText;\n ctrl.buttonLink = attrs.buttonLink;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:stPaginationScroll\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('components')\n .directive('stPaginationScroll', stPaginationScroll);\n\n function stPaginationScroll($timeout) {\n return {\n require: 'stTable',\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n\n var itemByPage = 10,\n pagination = ctrl.tableState().pagination,\n lengthThreshold = 50,\n timeThreshold = 400,\n promise = null,\n lastRemaining = 9999,\n container;\n\n if (element.closest('.fixed-header').length > 0) {\n container = element.find('> tbody');\n }\n else {\n container = element.parent();\n }\n\n function handler() {\n ctrl.slice(pagination.start + itemByPage, itemByPage);\n }\n\n container.bind('scroll', function () {\n var remaining = container[0].scrollHeight - (container[0].clientHeight + container[0].scrollTop);\n // if we have reached the threshold and we scroll down\n if (remaining < lengthThreshold && remaining - lastRemaining < 0) {\n // if there is already a timer running which has no expired yet we have to cancel it and restart the timer\n if (promise !== null) {\n $timeout.cancel(promise);\n }\n promise = $timeout(function () {\n handler();\n promise = null;\n }, timeThreshold);\n }\n lastRemaining = remaining;\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:scrollNavigator\n * @restrict A\n * @element\n *\n * @description Directive that checks if the element is within the viewport and if not, it displays the message to scroll\n *\n */\n angular\n .module('components')\n .directive('scrollNavigator', scrollNavigator);\n\n function scrollNavigator($window, $rootScope, $document, $timeout, $uibPosition) {\n return {\n restrict: 'AE',\n scope: {\n autoRun: '=',\n onClickCallback: '=',\n scrollTargetElementId: '=',\n scrollTargetChangeDelay: '='\n },\n link: function (scope, element, attrs) {\n var targetElement,\n checkScroll,\n navigatorElement,\n watchHandle,\n watchToolbarHandleVisible,\n watchToolbarHandleHidden,\n windowScrollHandle,\n windowResizeHandle,\n windowFn,\n timeoutPromise,\n navigatorOffsetX,\n navigatorOffsetY,\n actionToolbarOffset = 0,\n scrollingElement;\n\n function getScrollingElement() {\n var d = $document[0];\n return d.documentElement.scrollHeight > d.body.scrollHeight && d.compatMode.indexOf('CSS1') === 0 ? d.documentElement : d.body;\n }\n\n // Function\n checkScroll = function () {\n var offset;\n targetElement = $document[0].getElementById(scope.scrollTargetElementId);\n if (!targetElement) {\n return false;\n }\n offset = $uibPosition.viewportOffset(targetElement, true);\n\n if (offset.bottom < actionToolbarOffset) {\n // Means the target element is completely or partially out of view. Display the message.\n if (offset.bottom < targetElement.clientHeight * -1 + actionToolbarOffset) {\n // It's completely out\n navigatorElement.css({\n top: $window.innerHeight - navigatorElement.outerHeight() + navigatorOffsetY - actionToolbarOffset + 'px',\n left: offset.left + navigatorOffsetX + 'px',\n position: 'fixed'\n });\n }\n /*\n else {\n // Partially invisible. As the user might have been scrolling further from completely invisible to partially invisible (here)\n // the calculation and transition of the element are causing undesireable 'jump' effect. Let's check that\n navigatorElement.css({\n top: $window.innerHeight + (offset.top - $window.innerHeight) - navigatorElement.outerHeight() + $window.scrollY + navigatorOffsetY - actionToolbarOffset + 'px',\n left: offset.left + navigatorOffsetX + 'px',\n position: 'absolute'\n });\n }\n */\n navigatorElement.addClass('visible');\n scope.$apply();\n }\n else if (offset.bottom > 0) {\n navigatorElement.removeClass('visible');\n scope.$apply();\n }\n };\n\n // Get target element\n if (angular.isDefined(scope.scrollTargetElementId)) {\n // Create the navigator element\n navigatorElement = angular.element('
    ');\n navigatorElement[0].innerHTML = '' + attrs.scrollMessage + '';\n $document[0].body.appendChild(navigatorElement[0]);\n\n //\n navigatorOffsetX = attrs.scrollOffsetX ? parseInt(attrs.scrollOffsetX, 10) : 0;\n navigatorOffsetY = attrs.scrollOffsetY ? parseInt(attrs.scrollOffsetY, 10) : 0;\n\n //\n if (scope.onClickCallback) {\n navigatorElement.addClass('cursor-pointer');\n navigatorElement.on('click', function () {\n // Assuming the click will scroll the element in...\n // navigatorElement.removeClass('visible');\n // scope.$apply();\n // Call the callback function\n scope.onClickCallback(scope.scrollTargetElementId);\n });\n }\n\n //\n windowFn = function () {\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n scrollingElement = scrollingElement || getScrollingElement();\n if (scrollingElement.scrollTop < 0) {\n // This applies especially to iOS safar's elastic scroll that can go negative. don't do anything then.\n return;\n }\n timeoutPromise = $timeout(function () {\n checkScroll();\n }, 50);\n };\n\n windowScrollHandle = angular.element($window.document).on('scroll', windowFn);\n windowResizeHandle = angular.element($window.document).on('resize', windowFn);\n\n if (scope.autoRun) {\n checkScroll();\n }\n }\n\n //\n scope.$watch('scrollTargetElementId', function (oldVal, newVal) {\n if (oldVal !== newVal) {\n $timeout(function () {\n checkScroll();\n }, scope.scrollTargetChangeDelay ? scope.scrollTargetChangeDelay : 10);\n }\n });\n\n // Subscribe to the command of checking the scroll from parent (?). We shall be passing around the id of the element but no time for that\n watchHandle = $rootScope.$on('event:check-scroll-navigator', function (evt, id, timeout) {\n if (scope.scrollTargetElementId === id || id === 'all') {\n // Do this in the timeout as there might be multiple triggers for checkScroll and we don't know when and if to run scope.apply,\n // hence timeout to try to avoid the diggest errors,\n $timeout(function () {\n checkScroll();\n }, timeout ? timeout : 10);\n }\n else {\n navigatorElement.removeClass('visible');\n }\n });\n watchToolbarHandleVisible = $rootScope.$on('event:action-toolbar-visible', function (evt, height) {\n actionToolbarOffset = height;\n $timeout(function () {\n checkScroll();\n });\n });\n watchToolbarHandleHidden = $rootScope.$on('event:action-toolbar-hidden', function () {\n actionToolbarOffset = 0;\n $timeout(function () {\n checkScroll();\n });\n });\n scope.$on('$destroy', watchHandle);\n scope.$on('$destroy', watchToolbarHandleVisible);\n scope.$on('$destroy', watchToolbarHandleHidden);\n scope.$on('$destroy', function () {\n windowScrollHandle.off('scroll', windowFn);\n windowResizeHandle.off('resize', windowFn);\n navigatorElement.remove();\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:scrollCheck\n * @restrict A\n * @element\n *\n * @description Directive that checks the scroll and provides the css classes based on the location of the scroll\n *\n */\n angular\n .module('components')\n .directive('scrollCheck', scrollCheck);\n\n function scrollCheck($rootScope, $document, $timeout) {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, element, attrs) {\n var targetElement,\n checkScroll,\n hasScrollbar,\n watchHandle,\n init;\n\n scope.altElementBreakpoint = attrs.altElementBreakpoint ? parseInt(attrs.altElementBreakpoint, 10) : 1024;\n if (!angular.isNumber(scope.altElementBreakpoint)) {\n scope.altElementBreakpoint = 1024;\n }\n\n // Function\n checkScroll = function () {\n if (!targetElement || !targetElement[0]) {\n hasScrollbar = false;\n return false;\n }\n hasScrollbar = targetElement[0].scrollWidth > targetElement[0].clientWidth;\n\n // Now apply classes\n if (hasScrollbar) {\n element.removeClass('scroll-start');\n element.removeClass('scroll-between');\n element.removeClass('scroll-end');\n // Check the scrollbar position\n if (targetElement[0].scrollLeft === 0) {\n element.addClass('scroll-start');\n }\n else if (targetElement[0].scrollWidth - targetElement[0].scrollLeft === targetElement[0].clientWidth) {\n element.addClass('scroll-end');\n }\n else {\n element.addClass('scroll-between');\n }\n }\n };\n\n init = function () {\n targetElement = angular.element($document[0].getElementById(attrs.targetElementId));\n // Bind to the on scroll event\n targetElement.bind('scroll', function () {\n checkScroll();\n });\n checkScroll();\n };\n\n // Get target element\n if (angular.isDefined(attrs.targetElementId)) {\n if (attrs.withDelay) {\n $timeout(function () {\n init();\n }, Number(attrs.withDelay));\n }\n else {\n init();\n }\n }\n\n // Subscribe to the command of checking the scroll from parent (?). We shall be passing around the id of the element but no time for that\n watchHandle = $rootScope.$on('event:check-scroll', function () {\n checkScroll();\n });\n scope.$on('$destroy', watchHandle);\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:RouterHelper\n *\n * @description\n *\n */\n angular\n .module('components')\n .service('RouterHelper', RouterHelper);\n\n function RouterHelper($rootScope, $q, $timeout, QueueManager, QueueItem) {\n var self = this;\n\n self.activateTab = function (id, tabName, params) {\n QueueManager.add(new QueueItem(function (ready) {\n $q.when(ready).then(function () {\n $timeout(function () {\n self.lastEvent = {\n id: 'event:' + id + '-open-tab-' + tabName,\n params: params\n };\n\n $rootScope.$broadcast('event:' + id + '-open-tab-' + tabName, params);\n });\n });\n\n return $q.when(true);\n }));\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:RecordsSet\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('RecordsSet', RecordsSet);\n\n function RecordsSet($q, $httpParamSerializer, Restangular) {\n var RecordsSetBase = {},\n defaultQueryParams = {\n limit: 10\n };\n\n /**\n * Records set manager\n *\n * @callback itemCallback\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} queryParams Additional parameters\n * @param {Object} options Additional params to configure record set\n * @constructor\n */\n function RecordsSetManager(entity, endPoint, queryParams, options) {\n var self = this,\n loadingEnabled = true,\n totalLoaded = 0,\n initialise,\n deferredInit = $q.defer();\n\n options = angular.isObject(options) ? options : {};\n self.records = [];\n self.isLoading = false;\n self.isInitialised = false;\n self.numberOfSets = 0;\n self.recordsExist = null;\n self.totalRecords = null;\n\n if (angular.isObject(queryParams)) {\n queryParams = angular.extend({}, defaultQueryParams, queryParams);\n }\n else {\n queryParams = angular.extend({}, defaultQueryParams);\n }\n\n if (angular.isDefined(options.basicParams) && angular.isObject(options.basicParams)) {\n queryParams = angular.extend(queryParams, options.basicParams);\n }\n\n if (angular.isUndefined(endPoint) || endPoint.trim() === '') {\n endPoint = 'index';\n }\n\n /**\n * Load records, support for loading additional records\n * @param {Boolean} isReload Forces reload if set to true\n *\n * @returns {Deferred} Deferred promise\n */\n self.load = function (isReload) {\n var deferred = $q.defer();\n if (loadingEnabled) {\n self.isLoading = true;\n Restangular.one(entity).getList(endPoint + '?' + $httpParamSerializer(angular.extend(queryParams, {\n offset: totalLoaded\n }))).then(function (result) {\n angular.forEach(result, function (value) {\n var item = value.plain();\n if (angular.isDefined(options.itemCallback) && angular.isFunction(options.itemCallback)) {\n item = options.itemCallback(item);\n }\n self.records.push(item);\n });\n totalLoaded += result.meta.selectedRecords;\n if (result.meta.totalRecords <= totalLoaded) {\n loadingEnabled = false;\n }\n\n // MGA: there was a reason MSU was setting the totalRecords to 0 and later on keep comparing against null...\n // Let's still support it, but if it's the reload, then just force the update.\n if (!isReload) {\n if (self.totalRecords === null) {\n self.totalRecords = result.meta.totalRecords;\n }\n if (self.recordsExist === null) {\n self.recordsExist = self.records.length > 0;\n }\n }\n else {\n self.totalRecords = result.meta.totalRecords;\n // self.recordsExist = self.records.length > 0;\n }\n\n self.isLoading = false;\n self.isInitialised = true;\n\n if (angular.isDefined(queryParams.limit) && parseInt(queryParams.limit, 10) > 0) {\n self.numberOfSets = Math.ceil(result.meta.totalRecords / queryParams.limit);\n }\n deferred.resolve(self.records);\n }, function (result) {\n deferred.reject(result.data.errorMessage);\n });\n }\n else {\n deferred.resolve([]);\n }\n\n return deferred.promise;\n };\n\n initialise = function () {\n var deferred = $q.defer(),\n keys,\n extraParams,\n performInitQuery = false;\n\n if (!self.isInitialised) {\n if (angular.isDefined(options.basicParams) && angular.isObject(options.basicParams)) {\n keys = _.keys(options.basicParams);\n keys.push('limit');\n keys.push('offset');\n extraParams = _.omit(queryParams, keys);\n performInitQuery = _.keys(extraParams).length > 0;\n }\n\n if (performInitQuery) {\n self.isLoading = true;\n Restangular.one(entity).getList(endPoint + '?' + $httpParamSerializer(options.basicParams))\n .then(function (result) {\n self.recordsExist = result.meta.totalRecords > 0;\n self.totalRecords = result.meta.totalRecords;\n if (self.recordsExist) {\n self.load()\n .then(function () {\n self.isInitialised = true;\n deferred.resolve(true);\n });\n }\n else {\n self.isInitialised = true;\n self.isLoading = false;\n deferred.resolve(true);\n }\n });\n }\n else {\n self.load()\n .then(function () {\n self.isInitialised = true;\n deferred.resolve(true);\n });\n }\n }\n else {\n return deferred.resolve(true);\n }\n\n return deferred.promise;\n };\n\n /**\n *\n * Creates a new record\n *\n * @param {Object} data Data to be sent to server\n * @param {Object} queryParamsOverride Additional query params, if not provided then params used to initialise loader will be used\n * @param {string} appendTo One of 'beginning' or 'end', indicates the position of new record within existing records, if not provided then the record won't be inserted into the list\n * @returns {Deferred} Deferred promise\n */\n self.post = function (data, queryParamsOverride, appendTo) {\n var deferred = $q.defer(),\n qParams = queryParams;\n if (angular.isDefined(queryParamsOverride) && angular.isObject(queryParamsOverride)) {\n qParams = queryParamsOverride;\n }\n\n Restangular.one(entity).customPOST(data, endPoint, qParams)\n .then(function (result) {\n if (appendTo === 'beginning') {\n self.records.unshift(result.plain());\n totalLoaded += 1;\n }\n else if (appendTo === 'end') {\n self.records.push(result.plain());\n totalLoaded += 1;\n }\n deferred.resolve(result.plain());\n }, function (result) {\n deferred.reject(result.data.errorMessage);\n });\n\n return deferred.promise;\n };\n\n /**\n * Reload with new parameters\n * @param {Object} queryParamsOverride Overriding params\n * @param {Boolean} initialReset If true resets also flag indicating existence of records\n * @returns {Deferred} Deferred promise\n */\n self.reload = function (queryParamsOverride, initialReset) {\n self.reset(queryParamsOverride, initialReset);\n\n return self.load(true);\n };\n\n /**\n *\n * @param {string} key Key to sort by\n * @param {string} direction Direction to sort in\n * @returns {Deferred} Deferred promise\n */\n self.sort = function (key, direction) {\n self.records = [];\n totalLoaded = 0;\n loadingEnabled = true;\n queryParams = angular.extend(queryParams, {orderby: key + ' ' + direction});\n\n return self.load();\n };\n\n /**\n * Checks whether there is more records to load\n *\n * @returns {boolean} True or False whether loading is enabled\n */\n self.hasMore = function () {\n return loadingEnabled;\n };\n\n /**\n * Resets the loader, removes already loaded records from the list, resets counter\n *\n * @param {object} queryParamsOverride New params for the loader, overrides initial params from loader initialisation\n * @param {Boolean} initialReset If true resets also flag indicating existence of records\n */\n self.reset = function (queryParamsOverride, initialReset) {\n self.records = [];\n totalLoaded = 0;\n loadingEnabled = true;\n if (angular.isUndefined(initialReset) || initialReset !== true) {\n initialReset = false;\n }\n\n if (initialReset === true) {\n self.recordsExist = null;\n }\n if (angular.isObject(queryParamsOverride)) {\n queryParams = angular.extend({}, defaultQueryParams, queryParamsOverride);\n }\n else {\n queryParams = angular.extend({}, defaultQueryParams);\n }\n\n if (angular.isDefined(options.basicParams) && angular.isObject(options.basicParams)) {\n queryParams = angular.extend(queryParams, options.basicParams);\n }\n };\n\n self.isReady = deferredInit.promise;\n\n initialise().then(function () {\n deferredInit.resolve();\n }, function () {\n deferredInit.reject();\n });\n }\n\n /**\n * Returns instance of records set manager\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} params Additional parameters\n * @param {Object} options Additional params to configure record set\n * @returns {RecordsSetManager} Instance of records set manager\n */\n RecordsSetBase.createLoader = function (entity, endPoint, params, options) {\n return new RecordsSetManager(entity, endPoint, params, options);\n };\n\n return RecordsSetBase;\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:QueueManager\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('QueueManager', QueueManager);\n\n function QueueManager($timeout, QueueItem) {\n var QueueManagerBase = {};\n /**\n * List of items that needs to be executed\n * @type {QueueItem[]|Array}\n */\n QueueManagerBase.queue = [];\n\n /**\n * Add new item to the list\n * @param {QueueItem} item Queue Item\n */\n QueueManagerBase.add = function (item) {\n if (!(item instanceof QueueItem)) {\n throw new Error('Only instance of QueueItem is allowed');\n }\n\n this.queue.push(item);\n };\n\n /**\n * Resets queue\n */\n QueueManagerBase.reset = function () {\n this.queue = [];\n };\n\n /**\n * Start processing of items in queue\n */\n QueueManagerBase.start = function () {\n var that = this;\n\n if (this.queue.length === 0) {\n return;\n }\n\n function queueLoop(previousResult) {\n /**\n * Item to process\n * @type {QueueItem}\n */\n var item;\n if (that.queue.length === 0) {\n return;\n }\n\n item = that.queue.shift();\n item.callback(previousResult).then(function (result) {\n var delay = item.options.delay || 0;\n /**\n * Process next item with delay, pass result from current item\n */\n $timeout(function () {\n queueLoop(result);\n }, delay);\n });\n }\n\n queueLoop();\n };\n\n return QueueManagerBase;\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:QueueItem\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('QueueItem', QueueItem);\n\n function QueueItem() {\n /**\n * Creates new instance of QueueItem\n *\n * @param {Function} callback Callback function\n * @param {Object} options Options\n * @constructor\n */\n function QueueItemBase(callback, options) {\n if (!angular.isFunction(callback)) {\n throw new Error('Callback has to be a function');\n }\n\n this.callback = callback;\n this.options = options || {};\n }\n\n return QueueItemBase;\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:nodeRelocator\n * @restrict A\n * @element\n *\n * @description Directive that will handle the relocation of the element into the alternative node if the breakpoint is achieved (in direction from greater to small)\n *\n */\n angular\n .module('components')\n .directive('nodeRelocate', nodeRelocate);\n\n function nodeRelocate($window, $document) {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, element, attrs, ctrl) {\n /* jshint unused:false */\n /* eslint \"no-unused-vars\": [2, {\"args\": \"none\"}] */\n\n var moveElement,\n isMobile;\n\n scope.altElementBreakpoint = attrs.altElementBreakpoint ? parseInt(attrs.altElementBreakpoint, 10) : 1024;\n if (!angular.isNumber(scope.altElementBreakpoint)) {\n scope.altElementBreakpoint = 1024;\n }\n\n moveElement = function (el) {\n // We are moving the target element into 'el' which is either the srcElement or the altElement\n if (!el || !el.append || !scope.srcElement) {\n console.log('The core elements are missing');\n return;\n }\n // Invalidate the new container's display property\n el.css({display: null});\n // Append the target element into the new container\n el.append(element);\n // Make sure the element we are moving the target from is empty\n if (el[0] === scope.srcElement[0]) {\n scope.altElement[0].innerHTML = '';\n }\n else {\n scope.srcElement[0].innerHTML = '';\n }\n };\n\n // Get the alternative elementi\n if (angular.isDefined(attrs.altElementId)) {\n // Try to find it. Unfortunately, the angular.element($document).find doesn't work\n scope.altElement = angular.element($document[0].getElementById(attrs.altElementId));\n scope.srcElement = element.parent();\n\n if (scope.altElement) {\n scope.altElement.addClass('alt-node');\n // Ok now we will have to listen to the change events and then move this directive's element into the alt-element\n // Check if it's mobile already. If it is, then move it straightaway\n isMobile = $window.innerWidth < scope.altElementBreakpoint;\n if (isMobile) {\n moveElement(scope.altElement);\n scope.altElement.addClass('node-relocated');\n }\n else {\n scope.altElement.removeClass('node-relocated');\n }\n\n angular.element($window).on('resize', function () {\n isMobile = $window.innerWidth < scope.altElementBreakpoint;\n if (scope.isMobile !== isMobile && isMobile) {\n moveElement(scope.altElement);\n scope.altElement.addClass('node-relocated');\n }\n else if (scope.isMobile !== isMobile && !isMobile) {\n moveElement(scope.srcElement);\n scope.altElement.removeClass('node-relocated');\n }\n scope.isMobile = isMobile;\n });\n\n scope.isMobile = isMobile;\n }\n }\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc filter\n * @name components.filter:nl2br\n *\n * @description\n *\n * @param {Array} input The array to filter\n * @returns {Array} The filtered array\n *\n */\n angular\n .module('components')\n .filter('nl2br', nl2br);\n\n function nl2br() {\n return function (input) {\n if (input) {\n return (input + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + '
    ' + '$2');\n }\n\n return '';\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:Location\n *\n * @description\n *\n */\n angular\n .module('components')\n .service('Location', Location);\n\n function Location(Restangular, Cache) {\n var self = this,\n countries = [],\n states = [];\n\n self.cache = Cache.create('location');\n\n if (!self.cache.get('countries')) {\n Restangular.one('Countries').getList('index?limit=-1')\n .then(function (result) {\n angular.forEach(result, function (country) {\n countries.push(country.plain());\n });\n self.cache.put('countries', countries);\n });\n }\n else {\n countries = self.cache.get('countries');\n }\n\n if (!self.cache.get('states')) {\n Restangular.one('States').getList('index?limit=-1')\n .then(function (result) {\n angular.forEach(result, function (state) {\n states.push(state.plain());\n });\n self.cache.put('states', states);\n });\n }\n else {\n states = self.cache.get('states');\n }\n\n self.getCountries = function () {\n return countries;\n };\n\n self.getStates = function (idCountry) {\n idCountry = parseInt(idCountry, 10);\n if (idCountry > 0) {\n return _.filter(states, function (item) {\n return item.idCountry === idCountry;\n });\n }\n\n return states;\n };\n\n self.getCountryId = function (countryCode) {\n try {\n return _.find(countries, {abbrevation: countryCode}).idCountry;\n }\n catch (ex) {\n return null;\n }\n };\n\n self.getCountryNameById = function (countryId) {\n try {\n return _.find(countries, {idCountry: Number(countryId)}).name;\n }\n catch (ex) {\n return null;\n }\n };\n\n self.getStateId = function (countryId, stateCode) {\n var sts;\n try {\n sts = self.getStates(countryId);\n return _.find(sts, {abbrevation: stateCode}).idState;\n }\n catch (ex) {\n return null;\n }\n };\n\n self.getStateNameById = function (countryId, stateId, shortName) {\n var sts;\n try {\n sts = self .getStates(countryId);\n if (!shortName) {\n return _.find(sts, {idState: Number(stateId)}).name;\n }\n return _.find(sts, {idState: Number(stateId)}).abbrevation;\n }\n catch (ex) {\n return null;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:locationSearch\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('components')\n .directive('locationSearch', locationSearch);\n\n function locationSearch($q, GoogleMap) {\n return {\n restrict: 'A',\n scope: {\n inputId: '=',\n placeChangedCallback: '=',\n fullAddress: '='\n },\n replace: false,\n link: function (scope, element) {\n var autocomplete,\n placeSelected;\n\n // This is the place_changed handler which is the google event for the autocomplete input\n placeSelected = function () {\n var place = autocomplete.getPlace(),\n address;\n\n address = GoogleMap.convertAddress(place.address_components);\n address.location = GoogleMap.getFormattedAddress(address, scope.fullAddress);\n scope.placeChangedCallback(address);\n };\n\n GoogleMap.promise.then(function () {\n // Prevent \"Enter\" click to submit the form\n google.maps.event.addDomListener(element[0], 'keydown', function (event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n\n autocomplete = new google.maps.places.Autocomplete(element[0], {\n types: ['geocode']\n });\n autocomplete.addListener('place_changed', placeSelected);\n });\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:Industries\n *\n * @description\n *\n */\n angular\n .module('components')\n .service('Industries', Industries);\n\n function Industries($q, Restangular, Cache) {\n var self = this,\n industries = {},\n subIndustries = [],\n deferred = $q.defer(),\n cache = Cache.create('industries', {\n maxAge: 1800000\n });\n\n self.isReady = deferred.promise;\n\n self.init = function () {\n if (!cache.get('industries') || !cache.get('subIndustries')) {\n Restangular.one('Industries').getList('index?limit=-1&includeAll=true')\n .then(function (result) {\n // Reset subIndustries as it might enter here couple of times within the lifecycle of the app and for example\n // login / logout always triggers the init (as the cache of industries is cleared) and hence adding more\n // and more subindustries\n subIndustries = [];\n\n angular.forEach(result, function (industry) {\n industry = industry.plain();\n if (!isNaN(industry.idIndustryParent) && industry.idIndustryParent > 0) {\n subIndustries.push(industry);\n }\n else {\n industry.options = [];\n industries[industry.id] = industry;\n }\n });\n\n angular.forEach(subIndustries, function (subIndustry) {\n if (angular.isDefined(industries[subIndustry.idIndustryParent])) {\n industries[subIndustry.idIndustryParent].options.push(subIndustry);\n }\n });\n cache.put('industries', industries);\n cache.put('subIndustries', subIndustries);\n deferred.resolve();\n });\n }\n else {\n industries = cache.get('industries');\n subIndustries = cache.get('subIndustries');\n deferred.resolve();\n }\n };\n\n self.init();\n\n self.getMainList = function () {\n return industries;\n };\n\n self.getSubList = function (idParent) {\n idParent = parseInt(idParent, 10);\n if (idParent > 0) {\n return _.filter(subIndustries, function (item) {\n return item.idIndustryParent === idParent;\n });\n }\n\n return subIndustries;\n };\n\n self.getFilteredList = function (subIndustriesFilter) {\n var filteredList = {};\n if (angular.isArray(subIndustriesFilter) && subIndustriesFilter.length > 0) {\n angular.forEach(subIndustriesFilter, function (item) {\n if (angular.isUndefined(filteredList[item.idIndustryParent])) {\n filteredList[item.idIndustryParent] = angular.extend({}, industries[item.idIndustryParent], {options: []});\n }\n filteredList[item.idIndustryParent].options.push(item);\n });\n }\n\n return _.values(filteredList);\n };\n\n self.getConsolidatedList = function () {\n var list = [];\n angular.forEach(industries, function (industry) {\n if (industry.options.length > 0) {\n angular.forEach(industry.options, function (subIndustry) {\n list.push({\n id: subIndustry.id,\n name: industry.name + ' - ' + subIndustry.name\n });\n });\n }\n else {\n list.push({\n id: industry.id,\n name: industry.name\n });\n }\n });\n\n return list;\n };\n\n self.getConsolidatedFilteredList = function (subIndustriesFilter) {\n var filteredList = {};\n\n if (angular.isArray(subIndustriesFilter) && subIndustriesFilter.length > 0) {\n filteredList = _.filter(self.getConsolidatedList(), function (item) {\n return _.findIndex(subIndustriesFilter, {id: item.id}) > -1;\n });\n }\n\n return filteredList;\n };\n\n self.reload = function () {\n cache.removeAll();\n self.init();\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.provider:GoogleMap\n *\n * @description\n *\n */\n angular\n .module('components')\n .provider('GoogleMap', GoogleMap);\n\n function GoogleMap() {\n var apiKey,\n libraries,\n isLoaded = false;\n\n return {\n init: function (key, libs) {\n apiKey = key;\n libraries = libs;\n },\n $get: ['$window', '$document', '$http', '$q', function ($window, $document, $http, $q) {\n var googleMapApi = $q.defer(),\n scriptElement;\n if (!isLoaded) {\n $window.googleMapInitCallback = function () {\n $window.googleMapInitCallback = null;\n isLoaded = true;\n googleMapApi.resolve();\n };\n\n scriptElement = $document[0].createElement('script');\n scriptElement.src = 'https://maps.googleapis.com/maps/api/js?callback=googleMapInitCallback&key=' + apiKey + '&libraries=' + libraries;\n $document[0].body.appendChild(scriptElement);\n }\n else {\n googleMapApi.resolve();\n }\n\n /**\n * Special location formatting for automatically detected location\n * @param {Object} address Structured address\n * @param {Boolean} preciseAddress Structured address\n * @returns {string} Formatted address\n */\n googleMapApi.getFormattedAddress = function (address, preciseAddress) {\n var parts = [],\n subParts = [];\n\n if (preciseAddress && address.streetNumber) {\n parts.push(address.streetNumber);\n }\n\n if (address.streetAddress) {\n parts.push(address.streetAddress);\n }\n\n if (address.suburb) {\n subParts.push(address.suburb);\n }\n\n if (address.state) {\n subParts.push(address.state);\n }\n\n if (address.postCode) {\n subParts.push(address.postCode);\n }\n\n if (subParts.length > 0) {\n parts.push(subParts.join(' '));\n }\n\n if (address.country) {\n parts.push(address.country);\n }\n\n return parts.join(', ');\n };\n\n googleMapApi.convertAddress = function (inputAddress) {\n /* eslint camelcase: [2, {properties: \"never\"}]*/\n var address = {},\n i,\n val,\n addressType,\n mappings,\n typeMappings,\n loopFunc;\n\n mappings = [\n {\n typeKey: 'street_number',\n targetKey: 'streetNumber',\n sourceKey: 'short_name'\n },\n {\n typeKey: 'route',\n targetKey: 'streetAddress',\n sourceKey: 'long_name'\n },\n {\n typeKey: 'locality',\n targetKey: 'suburb',\n sourceKey: 'long_name'\n },\n {\n typeKey: 'administrative_area_level_1',\n targetKey: 'state',\n sourceKey: 'short_name'\n },\n {\n typeKey: 'country',\n targetKey: 'country',\n sourceKey: 'long_name'\n },\n {\n typeKey: 'country',\n targetKey: 'country_id',\n sourceKey: 'short_name'\n },\n {\n typeKey: 'postal_code',\n targetKey: 'postCode',\n sourceKey: 'short_name'\n }];\n\n loopFunc = function (mapping) {\n val = inputAddress[i][mapping.sourceKey];\n address[mapping.targetKey] = val;\n };\n\n for (i = 0; i < inputAddress.length; i++) {\n addressType = inputAddress[i].types[0];\n typeMappings = _.where(mappings, {typeKey: addressType});\n angular.forEach(typeMappings, loopFunc);\n }\n\n return address;\n };\n\n googleMapApi.getCurrentLocation = function (preciseAddress) {\n var deferred = $q.defer();\n if ('geolocation' in $window.navigator) {\n $window.navigator.geolocation.getCurrentPosition(function (position) {\n var geocoder = new google.maps.Geocoder(),\n gcRequest = {\n location: new google.maps.LatLng(position.coords.latitude, position.coords.longitude)\n };\n geocoder.geocode(\n gcRequest,\n function (gcResult, gcStatus) {\n var address;\n if (gcStatus === google.maps.GeocoderStatus.OK) {\n address = googleMapApi.convertAddress(gcResult[0].address_components);\n address.location = googleMapApi.getFormattedAddress(address, preciseAddress);\n if (gcResult[0].geometry) {\n address.geometry = {\n lat: gcResult[0].geometry.location.lat(),\n lng: gcResult[0].geometry.location.lng()\n };\n }\n deferred.resolve(address);\n }\n }\n );\n }, function () {\n deferred.reject();\n });\n }\n else {\n deferred.reject();\n }\n\n return deferred.promise;\n };\n\n googleMapApi.getStaticMapAsBase64 = function (address, options) {\n // Keep in mind that STATIC MAPS API will be constrain to only 640px if the key is not the business google maps license.\n // Check here https://developers.google.com/maps/documentation/static-maps/usage-limits\n\n var fileReader,\n deferred = $q.defer();\n\n if (!angular.isObject(options)) {\n deferred.reject();\n }\n\n try {\n $http({\n method: 'GET',\n url: 'https://maps.googleapis.com/maps/api/staticmap?format=png32¢er=' + address + '&zoom=15&size=' + options.w + 'x' + options.h + '&maptype=roadmap',\n responseType: 'blob'\n }).then(function (response) {\n fileReader = new FileReader();\n fileReader.onload = function () {\n deferred.resolve(fileReader.result);\n };\n fileReader.readAsDataURL(response.data);\n });\n }\n catch (err) {\n deferred.reject();\n }\n\n return deferred.promise;\n };\n\n return googleMapApi;\n }]\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:FormAlerts\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('FormAlerts', FormAlerts);\n\n function FormAlerts() {\n function FormAlertsBase() {\n this.alerts = [];\n this.someMethod = function () {\n return 'FormAlerts';\n };\n this.getList = function () {\n return this.alerts;\n };\n\n this.add = function (type, message) {\n this.alerts.push({type: type, message: message});\n };\n\n this.remove = function (index) {\n this.alerts.splice(index, 1);\n };\n\n this.reset = function () {\n this.alerts = [];\n };\n }\n\n return FormAlertsBase;\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc directive\n * @name components.directive:fileDownload\n * @restrict EA\n * @element\n *\n * @description\n *\n * @example\n \n \n \n \n \n *\n */\n angular\n .module('components')\n .directive('fileDownload', fileDownload);\n\n function fileDownload($window, $compile, Auth) {\n return {\n restrict: 'EA',\n scope: {\n url: '=',\n label: '='\n },\n replace: true,\n link: function (scope, element, attrs) {\n var template = '{{label}}',\n e;\n scope.class = attrs.class;\n scope.title = attrs.title || 'Click to download';\n scope.download = function () {\n $window.open(Auth.fixApiEndpointUrl(scope.url));\n };\n\n e = $compile(template)(scope);\n element.replaceWith(e);\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.factory:DataTable\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('DataTable', DataTable);\n\n function DataTable($q, RecordsSet) {\n var DataTableBase = {};\n\n /**\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} params Additional parameters\n * @param {Object} options Additional params to configure record set\n * @constructor\n */\n function DataTableManager(entity, endPoint, params, options) {\n var self = this,\n dataLoader = RecordsSet.createLoader(entity, endPoint, params, options),\n lastTableState = {},\n loadingMoreRecords = false,\n deferredInit = $q.defer();\n\n self.isReady = deferredInit.promise;\n\n // Wait for the data loader to initialise. Then the promise will be fulfilled and the self.isReady by be set.\n dataLoader.isReady.then(function () {\n deferredInit.resolve();\n }, function () {\n deferredInit.reject();\n });\n\n /**\n * Loads the data\n * @param {Object} tableState Table state from the Smart Table\n */\n self.load = function (tableState) {\n // var key, direction;\n if (!self.isLoading()) {\n loadingMoreRecords = true;\n dataLoader.load()\n .then(function () {\n tableState.pagination.numberOfPages = dataLoader.numberOfSets;\n loadingMoreRecords = false;\n }, function () {\n loadingMoreRecords = false;\n });\n\n // if (angular.isObject(tableState.sort) && angular.isDefined(tableState.sort.predicate)) {\n // if (angular.isUndefined(lastTableState.sort) || !angular.equals(tableState.sort, lastTableState.sort)) {\n // key = tableState.sort.predicate;\n // direction = tableState.sort.reverse ? 'DESC' : 'ASC';\n // dataLoader.sort(key, direction)\n // .then(function () {\n // tableState.pagination.numberOfPages = dataLoader.numberOfSets;\n // });\n // }\n // }\n // else {\n // dataLoader.load()\n // .then(function () {\n // tableState.pagination.numberOfPages = dataLoader.numberOfSets;\n // });\n // }\n\n lastTableState = tableState;\n }\n };\n\n /**\n * Reloads the records with new parameters\n * @param {Object} reloadParams New parameters\n * @param {Boolean} initialReset If true resets also flag indicating existence of records\n *\n * @returns {Object} Result\n */\n self.reload = function (reloadParams, initialReset) {\n if (!self.isLoading()) {\n if (angular.isObject(lastTableState) && angular.isObject(lastTableState.sort) && angular.isDefined(lastTableState.sort.predicate)) {\n reloadParams.orderby = lastTableState.sort.predicate + ' ' + (lastTableState.sort.reverse ? 'DESC' : 'ASC');\n }\n return dataLoader.reload(reloadParams, initialReset)\n .then(function (result) {\n if (angular.isObject(lastTableState) && angular.isObject(lastTableState.pagination)) {\n lastTableState.pagination.numberOfPages = dataLoader.numberOfSets;\n\n return $q.when(result);\n }\n });\n }\n\n return $q.when(false);\n };\n\n /**\n * Returns the records\n * @returns {Array} Records\n */\n self.getRecords = function () {\n return dataLoader.records;\n };\n\n /**\n * Checks if the data table is loading the data\n * @returns {boolean} Flag if records are loading\n */\n self.isLoading = function () {\n return dataLoader.isLoading;\n };\n\n /**\n * Checks if loading more records - pagination\n *\n * @returns {boolean} Flag if loading more records\n */\n self.isLoadingMoreRecords = function () {\n return loadingMoreRecords;\n };\n\n /**\n * Checks if the data table is initialised\n * @returns {boolean} Flag if records are initialised\n */\n self.isInitialised = function () {\n return dataLoader.isInitialised;\n };\n\n /**\n * Checks if records exist\n *\n * @returns {boolean} Flag if records exist\n */\n self.recordsExist = function () {\n return dataLoader.recordsExist;\n };\n\n /**\n * Returns number of total records\n * @returns {integer} Number of total records\n */\n self.totalRecords = function () {\n return dataLoader.totalRecords;\n };\n }\n\n /**\n * Returns instance of data table manager\n *\n * @param {string} entity Name of the entity\n * @param {string} endPoint Endpoint to be called, default index\n * @param {Object} params Additional parameters\n * @param {Object} options Additional params to configure record set\n * @returns {DataTableManager} Instance of data table manager\n */\n DataTableBase.create = function (entity, endPoint, params, options) {\n return new DataTableManager(entity, endPoint, params, options);\n };\n\n return DataTableBase;\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name components.service:CreditCardUtil\n *\n * @description\n *\n */\n angular\n .module('components')\n .service('CreditCardUtil', CreditCardUtil);\n\n function CreditCardUtil() {\n var self = this,\n acceptedCreditCards = ['Visa', 'MasterCard', 'American Express'],\n expiryMonths = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],\n currentYear = new Date().getFullYear(),\n expiryYears = _.range(currentYear, currentYear + 20, 1);\n\n /**\n * Returns list of accepted credit cards\n *\n * @returns {string[]} Array of accepted credit cards\n */\n self.getAcceptedCards = function () {\n return acceptedCreditCards;\n };\n\n /**\n * Returns expiry months\n *\n * @returns {string[]} Array of months\n */\n self.getExpiryMonths = function () {\n return expiryMonths;\n };\n\n /**\n * Returns expiry years\n *\n * @returns {integer[]} Array of valid years\n */\n self.getExpiryYears = function () {\n return expiryYears;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc factory\n * @name components.factory:ComponentsUtil\n *\n * @description\n *\n */\n angular\n .module('components')\n .factory('ComponentsUtil', ComponentsUtilFactory);\n\n function ComponentsUtilFactory() {\n return {\n\n /**\n * Returns the updated tableSubContentVisible object used across the MLP for tables in xs (sm) devices\n * @param {Object} subContent Subcontent\n * @param {int} idx Index\n * @return {Object} Updated content object.\n */\n toggleSubContent: function (subContent, idx) {\n if (!subContent) {\n subContent = {};\n subContent[idx] = true;\n }\n else if (_.contains(_.keys(subContent), idx.toString())) {\n // Check if the incoming idx is already added, Just toggle it.\n subContent[idx] = !subContent[idx];\n }\n else {\n // Delete everything and set as new\n subContent = {};\n subContent[idx] = true;\n }\n return subContent;\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc filter\n * @name components.filter:address\n *\n * @description\n *\n * @param {Object} input The address object\n * @returns {String} Formatted Address\n *\n */\n angular\n .module('components')\n .filter('address', addressFilter);\n\n function addressFilter() {\n return function (input, locale) {\n var address = input,\n formats = {\n au: [['numberPostal', 'addressPostal'], ['suburbPostal', 'statePostalShort', 'postCodePostal'], 'countryPostal'],\n us: [['numberPostal', 'addressPostal'], 'suburbPostal', 'statePostalShort', 'postCodePostal', 'countryPostal']\n },\n format,\n output,\n innerOutput;\n\n format = formats[locale];\n if (!format) {\n format = formats.au;\n }\n\n if (address) {\n angular.forEach(format, function (key) {\n if (angular.isArray(key)) {\n // Keys in array are not separated by divider\n angular.forEach(key, function (k) {\n innerOutput = (innerOutput ? innerOutput + ' ' : '') + (address[k] ? address[k] : '');\n });\n if (innerOutput) {\n output = (output ? output + ', ' : '') + innerOutput;\n }\n innerOutput = '';\n }\n else if (address[key]) {\n output = (output ? output + ', ' : '') + address[key];\n }\n });\n return output;\n }\n\n return '';\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name cache\n * @description\n *\n */\n angular\n .module('cache', [\n 'angular-cache'\n ]);\n\n angular\n .module('cache')\n .config(config);\n\n function config(CacheFactoryProvider) {\n angular.extend(CacheFactoryProvider.defaults, {\n storagePrefix: 'myleadpod.',\n maxAge: 864000000\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name cache.service:Cache\n *\n * @description\n *\n */\n angular\n .module('cache')\n .service('Cache', Cache);\n\n function Cache(CacheFactory) {\n var self = this;\n\n self.create = function (name, options) {\n var cacheInstance = CacheFactory.get(name);\n if (!cacheInstance) {\n cacheInstance = CacheFactory.createCache(name, angular.extend({\n deleteOnExpire: 'aggressive',\n storageMode: 'localStorage'\n }, options));\n }\n\n return cacheInstance;\n };\n\n self.get = CacheFactory.get;\n }\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name api\n * @description\n *\n */\n angular\n .module('api', [\n 'cache'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.service:Session\n *\n * @description\n *\n */\n angular\n .module('api')\n .service('Session', Session);\n\n function Session($rootScope, $q, Restangular) {\n var self = this;\n\n self.data = {\n profile: null\n };\n self.loaded = false;\n self.loading = false;\n self.deferred = null;\n\n /**\n * Returns user profile\n *\n * @returns {Object} User profile\n */\n self.getUserProfile = function () {\n return self.getSession()\n .then(function (session) {\n return session.data.profile;\n });\n };\n\n /**\n * Updates user's profile\n *\n * @param {Object} profileData New profile data\n * @returns {Deferred} Deferred promise\n */\n self.updateUserProfile = function (profileData) {\n var deferred = $q.defer();\n Restangular.one('Users').customPUT(profileData, 'profile')\n .then(function (profile) {\n self.create(profile.plain());\n $rootScope.$broadcast('event:user-updateProfile', {profile: self.data.profile});\n deferred.resolve(self.data.profile);\n }, function () {\n deferred.reject();\n });\n\n return deferred.promise;\n };\n\n /**\n * Update local user's profile with new params\n *\n * @param {Object} params Update parameters\n * @param {boolean} broadcast Whether this new get requests should broadcast the event of the local user profile update\n * @returns {Object} User's profile\n */\n self.updateLocalUserProfile = function (params, broadcast) {\n if (angular.isObject(params)) {\n self.data.profile = angular.extend(self.data.profile, params);\n if (broadcast) {\n $rootScope.$broadcast('event:user-updateLocalProfile', params);\n }\n }\n\n return self.data.profile;\n };\n\n /**\n * Populates session from the provided data\n *\n * @param {Object} profile User's profile\n */\n self.create = function (profile) {\n self.destroy();\n if (angular.isObject(profile) && angular.isDefined(profile.idUser)) {\n self.data.profile = profile;\n self.data.profile.fullName = profile.firstName + ' ' + profile.lastName;\n }\n self.loaded = true;\n self.loading = false;\n if (self.deferred) {\n self.deferred.resolve(self);\n }\n };\n\n /**\n * Destroys the session\n */\n self.destroy = function () {\n self.data = {\n profile: null\n };\n };\n\n /**\n * Loads the Session\n *\n * @returns {Session} Current Session\n */\n self.loadSession = function () {\n if (!self.isLoading()) {\n self.loading = true;\n self.deferred = $q.defer();\n return Restangular.one('Users').one('check').get()\n .then(function (result) {\n if (result.status === true && angular.isObject(result.profile)) {\n return result.profile;\n }\n\n return null;\n })\n .then(function (userProfile) {\n self.create(userProfile);\n\n return self;\n });\n }\n\n return self.deferred.promise;\n };\n\n /**\n * Returns the Session\n *\n * @returns {Session} Current Session\n */\n self.getSession = function () {\n if (!self.isLoaded()) {\n return self.loadSession();\n }\n\n return $q.when(self);\n };\n\n /**\n * Check if the profile is valid\n *\n * @param {Object} profile Profile data to validate\n * @returns {boolean} Flag if profile is valid\n */\n self.isValidProfile = function (profile) {\n return angular.isObject(profile) && !!profile.idUser;\n };\n\n /**\n * Returns whether the user is signed in\n *\n * @returns {boolean} True or False\n */\n self.isSignedIn = function () {\n return self.getSession()\n .then(function (session) {\n return self.isValidProfile(session.data.profile);\n });\n };\n\n /**\n * Returns whether the session is already loaded\n *\n * @returns {boolean} True or False\n */\n self.isLoaded = function () {\n return !!self.loaded;\n };\n\n /**\n * Returns whether the session is currently loading\n *\n * @returns {boolean} True or False\n */\n self.isLoading = function () {\n return !!self.loading;\n };\n\n /**\n * Removes user's photo\n * @returns {Deferred} Deferred promise\n */\n self.removePhoto = function () {\n var deferred = $q.defer();\n Restangular.one('Users').one('photo').remove()\n .then(function () {\n self.data.profile.imageToken = null;\n $rootScope.$broadcast('event:user-updateProfile', {profile: self.data.profile});\n deferred.resolve(self.data.profile);\n }, function () {\n deferred.reject();\n });\n\n return deferred.promise;\n };\n\n /**\n * Updates user's photo\n * @param {string} dataUri Uri of photo\n * @returns {Deferred} Deferred promise\n */\n self.updatePhoto = function (dataUri) {\n var deferred = $q.defer();\n Restangular.one('Users').customPUT({\n dataUri: dataUri\n }, 'photoBase64')\n .then(function (result) {\n self.data.profile.imageToken = result.imageToken;\n $rootScope.$broadcast('event:user-updateProfile', {profile: self.data.profile});\n deferred.resolve(self.data.profile);\n }, function () {\n deferred.reject();\n });\n\n return deferred.promise;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.factory:Ff3ApiInterceptor\n *\n * @description\n *\n */\n angular\n .module('api')\n .factory('Ff3ApiInterceptor', Ff3ApiInterceptor)\n .config(moduleConfig);\n\n function Ff3ApiInterceptor($injector, $q, $rootScope) {\n var Ff3ApiInterceptorBase = {};\n Ff3ApiInterceptorBase.request = function (config) {\n var\n apiParams = $injector.get('Auth').getSecurityParams(),\n baseUrl = $injector.get('configOptions').baseUrl;\n\n if (config.url.indexOf(baseUrl) === -1) {\n return config;\n }\n\n if (config.method === 'GET') {\n // We will be appending all the required parameters as query params\n if (!config.params) {\n config.params = apiParams;\n }\n else {\n angular.forEach(apiParams, function (value, key) {\n config.params[key] = value;\n });\n }\n }\n else {\n config.headers.Accept = 'application/json';\n angular.forEach(apiParams, function (value, key) {\n config.headers[key] = value;\n });\n }\n\n return config;\n };\n\n Ff3ApiInterceptorBase.responseError = function (rejection) {\n if (rejection.status === 403 || rejection.status === 401) {\n $rootScope.$broadcast('event:auth-loginRequired', rejection);\n }\n // otherwise, default behaviour\n return $q.reject(rejection);\n };\n\n return Ff3ApiInterceptorBase;\n }\n\n function moduleConfig($httpProvider) {\n $httpProvider.interceptors.push('Ff3ApiInterceptor');\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.service:Auth\n *\n * @description\n *\n */\n angular\n .module('api')\n .service('Auth', Auth);\n\n function Auth($rootScope, $q, $timeout, $httpParamSerializer, $injector, Restangular, configOptions, Cache, Session) {\n var self = this,\n cache = Cache.create('auth');\n\n self.localSignoutTimeout = 200;\n\n /**\n * Returns the login token\n *\n * @returns {string} Login token\n */\n function getLoginToken() {\n return cache.get('loginToken');\n }\n\n /**\n * Saves the login token\n *\n * @param {string} loginToken Login token\n */\n self.saveLoginToken = function (loginToken) {\n cache.put('loginToken', loginToken);\n };\n\n /**\n * Deletes the login token\n */\n function deleteLoginToken() {\n cache.remove('loginToken');\n }\n\n function localSignOut() {\n deleteLoginToken();\n Session.destroy();\n cache.removeAll();\n $rootScope.$broadcast('event:auth-logoutSuccess');\n }\n\n /**\n * Signs user in\n *\n * @param {string} endPoint API end point\n * @param {Object} data Sign In data\n * @returns {Deferred} Resolved value will be either Session in case of success or reason in case of failure\n */\n function signIn(endPoint, data) {\n var deferred = $q.defer();\n $injector.get('OneSignal').getUserId().then(function (playerId) {\n data.oneSignalPlayerId = playerId;\n });\n Restangular.one('Users').post(endPoint, data)\n .then(function (result) {\n self.saveLoginToken(result.authToken);\n Session.create(result.profile);\n $rootScope.$broadcast('event:auth-loginConfirmed');\n deferred.resolve(Session);\n }, function (result) {\n deferred.reject({\n errorMessage: result.data.errorMessage,\n errorCode: result.data.errorCode\n });\n });\n\n return deferred.promise;\n }\n\n /**\n * Returns whether the user is authenticated\n *\n * @returns {boolean} True or False\n */\n self.isAuthenticated = function () {\n return Session.isSignedIn();\n };\n\n /**\n * Signs user out\n *\n * @param {boolean} serverLogout If false server side sign out will not be performed as well, default true\n *\n * @returns {void}\n */\n self.signOut = function (serverLogout) {\n var data = {};\n if (angular.isUndefined(serverLogout)) {\n serverLogout = true;\n }\n if (serverLogout) {\n $injector.get('OneSignal').getUserId().then(function (playerId) {\n data.oneSignalPlayerId = playerId;\n });\n Restangular.one('Users').post('signOut', data);\n }\n $timeout(localSignOut, self.localSignoutTimeout);\n };\n\n /**\n * Signs user in using username and password\n *\n * @param {string} username Username\n * @param {string} password Password\n * @returns {Deferred} Resolved value will be either Session in case of success or reason in case of failure\n */\n self.passwordSignIn = function (username, password) {\n return signIn('signIn', {\n username: username,\n password: password\n });\n };\n\n /**\n * Signs user in through social services (OAuth2)\n *\n * @param {string} provider Social service provider\n * @param {string} accessToken OAuth2 Access Token\n * @param {Object} params Additional parameters\n * @returns {Deferred} Resolved value will be either Session in case of success or reason in case of failure\n */\n self.socialSignIn = function (provider, accessToken, params) {\n var deferred = $q.defer();\n if (!angular.isObject(params)) {\n params = {};\n }\n Restangular.one('Users').post('socialNetworkSignIn', angular.extend({}, {\n oauth2: {\n accessToken: accessToken,\n provider: provider\n }\n }, params))\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n deferred.resolve({\n activationToken: result.activationToken\n });\n }\n else {\n self.saveLoginToken(result.authToken);\n Session.create(result.profile);\n $rootScope.$broadcast('event:auth-loginConfirmed');\n deferred.resolve(Session);\n }\n }, function (result) {\n deferred.reject(result.data.errorMessage);\n });\n\n return deferred.promise;\n };\n\n /**\n * Activates user account\n *\n * @param {string} token Activation token\n * @param {Object} userProfile User profile data\n * @returns {Deferred} Deferred promise\n */\n self.activateAccount = function (token, userProfile) {\n return signIn('activate', {\n token: token,\n account: userProfile\n });\n };\n\n /**\n * Returns security params necessary to access an API endpoint via URL\n * @returns {{X-Jwt-Assertion: string, X-Ff3-Api-Key: string}} Object with security params\n */\n self.getSecurityParams = function () {\n var params = {\n 'X-Ff3-Api-Key': configOptions.apiKey\n },\n token = getLoginToken();\n if (angular.isDefined(token) && token !== null && token !== '') {\n params['X-Jwt-Assertion'] = token;\n }\n\n return params;\n };\n\n /**\n * Fixes API endpoint URL\n * @param {string} apiEndpoint API Endpoint\n * @return {string} Full API endpoint including base url and auth params\n */\n self.fixApiEndpointUrl = function (apiEndpoint) {\n var tempUrl = configOptions.baseUrl,\n paramsStr = $httpParamSerializer(self.getSecurityParams());\n\n tempUrl += apiEndpoint;\n if (paramsStr !== '') {\n if (tempUrl.indexOf('?') !== -1) {\n tempUrl += '&' + paramsStr;\n }\n else {\n tempUrl += '?' + paramsStr;\n }\n }\n\n return tempUrl;\n };\n\n /**\n * Check if user has permission\n *\n * @param {Object} userProfile User's profile\n * @param {string} permission Name of permission to check\n * @return {boolean} Flag indicating if user has the permission or not\n */\n self.hasUserPermission = function (userProfile, permission) {\n if (angular.isObject(userProfile) && angular.isString(permission)) {\n if (angular.isObject(userProfile.permissions) && angular.isDefined(userProfile.permissions[permission])) {\n return userProfile.permissions[permission] === true;\n }\n }\n return false;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name api.constant:authEvents\n *\n * @description\n *\n */\n angular\n .module('api')\n .constant('authEvents', {\n loginSuccess: 'event:auth-loginConfirmed',\n loginFailed: 'event:auth-loginFailed',\n loginCancelled: 'event:auth-loginCancelled',\n logoutSuccess: 'event:auth-logoutSuccess',\n sessionTimeout: 'event:auth-sessionTimeout',\n sessionLoaded: 'event:auth-sessionLoaded',\n notAuthenticated: 'event:auth-loginRequired',\n notAuthorised: 'event:auth-notAuthorised'\n });\n}());\n","(function () {\n 'use strict';\n\n /* @ngdoc object\n * @name auth\n * @description\n *\n */\n angular\n .module('account', [\n 'ui.router',\n 'account.password',\n 'account.profile',\n 'account.billing',\n 'account.earnings',\n 'account.feedback',\n 'account.preferences'\n ]);\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:SignUpCtrl\n *\n * @description\n *\n */\n angular\n .module('account')\n .controller('SignUpCtrl', SignUpCtrl);\n\n function SignUpCtrl($state, $stateParams, Restangular, FormAlerts, SocialAccount, invitation, rewardCode) {\n var vm = this;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.showMessage = false;\n vm.isLoading = false;\n vm.invitationSender = null;\n vm.invitationType = null;\n\n // For trial content to display.\n vm.trialEligible = false;\n vm.trialDuration = null;\n\n // Reward Code\n vm.rewardCode = null;\n vm.rewardCodeChecked = false;\n vm.isRewardCodeValid = false;\n\n // If it's coming as BOOL false val, then we tried to retrieve it in reward-program-routes but was not found\n if (rewardCode === false) {\n vm.rewardCodeChecked = true;\n }\n\n if (angular.isObject(invitation) && angular.isDefined(invitation.email)) {\n vm.invitationSender = invitation.userSender;\n vm.invitationType = invitation.invitationType;\n vm.data.email = invitation.email;\n }\n else if (angular.isObject(rewardCode) && angular.isDefined(rewardCode.owner)) {\n vm.invitationSender = rewardCode.owner;\n vm.invitationType = 'Reward Code';\n vm.rewardCode = $stateParams.rewardCode;\n if (rewardCode.rewardCode) {\n vm.trialEligible = rewardCode.rewardCode.isEligibleForBusinessAccountTrial;\n vm.trialDuration = rewardCode.rewardCode.businessAccountTrialDuration;\n }\n }\n\n vm.passwordSignUp = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Users').post('signUp', {\n email: vm.data.email,\n password: vm.data.password,\n invitationToken: $stateParams.invitationToken,\n rewardCode: $stateParams.rewardCode || vm.rewardCode\n })\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n $state.go('accountActivate', {\n token: result.activationToken,\n invitationToken: $stateParams.invitationToken\n });\n }\n else {\n vm.showMessage = true;\n }\n }, function (error) {\n vm.isLoading = false;\n if (error.data && error.data.errorCode === 107) {\n vm.alerts.add('danger', 'This email is already registered. You can login here.');\n }\n else {\n vm.alerts.add('danger', 'Unable to sign up');\n }\n console.log(error);\n });\n };\n\n vm.socialSignIn = function (provider) {\n vm.isLoading = true;\n vm.alerts.reset();\n SocialAccount.signIn(provider, {\n invitationToken: $stateParams.invitationToken,\n rewardCode: $stateParams.rewardCode\n })\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n $state.go('accountActivate', {\n token: result.activationToken,\n invitationToken: $stateParams.invitationToken\n });\n }\n else if (angular.isDefined($stateParams.invitationToken) && angular.isString($stateParams.invitationToken)) {\n $state.go('userInvitation', {token: $stateParams.invitationToken});\n }\n else {\n $state.go('dashboard');\n }\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to sign up');\n });\n };\n\n vm.checkRewardCode = function () {\n if (!vm.rewardCode) {\n vm.isRewardCodeValid = false;\n vm.rewardCodeChecked = false;\n return;\n }\n if (vm.rewardCode === vm.lastChecked) {\n return;\n }\n vm.rewardCardOwner = null;\n vm.lastChecked = vm.rewardCode;\n vm.rewardCode = vm.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.isCheckingCode = true;\n Restangular.one('RewardCodes').one('detail').get({rewardCode: vm.rewardCode})\n .then(function (result) {\n vm.rewardCardOwner = result.owner;\n vm.rewardCodeChecked = true;\n vm.isCheckingCode = false;\n vm.isRewardCodeValid = true;\n }, function () {\n vm.isRewardCodeValid = false;\n vm.isCheckingCode = false;\n vm.rewardCodeChecked = true;\n });\n };\n\n vm.onRewardCodeEnter = function ($event) {\n if ($event.key === 'Enter') {\n vm.lastChecked = null;\n vm.checkRewardCode();\n }\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:SignInCtrl\n *\n * @description\n *\n */\n angular\n .module('account')\n .controller('SignInCtrl', SignInCtrl);\n\n function SignInCtrl($state, $stateParams, FormAlerts, Auth, SocialAccount) {\n var vm = this,\n afterSignInCallback;\n vm.data = {};\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n\n afterSignInCallback = function () {\n if (angular.isDefined($stateParams.invitationToken) && angular.isString($stateParams.invitationToken)) {\n $state.go('userInvitation', {token: $stateParams.invitationToken});\n }\n else if (angular.isDefined($stateParams.rewardCode) && angular.isString($stateParams.rewardCode)) {\n $state.go('myMembershipsRewardProgramCode', {code: $stateParams.rewardCode});\n }\n else if (angular.isDefined($stateParams.nextState) && angular.isObject($stateParams.nextState) && angular.isDefined($stateParams.nextState.name)) {\n $state.go($stateParams.nextState.name, $stateParams.nextState.params || {});\n }\n else {\n $state.go('dashboard');\n }\n };\n\n vm.passwordSignIn = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Auth.passwordSignIn(vm.data.username, vm.data.password)\n .then(afterSignInCallback, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to login');\n });\n };\n\n vm.socialSignIn = function (provider) {\n vm.isLoading = true;\n vm.alerts.reset();\n SocialAccount.signIn(provider)\n .then(function (result) {\n if (angular.isDefined(result.activationToken)) {\n $state.go('accountActivate', {\n token: result.activationToken,\n nextState: $stateParams.nextState,\n invitationToken: $stateParams.invitationToken\n });\n }\n else {\n afterSignInCallback();\n }\n }, function () {\n vm.isLoading = false;\n vm.alerts.add('danger', 'Unable to login');\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name account.service:BusinessAccount\n *\n * @description\n *\n */\n angular\n .module('account')\n .service('BusinessAccount', BusinessAccount);\n\n function BusinessAccount($rootScope, $document, $q, $uibModal, Restangular, Auth, Session, Cache, authEvents) {\n var self = this,\n userProfile = Session.getUserProfile(),\n loginWatchHandle = null;\n\n // Get the cache that keeps the businessSuggestion records at the init of this service.\n self.suggestionCache = Cache.create('businessSuggestion');\n\n // Subscribe to the update of the user profile.\n loginWatchHandle = $rootScope.$on(authEvents.loginSuccess, function () {\n userProfile = Session.getUserProfile();\n });\n\n // Remove the handle once it's all destroyed\n $rootScope.$on('$destroy', loginWatchHandle);\n\n function openBusinessAccountPopup(domNode, isTrial) {\n var modalInstance = $uibModal.open({\n animation: false,\n appendTo: domNode,\n templateUrl: isTrial ? 'account/business-account-trial.tpl.html' : 'account/business-account.tpl.html',\n controller: 'BusinessAccountCtrl',\n controllerAs: 'businessAccount',\n size: 'md',\n windowClass: 'modal-business-account',\n backdrop: 'static',\n resolve: {\n userProfile: function () {\n return Session.getUserProfile();\n },\n pricingDetails: function () {\n return Restangular.one('BusinessAccount').one('pricingDetails').get();\n },\n isTrial: function () {\n return isTrial;\n }\n }\n });\n\n return modalInstance;\n }\n\n function getDomNode(n) {\n var dn = null;\n if (angular.isUndefined(n)) {\n console.error('The target domNode is not specified.');\n return null;\n }\n\n if (angular.isString(n)) {\n dn = angular.element($document[0].getElementById(n));\n }\n else if (n.nodeName) {\n dn = angular.element(n);\n }\n else {\n console.error('Unsupported type for the target domNode. Please provide the ID or the HTMLElement reference');\n return null;\n }\n return dn;\n }\n\n /**\n * Activates user's business account\n *\n * @param {Object} data New profile data\n * @param {Bool} skipPayment Flag indicating if payment can be skipped\n * @return {Deferred} Deferred promise\n */\n self.activate = function (data, skipPayment) {\n var deferred = $q.defer(),\n action = 'activate';\n\n if (!angular.isObject(data)) {\n data = {};\n }\n\n if (angular.isUndefined(skipPayment) && skipPayment !== true && skipPayment !== false) {\n skipPayment = false;\n }\n\n if (skipPayment === true) {\n action = 'activateWithoutPayment';\n }\n\n Restangular.one('BusinessAccount').customPUT(data, action)\n .then(function (result) {\n var profile = result.profile;\n profile.isBusinessAccountActive = result.isBusinessAccountActive;\n Session.create(profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n deferred.resolve(profile);\n }, function (responseData) {\n deferred.reject({\n errorCode: responseData.data.errorCode,\n errorMessage: responseData.data.errorMessage\n });\n });\n\n return deferred.promise;\n };\n\n self.activateTrial = function (data) {\n var deferred = $q.defer(),\n action = 'activateTrial';\n\n if (!angular.isObject(data)) {\n data = {};\n }\n\n Restangular.one('BusinessAccount').customPUT(data, action)\n .then(function (result) {\n var profile = result.profile;\n profile.isBusinessAccountActive = result.isBusinessAccountActive;\n Session.create(profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: profile});\n deferred.resolve(profile);\n }, function (responseData) {\n deferred.reject({\n errorCode: responseData.data.errorCode,\n errorMessage: responseData.data.errorMessage\n });\n });\n\n return deferred.promise;\n };\n\n /**\n * Initiate activation\n *\n * @param {string | HTMLElement} domNode Id of the dom node or the HTML Element directly into which the popup will be populated\n * @param {bool} isTrial If the template to be loaded should be the one for the TRIAL activation (evaluation subscription)\n * @return {IPromise} Deferred promise\n */\n self.initiateActivation = function (domNode, isTrial) {\n var deferred = $q.defer(),\n dn = getDomNode(domNode);\n\n if (!dn) {\n throw new Error('The target domNode for the popup is not specified or is unrecognized.');\n }\n\n userProfile.then(function (profile) {\n if (Auth.hasUserPermission(profile, 'activateBusinessAccountWithoutPayment')) {\n self.activate({}, true)\n .then(function (result) {\n deferred.resolve(result);\n }, function () {\n deferred.reject();\n });\n }\n else {\n openBusinessAccountPopup(dn, isTrial).result.then(function (result) {\n if (result) {\n deferred.resolve(result);\n }\n else {\n deferred.reject();\n }\n }, function () {\n deferred.reject();\n });\n }\n });\n\n return deferred.promise;\n };\n\n /**\n * Returns the suggestions count\n * @returns {number} Suggestions count\n */\n self.getSuggestionsCount = function () {\n var count = 0;\n if (angular.isDefined(self.suggestionCache) && self.suggestionCache.get('count')) {\n count = self.suggestionCache.get('count');\n }\n return count;\n };\n\n /**\n * Returns trial suggestions count\n * @returns {number} Trial suggestions count\n */\n self.getTrialSuggestionsCount = function () {\n var count = 0;\n if (angular.isDefined(self.suggestionCache) && self.suggestionCache.get('trialCount')) {\n count = self.suggestionCache.get('trialCount');\n }\n return count;\n };\n\n /**\n * Updates the suggestion count in the cache.\n * @param {number} count Initial count\n */\n self.updateSuggestionCount = function (count) {\n if (angular.isDefined(self.suggestionCache)) {\n self.suggestionCache.put('count', count + 1);\n self.suggestionCache.put('trialCount', count + 1);\n }\n };\n\n /**\n * Updates trial suggestions count\n * @param {number} count Initial count\n */\n self.updateTrialSuggestionCount = function (count) {\n if (angular.isDefined(self.suggestionCache)) {\n self.suggestionCache.put('trialCount', count + 1);\n }\n };\n\n /**\n * Returns the trial data\n * @param {Object} profile User's profile\n * @returns {Object} Trial data\n */\n self.getTrialData = function (profile) {\n var data;\n\n if (!profile) {\n return {};\n }\n\n data = {\n isEligibleForTrial: profile.businessAccount.isEligibleForTrial,\n isInTrial: profile.businessAccount.isInTrial,\n expiresIn: profile.businessAccount.trialExpiresInDays,\n trialWarning: profile.businessAccount.trialExpiresInDays <= 7,\n trialExpiresIn: null,\n trialExpiryDate: new Date(profile.businessAccount.trialExpiryDate)\n };\n\n if (data.isInTrial) {\n if (data.expiresIn === 0) {\n data.trialExpiresIn = ' expires today';\n }\n else if (data.expiresIn === 1) {\n data.trialExpiresIn = ' will expire in 1 day';\n }\n else {\n data.trialExpiresIn = ' will expire in ' + data.expiresIn + ' days';\n }\n }\n\n return data;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:BusinessAccountCtrl\n *\n * @description\n *\n */\n angular\n .module('account')\n .controller('BusinessAccountCtrl', BusinessAccountCtrl);\n\n function BusinessAccountCtrl($window, $scope, $timeout, $uibModalInstance, $state, PromptDialog, BusinessAccount, FormAlerts, userProfile,\n pricingDetails, Industries, RewardCodes, Location, GoogleMap, Restangular, addressFilter, isTrial) {\n var vm = this;\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.hasRewardCode = false;\n vm.rewardCodeChecked = false;\n vm.rewardCodeValid = false;\n vm.rewardCodeValidating = false;\n vm.rewardCodeHelp1 = 'Create your first Reward Code to offer to your referral network (one word, alpha numeric). With this step your default Reward Program will be created and used for this Reward Code';\n vm.rewardCodeHelp2 = 'Examples: MYCOMPANYNAME123, CODE123, SUMMERPROMOTION, ...\\n\\nPlease choose between 5 to 20 characters.';\n vm.getCountries = Location.getCountries;\n vm.pricingDetails = pricingDetails.pricingOptions;\n vm.getStates = function () {\n return Location.getStates(vm.data.addressPostal.idCountryPostal);\n };\n vm.showRewardCard = true;\n vm.data = {\n businessName: userProfile.businessName,\n idClassification: null,\n businessMarketingPayment: vm.pricingDetails && vm.pricingDetails[0] ? vm.pricingDetails[0].id : -1,\n creditCard: {\n method: null\n },\n address: null,\n addressPostal: {\n address: null,\n numberPostal: null,\n addressPostal: userProfile.addressPostal.addressPostal,\n suburbPostal: userProfile.addressPostal.suburbPostal,\n postCodePostal: userProfile.addressPostal.postCodePostal,\n idStatePostal: angular.isDefined(userProfile.addressPostal.idStatePostal) && userProfile.addressPostal.idStatePostal !== null ? userProfile.addressPostal.idStatePostal.toString() : '',\n idCountryPostal: angular.isDefined(userProfile.addressPostal.idCountryPostal) && userProfile.addressPostal.idCountryPostal !== null ? userProfile.addressPostal.idCountryPostal.toString() : '',\n statePostal: userProfile.addressPostal.idCountryPostal && userProfile.addressPostal.idStatePostal ? Location.getStateNameById(userProfile.addressPostal.idCountryPostal, userProfile.addressPostal.idStatePostal) : '',\n statePostalShort: userProfile.addressPostal.idCountryPostal && userProfile.addressPostal.idStatePostal ? Location.getStateNameById(userProfile.addressPostal.idCountryPostal, userProfile.addressPostal.idStatePostal, true) : '',\n countryPostal: userProfile.addressPostal.idCountryPostal ? Location.getCountryNameById(userProfile.addressPostal.idCountryPostal) : ''\n }\n };\n\n vm.paymentSummary = {\n price: null,\n tax: null,\n total: null\n };\n\n Restangular.one('Billing').one('creditCard').get()\n .then(function (cc) {\n cc = cc.plain();\n vm.data.creditCard.method = angular.isObject(cc) && angular.isDefined(cc.number) ? 'old' : 'new';\n vm.creditCard = cc;\n return cc;\n }, function () {\n return null;\n });\n\n vm.formatAddress = function () {\n vm.data.addressPostal.address = addressFilter(vm.data.addressPostal);\n };\n\n // Get the industry\n if (angular.isObject(userProfile.subIndustry)) {\n vm.data.idClassification = userProfile.subIndustry.id.toString();\n vm.selectedClassification = {id: userProfile.subIndustry.id, name: userProfile.industry.name + ' - ' + userProfile.subIndustry.name};\n }\n else if (angular.isObject(userProfile.industry)) {\n vm.data.idClassification = userProfile.industry.id.toString();\n vm.selectedClassification = {id: userProfile.industry.id, name: userProfile.industry.name};\n }\n\n // Check if the user already has a reward code so we can skip the reward code step\n if (userProfile && userProfile.rewardCodes && _.where(userProfile.rewardCodes, {isArchived: false}).length > 0) {\n vm.hasRewardCode = true;\n }\n\n // Get the trial data for the user. We only need the expiry date\n if (userProfile) {\n vm.trialData = BusinessAccount.getTrialData(userProfile);\n }\n\n Industries.isReady.then(function () {\n vm.industries = Industries.getConsolidatedList();\n });\n\n vm.onClassificationSelect = function (classification) {\n if (angular.isObject(classification) && angular.isObject(classification.originalObject)) {\n vm.data.idClassification = classification.originalObject.id;\n }\n };\n\n vm.onRewardCodeChange = function () {\n vm.rewardCodeChecked = false;\n };\n\n vm.onCountryChange = function (form) {\n vm.data.addressPostal.idStatePostal = '';\n if (form && form.idStatePostal) {\n delete form.idStatePostal.$touched;\n delete form.idStatePostal.$error.required;\n }\n };\n\n vm.validateRewardCode = function () {\n var code;\n if (vm.data.rewardCode && vm.data.rewardCode.length >= 5 && vm.data.rewardCode.length <= 20) {\n code = vm.data.rewardCode.toUpperCase().replace(/\\s+/g, '-');\n vm.data.rewardCode = code.replace(/[-]+/g, '-');\n vm.onDataChange('code');\n vm.rewardCodeValidating = true;\n RewardCodes.isRewardCodeUnique(vm.data.rewardCode)\n .then(function (isUnique) {\n vm.rewardCodeValid = isUnique;\n vm.rewardCodeValidating = false;\n vm.rewardCodeChecked = true;\n });\n }\n };\n\n vm.isLeadPriceValid = function () {\n return !isNaN(vm.data.successfulLeadPrice) && vm.data.successfulLeadPrice >= 0;\n };\n\n vm.cancel = function () {\n PromptDialog.open('Are you sure you\\'d like to cancel the activation?
    You can access this activation window again from Profile Menu -> Business Account', null, 'Cancel Activation', 'Go Back')\n .then(function () {\n $uibModalInstance.dismiss();\n });\n };\n\n vm.onDataChange = function (type) {\n var el,\n value;\n try {\n if (type === 'name') {\n el = angular.element('#RewardCard-front')[0].contentDocument.getElementById('RewardCard-CompanyName');\n value = vm.data.businessName;\n if (value.length > 20) {\n value = value.substr(0, 20) + '..';\n }\n }\n if (type === 'code') {\n el = angular.element('#RewardCard-back')[0].contentDocument.getElementById('RewardCard-Code');\n value = vm.data.rewardCode || '';\n if (value.length > 15) {\n el.style.fontSize = '18px';\n }\n else {\n el.style.fontSize = '20px';\n }\n }\n if (type === 'value') {\n el = angular.element('#RewardCard-front')[0].contentDocument.getElementById('RewardCard-RewardValue').firstElementChild;\n value = vm.data.successfulLeadPrice || 0;\n if (Number(value) > 999) {\n el.style.fontSize = '24px';\n }\n else {\n el.style.fontSize = '36px';\n }\n }\n\n if (el) {\n el.innerHTML = value;\n }\n vm.showRewardCard = true;\n }\n catch (ex) {\n console.log(ex);\n vm.showRewardCard = false;\n }\n };\n\n vm.isAddressIncomplete = function () {\n return !vm.data.addressPostal.addressPostal ||\n !vm.data.addressPostal.suburbPostal ||\n !vm.data.addressPostal.postCodePostal ||\n !vm.data.addressPostal.idStatePostal ||\n !vm.data.addressPostal.idCountryPostal;\n };\n\n vm.getUserLocationAddress = function () {\n // From geolocation\n vm.isGeolocating = true;\n GoogleMap.promise.then(function () {\n GoogleMap.getCurrentLocation(true).then(function (result) {\n // result.location\n vm.data.addressPostal.address = result.location;\n vm.data.addressPostal.numberPostal = result.streetNumber;\n vm.data.addressPostal.addressPostal = result.streetAddress;\n vm.data.addressPostal.suburbPostal = result.suburb;\n vm.data.addressPostal.postCodePostal = result.postCode;\n vm.data.addressPostal.statePostalShort = result.state;\n vm.data.addressPostal.countryPostal = result.country;\n vm.updateStateCountryIds(result);\n vm.formatAddress();\n vm.isGeolocating = false;\n // vm.getLocationScreenshot();\n }, vm.geolocationFailCallback);\n }, vm.geolocationFailCallback);\n };\n\n vm.geolocationFailCallback = function () {\n // There is some issue with the geolocation. disable the button.\n vm.isGeolocationDisabled = true;\n vm.isGeolocating = false;\n $timeout(function () {\n $scope.$apply();\n }, 0);\n };\n\n vm.placeChangedCallback = function (data) {\n // From google maps geocoding (autocomplete)\n vm.data.addressPostal.address = data.location;\n vm.data.addressPostal.numberPostal = data.streetNumber;\n vm.data.addressPostal.addressPostal = data.streetAddress;\n vm.data.addressPostal.suburbPostal = data.suburb;\n vm.data.addressPostal.postCodePostal = data.postCode;\n vm.data.addressPostal.statePostalShort = data.state;\n vm.data.addressPostal.countryPostal = data.country;\n vm.updateStateCountryIds(data);\n vm.formatAddress();\n $scope.$apply();\n // vm.getLocationScreenshot();\n };\n\n vm.updateStateCountryIds = function (result) {\n vm.data.addressPostal.idCountryPostal = Location.getCountryId(result.country_id);\n vm.data.addressPostal.idStatePostal = Location.getStateId(vm.data.addressPostal.idCountryPostal, result.state);\n vm.data.addressPostal.idCountryPostal = vm.data.addressPostal.idCountryPostal ? vm.data.addressPostal.idCountryPostal.toString() : null;\n vm.data.addressPostal.idStatePostal = vm.data.addressPostal.idStatePostal ? vm.data.addressPostal.idStatePostal.toString() : null;\n };\n\n vm.getLocationScreenshot = function () {\n var el;\n vm.isRenderingLocation = true;\n try {\n el = angular.element('.location-screenshot');\n console.log(el.height(), el.width());\n GoogleMap.getStaticMapAsBase64(vm.data.addressPostal.address, {\n w: el.width(),\n h: el.height()\n }).then(function (base64) {\n angular.element('img', el)[0].src = base64;\n vm.isRenderingLocation = false;\n });\n }\n catch (ex) {\n vm.isRenderingLocation = false;\n }\n };\n\n vm.updateSummary = function () {\n // Get the active pricing option\n var p = _.find(vm.pricingDetails, {id: vm.data.businessMarketingPayment});\n if (p) {\n vm.paymentSummary.price = p.price;\n vm.paymentSummary.total = p.priceInclGst;\n vm.paymentSummary.tax = vm.paymentSummary.total - vm.paymentSummary.price;\n }\n };\n\n vm.save = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n\n if (isTrial) {\n BusinessAccount.activateTrial(vm.data).then(function (profile) {\n $uibModalInstance.close(profile);\n $state.go('myMembershipsRewardProgramsSetup', {openInvite: true});\n }, function (error) {\n vm.isLoading = false;\n if (error.errorCode === 701 || error.errorCode === 702 || error.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to activate the trial: ' + error.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to activate the trial, try again later please');\n }\n });\n }\n else {\n BusinessAccount.activate(vm.data).then(function (profile) {\n $uibModalInstance.close(profile);\n // Navigate to Rewards Program Page\n $state.go('myMembershipsRewardProgramsSetup', {openInvite: true});\n }, function (error) {\n vm.isLoading = false;\n if (error.errorCode === 701 || error.errorCode === 702 || error.errorCode === 703) {\n vm.alerts.add('danger', 'Unable to activate: ' + error.errorMessage);\n }\n else {\n vm.alerts.add('danger', 'Unable to activate, try again later please');\n }\n });\n }\n };\n\n vm.formatAddress();\n vm.isMobile = $window.innerWidth < 768;\n angular.element($window).on('resize', function () {\n vm.isMobile = $window.innerWidth < 768;\n $scope.$apply();\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:ActivateUpdatePasswordCtrl\n *\n * @description\n *\n */\n angular\n .module('account')\n .controller('ActivateUpdatePasswordCtrl', ActivateUpdatePasswordCtrl);\n\n function ActivateUpdatePasswordCtrl($rootScope, $state, Restangular, Auth, Session, FormAlerts, userProfile, OneSignal, configOptions) {\n var vm = this,\n oneSignalPlayerId;\n\n OneSignal.getUserId().then(function (playerId) {\n oneSignalPlayerId = playerId;\n });\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.userProfile = userProfile;\n vm.data = {\n password: null,\n confirmPassword: null\n };\n\n vm.activate = function () {\n vm.alerts.reset();\n vm.isLoading = true;\n Restangular.one('Users').customPUT({\n newPassword: vm.data.password,\n oneSignalPlayerId: oneSignalPlayerId\n }, 'password')\n .then(function (result) {\n configOptions.reportRegistration();\n result = result.plain();\n vm.isLoading = false;\n Auth.saveLoginToken(result.authToken);\n Session.create(result.profile);\n $rootScope.$broadcast('event:user-updateProfile', {profile: result.profile});\n $rootScope.$broadcast('event:auth-loginConfirmed');\n $state.go('dashboard');\n }, function () {\n vm.alerts.add('danger', 'Unable to save');\n vm.isLoading = false;\n });\n };\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:ActivateCtrl\n *\n * @description\n *\n */\n angular\n .module('account')\n .controller('ActivateCtrl', ActivateCtrl);\n\n function ActivateCtrl($document, $state, $stateParams, FormAlerts, Auth, BusinessAccount, userRegistration, GoogleMap, configOptions) {\n var vm = this;\n\n vm.data = userRegistration;\n vm.alerts = new FormAlerts();\n vm.isLoading = false;\n vm.data.newsletter = true;\n vm.data.rewardCode = userRegistration.rewardCode;\n vm.rewardCodeReadOnly = !!userRegistration.rewardCode;\n vm.rewardCodeLabel = userRegistration.rewardCode;\n vm.emailVisible = !userRegistration.email;\n vm.passwordVisible = !userRegistration.isPasswordSet;\n\n // Help texts\n vm.rewardCodeHelp = 'If you have a Reward Code from an existing MyLeadPod business, enter it below to directly connect with this business after activation. (Optional)';\n\n vm.data.address = {\n streetAddress: userRegistration.streetAddress,\n suburb: userRegistration.suburb,\n state: userRegistration.state,\n postCode: userRegistration.postCode,\n country: userRegistration.country\n };\n\n vm.activate = function () {\n vm.isLoading = true;\n vm.alerts.reset();\n Auth.activateAccount($stateParams.token, {\n firstName: vm.data.firstName,\n lastName: vm.data.lastName,\n businessName: vm.data.businessName,\n address: vm.data.address,\n phoneMobile: vm.data.phoneMobile,\n newsletter: vm.data.newsletter,\n rewardCode: vm.data.rewardCode,\n email: vm.data.email,\n password: vm.data.password\n })\n .then(function (newSession) {\n var userProfile = newSession.data.profile;\n\n configOptions.reportRegistration();\n\n if (angular.isDefined($stateParams.invitationToken) && angular.isString($stateParams.invitationToken)) {\n $state.go('userInvitation', {\n token: $stateParams.invitationToken\n });\n }\n else if (angular.isDefined(userRegistration.idUserRewardCodeOwner) && userRegistration.idUserRewardCodeOwner !== null && angular.isDefined(userRegistration.redirectToUserProfile) && userRegistration.redirectToUserProfile === true) {\n $state.go('user', {id: userRegistration.idUserRewardCodeOwner, isInvite: true});\n }\n else {\n $state.go('dashboard');\n\n if (angular.isObject(userProfile.businessAccount) && userProfile.businessAccount.isEligibleForTrial === true) {\n BusinessAccount.initiateActivation(angular.element($document[0].body)[0], true);\n }\n }\n }, function (error) {\n vm.isLoading = false;\n if (angular.isObject(error) && error.errorCode === 602) {\n vm.alerts.add('danger', 'Invalid Reward Code');\n }\n else {\n vm.alerts.add('danger', 'Unable to activate');\n }\n });\n };\n\n vm.placeChangedCallback = function (address) {\n vm.data.address = address;\n };\n\n if (!vm.data.address.streetAddress) {\n GoogleMap.promise.then(function () {\n GoogleMap.getCurrentLocation().then(function (result) {\n vm.data.location = result.location;\n vm.data.address = result;\n });\n });\n }\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc service\n * @name account.service:AccountService\n *\n * @description\n *\n */\n angular\n .module('account')\n .service('AccountService', AccountService);\n\n function AccountService($uibModal, $document, Session) {\n var scope = this;\n\n /**\n * Opens the modal dialog for the preferences settings\n *\n * @param {object} userProfile object User profile for which the preferences will be loaded\n * @returns {object} UibModalInstance result\n */\n scope.openPreferences = function (userProfile) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'account/preferences/preferences-modal.tpl.html',\n controller: 'PreferencesCtrl',\n controllerAs: 'preferences',\n size: 'lg',\n resolve: {\n userProfile: function () {\n return userProfile;\n }\n },\n appendTo: angular.element($document[0].body)\n };\n\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n\n scope.openFeedback = function (userProfile, helpRequired) {\n var modalInstance,\n params = {\n animation: false,\n templateUrl: 'account/feedback/feedback-modal.tpl.html',\n controller: 'FeedbackCtrl',\n controllerAs: 'feedback',\n size: 'lg',\n resolve: {\n userProfile: function () {\n if (userProfile) {\n return userProfile;\n }\n return Session.getUserProfile();\n },\n helpRequired: function () {\n return helpRequired;\n }\n },\n appendTo: angular.element($document[0].body)\n };\n\n modalInstance = $uibModal.open(params);\n return modalInstance.result;\n };\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('account')\n .config(config);\n\n function config($stateProvider) {\n $stateProvider\n .state('account', {\n url: '/account',\n templateUrl: 'account/account.tpl.html',\n controller: 'AccountCtrl',\n controllerAs: 'account'\n })\n .state('accountSignInUp', {\n abstract: true,\n template: '',\n params: {\n invitationToken: null,\n rewardCode: null\n },\n resolve: {\n rewardCode: ['Restangular', '$stateParams', function (Restangular, $stateParams) {\n if ($stateParams.rewardCode && angular.isString($stateParams.rewardCode) && $stateParams.rewardCode.length > 0) {\n return Restangular.one('RewardCodes').one('detail').get({rewardCode: $stateParams.rewardCode})\n .then(function (rewardCode) {\n return rewardCode.plain();\n }, function () {\n return false;\n });\n }\n return null;\n }]\n },\n data: {\n classNames: 'no-help'\n }\n })\n .state('accountSignInUp.accountSignIn', {\n url: '/account/signin',\n templateUrl: 'account/sign-in.tpl.html',\n controller: 'SignInCtrl',\n controllerAs: 'signIn',\n params: {\n nextState: {}\n },\n data: {\n classNames: 'no-help requires-login'\n }\n })\n .state('accountSignInUp.accountSignUp', {\n url: '/account/signup',\n templateUrl: 'account/sign-up.tpl.html',\n controller: 'SignUpCtrl',\n controllerAs: 'signUp',\n resolve: {\n invitation: ['Restangular', '$stateParams', function (Restangular, $stateParams) {\n if ($stateParams.invitationToken) {\n return Restangular.one('Invitations').one('detail').get({token: $stateParams.invitationToken})\n .then(function (invitation) {\n return invitation.plain();\n }, function () {\n return null;\n });\n }\n\n return null;\n }]\n },\n data: {\n classNames: 'no-help requires-signup'\n }\n })\n .state('accountActivate', {\n url: '/account/activate/{token}',\n templateUrl: 'account/activate.tpl.html',\n controller: 'ActivateCtrl',\n controllerAs: 'activate',\n params: {\n invitationToken: null\n },\n resolve: {\n userRegistration: ['$stateParams', '$state', 'Restangular', function ($stateParams, $state, Restangular) {\n return Restangular.one('Users').one('activate').get({token: $stateParams.token})\n .then(function (result) {\n return result.plain();\n }, function () {\n $state.go('accountSignInUp.accountSignIn');\n });\n }]\n }\n })\n .state('accountVerifyRegistration', {\n url: '/account/verify/{token}',\n templateUrl: 'account/activate-update-password.tpl.html',\n controller: 'ActivateUpdatePasswordCtrl',\n controllerAs: 'activate',\n params: {\n invitationToken: null\n },\n resolve: {\n userProfile: ['$stateParams', '$state', '$q', 'Auth', 'Session', 'Restangular', function ($stateParams, $state, $q, Auth, Session, Restangular) {\n var userProfileDeferred = $q.defer();\n Auth.signOut(false);\n Restangular.one('Users').one('verify').get({token: $stateParams.token})\n .then(function (result) {\n var userProfile = result.profile,\n token = result.authToken;\n\n // If this is not a valid token, then just go to sign in.\n if (!token || !userProfile) {\n $state.go('accountSignInUp.accountSignIn');\n return;\n }\n\n // Save it into the cache\n Auth.saveLoginToken(result.authToken);\n\n // Create the session\n Session.create(userProfile);\n\n // If this is the first time and user needs to provide the password, go ahead\n if (!userProfile.isPasswordSet) {\n userProfileDeferred.resolve(userProfile);\n }\n else {\n // Forward him to sign in. That should in turn go to dashboard?\n $state.go('accountSignInUp.accountSignIn');\n }\n }, function () {\n $state.params = angular.extend($state.params, {logout: true});\n $state.go('accountSignInUp.accountSignIn');\n });\n\n return userProfileDeferred.promise;\n }]\n }\n })\n .state('accountUnsubscribe', {\n url: '/account/mailing-list/unsubscribe/{userId}/{subscriptionId}',\n templateUrl: 'account/preferences/mailing-list-unsubscribe.tpl.html',\n controller: 'MailingListUnsubscribeCtrl',\n controllerAs: 'preferences',\n data: {\n classNames: 'mailing-list-unsubscribe'\n }\n });\n }\n}());\n","(function () {\n 'use strict';\n\n /**\n * @ngdoc object\n * @name account.controller:AccountCtrl\n *\n * @description\n *\n */\n angular\n .module('account')\n .controller('AccountCtrl', AccountCtrl);\n\n function AccountCtrl(Session) {\n var vm = this;\n\n Session.getUserProfile()\n .then(function (profile) {\n if (profile) {\n vm.userProfile = profile;\n }\n });\n\n vm.tabManager = null;\n vm.tabsConfig = [\n {\n label: 'Profile',\n value: 'profile',\n url: 'account.profile'\n },\n {\n label: 'Billing',\n value: 'billing',\n url: 'account.billing',\n condition: function () {\n return vm.userProfile.isBusinessAccountActive;\n }\n },\n {\n label: 'Earnings',\n value: 'earnings',\n url: 'account.earnings'\n }\n ];\n }\n}());\n","(function () {\n 'use strict';\n\n angular\n .module('mlp-animations', ['ngAnimate'])\n .animation('.slide', slide)\n .animation('.slide-fast', slideFast)\n .animation('.slide-if', slideIf)\n .animation('.slide-if-reversed', slideIfReversed)\n .animation('.slide-if-flex', slideIfFlex)\n .animation('.slide-left', slideLeft)\n .animation('.slide-right', slideRight)\n .animation('.opacity-if', opacityIf)\n .animation('.opacity-slow-if', opacitySlowIf);\n\n function slide() {\n return {\n addClass: function (element, className, done) {\n element.css('display', 'none');\n angular.element(element).slideDown('fast', done);\n },\n removeClass: function (element, className, done) {\n angular.element(element).slideUp('fast', done);\n }\n };\n }\n\n function slideFast() {\n return {\n addClass: function (element, className, done) {\n element.css('display', 'none');\n angular.element(element).slideDown(100, done);\n },\n removeClass: function (element, className, done) {\n angular.element(element).slideUp(100, done);\n }\n };\n }\n\n function slideIf() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n angular.element(element).slideDown('fast', done);\n },\n move: function (element, done) {\n angular.element(element).slideDown('fast', done);\n },\n leave: function (element, done) {\n angular.element(element).slideUp('fast', done);\n }\n };\n }\n\n function slideIfReversed() {\n return {\n enter: function (element, done) {\n angular.element(element).slideUp('fast', done);\n },\n move: function (element, done) {\n angular.element(element).slideUp('fast', done);\n },\n leave: function (element, done) {\n angular.element(element).slideDown('fast', done);\n }\n };\n }\n\n function slideIfFlex() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n angular.element(element).css('display', 'flex');\n angular.element(element).slideDown('fast', done);\n },\n move: function (element, done) {\n angular.element(element).slideDown('fast', done);\n },\n leave: function (element, done) {\n angular.element(element).slideUp('fast', done);\n }\n };\n }\n\n function slideLeft() {\n return {\n addClass: function (element, className, done) {\n var el = angular.element(element);\n el.css({\n display: 'block',\n transform: 'translate(-' + (el.offset().left + el.outerWidth()) + 'px, 0px)'\n });\n done();\n }\n };\n }\n\n function slideRight() {\n return {\n addClass: function (element, className, done) {\n angular.element(element).css({\n display: 'block',\n transform: 'translate(0px, 0px)'\n });\n done();\n }\n };\n }\n\n function opacityIf() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n angular.element(element).fadeIn(100, function (args) {\n element.css('opacity', 1);\n done(args);\n });\n },\n leave: function (element, done) {\n angular.element(element).fadeOut(100, function (args) {\n element.css('opacity', 0);\n done(args);\n });\n }\n };\n }\n\n function opacitySlowIf() {\n // Remember to include the slide-if class in the app.scss with the \"display: none\" otherwise the slideDown won't be smooth\n // slideUp would not be affected as the element would be already visible.\n\n return {\n enter: function (element, done) {\n element.css('display', 'none');\n angular.element(element).fadeIn(500, done);\n },\n leave: function (element, done) {\n angular.element(element).fadeOut(500, done);\n }\n };\n }\n}());\n","var $windowInstance = angular.injector(['ng']).get('$window');\n\nRaven.addPlugin(Raven.Plugins.Angular);\n\n$windowInstance.deferredBootstrapper.bootstrap({\n element: $windowInstance.document,\n module: 'myLeadPod',\n bootstrapConfig: {\n strictDi: !'%IS_DEVELOPMENT%'\n },\n injectorModules: ['restangular', 'api', 'configuration'],\n resolve: {\n PreloadedUserProfile: ['$q', 'Restangular', 'configOptions', 'Session', 'Auth',\n function ($q, Restangular, configOptions, Session, Auth) {\n 'use strict';\n var deferred;\n Restangular.setBaseUrl(configOptions.baseUrl);\n Restangular.addResponseInterceptor(function (data, operation) {\n var extractedData;\n if (operation === 'getList') {\n extractedData = data.content.records;\n extractedData.meta = data.content.recordsInfo;\n }\n else {\n extractedData = angular.extend({}, data.content);\n }\n extractedData.contentEtag = data.contentEtag;\n extractedData.responseStatus = {\n code: data.content.statusCode,\n text: data.content.statusText\n };\n\n return extractedData;\n });\n Restangular.setDefaultHeaders({Accept: 'application/json'});\n deferred = $q.defer();\n Session.getUserProfile().then(function (userProfile) {\n if (angular.isObject(userProfile) && !!userProfile.idUser) {\n deferred.resolve(userProfile);\n }\n else {\n Auth.signOut(false);\n deferred.resolve(null);\n }\n }, function () {\n Auth.signOut(false);\n deferred.resolve(null);\n });\n\n return deferred.promise;\n }]\n }\n});\n","(function () {\n 'use strict';\n\n angular\n .module('myLeadPod')\n .config(config);\n\n function config() {\n\n }\n}());\n"]}