{"version":3,"file":"render.mjs","sources":["src/common.mjs","src/render.mjs"],"sourcesContent":["// Common Utilities Class\r\nexport default class {\r\n\tconstructor(config) {\r\n\t\tthis.Mustache = config.Mustache;\r\n\t\tthis.componentLayout = config.componentLayout || 'default';\r\n\t\tthis.customSettingsData = config.customSettingsData || {};\r\n\t\tthis.template = config.template;\r\n\t\tthis.contentClient = config.contentClient;\r\n\t\tthis.model = {};\r\n\t\tthis.pageLocale = config.pageLocale;\r\n\t\tthis.mode = config.mode || 'render';\r\n\t}\r\n\r\n\tsetModel(model) {\r\n\t\tthis.model = model;\r\n\t}\r\n\r\n\tformatPhoneNumber(strPhoneNumber) {\r\n\t\t//sanitize phone numbers for consistency.\r\n\r\n\t\tlet intCleanedNumber = ('' + strPhoneNumber).replace(/\\D/g, '');\r\n\t\tlet arSplitNumber = intCleanedNumber.match(/^(\\d{3})(\\d{3})(\\d{4})$/);\r\n\t\tif (arSplitNumber) {\r\n\t\t\treturn `${arSplitNumber[1]}.${arSplitNumber[2]}.${arSplitNumber[3]}`;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tasync fetchLenderData(isCompile) {\r\n\t\t//Call server to get the needed assets and format the data to run the template\r\n\r\n\t\tconst strQuery = '(type eq \"MNH_Lender\")';\r\n\t\tconst strFields =\r\n\t\t\t'fields.headshot,fields.nmls_number,fields.first_name,fields.last_name,fields.lender_name,fields.logo,fields.phone_number,fields.extension,fields.email,fields.website,fields.address,fields.city,fields.state,fields.zip,fields.latitude,fields.longitude,fields.languages,fields.service_area,fields.service_type,taxonomies';\r\n\t\tconst arLenderData = await this.contentClient.queryItems({\r\n\t\t\tq: strQuery,\r\n\t\t\tfields: strFields,\r\n\t\t\tlimit: 10000,\r\n\t\t});\r\n\t\treturn this.compileLenderData(arLenderData, isCompile);\r\n\t}\r\n\r\n\tbuildBadgeMap() {\r\n\t\t//take in the badges from the custom settings data and format them for lookup in a map\r\n\t\t//using a map for lookup for efficiency, otherwise we'd be looping loops for all the records\r\n\t\tconst arBadgeList = this.customSettingsData.arBadges;\r\n\t\tconst mapBadgeData = new Map();\r\n\r\n\t\tif (arBadgeList) {\r\n\t\t\tfor (const arBadge of arBadgeList) {\r\n\t\t\t\tconst arBadgeData = arBadge.split(',');\r\n\t\t\t\tconst lastWord = arBadgeData[2].split(' ').pop();\r\n\t\t\t\tconst badgeYear = isNaN(lastWord) ? null : lastWord;\r\n\t\t\t\tconst badgeText = badgeYear\r\n\t\t\t\t\t? arBadgeData[2].substring(0, arBadgeData[2].lastIndexOf(' '))\r\n\t\t\t\t\t: arBadgeData[2];\r\n\r\n\t\t\t\tlet objBadge = {\r\n\t\t\t\t\tid: arBadgeData[0],\r\n\t\t\t\t\tparentId: arBadgeData[1],\r\n\t\t\t\t\tyear: badgeYear,\r\n\t\t\t\t\tname: badgeText,\r\n\t\t\t\t};\r\n\t\t\t\tmapBadgeData.set(objBadge.id, objBadge);\r\n\t\t\t}\r\n\r\n\t\t\treturn mapBadgeData;\r\n\t\t}\r\n\t}\r\n\r\n\tcustomExpand(text) {\r\n\t\ttry {\r\n\t\t\t// replace \"[[page-221]]\" with \"[!--$SCS_PAGE--]221[/!--$SCS_PAGE--]\"\r\n\t\t\tlet strOutput = text.replace(\r\n\t\t\t\t/\\[\\[page-(\\d+)\\]\\]/g,\r\n\t\t\t\t'[!--$SCS_PAGE--]$1[/!--$SCS_PAGE--]'\r\n\t\t\t);\r\n\r\n\t\t\t// replace \"[[asset-221]]\" with \"[!--$CEC_DIGITAL_ASSET--]221[/--$CEC_DIGITAL_ASSET--]\"\r\n\t\t\tstrOutput = strOutput.replace(\r\n\t\t\t\t/\\[\\[asset-(\\d+)\\]\\]/g,\r\n\t\t\t\t'[!--$CEC_DIGITAL_ASSET--]$1[/!--$CEC_DIGITAL_ASSET--]'\r\n\t\t\t);\r\n\r\n\t\t\tstrOutput = this.contentClient.expandMacros(strOutput);\r\n\t\t\treturn strOutput;\r\n\t\t} catch (e) {\r\n\t\t\tconsole.log(\r\n\t\t\t\t'Error: Failed to expand custom tags in: ' + import.meta.url,\r\n\t\t\t\t' using default text.'\r\n\t\t\t);\r\n\t\t\tconsole.log(e);\r\n\t\t\treturn text;\r\n\t\t}\r\n\t}\r\n\r\n\tcompileLenderData(arLenderData, isCompile) {\r\n\t\tconst {\r\n\t\t\tclearBtn,\r\n\t\t\tcolumnHeaders,\r\n\t\t\tlanguages,\r\n\t\t\tresultsHeader,\r\n\t\t\tsearch,\r\n\t\t\tsearchBtn,\r\n\t\t\tservices,\r\n\t\t\tdistanceText,\r\n\t\t\tmisc,\r\n\t\t\trehabHomeTooltip,\r\n\t\t\tfixUpHomeTooltip,\r\n\t\t} = this.customSettingsData.nls;\r\n\t\tconst mapBadgeData = this.buildBadgeMap();\r\n\r\n\t\t//the services text of the result is different than the services text in the filters\r\n\t\tconst servicesText = {\r\n\t\t\tbuy_first_home: services.buy_first_home.value,\r\n\t\t\tbuy_new_home: services.buy_new_home.value,\r\n\t\t\thome_improvement_loans: services.home_improvement_loans.value,\r\n\t\t\trefinance: services.refinance.value,\r\n\t\t\trehabilitation_emergency: services.rehabilitation_emergency.value,\r\n\t\t};\r\n\r\n\t\t//Clean up the data to work with page\r\n\t\tfor (const objResult of arLenderData.items) {\r\n\t\t\tobjResult.fields.pageNumber =\r\n\t\t\t\tMath.floor(arLenderData.items.indexOf(objResult) / 10) + 1;\r\n\r\n\t\t\tconst fields = objResult.fields;\r\n\t\t\tif (fields.phone_number) {\r\n\t\t\t\tfields.phone_number = this.formatPhoneNumber(fields.phone_number);\r\n\t\t\t}\r\n\r\n\t\t\tif (fields.headshot) {\r\n\t\t\t\tfields.headshot.url = this.contentClient.getRenditionURL({\r\n\t\t\t\t\tid: fields.headshot.id,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (fields.logo) {\r\n\t\t\t\tfields.logo.url = this.contentClient.getRenditionURL({\r\n\t\t\t\t\tid: fields.logo.id,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (fields.service_type) {\r\n\t\t\t\tlet servicesOffered = fields.service_type.map((service) => {\r\n\t\t\t\t\treturn servicesText[service];\r\n\t\t\t\t});\r\n\t\t\t\tfields.service_type = servicesOffered;\r\n\t\t\t}\r\n\r\n\t\t\tfields.badges = [];\r\n\r\n\t\t\tfields.languages = fields.languages || [];\r\n\t\t\t//When we get to the point of adding additional languages this will flag so the code only toggles on english version\r\n\t\t\tlet isEnglish = true;\r\n\t\t\tif (isEnglish) {\r\n\t\t\t\tconst numLangIndex = fields.languages.indexOf('English');\r\n\t\t\t\tif (numLangIndex > -1) {\r\n\t\t\t\t\tfields.languages.splice(numLangIndex, 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfields.languages.sort();\r\n\r\n\t\t\tconst taxonomyData = objResult.taxonomies.data || objResult.taxonomies.items || [];\r\n\t\t\tif (taxonomyData && mapBadgeData) {\r\n\t\t\t\tif (taxonomyData.length > 0) {\r\n\t\t\t\t\tlet arCategories = taxonomyData[0].categories;\r\n\t\t\t\t\tif (arCategories.items) {\r\n\t\t\t\t\t\tarCategories = arCategories.items;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (const category of arCategories) {\r\n\t\t\t\t\t\tif (mapBadgeData.has(category.id)) {\r\n\t\t\t\t\t\t\tfields.badges.push(mapBadgeData.get(category.id));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Extract fields from the results\r\n\t\tconst arLenderResults = this.shuffleArray(arLenderData.items.map((item) => ({id: item.id, ...item.fields})));\r\n\t\tconst arLanguageFilters = this.buildLanguageFilters(arLenderResults);\r\n\t\tconst rehabTooltip = rehabHomeTooltip && this.customExpand(rehabHomeTooltip);\r\n\t\tconst fixUpTooltip = fixUpHomeTooltip && this.customExpand(fixUpHomeTooltip);\r\n\t\tconst tooltips = {\r\n\t\t\trehab: rehabTooltip,\r\n\t\t\tfixUp: fixUpTooltip,\r\n\t\t};\r\n\t\t//build the result model\r\n\t\tlet model = {};\r\n\t\tmodel.lenderData = arLenderResults;\r\n\t\tmodel.languageFilters = arLanguageFilters;\r\n\t\tmodel.languageFilterClass = arLanguageFilters.length < 6 ? 'single' : '';\r\n\t\tmodel.iWantFilters = this.buildWantFilters(services, tooltips);\r\n\t\tmodel.clearBtn = clearBtn;\r\n\t\tmodel.columnHeaders = columnHeaders;\r\n\t\tmodel.languages = languages;\r\n\t\tmodel.resultsHeader = resultsHeader;\r\n\t\tmodel.search = search;\r\n\t\tmodel.searchBtn = searchBtn;\r\n\t\tmodel.services = services;\r\n\t\tmodel.distanceText = distanceText;\r\n\t\tmodel.misc = misc;\r\n\t\tmodel.pageNumbers = Array.from(Array(Math.ceil(model.lenderData.length / 10)).keys()).map(\r\n\t\t\t(i) => Object.assign({}, { pageNumber: i + 1 })\r\n\t\t);\r\n\t\tmodel.numPages = model.pageNumbers.length;\r\n\r\n\t\treturn model;\r\n\t}\r\n\r\n\tshuffleArray(array) {\r\n\t\t/* Durstenfeld shuffle algorithm */\r\n\t\tfor (let i = array.length - 1; i > 0; i--) {\r\n\t\t\tconst j = Math.floor(Math.random() * (i + 1));\r\n\t\t\t[array[i], array[j]] = [array[j], array[i]];\r\n\t\t}\r\n\t\treturn array;\r\n\t}\r\n\r\n\tbuildWantFilters(services, tooltips) {\r\n\t\tconst {\r\n\t\t\tall,\r\n\t\t\tbuy_first_home,\r\n\t\t\tbuy_new_home,\r\n\t\t\thome_improvement_loans,\r\n\t\t\trefinance,\r\n\t\t\trehabilitation_emergency,\r\n\t\t} = services;\r\n\t\treturn [\r\n\t\t\t{\r\n\t\t\t\tvalue: all.value,\r\n\t\t\t\tdesc: all.description,\r\n\t\t\t\tchecked: 'checked',\r\n\t\t\t\tindex: 0,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tvalue: buy_first_home.value,\r\n\t\t\t\tdesc: buy_first_home.description,\r\n\t\t\t\tindex: 1,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tvalue: buy_new_home.value,\r\n\t\t\t\tdesc: buy_new_home.description,\r\n\t\t\t\tindex: 2,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tvalue: refinance.value,\r\n\t\t\t\tdesc: refinance.description,\r\n\t\t\t\tindex: 3,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tvalue: home_improvement_loans.value,\r\n\t\t\t\tdesc: home_improvement_loans.description,\r\n\t\t\t\ttooltip: tooltips.fixUp,\r\n\t\t\t\tindex: 4,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tvalue: rehabilitation_emergency.value,\r\n\t\t\t\tdesc: rehabilitation_emergency.description,\r\n\t\t\t\ttooltip: tooltips.rehab,\r\n\t\t\t\tindex: 5,\r\n\t\t\t},\r\n\t\t];\r\n\t}\r\n\r\n\tbuildLanguageFilters(arLenderData) {\r\n\t\t//Run through all the lenders and get the unique languages spoken for the language filter then build\r\n\t\t//an array that is alphabetized in such a way that I can use a css grid and keep them alphabetized(top to bottom not\r\n\t\t//left to right) in multiple columns\r\n\r\n\t\tconst setLangFilter = new Set();\r\n\t\tlet arLanguageList = [];\r\n\t\t//arrays for handling two column vertical alphabetization\r\n\t\tlet arLeftCol = [];\r\n\t\tlet arRightCol = [];\r\n\r\n\t\t//grab the spoken languages\r\n\t\tfor (const objLender of arLenderData) {\r\n\t\t\tif (objLender.languages.length > 0) {\r\n\t\t\t\tfor (const lender of objLender.languages) {\r\n\t\t\t\t\tsetLangFilter.add(lender.trim());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//alphabetize the list\r\n\t\tarLanguageList = Array.from(setLangFilter);\r\n\t\tarLanguageList.sort();\r\n\r\n\t\tif (arLanguageList.length > 5) {\r\n\t\t\t// evenly split the columns and chuck them in the two arrays\r\n\t\t\tconst intPerColumn = Math.ceil(arLanguageList.length / 2);\r\n\t\t\tarLeftCol = arLanguageList.slice(0, intPerColumn);\r\n\t\t\tarRightCol = arLanguageList.slice(intPerColumn, arLanguageList.length);\r\n\r\n\t\t\t//merge the two arrays back together so they are now in order\r\n\t\t\tconst zipMerge = (arLeft, arRight) =>\r\n\t\t\t\tarLeft.length ? [arLeft[0], ...zipMerge(arRight, arLeft.slice(1))] : arRight;\r\n\t\t\tarLanguageList = zipMerge(arLeftCol, arRightCol);\r\n\t\t}\r\n\r\n\t\treturn arLanguageList;\r\n\t}\r\n\r\n\tbuildNavigation(numCurrentPage, totalResults) {\r\n\t\t//Build the paging navigation\r\n\t\tconst numTotalResults = totalResults || this.model.lenderData.length;\r\n\r\n\t\tconst numTotalPages = Math.ceil(numTotalResults / 10);\r\n\t\t//slice is inclusive so we need to drop back one more\r\n\t\tlet numLowerBound = numCurrentPage - 2 - 1;\r\n\t\tlet numUpperBound = numCurrentPage + 2;\r\n\r\n\t\t//build an array of page numbers that we can slice from to get the paging bounds\r\n\t\tlet pagingArray = [];\r\n\t\tfor (let i = 0; i < numTotalPages; i++) {\r\n\t\t\tpagingArray.push(i + 1);\r\n\t\t}\r\n\t\t//special range cases (Offset too close to 0 or total results)\r\n\t\tif (numLowerBound <= 0) {\r\n\t\t\t//take the amount we're negative and add that many to the upper bound\r\n\t\t\tnumUpperBound = numCurrentPage + Math.abs(numLowerBound) + 2;\r\n\t\t\tnumLowerBound = 0;\r\n\t\t\t//make sure adding to the other side doesn't cause it to go over\r\n\t\t\tif (numUpperBound > numTotalPages) {\r\n\t\t\t\tnumUpperBound = numTotalPages;\r\n\t\t\t}\r\n\t\t} else if (numUpperBound >= numTotalPages) {\r\n\t\t\tconst numUBoundOffset = numUpperBound - numTotalPages;\r\n\t\t\tnumUpperBound = numTotalPages;\r\n\t\t\tnumLowerBound = numCurrentPage - (numOffset + numUBoundOffset) - 1;\r\n\t\t\t//make sure adding to the other side doesn't cause it to go over\r\n\t\t\tif (numLowerBound < 1) {\r\n\t\t\t\tnumLowerBound = 1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//update paging html\r\n\t\t// pagingArray.slice(numLowerBound, numUpperBound)\r\n\t\tthis.model.paginationResults = this.buildPagingHTML(\r\n\t\t\tpagingArray,\r\n\t\t\tnumCurrentPage,\r\n\t\t\tnumTotalPages\r\n\t\t);\r\n\t\treturn this.model.paginationResults;\r\n\t}\r\n\r\n\tbuildPagingHTML(arPages, numCurrentPage, numTotalPages) {\r\n\t\tif (this?.model?.lenderData) {\r\n\t\t\tconst resultCount = `Showing ${numCurrentPage * 10} - ${numCurrentPage * 10 + 10} of ${\r\n\t\t\t\tthis.model.lenderData.length\r\n\t\t\t}`;\r\n\t\t\tthis.model.currentResults = resultCount;\r\n\t\t}\r\n\r\n\t\t//Build out the html for the paging buttons\r\n\t\tlet strDisabledForward = numCurrentPage === arPages.slice(0) ? 'disabled' : '';\r\n\t\tlet strDisabledBackward = numCurrentPage === 1 ? 'disabled' : '';\r\n\t\tlet strClassList;\r\n\t\tlet strHtmlTemplate = `\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t`;\r\n\t\t//\r\n\t\tfor (const element of arPages) {\r\n\t\t\tstrClassList = numCurrentPage === element ? 'pagingLink current' : 'pagingLink';\r\n\t\t\tstrHtmlTemplate += ``;\r\n\t\t}\r\n\r\n\t\tstrHtmlTemplate += `\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t`;\r\n\t\treturn strHtmlTemplate;\r\n\t}\r\n\r\n\trenderMustacheTemplate() {\r\n\t\ttry {\r\n\t\t\treturn this.Mustache.render(this.template, this.model);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(`Failed to expand and render Mustache template: ${error}`);\r\n\t\t}\r\n\t}\r\n}\r\n","import CommonUtils from './common.mjs';\r\n\r\n// The Custom Component class will be the \"default\" export from the module\r\nexport default class {\r\n\tconstructor(args) {\r\n\t\t// store the args\r\n\t\tthis.mode = args.viewMode;\r\n\t\tthis.id = args.id;\r\n\r\n\t\t// store the path to the /assets folder\r\n\t\tthis.assetsPath = import.meta.url.replace('/render.mjs', '');\r\n\r\n\t\t// get the OCM environment resources.\r\n\r\n\t\tthis.sitesSDK = args.SitesSDK;\r\n\t\tthis.Mustache = SCSRenderAPI.getMustache();\r\n\t\tthis.sectionLayoutData = args.sectionLayoutData || {};\r\n\t\tthis.customSettingsData = this.sitesSDK.getProperty('customSettingsData') || {};\r\n\t\tthis.renderMode = args.renderMode || SCSRenderAPI.getRenderMode();\r\n\t\tthis.shared = new CommonUtils({\r\n\t\t\tMustache: this.Mustache,\r\n\t\t\tcomponentLayout: this.sitesSDK.getProperty('componentLayout'),\r\n\t\t\tcustomSettingsData: this.customSettingsData,\r\n\t\t\tcontentClient: this.sitesSDK.getProperty('contentClient'),\r\n\t\t\tassetsPath: this.assetsPath,\r\n\t\t});\r\n\t\tthis.filters = {};\r\n\t\tthis.mpZipCode = new Map();\r\n\t}\r\n\r\n\tasync loadZipValues() {\r\n\t\t// We kept this file external so it can easily be updated by a non-developer, with a non-developer setup\r\n\t\tlet reqZips = await fetch(`${this.assetsPath}/mn-zipcodes.json`);\r\n\t\tlet zipCodes = await reqZips.json();\r\n\t\t//Load the zip codes into a map for quick lookup\r\n\t\tzipCodes.zipCodes.forEach((objZip) => {\r\n\t\t\tthis.mpZipCode.set(objZip.zip, [objZip.latitude, objZip.longitude]);\r\n\t\t});\r\n\t}\r\n\r\n\tcheckFontFace() {\r\n\t\t//need to control the fallback font\r\n\t\tif (!document.fonts.check('16px Calibri')) {\r\n\t\t\tdocument.querySelector('.lenderSearch').classList.add('noFont');\r\n\t\t}\r\n\t}\r\n\r\n\tvalidateZip(zipCode) {\r\n\t\tif (!this.mpZipCode.get(zipCode)) {\r\n\t\t\tdocument.querySelector('.filters').classList.add('active');\r\n\t\t\tdocument.getElementById('zipValidation').innerHTML =\r\n\t\t\t\tthis.customSettingsData.nls.notifications.zipNotice;\r\n\t\t\tdocument.querySelector('.resultsList .noResults').classList.add('active');\r\n\t\t\tdocument.querySelector('.resultItems').style.display = 'none';\r\n\t\t\tdocument.querySelector('.resultPaging').classList.add('hidden');\r\n\t\t\tdocument.querySelector('.resultCount').classList.add('hidden');\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\tconfirmSiteExit(strUrl) {\r\n\t\tconst self = this;\r\n\t\t// * TODO should we be using Mustache to build this HTML?\r\n\t\t// * would also be nice to have a modal function we can call for when they add another modal in phase 2\r\n\t\tconst modalTemplate = `
\r\n\t\t
\r\n\t\t\t
\r\n\t\t\t

${this.customSettingsData.nls.confirmationTitle || ''}

\r\n\t\t\t
\r\n\t\t\t\tclose\r\n\t\t\t
\r\n\t\t\t
\r\n\t\t\t
\r\n\t\t\t\t
${this.customSettingsData.nls.confirmationMessage}
\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t
`;\r\n\t\t// easier to prepend divs into body tags than to fight all the position relatives up the tree\r\n\t\tdocument.querySelector('body').insertAdjacentHTML('afterbegin', modalTemplate);\r\n\r\n\t\t//Vertically center modal\r\n\t\tconst modal = document.querySelector('.alertModal');\r\n\t\tconst modalHeight = Math.ceil(modal.offsetHeight / 2);\r\n\t\tmodal.style = `transform:translateY(-${modalHeight}px)`;\r\n\r\n\t\tdocument.querySelector('.alertMask').addEventListener('click', this.closeModal);\r\n\t\tdocument.querySelector('.btnCancel').addEventListener('click', this.closeModal);\r\n\t\tdocument.querySelector('.modalClose').addEventListener('click', this.closeModal);\r\n\r\n\t\tdocument.addEventListener('keyup', function keyListen(event) {\r\n\t\t\tif (event.key === 'Escape') {\r\n\t\t\t\tself.closeModal();\r\n\t\t\t\tthis.removeEventListener('keyup', keyListen);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdocument.querySelector('.btnContinue').addEventListener('click', () => {\r\n\t\t\twindow.open(strUrl, '_blank');\r\n\t\t\tself.closeModal();\r\n\t\t});\r\n\t}\r\n\r\n\tcloseModal() {\r\n\t\tdocument.querySelector('.alertModal').remove();\r\n\t\tdocument.querySelector('.alertMask').remove();\r\n\t}\r\n\r\n\tclearUrlParams() {\r\n\t\tif (window.location.search) {\r\n\t\t\thistory.pushState('', document.title, window.location.pathname + window.location.hash);\r\n\t\t}\r\n\t}\r\n\r\n\tasync addEventListeners() {\r\n\t\t// ! TODO Should be elsewhere\r\n\t\tawait this.loadZipValues();\r\n\r\n\t\t//back button handling\r\n\t\twindow.addEventListener('popstate', () => {\r\n\t\t\tlet searchParamerters = this.getWindowSearchParams();\r\n\t\t\tsearchParamerters.urlSearch = true;\r\n\t\t\t// hit the filter button to reselect the filters on the page based on new url search params\r\n\t\t\tconsole.log(searchParamerters);\r\n\t\t\tif (searchParamerters?.urlSearch) {\r\n\t\t\t\tthis.reselectFiltersOnUrlSearch('want', searchParamerters.want.value);\r\n\t\t\t\tthis.reselectFiltersOnUrlSearch('searchBy', searchParamerters.searchBy.value);\r\n\t\t\t\t//if the searchBy is location, then we need to set the distance and zip code\r\n\t\t\t\tif (searchParamerters.searchBy.value === 'location') {\r\n\t\t\t\t\tthis.reselectFiltersOnUrlSearch(\r\n\t\t\t\t\t\t'location',\r\n\t\t\t\t\t\tsearchParamerters.searchValue.value\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.reselectFiltersOnUrlSearch('name', searchParamerters.searchValue.value);\r\n\t\t\t\t}\r\n\t\t\t\tthis.reselectFiltersOnUrlSearch('language', searchParamerters.language.value);\r\n\r\n\t\t\t\t//click\tthe search button\r\n\t\t\t\tfilterFunction(false);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t//Search By Events\r\n\t\tconst nlSearchType = document.querySelectorAll('.searchOption');\r\n\t\tnlSearchType.forEach((rdoButton) => {\r\n\t\t\trdoButton.addEventListener('click', () => {\r\n\t\t\t\tlet elTarget =\r\n\t\t\t\t\trdoButton.value === 'location'\r\n\t\t\t\t\t\t? document.querySelector('.jsLocation')\r\n\t\t\t\t\t\t: document.querySelector('.jsName');\r\n\t\t\t\tlet elActive = document.querySelector('.searchType.active');\r\n\t\t\t\tif (elActive) {\r\n\t\t\t\t\telActive.querySelector('input[type=\"text\"]').value = '';\r\n\t\t\t\t\telActive.classList.remove('active');\r\n\t\t\t\t}\r\n\t\t\t\telTarget.classList.add('active');\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// filterFunction\r\n\t\tconst filterFunction = (pushStateBool = true) => {\r\n\t\t\tthis.updateUrlListeners(pushStateBool);\r\n\t\t\tdocument.querySelector('.filters').classList.add('active');\r\n\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = 1;\r\n\t\t\tthis.container.querySelector('.resultPaging').classList.remove('hidden');\r\n\t\t\tthis.container.querySelector('.resultCount').classList.remove('hidden');\r\n\t\t\t//grab all checked languages\r\n\t\t\tconst languages = document.querySelectorAll('.lang input');\r\n\t\t\tlet languageList = [];\r\n\t\t\tlet blValidZip = true;\r\n\t\t\tfor (const language of languages) {\r\n\t\t\t\tif (language.checked) {\r\n\t\t\t\t\tlanguageList.push(language.value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//compile all the necessary filters\r\n\t\t\tconst filters = {\r\n\t\t\t\tlanguages: languageList,\r\n\t\t\t\tsearchBy: {\r\n\t\t\t\t\ttype: document.querySelector('.searchOption:checked')\r\n\t\t\t\t\t\t? document.querySelector('.searchOption:checked').value\r\n\t\t\t\t\t\t: null,\r\n\t\t\t\t\tname: document.getElementById('txtName').value || null,\r\n\t\t\t\t\tzip: document.getElementById('txtZip').value || null,\r\n\t\t\t\t\tdistance: document.getElementById('selDistance').value || null,\r\n\t\t\t\t},\r\n\t\t\t\tservices: document.querySelector('.want:checked')\r\n\t\t\t\t\t? document.querySelector('.want:checked').value\r\n\t\t\t\t\t: null,\r\n\t\t\t};\r\n\r\n\t\t\tif (filters.searchBy.zip) {\r\n\t\t\t\tblValidZip = this.validateZip(filters.searchBy.zip);\r\n\t\t\t}\r\n\r\n\t\t\tif (blValidZip) {\r\n\t\t\t\tthis.filterLenderData(filters);\r\n\t\t\t\tdocument.querySelector('.jsLocation').classList.remove('invalid');\r\n\t\t\t\tdocument.getElementById('zipValidation').innerHTML = '';\r\n\t\t\t} else {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t//Filter Event\r\n\t\tdocument.querySelector('.filterBtn').addEventListener('click', () => filterFunction());\r\n\r\n\t\t//Listen for Enter on fields\r\n\t\tconst searchFields = document.querySelectorAll('.searchType input');\r\n\t\tfor (const field of searchFields) {\r\n\t\t\tfield.addEventListener('keyup', (event) => {\r\n\t\t\t\tif (event.key === 'Enter') {\r\n\t\t\t\t\tdocument.querySelector('.filterBtn').click();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t//Clear Event\r\n\t\tdocument.querySelector('.clearBtn').addEventListener('click', () => {\r\n\t\t\tif (document.querySelector('.filters.active')) {\r\n\t\t\t\tthis.clearFilters();\r\n\t\t\t\tdocument.querySelector('.resultItems').classList.remove('hidden');\r\n\t\t\t\tconst languages = document.querySelectorAll('.lang input');\r\n\t\t\t\tlanguages.forEach((lang) => {\r\n\t\t\t\t\tif (lang.checked) {\r\n\t\t\t\t\t\tlang.click();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlang.removeAttribute('aria-checked');\r\n\t\t\t\t});\r\n\t\t\t\tdocument.querySelector('.filters.active').classList.remove('active');\r\n\t\t\t}\r\n\t\t\t//clear the url params\r\n\t\t\tthis.clearUrlParams();\r\n\t\t});\r\n\r\n\t\t//Sort Order Events\r\n\t\tconst sortButtons = document.querySelectorAll('.sortBar button');\r\n\t\tfor (const btn of sortButtons) {\r\n\t\t\tbtn.addEventListener('click', () => {\r\n\t\t\t\tthis.sortEvent(false, btn);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t//mobileSort\r\n\t\tdocument.querySelector('.jsMobileSort').addEventListener('change', (e) => {\r\n\t\t\te.target.dataset.sorttype = e.target.value;\r\n\t\t\tif (e.target.value) {\r\n\t\t\t\tthis.sortEvent(true, e.target);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdocument.querySelector('.resultItems').addEventListener('click', (e) => {\r\n\t\t\tif (e.target.className === 'view-site-link') {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tconst strUrl = e.target.getAttribute('href');\r\n\t\t\t\tthis.confirmSiteExit(strUrl);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.addPaginationListeners();\r\n\r\n\t\tconst tooltipLists = document.querySelectorAll('.hasTooltip');\r\n\r\n\t\tfor (const tooltipList of tooltipLists) {\r\n\t\t\tconst tooltipButton = tooltipList.querySelector('.showTooltip');\r\n\t\t\tconst tooltipDialog = tooltipList.querySelector('.tooltip-shell');\r\n\t\t\tconst tooltipClose = tooltipList.querySelector('.tooltip-close');\r\n\r\n\t\t\ttooltipClose.addEventListener('click', () => {\r\n\t\t\t\ttooltipList.classList.remove('active');\r\n\t\t\t\ttooltipDialog.removeAttribute('open');\r\n\t\t\t});\r\n\t\t\ttooltipButton.addEventListener('click', () => {\r\n\t\t\t\tif (tooltipList.classList.contains('active')) {\r\n\t\t\t\t\ttooltipList.classList.remove('active');\r\n\t\t\t\t\ttooltipDialog.removeAttribute('open');\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// close any other open tooltips\r\n\t\t\t\t\tconst activeTooltip = document.querySelector('.hasTooltip.active');\r\n\t\t\t\t\tif (activeTooltip) {\r\n\t\t\t\t\t\tactiveTooltip.classList.remove('active');\r\n\t\t\t\t\t\tactiveTooltip.querySelector('.tooltip-shell').removeAttribute('open');\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttooltipList.classList.add('active');\r\n\t\t\t\t\ttooltipDialog.setAttribute('open', '');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// set left position of tooltip dialog to be\r\n\t\t\t// tooltip button's left position via getBoundingClientRect()\r\n\t\t\t// check just to make sure the tooltip button and dialog exist\r\n\t\t\t// we only want to do this if viewport size is greater than 600px\r\n\t\t\tif (tooltipButton && tooltipDialog) {\r\n\t\t\t\t// need to execute resize cb once to set initial position\r\n\t\t\t\t// since the resize event doesn't fire on page load\r\n\t\t\t\tthis.executeResizeCb(tooltipButton, tooltipDialog);\r\n\t\t\t\t// execute resize cb on resize\r\n\t\t\t\t// need to debounce this to prevent performance issues\r\n\t\t\t\twindow.addEventListener(\r\n\t\t\t\t\t'resize',\r\n\t\t\t\t\tthis.debounce(() => {\r\n\t\t\t\t\t\tthis.executeResizeCb(tooltipButton, tooltipDialog);\r\n\t\t\t\t\t})\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// listen for clicks or taps outside of the tooltip.\r\n\t\t// if the click is outside of the tooltip and the tooltip is open, close it.\r\n\t\tdocument.addEventListener('click', (e) => {\r\n\t\t\tif (e.target.closest('.hasTooltip')) return;\r\n\t\t\tconst activeTooltip = document.querySelector('.hasTooltip.active');\r\n\t\t\tif (activeTooltip) {\r\n\t\t\t\tactiveTooltip.classList.remove('active');\r\n\t\t\t\tactiveTooltip.querySelector('.tooltip-shell').removeAttribute('open');\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tdebounce(func, wait = 200) {\r\n\t\tlet timeout;\r\n\t\treturn function executedFunction(...args) {\r\n\t\t\tconst later = () => {\r\n\t\t\t\ttimeout = null;\r\n\t\t\t\tfunc(...args);\r\n\t\t\t};\r\n\t\t\tclearTimeout(timeout);\r\n\t\t\ttimeout = setTimeout(later, wait);\r\n\t\t};\r\n\t}\r\n\r\n\texecuteResizeCb(btn, dialog) {\r\n\t\tconst scsContentContainer = document.querySelector('main#slot-content.scs-slot');\r\n\r\n\t\tdialog.style.left = '';\r\n\t\tif (window.innerWidth > 600) {\r\n\t\t\tconst tooltipButtonLeft =\r\n\t\t\t\tbtn.getBoundingClientRect().left -\r\n\t\t\t\tscsContentContainer.getBoundingClientRect().left +\r\n\t\t\t\t5;\r\n\t\t\treturn (dialog.style.left = `${tooltipButtonLeft}px`);\r\n\t\t} else {\r\n\t\t\tdialog.style.left = '';\r\n\t\t}\r\n\t}\r\n\r\n\tfindParentByClass(el, className) {\r\n\t\twhile ((el = el.parentElement) && !el.classList.contains(className));\r\n\t\treturn el;\r\n\t}\r\n\r\n\tsortLenders(props) {\r\n\t\t//Logic to return the appropriate sort based on the criteria\r\n\r\n\t\tif (props.strCriteria === 'company') {\r\n\t\t\tif (props.strSortOrder === 'asc') {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tlet aHasName = a.querySelector('.company .strongText');\r\n\t\t\t\t\tlet bHasName = b.querySelector('.company .strongText');\r\n\t\t\t\t\tlet compareA = aHasName\r\n\t\t\t\t\t\t? aHasName?.innerText || ''\r\n\t\t\t\t\t\t: a.querySelector('.lenderName')?.innerText || '';\r\n\t\t\t\t\tlet compareB = bHasName\r\n\t\t\t\t\t\t? bHasName?.innerText || ''\r\n\t\t\t\t\t\t: b.querySelector('.lenderName')?.innerText || '';\r\n\r\n\t\t\t\t\treturn compareA.localeCompare(compareB);\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tlet aHasName = a.querySelector('.company .strongText');\r\n\t\t\t\t\tlet bHasName = b.querySelector('.company .strongText');\r\n\t\t\t\t\tlet compareA = aHasName\r\n\t\t\t\t\t\t? aHasName?.innerText || ''\r\n\t\t\t\t\t\t: a.querySelector('.lenderName')?.innerText || '';\r\n\t\t\t\t\tlet compareB = bHasName\r\n\t\t\t\t\t\t? bHasName?.innerText || ''\r\n\t\t\t\t\t\t: b.querySelector('.lenderName')?.innerText || '';\r\n\r\n\t\t\t\t\treturn compareB.localeCompare(compareA);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t} else if (props.strCriteria === 'distance') {\r\n\t\t\tif (props.strSortOrder === 'asc') {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tconst aDistance =\r\n\t\t\t\t\t\ta.querySelector('.searchDistance .strongText')?.innerText.split(' ')[0] ||\r\n\t\t\t\t\t\tNumber.MAX_VALUE;\r\n\t\t\t\t\tconst bDistance =\r\n\t\t\t\t\t\tb.querySelector('.searchDistance .strongText')?.innerText.split(' ')[0] ||\r\n\t\t\t\t\t\tNumber.MAX_VALUE;\r\n\t\t\t\t\treturn parseFloat(aDistance, 10) - parseFloat(bDistance, 10);\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tconst aDistance =\r\n\t\t\t\t\t\ta.querySelector('.searchDistance .strongText')?.innerText.split(' ')[0] ||\r\n\t\t\t\t\t\t0;\r\n\t\t\t\t\tconst bDistance =\r\n\t\t\t\t\t\tb.querySelector('.searchDistance .strongText')?.innerText.split(' ')[0] ||\r\n\t\t\t\t\t\t0;\r\n\t\t\t\t\treturn parseFloat(bDistance) - parseFloat(aDistance);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t} else if (props.strCriteria === 'language') {\r\n\t\t\tif (props.strSortOrder === 'asc') {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tconst aLanguages = a.querySelectorAll('.languages div ul li');\r\n\t\t\t\t\tconst bLanguages = b.querySelectorAll('.languages div ul li');\r\n\r\n\t\t\t\t\treturn aLanguages.length - bLanguages.length;\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tconst aLanguages = a.querySelectorAll('.languages div ul li');\r\n\t\t\t\t\tconst bLanguages = b.querySelectorAll('.languages div ul li');\r\n\t\t\t\t\treturn bLanguages.length - aLanguages.length;\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t} else if (props.strCriteria === 'producer') {\r\n\t\t\tif (props.strSortOrder === 'asc') {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tconst aProducers = a.querySelectorAll('.producer .topProducer').length;\r\n\t\t\t\t\tconst bProducers = b.querySelectorAll('.producer .topProducer').length;\r\n\t\t\t\t\treturn parseInt(aProducers) - parseInt(bProducers);\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\treturn (a, b) => {\r\n\t\t\t\t\tconst aProducers = a.querySelectorAll('.producer .topProducer').length;\r\n\t\t\t\t\tconst bProducers = b.querySelectorAll('.producer .topProducer').length;\r\n\t\t\t\t\treturn parseInt(bProducers) - parseInt(aProducers);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tsortEvent(blIsMobile, category) {\r\n\t\tblIsMobile = blIsMobile || false;\r\n\t\t//Functionality for sort\r\n\t\tlet blValidAddressSort = true;\r\n\r\n\t\tif (blIsMobile) {\r\n\t\t\tdocument.querySelector('.jsMobileSort .initial').classList.add('hidden');\r\n\t\t\tdocument.querySelector('.jsMobileSort .initial').removeAttribute('selected');\r\n\t\t\tif (\r\n\t\t\t\tcategory.dataset.sorttype === 'address' &&\r\n\t\t\t\tcategory.dataset.sortState !== 'active'\r\n\t\t\t) {\r\n\t\t\t\tblValidAddressSort = false;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (\r\n\t\t\t\tcategory.dataset.sorttype === 'address' &&\r\n\t\t\t\tdocument.querySelector('.sortAddress:not(.active)')\r\n\t\t\t) {\r\n\t\t\t\tblValidAddressSort = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//prevent sort by address until a zip code has been searched\r\n\t\tif (!blValidAddressSort) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet arLenders = this.container.state.nlFilteredResults || this.container.state.nlAllResults;\r\n\t\tarLenders = [...arLenders].filter((lender) => lender.dataset.pagenum != '0');\r\n\t\tlet obSortCriteria = {};\r\n\r\n\t\tlet strSortState = category.dataset.sortorder;\r\n\r\n\t\t//Figure out what direction sort was going before the button was pressed and set the new order\r\n\t\tif (!strSortState) {\r\n\t\t\tif (\r\n\t\t\t\tcategory.dataset.sorttype === 'distance' ||\r\n\t\t\t\tcategory.dataset.sorttype === 'company'\r\n\t\t\t) {\r\n\t\t\t\tstrSortState = 'asc';\r\n\t\t\t} else {\r\n\t\t\t\t//since language and producer are counts, desc is technically asc\r\n\t\t\t\tstrSortState = 'desc';\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t//it's not a mobile or initial sort, so set the sort to whatever isn't the last sort\r\n\t\t\tif (strSortState === 'asc') {\r\n\t\t\t\tstrSortState = 'desc';\r\n\t\t\t} else {\r\n\t\t\t\tstrSortState = 'asc';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//only update the sort order if it's desktop\r\n\t\tif (!blIsMobile) {\r\n\t\t\tcategory.dataset.sortorder = strSortState;\r\n\t\t}\r\n\r\n\t\tobSortCriteria.strSortOrder = strSortState;\r\n\t\tobSortCriteria.strCriteria = category.dataset.sorttype;\r\n\t\tarLenders = [...arLenders].sort(this.sortLenders(obSortCriteria));\r\n\r\n\t\tthis.container.state.nlSortedResults = arLenders;\r\n\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = 1;\r\n\r\n\t\tthis.updatePageNumbers(arLenders);\r\n\t\tthis.handlePageDisplay();\r\n\t\tthis.handlePaginationUpdate();\r\n\t}\r\n\r\n\tupdatePageNumbers(arLenders) {\r\n\t\tconst lastPage = this.container.querySelector('.js-lastPage').dataset.pageno;\r\n\t\tlet pageNum = 1;\r\n\t\tfor (let i = 0; i < arLenders.length; i++) {\r\n\t\t\tif (pageNum > lastPage) {\r\n\t\t\t\tpageNum = lastPage;\r\n\t\t\t}\r\n\t\t\tarLenders[i].dataset.pagenum = pageNum;\r\n\t\t\t// For every 10 lenders, increment pageNum by 1\r\n\t\t\tif ((i + 1) % 10 === 0) {\r\n\t\t\t\tpageNum++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tasync clearFilters() {\r\n\t\t//clear all filter values and sorts, then reset results\r\n\r\n\t\tdocument.getElementById('zipValidation').innerHTML = '';\r\n\t\tconst elButtons = document.querySelectorAll('.sortBar button');\r\n\t\tconst elSearchTypes = document.querySelectorAll('.searchType');\r\n\t\tdocument.querySelector('.sortAddress').classList.remove('active');\r\n\t\tdocument.querySelector('.jsMobileSort .address').classList.add('hidden');\r\n\t\tdocument.querySelector('.jsMobileSort').dataset.sortState = '';\r\n\t\tdocument.querySelector('.jsMobileSort .initial').classList.remove('hidden');\r\n\t\tdocument.querySelector('.jsMobileSort .initial').setAttribute('selected', 'selected');\r\n\t\tdocument.querySelector('#selDistance').value = '10'; //.value = '25' changed to .value = '10'\r\n\r\n\t\tfor (const elButton of elButtons) {\r\n\t\t\telButton.dataset.sortorder = '';\r\n\t\t}\r\n\r\n\t\tdocument.getElementById('want0').checked = true;\r\n\t\tdocument.getElementById('search1').checked = true;\r\n\t\tdocument.getElementById('txtZip').value = '';\r\n\t\tdocument.getElementById('txtName').value = '';\r\n\r\n\t\tfor (const elSearchType of elSearchTypes) {\r\n\t\t\telSearchType.classList.remove('active');\r\n\t\t}\r\n\t\tthis.container.querySelector('.resultPaging').classList.remove('hidden');\r\n\t\tthis.container.querySelector('.resultCount').classList.remove('hidden');\r\n\t\tdocument.querySelector('.searchType.jsLocation').classList.add('active');\r\n\t\tdocument.querySelector('.resultsList .noResults').classList.remove('active');\r\n\r\n\t\t//this.filterLenderData()\r\n\r\n\t\tthis.container.state.nlFilteredResults = false;\r\n\t\tthis.container.state.nlSortedResults = false;\r\n\r\n\t\tlet lenders = this.shared.shuffleArray([...this.container.state.nlAllResults]);\r\n\r\n\t\t[...lenders].forEach((lender) => {\r\n\t\t\tlender.classList.add('hidden');\r\n\t\t\tlender.dataset.pagenum = 0;\r\n\t\t\tif (lender.querySelector('.searchDistance')) {\r\n\t\t\t\tlender.querySelector('.searchDistance .strongText').innerText = '';\r\n\t\t\t\tlender.querySelector('.searchDistance .from-search').innerText = '';\r\n\t\t\t}\r\n\t\t});\r\n\t\tconst lastPage = this.container.querySelector('.js-lastPage');\r\n\t\tlastPage.dataset.pageno = Math.ceil(lenders.length / 10);\r\n\r\n\t\t// need to rebuild pagination based off of filtered lenders\r\n\t\tthis.resultCount = lenders.length;\r\n\t\tconst newPagination = this.shared.buildNavigation(1, lenders.length);\r\n\r\n\t\tthis.container.querySelector('.resultPaging').innerHTML = newPagination;\r\n\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = 1;\r\n\t\tthis.updatePageNumbers(lenders);\r\n\t\tthis.handlePageDisplay();\r\n\t\tthis.handlePaginationUpdate();\r\n\t\tthis.addPaginationListeners();\r\n\t}\r\n\r\n\tfilterLanguages(filteredLenders, languages) {\r\n\t\t//handle the \"Additional Languages Column\"\r\n\r\n\t\tlet arLangFilter = [];\r\n\r\n\t\tfor (const lender of filteredLenders) {\r\n\t\t\tconst lenderLanguages = lender.querySelectorAll('.languages div ul li');\r\n\t\t\tconst extractedLang = [...lenderLanguages].map((lang) => lang.innerText);\r\n\t\t\tif (languages.some((i) => extractedLang.includes(i))) {\r\n\t\t\t\tarLangFilter.push(lender);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn arLangFilter;\r\n\t}\r\n\r\n\tfilterSearchBy(filteredLenders, searchBy) {\r\n\t\t//handle the \"Search By Column\"\r\n\t\tlet arFilter = [];\r\n\t\t//Search By Name checks for full name first. If not found, checks if first name, last name\r\n\t\t//or company name matches\r\n\t\tif (searchBy.type === 'name') {\r\n\t\t\tconst strSearchValue = searchBy.name.toLowerCase().trim();\r\n\t\t\tfor (const lender of filteredLenders) {\r\n\t\t\t\tlet strFirstName =\r\n\t\t\t\t\tlender.querySelector('.company .strongText')?.dataset?.firstname.trim() || '';\r\n\t\t\t\tlet strLastName =\r\n\t\t\t\t\tlender.querySelector('.company .strongText')?.dataset?.lastname.trim() || '';\r\n\t\t\t\tlet strFullName = `${strFirstName} ${strLastName}`.trim();\r\n\r\n\t\t\t\tif (strFullName.toLocaleLowerCase() === strSearchValue.toLocaleLowerCase().trim()) {\r\n\t\t\t\t\tarFilter.push(lender);\r\n\t\t\t\t} else if (\r\n\t\t\t\t\tstrSearchValue === strFirstName.toLocaleLowerCase().trim() ||\r\n\t\t\t\t\tstrSearchValue === strLastName.toLocaleLowerCase().trim() ||\r\n\t\t\t\t\tlender\r\n\t\t\t\t\t\t.querySelector('.company .lenderName')\r\n\t\t\t\t\t\t?.innerText.toLocaleLowerCase()\r\n\t\t\t\t\t\t?.includes(strSearchValue)\r\n\t\t\t\t) {\r\n\t\t\t\t\tarFilter.push(lender);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfilteredLenders = arFilter;\r\n\t\t}\r\n\r\n\t\tif (searchBy.type === 'location') {\r\n\t\t\t//Get the distance between lender lat/long and zip code lat/long, then sort by distance\r\n\t\t\tconst strDistanceType = this.customSettingsData.nls.distanceText.type;\r\n\r\n\t\t\tfor (const lender of filteredLenders) {\r\n\t\t\t\t// TODO this loop will break on extended zip codes. would need to support strings\r\n\r\n\t\t\t\t// extract vars from lender\r\n\t\t\t\tlet lenderAddress = lender.querySelector('.address');\r\n\t\t\t\tlet lenderLatitude = Number(lenderAddress.dataset.latitude);\r\n\t\t\t\tlet lenderLongitude = Number(lenderAddress.dataset.longitude);\r\n\t\t\t\t// check if lat/lng are valid numbers\r\n\t\t\t\tif (\r\n\t\t\t\t\tisNaN(lenderLatitude) ||\r\n\t\t\t\t\tlenderLatitude == 0 ||\r\n\t\t\t\t\tisNaN(lenderLongitude) ||\r\n\t\t\t\t\tlenderLongitude == 0\r\n\t\t\t\t) {\r\n\t\t\t\t\t// if the lender doesn't have a lat/lng, try using the zip code map\r\n\t\t\t\t\tif (this.mpZipCode.has(lenderAddress.dataset.zip)) {\r\n\t\t\t\t\t\t[lenderLatitude, lenderLongitude] = this.mpZipCode.get(\r\n\t\t\t\t\t\t\tlenderAddress.dataset.zip\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tlenderLatitude = 0;\r\n\t\t\t\t\t\tlenderLongitude = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tlet lenderCoordinates = [lenderLatitude, lenderLongitude];\r\n\t\t\t\t// find the distance between the target zip code and the lender's zip code\r\n\t\t\t\tlet ftDistance = this.distanceBetweenLocations(\r\n\t\t\t\t\tthis.mpZipCode.get(searchBy.zip),\r\n\t\t\t\t\tlenderCoordinates\r\n\t\t\t\t);\r\n\r\n\t\t\t\t// look for users with a distance label and update it\r\n\t\t\t\tconst distanceLabel = lender.querySelector('.searchDistance .strongText');\r\n\t\t\t\tif (distanceLabel) {\r\n\t\t\t\t\t//If we are searching by any distance, all results with lat/lng will qualify\r\n\t\t\t\t\tif (searchBy.distance === 'all' || ftDistance < parseInt(searchBy.distance)) {\r\n\t\t\t\t\t\tdistanceLabel.innerText = `${ftDistance.toFixed(2)} ${strDistanceType}`;\r\n\t\t\t\t\t\tconst fromSearchLabel = lender.querySelector(\r\n\t\t\t\t\t\t\t'.searchDistance .from-search'\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tif (fromSearchLabel) fromSearchLabel.innerText = 'from search';\r\n\t\t\t\t\t\tarFilter.push(lender);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfilteredLenders = arFilter;\r\n\r\n\t\t\tif (filteredLenders.length > 0) {\r\n\t\t\t\t/** @type HTMLElement | null */\r\n\t\t\t\tconst jsMobileSort = document.querySelector('.jsMobileSort');\r\n\t\t\t\tif (jsMobileSort) {\r\n\t\t\t\t\tdocument.querySelector('.sortAddress')?.classList.add('active');\r\n\t\t\t\t\tdocument.querySelector('.jsMobileSort .address')?.classList.remove('hidden');\r\n\t\t\t\t\tjsMobileSort.dataset.sortState = 'active';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn filteredLenders;\r\n\t}\r\n\r\n\tasync filterLenderData(filters) {\r\n\t\tconst { services = [], searchBy = {}, languages = [] } = filters;\r\n\t\tlet blHasResults = true;\r\n\t\tlet filteredLenders = this.container.state.nlAllResults;\r\n\t\tthis.container.state.nlSortedResults = false;\r\n\r\n\t\tdocument.querySelector('.jsMobileSort .initial').classList.remove('hidden');\r\n\t\tdocument.querySelector('.jsMobileSort .initial').setAttribute('selected', 'selected');\r\n\t\t//services first\r\n\r\n\t\tif (services !== 'all') {\r\n\t\t\tfilteredLenders = [...filteredLenders].filter((lender) => {\r\n\t\t\t\tconst serviceTypes = lender\r\n\t\t\t\t\t.querySelector('.serviceTypes')\r\n\t\t\t\t\t.getAttribute('data-servicetypes')\r\n\t\t\t\t\t.split(',');\r\n\t\t\t\tif (serviceTypes) {\r\n\t\t\t\t\treturn serviceTypes.includes(services);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t//then languages\r\n\r\n\t\tif (languages && languages.length > 0) {\r\n\t\t\tfilteredLenders = this.filterLanguages(filteredLenders, languages);\r\n\t\t}\r\n\r\n\t\tif (searchBy.name || searchBy.zip) {\r\n\t\t\t//search by name\r\n\t\t\tfilteredLenders = this.filterSearchBy(filteredLenders, searchBy);\r\n\t\t}\r\n\r\n\t\tif (filteredLenders.length === 0) {\r\n\t\t\tblHasResults = false;\r\n\t\t} else {\r\n\t\t\tfilteredLenders = this.shared.shuffleArray([...filteredLenders]);\r\n\t\t}\r\n\r\n\t\tconst elResultItems = document.querySelector('.resultItems');\r\n\t\tconst elNoResults = document.querySelector('.noResults');\r\n\r\n\t\tif (filteredLenders.length > 0) {\r\n\t\t\tthis.container.state.nlFilteredResults = filteredLenders;\r\n\r\n\t\t\tconst dfFilteredLenders = document.createDocumentFragment();\r\n\r\n\t\t\telResultItems.classList.remove('hidden');\r\n\t\t\telNoResults.classList.remove('active');\r\n\t\t\tconst lastPage = this.container.querySelector('.js-lastPage');\r\n\r\n\t\t\t[...filteredLenders].forEach((lender) => {\r\n\t\t\t\tlender.classList.remove('hidden');\r\n\t\t\t\tdfFilteredLenders.appendChild(lender);\r\n\t\t\t});\r\n\t\t\tthis.container\r\n\t\t\t\t.querySelectorAll('.result:not(.hidden) img')\r\n\t\t\t\t.forEach((i) => i.setAttribute('loading', 'eager'));\r\n\r\n\t\t\tlastPage.dataset.pageno = Math.ceil(filteredLenders.length / 10);\r\n\t\t\tthis.resultCount = filteredLenders.length;\r\n\r\n\t\t\t// need to rebuild pagination based off of filtered lenders\r\n\t\t\tconst newPagination = this.shared.buildNavigation(1, filteredLenders.length);\r\n\r\n\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = 1;\r\n\t\t\tthis.container.querySelector('.resultPaging').innerHTML = newPagination;\r\n\t\t\tthis.addPaginationListeners();\r\n\t\t\tthis.updatePageNumbers(filteredLenders);\r\n\t\t\tthis.handlePageDisplay();\r\n\t\t\tthis.handlePaginationUpdate();\r\n\t\t} else {\r\n\t\t\telResultItems.style.display = 'none';\r\n\t\t\telNoResults.classList.add('active');\r\n\t\t\tthis.container.querySelector('.resultPaging').classList.add('hidden');\r\n\t\t\tthis.container.querySelector('.resultCount').classList.add('hidden');\r\n\t\t}\r\n\r\n\t\tdocument.querySelector('.filters').classList.add('active');\r\n\t}\r\n\r\n\tdistanceBetweenLocations(arOrigin, arDestination) {\r\n\t\t//haversine formula - Expects lat/long array for origin and destination\r\n\r\n\t\tfunction toRad(x) {\r\n\t\t\treturn (x * Math.PI) / 180;\r\n\t\t}\r\n\r\n\t\tconst kmConversion = 0.621371;\r\n\r\n\t\tlet orLat = arOrigin[0];\r\n\t\tlet orLong = arOrigin[1];\r\n\t\tlet deLat = arDestination[0];\r\n\t\tlet deLong = arDestination[1];\r\n\r\n\t\t//radius of earth(KM)\r\n\t\tconst rad = 6371;\r\n\r\n\t\t//distance between latitude in radians\r\n\t\tconst dLat = toRad(deLat - orLat);\r\n\t\tconst dLong = toRad(deLong - orLong);\r\n\r\n\t\t//convert latitude coordinates to radians\r\n\t\torLat = toRad(orLat);\r\n\t\tdeLat = toRad(deLat);\r\n\r\n\t\t//apply haversine formula\r\n\t\tlet sqRtValue =\r\n\t\t\tMath.pow(Math.sin(dLat / 2), 2) +\r\n\t\t\tMath.pow(Math.sin(dLong / 2), 2) * Math.cos(orLat) * Math.cos(deLat);\r\n\r\n\t\tlet distance = rad * (2 * Math.asin(Math.sqrt(sqRtValue)));\r\n\r\n\t\t// convert the distance from km to mi\r\n\t\treturn distance * kmConversion;\r\n\t}\r\n\r\n\tisWithinRange(n, x, y) {\r\n\t\treturn n >= x && n <= y;\r\n\t}\r\n\r\n\thandlePageDisplay() {\r\n\t\tconst numActivePage = this.container.querySelector('.lenderSearch').dataset.numactive;\r\n\t\tlet pages =\r\n\t\t\tthis.container.state.nlSortedResults ||\r\n\t\t\tthis.container.state.nlFilteredResults ||\r\n\t\t\tthis.container.state.nlAllResults;\r\n\t\tconst dfLenders = document.createDocumentFragment();\r\n\r\n\t\t// Force shuffle results on compile for initial load\r\n\t\tif (this.blFirstCompileLoad) {\r\n\t\t\tpages = this.shared.shuffleArray([...this.container.state.nlAllResults]);\r\n\t\t\tthis.blFirstCompileLoad = false;\r\n\t\t}\r\n\r\n\t\tthis.container.querySelector('.resultItems').style.display = 'none';\r\n\t\tpages.forEach((item) => {\r\n\t\t\tif (item.dataset.pagenum === numActivePage) {\r\n\t\t\t\titem.classList.remove('hidden');\r\n\t\t\t\tdfLenders.appendChild(item);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.container.querySelector('.resultItems').replaceChildren(dfLenders);\r\n\t\tthis.container.querySelector('.resultItems').style.display = 'block';\r\n\t}\r\n\r\n\thandlePaginationUpdate() {\r\n\t\tconst numActivePage = Number(\r\n\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive\r\n\t\t);\r\n\r\n\t\tconst prev = this.container.querySelector('.js-backPage');\r\n\t\tconst next = this.container.querySelector('.js-forwardPage');\r\n\t\tconst first = this.container.querySelector('.js-firstPage');\r\n\t\tconst last = this.container.querySelector('.js-lastPage');\r\n\t\tconst numPages = this.container.querySelector('.js-lastPage')\r\n\t\t\t? Number(this.container.querySelector('.js-lastPage').dataset.pageno)\r\n\t\t\t: 1;\r\n\t\tconst numResults =\r\n\t\t\tthis.container.state.nlSortedResults.length ||\r\n\t\t\tthis.container.state.nlFilteredResults.length ||\r\n\t\t\tthis.container.state.nlAllResults.length;\r\n\t\tconst numUBound = numResults < 10 ? numResults : numActivePage * 10;\r\n\t\tconst numLBound = numActivePage * 10 - 9;\r\n\t\tconst resultCount = `Showing ${numLBound} - ${numUBound} of ${numResults}`;\r\n\t\tthis.container.querySelector('.resultCount').innerHTML = resultCount;\r\n\r\n\t\tif (numActivePage === 1) {\r\n\t\t\tfirst.classList.add('disabled');\r\n\t\t\tprev.classList.add('disabled');\r\n\t\t\tlast.classList.remove('disabled');\r\n\t\t\tnext.classList.remove('disabled');\r\n\t\t\tif (numPages === 1) {\r\n\t\t\t\tnext.classList.add('disabled');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfirst.classList.remove('disabled');\r\n\t\t\tprev.classList.remove('disabled');\r\n\r\n\t\t\tif (numActivePage === numPages) {\r\n\t\t\t\tlast.classList.add('disabled');\r\n\t\t\t\tnext.classList.add('disabled');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst content = this.container.querySelectorAll('.pagingLink');\r\n\t\tconst paginationItems = content;\r\n\t\tconst dfPagination = document.createDocumentFragment();\r\n\t\t//make sure to always have 5 pages\r\n\t\tlet numUpperBound = numActivePage + 2;\r\n\t\tlet numLowerBound = numActivePage - 2;\r\n\r\n\t\tif (numActivePage === numPages) {\r\n\t\t\t//! TODO FIX IF ONLY ONE PAGE\r\n\t\t\tif (numPages === 1) {\r\n\t\t\t\tnumUpperBound = 0;\r\n\t\t\t\tnumLowerBound = 0;\r\n\t\t\t} else {\r\n\t\t\t\tnumLowerBound = numActivePage - 3;\r\n\t\t\t}\r\n\t\t} else if (numActivePage + 1 === numPages) {\r\n\t\t\tnumLowerBound = numActivePage - 3;\r\n\t\t}\r\n\t\tif (numActivePage === 1) {\r\n\t\t\tnumUpperBound = numActivePage + 4;\r\n\t\t} else if (numActivePage === 2) {\r\n\t\t\tnumUpperBound = numActivePage + 3;\r\n\t\t}\r\n\r\n\t\tpaginationItems.forEach((item) => {\r\n\t\t\tif (this.isWithinRange(item.dataset.pageno, numLowerBound, numUpperBound)) {\r\n\t\t\t\tif (Number(item.dataset.pageno) === numActivePage) {\r\n\t\t\t\t\titem.classList.add('current');\r\n\t\t\t\t} else {\r\n\t\t\t\t\titem.classList.remove('current');\r\n\t\t\t\t}\r\n\t\t\t\titem.classList.remove('hidden');\r\n\t\t\t} else {\r\n\t\t\t\titem.classList.add('hidden');\r\n\t\t\t}\r\n\t\t\tdfPagination.appendChild(item);\r\n\t\t});\r\n\t\tdocument.querySelector('.paginationItems').replaceChildren(dfPagination);\r\n\t}\r\n\r\n\t// insert the component's HTML into the page\r\n\t// after it has added the component, it applies any clickHandlers to elements that were added to the page\r\n\tasync renderComponent() {\r\n\t\tconst strTemplate = await SCSRenderAPI.importText(this.assetsPath + '/template.html');\r\n\t\tawait SCSRenderAPI.importCSS(this.assetsPath + '/styles/design.css');\r\n\t\tconst objCommonContext = {\r\n\t\t\tMustache: this.Mustache,\r\n\t\t\tcomponentLayout: this.sitesSDK.getProperty('componentLayout'),\r\n\t\t\tcustomSettingsData: this.customSettingsData,\r\n\t\t\tcontentClient: this.sitesSDK.getProperty('contentClient'),\r\n\t\t\ttemplate: strTemplate,\r\n\t\t\turlSearchObject: this.getWindowSearchParams(),\r\n\t\t};\r\n\t\tconst commonClass = new CommonUtils(objCommonContext);\r\n\t\tthis.shared = commonClass;\r\n\t\tconst model = await commonClass.fetchLenderData(false);\r\n\t\tcommonClass.setModel(model);\r\n\r\n\t\tconst componentHtml = commonClass.renderMustacheTemplate();\r\n\r\n\t\t// replace the content of the container with the rendered HTML\r\n\t\tthis.container.innerHTML = componentHtml;\r\n\t}\r\n\r\n\taddPaginationListeners() {\r\n\t\tconst lenderSearchElem = this.container.querySelector('.lenderSearch');\r\n\t\tconst prev = this.container.querySelector('.js-backPage');\r\n\t\tconst next = this.container.querySelector('.js-forwardPage');\r\n\t\tconst first = this.container.querySelector('.js-firstPage');\r\n\t\tconst last = this.container.querySelector('.js-lastPage');\r\n\t\tconst numPages = last.dataset.pageno;\r\n\t\tfirst.addEventListener('click', () => {\r\n\t\t\tlenderSearchElem.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = 1;\r\n\t\t\tthis.handlePaginationUpdate();\r\n\t\t\tthis.handlePageDisplay();\r\n\t\t});\r\n\t\tlast.addEventListener('click', () => {\r\n\t\t\tlenderSearchElem.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = Number(\r\n\t\t\t\tlast.dataset.pageno\r\n\t\t\t);\r\n\t\t\tthis.handlePaginationUpdate();\r\n\t\t\tthis.handlePageDisplay();\r\n\t\t});\r\n\t\tprev.addEventListener('click', () => {\r\n\t\t\tlenderSearchElem.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t\tconst activePage = Number(\r\n\t\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive\r\n\t\t\t);\r\n\t\t\tif (activePage > 1) {\r\n\t\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = Number(\r\n\t\t\t\t\tactivePage - 1\r\n\t\t\t\t).toString();\r\n\t\t\t\tthis.handlePaginationUpdate();\r\n\t\t\t\tthis.handlePageDisplay();\r\n\t\t\t}\r\n\t\t});\r\n\t\tnext.addEventListener('click', () => {\r\n\t\t\tlenderSearchElem.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t\tconst activePage = Number(\r\n\t\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive\r\n\t\t\t);\r\n\t\t\tif (activePage < Number(numPages)) {\r\n\t\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive = Number(\r\n\t\t\t\t\tactivePage + 1\r\n\t\t\t\t).toString();\r\n\t\t\t\tthis.handlePaginationUpdate();\r\n\t\t\t\tthis.handlePageDisplay();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.container.querySelector('.resultPaging').addEventListener('click', (event) => {\r\n\t\t\tif (event.target.classList.contains('pagingLink')) {\r\n\t\t\t\tlenderSearchElem.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t\t\tthis.container.querySelector('.lenderSearch').dataset.numactive =\r\n\t\t\t\t\tevent.target.dataset.pageno;\r\n\t\t\t\tthis.handlePaginationUpdate();\r\n\t\t\t\tthis.handlePageDisplay();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\tasync reselectFiltersOnUrlSearch(strFilterName, searchValue) {\r\n\t\tif (strFilterName === 'want') {\r\n\t\t\t//check the radio input with the value of searchValue\r\n\t\t\tconst radioInput = this.container.querySelector(`input[value=\"${searchValue}\"]`);\r\n\t\t\tradioInput.checked = true;\r\n\t\t}\r\n\t\tif (strFilterName === 'searchBy') {\r\n\t\t\t//check the radio input with the value of searchValue\r\n\t\t\tconst radioInput = this.container.querySelector(`input[value=\"${searchValue}\"]`);\r\n\t\t\tradioInput.checked = true;\r\n\t\t\t//trigger the click event on the radio input\r\n\t\t\tradioInput.click();\r\n\t\t}\r\n\t\tif (strFilterName === 'location') {\r\n\t\t\tconst textName = this.container.querySelector('#txtName');\r\n\t\t\ttextName.value = '';\r\n\t\t\tconst selDistance = this.container.querySelector('#selDistance');\r\n\t\t\tconst textZip = this.container.querySelector('#txtZip');\r\n\t\t\tselDistance.value = searchValue.distance;\r\n\t\t\ttextZip.value = searchValue.valueString;\r\n\t\t}\r\n\t\tif (strFilterName === 'name') {\r\n\t\t\tconst textZip = this.container.querySelector('#txtZip');\r\n\t\t\ttextZip.value = '';\r\n\t\t\tconst textName = this.container.querySelector('#txtName');\r\n\t\t\ttextName.value = searchValue.valueString;\r\n\t\t}\r\n\t\tif (strFilterName === 'language') {\r\n\t\t\t// uncheck all language inputs that are selected in the div with the searchLang class\r\n\t\t\tconst nlLangInputs = this.container.querySelectorAll('.searchLang input');\r\n\t\t\tnlLangInputs.forEach((input) => {\r\n\t\t\t\tinput.checked = false;\r\n\t\t\t});\r\n\t\t\t// check the language inputs that are in the searchValue array\r\n\t\t\tsearchValue.forEach((lang) => {\r\n\t\t\t\tconst input = this.container.querySelector(`input[value=\"${lang}\"]`);\r\n\t\t\t\tinput.checked = true;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tasync updateUrlListeners(pushStateBool) {\r\n\t\tlet url = new URL(window.location.href);\r\n\t\tlet searchParams = new URLSearchParams(url.search);\r\n\t\tconst nlWant = this.container.querySelector('.want:checked');\r\n\t\tconst searchOption = this.container.querySelector('.searchOption:checked');\r\n\t\tconst txtZip = this.container.querySelector('#txtZip').value;\r\n\t\tconst selDistance = this.container.querySelector('#selDistance').value;\r\n\t\tconst txtName = this.container.querySelector('#txtName').value;\r\n\t\tlet searchLang = Array.from(\r\n\t\t\tthis.container.querySelectorAll('.searchLang input:checked')\r\n\t\t).map((input) => input.value);\r\n\r\n\t\tif (nlWant) {\r\n\t\t\tsearchParams.set('want', nlWant.value);\r\n\t\t}\r\n\t\tif (searchOption) {\r\n\t\t\tsearchParams.set('searchBy', searchOption.value);\r\n\t\t}\r\n\t\tif (searchLang.length > 0) {\r\n\t\t\tsearchParams.set('language', searchLang.join(','));\r\n\t\t} else {\r\n\t\t\tsearchParams.delete('language');\r\n\t\t}\r\n\t\tif (txtZip && searchOption.value === 'location') {\r\n\t\t\tsearchParams.set('searchValue', `${txtZip}:${selDistance}`);\r\n\t\t}\r\n\t\tif (txtName && searchOption.value === 'name') {\r\n\t\t\tsearchParams.set('searchValue', `${txtName}:null`);\r\n\t\t}\r\n\t\tif (!txtZip && !txtName) {\r\n\t\t\tsearchParams.delete('searchValue');\r\n\t\t}\r\n\t\tif (pushStateBool) {\r\n\t\t\twindow.history.pushState(\r\n\t\t\t\t{\r\n\t\t\t\t\trandomid: Math.random(),\r\n\t\t\t\t},\r\n\t\t\t\t'',\r\n\t\t\t\t`${url.pathname}?${searchParams}`\r\n\t\t\t);\r\n\t\t\tconsole.log(window.history.state);\r\n\t\t}\r\n\t}\r\n\r\n\tgetWindowSearchParams() {\r\n\t\tlet urlParams = {\r\n\t\t\twant: {\r\n\t\t\t\tvalue: 'all',\r\n\t\t\t},\r\n\t\t\tsearchBy: {\r\n\t\t\t\tvalue: 'location',\r\n\t\t\t},\r\n\t\t\tsearchValue: {\r\n\t\t\t\tvalue: {\r\n\t\t\t\t\tvalueString: '',\r\n\t\t\t\t\tdistance: 10, //distance: 25, to distance: 10,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tlanguage: {\r\n\t\t\t\tvalue: [],\r\n\t\t\t},\r\n\t\t\turlSearch: true,\r\n\t\t};\r\n\r\n\t\tlet searchParams = new URLSearchParams(window.location.search);\r\n\t\t//if the search params do not include the params for want,searchBy,language or searchValue set urlParams to false\r\n\t\tif (\r\n\t\t\t!searchParams.has('want') &&\r\n\t\t\t!searchParams.has('searchBy') &&\r\n\t\t\t!searchParams.has('language') &&\r\n\t\t\t!searchParams.has('searchValue')\r\n\t\t) {\r\n\t\t\turlParams.urlSearch = false;\r\n\t\t\treturn urlParams;\r\n\t\t} else {\r\n\t\t\turlParams.urlSearch = true;\r\n\t\t\tfor (const [key, value] of searchParams) {\r\n\t\t\t\tif (key === 'language') {\r\n\t\t\t\t\turlParams[key].value = value.split(',');\r\n\t\t\t\t}\r\n\t\t\t\tif (key === 'searchValue') {\r\n\t\t\t\t\t//seperate into an object on a colon as a delimiter, then assign to zip and distance\r\n\t\t\t\t\tlet searchValue = value.split(':');\r\n\t\t\t\t\turlParams[key].value.valueString = searchValue[0];\r\n\t\t\t\t\turlParams[key].value.distance = searchValue[1];\r\n\t\t\t\t}\r\n\t\t\t\tif (key !== 'language' && key !== 'searchValue') {\r\n\t\t\t\t\turlParams[key].value = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn urlParams;\r\n\t\t}\r\n\t}\r\n\r\n\t// the hydrate method is called when a component has been compiled into the page at runtime\r\n\t// this gives the opportunity to add any event handlers to the HTML that has been inserted into the page\r\n\tasync hydrate(container) {\r\n\t\t// TODO are the comments in hydrate actionable, or just notes for future us? Can we be more clear?\r\n\r\n\t\tthis.container = container;\r\n\t\tthis.blFirstCompileLoad = true;\r\n\t\tconst nlResults = this.container.querySelectorAll('.result');\r\n\t\tthis.container.state = {\r\n\t\t\tnlAllResults: nlResults,\r\n\t\t\tnlFilteredResults: false,\r\n\t\t\tnlSortedResults: false,\r\n\t\t};\r\n\t\t// Need to avoid using this.renderComponent; it will cause the component to be re-rendered\r\n\t\tthis.checkFontFace();\r\n\t\tawait this.addEventListeners();\r\n\t\tawait this.updateUrlListeners();\r\n\r\n\t\t//check for url params, needs to be after event listeners are added so that it can trigger the click events\r\n\t\tconst searchParamerters = this.getWindowSearchParams();\r\n\t\tconsole.log(searchParamerters);\r\n\t\tif (searchParamerters?.urlSearch) {\r\n\t\t\tthis.reselectFiltersOnUrlSearch('want', searchParamerters.want.value);\r\n\t\t\tthis.reselectFiltersOnUrlSearch('searchBy', searchParamerters.searchBy.value);\r\n\t\t\t//if the searchBy is location, then we need to set the distance and zip code\r\n\t\t\tif (searchParamerters.searchBy.value === 'location') {\r\n\t\t\t\tthis.reselectFiltersOnUrlSearch('location', searchParamerters.searchValue.value);\r\n\t\t\t} else {\r\n\t\t\t\tthis.reselectFiltersOnUrlSearch('name', searchParamerters.searchValue.value);\r\n\t\t\t}\r\n\t\t\tthis.reselectFiltersOnUrlSearch('language', searchParamerters.language.value);\r\n\r\n\t\t\t//click\tthe search button\r\n\t\t\tthis.container.querySelector('.filterBtn').click();\r\n\t\t}\r\n\r\n\t\tthis.handlePageDisplay();\r\n\t\tthis.handlePaginationUpdate();\r\n\t\t// Need to avoid using this.navigatePage; it will cause the component to be re-rendered\r\n\t\t// We will try to put as much logic as possible into commonClass\r\n\t}\r\n\r\n\t// the render method is called to render the component dynamically onto the page\r\n\tasync render(container) {\r\n\t\tthis.container = container;\r\n\t\tawait this.renderComponent();\r\n\t\tconst nlResults = this.container.querySelectorAll('.result');\r\n\t\tthis.container.state = {\r\n\t\t\tnlAllResults: nlResults,\r\n\t\t\tnlFilteredResults: false,\r\n\t\t\tnlSortedResults: false,\r\n\t\t};\r\n\t\tconst totalResults = container.querySelectorAll('.resultsList .result').length;\r\n\t\tconst pagingHTML = this.shared.buildNavigation(1, totalResults);\r\n\t\tthis.container.querySelector('.resultPaging').innerHTML = pagingHTML;\r\n\t\tawait this.hydrate(container);\r\n\t}\r\n}\r\n"],"names":["CommonUtils","constructor","config","this","Mustache","componentLayout","customSettingsData","template","contentClient","model","pageLocale","mode","setModel","formatPhoneNumber","strPhoneNumber","arSplitNumber","replace","match","fetchLenderData","isCompile","arLenderData","queryItems","q","fields","limit","compileLenderData","buildBadgeMap","arBadgeList","arBadges","mapBadgeData","Map","arBadge","arBadgeData","split","lastWord","pop","badgeYear","isNaN","badgeText","substring","lastIndexOf","objBadge","id","parentId","year","name","set","customExpand","text","strOutput","expandMacros","e","console","log","url","clearBtn","columnHeaders","languages","resultsHeader","search","searchBtn","services","distanceText","misc","rehabHomeTooltip","fixUpHomeTooltip","nls","servicesText","buy_first_home","value","buy_new_home","home_improvement_loans","refinance","rehabilitation_emergency","objResult","items","pageNumber","Math","floor","indexOf","phone_number","headshot","getRenditionURL","logo","service_type","servicesOffered","map","service","badges","numLangIndex","splice","sort","taxonomyData","taxonomies","data","length","arCategories","categories","category","has","push","get","arLenderResults","shuffleArray","item","arLanguageFilters","buildLanguageFilters","tooltips","rehab","fixUp","lenderData","languageFilters","languageFilterClass","iWantFilters","buildWantFilters","pageNumbers","Array","from","ceil","keys","i","Object","assign","numPages","array","j","random","all","desc","description","checked","index","tooltip","setLangFilter","Set","arLanguageList","arLeftCol","arRightCol","objLender","lender","add","trim","intPerColumn","slice","zipMerge","arLeft","arRight","buildNavigation","numCurrentPage","totalResults","numTotalResults","numTotalPages","numLowerBound","numUpperBound","pagingArray","abs","numUBoundOffset","numOffset","paginationResults","buildPagingHTML","arPages","resultCount","currentResults","strClassList","strDisabledForward","strDisabledBackward","strHtmlTemplate","element","renderMustacheTemplate","render","error","args","viewMode","assetsPath","sitesSDK","SitesSDK","SCSRenderAPI","getMustache","sectionLayoutData","getProperty","renderMode","getRenderMode","shared","filters","mpZipCode","loadZipValues","reqZips","fetch","json","zipCodes","forEach","objZip","zip","latitude","longitude","checkFontFace","document","fonts","check","querySelector","classList","validateZip","zipCode","getElementById","innerHTML","notifications","zipNotice","style","display","confirmSiteExit","strUrl","self","modalTemplate","confirmationTitle","confirmationMessage","confirmationCancelButtonText","confirmationContinueButtonText","insertAdjacentHTML","modal","modalHeight","offsetHeight","addEventListener","closeModal","keyListen","event","key","removeEventListener","window","open","remove","clearUrlParams","location","history","pushState","title","pathname","hash","addEventListeners","_this","searchParamerters","getWindowSearchParams","urlSearch","reselectFiltersOnUrlSearch","want","searchBy","searchValue","language","filterFunction","querySelectorAll","rdoButton","elTarget","elActive","pushStateBool","arguments","undefined","updateUrlListeners","container","dataset","numactive","languageList","blValidZip","type","distance","filterLenderData","searchFields","field","click","clearFilters","lang","removeAttribute","sortButtons","btn","sortEvent","target","sorttype","className","preventDefault","getAttribute","addPaginationListeners","tooltipLists","tooltipList","tooltipButton","tooltipDialog","contains","activeTooltip","setAttribute","executeResizeCb","debounce","closest","func","timeout","wait","_len","_key","clearTimeout","setTimeout","later","dialog","scsContentContainer","left","innerWidth","tooltipButtonLeft","getBoundingClientRect","findParentByClass","el","parentElement","sortLenders","props","strCriteria","strSortOrder","a","b","aHasName","bHasName","compareA","innerText","compareB","localeCompare","aDistance","Number","MAX_VALUE","bDistance","parseFloat","aLanguages","bLanguages","aProducers","bProducers","parseInt","blIsMobile","blValidAddressSort","sortState","arLenders","state","nlFilteredResults","nlAllResults","filter","pagenum","obSortCriteria","strSortState","sortorder","nlSortedResults","updatePageNumbers","handlePageDisplay","handlePaginationUpdate","lastPage","pageno","pageNum","elButtons","elSearchTypes","elButton","elSearchType","lenders","newPagination","filterLanguages","filteredLenders","arLangFilter","extractedLang","some","includes","filterSearchBy","arFilter","strSearchValue","toLowerCase","strFirstName","firstname","strLastName","lastname","toLocaleLowerCase","strDistanceType","lenderAddress","lenderLatitude","lenderLongitude","lenderCoordinates","ftDistance","distanceBetweenLocations","distanceLabel","toFixed","fromSearchLabel","jsMobileSort","serviceTypes","elResultItems","elNoResults","dfFilteredLenders","createDocumentFragment","appendChild","arOrigin","arDestination","toRad","x","PI","orLat","orLong","deLat","deLong","dLat","dLong","sqRtValue","pow","sin","cos","asin","sqrt","isWithinRange","n","y","numActivePage","pages","dfLenders","blFirstCompileLoad","replaceChildren","prev","next","first","last","numResults","paginationItems","dfPagination","renderComponent","strTemplate","importText","importCSS","objCommonContext","urlSearchObject","commonClass","componentHtml","lenderSearchElem","scrollIntoView","behavior","block","activePage","toString","strFilterName","radioInput","selDistance","textZip","valueString","input","URL","href","searchParams","URLSearchParams","nlWant","searchOption","txtZip","txtName","searchLang","join","delete","randomid","urlParams","hydrate","nlResults","pagingHTML"],"mappings":"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"}