{"version":3,"file":"analysis.js","sources":["analysis.js"],"sourcesContent":["class Analysis {\n constructor(companiesConsidered, cutoff, modelCode, title, listID) {\n this.fields = [];\n this.modelCode = modelCode;\n this.companiesConsidered = companiesConsidered;\n this.cutoff = cutoff;\n this.listSize;\n this.bestEstimateTotalEmployees;\n this.bestEstimateTotalEmployeesCompaniesUsed;\n this.bestEstimateTotalTurnover;\n this.bestEstimateTotalTurnoverCompaniesUsed;\n this.companiesWithDealroomFunding;\n this.totalDealroomFunding;\n this.totalInnovateUkFunding;\n this.title = title;\n this.listID = listID;\n this.bestEstimateGrowthPercentagePerYear;\n this.totalInnovateUKGrantsWon;\n this.bestEstimateGVA;\n this.bestEstimateGVACompaniesUsed;\n this.femaleDirectors;\n this.maleDirectors;\n this.unknownGenderDirectors;\n this.womenLedCompanies;\n this.womenFoundedCompanies;\n this.summaryTable;\n this.companiesWithAnomalies;\n this.filtersObject = null;\n this.filtersForSearch = null;\n this.listFiltersDescription;\n }\n\n getAnalysis(filtersForSearch, callback, callbackArguments) {\n let method, url, input;\n const self = this;\n\n method = \"POST\";\n url = `../api/analyse/analyse_actions.php?action=calculate&modelcode=${this.modelCode}&cutoff=${this.cutoff}${(this.comparisonGroup) ? \"&compare=true\" : \"\"}`;\n input = {\n model_code: this.modelCode,\n cutoff: this.cutoff\n }\n Object.assign(input, filtersForSearch);\n this.filtersForSearch = input;\n\n const getListInsightsSuccess = function (response) {\n const analysisResponse = JSON.parse(response);\n self.processAnalysisResponse(analysisResponse);\n callback(callbackArguments, filtersForSearch);\n }\n\n const getListInsightsError = function () {\n console.log(\"Error getting list insights\");\n }\n\n coreFunctions.xhrHelper(method, url, getListInsightsSuccess, getListInsightsError, JSON.stringify(input));\n }\n\n getSummaryTableData(filtersForSearch, callback, callbackArguments) {\n let method, url, input;\n const self = this;\n\n method = \"POST\";\n url = `../api/analyse/analyse_actions.php?action=summary_table`;\n\n filtersForSearch.filters.CompanyStatus = 'Active';\n input = filtersForSearch;\n\n console.log(input)\n\n const getSummaryTableSuccess = function (response) {\n const summaryTableResponse = JSON.parse(response);\n self.processSummaryTableData(summaryTableResponse);\n }\n\n const getSummaryTableError = function () {\n console.log(\"Error getting list insights\");\n }\n\n coreFunctions.xhrHelper(method, url, getSummaryTableSuccess, getSummaryTableError, JSON.stringify(input));\n }\n\n formatKnowledgeBaseTooltipLink(url, text = \"Find out more\", anchorText = \"here\") {\n return `${text} ${anchorText}.`;\n }\n\n processAnalysisResponse(analysisResponse) {\n let locationQuotientDescription, tooltipText;\n const self = this;\n\n const mapAttributions = \"

Map attributions: Leaflet | © OpenStreetMap contributors © CARTO
\";\n const lightcastDataExplainer = \"Job postings data is sourced from Lightcast.\";\n const locationsKnowledgeBaseLink = this.formatKnowledgeBaseTooltipLink(\"https://help.thedatacity.com/knowledge/using-analyse#locations\", \"Find out more about interpreting location results\");\n const keywordsKnowledgeBaseLink = this.formatKnowledgeBaseTooltipLink(\"https://help.thedatacity.com/knowledge/using-analyse#sector-innovation-keywords\");\n const rticsAndSectorsKnowledgeBaseLink = this.formatKnowledgeBaseTooltipLink(\"https://help.thedatacity.com/knowledge/using-analyse#rtics-and-sectors\", \"Find out more about interpreting RTIC and sector results\");\n const companyDetailsKnowledgeBaseLink = this.formatKnowledgeBaseTooltipLink(\"https://help.thedatacity.com/knowledge/using-analyse#company-details\");\n const lightcastLink = ``;\n\n coreFunctions.checkForDebugMessages(analysisResponse);\n //this.resetAnalysis().updateAnalysis(analysisResponse, companyListObject, returnCount);\n this.resetAnalysis().updateAnalysis(analysisResponse, null, null);\n\n // TODO check this works with compare\n //this.updateUrlAddressQuery();\n\n if (this.analysisFieldAvailable(analysisResponse, \"LANameCounts\") && analysisResponse.LANameCounts.length > 0) {\n this.newAnalysisField(\"LANameCounts\", \"Business counts by local authority\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"Local authority\", null, false, \"LANames\", \"Local authority\").addAnalysisFieldElements(analysisResponse.LANameCounts, \"Thing\").addTotalCount(analysisResponse.CompaniesConsidered);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"EmployeesByLA\") && analysisResponse.EmployeesByLA.length > 0) {\n this.newAnalysisField(\"EmployeesByLA\", \"Employees by local authority\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"Local authority\", null, false, \"LANames\", \"Local authority\").addAnalysisFieldElements(analysisResponse.EmployeesByLA, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalEmployees);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TurnoversByLA\") && analysisResponse.TurnoversByLA.length > 0) {\n this.newAnalysisField(\"TurnoversByLA\", \"Turnovers by local authority\", \"Locations\", \"currency\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"Local authority\", null, false, \"LANames\", \"Local authority\").addAnalysisFieldElements(analysisResponse.TurnoversByLA, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalTurnover);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CityCounts\") && analysisResponse.CityCounts.length > 0) {\n this.newAnalysisField(\"CityCounts\", \"Business counts by city\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"Standardised city\", \"Not in a major city\", false, \"Cities\", \"OECD functional urban area\").addAnalysisFieldElements(analysisResponse.CityCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"EmployeesByCity\") && analysisResponse.EmployeesByCity.length > 0) {\n this.newAnalysisField(\"EmployeesByCity\", \"Employees by city\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"Standardised city\", \"Not in a major city\", false, \"Cities\", \"OECD functional urban area\").addAnalysisFieldElements(analysisResponse.EmployeesByCity, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TurnoversByCity\") && analysisResponse.TurnoversByCity.length > 0) {\n this.newAnalysisField(\"TurnoversByCity\", \"Turnovers by city\", \"Locations\", \"currency\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"Standardised city\", \"Not in a major city\", false, \"Cities\", \"OECD functional urban area\").addAnalysisFieldElements(analysisResponse.TurnoversByCity, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"ConstituencyCounts\") && analysisResponse.ConstituencyCounts.length > 0) {\n this.newAnalysisField(\"ConstituencyCounts\", \"Business counts by constituency\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"Constituency\", null, false, \"Constituencies\", \"Constituencies\").addAnalysisFieldElements(analysisResponse.ConstituencyCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"EmployeesByConstituency\") && analysisResponse.EmployeesByConstituency.length > 0) {\n this.newAnalysisField(\"EmployeesByConstituency\", \"Employees by constituency\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"Constituency\", null, false, \"Constituencies\", \"Constituencies\").addAnalysisFieldElements(analysisResponse.EmployeesByConstituency, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TurnoversByConstituency\") && analysisResponse.TurnoversByConstituency.length > 0) {\n this.newAnalysisField(\"TurnoversByConstituency\", \"Turnovers by constituency\", \"Locations\", \"currency\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"Constituency\", null, false, \"Constituencies\", \"Constituencies\").addAnalysisFieldElements(analysisResponse.TurnoversByConstituency, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"LEPCounts\") && analysisResponse.LEPCounts.length > 0) {\n this.newAnalysisField(\"LEPCounts\", \"Business counts by LEP\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"LEP\", \"Not in a LEP\", false, \"LEPNames\", \"Local enterprise partnerships\").addAnalysisFieldElements(analysisResponse.LEPCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"EmployeesByLEP\") && analysisResponse.EmployeesByLEP.length > 0) {\n this.newAnalysisField(\"EmployeesByLEP\", \"Employees by LEP\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"LEP\", \"Not in a LEP\", false, \"LEPNames\", \"Local enterprise partnerships\").addAnalysisFieldElements(analysisResponse.EmployeesByLEP, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalEmployees);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TurnoversByLEP\") && analysisResponse.TurnoversByLEP.length > 0) {\n this.newAnalysisField(\"TurnoversByLEP\", \"Turnovers by LEP\", \"Locations\", \"currency\", `${locationsKnowledgeBaseLink}${mapAttributions}`, \"bar\", [\"bar\"], \"LEP\", \"Not in a LEP\", false, \"LEPNames\", \"Local enterprise partnerships\").addAnalysisFieldElements(analysisResponse.TurnoversByLEP, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalTurnover);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"NUTS1Counts\") && analysisResponse.NUTS1Counts.length > 0) {\n this.newAnalysisField(\"NUTS1Counts\", \"Business counts by ITL1 region\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"ITL1 region\", null, false, \"ITL1\", \"ITL1 region\").addAnalysisFieldElements(analysisResponse.NUTS1Counts, \"Name\").addTotalCount(analysisResponse.CompaniesConsidered);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"EmployeesByITL1\") && analysisResponse.EmployeesByITL1.length > 0) {\n this.newAnalysisField(\"EmployeesByITL1\", \"Employees by ITL1 region\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"ITL1 region\", null, false, \"ITL1\", \"ITL1 region\").addAnalysisFieldElements(analysisResponse.EmployeesByITL1, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalEmployees);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TurnoversByITL1\") && analysisResponse.TurnoversByITL1.length > 0) {\n this.newAnalysisField(\"TurnoversByITL1\", \"Turnovers by ITL1 region\", \"Locations\", \"currency\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"ITL1 region\", null, false, \"ITL1\", \"ITL1 region\").addAnalysisFieldElements(analysisResponse.TurnoversByITL1, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalTurnover);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"NUTS2CodeCounts\") && analysisResponse.NUTS2CodeCounts.length > 0) {\n this.newAnalysisField(\"NUTS2CodeCounts\", \"Business counts by ITL2 region\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"ITL2 region\", null, false, \"ITL2\", \"ITL2 region\").addAnalysisFieldElements(analysisResponse.NUTS2CodeCounts, \"ID\").addTotalCount(analysisResponse.CompaniesConsidered);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"EmployeesByITL2\") && analysisResponse.EmployeesByITL2.length > 0) {\n this.newAnalysisField(\"EmployeesByITL2\", \"Employees by ITL2 region\", \"Locations\", \"numerical\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"ITL2 region\", null, false, \"ITL2\", \"ITL2 region\").addAnalysisFieldElements(analysisResponse.EmployeesByITL2, \"ID\").addTotalCount(analysisResponse.BestEstimateTotalEmployees);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TurnoversByITL2\") && analysisResponse.TurnoversByITL2.length > 0) {\n this.newAnalysisField(\"TurnoversByITL2\", \"Turnovers by ITL2 region\", \"Locations\", \"currency\", `${locationsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"ITL2 region\", null, false, \"ITL2\", \"ITL2 region\").addAnalysisFieldElements(analysisResponse.TurnoversByITL2, \"ID\").addTotalCount(analysisResponse.BestEstimateTotalTurnover);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"UltimateParentNationsCounts\") && analysisResponse.UltimateParentNationsCounts.length > 0) {\n this.newAnalysisField(\"UltimateParentNationsCounts\", `Business counts by ultimate parent nation`, \"Locations\", \"numerical\", null, \"bar\", [\"bar\"], \"Ultimate parent nation\", null, false, \"UltimateParentCompanyNation\", \"Ultimate parent company nation\").addAnalysisFieldElements(analysisResponse.UltimateParentNationsCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"UltimateParentNationsEmployees\") && analysisResponse.UltimateParentNationsEmployees.length > 0) {\n this.newAnalysisField(\"UltimateParentNationsEmployees\", `Employees by ultimate parent nation`, \"Locations\", \"numerical\", null, \"bar\", [\"bar\"], \"Ultimate parent nation\", null, false, \"UltimateParentCompanyNation\", \"Ultimate parent company nation\").addAnalysisFieldElements(analysisResponse.UltimateParentNationsEmployees, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"UltimateParentNationsTurnovers\") && analysisResponse.UltimateParentNationsTurnovers.length > 0) {\n this.newAnalysisField(\"UltimateParentNationsTurnovers\", `Turnovers by ultimate parent nation`, \"Locations\", \"currency\", null, \"bar\", [\"bar\"], \"Ultimate parent nation\", null, false, \"UltimateParentCompanyNation\", \"Ultimate parent company nation\").addAnalysisFieldElements(analysisResponse.UltimateParentNationsTurnovers, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SectorKeywordCounts\") && analysisResponse.SectorKeywordCounts.length > 0) {\n this.newAnalysisField(\"SectorKeywordCounts\", \"Sector keyword counts\", \"Website keywords\", \"numerical\", `We maintain a list of keywords that are indicative of a company operating in a specific sector. This chart shows the number of companies whose websites contain those words.${keywordsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"Sector keyword\", null, true, null, \"Sector keywords\").addAnalysisFieldElements(analysisResponse.SectorKeywordCounts, \"Thing\").addTotalCount(analysisResponse.CompaniesConsidered);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SectorKeywordEnrichment\") && analysisResponse.SectorKeywordEnrichment.length > 0) {\n this.newAnalysisField(\"SectorKeywordEnrichment\", \"Sector keywords enrichment\", \"Website keywords\", \"percentage\", `The sector keywords that are over-represented and under-represented among your companies compared to the average UK company. For example, a value of \\\"Social Media +95%\\\" means that the companies in your list and matching your filters are 95% more likely to mention the phrase \\\"social media\\\" on their website than the average UK company.${keywordsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"Sector keyword\", null, false, null, \"Sector keywords\").addAnalysisFieldElements(analysisResponse.SectorKeywordEnrichment, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"InnovationKeywordCounts\") && analysisResponse.InnovationKeywordCounts.length > 0) {\n this.newAnalysisField(\"InnovationKeywordCounts\", \"Innovation keyword counts\", \"Website keywords\", \"numerical\", `We maintain a list of keywords that suggest that a company may be innovative. This chart shows the number of companies whose websites contain those words.${keywordsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"Innovation keyword\", null, true, null, \"Innovation keywords\").addAnalysisFieldElements(analysisResponse.InnovationKeywordCounts, \"Thing\").addTotalCount(analysisResponse.CompaniesConsidered);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"InnovationKeywordEnrichment\") && analysisResponse.InnovationKeywordEnrichment.length > 0) {\n this.newAnalysisField(\"InnovationKeywordEnrichment\", \"Innovation keywords enrichment\", \"Website keywords\", \"percentage\", `The sector keywords that are over-represented and under-represented among your companies compared to the average UK company. For example, a value of \\\"Export +200%\\\" means that the companies in your list and matching your filters are 200% more likely (3x) to mention the phrase \\\"export\\\" on their website than the average UK company.${keywordsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"Innovation keyword\", null, false, null, \"Innovation keywords\").addAnalysisFieldElements(analysisResponse.InnovationKeywordEnrichment, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"FounderGenderBusinessCounts\") && analysisResponse.FounderGenderBusinessCounts.length > 0) {\n const founderGenderTooltip = \"For more information on how we define female founders, as well as how we recommend using this data, please read this article\";\n // Configure stacked barchart fields can be shared between others\n let stackedBarchartOptions = {\n sharedFieldId: \"mixed\",\n fieldIdsSharingMixedTotal: [\"women\", \"men\"]\n }\n this.newAnalysisField(\"FounderGenderBusinessCounts\", \"Business counts by founder gender\", \"Company details\", \"numerical\", founderGenderTooltip, \"bar_stacked\", [\"bar_stacked\"], \"Gender\", null, false, null, \"People\", stackedBarchartOptions).addAnalysisFieldElements(analysisResponse.FounderGenderBusinessCounts, \"Name\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CompanySizeEmployees\") && analysisResponse.CompanySizeEmployees.length > 0) {\n this.newAnalysisField(\"CompanySizeEmployees\", \"Company size by employees\", \"Company details\", \"numerical\", null, \"bar\", [\"bar\"], \"Company size\", null, false, null, \"People\").addAnalysisFieldElements(analysisResponse.CompanySizeEmployees, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"EmployeesByYear\")) {\n this.newAnalysisField(\"EmployeesByYear\", \"Employees by year\", \"Company details\", \"numerical\", null, \"line\", [\"bar\", \"line\"], null, null, false, null, \"People\").addAnalysisFinancialFieldElements(analysisResponse.EmployeesByYear.MeasuredYearValues, analysisResponse.EmployeesByYear.ProjectedYearValues).createTopCompanies(analysisResponse.EmployeesByYear.TopCompanies ?? null, true);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CompaniesActiveOrStruckoff\") && analysisResponse.CompaniesActiveOrStruckoff.length > 0) {\n this.newAnalysisField(\"CompaniesActiveOrStruckoff\", \"Company active or struck off\", \"Company details\", \"numerical\", null, \"bar\", [\"bar\"], \"Company status\", null, false, null, \"Company growth\").addAnalysisFieldElements(analysisResponse.CompaniesActiveOrStruckoff, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CompanyStatuses\") && analysisResponse.CompanyStatuses.length > 0) {\n this.newAnalysisField(\"CompanyStatuses\", \"Company status\", \"Company details\", \"numerical\", null, \"bar\", [\"bar\"], \"Company status\", null, false, null, \"Company growth\").addAnalysisFieldElements(analysisResponse.CompanyStatuses, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CompanyGrowthStages\") && analysisResponse.CompanyGrowthStages.length > 0) {\n const companySizeTooltip = \"Our company sizes are based on the UK's legislative definition on company sizes. You can read more about the categorisation here.\";\n this.newAnalysisField(\"CompanyGrowthStages\", \"Company size\", \"Company details\", \"numerical\", companySizeTooltip, \"bar\", [\"bar\"], \"Growth stage\", null, false, null, \"Company growth\").addAnalysisFieldElements(analysisResponse.CompanyGrowthStages, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CompanyGrowthRates\") && analysisResponse.CompanyGrowthRates.length > 0) {\n this.newAnalysisField(\"CompanyGrowthRates\", \"Company growth rate\", \"Company details\", \"numerical\", null, \"bar\", [\"bar\"], \"Growth rate\", null, false, null, \"Company growth\").addAnalysisFieldElements(analysisResponse.CompanyGrowthRates, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"JobPostingInsights\") && analysisResponse.JobPostingInsights.length > 0) {\n const charts = [{\n type: \"table\",\n title: \"Jobs table\",\n subfield: \"jobinsights\",\n headings: [\"SOC4 code\", \"SOC4 name\", \"Postings\", \"Median salary\"],\n title: \"Job postings (SOC4)\",\n columns: [\n new DataTableColumn(\"soc4Code\", \"text\"),\n new DataTableColumn (\"soc4Name\", \"text\"),\n new DataTableColumn(\"postings\", \"number\"),\n new DataTableColumn(\"medianSalary\", \"currency\")\n ],\n drilldown: {\n keyField: \"soc4Code\",\n labelField: \"soc4Name\",\n chart: \"line\"\n }\n }, {\n type: \"line\",\n subtype: \"timestamp\",\n title: \"Job postings over time\",\n subfield: \"jobinsights\",\n defaults: {\n field: \"soc4Code\",\n label: \"All\",\n value: \"All\"\n }\n }\n ];\n this.newAnalysisField(\"JobPostingInsights\", \"Job insights\", \"Jobs and skills\", \"numerical\", lightcastDataExplainer, charts, [\"line\"], \"Year\", null, false, null, \"Job posting insights\").addJobPostingInsightsElements(analysisResponse.JobPostingInsights);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CompanyJobPostingsOverTimeBySOC4\") && analysisResponse.CompanyJobPostingsOverTimeBySOC4.length > 0) {\n this.newAnalysisField(\"CompanyJobPostingsOverTimeBySOC4\", \"Job postings over time (SOC4)\", \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"line\", [\"line\"], \"Timestamp\", null, false, null, \"SOC4\").addAnalysisFieldElements(this.processJobPostingsOverTimeData(analysisResponse.CompanyJobPostingsOverTimeBySOC4), \"Thing\");\n }\n\n if (this.analysisFieldAvailable(analysisResponse, \"CompanyJobPostingsOverTimeByLOT\") && analysisResponse.CompanyJobPostingsOverTimeByLOT.length > 0) {\n this.newAnalysisField(\"CompanyJobPostingsOverTimeByLOT\", \"Job postings over time (LOT)\", \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"line\", [\"line\"], \"Timestamp\", null, false, null, \"LOT\").addAnalysisFieldElements(this.processJobPostingsOverTimeData(analysisResponse.CompanyJobPostingsOverTimeByLOT), \"Thing\");\n }\n\n if (this.analysisFieldAvailable(analysisResponse, \"JobPostingsBySOC4Name\") && analysisResponse.JobPostingsBySOC4Name.length > 0) {\n this.newAnalysisField(\"JobPostingsBySOC4Name\", `Job postings by SOC4 name`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"SOC4 Name\", null, false, null, \"SOC4\").addAnalysisFieldElements(analysisResponse.JobPostingsBySOC4Name, \"Thing\");\n }\n // if (this.analysisFieldAvailable(analysisResponse, \"JobPostingsBySOC4Code\") && analysisResponse.JobPostingsBySOC4Code.length > 0) {\n // this.newAnalysisField(\"JobPostingsBySOC4Code\", `Job postings by SOC4 code`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"SOC4 Code\", null, false, null, \"SOC4 code\").addAnalysisFieldElements(analysisResponse.JobPostingsBySOC4Code, \"Thing\");\n // }\n if (this.analysisFieldAvailable(analysisResponse, \"AverageAdvertisedSalaryBySOC4Name\") && analysisResponse.AverageAdvertisedSalaryBySOC4Name.length > 0) {\n this.newAnalysisField(\"AverageAdvertisedSalaryBySOC4Name\", `Average advertised salary by SOC4 name`, \"Jobs and skills\", \"currency\", lightcastDataExplainer, \"bar\", [\"bar\"], \"SOC4 Name\", null, false, null, \"SOC4\").addAnalysisFieldElements(analysisResponse.AverageAdvertisedSalaryBySOC4Name, \"Thing\");\n }\n // if (this.analysisFieldAvailable(analysisResponse, \"AverageAdvertisedSalaryBySOC4Code\") && analysisResponse.AverageAdvertisedSalaryBySOC4Code.length > 0) {\n // this.newAnalysisField(\"AverageAdvertisedSalaryBySOC4Code\", `Average advertised salary by SOC4 code`, \"Jobs and skills\", \"currency\", lightcastDataExplainer, \"bar\", [\"bar\"], \"SOC4 Code\", null, false, null, \"SOC4 code\").addAnalysisFieldElements(analysisResponse.AverageAdvertisedSalaryBySOC4Code, \"Thing\");\n // }\n if (this.analysisFieldAvailable(analysisResponse, \"JobPostingsBySkill\") && analysisResponse.JobPostingsBySkill.length > 0) {\n this.newAnalysisField(\"JobPostingsBySkill\", `Jobs postings by skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.JobPostingsBySkill.slice(0, 520), \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"AveragePostingDurationBySkill\") && analysisResponse.AveragePostingDurationBySkill.length > 0) {\n this.newAnalysisField(\"AveragePostingDurationBySkill\", `Average posting duration by skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.AveragePostingDurationBySkill.slice(0, 520), \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse,'JobPostingsBySoftwareSkill')) {\n this.newAnalysisField(\"JobPostingsBySoftwareSkill\", `Job postings by software skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.JobPostingsBySoftwareSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"AveragePostingDurationBySoftwareSkill\") && analysisResponse.AveragePostingDurationBySoftwareSkill.length > 0) {\n this.newAnalysisField(\"AveragePostingDurationBySoftwareSkill\", `Average posting duration by software skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.AveragePostingDurationBySoftwareSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse,'JobPostingsBySpecializedSkill')) {\n this.newAnalysisField(\"JobPostingsBySpecializedSkill\", `Job postings by specialised skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.JobPostingsBySpecializedSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"AveragePostingDurationBySpecializedSkill\") && analysisResponse.AveragePostingDurationBySpecializedSkill.length > 0) {\n this.newAnalysisField(\"AveragePostingDurationBySpecializedSkill\", `Average posting duration by specialised skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.AveragePostingDurationBySpecializedSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse,'JobPostingsByCertificationsSkill')) {\n this.newAnalysisField(\"JobPostingsByCertificationsSkill\", `Job postings by certification skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.JobPostingsByCertificationsSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"AveragePostingDurationByCertificationsSkill\") && analysisResponse.AveragePostingDurationByCertificationsSkill.length > 0) {\n this.newAnalysisField(\"AveragePostingDurationByCertificationsSkill\", `Average posting duration by certification skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.AveragePostingDurationByCertificationsSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse,'JobPostingsByCommonSkill')) {\n this.newAnalysisField(\"JobPostingsByCommonSkill\", `Job postings by common skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.JobPostingsByCommonSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"AveragePostingDurationByCommonSkill\") && analysisResponse.AveragePostingDurationByCommonSkill.length > 0) {\n this.newAnalysisField(\"AveragePostingDurationByCommonSkill\", `Average posting duration by common skill`, \"Jobs and skills\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"Skill\", null, false, null, \"Skills\").addAnalysisFieldElements(analysisResponse.AveragePostingDurationByCommonSkill, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICBusinessCounts\") && analysisResponse.RTICBusinessCounts.length > 0) {\n this.newAnalysisField(\"RTICBusinessCounts\", \"RTIC sector counts\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RTIC\", null, false, null, \"RTIC sectors\").addAnalysisFieldElements(analysisResponse.RTICBusinessCounts, \"Thing\").addTotalCount(analysisResponse.CompaniesConsidered);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICEmployees\") && analysisResponse.RTICEmployees.length > 0) {\n this.newAnalysisField(\"RTICEmployees\", \"Employees by RTIC sector\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RTIC\", null, false, null, \"RTIC sectors\").addAnalysisFieldElements(analysisResponse.RTICEmployees, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalEmployees);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICJobPostings\") && analysisResponse.RTICJobPostings.length > 0) {\n this.newAnalysisField(\"RTICJobPostings\", `Job postings by RTIC sector ${lightcastLink}`, \"RTICs and sectors\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"RTIC\", null, false, null, \"RTIC sectors\").addAnalysisFieldElements(analysisResponse.RTICJobPostings, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICTurnovers\") && analysisResponse.RTICTurnovers.length > 0) {\n this.newAnalysisField(\"RTICTurnovers\", \"Turnovers by RTIC sector\", \"RTICs and sectors\", \"currency\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RTIC\", null, false, null, \"RTIC sectors\").addAnalysisFieldElements(analysisResponse.RTICTurnovers, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalTurnover);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICVerticalBusinessCounts\") && analysisResponse.RTICVerticalBusinessCounts.length > 0) {\n this.newAnalysisField(\"RTICVerticalBusinessCounts\", \"RTIC vertical business counts\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RTIC vertical\", null, false, null, \"RTIC verticals\").addAnalysisFieldElements(analysisResponse.RTICVerticalBusinessCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICVerticalEmployees\") && analysisResponse.RTICVerticalEmployees.length > 0) {\n this.newAnalysisField(\"RTICVerticalEmployees\", \"Employees by RTIC vertical\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RTIC vertical\", null, false, null, \"RTIC verticals\").addAnalysisFieldElements(analysisResponse.RTICVerticalEmployees, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalEmployees);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICVerticalJobPostings\") && analysisResponse.RTICVerticalJobPostings.length > 0) {\n this.newAnalysisField(\"RTICVerticalJobPostings\", `Job postings by RTIC vertical ${lightcastLink}`, \"RTICs and sectors\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"RTIC\", null, false, null, \"RTIC verticals\").addAnalysisFieldElements(analysisResponse.RTICVerticalJobPostings, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RTICVerticalTurnovers\") && analysisResponse.RTICVerticalTurnovers.length > 0) {\n this.newAnalysisField(\"RTICVerticalTurnovers\", \"Turnovers by RTIC vertical\", \"RTICs and sectors\", \"currency\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RTIC vertical\", null, false, null, \"RTIC verticals\").addAnalysisFieldElements(analysisResponse.RTICVerticalTurnovers, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalTurnover);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICBusinessCounts\") && analysisResponse.CICBusinessCounts.length > 0) {\n this.newAnalysisField(\"CICBusinessCounts\", \"Business counts by CIC sector\", \"RTICs and sectors\", \"numerical\", null, \"bar\", [\"bar\"], \"CIC sector\", null, false, null, \"CIC sectors\").addAnalysisFieldElements(analysisResponse.CICBusinessCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICEmployees\") && analysisResponse.CICEmployees.length > 0) {\n this.newAnalysisField(\"CICEmployees\", \"Employees by CIC sector\", \"RTICs and sectors\", \"numerical\", null, \"bar\", [\"bar\"], \"CIC sector\", null, false, null, \"CIC sectors\").addAnalysisFieldElements(analysisResponse.CICEmployees, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICJobPostings\") && analysisResponse.CICJobPostings.length > 0) {\n this.newAnalysisField(\"CICJobPostings\", `Job postings by CIC sector ${lightcastLink}`, \"RTICs and sectors\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"CIC sector\", null, false, null, \"CIC sectors\").addAnalysisFieldElements(analysisResponse.CICJobPostings, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICTurnovers\") && analysisResponse.CICTurnovers.length > 0) {\n this.newAnalysisField(\"CICTurnovers\", \"Turnovers by CIC sector\", \"RTICs and sectors\", \"currency\", null, \"bar\", [\"bar\"], \"CIC sector\", null, false, null, \"CIC sectors\").addAnalysisFieldElements(analysisResponse.CICTurnovers, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICVerticalBusinessCounts\") && analysisResponse.CICVerticalBusinessCounts.length > 0) {\n this.newAnalysisField(\"CICVerticalBusinessCounts\", \"Business counts by CIC vertical\", \"RTICs and sectors\", \"numerical\", null, \"bar\", [\"bar\"], \"CIC vertical\", null, false, null, \"CIC verticals\").addAnalysisFieldElements(analysisResponse.CICVerticalBusinessCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICVerticalEmployees\") && analysisResponse.CICVerticalEmployees.length > 0) {\n this.newAnalysisField(\"CICVerticalEmployees\", \"Employees by CIC vertical\", \"RTICs and sectors\", \"numerical\", null, \"bar\", [\"bar\"], \"CIC vertical\", null, false, null, \"CIC verticals\").addAnalysisFieldElements(analysisResponse.CICVerticalEmployees, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICVerticalJobPostings\") && analysisResponse.CICVerticalJobPostings.length > 0) {\n this.newAnalysisField(\"CICVerticalJobPostings\", `Job postings by CIC vertical ${lightcastLink}`, \"RTICs and sectors\", \"numerical\", lightcastDataExplainer, \"bar\", [\"bar\"], \"CIC vertical\", null, false, null, \"CIC verticals\").addAnalysisFieldElements(analysisResponse.CICVerticalJobPostings, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"CICVerticalTurnovers\") && analysisResponse.CICVerticalTurnovers.length > 0) {\n this.newAnalysisField(\"CICVerticalTurnovers\", \"Turnovers by CIC vertical\", \"RTICs and sectors\", \"currency\", null, \"bar\", [\"bar\"], \"CIC vertical\", null, false, null, \"CIC verticals\").addAnalysisFieldElements(analysisResponse.CICVerticalTurnovers, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SICCounts\") && analysisResponse.SICCounts.length > 0) {\n this.newAnalysisField(\"SICCounts\", \"Business counts by SIC code\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"SIC\", null, false, null, \"SIC codes\").addAnalysisFieldElements(analysisResponse.SICCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SICEmployees\") && analysisResponse.SICEmployees.length > 0) {\n this.newAnalysisField(\"SICEmployees\", \"Employees by SIC code\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"SIC\", null, false, null, \"SIC codes\").addAnalysisFieldElements(analysisResponse.SICEmployees, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SICTurnovers\") && analysisResponse.SICTurnovers.length > 0) {\n this.newAnalysisField(\"SICTurnovers\", \"Turnovers by SIC code\", \"RTICs and sectors\", \"currency\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"SIC\", null, false, null, \"SIC codes\").addAnalysisFieldElements(analysisResponse.SICTurnovers, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RSICCounts\") && analysisResponse.RSICCounts.length > 0) {\n this.newAnalysisField(\"RSICCounts\", \"Business counts by RSIC code\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RSIC\", null, false, null, \"RSIC codes\").addAnalysisFieldElements(analysisResponse.RSICCounts, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RSICEmployees\") && analysisResponse.RSICEmployees.length > 0) {\n this.newAnalysisField(\"RSICEmployees\", \"Employees by RSIC code\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RSIC\", null, false, null, \"RSIC codes\").addAnalysisFieldElements(analysisResponse.RSICEmployees, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"RSICTurnovers\") && analysisResponse.RSICTurnovers.length > 0) {\n this.newAnalysisField(\"RSICTurnovers\", \"Turnovers by RSIC code\", \"RTICs and sectors\", \"currency\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"RSIC\", null, false, null, \"RSIC codes\").addAnalysisFieldElements(analysisResponse.RSICTurnovers, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SICHLUCounts\") && analysisResponse.SICHLUCounts.length > 0) {\n this.newAnalysisField(\"SICHLUCounts\", \"Business counts by SIC section\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"SIC\", null, false, null, \"SIC sections\").addAnalysisFieldElements(analysisResponse.SICHLUCounts, \"Thing\").addTotalCount(analysisResponse.CompaniesConsidered);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SICHLUEmployees\") && analysisResponse.SICHLUEmployees.length > 0) {\n this.newAnalysisField(\"SICHLUEmployees\", \"Employees by SIC section\", \"RTICs and sectors\", \"numerical\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"SIC\", null, false, null, \"SIC sections\").addAnalysisFieldElements(analysisResponse.SICHLUEmployees, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalEmployees);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"SICHLUTurnovers\") && analysisResponse.SICHLUTurnovers.length > 0) {\n this.newAnalysisField(\"SICHLUTurnovers\", \"Turnovers by SIC section\", \"RTICs and sectors\", \"currency\", `${rticsAndSectorsKnowledgeBaseLink}`, \"bar\", [\"bar\"], \"SIC\", null, false, null, \"SIC sections\").addAnalysisFieldElements(analysisResponse.SICHLUTurnovers, \"Thing\").addTotalCount(analysisResponse.BestEstimateTotalTurnover);\n }\n // if (this.analysisFieldAvailable(analysisResponse, \"CompanyFoundingDates\") && analysisResponse.CompanyFoundingDates.length > 0) {\n // tooltipText = `This graph represents the cumulative growth of companies within the selected filters. It uses the incorporation date of active companies. Companies that have dissolved are not visualised.

For example, if a specific RTIC was selected (e.g. AI), for a previous year it does not represent how many AI businesses were classified in that year. It is showing data only for companies which are now part of the AI RTIC.${companyDetailsKnowledgeBaseLink}`\n // this.newAnalysisField(\"CompanyFoundingDates\", \"Company founding dates\", \"Company details\", \"numerical\", tooltipText, [\"bar\", \"line\"], [\"bar\", \"line\"], \"Year\", null, false, null, \"Founding dates\").addAnalysisFieldElements(analysisResponse.CompanyFoundingDates.reverse(), \"Year\");\n // }\n if (this.analysisFieldAvailable(analysisResponse, \"CompanyActiveDates\") && analysisResponse.CompanyActiveDates.length > 0) {\n tooltipText = 'For more information on how we define company births and deaths, as well as how we recommend using this data, please read this article';\n const charts = [\n {\n type: \"bar\",\n title: \"Company founding years\",\n xField: \"year\",\n yField: \"foundedCount\"\n }, {\n type: \"line\",\n subtype: \"series\",\n title: \"Cumulative active companies by year\",\n subfield: \"activeCompanies\",\n series: [{\n xField: \"year\",\n yField: \"activeCount\",\n cumulateValues: false,\n color: \"#D10956\",\n label: \"Total active companies\"\n }]\n }, {\n type: \"line\",\n subtype: \"series\",\n title: \"Company births and deaths by year\",\n subfield: \"companyBirthsAndDeaths\",\n series: [{\n xField: \"year\",\n yField: \"foundedCount\",\n cumulateValues: false,\n color: \"#00FF00\",\n label: \"Company births\"\n }, {\n xField: \"year\",\n yField: \"diedCount\",\n cumulateValues: false,\n color: \"#FF6600\",\n label: \"Company deaths\"\n }]\n }, {\n type: \"slider\",\n title: \"Company births and deaths summary\",\n min: 2000,\n max: new Date().getFullYear(),\n starts: [2015, new Date().getFullYear()],\n sliderField: \"year\",\n series: [{\n xField: \"year\",\n yField: \"foundedCount\",\n color: \"#00FF00\",\n label: \"Company births\"\n }, {\n xField: \"year\",\n yField: \"diedCount\",\n color: \"#FF6600\",\n label: \"Company deaths\"\n }],\n compareField: {\n yField: \"activeCount\",\n label: \"Active Companies\",\n xField: \"year\"\n }\n }\n ];\n const analysisField = this.newAnalysisField(\"CompanyActiveDates\", \"Company births and deaths\", \"Company details\", \"numerical\", tooltipText, charts, [\"line\"], \"Year\", null, false, null, \"Company births and deaths\").addCompanyActiveDatesElements(analysisResponse.CompanyActiveDates);\n }\n\n if (this.analysisFieldAvailable(analysisResponse, \"TradeImportByChapter\") && analysisResponse.TradeImportByChapter.length > 0) {\n this.newAnalysisField(\"CompanyTradeDataImport\", \"Number of importing firms by HS chapter\", \"Company details\", \"numerical\", \"\", \"bar\", [\"bar\"], \"Chapter\", null, false, null, \"Company trade data\").addAnalysisFieldElements(analysisResponse.TradeImportByChapter, \"Thing\").addTotalCount(analysisResponse.TradeImportTotalCompanies);\n }\n\n if (this.analysisFieldAvailable(analysisResponse, \"TradeExportByChapter\") && analysisResponse.TradeExportByChapter.length > 0) {\n this.newAnalysisField(\"CompanyTradeDataExport\", \"Number of exporting firms by HS chapter\", \"Company details\", \"numerical\", \"\", \"bar\", [\"bar\"], \"Chapter\", null, false, null, \"Company trade data\").addAnalysisFieldElements(analysisResponse.TradeExportByChapter, \"Thing\").addTotalCount(analysisResponse.TradeExportTotalCompanies);\n }\n\n if (this.analysisFieldAvailable(analysisResponse, \"NET_WORTH\")) {\n this.newAnalysisField(\"NET_WORTH\", \"Net worth\", \"Financials\", \"currency\", null, \"line\", [\"bar\", \"line\"], null, null, false, null, \"Financial details\").addAnalysisFinancialFieldElements(analysisResponse.NET_WORTH.MeasuredYearValues, analysisResponse.NET_WORTH.ProjectedYearValues).createTopCompanies(analysisResponse.NET_WORTH.TopCompanies, true);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TurnoverByYear\")) {\n this.newAnalysisField(\"TurnoverByYear\", \"Turnover by year\", \"Financials\", \"currency\", null, \"line\", [\"bar\", \"line\"], null, null, false, null, \"Financial details\").addAnalysisFinancialFieldElements(analysisResponse.TurnoverByYear.MeasuredYearValues, analysisResponse.TurnoverByYear.ProjectedYearValues).createTopCompanies(analysisResponse.TurnoverByYear.TopCompanies ?? null, true);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"PROFIT_AFTER_TAX\")) {\n this.newAnalysisField(\"PROFIT_AFTER_TAX\", \"Profit after tax\", \"Financials\", \"currency\", null, \"line\", [\"bar\", \"line\"], null, null, false, null, \"Financial details\").addAnalysisFinancialFieldElements(analysisResponse.PROFIT_AFTER_TAX.MeasuredYearValues, analysisResponse.PROFIT_AFTER_TAX.ProjectedYearValues).createTopCompanies(analysisResponse.PROFIT_AFTER_TAX.TopCompanies, true);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TOTAL_CURRENT_ASSETS\")) {\n this.newAnalysisField(\"TOTAL_CURRENT_ASSETS\", \"Total current assets\", \"Financials\", \"currency\", null, \"line\", [\"bar\", \"line\"], null, null, false, null, \"Financial details\").addAnalysisFinancialFieldElements(analysisResponse.TOTAL_CURRENT_ASSETS.MeasuredYearValues, analysisResponse.TOTAL_CURRENT_ASSETS.ProjectedYearValues).createTopCompanies(analysisResponse.TOTAL_CURRENT_ASSETS.TopCompanies, true);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"TOTAL_LIABILITIES\")) {\n this.newAnalysisField(\"TOTAL_LIABILITIES\", \"Total liabilities\", \"Financials\", \"currency\", null, \"line\", [\"bar\", \"line\"], null, null, false, null, \"Financial details\").addAnalysisFinancialFieldElements(analysisResponse.TOTAL_LIABILITIES.MeasuredYearValues, analysisResponse.TOTAL_LIABILITIES.ProjectedYearValues).createTopCompanies(analysisResponse.TOTAL_LIABILITIES.TopCompanies, true);\n }\n if (this.analysisFieldAvailable(analysisResponse, \"DealroomFundingByYear\") && analysisResponse.DealroomFundingByYear.length > 0) {\n this.newAnalysisField(\"DealroomFundingByYear\", `Total investment funding by year`, \"Financials\", \"currency\", null, \"bar\", [\"bar\"], \"Year\", null, false, null, \"Funding\").addAnalysisFieldElements(this.processDealroomData(analysisResponse.DealroomFundingByYear), \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"DealroomFundingRoundsByYear\")) {\n this.newAnalysisField(\"DealroomFundingRoundsByYear\", `Total investment funding rounds by year`, \"Financials\", \"number\", null, \"bar\", [\"bar\"], \"Year\", null, false, null, \"Funding\").addAnalysisFieldElements(analysisResponse.DealroomFundingRoundsByYear, \"Thing\");\n }\n if (this.analysisFieldAvailable(analysisResponse, \"InnovateUKFundingByYear\") && analysisResponse.InnovateUKFundingByYear.length > 0) {\n this.newAnalysisField(\"InnovateUKFundingByYear\", \"Innovate UK grant funding by year\", \"Financials\", \"currency\", null, \"bar\", [\"bar\"], \"Year\", null, false, null, \"Funding\").addAnalysisFieldElements(this.processInnovateUkData(analysisResponse.InnovateUKFundingByYear), \"Thing\");\n }\n\n }\n\n setSummaryTableToggleEvent() {\n const self = this;\n document.getElementById('summaryTableToggle').addEventListener('change', (element) => {\n if(element.target.checked == true && document.querySelectorAll('.listSummaryWrapper .summary-table-wrapper tbody tr').length == 0) {\n document.getElementById(\"insightsLoadingListName\").innerHTML = \"Summary Stats\";\n document.getElementById(\"listInsightsPageLoadingHolder\").classList.add(\"active\");\n window.scrollTo({top: 0, behavior: 'smooth'}); // Scroll to top of page\n\n self.getSummaryTableData(this.filtersForSearch);\n }\n });\n }\n\n analysisLoaded(filtersObject) {\n this.filtersObject = filtersObject;\n this.updateUrlAddressQuery().resetAnalysisContent().updateAnalysisFiltersDescription().createWidgetSubsections().createAnalysisWidgets().syncSubsubsectionbubbleMapWidgets().createAnalysisSummaryBox().addAnalyisSummary().displaySectionNavigation();\n this.setSummaryTableToggleEvent();\n }\n\n updateAnalysisFiltersDescription() {\n if (document.getElementById(\"listFiltersDescription\")) {\n const start = 'Analysis of companies';\n const humanReadableFiltersRepresentation = this.filtersObject.getHumanReadableFiltersRepresentation(start);\n document.getElementById(\"listFiltersDescription\").innerHTML = humanReadableFiltersRepresentation;\n const regex = new RegExp('^' + start);\n this.listFiltersDescription = humanReadableFiltersRepresentation.replace(regex, \"\").trim();\n }\n return this;\n }\n\n analysisFieldAvailable(data, field) {\n if (data.hasOwnProperty(field) && data[field] != undefined) {\n if (Array.isArray(data[field]) && data[field].length == 0) {\n return true;\n } else {\n return true;\n }\n } else {\n return false;\n }\n }\n\n checkUrlQueryFields() {\n let queryListID, queryModelCode, queryCutoff, queryListSize, exploreListID, queryRtic, rticSector, rticVertical;\n if (queryListID = coreFunctions.getQueryVariable(\"list_id\")) {\n companyLists.presetList(queryListID);\n }\n if ((queryListID = coreFunctions.getQueryVariable(\"list_id\")) && (queryModelCode = coreFunctions.getQueryVariable(\"model_code\"))) {\n companyLists.validatePresetModelCode(Number(queryListID), queryModelCode);\n }\n if (queryCutoff = coreFunctions.getQueryVariable(\"list_cutoff\")) {\n document.getElementById(\"listCutoffInput\").value = queryCutoff;\n }\n if ((queryListSize = coreFunctions.getQueryVariable(\"list_size\")) && document.querySelector(`#cutoffByListSizeSelect option[value='${queryListSize}']`)) {\n document.getElementById(\"cutoffByListSizeSelect\").value = queryListSize;\n companyLists.toggleCutoffControl(document.getElementById(\"cutoffByListSizeControlHolder\"));\n }\n if (queryRtic = coreFunctions.getQueryVariable(\"rtic\")) {\n rticSector = decodeURIComponent(queryRtic);\n rticVertical = (coreFunctions.getQueryVariable(\"vertical\") ? decodeURIComponent(coreFunctions.getQueryVariable(\"vertical\")) : null);\n filters.rticFilters.preloadRticSector(rticSector, rticVertical);\n }\n }\n\n newAnalysisField(field, label, subsection, dataType, explanation, chartType, allowedChartTypes, thingColumnLabel, emptyFieldLabel, displayDataAsPercentage, locationFilterField, subSubsection, stackedBarchartOptions) {\n let analysisField = new AnalysisField(field, label, subsection, dataType, explanation, chartType, allowedChartTypes, this.listID, thingColumnLabel, emptyFieldLabel, displayDataAsPercentage, locationFilterField, this.title, this, subSubsection, stackedBarchartOptions);\n this.fields.push(analysisField);\n return analysisField;\n }\n\n setAnalysisProperties(modelCode, title, listID, cutoff) {\n this.modelCode = modelCode;\n this.title = title;\n this.listID = listID;\n this.cutoff = cutoff ?? 0;\n return this;\n }\n\n resetAnalysis() {\n this.fields = [];\n this.companiesConsidered = null;\n return this;\n }\n\n updateAnalysis(analysis, listDetails, returnCount) {\n this.fields = [];\n this.companiesConsidered = analysis.CompaniesConsidered;\n this.cutoff = analysis.Cutoff;\n this.bestEstimateTotalEmployees = analysis.BestEstimateTotalEmployees;\n this.bestEstimateTotalEmployeesCompaniesUsed = analysis.BestEstimateTotalEmployeesCompaniesUsed;\n this.bestEstimateTotalTurnover = analysis.BestEstimateTotalTurnover;\n this.bestEstimateTotalTurnoverCompaniesUsed = analysis.BestEstimateTotalTurnoverCompaniesUsed;\n this.totalDealroomFunding = analysis.TotalDealroomFunding * 1000000;\n this.companiesWithDealroomFunding = analysis.CompaniesWithDealroomFunding;\n this.totalInnovateUkFunding = analysis.TotalInnovateUKFunding;\n this.totalInnovateUKGrantsWon = analysis.TotalInnovateUKGrantsWon;\n this.bestEstimateGrowthPercentagePerYear = analysis.BestEstimateGrowthPercentagePerYear;\n this.bestEstimateGrowthPercentagePerYearCompaniesUsed = analysis.BestEstimateGrowthPercentagePerYearCompaniesUsed;\n this.bestEstimateGVA = analysis.BestEstimateGVA;\n this.bestEstimateGVACompaniesUsed = analysis.BestEstimateGVACompaniesUsed;\n this.femaleDirectors = analysis.ActiveFemaleDirectors;\n this.maleDirectors = analysis.ActiveMaleDirectors;\n this.unknownGenderDirectors = analysis.ActiveUnknownGenderDirectors;\n this.womenLedCompanies = analysis.WomenLedCompanies;\n this.womenFoundedCompanies = analysis.WomenFoundedCompanies;\n this.summaryTable = analysis.SummaryTable ?? null;\n this.companiesWithAnomalies = analysis.CompaniesWithAnomalousFinancials ?? null;\n this.tradeImportTotalCompanies = analysis.TradeImportTotalCompanies ?? null;\n this.tradeExportTotalCompanies = analysis.TradeExportTotalCompanies ?? null;\n return this;\n }\n\n createWidgetSubsections() {\n const self = this;\n let listSummaryHolder = document.getElementById(\"listSummaryHolder\");\n const subsections = [\"Summary\"].concat(this.fields.map(element => element.subsection).filter((item, i, ar) => ar.indexOf(item) === i));\n subsections.forEach((subsection) => {\n let subsectionHolder = coreFunctions.createElementHelper(\"div\", { class: \"subsection\", \"data-section\": subsection });\n listSummaryHolder.appendChild(subsectionHolder);\n if (subsection != \"Summary\") {\n subsectionHolder.appendChild(coreFunctions.createElementHelper(\"h2\", { innerHTML: `${subsection}${(subsection == \"Jobs and skills\") ? `` : \"\"}` })); // Title of subsection, add Lightcast logo for Jobs and skills section\n }\n self.createSubSubsectionSelect(subsection, subsectionHolder)\n\n subsectionHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"mainDataHolder\" })); // Holder for widgets\n\n document.getElementById(\"sectionsList\").appendChild(coreFunctions.createElementHelper(\"button\", {innerHTML: subsection, class: \"sectionElement\", \"data-section\": subsection}, {click: function() {\n document.querySelector(`.subsection[data-section='${this.dataset.section}']`).scrollIntoView({behavior: \"smooth\", block: \"start\"});\n }}));\n })\n return this;\n }\n\n createSubSubsectionSelect(subsection, subsectionHolder) {\n const self = this;\n let subSubsectionControls, subSubsectionSelect;\n\n // Find widgets matching current subsection that also belong to a subsubsection, remove duplicates\n const subSubsections = new Set(analyse.listAnalysis.fields.flatMap((element) => {\n const match = (element.subsection == subsection && element.subSubsection);\n return (match) ? [element.subSubsection] : [];\n }));\n\n // Create subsubsection control elements\n subSubsections.forEach((subSubsection) => {\n if (subSubsection) {\n if (!subSubsectionControls) {\n subSubsectionControls = subsectionHolder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"subSubsectionControls\", \"data-subsection\": subsection}));\n let subSubsectionSelectHolder = subSubsectionControls.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"subSubSectionControl subSubsectionSelectHolder\", innerHTML: \"Field:\"}));\n subSubsectionSelect = subSubsectionSelectHolder.appendChild(coreFunctions.createElementHelper(\"select\", {class: \"subSubsectionSelect\", \"data-subsection\": subsection}, {change: () => self.subSubsectionOnchange(event)}));\n }\n subSubsectionSelect.appendChild(coreFunctions.createElementHelper(\"option\", {value: subSubsection, innerHTML: subSubsection}));\n }\n });\n }\n\n subSubsectionOnchange(event) {\n const subsection = event.target.dataset.subsection;\n const subSubsection = event.target.value;\n this.hideSubSubsectionWidgets(subsection).processActiveSubSubsection(subsection, subSubsection).refreshSubSubsectionWidgetExplanation(subsection, subSubsection);\n return this;\n }\n\n processActiveSubSubsection(subsection, subSubsection) {\n const subSubsectionWidgets = document.querySelectorAll(`.subsection[data-section='${subsection}'] .locationDataHolder[data-subsubsection='${subSubsection}'], .subsection[data-section='${subsection}'] .listSummaryPanel[data-subsubsection='${subSubsection}']`);\n // Subsubsections have already been created, show the elements\n if (subSubsectionWidgets.length > 0) {\n this.showSubSubsectionWidgets(subSubsectionWidgets)\n const subSubsectionFields = this.fields.filter(element => (element.subsection == subsection && element.subSubsection == subSubsection));\n this.checkExtraSubSubSectionControls(subSubsectionFields, subsection, subSubsection);\n } else {\n this.createSubSubsectionWidgets(subsection, subSubsection)\n }\n return this;\n }\n\n createSubSubsectionWidgets(subsection, subSubsection) {\n const subSubsectionFields = this.fields.filter(element => (element.subsection == subsection && element.subSubsection == subSubsection));\n subSubsectionFields.forEach(element => element.createAnalysisWidget());\n this.checkExtraSubSubSectionControls(subSubsectionFields, subsection, subSubsection);\n return this;\n }\n\n showSubSubsectionWidgets(widgets) {\n widgets.forEach(element => {\n element.classList.remove(\"hidden\");\n // TODO I could maybe add another class to do the thing of\n });\n return this;\n }\n\n checkExtraSubSubSectionControls(widgets, subsection, subSubsection) {\n let existingControl;\n // Check fields for location quotient data\n if (widgets.find(widget => widget.fieldHasLocationQuotientData())) {\n this.processLocationQuotientSubSubSectionControl(subsection, subSubsection);\n } else if (existingControl = document.getElementById(`${subsection}-lq-datasource-control`)) {\n existingControl.classList.add(\"hidden\");\n }\n // Check fields for percentage format data\n if (widgets.find(widget => widget.hasPercentageData())) {\n this.processAbsolutePercentageSubSubSectionControl(subsection, subSubsection);\n } else if (existingControl = document.getElementById(`${subsection}-pc-datasource-control`)) {\n existingControl.classList.add(\"hidden\");\n }\n this.checkSubSubsectionChartTypes(widgets, subsection, subSubsection);\n return this;\n }\n\n processLocationQuotientSubSubSectionControl(subsection, subSubsection) {\n let existingControl = document.getElementById(`${subsection}-lq-datasource-control`);\n if (existingControl) {\n this.updateLocationQuotientSubSubSectionControl(subsection, subSubsection);\n } else if (!this.filterByLocationIsActive()) {\n this.createLocationQuotientSubSubSectionControl(subsection, subSubsection);\n }\n }\n\n filterByLocationIsActive() {\n return this.filtersObject.generalFilters.filterGroupIsActive(\"locations\");\n }\n\n updateLocationQuotientSubSubSectionControl(subsection, subSubsection) {\n const self = this;\n const holder = document.getElementById(`${subsection}-lq-datasource-control`);\n holder.dataset.subSubsection = subSubsection;\n Array.from(holder.querySelectorAll(\"input\")).forEach(control => {\n control.dataset.subsubsection = subSubsection;\n if (control.checked) {\n self.locationQuotientSubSubSectionChange(control);\n }\n })\n holder.classList.remove(\"hidden\");\n }\n\n createLocationQuotientSubSubSectionControl(subsection, subSubsection) {\n const locationQuotientTooltip = \"

Find out more here.

\";\n\n if (!document.getElementById(`${subsection}-lq-datasource-control`)) {\n const controls = coreFunctions.createElementHelper(\"form\", {id: `${subsection}-lq-datasource-control`, \"data-subsection\": subsection, \"data-subsubsection\": subSubsection, class: \"chartSourceDataControls subSubSectionControl\", \"data-source\": \"location-quotient\" }, { change: (event) => this.locationQuotientSubSubSectionChange(event.target)});\n\n controls.appendChild(coreFunctions.createElementHelper(\"span\", {class: 'subSubsectionControlLabel', innerHTML:\"Data format:\"}));\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${subsection}-absolute`, name: `${subSubsection}-chartSourceData`, value: \"absolute\", checked: true, \"data-subsection\": subsection, \"data-subsubsection\": subSubsection }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${subsection}-absolute`, innerHTML: \"Absolute\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${subsection}-locationquotient`, name: `${subSubsection}-chartSourceData`, value: \"locationquotient\", \"data-subsection\": subsection, \"data-subsubsection\": subSubsection }));\n\n let locationQuotientLabel = controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${subsection}-locationquotient`, innerHTML: `Location quotient` }));\n\n locationQuotientLabel.appendChild(coreFunctions.createTooltipElement(locationQuotientTooltip, `${subsection}-lq-tooltip`));\n\n document.querySelector(`.subsection[data-section='${subsection}'] .subSubsectionControls`).appendChild(controls);\n }\n\n return this;\n }\n\n locationQuotientSubSubSectionChange(element) {\n const dataSource = element.value;\n const subsection = element.dataset.subsection;\n const subSubsection = element.dataset.subsubsection;\n const widgets = this.fields.filter(element => element.subsection == subsection && element.subSubsection == subSubsection);\n widgets.forEach(widget => widget.locationQuotientControlChange(dataSource));\n this.syncSubsubsectionbubbleMapWidgets();\n }\n\n processAbsolutePercentageSubSubSectionControl(subsection, subSubsection) {\n let existingControl = document.getElementById(`${subsection}-pc-datasource-control`);\n if (existingControl) {\n this.updateAbsolutePercentageSubSubSectionControl(subsection, subSubsection);\n } else {\n this.createAbsolutePercentageSubSubSectionControl(subsection, subSubsection);\n }\n\n }\n\n createAbsolutePercentageSubSubSectionControl(subsection, subSubsection) {\n const controls = coreFunctions.createElementHelper(\"form\", {id: `${subsection}-pc-datasource-control`, \"data-subsection\": subsection, \"data-subsubsection\": subSubsection, class: \"chartSourceDataControls subSubSectionControl\", \"data-source\": \"location-quotient\" }, { change: (event) => this.absolutePercentageSubSubSectionChange(event.target)});\n\n controls.appendChild(coreFunctions.createElementHelper(\"span\", {class: 'subSubsectionControlLabel', innerHTML:\"Data format:\"}));\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${subsection}-absolute-data`, name: `${subSubsection}-chartSourceData`, value: \"absolute\", checked: true, \"data-subsection\": subsection, \"data-subsubsection\": subSubsection }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${subsection}-absolute-data`, innerHTML: \"Absolute\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${subsection}-percentage-data`, name: `${subSubsection}-chartSourceData`, value: \"percentage\", \"data-subsection\": subsection, \"data-subsubsection\": subSubsection }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${subsection}-percentage-data`, innerHTML: `Percentage` }));\n\n document.querySelector(`.subsection[data-section='${subsection}'] .subSubsectionControls`).appendChild(controls);\n }\n\n updateAbsolutePercentageSubSubSectionControl(subsection, subSubsection) {\n const self = this;\n const holder = document.getElementById(`${subsection}-pc-datasource-control`);\n holder.dataset.subSubsection = subSubsection;\n Array.from(holder.querySelectorAll(\"input\")).forEach(control => {\n control.dataset.subsubsection = subSubsection;\n if (control.checked) {\n self.absolutePercentageSubSubSectionChange(control);\n }\n })\n holder.classList.remove(\"hidden\");\n }\n\n absolutePercentageSubSubSectionChange(element) {\n const dataSource = element.value;\n const subsection = element.dataset.subsection;\n const subSubsection = element.dataset.subsubsection;\n const widgets = this.fields.filter(element => element.subsection == subsection && element.subSubsection == subSubsection);\n widgets.forEach(widget => widget.absolutePercentageDataToggleChange(dataSource));\n }\n\n // Get all widgets currently active in subsection and hide them\n hideSubSubsectionWidgets(subsection) {\n const widgets = document.querySelectorAll(`.subsection[data-section='${subsection}'] .locationDataHolder:not(.hidden), .subsection[data-section='${subsection}'] .listSummaryPanel[data-subsubsection]:not(.hidden)`);\n widgets.forEach(element => {\n element.classList.add(\"hidden\");\n });\n return this;\n }\n\n resetAnalysisContent() {\n let listSummaryHolder, sectionsList;\n listSummaryHolder = document.getElementById(\"listSummaryHolder\");\n while (listSummaryHolder.children[0].nextElementSibling) {\n listSummaryHolder.removeChild(listSummaryHolder.children[0].nextElementSibling); // Remove page content except sections holder\n }\n sectionsList = document.getElementById(\"sectionsList\");\n while (sectionsList.firstChild) {\n sectionsList.removeChild(sectionsList.firstChild);\n }\n return this;\n }\n\n createAnalysisWidgets() {\n this.fields.forEach(field => {\n if (field.addAnalyseFieldToPage()) {\n field.createAnalysisWidget();\n }\n });\n return this;\n }\n\n // All widgets with maps, group by subsubsector and sync map movements and zooms\n syncSubsubsectionbubbleMapWidgets() {\n const bubbleMapWidgets = this.fields.filter(element => element.bubbleMap);\n for (var i = 0; i < bubbleMapWidgets.length; i++) {\n let widget = bubbleMapWidgets[i];\n let siblingbubbleMapWidgets = bubbleMapWidgets.flatMap(element => {return (element.subSubsection == widget.subSubsection && element.field != widget.field) ? [element.bubbleMap] : [] } );\n // Sync widget map with all maps in subsubsector\n siblingbubbleMapWidgets.forEach(siblingBubbleMap => widget.bubbleMap.map.sync(siblingBubbleMap.map));\n }\n return this;\n }\n\n checkSubSubsectionChartTypes(subSubsectionFields, subsection, subSubsection) {\n // Remove widgets with combination of charts, in array format\n const allowedChartTypes = Array.from(new Set(subSubsectionFields.flatMap(element => (!Array.isArray(element.chartType)) ? [...element.allowedChartTypes.map(element => element.split(\"_\")[0])] : [])));\n this.removeSubSubsectionChartTypesControl(subsection);\n if (allowedChartTypes.length > 1) {\n this.createSubSubsectionChartTypesControl(subsection, subSubsection);\n }\n return this;\n }\n\n createSubSubsectionChartTypesControl(subsection, subSubsection) {\n if (!document.getElementById(`${subsection}-chart-type-control`)) {\n const subSubsectionFields = this.fields.filter(element => element.subSubsection == subSubsection);\n // Use split to remove subtypes of charts\n const allowedChartTypes = new Set(subSubsectionFields.flatMap(element => [...element.allowedChartTypes.map(element => element.split(\"_\")[0])]));\n // Ignore subtypes of chart, e.g. bar_stack\n const modalChartType = coreFunctions.getMode(subSubsectionFields.flatMap((element) => {return (!element.chartType.includes(\"_\")) ? [element.chartType] : [];}));\n const controls = coreFunctions.createElementHelper(\"form\", {id: `${subsection}-chart-type-control`, \"data-subsection\": subsection, \"data-subsubsection\": subSubsection, class: \"chartSourceDataControls subSubSectionControl\" }, { change: (event) => this.chartTypeSubSubsectionChange(event.target)});\n\n controls.appendChild(coreFunctions.createElementHelper(\"span\", {class: 'subSubsectionControlLabel', innerHTML:\"Chart type:\"}));\n\n allowedChartTypes.forEach(chartType => {\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${subsection}-chart-${chartType}`, class: \"chart-type-radio\", name: `${subSubsection}-chart-type`, value: chartType, checked: (chartType == modalChartType), \"data-subsection\": subsection, \"data-subsubsection\": subSubsection }));\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${subsection}-chart-${chartType}`, innerHTML: `${chartType}chart` }));\n });\n\n document.querySelector(`.subsection[data-section='${subsection}'] .subSubsectionControls`).appendChild(controls);\n }\n }\n\n removeSubSubsectionChartTypesControl(subsection) {\n let holder;\n if (holder = document.getElementById(`${subsection}-chart-type-control`)) {\n holder.remove();\n }\n }\n\n chartTypeSubSubsectionChange(element) {\n const chartType = element.value;\n const subsection = element.dataset.subsection;\n const subSubsection = element.dataset.subsubsection;\n const widgets = this.fields.filter(element => element.subsection == subsection && element.subSubsection == subSubsection);\n widgets.forEach(widget => {widget.checkForChartRefresh(chartType)});\n }\n\n createAnalysisSummaryBox() {\n\n let listSummaryPanel, listSummaryWrapper, contentHolder, listSummaryHeader, listSummaryExplanationHolder, listSummaryTooltipText;\n\n listSummaryTooltipText = \"

Summary statistics should not be taken at face value. These statistics require interpretation and come with some caveats.

The statistics do not take into account group structure, splitting turnover/employees by location etc.

Why the summary statistics can be misleading

\";\n\n listSummaryPanel = coreFunctions.createElementHelper(\"div\", { class: \"listSummaryPanel\" });\n document.querySelector(`#listSummaryHolder .subsection[data-section='Summary'] .mainDataHolder`).appendChild(listSummaryPanel);\n\n listSummaryWrapper = coreFunctions.createElementHelper(\"div\", { class: \"listSummaryWrapper\" });\n listSummaryPanel.appendChild(listSummaryWrapper);\n\n contentHolder = coreFunctions.createElementHelper(\"div\", { class: \"barchartHolder\" });\n listSummaryWrapper.appendChild(contentHolder);\n\n listSummaryHeader = contentHolder.appendChild(coreFunctions.createElementHelper(\"h3\", {class:\"analysis-summary-title\"}))\n listSummaryHeader.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"widgetTitle\", innerHTML: \"Analysis summary\" }));\n\n listSummaryExplanationHolder = listSummaryHeader.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"widgetControls\"})).appendChild(coreFunctions.createElementHelper(\"span\", { class: \"widgetExplanationHolder\" }));\n\n listSummaryExplanationHolder.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"checkbox\", id: \"listSummaryExplanationCheckbox\" })); // Checkbox\n\n listSummaryExplanationHolder.appendChild(coreFunctions.createElementHelper(\"label\", {id: \"listSummaryExplanationIcon\", class: `${(this.filtersObject.generalFilters.filterGroupIsActive(\"locations\")) ? \"flashExplanation\" : \"\"}`, for: \"listSummaryExplanationCheckbox\", innerHTML: `?${listSummaryTooltipText}` }, {click: function(event) { this.classList.remove(\"flashExplanation\");}})); // Label with explanation element can be toggled on and off\n\n this.addResultsToAnalysisSummary(contentHolder);\n\n return this;\n }\n\n addResultsToAnalysisSummary(contentHolder) {\n let locationAnalysisField, filteredLocations, totalTurnoverSummary, totalEmployeesSummary, gvaSummary, womanLedSummary, anomaliesSummary, tradeDataSummary, locationFieldSum;\n\n const currencyFormat = new Intl.NumberFormat('en-EN', { style: 'currency', maximumFractionDigits: 0, currency: 'GBP' });\n const percentFormat = new Intl.NumberFormat('en', { style: 'percent', signDisplay: 'exceptZero', minimumSignificantDigits: 2});\n\n filteredLocations = this.getActiveLocationFilters();\n\n contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: `
${(this.companiesConsidered) ? this.companiesConsidered.toLocaleString() : 0}
Companies considered
` }));\n\n if (this.bestEstimateTotalEmployees) {\n totalEmployeesSummary = contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\"}));\n locationAnalysisField = this.findLocationAnalysisField(filteredLocations, \"Employees\");\n if (locationAnalysisField) {\n if (locationFieldSum = locationAnalysisField.sumOverElements(filteredLocations.locations)) {\n let totalEmployeesSummaryLocationHolder = totalEmployeesSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"location-summary-headline\"}));\n totalEmployeesSummaryLocationHolder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal locationSummaryTotal\", innerHTML: locationFieldSum.toLocaleString()}));\n totalEmployeesSummaryLocationHolder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel locationSummaryLabel\", innerHTML: `?Estimated total employees attributed to ${this.formatElementNames(filteredLocations.names)}`}));\n }\n }\n totalEmployeesSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal\", innerHTML: this.bestEstimateTotalEmployees.toLocaleString()}));\n totalEmployeesSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel\", innerHTML: `Total employees ${this.bestEstimateTotalEmployeesCompaniesUsed.toLocaleString()} ${coreFunctions.pluraliseWord(\"company\", \"companies\", this.bestEstimateTotalEmployeesCompaniesUsed)}`}));\n }\n\n if (this.bestEstimateTotalTurnover) {\n totalTurnoverSummary = contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\"}));\n locationAnalysisField = this.findLocationAnalysisField(filteredLocations, \"Turnovers\");\n if (locationAnalysisField) {\n if (locationFieldSum = locationAnalysisField.sumOverElements(filteredLocations.locations)) {\n let totalTurnoverSummaryLocationHolder = totalTurnoverSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"location-summary-headline\"}));\n totalTurnoverSummaryLocationHolder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal locationSummaryTotal\", innerHTML: currencyFormat.format(locationFieldSum)}));\n totalTurnoverSummaryLocationHolder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel locationSummaryLabel\", innerHTML: `?Estimated total turnover attributed to ${this.formatElementNames(filteredLocations.names)}`}));\n }\n }\n\n totalTurnoverSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal\", innerHTML: currencyFormat.format(this.bestEstimateTotalTurnover)}));\n totalTurnoverSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel\", innerHTML: `Total turnover ${this.bestEstimateTotalTurnoverCompaniesUsed.toLocaleString()} ${coreFunctions.pluraliseWord(\"company\", \"companies\", this.bestEstimateTotalTurnoverCompaniesUsed)}`}));\n }\n\n if (this.totalDealroomFunding) {\n contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: `
${currencyFormat.format(this.totalDealroomFunding)}
Total investment funding
${this.companiesWithDealroomFunding.toLocaleString()} ${coreFunctions.pluraliseWord(\"company\", \"companies\", this.companiesWithDealroomFunding)}
` }));\n }\n\n if (this.totalInnovateUkFunding) {\n contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: `
${currencyFormat.format(this.totalInnovateUkFunding)}
Total Innovate UK grant funding ${this.totalInnovateUKGrantsWon.toLocaleString()} ${coreFunctions.pluraliseWord(\"grant\", \"grants\", this.totalInnovateUKGrantsWon)}
`}));\n }\n\n if (this.bestEstimateGrowthPercentagePerYear) {\n contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: `
${percentFormat.format(this.bestEstimateGrowthPercentagePerYear)}
Estimated growth per year ${this.bestEstimateGrowthPercentagePerYearCompaniesUsed.toLocaleString()} companies

The best estimate of the annual growth rate of the number of employees of all companies in the list.

Find out more here.

` }));\n }\n\n if (this.bestEstimateGVA) {\n const gvaTooltip = \"

We have produced an estimated GVA measure at the company level using official GVA and employment data.

You can read more here

\";\n\n gvaSummary = contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: `
${currencyFormat.format(this.bestEstimateGVA)}
Best estimate total GVA ${this.bestEstimateGVACompaniesUsed.toLocaleString()} companies${gvaTooltip}
` }));\n // Add estimated GVA per employee\n gvaSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal locationSummaryTotal\", innerHTML: currencyFormat.format(this.calculateGvaPerEmployeeEstimate())}));\n gvaSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel locationSummaryLabel\", innerHTML: \"Estimated GVA per employee\"}));\n }\n\n if (this.womenLedCompanies) {\n const womenFoundedCompaniesTooltip = 'These are companies that have at least one woman founder and the woman founder is still active at the company. This may include mixed founded companies too. Use the filters to focus on \\'only women founded\\' companies. Read more about how we advise using this data here.';\n const womenLedCompaniesTooltip = '

These are companies where there are more women directors than men directors that are active at the company.

Find out more here.

';\n\n womanLedSummary = contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: `
${this.womenFoundedCompanies.toLocaleString()}
Women founded companies${womenFoundedCompaniesTooltip}
` }));\n\n womanLedSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal locationSummaryTotal\", innerHTML: this.womenLedCompanies.toLocaleString()}));\n womanLedSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel locationSummaryLabel\", innerHTML: `Women led companies${womenLedCompaniesTooltip}`}));\n\n if (this.femaleDirectors) {\n const totalDirectors = this.getTotalDirectors();\n womanLedSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal locationSummaryTotal\", innerHTML: this.femaleDirectors.toLocaleString()}));\n womanLedSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel locationSummaryLabel\", innerHTML: `Women directors ${totalDirectors.toLocaleString()} total ${coreFunctions.pluraliseWord(\"director\", \"directors\", totalDirectors)}`}));\n }\n }\n\n if (this.tradeImportTotalCompanies || this.tradeExportTotalCompanies) {\n tradeDataSummary = contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: '' }));\n\n if (this.tradeImportTotalCompanies) {\n tradeDataSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal locationSummaryTotal\", innerHTML: this.tradeImportTotalCompanies.toLocaleString()}));\n tradeDataSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel locationSummaryLabel\", innerHTML: `Companies with import data`}));\n }\n\n if (this.tradeExportTotalCompanies) {\n tradeDataSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryTotal locationSummaryTotal\", innerHTML: this.tradeExportTotalCompanies.toLocaleString()}));\n tradeDataSummary.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"summaryLabel locationSummaryLabel\", innerHTML: `Companies with export data`}));\n }\n }\n\n if (this.companiesWithAnomalies) {\n const anomaliesTooltip = 'We have identified likely anomalous company financial accounts, using a model trained on confirmed anomalous financial accounts. In the companies filter you can choose to exclude these companies, or inspect them using \\'only Outliers\\'.';\n anomaliesSummary = contentHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"analysisSummaryElement\", innerHTML: `
${this.companiesWithAnomalies.toLocaleString()}
Companies with potential anomalies${anomaliesTooltip}
` }));\n }\n\n if(!this.comparisonGroup) {\n contentHolder.appendChild(this.createSummaryTable());\n }\n\n return this;\n }\n\n processSummaryTableData(summaryTableResponse) {\n if(summaryTableResponse) {\n this.summaryTable = summaryTableResponse.data;\n this.createSummaryTableContent();\n document.getElementById(\"listInsightsPageLoadingHolder\").classList.remove(\"active\");\n }\n }\n\n getSummaryTableRowDescription(field) {\n const rowDescriptions = {\n \"Has_CompanyNumber\": \"Has a company number\",\n \"Has_CompanyName\": \"Has a company name\",\n \"Has_CountryOfOrigin\": \"United Kingdom\",\n \"Has_Facebook\": \"Has a Facebook\",\n \"Has_Instagram\": \"Has an Instagram\",\n \"Has_Twitter\": \"Has a Twitter\",\n \"Has_Linkedin\": \"Has a LinkedIn\",\n \"Has_Youtube\": \"Has a Youtube\",\n \"Has_IncorporationDate\": \"Has an incorporation date\",\n \"Has_RegisteredAddress\": \"Has a registered address\",\n \"Has_RegisteredPostcode\": \"Has a registered postcode\",\n \"Has_CompanyCategory\": \"Has a company category\",\n \"Has_Website\": \"Has a website\",\n \"Has_CompanyDescription\": \"Has a company description\",\n \"Has_WomenLed\": \"Is women led\",\n \"Has_HighGrowth\": \"Is high growth\",\n \"Has_LocationDetails\": \"Has at least one location\",\n \"Has_SICHLUs\": \"Has at least one SICHLU\",\n \"Has_SICs\": \"Has at least one SIC code\",\n \"Has_SectorKeywords\": \"Has at least one sector keyword\",\n \"Has_InnovationKeywords\": \"Has at least one innovation keyword\",\n \"Has_ManufacturingKeywords\": \"Has at least one manufacturing keyword\",\n \"Has_CompanyFinancials\": \"Has at least one financial year\",\n \"Has_Officers\": \"Has at least one officer (director)\",\n \"Has_TonnesOfC02equivGHGPerYear\": \"Has a calculation for TonnesOfC02equivGHGPerYear\",\n \"Has_PhoneNumbers\": \"Has at least one phone number\",\n \"Has_EmailAddresses\": \"Has at least one email address\",\n \"Has_GroupStructure\": \"Has some group structure\",\n \"Has_PersonsWithSignificantControl\": \"Has at least one persons with significant control\",\n \"Has_ShareHolders\": \"Has at least one shareholder\",\n \"Has_CompanyStatus\": \"Is active\",\n \"Has_RTICs\": \"Has at least one RTIC\",\n \"Has_SimilarCompanies\": \"Has at least one similar company identified\",\n \"Has_InnovationScore\": \"At least 1 star innovative\",\n \"Has_BestEstimateTurnover\": \"Has a best estimate for turnover\",\n \"Has_BestEstimateEmployees\": \"Has a best estimate for employees\",\n \"Has_DealroomFunding\": \"Has at least one funding round\",\n \"Has_InnovateUKFunding\": \"Has at least one Innovate UK round\",\n \"Has_360GivingFunding\": \"Has at least one 360 Giving round\",\n \"Has_HVMCCapabilities\": \"Has at least one manufacturing capability\",\n \"Has_EstimatedGVA\": \"Has GVA calculated\",\n \"Has_ESGStatementAnchors\": \"Has at least one ESG statement\",\n \"Has_Scaleup\": \"Is a scale up\",\n \"Has_WomenFounded\": \"Is women founded\",\n \"Has_OnlyWomenFounded\": \"Is only women founded\",\n \"Has_MetaKeywords\": \"Has at least one website meta keyword\"\n };\n\n return rowDescriptions[field];\n }\n\n createSummaryTable() {\n const analysisObject = this;\n const holder = coreFunctions.createElementHelper(\"div\", {class: \"summary-table-wrapper\"});\n holder.appendChild(coreFunctions.createElementHelper(\"input\", {id: \"summaryTableToggle\", type: \"checkbox\"}));\n holder.appendChild(coreFunctions.createElementHelper(\"label\", {for: \"summaryTableToggle\", innerHTML: \" \", class:\"actionControl\"}));\n\n const tableHolder = holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"table-holder summary-table-holder\"}));\n\n let title = tableHolder.appendChild(coreFunctions.createElementHelper(\"h4\", { innerHTML: \"Download data\" }));\n title.appendChild(coreFunctions.createElementHelper(\"button\", { class: \"actionControl summary-table-download\", innerHTML: \" \", title: \"Download field availability table\" }, { click: function (e) { analysisObject.downloadSummaryTable() } }));\n\n const table = tableHolder.appendChild(coreFunctions.createElementHelper(\"table\", {class: \"summary-table\"}));\n table.appendChild(coreFunctions.createElementHelper(\"thead\", {innerHTML: \"FieldCount%Description\"}));\n table.appendChild(coreFunctions.createElementHelper(\"tbody\"));\n\n return holder;\n }\n\n createSummaryTableContent() {\n const tableBody = document.querySelector('.listSummaryWrapper .summary-table-wrapper tbody');\n for (var field in this.summaryTable) {\n tableBody.appendChild(this.createSummaryTableRow(field, this.summaryTable[field], \"number\"));\n }\n }\n\n createSummaryTableRow(field, value, dataType) {\n const label = this.formatSummaryTableField(field);\n const valuePercentage = value / this.companiesConsidered;\n\n const valueFormatted = (dataType == \"percent\") ? new Intl.NumberFormat('en', { style: 'percent', minimumSignificantDigits: 2, maximumSignificantDigits: 3}).format(value) : value.toLocaleString();\n const valuePercentageFormatted = new Intl.NumberFormat('en', { style: 'percent', minimumSignificantDigits: 2, maximumSignificantDigits: 3}).format(valuePercentage);\n\n const row = coreFunctions.createElementHelper(\"tr\");\n row.appendChild(coreFunctions.createElementHelper(\"td\", {innerHTML: label}));\n row.appendChild(coreFunctions.createElementHelper(\"td\")).appendChild(coreFunctions.createElementHelper(\"span\", {\"data-type\": \"number\", innerHTML: valueFormatted}));\n row.appendChild(coreFunctions.createElementHelper(\"td\")).appendChild(coreFunctions.createElementHelper(\"span\", {\"data-type\": \"percentage\", innerHTML: valuePercentageFormatted}));\n row.appendChild(coreFunctions.createElementHelper(\"td\", {innerHTML: this.getSummaryTableRowDescription(field)}));\n return row;\n }\n\n formatSummaryTableField(field) {\n // Split at start of each capital letter, unless a specific acronym\n const pattern = /(?=[A-Z]{1}[a-z]{1,})|(?:(GVA|ESG|HVMC|RTICs|SICHLUs|SICs|C02|GHG|UK))/;\n return field.replace(\"Has_\", \"\").split(pattern).filter(word => word).join(\" \").replace(/_/g, \" \");\n }\n\n downloadSummaryTable() {\n let csvData, csv, blob, a, fileTitle;\n csvData = this.processSummaryTableCsvData();\n csv = Papa.unparse(csvData);\n blob = new Blob([csv]);\n fileTitle = `SummaryTable_${this.filtersObject.storedFiltersCode}.csv`;\n\n // For IE\n if (window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveBlob(blob, fileTitle);\n }\n // Other browsers\n else {\n a = window.document.createElement(\"a\");\n a.href = window.URL.createObjectURL(blob, {\n type: \"text/plain\"\n });\n a.download = fileTitle;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n }\n\n processSummaryTableCsvData() {\n const csvData = [[\"Field\", \"Value\", \"%\", \"Description\"]];\n for (const field in this.summaryTable) {\n const percentage = (this.summaryTable[field] / this.companiesConsidered) * 100;\n const valuePercentageFormatted = new Intl.NumberFormat('en', { style: 'decimal', minimumSignificantDigits: 2, maximumSignificantDigits: 3, unit: 'percent' }).format(percentage);\n csvData.push([this.formatSummaryTableField(field), this.summaryTable[field], valuePercentageFormatted, this.getSummaryTableRowDescription(field)]);\n }\n return csvData;\n }\n\n // Find matching location analysis field to allow summaries to be calculated for active location filters\n findLocationAnalysisField(filteredLocations, fieldType) {\n let locationAnalysisField;\n // If location filters are available, and not confined to registered address (values will match in this case)\n if (!this.analysisFilteredByRegisteredAddresses() && filteredLocations) {\n locationAnalysisField = this.fields.find(element => element.field.includes(fieldType) && element.locationFilterField == filteredLocations.field);\n }\n return locationAnalysisField;\n }\n // Return details of currently active location filters if available\n getActiveLocationFilters() {\n let locationFilters = null;\n // Check location filters are available and on\n if (this.filtersObject && this.filtersObject.page != \"compare\" && this.filtersObject.generalFilters.filterGroupIsActive(\"locations\")) {\n locationFilters = this.filtersObject.generalFilters.getFilteredLocations();\n }\n return locationFilters;\n }\n\n // Check whether analyis is restricted in some way to registered addresses\n analysisFilteredByRegisteredAddresses() {\n return (document.getElementById(\"calculateInsightsBasedOnlyOnRegisteredAddresses\").checked && document.getElementById(\"registeredAddressOnly\").checked);\n }\n\n getTotalDirectors() {\n return this.femaleDirectors + this.maleDirectors + this.unknownGenderDirectors;\n }\n\n calculateGvaPerEmployeeEstimate() {\n return this.bestEstimateGVA / this.bestEstimateTotalEmployees;\n }\n\n formatElementNames(array) {\n if (array.length < 5) {\n return new Intl.ListFormat('en-GB', { style: 'long', type: 'conjunction' }).format(array);\n } else {\n return `the ${array.length} selected locations`;\n }\n }\n\n addAnalyisSummary() {\n const companiesConsidered = (this.companiesConsidered) ? this.companiesConsidered.toLocaleString() : 0;\n if (this.modelCode == \"All\") {\n document.getElementById(\"cutoffSummary\").innerHTML = `Companies considered: ${companiesConsidered}`;\n } else {\n document.getElementById(\"cutoffSummary\").innerHTML = `Companies considered: ${companiesConsidered} | Score cutoff: ${this.cutoff}`;\n }\n return this;\n }\n\n displaySectionNavigation() {\n // TODO this needs something doing it\n //configureSectionNavigation();\n document.getElementById(\"sectionHolder\").classList.remove(\"hidden\");\n return this;\n }\n\n hideSectionNavigation() {\n document.getElementById(\"sectionHolder\").classList.add(\"hidden\");\n return this;\n }\n\n editWidgetSubmit(form) {\n let field = form.querySelector(\"input[name='field']\").value;\n let newChartType = form.querySelector(\"input[name='chartType']:checked\").value;\n this.fields.find(analysisField => analysisField.field == field).checkForChartRefresh(newChartType);\n coreFunctions.hideOverlay(document.querySelector(\"#editWidgetOverlay .overlayClose\"));\n }\n\n updateUrlAddressQuery() {\n let classificationRelease = coreFunctions.getQueryVariable('classification_release');\n let query = `?list_id=${this.listID}&model_code=${this.modelCode}&list_cutoff=${this.cutoff}&list_size=${this.listSize}&origin_list=false&filters_code=${this.filtersObject.storedFiltersCode}`;\n if (classificationRelease) {\n query += `&classification_release=${classificationRelease}`;\n }\n\n // Update link\n window.history.replaceState('searchquery', 'searchqueryedit', query);\n return this;\n }\n\n prepareCompleteAnalysisDownload() {\n let method, url;\n const analysisObject = this;\n const input = {\n title: this.title,\n analysis: this.processCompleteAnalysisDownloadData()\n }\n\n method = \"POST\";\n url = `../api/analyse/analyse_actions.php?action=preparedownload&modelcode=${this.modelCode}&cutoff=${this.cutoff}`;\n\n const prepareListDownloadSuccess = function (response) {\n const responseParsed = JSON.parse(response);\n let filename = responseParsed.zip_filename;\n analysisObject.downloadCompleteAnalysis(filename);\n }\n\n const prepareListDownloadError = function () {\n console.log(\"Error preparing download\");\n }\n\n coreFunctions.xhrHelper(method, url, prepareListDownloadSuccess, prepareListDownloadError, JSON.stringify(input));\n }\n\n processCompleteAnalysisDownloadData() {\n let processedTopCompanyData;\n const completeAnaylsisDownloadData = [];\n this.fields.forEach((field) => {\n completeAnaylsisDownloadData.push(field.processFieldForCompleteAnalysisDownload());\n if (processedTopCompanyData = field.checkTopCompaniesForCompleteDownload()) {\n completeAnaylsisDownloadData.push(processedTopCompanyData)\n }\n });\n return completeAnaylsisDownloadData;\n }\n\n downloadCompleteAnalysis(filename) {\n let a = window.document.createElement(\"a\");\n a.download = \"\";\n a.href = `../api/analyse/analyse_actions.php?action=download&modelcode=${this.modelCode}&cutoff=${this.cutoff}&filename=${filename}`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n\n // Sort dealroom data, remove years where no data available. Sort by year descending. Dealroom data in millions, convert to absolute value.\n processDealroomData(data) {\n return data.filter(element => isNaN(element.Count) === false && element.Count > 0).sort((a, b) => {\n if (Number(a.Thing) > Number(b.Thing)) {\n return -1;\n } else if (Number(b.Thing) < Number(a.Thing)) {\n return 1;\n } else {\n return 0;\n }\n }).map(function(element) {\n element.Count = element.Count;\n return element;\n });\n }\n\n processInnovateUkData(data) {\n return data.filter(element => element.Thing.toString().length == 4);\n }\n\n processJobPostingsOverTimeData(data) {\n let array = data.sort((a,b) => parseInt(a.Thing) - parseInt(b.Thing));\n array.forEach(element => element.Thing = moment(element.Thing, \"X\").format(\"YYYY-MM\"));\n return array;\n }\n\n // Syncs displaying of extra results accross subsection fields\n toggleSubsubSectionExtraResults(subsection, subSubsection, chartType) {\n const subSubsectionFields = this.getAnalysisFieldsInSubsubsection(subsection, subSubsection);\n // Each each subsection field has a chart that can be expanded\n subSubsectionFields.forEach(element => {\n if (element.chart) {\n let button;\n if (button = document.querySelector(`.showExtraResultsControl[field='${element.field}']`)) {\n if (typeof element.chart.toggleExtraResults === 'function') {\n element.chart.toggleExtraResults(button);\n }\n // For widget with multiple chart type - TODO improve this implementation\n else if (Array.isArray(element.chartType)) {\n button.classList.toggle(\"open\");\n document.querySelector(`.barchartHolder[field='${element.field}'] .barchartExtras`).classList.toggle(\"open\");\n }\n }\n }\n });\n }\n\n getAnalysisFieldsInSubsubsection(subsection, subSubsection) {\n return this.fields.filter(element => (element.subsection == subsection && element.subSubsection == subSubsection));\n }\n\n updateSubSubsectionMapVisibleMarkers(subsection, subSubsection, resultsToShow) {\n const subSubsectionFields = this.getAnalysisFieldsInSubsubsection(subsection, subSubsection);\n subSubsectionFields.forEach(element => {\n if (element.bubbleMap) {\n element.bubbleMap.updateMapVisibleMarkers(resultsToShow);\n }\n });\n\n }\n\n // Reset widget expanation when new subsubsection selected\n refreshSubSubsectionWidgetExplanation(subsection, subSubsection) {\n let element;\n // Remove existing element\n if (element = document.querySelector(`.subSubsectionControls[data-subsection='${subsection}'] .tooltip-explanation-holder`)) {\n element.remove();\n }\n this.createSubSubsectionWidgetExplanation(subsection, subSubsection);\n }\n\n // Check if there is extra text/explainer in a tooltip\n tooltipContainsKnowledgeBaseLinkOnly(tooltip) {\n const div = document.createElement(\"div\");\n div.innerHTML = tooltip;\n return Array.from(div.childNodes).find(element => element.nodeType === Node.TEXT_NODE) == undefined;\n }\n\n createSubSubsectionWidgetExplanation(subsection, subSubsection) {\n const subSubsectionFields = this.getAnalysisFieldsInSubsubsection(subsection, subSubsection);\n const holder = document.querySelector(`.subSubsectionControls[data-subsection='${subsection}'] .subSubsectionSelectHolder`);\n if (subSubsectionFields.length && !holder.querySelector(\".tooltip-explanation-holder\")) {\n const tooltip = subSubsectionFields.reduce(\n (accumulator, element) => accumulator + ((element.explanation) ? `

${element.label}${element.explanation}

` : \"\"),\n \"\",\n ); // Hide widget title if tooltip is just a link to the knowledge base, no extra text\n if (tooltip.length) {\n holder.appendChild(coreFunctions.createTooltipElement(tooltip, `${subSubsection}-tooltip`));\n }\n }\n }\n}\n\nclass AnalysisField {\n constructor(field, label, subsection, dataType, explanation, chartType, allowedChartTypes, listID, thingColumnLabel, emptyFieldLabel, displayDataAsPercentage, locationFilterField, listTitle, parent, subSubsection, stackedBarchartOptions) {\n this.field = field;\n this.label = label;\n this.subsection = subsection;\n this.dataType = dataType;\n this.explanation = explanation;\n this.fieldElements = [];\n this.perCapitaElements = [];\n this.perCapitaMultiplier = 1000;\n this.topCompanies = new TopCompanies(field, label, dataType);\n this.widget = null;\n this.chartType = chartType;\n this.allowedChartTypes = allowedChartTypes;\n this.listID = listID;\n this.thingColumnLabel = thingColumnLabel;\n this.emptyFieldLabel = emptyFieldLabel;\n this.totalCount = null;\n this.locationQuotientElements = [];\n this.displayDataAsPercentage = displayDataAsPercentage;\n this.locationFilterField = locationFilterField; // The corresponding location filter field for this geography if available\n this.listTitle = listTitle;\n this.parent = parent;\n this.subSubsection = subSubsection;\n this.bubbleMap;\n this.stackedBarchartOptions = stackedBarchartOptions;\n this.chart;\n }\n\n addTotalCount(total) {\n this.totalCount = total;\n return this;\n }\n\n sumOverElements(elements) {\n const fieldsToCheck = ['id', 'thing'];\n return this.fieldElements.filter(element => fieldsToCheck.some(i => elements.includes(element[i]))).reduce((accumulator, element) => accumulator + element.count, 0);\n }\n\n dataHasLocationFields(element) {\n return (element.hasOwnProperty(\"Latitude\") && element.hasOwnProperty(\"Longitude\"));\n }\n\n addCompanyActiveDatesElements(elements) {\n const rticsFilterIsActive = this.parent.filtersObject.rticFilters.rticsFilterIsActive();\n this.fieldElements = elements.map(element => new CompanyActiveDate(element.Year, element.Founded_Count, rticsFilterIsActive ? 0 : element.Died_Count, rticsFilterIsActive ? (element.ActiveCount + (element.Died_Count ?? 0)) : element.ActiveCount));\n return this;\n }\n\n addJobPostingInsightsElements(elements) {\n this.fieldElements = elements.map(element => new JobPostingInsight(this.field, element.SOC4Code, element.SOC4Name, element.Postings, element.Median_Salary, element.JobPostingsAndSalariesTimeSeries));\n return this;\n }\n\n addAnalysisFieldElements(data, nameField) {\n // TODO new ID field would go in here\n let analysisFieldObject = this;\n if (data.length > 0) {\n nameField = (data[0].Name) ? \"Name\" : nameField; // Check for existence of name field, use this by default. Otherwise set from function argument likely to be \"Thing\"\n let fieldHasLocationData = analysisFieldObject.dataHasLocationFields(data[0]);\n data.forEach(element => {if (element[nameField] != undefined && element[nameField] != \"\") {analysisFieldObject.newAnalysisFieldElement(analysisFieldObject.field, element[nameField], element.Count, (fieldHasLocationData) ? element.Latitude : null, (fieldHasLocationData) ? element.Longitude : null, analysisFieldObject.dataType, analysisFieldObject.thingColumnLabel, element.Quotient ?? null, element.ID ?? null)}});\n }\n return this;\n }\n\n newAnalysisFieldElement(field, thing, count, latitude, longitude, dataType, thingColumnLabel, quotient, id) {\n let analysisFieldElement = new AnalysisFieldElement(field, thing, count, latitude, longitude, dataType, thingColumnLabel, quotient, id);\n this.fieldElements.push(analysisFieldElement);\n return analysisFieldElement;\n }\n\n addPerCapitaFieldElements(data, nameField) {\n let analysisFieldObject = this;\n if (data.length > 0) {\n let fieldHasLocationData = analysisFieldObject.dataHasLocationFields(data[0]);\n data.forEach(element => analysisFieldObject.newPerCapitaElement(analysisFieldObject.field, element[nameField], element.Count, (fieldHasLocationData) ? element.Latitude : null, (fieldHasLocationData) ? element.Longitude : null, analysisFieldObject.dataType, analysisFieldObject.thingColumnLabel));\n }\n return this;\n }\n\n newPerCapitaElement(field, thing, count, latitude, longitude, dataType, thingColumnLabel) {\n let analysisFieldElement = new AnalysisFieldElement(field, thing, count, latitude, longitude, dataType, thingColumnLabel);\n this.perCapitaElements.push(analysisFieldElement);\n return analysisFieldElement;\n }\n\n fieldHasLocationQuotientData() {\n // Field has data values with location quotient values\n return (this.fieldElements.find(element => element.quotient != undefined) != undefined);\n }\n\n fieldHasIdData() {\n return this.fieldElements.find(element => element.id) != undefined;\n }\n\n addAnalysisFinancialFieldElements(measuredYearValues, projectedYearValues) {\n let analysisFieldObject = this;\n let measuredYears = [];\n measuredYearValues.forEach((measuredYear) => {\n let year, measuredYearValue, measuredYearCompanies, projectedYearValue, projectedYearCompanies;\n year = measuredYear.Year;\n measuredYears.push(year);\n measuredYearValue = measuredYear.Number;\n measuredYearCompanies = measuredYear.Companies;\n\n const projectedYearSearch = projectedYearValues.find(projectedYear => projectedYear.Year == year);\n projectedYearValue = (projectedYearSearch) ? projectedYearSearch.Number : null;\n projectedYearCompanies = (projectedYearSearch) ? projectedYearSearch.Companies : null;\n analysisFieldObject.newAnalysisFinancialFieldElement(year, measuredYearValue, measuredYearCompanies, projectedYearValue, projectedYearCompanies, analysisFieldObject.dataType);\n });\n\n projectedYearValues.forEach((projectedYear) => {\n if (!measuredYears.includes(projectedYear.Year)) {\n analysisFieldObject.newAnalysisFinancialFieldElement(projectedYear.Year, null, null, projectedYear.Number, projectedYear.Companies, analysisFieldObject.dataType);\n }\n });\n\n this.sortByField(\"year\", \"desc\");\n return analysisFieldObject;\n }\n\n sortByField(field, sort) {\n this.fieldElements = this.fieldElements.sort((a, b) => a[field]-b[field]);\n // Sort in descending order\n if (sort && sort == \"desc\") {\n this.fieldElements.reverse();\n }\n return this;\n }\n\n newAnalysisFinancialFieldElement(year, measuredYearValue, measuredYearCompanies, projectedYearValue, projectedYearCompanies, dataType) {\n let analysisFieldElement = new AnalysisFinancialFieldElement(year, measuredYearValue, measuredYearCompanies, projectedYearValue, projectedYearCompanies, dataType);\n this.fieldElements.push(analysisFieldElement);\n return analysisFieldElement;\n }\n\n addPercentageFieldElements() {\n return this;\n }\n\n hasLocationData() {\n return (this.fieldElements.length > 0 && this.fieldElements[0].latitude != undefined && this.fieldElements[0].longitude != undefined);\n }\n\n // Check if subSubsector is currently active or section does not have any subsectors\n addAnalyseFieldToPage() {\n let subSubsectionSelectElement = document.querySelector(`select.subSubsectionSelect[data-subsection='${this.subsection}']`);\n return (!this.subSubsection || (subSubsectionSelectElement && subSubsectionSelectElement.value == this.subSubsection));\n }\n\n createAnalysisWidget() {\n if (this.hasLocationData()) {\n // this.createLocationWidget().createLocationQuotientControl().createDataChart().createMap();\n this.createGeneralWidget().createLocationQuotientControl().createDataChart().createMap();\n } else {\n this.createGeneralWidget().createLocationQuotientControl().createAbsolutePercentageDataToggleControl().createDataChart();\n this.topCompanies.addTopCompaniesToPage();\n }\n return this;\n }\n\n createTopCompanies(topCompanies, allowZeroValues) {\n if (topCompanies) {\n this.topCompanies.addTopCompanies(topCompanies, allowZeroValues);\n }\n return this;\n }\n\n createLocationWidget() {\n let subsection, locationContentContainer, locationWidgetHolder, locationWidgetWrapper, locationData;\n subsection = document.querySelector(`#listSummaryHolder .subsection[data-section='${this.subsection}']`);\n\n locationContentContainer = subsection.querySelector(\".locationContentContainer\");\n if (locationContentContainer == undefined) {\n locationContentContainer = coreFunctions.createElementHelper(\"div\", {class: \"locationContentContainer\"});\n subsection.insertBefore(locationContentContainer, subsection.lastChild);\n }\n\n locationWidgetHolder = coreFunctions.createElementHelper(\"div\", { class: \"locationDataHolder\", id: `${this.field}Widget`, \"data-subsection\": this.subsection, \"data-subsubsection\": this.subSubsection });\n\n locationWidgetWrapper = coreFunctions.createElementHelper(\"div\", { class: \"locationDataWrapper\" });\n locationWidgetHolder.appendChild(locationWidgetWrapper);\n locationWidgetWrapper.appendChild(this.createWidgetTitleBar());\n\n locationData = coreFunctions.createElementHelper(\"div\", { class: \"locationData\" });\n locationWidgetWrapper.appendChild(locationData);\n locationData.appendChild(this.createLocationWidgetVisualisationHolder(false));\n locationData.appendChild(this.createLocationWidgetVisualisationHolder(true));\n locationContentContainer.appendChild(locationWidgetHolder);\n return this;\n }\n\n createLocationWidgetVisualisationHolder(mapVisualisation) {\n let listSummaryPanel;\n listSummaryPanel = coreFunctions.createElementHelper(\"div\", { class: \"listSummaryPanel\" });\n listSummaryPanel.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"listSummaryWrapper\" })).appendChild(coreFunctions.createElementHelper(\"div\", { class: `barchartHolder${(mapVisualisation) ? \" mapHolder\" : \"\"}`, field: this.field, \"data-chartgroup\": this.subSubsection ?? this.field }));\n if (!mapVisualisation) {\n listSummaryPanel.querySelector(\".barchartHolder\").appendChild(coreFunctions.createElementHelper(\"div\", {class: \"chartContentHolder\", \"data-field\": this.field}));\n }\n return listSummaryPanel;\n }\n\n createGeneralWidget() {\n let listSummaryPanel, listSummaryWrapper, barchartHolder;\n\n listSummaryPanel = coreFunctions.createElementHelper(\"div\", { class: \"listSummaryPanel\", field: this.field, id: `${this.field}Widget`, \"data-subsection\": this.subsection, \"data-subsubsection\": this.subSubsection });\n document.querySelector(`#listSummaryHolder .subsection[data-section='${this.subsection}'] .mainDataHolder`).appendChild(listSummaryPanel);\n\n // If multiple charts displayed simultaneously make the widget full width. Display charts side by side\n if (Array.isArray(this.chartType)) {\n listSummaryPanel.classList.add(\"full-width\");\n }\n\n listSummaryWrapper = coreFunctions.createElementHelper(\"div\", { class: \"listSummaryWrapper\" });\n listSummaryPanel.appendChild(listSummaryWrapper);\n\n // TODO change this to a new class\n barchartHolder = coreFunctions.createElementHelper(\"div\", { class: \"barchartHolder\", field: this.field, \"data-chartgroup\": this.subSubsection ?? this.field }); // Add group attribute to chart based on subsubsection if available\n listSummaryWrapper.appendChild(barchartHolder);\n\n barchartHolder.appendChild(this.createWidgetTitleBar());\n barchartHolder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"chartContentHolder\", \"data-field\": this.field}));\n return this;\n }\n\n createWidgetControlsElements() {\n let insightsWidgetActionsControlHolder, insightsWidgetActionControlLabel, insightsWidgetActionControlLabelToggle, actionsHolder;\n const analyisFieldObject = this;\n\n if (this.subSubsection && this.allowedChartTypes.length > 1) {\n this.parent.createSubSubsectionChartTypesControl(this.subsection, this.subSubsection);\n }\n\n insightsWidgetActionsControlHolder = coreFunctions.createElementHelper(\"span\", { class: \"insightsActionsControlHolder\" });\n insightsWidgetActionsControlHolder.appendChild(coreFunctions.createElementHelper(\"button\", { innerHTML: \" \", class: \"actionControl insights-download\", field: this.field, title: \"Download analysis data\" }, { click: function (e) { analyisFieldObject.downloadAnalysisData() } }));\n\n\n // insightsWidgetActionsControlHolder.appendChild(coreFunctions.createElementHelper(\"input\", { class: \"insightsActionsControl\", type: \"checkbox\", id: `insightsActionsControl-${this.field}`, field: this.field })); // Checkbox element\n\n // insightsWidgetActionControlLabel = coreFunctions.createElementHelper(\"label\", { class: \"insightsActionsControlLabel\", for: `insightsActionsControl-${this.field}` });\n // insightsWidgetActionsControlHolder.appendChild(insightsWidgetActionControlLabel); // Label element for content\n\n // insightsWidgetActionControlLabelToggle = coreFunctions.createElementHelper(\"span\", { \"class\": \"controlsToggle\", innerHTML: \" \" });\n // insightsWidgetActionControlLabel.appendChild(insightsWidgetActionControlLabelToggle);\n\n // actionsHolder = coreFunctions.createElementHelper(\"span\", { class: \"controls\" });\n // insightsWidgetActionControlLabelToggle.appendChild(actionsHolder);\n\n // actionsHolder.appendChild(coreFunctions.createElementHelper(\"a\", { innerHTML: \"View list\", class: \"actionControl actions-view-list\", href: `${urlPath}${(this.listID == \"All\") ? `/explore?filters_code=${this.parent.filtersObject.storedFiltersCode}` : `/ml_list?list_id=${this.listID}`}` })); // View list action\n\n // actionsHolder.appendChild(coreFunctions.createElementHelper(\"button\", { innerHTML: \"Download\", class: \"actionControl actions-download\", field: this.field, title: \"Download analysis data\" }, { click: function (e) { analyisFieldObject.downloadAnalysisData() } })); // Download analysis data\n\n // // Multiple chart types are available\n // if (this.allowedChartTypes.length > 1) {\n // actionsHolder.appendChild(coreFunctions.createElementHelper(\"button\", { innerHTML: \"Edit widget\", class: \"actionControl actions-edit\", field: this.field, title: \"Edit widget\" }, { click: function (e) { analyisFieldObject.prepareEditWidgetControls() } }));\n // }\n return insightsWidgetActionsControlHolder;\n }\n\n createWidgetExplanationElement() {\n let widgetExplanationHolder = coreFunctions.createElementHelper(\"span\", { class: \"widgetExplanationHolder\" });\n\n widgetExplanationHolder.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"checkbox\", id: `widgetExplanationCheckbox${this.field}` })); // Checkbox\n\n widgetExplanationHolder.appendChild(coreFunctions.createElementHelper(\"label\", { for: `widgetExplanationCheckbox${this.field}`, innerHTML: `?${this.explanation}` })); // Label with explanation element can be toggled on and off\n\n return widgetExplanationHolder;\n }\n\n createWidgetTitleBar() {\n let titleBar, widgetTitle, widgetControls;\n\n titleBar = coreFunctions.createElementHelper(\"h3\", {class: \"flex-row-holder align-center\"});\n const widgetTitleLabel = `${this.label}${(this.parent.listFiltersDescription) ? ` ${this.parent.listFiltersDescription}` : \"\"}`;\n widgetTitle = coreFunctions.createElementHelper(\"span\", { class: \"widgetTitle flex-grow\", innerHTML: widgetTitleLabel, title: this.label.replace(/()/, \"\") });\n titleBar.appendChild(widgetTitle);\n\n widgetControls = coreFunctions.createElementHelper(\"span\", { class: \"widgetControls\" });\n titleBar.appendChild(widgetControls);\n\n // Explanation for widget, add to shared subsubsection element if available\n if (this.explanation) {\n // Create shared element\n if (this.subSubsection) {\n this.parent.createSubSubsectionWidgetExplanation(this.subsection, this.subSubsection);\n } else {\n widgetControls.appendChild(this.createWidgetExplanationElement());\n }\n\n }\n widgetControls.appendChild(this.createWidgetControlsElements());\n\n return titleBar;\n }\n\n prepareEditWidgetControls() {\n const analysisField = this;\n let chartTypeControls = Array.from(document.querySelectorAll(\"#editWidgetForm input[name='chartType']\"));\n // Hide widget actions\n document.querySelector(`.insightsActionsControl[field='${analysisField.field}']`).checked = false;\n\n // Set field value\n document.querySelector(\"#editWidgetForm input[name='field']\").value = analysisField.field;\n // Set current type of chart\n document.querySelector(`#editWidgetForm input[name='chartType'][value='${analysisField.chartType}']`).checked = true;\n // Setup controls according to charts allowed for a particular field\n chartTypeControls.forEach(function (control) {\n if (analysisField.allowedChartTypes.indexOf(control.value) == -1) {\n control.disabled = true;\n } else {\n control.disabled = false;\n }\n });\n coreFunctions.showOverlay(\"editwidget\");\n\n document.getElementById(\"editWidgetForm\")\n }\n\n downloadAnalysisData() {\n let csvData, csv, blob, a, fileTitle;\n\n csvData = this.processCsvData();\n csv = Papa.unparse(csvData);\n blob = new Blob([csv]);\n fileTitle = `${this.listTitle.replace(/ /g, \"_\")}-${this.label.replace(/ /g, \"_\").replace(/()/, \"\")}.csv`; // Remove in images from title\n\n // For IE\n if (window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveBlob(blob, fileTitle);\n }\n // Other browsers\n else {\n a = window.document.createElement(\"a\");\n a.href = window.URL.createObjectURL(blob, {\n type: \"text/plain\"\n });\n a.download = fileTitle;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n }\n\n processCsvFinancialData() {\n // Data\n var input = listSummary[field];\n\n // Headings\n var output = [[\"Year\", \"Measured total\", \"Measured companies\", \"Projected total\", \"Projected companies\"]];\n\n // Loop through available measured values\n var measuredValues = input.MeasuredYearValues;\n for (var i = 0; i < measuredValues.length; i++) {\n // Measured fields\n var year = measuredValues[i].Year;\n var measuredTotal = measuredValues[i].Number;\n var measuredCompanies = measuredValues[i].Companies;\n\n // Check whether there are projected values for this year\n var projectedEntry = input.ProjectedYearValues.find(function (entry) {\n return entry.Year == year;\n });\n\n // Projected data available\n if (projectedEntry) {\n var projectedTotal = projectedEntry.Number;\n var projectedCompanies = projectedEntry.Companies;\n } else {\n var projectedTotal = \"\";\n var projectedCompanies = \"\";\n }\n\n // Add data to output\n output.push([year, measuredTotal, measuredCompanies, projectedTotal, projectedCompanies]);\n }\n\n return output;\n }\n\n processCsvData() {\n let totalElements, header, fieldElement, hasLocationQuotientData, row;\n const csvData = [];\n totalElements = this.fieldElements.length;\n header = true;\n hasLocationQuotientData = this.fieldHasLocationQuotientData();\n const fieldHasIdData = this.fieldHasIdData();\n for (var i = 0; i < totalElements; i++) {\n fieldElement = this.fieldElements[i];\n console.log(fieldElement);\n if (header) {\n csvData.push(fieldElement.getHeaders(hasLocationQuotientData, fieldHasIdData));\n }\n row = fieldElement.formatElementForCsv(fieldHasIdData);\n if (hasLocationQuotientData === true) {\n row.push(fieldElement.quotient);\n }\n csvData.push(row);\n header = false;\n }\n return csvData;\n }\n\n checkForChartRefresh(newChartType) {\n if (this.chartType != newChartType && this.allowedChartTypes.includes(newChartType)) {\n this.resetDataChart(newChartType).createDataChart();\n }\n }\n\n resetDataChart(newChartType) {\n let existingChartContent = document.querySelector(`.barchartHolder[field='${this.field}'] .barchartContentWrapper`);\n existingChartContent.parentNode.removeChild(existingChartContent);\n this.chartType = newChartType;\n return this;\n }\n\n createDataChart() {\n const self = this;\n let chartTypes = (Array.isArray(this.chartType)) ? this.chartType : [this.chartType];\n chartTypes.forEach(chartType => {\n if (typeof chartType == \"object\") {\n this.processChartObject(chartType);\n } else if (chartType == \"line\") {\n this.chart = new Linechart(self.field, self.fieldElements, self.label, self.dataType).prepareLinechartHolder();\n if (self.isFinancialField()) {\n this.chart.drawLinechart().addLinechartActions();\n } else if (self.field == \"CompanyFoundingDates\") {\n this.chart.drawCumulativeLinechart().addCumulativeLinechartSummary();\n } else if (self.field == \"CompanyActiveDates\") {\n this.chart.drawSeriesLinechart(this.chartSeries);\n } else {\n this.chart.drawTimestampBarChart();\n }\n } else if (chartType == \"bar_stacked\") {\n this.chart = new StackedBarchart(self.field, self.fieldElements, self.dataType, self.stackedBarchartOptions).createStackedBarchart();\n } else {\n if (self.isFinancialField()) {\n this.chart = new FinancialsBarchart(self.field, self.fieldElements, self.label).getMaximumCount().createBarchart();\n } else {\n this.chart = new Barchart(self.field, self.fieldElements, self.dataType, self.emptyFieldLabel, self.label, false, null, false, this).getMaximumCount().createBarchart();\n }\n }\n });\n return this;\n }\n\n\n updateChartSourceData(value, labelField, keyField, chart) {\n let chartObject;\n if (chartObject = this.chartType.find(element => element.type == chart)) {\n const chartSettings = {\n field: keyField,\n label: labelField,\n value: value\n };\n this.processChartObject(chartObject, chartSettings);\n }\n }\n\n processLinechartObject(chartObject, chartSettings) {\n let chart, title;\n switch (chartObject.subtype) {\n case \"series\":\n chart = new Linechart(this.field, this.fieldElements, this.label, this.dataType, chartObject.subfield);\n chart.prepareSubgroupLinechartHolder(chartObject.title, chartObject.series).drawSeriesLinechart(chartObject.series);\n break;\n case \"timestamp\":\n const elements = this.processTimeSeriesData(chartSettings ?? chartObject.defaults);\n chart = new Linechart(this.field, elements, this.label, this.dataType, chartObject.subfield);\n if (chartSettings) {\n chart.clearExistingLinechartHolder();\n title = `${chartObject.title} (${this.getChartLabel(chartSettings)})`;\n } else {\n title = `${chartObject.defaults.label} ${chartObject.title}`;\n }\n chart.prepareSubgroupLinechartHolder(title, null).drawTimestampBarChart();\n break;\n }\n }\n\n processChartObject(chartObject, chartSettings) {\n let chart;\n switch(chartObject.type) {\n case \"line\":\n this.processLinechartObject(chartObject, chartSettings);\n break;\n case \"bar\":\n const chartElements = this.fieldElements.flatMap(element => ((element[chartObject.yField]) ? [new AnalysisFieldElement(this.field, element[chartObject.xField], element[chartObject.yField], null, null, this.dataType, null, null, null)] : [])).reverse();\n chart = new Barchart(this.field, chartElements, this.dataType, this.emptyFieldLabel, this.label, false, null, false, this).getMaximumCount().createSubgroupBarchart(chartObject.title, chartObject.subfield);\n break;\n case \"slider\":\n const slider = new Slider(this.field, this.fieldElements, chartObject.title, chartObject.sliderField, chartObject.min, chartObject.max, chartObject.starts, chartObject.series, chartObject.compareField);\n slider.createSliderElements().createSlider().updateSliderSummary();\n break;\n case \"table\":\n const table = new DataTable(this.field, this.fieldElements, chartObject.headings, chartObject.columns, chartObject.drilldown, chartObject.title, this);\n table.createDataTableElement();\n break;\n default:\n }\n }\n\n getChartLabel(settings) {\n let label = \"\";\n let object = this.fieldElements.find(element => element[settings.field] == settings.value);\n if (object) {\n label = object[settings.label];\n }\n return label;\n }\n\n processTimeSeriesData(settings) {\n let object = this.fieldElements.find(element => element[settings.field] == settings.value);\n let array = [];\n if (object) {\n array = object.timeSeries.map(element => new AnalysisFieldElement(this.field, this.formatTimestamp(element.Timestamp), element.Postings, null, null, this.dataType, null, null, null))\n }\n return array;\n }\n\n formatTimestamp(timestamp) {\n return moment(timestamp, \"X\").format(\"YYYY-MM\");\n }\n\n isFinancialField() {\n return (this.fieldElements.length > 0 && this.fieldElements[0].constructor.name == \"AnalysisFinancialFieldElement\");\n }\n\n createMap() {\n if (this.hasLocationData()) {\n this.bubbleMap = new BubbleMap(this.field, null, false, this).createMap().createMapBubbles(this.fieldElements).getMaxCount().addBubblesToMap();\n }\n return this;\n }\n\n createPerCapitaMap() {\n this.bubbleMap = new BubbleMap(this.field, this.perCapitaMultiplier, false, this).createMap().createMapBubbles(this.perCapitaElements).getMaxCount().addBubblesToMap();\n return this;\n }\n\n createLocationQuotientMap() {\n if (this.hasLocationData()) {\n this.bubbleMap = new BubbleMap(this.field, null, true, this).createMap().createMapBubbles(this.fieldElements).getMaxCount().addBubblesToMap();\n }\n return this;\n }\n\n processFieldForCompleteAnalysisDownload() {\n const processedFieldForDownload = {\n name: this.label,\n data: []\n };\n const analysisFieldObject = this;\n let processedFieldElement;\n const fieldHasIdData = this.fieldHasIdData();\n\n this.fieldElements.forEach(element => {\n processedFieldElement = element.processElementForCompleteDownload(fieldHasIdData);\n Object.assign(processedFieldElement, (element.quotient) ? {\"Location quotient\" : element.quotient } : false);\n processedFieldForDownload.data.push(processedFieldElement);\n });\n return processedFieldForDownload;\n }\n\n checkTopCompaniesForCompleteDownload() {\n if (this.topCompanies.topCompaniesAvailable()) {\n const processedTopCompaniesForDownload = this.topCompanies.processTopCompaniesForCompleteDownload();\n return processedTopCompaniesForDownload;\n } else {\n return null;\n }\n }\n\n hasPercapitaData() {\n return this.perCapitaElements.length > 0;\n }\n\n locationQuotientSearch(location) {\n let locationSearch;\n if (locationSearch = this.locationQuotientElements.find(element => element.thing == location)) {\n return locationSearch.count;\n } else {\n return null;\n }\n }\n\n hasPercentageData() {\n return this.displayDataAsPercentage === true;\n }\n\n createAbsolutePercentageDataToggleControl() {\n let controls;\n const analysisFieldObject = this;\n\n if (this.hasPercentageData()) {\n // If field belongs to subsubsection it will use a shared control\n if (this.subSubsection) {\n this.parent.processAbsolutePercentageSubSubSectionControl(this.subsection, this.subSubsection);\n } else {\n controls = coreFunctions.createElementHelper(\"form\", { field: this.field, class: \"chartSourceDataControls\" }, { change: function () { analysisFieldObject.absolutePercentageDataToggleChange() } });\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${this.field}-absoluteData`, name: `${this.field}-absolutePercentageData`, value: \"absolute\", checked: true }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${this.field}-absoluteData`, innerHTML: \"Absolute\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${this.field}-percentageData`, name: `${this.field}-absolutePercentageData`, value: \"percentage\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${this.field}-percentageData`, innerHTML: \"Percentage\" }));\n\n document.querySelector(`.barchartHolder[field='${this.field}']`).appendChild(controls);\n }\n }\n\n return this;\n }\n\n absolutePercentageDataToggleChange(dataSource) {\n if (this.hasPercentageData()) {\n if (!dataSource) {\n dataSource = document.querySelector(`[name='${this.field}-absolutePercentageData']:checked`).value;\n }\n if (dataSource == \"percentage\") {\n this.chart = new Barchart(this.field, this.fieldElements, this.dataType, this.emptyFieldLabel, this.label, false, this.totalCount, false, this).getMaximumCount(true).createBarchart(true)\n } else {\n this.chart = new Barchart(this.field, this.fieldElements, this.dataType, this.emptyFieldLabel, this.label, false, null, false, this).getMaximumCount().createBarchart()\n }\n }\n }\n\n createPerCapitaControl() {\n let controls;\n const analysisFieldObject = this;\n\n if (this.hasPercapitaData()) {\n controls = coreFunctions.createElementHelper(\"form\", { field: this.field, class: \"chartSourceDataControls\" }, { change: function () { analysisFieldObject.perCapitaControlChange() } });\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${this.field}-absolute`, name: `${this.field}-chartSourceData`, value: \"absolute\", checked: true }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${this.field}-absolute`, innerHTML: \"Absolute\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${this.field}-percapita`, name: `${this.field}-chartSourceData`, value: \"percapita\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${this.field}-percapita`, innerHTML: `Per ${this.perCapitaMultiplier} residents` }));\n\n document.querySelector(`.barchartHolder[field='${this.field}']`).appendChild(controls);\n }\n return this;\n }\n\n perCapitaControlChange() {\n let dataSource = document.querySelector(`[name='${this.field}-chartSourceData']:checked`).value;\n if (dataSource == \"absolute\") {\n this.chart = new Barchart(this.field, this.fieldElements, this.dataType, this.emptyFieldLabel, this.label, false, null, false, this).getMaximumCount().createBarchart();\n this.createMap();\n } else {\n this.chart = new Barchart(this.field, this.perCapitaElements, this.dataType, this.emptyFieldLabel, this.label, true, null, false, this).getMaximumCount().createBarchart();\n this.createPerCapitaMap();\n }\n }\n\n isSectorsSubsectionMember() {\n return this.subsection && this.subsection == \"RTICs and sectors\";\n }\n\n createLocationQuotientControl() {\n let controls;\n const analysisFieldObject = this;\n // Don't give location filtering option is user is using locations to filter, unless sectors field\n if (this.fieldHasLocationQuotientData() && (!this.parent.filterByLocationIsActive() || this.isSectorsSubsectionMember())) {\n // If field belongs to subsubsection it will use a shared control\n if (this.subSubsection) {\n this.parent.createLocationQuotientSubSubSectionControl(this.subsection, this.subSubsection);\n } else {\n controls = coreFunctions.createElementHelper(\"form\", { field: this.field, class: \"chartSourceDataControls\" }, { change: function () { analysisFieldObject.locationQuotientControlChange() } });\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${this.field}-absolute`, name: `${this.field}-chartSourceData`, value: \"absolute\", checked: true }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${this.field}-absolute`, innerHTML: \"Absolute\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"radio\", id: `${this.field}-locationquotient`, name: `${this.field}-chartSourceData`, value: \"locationquotient\" }));\n\n controls.appendChild(coreFunctions.createElementHelper(\"label\", { for: `${this.field}-locationquotient`, innerHTML: `Location quotient` }));\n\n // Add controls before chart\n document.querySelector(`.barchartHolder[field='${this.field}'] .chartContentHolder`).before(controls);\n }\n }\n return this;\n }\n\n locationQuotientControlChange(dataSource) {\n if (!dataSource) {\n dataSource = document.querySelector(`[name='${this.field}-chartSourceData']:checked`).value;\n }\n\n const widgetHolder = document.querySelector(`.listSummaryPanel[field='${this.field}']`);\n widgetHolder.classList.toggle(\"hidden\", (dataSource == \"locationquotient\" && !this.fieldHasLocationQuotientData())); // Hide widget if it does not have required location quotient data\n\n if (this.fieldHasLocationQuotientData()) {\n // Update the charts based on input\n if (dataSource == \"absolute\") {\n this.chart = new Barchart(this.field, this.fieldElements, this.dataType, this.emptyFieldLabel, this.label, false, null, false, this).getMaximumCount().createBarchart();\n this.createMap();\n } else {\n this.chart = new Barchart(this.field, this.fieldElements, \"numerical\", this.emptyFieldLabel, this.label, false, null, true, this).getMaximumCount().createBarchart();\n this.createLocationQuotientMap();\n }\n }\n }\n}\n\nclass TopCompanies {\n constructor(field, label, dataType) {\n this.field = field;\n this.label = label;\n this.dataType = dataType;\n this.topCompanies = [];\n this.topCompaniesToShow = 3;\n this.allowZeroValues = true;\n }\n\n addTopCompanies(topCompanies, allowZeroValues) {\n let analysisFieldObject = this;\n this.allowZeroValues = allowZeroValues;\n topCompanies.forEach(company => analysisFieldObject.newTopCompany(company.CompanyName, company.CompanyNumber, company.Number, analysisFieldObject.dataType));\n return this;\n }\n\n newTopCompany(companyName, companyNumber, total, dataType) {\n if (this.allowZeroValues === true || total > 0) {\n let topCompany = new AnalysisFinancialFieldTopCompany(companyName, companyNumber, total, dataType);\n this.topCompanies.push(topCompany);\n return topCompany;\n } else {\n return null;\n }\n }\n\n addTopCompaniesToPage() {\n let topCompaniesToShow, holder, topCompaniesHolder, title, primaryListHolder, secondaryListHolder, topCompaniesTotal;\n const analysisObject = this;\n\n topCompaniesTotal = this.topCompanies.length;\n if (topCompaniesTotal > 0) {\n topCompaniesToShow = this.topCompaniesToShow;\n holder = document.querySelector(`.listSummaryPanel[field='${this.field}'] .listSummaryWrapper`);\n topCompaniesHolder = coreFunctions.createElementHelper(\"div\", { class: \"topCompaniesHolder\" })\n\n title = topCompaniesHolder.appendChild(coreFunctions.createElementHelper(\"h4\", { innerHTML: \"Top companies\" }));\n\n title.appendChild(coreFunctions.createElementHelper(\"button\", { class: \"actionControl insights-download\", innerHTML: \" \", title: \"Download top companies\", field: this.field }, { click: function (e) { analysisObject.downloadTopCompanies() } }));\n\n primaryListHolder = topCompaniesHolder.appendChild(coreFunctions.createElementHelper(\"ul\"));\n\n if (topCompaniesTotal > topCompaniesToShow) {\n secondaryListHolder = topCompaniesHolder.appendChild(coreFunctions.createElementHelper(\"ul\", { class: \"secondaryTopCompanies\" }));\n topCompaniesHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"showExtraResultsControlHolder\" })).appendChild(coreFunctions.createElementHelper(\"button\", { class: \"actionControl showExtraResultsControl\", field: this.field, innerHTML: \" \" }, { click: function (e) { analysisObject.toggleExtraTopCompanies(this) } }));\n }\n\n for (var i = 0; i < topCompaniesTotal; i++) {\n if (i < topCompaniesToShow) {\n primaryListHolder.appendChild(this.topCompanies[i].createTopCompanyListElement(i + 1));\n } else {\n secondaryListHolder.appendChild(this.topCompanies[i].createTopCompanyListElement(i + 1));\n }\n }\n holder.appendChild(topCompaniesHolder);\n }\n return topCompaniesHolder;\n }\n\n downloadTopCompanies() {\n let csvData, csv, blob, a, fileTitle;\n csvData = this.processTopCompaniesCsvData();\n csv = Papa.unparse(csvData);\n blob = new Blob([csv]);\n fileTitle = `${this.label.replace(/ /g, \"_\")}_TopCompanies.csv`;\n\n // For IE\n if (window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveBlob(blob, fileTitle);\n }\n // Other browsers\n else {\n a = window.document.createElement(\"a\");\n a.href = window.URL.createObjectURL(blob, {\n type: \"text/plain\"\n });\n a.download = fileTitle;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n }\n\n processTopCompaniesCsvData() {\n let totalElements, header, topCompany;\n const csvData = [];\n totalElements = this.topCompanies.length;\n header = true;\n for (var i = 0; i < totalElements; i++) {\n topCompany = this.topCompanies[i];\n if (header) {\n csvData.push(topCompany.getHeaders());\n }\n csvData.push(topCompany.formatTopCompanyForCsv(i + 1));\n header = false;\n }\n return csvData;\n }\n\n toggleExtraTopCompanies(element) {\n let holder = element.closest(\".topCompaniesHolder\");\n if (holder.classList.contains(\"secondaryTopCompaniesVisible\")) {\n holder.classList.remove(\"secondaryTopCompaniesVisible\");\n } else {\n holder.classList.add(\"secondaryTopCompaniesVisible\");\n }\n }\n\n topCompaniesAvailable() {\n return this.topCompanies.length > 0;\n }\n\n processTopCompaniesForCompleteDownload() {\n const processedTopCompaniesForDownload = {\n name: `${this.label} Top Companies`,\n data: []\n };\n this.topCompanies.forEach((company, index) => processedTopCompaniesForDownload.data.push(company.processTopCompanyForCompleteDownload(index + 1)));\n return processedTopCompaniesForDownload;\n }\n}\n\nclass BubbleMap {\n constructor(field, perCapitaMultiplier, plotLocationQuotient, parent) {\n this.field = field;\n this.mapElements = [];\n this.map = null;\n this.maxRadius = 25;\n this.maxTotal = null;\n this.perCapitaMultiplier = perCapitaMultiplier;\n this.plotLocationQuotient = plotLocationQuotient;\n this.mapClusters = null;\n this.markersToShow = 60;\n this.parent = parent;\n }\n\n createMap() {\n let existingMapContainer, mapHolder, mapContainer, resultsControl;\n const mapObject = this;\n\n if (existingMapContainer = document.querySelector(`.mapHolder[field='${this.field}'] .mapContainer`)) {\n document.querySelector(`.mapHolder[field='${this.field}']`).removeChild(existingMapContainer);\n }\n\n if (mapHolder = document.querySelector(`.mapHolder[field='${this.field}']`)) {\n mapHolder.remove();\n }\n\n mapHolder = coreFunctions.createElementHelper(\"div\", {class: \"mapHolder\", field: this.field});\n mapContainer = mapHolder.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"mapContainer\", id: `${this.field}MapContainer`, field: this.field }));\n // document.querySelector(`.mapHolder[field='${this.field}']`).appendChild(mapContainer);\n document.querySelector(`.listSummaryPanel[field='${this.field}'] .barchartHolder`).appendChild(mapHolder);\n\n this.map = L.map(`${this.field}MapContainer`, {\n zoomControl: false,\n attributionControl: false,\n scrollWheelZoom: false\n }).setView([51.505, -0.09], 13);\n\n L.control.zoom({\n position: 'bottomright'\n }).addTo(this.map);\n\n L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', {\n attribution: '© OpenStreetMap contributors © CARTO',\n subdomains: 'abcd',\n maxZoom: 19,\n className: \"LeafletTile\"\n }).addTo(this.map);\n\n\n // Custom control button\n resultsControl = L.Control.extend({\n options: {\n position: 'topleft'\n },\n onAdd: function (map) {\n map.visibleResultsControl = this;\n let container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');\n container.innerHTML = ``;\n L.DomEvent.on(container.querySelector(\"select\"), 'change', function (ev) {\n mapObject.markersToShowOnChange(parseFloat(this.value));\n });\n return container;\n }\n });\n this.map.addControl(new resultsControl());\n\n return this;\n }\n\n getMaxCount() {\n this.maxTotal = Math.max(...this.mapElements.map(element => element.count));\n return this;\n }\n\n markersToShowOnChange(resultsToShow) {\n // Extend action to all maps in subsubsection\n if (this.parent.subSubsection) {\n this.parent.parent.updateSubSubsectionMapVisibleMarkers(this.parent.subsection, this.parent.subSubsection, resultsToShow)\n } else {\n this.updateMapVisibleMarkers(resultsToShow);\n }\n }\n\n updateMapVisibleMarkers(resultsToShow) {\n this.markersToShow = resultsToShow;\n this.map.visibleResultsControl.getContainer().querySelector(\"select\").value = resultsToShow;\n if (this.map.hasLayer(this.mapClusters)) {\n this.map.removeLayer(this.mapClusters);\n }\n this.mapClusters = this.createMapClusters();\n this.map.addLayer(this.mapClusters);\n }\n\n sortBubbleElements(elements) {\n if (this.plotLocationQuotient === true) {\n return [...elements].sort(function (a, b) { return b[\"quotient\"] - a[\"quotient\"]; });\n } else {\n return elements;\n }\n }\n\n createMapBubbles(elements) {\n const self = this;\n let countMultiplier = this.getBubbleCountMultiplier();\n elements = elements.filter(element => element.count) // Remove entries with no count\n if (elements.length) {\n elements = this.sortBubbleElements(elements);\n elements.forEach((element) => {\n let mapBubble = new MapBubble(element.thing, (self.plotLocationQuotient === true) ? element.quotient : (element.count * countMultiplier), element.latitude, element.longitude);\n this.mapElements.push(mapBubble);\n });\n }\n return this;\n }\n\n getBubbleCountMultiplier() {\n return (this.perCapitaMultiplier) ? this.perCapitaMultiplier : 1;\n }\n\n createMapClusters() {\n let scaleFactor = this.maxRadius / Math.sqrt(this.maxTotal);\n const numberFormat = new Intl.NumberFormat('en', { notation: 'compact'});\n const self = this;\n const mapClusters = L.markerClusterGroup({\n maxClusterRadius: 40,\n polygonOptions: {\n color: \"#02B1D0\"\n },\n disableClusteringAtZoom: (this.plotLocationQuotient) ? 3 : null, // Disabled clustering if looking at location quotient\n iconCreateFunction: function(cluster) {\n var markers = cluster.getAllChildMarkers();\n let totalCount = 0;\n let radius = 0;\n for (var i = 0; i < markers.length; i++) {\n totalCount += markers[i].options.count;\n radius = (radius < markers[i].options.radius) ? markers[i].options.radius : radius;\n }\n if (self.plotLocationQuotient) {\n return L.divIcon({ html: `n = ${cluster.getChildCount()}`, className: 'mapCluster', iconSize: L.point(radius * 2, radius * 2) });\n } else {\n return L.divIcon({ html: `${numberFormat.format(totalCount)} (${cluster.getChildCount()})`, className: 'mapCluster', iconSize: L.point(radius * 2, radius * 2) });\n }\n\n }\n });\n\n this.mapElements.slice(0, this.markersToShow).forEach(element => {\n if (!element.marker) {\n element.marker = element.addBubbleToMap(scaleFactor);\n }\n if (element.marker) {\n mapClusters.addLayer(element.marker);\n }\n });\n return mapClusters;\n }\n\n // This will add each bubble to the map separately\n addBubblesToMapOLD() {\n let scaleFactor, mapFeatureGroup, visibleFeatureGroup;\n const leafletBubblesArray = [];\n scaleFactor = this.maxRadius / Math.sqrt(this.maxTotal);\n\n this.mapElements.forEach((mapBubble, index) => {\n let leafletBubble = mapBubble.addBubbleToMap(scaleFactor, index);\n if (leafletBubble) {\n leafletBubblesArray.push(leafletBubble);\n }\n });\n mapFeatureGroup = L.featureGroup(leafletBubblesArray).addTo(this.map);\n visibleFeatureGroup = L.featureGroup(mapFeatureGroup.getLayers().filter(element => !element.options.className.includes(\"bubbleHidden\")));\n if (leafletBubblesArray.length > 0) {\n this.map.fitBounds(visibleFeatureGroup.getBounds());\n } else {\n this.map.setView(new L.LatLng(55.9819, -4.8999), 5);\n }\n return this;\n }\n\n addBubblesToMap() {\n if (this.mapElements.length) {\n this.mapClusters = this.createMapClusters();\n this.map.addLayer(this.mapClusters).fitBounds(this.mapClusters.getBounds());\n }\n return this;\n }\n}\n\nclass MapBubble {\n constructor(thing, count, latitude, longitude) {\n this.thing = thing;\n this.count = count;\n this.latitude = latitude;\n this.longitude = longitude;\n this.maxRadius = 25;\n this.marker = null;\n }\n\n addBubbleToMap(scaleFactor, index) {\n let center;\n const numberFormat = new Intl.NumberFormat('en', { notation: 'compact'});\n if (this.count > 0 && this.latitude && this.longitude) {\n center = [this.latitude, this.longitude];\n this.marker = L.circleMarker(center, {\n radius: scaleFactor * Math.sqrt(this.count),\n stroke: false,\n opacity: 1,\n fill: true,\n fillColor: 'transparent',\n fillOpacity: 1,\n className: \"mapBubble\",\n name: this.thing,\n count: this.count\n }).bindPopup(this.thing);\n\n this.marker.on('mouseover', function (e) {\n this.openPopup();\n });\n this.marker.on('mouseout', function (e) {\n this.closePopup();\n });\n\n this.marker.bindTooltip(numberFormat.format(this.count), {\n permanent: true,\n direction: 'center',\n className: 'mapBubbleTooltip'\n });\n // // Only add 20 tooltip initially\n // if (index < 20) {\n // this.marker.bindTooltip(this.formatTooltipValue(), {\n // permanent: true,\n // direction: 'center',\n // className: 'mapBubbleTooltip'\n // });\n // }\n\n return this.marker;\n } else {\n return null;\n }\n\n }\n\n refreshMarker(hideMarker) {\n if (this.marker) {\n if (hideMarker == true) {\n this.hideMarker();\n } else {\n this.displayMarker();\n }\n }\n }\n\n displayMarker() {\n let tooltip = this.marker.getTooltip();\n if (tooltip == undefined) {\n this.marker.bindTooltip(this.formatTooltipValue(), {\n permanent: true,\n direction: 'center',\n className: 'mapBubbleTooltip'\n });\n } else {\n tooltip.getElement().classList.remove(\"bubbleHidden\");\n }\n this.marker.getElement().classList.remove(\"bubbleHidden\");\n }\n\n hideMarker() {\n let tooltip = this.marker.getTooltip();\n if (tooltip != undefined) {\n tooltip.getElement().classList.add(\"bubbleHidden\");\n }\n this.marker.getElement().classList.add(\"bubbleHidden\");\n }\n\n formatTooltipValue() {\n return new Intl.NumberFormat('en-EN', { minimumFractionDigits: 1, maximumFractionDigits: 1, notation: 'compact' }).format(this.count);\n }\n}\n\nclass AnalysisFinancialFieldElement {\n constructor(year, measuredTotal, measuredCompanies, projectedTotal, projectedCompanies, dataType) {\n this.year = year;\n this.measuredTotal = measuredTotal;\n this.measuredCompanies = measuredCompanies;\n this.projectedTotal = projectedTotal;\n this.projectedCompanies = projectedCompanies;\n this.dataType = dataType;\n }\n\n getFieldElementType() {\n return this.constructor.name;\n }\n\n formatFinancialFieldValue(value, formatFree) {\n if (value) {\n const currencyFormatted = new Intl.NumberFormat('en-EN', { style: 'currency', minimumFractionDigits: 1, maximumFractionDigits: 1, currency: 'GBP', notation: 'compact' }).format(value);\n // Add styling to negative values\n const addNegativeFormatting = value < 0 && !formatFree;\n return `${currencyFormatted}`;\n } else {\n return \"\";\n }\n }\n\n formatNumericalValue(barCount) {\n if (barCount) {\n return new Intl.NumberFormat('en-EN', { minimumFractionDigits: 1, maximumFractionDigits: 1, notation: 'compact' }).format(barCount);\n } else {\n return \"\";\n }\n }\n\n createFinancialsBarchartElement(maximumCount) {\n let measuredTotal, projectedTotal, barElementLi, barContainer, barWidth, barCount;\n\n measuredTotal = this.measuredTotal;\n projectedTotal = this.projectedTotal;\n\n barElementLi = coreFunctions.createElementHelper(\"li\"); // Holder for row\n\n barContainer = coreFunctions.createElementHelper(\"span\", { class: \"barContainer\" });\n barElementLi.appendChild(barContainer); // Bar content\n\n barWidth = (measuredTotal > 0) ? 100 * (measuredTotal / maximumCount) : 0;\n barContainer.appendChild(coreFunctions.createElementHelper(\"span\", { class: `bar${(barWidth > 50) ? \" longBar\" : \"\"}`, style: `width: ${barWidth}%`, innerHTML: \" \" })); // Bar\n\n if (projectedTotal && projectedTotal > measuredTotal) {\n const projectBarWidth = (projectedTotal > 0) ? 100 * ((projectedTotal - measuredTotal) / maximumCount) : 0;\n barContainer.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"bar projectedBar\", style: `width: ${projectBarWidth}%`, innerHTML: \" \" })); // Add projected value bar if available\n }\n\n barContainer.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"barLabel\", innerHTML: `${this.year}`}));\n\n if (this.dataType == \"numerical\") {\n barElementLi.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"barCount\", innerHTML: `‎${this.formatNumericalValue(measuredTotal)} ${(projectedTotal) ? ` (${this.formatNumericalValue(projectedTotal)})` : \"\"}‎` })); // Counts for projected and measured values, us &lrm code to make sure text is in the correct direction\n } else {\n barElementLi.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"barCount\", innerHTML: `‎${this.formatFinancialFieldValue(measuredTotal, false)} ${(projectedTotal) ? ` (${this.formatFinancialFieldValue(projectedTotal, true)})` : \"\"}‎` })); // Counts for projected and measured values, us &lrm code to make sure text is in the correct direction\n }\n\n return barElementLi;\n }\n\n formatYearlyCompanyTotals() {\n let holder, valuesHolder;\n holder = coreFunctions.createElementHelper(\"li\");\n holder.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"year\", innerHTML: `${this.year}` }));\n valuesHolder = holder.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"yearly-values\"}));\n valuesHolder.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"measuredCompanies\", innerHTML: (this.measuredCompanies) ? this.measuredCompanies.toLocaleString() : \"\" }));\n valuesHolder.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"projectedCompanies\", innerHTML: ` (${this.projectedCompanies.toLocaleString()})` }));\n return holder;\n }\n\n getHeaders() {\n return [\"Year\", \"Measured total (GBP)\", \"Measured companies\", \"Projected total (GBP)\", \"Projected companies\"];\n }\n\n formatElementForCsv() {\n return [this.year, this.measuredTotal, this.measuredCompanies, this.projectedTotal, this.projectedCompanies];\n }\n\n processElementForCompleteDownload() {\n const processedElementObject = {\n \"Year\": this.year,\n \"Measured total (GBP)\": this.measuredTotal,\n \"Measured companies\": this.measuredCompanies,\n \"Projected total (GBP)\": this.projectedTotal,\n \"Projected companies\": this.projectedCompanies\n }\n return processedElementObject;\n }\n}\n\nclass AnalysisFinancialFieldTopCompany {\n constructor(companyName, companyNumber, total, dataType) {\n this.companyName = companyName;\n this.companyNumber = companyNumber;\n this.total = total;\n this.dataType = dataType;\n }\n\n createTopCompanyListElement(position) {\n let topCompanyListElement;\n topCompanyListElement = coreFunctions.createElementHelper(\"li\");\n topCompanyListElement.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"position\", innerHTML: `${(position < 10) ? `${position}. ` : `${position}.`}` })); // Position in list, use numsp character to get a fixed width\n topCompanyListElement.appendChild(coreFunctions.createElementHelper(\"a\", { innerHTML: this.companyName, href: `${urlPath}/companypage?company_id=${this.companyNumber}`, title: this.companyName })); // Company name with link\n topCompanyListElement.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"number\", innerHTML: this.formatTopCompanyValue(this.total) })); // Value\n\n return topCompanyListElement;\n }\n\n formatTopCompanyValue(value) {\n if (this.dataType == \"currency\") {\n return new Intl.NumberFormat('en-EN', { style: 'currency', minimumFractionDigits: 1, maximumFractionDigits: 1, currency: 'GBP', notation: 'compact' }).format(value);\n } else {\n return new Intl.NumberFormat('en-EN', { notation: 'compact', minimumFractionDigits: 1, maximumFractionDigits: 1}).format(value);\n }\n }\n\n getHeaders() {\n return [\"Position\", \"Company number\", \"Company name\", \"Total\"];\n }\n\n formatTopCompanyForCsv(index) {\n return [index, this.companyNumber, this.companyName, this.total];\n }\n\n processTopCompanyForCompleteDownload(index) {\n return {\n \"Position\": index,\n \"Company number\": this.companyNumber,\n \"Company name\": this.companyName,\n \"Total\": this.total\n }\n }\n}\n\nclass AnalysisFieldElement {\n constructor(field, thing, count, latitude, longitude, dataType, thingColumnLabel, quotient, id) {\n this.field = field;\n this.thing = thing;\n this.count = count;\n this.latitude = latitude;\n this.longitude = longitude;\n this.dataType = dataType;\n this.sicDescription = null;\n this.thingColumnLabel = thingColumnLabel;\n this.quotient = quotient;\n this.id = id;\n }\n\n getFieldElementType() {\n return this.constructor.name;\n }\n\n addExtraDescription() {\n // This is the previously used code to format SIC codes\n let extraDescription, sicSearch;\n const analyisFieldObject = this;\n extraDescription = \"\";\n if (this.field.startsWith(\"SIC\")) {\n sicSearch = sicCodes.find(sic => sic.code == analyisFieldObject.thing);\n if (sicSearch) {\n this.sicDescription = sicSearch.description\n extraDescription = `| ${this.sicDescription}`;\n } else {\n this.sicDescription = \"\";\n }\n }\n return extraDescription;\n }\n\n onBarHover(element) {\n coreFunctions.throttle(() => {\n this.removeAllBarHighlights(element);\n this.addBarHighlightsToSiblings(element);\n }, 100);\n }\n\n removeAllBarHighlights(element) {\n const chartGroup = element.closest(\".barchartHolder\").dataset.chartgroup;\n const highlightedBars = document.querySelectorAll(`.barchartHolder[data-chartgroup='${chartGroup}'] li.highlight`);\n highlightedBars.forEach(element => element.classList.remove(\"highlight\"));\n }\n\n addBarHighlightsToSiblings(element) {\n const chartGroup = element.closest(\".barchartHolder\").dataset.chartgroup;\n const barsToHighlight = document.querySelectorAll(`.barchartHolder[data-chartgroup=\"${chartGroup}\"] li[data-name=\"${this.thing.toString().replace(/'/g, \"\")}\"]`);\n barsToHighlight.forEach(element => element.classList.add(\"highlight\"));\n }\n\n createBarchartElement(maximumCount, emptyFieldLabel, isPercapitaData, perCapitaMultiplier, totalCount, displayAsPercentage, plotLocationQuotient, index, elementIdsDetails) {\n let barElementLi, barContainer, barWidth, barCount, barField;\n const idLengthMaxThreshold = 11; // Don't show ID element on bar if over this length\n const idLengthMinThreshold = 2; // Don't show ID element on bar if under this length\n\n const fieldIsRticVertical = this.field.includes('RTICVertical');\n const hasLongLabel = (/^(SIC|RSIC)/).test(this.field); // These fields have long descriptions\n\n const displayElementId = this.id && elementIdsDetails.elementsHaveId && elementIdsDetails.idMaximumLength < idLengthMaxThreshold;\n let barIdContent = \"\";\n barField = (plotLocationQuotient == undefined || plotLocationQuotient === false) ? \"count\" : \"quotient\";\n\n barCount = ((isPercapitaData === true) ? (this[barField] * perCapitaMultiplier) : this[barField]);\n barElementLi = coreFunctions.createElementHelper(\"li\", {\"data-name\": this.thing.toString().replace(/'/g, \"\"), \"data-field\": this.field, \"data-position\": (index + 1)}, {mouseenter: (event) => this.addBarHighlightsToSiblings(event.target), mouseleave: (event) => {this.removeAllBarHighlights(event.target)}}); // Holder for element\n\n if (hasLongLabel) {\n barElementLi.classList.add(\"long-label-bar\");\n }\n\n barContainer = coreFunctions.createElementHelper(\"span\", { class: \"barContainer\" });\n barElementLi.appendChild(barContainer); // Bar content\n\n barWidth = 100 * (this[barField] / maximumCount);\n barContainer.appendChild(coreFunctions.createElementHelper(\"span\", { class: `bar${(barWidth > 50) ? \" longBar\" : \"\"}`, style: `width: ${barWidth}%`, innerHTML: ` ${(fieldIsRticVertical || hasLongLabel) ? \"
 \" : \"\"}` })); // Bar\n\n if (displayElementId) {\n const barIdWidthIsAdjusted = elementIdsDetails.idIsAlphaNumeric;\n barIdContent = `${this.id}`;\n }\n\n let elementName = (this.thing.toString().length) > 0 ? this.thing : emptyFieldLabel;\n // Format verticals names to make more readable\n if (fieldIsRticVertical) {\n elementName = elementName.replace(\": \", \"
\");\n }\n barContainer.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"barLabel\", innerHTML: `${barIdContent}${elementName}` })); // Label for bar\n\n barElementLi.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"barCount\", innerHTML: (displayAsPercentage === true) ? `${((barCount / totalCount) * 100).toFixed(2)}%` : this.formatNumericalValue(barCount, barField, maximumCount) })); // Count\n\n return barElementLi;\n }\n\n createStackedBarElement(adjustedCount, totalCount, isSharedField) {\n const percentFormat = new Intl.NumberFormat('en', { style: 'percent'});\n const barWidth = (adjustedCount / totalCount) * 100;\n const barElementLabel = (isSharedField || barWidth < 10) ? \" \" : percentFormat.format(this.count / totalCount); // Do not add label to shared field elements or for small widhts\n const stackedBarElement = coreFunctions.createElementHelper(\"span\", {innerHTML: barElementLabel, class: `stackedBarElement${(isSharedField) ? ' shared-field' : ''}`, style: `width: ${barWidth}%;`, \"data-id\": this.id, \"data-percent\": barWidth}, {mouseenter: (event) => this.stackedBarchartElementOnMouseEnter(event), mouseleave: (event) => this.stackedBarchartElementOnMouseLeave(event)});\n return stackedBarElement;\n }\n\n createStackedBarchartKeyElement() {\n const numberFormat = new Intl.NumberFormat('en-EN', { notation: 'compact'});\n let stackedBarKeyElement = coreFunctions.createElementHelper(\"span\", {class: \"stackedBarchartKeyElement\", \"data-id\": this.id}, {mouseenter: (event) => this.stackedBarchartElementOnMouseEnter(event), mouseleave: (event) => this.stackedBarchartElementOnMouseLeave(event)});\n stackedBarKeyElement.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"stackedBarchartKeySquare\", \"data-id\": this.id, innerHTML: \" \"}));\n stackedBarKeyElement.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"stackedBarchartKeyLabel\", innerHTML: `${this.thing}: ${numberFormat.format(this.count)}`}));\n return stackedBarKeyElement;\n }\n\n stackedBarchartElementOnMouseEnter(event) {\n let sharedElement;\n const id = event.target.dataset.id;\n const holder = event.target.closest(\".barchartContentWrapper\");\n holder.querySelectorAll(`[data-id='${id}']`).forEach(element => {\n element.classList.add(\"highlight\");\n if ((sharedElement = element.previousElementSibling) && sharedElement.classList.contains('shared-field')) {\n sharedElement.classList.add(\"highlight\");\n }else if ((sharedElement = element.nextElementSibling) && sharedElement.classList.contains('shared-field')) {\n sharedElement.classList.add(\"highlight\");\n }\n });\n }\n\n stackedBarchartElementOnMouseLeave(event) {\n let sharedElement;\n const id = event.target.dataset.id;\n const holder = event.target.closest(\".barchartContentWrapper\");\n holder.querySelectorAll(`[data-id='${id}']`).forEach(element => {\n element.classList.remove(\"highlight\");\n if ((sharedElement = element.previousElementSibling) && sharedElement.classList.contains('shared-field')) {\n sharedElement.classList.remove(\"highlight\");\n } else if ((sharedElement = element.nextElementSibling) && sharedElement.classList.contains('shared-field')) {\n sharedElement.classList.remove(\"highlight\");\n }\n\n });\n }\n\n formatNumericalValue(barCount, barField, maximumCount) {\n if (barCount) {\n if (this.dataType == \"currency\" && barField != \"quotient\") {\n return new Intl.NumberFormat('en-EN', { style: 'currency', minimumFractionDigits: 1, maximumFractionDigits: 1, currency: 'GBP', notation: 'compact' }).format(barCount);\n } else {\n return new Intl.NumberFormat('en-EN', { notation: 'compact', maximumFractionDigits: 1, minimumFractionDigits: (barCount > 1000 || barField == \"quotient\") ? 1 : 0}).format(barCount);\n }\n } else {\n return \"\";\n }\n }\n\n formatPercentageCount() {\n let percentage = parseInt(100 * this.count);\n if (percentage > 0) {\n return `‎+${percentage}%‎`;\n } else if (percentage < 0) {\n return `‎${percentage}%‎`\n } else {\n return \"‎0%‎\";\n }\n }\n\n createPercentageBarchartElement(maximumCount, index, maxWidth) {\n let barElementLi, barContainer, barWidth, count;\n count = this.count;\n maxWidth = maxWidth ?? 50;\n\n barElementLi = coreFunctions.createElementHelper(\"li\", { class: `${(count > 0) ? \"positive\" : \"negative\"}`, \"data-position\": (index + 1)}); // Holder for element\n\n barContainer = coreFunctions.createElementHelper(\"span\", { class: \"barContainer\" });\n barElementLi.appendChild(barContainer); // Bar content\n\n barWidth = maxWidth * (Math.abs(count) / maximumCount);\n barContainer.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"bar\", style: `width: ${barWidth}%; margin-left: ${(count < 0) ? (50 - barWidth) : 50}%`, innerHTML: \" \" })); // Bar\n\n barContainer.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"barLabel\", innerHTML: `${this.thing}` })); // Label for bar\n\n barElementLi.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"barCount\", innerHTML: this.formatPercentageCount() })); // Count\n\n return barElementLi;\n\n }\n\n getHeaders(hasLocationQuotientData, fieldHasIdData) {\n const headers = [this.thingColumnLabel];\n\n if (fieldHasIdData) {\n headers.push(`${this.thingColumnLabel} code`);\n }\n\n if (this.dataType == \"percentage\") {\n headers.push(\"Percentage\");\n } else {\n headers.push(\"Count\");\n }\n\n if (this.sicDescription) {\n headers.push(\"SIC Description\");\n }\n\n if (hasLocationQuotientData === true) {\n headers.push(\"Location quotient\");\n }\n return headers;\n }\n\n formatElementForCsv(fieldHasIdData) {\n const row = [this.thing];\n if (fieldHasIdData) {\n row.push(this.id ?? \"\");\n }\n if (this.dataType == \"percentage\") {\n row.push(this.count * 100);\n } else {\n row.push(this.count);\n }\n\n if (this.sicDescription != undefined) {\n row.push(this.sicDescription);\n }\n return row;\n }\n\n processElementForCompleteDownload(fieldHasIdData = false) {\n const processedElementObject = {};\n\n processedElementObject[this.thingColumnLabel] = this.thing;\n\n if (fieldHasIdData) {\n processedElementObject[`${this.thingColumnLabel} code`] = this.id;\n }\n\n if (this.dataType == \"percentage\") {\n processedElementObject[\"Percentage\"] = Number((this.count * 100).toFixed(0));\n } else {\n processedElementObject[\"Count\"] = this.count;\n }\n\n if (this.sicDescription) {\n processedElementObject[\"SIC Description\"] = this.sicDescription;\n }\n\n return processedElementObject;\n }\n}\n\nclass FinancialsBarchart {\n constructor(field, elements, label) {\n this.field = field;\n this.label = label;\n this.elements = elements;\n this.maximum = null;\n this.numberOfTopResultsToShow = 15;\n }\n\n getMaximumCount() {\n let measuredTotals, projectedTotals;\n measuredTotals = this.elements.map(element => element.measuredTotal);\n projectedTotals = this.elements.map(element => element.projectedTotal);\n this.maximum = Math.max(...measuredTotals.concat(projectedTotals));\n return this;\n }\n\n createBarchart() {\n let barchartContentWrapper, barchartContent, barchartElementsHolder;\n\n barchartContentWrapper = coreFunctions.createElementHelper(\"div\", { class: \"barchartContentWrapper\", id: `${this.field}ChartContentWrapper`, charttype: \"bar\" });\n\n barchartContent = coreFunctions.createElementHelper(\"div\", { class: \"barchartContent\" });\n barchartContentWrapper.appendChild(barchartContent);\n\n barchartContent.appendChild(this.addFinancialsBarchartKey());\n barchartElementsHolder = barchartContent.appendChild(coreFunctions.createElementHelper(\"ul\"));\n\n this.elements.forEach((element) => {\n let barchartElement = element.createFinancialsBarchartElement(this.maximum);\n barchartElementsHolder.appendChild(barchartElement);\n });\n\n // TODO chartContentHolder\n // document.querySelector(`.barchartHolder[field='${this.field}']`).appendChild(barchartContentWrapper);\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).appendChild(barchartContentWrapper);\n document.querySelector(`.barchartHolder[field='${this.field}'] .widgetTitle`).innerHTML = this.label;\n\n return this;\n }\n\n addFinancialsBarchartKey() {\n let financialsKey, fieldCompanyTotalsHolder, fieldCompanyTotalsCheckbox, fieldCompanyTotalsLabel, fieldCompanyTotals, fieldCompanyCountsHolder;\n financialsKey = coreFunctions.createElementHelper(\"div\", { class: \"financialsKey\", innerHTML: \" Measured Projected\" });\n\n fieldCompanyTotalsHolder = financialsKey.appendChild(coreFunctions.createElementHelper(\"span\", { \"class\": \"companyTotalsControlHolder\" }));\n fieldCompanyTotalsCheckbox = fieldCompanyTotalsHolder.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"checkbox\", id: `companyTotalsCheckbox${this.field}` }));\n fieldCompanyTotalsLabel = fieldCompanyTotalsHolder.appendChild(coreFunctions.createElementHelper(\"label\", { for: `companyTotalsCheckbox${this.field}`, innerHTML: \"?\" }));\n fieldCompanyTotals = fieldCompanyTotalsLabel.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"fieldCompanyTotals\" }));\n fieldCompanyTotals.appendChild(coreFunctions.createElementHelper(\"span\", { \"class\": \"fieldCompanyTotalsElement\", innerHTML: \"Projected data (shown in brackets) uses the most recently filed accounts to predict years for which accounts are not yet filed.\" })); // Explanation message\n fieldCompanyCountsHolder = fieldCompanyTotals.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"companyCountsHolder fieldCompanyTotalsElement\" })).appendChild(coreFunctions.createElementHelper(\"ul\"));\n\n this.elements.forEach(element => fieldCompanyCountsHolder.appendChild(element.formatYearlyCompanyTotals()));\n fieldCompanyCountsHolder.parentNode.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"explanation\", innerHTML: 'No. of companies reporting' }));\n\n return financialsKey;\n }\n}\n\nclass Linechart {\n constructor(field, elements, label, dataType, subfield) {\n this.field = field;\n this.label = label;\n this.elements = elements;\n this.dataType = dataType;\n this.linechartData = null;\n this.numberOfGridlines = 5;\n this.chart = null;\n this.chartLight = null;\n this.subfield = subfield ?? \"\";\n }\n\n prepareLinechartHolder() {\n let linechartContentWrapper, linechartHolder;\n linechartContentWrapper = coreFunctions.createElementHelper(\"div\", { class: \"barchartContentWrapper\", id: `${this.field}ChartContentWrapper`, field: this.field, charttype: \"line\" });\n\n if (this.dataType == \"currency\") {\n linechartContentWrapper.appendChild(this.addLinechartKey());\n }\n\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).appendChild(linechartContentWrapper);\n\n linechartHolder = linechartContentWrapper.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"linechartHolder chartWrapper\", id: `${this.field}LineChart`}));\n linechartHolder.setAttribute(\"lightmode\", 0);\n linechartHolder.appendChild(coreFunctions.createElementHelper(\"canvas\", {id: `${this.field}LineChartCanvas`, class: 'darkCanvas'}));\n linechartHolder.appendChild(coreFunctions.createElementHelper(\"canvas\", {id: `${this.field}LineChartCanvasLight`, class: 'lightCanvas'}));\n\n return this;\n }\n\n clearExistingLinechartHolder() {\n const holder = document.querySelector(`.barchartContentWrapper[field='${this.field}'][charttype=\"line\"]`);\n holder.remove();\n //coreFunctions.clearElementChildren(holder);\n // const canvas = document.getElementById(`${this.field}${this.subfield}LineChartCanvas`);\n // const context = canvas.getContext('2d');\n // context.clearRect(0, 0, canvas.width, canvas.height);\n return this;\n }\n\n prepareSubgroupLinechartHolder(title, series) {\n const holder = document.querySelector(`.chartContentHolder[data-field='${this.field}']`);\n\n const linechartContentWrapper = coreFunctions.createElementHelper(\"div\", { class: \"barchartContentWrapper\", id: `${this.field}${this.subfield}ChartContentWrapper`, field: this.field, charttype: \"line\" });\n\n linechartContentWrapper.appendChild(coreFunctions.createElementHelper(\"h4\", {innerHTML: title}));\n if (series) {\n linechartContentWrapper.appendChild(this.createSeriesLinechartKey(series));\n }\n\n const linechartHolder = linechartContentWrapper.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"linechartHolder chartWrapper\", id: `${this.field}${this.subfield}LineChart`}));\n\n linechartHolder.appendChild(coreFunctions.createElementHelper(\"canvas\", {id: `${this.field}${this.subfield}LineChartCanvas`, class: 'darkCanvas'}));\n\n holder.appendChild(linechartContentWrapper);\n return this;\n }\n\n createSeriesLinechartKey(series) {\n const keyHolder = coreFunctions.createElementHelper(\"div\", {class: \"series-key\"});\n series.forEach(element => {\n const keyElement = keyHolder.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"key-element\"}));\n keyElement.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"key-square measured line\", innerHTML: \" \", style: `background-color: ${element.color} !important;`}));\n keyElement.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"key-label\", innerHTML: element.label}))\n });\n return keyHolder;\n }\n\n formatSeriesDataset(series) {\n // https://stackoverflow.com/questions/20477177/creating-an-array-of-cumulative-sum-in-javascript\n const cumulativeSum = (sum => element => ({x: element[series.xField], y: sum += element[series.yField]}))(0);\n let seriesData = [];\n // Filter out 0 values\n if (series.cumulateValues) {\n seriesData = this.elements.map(cumulativeSum).filter(element => element.y);\n } else {\n seriesData = this.elements.flatMap(element => element[series.yField] ? {x: element[series.xField], y: element[series.yField]} : [])\n }\n\n return {\n label: series.label,\n data: seriesData,\n fill: false,\n showLine: true,\n borderColor: series.color,\n borderWidth: 3,\n pointRadius: 2,\n tension: 0.1,\n display: true\n }\n }\n\n drawSeriesLinechart(chartSeries) {\n const ctx = document.getElementById(`${this.field}${this.subfield}LineChartCanvas`).getContext('2d');\n const datasets = chartSeries.map(series => this.formatSeriesDataset(series));\n const scatterChart = new Chart(ctx, {\n type: 'scatter',\n data: {\n datasets: datasets\n },\n options: {\n animation: false,\n aspectRatio: 1.7,\n scales: {\n x: {\n beginAtZero: false,\n title: {\n display: false,\n text: \"Year\",\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n min: 2000,\n ticks: {\n min: 2000,\n callback: function (value, index, values) {\n return (Number.isInteger(value)) ? value.toString() : null;\n },\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n }\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n display: false,\n }\n },\n y: {\n beginAtZero: true,\n title: {\n display: false,\n text: \"Count\",\n color: '#FFFFFF',\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n callback: function (value, index, values) {\n return value.toLocaleString();\n },\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n },\n maxTicksLimit: 7\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n drawTicks: false\n }\n }\n },\n plugins: {\n legend: {\n display: false,\n }, title: {\n display: false,\n text: `Usage statistics`,\n color: '#FFFFFF'\n },\n tooltip: {\n titleFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n bodyFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n footerFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n displayColors: false,\n callbacks: {\n label: function (context) {\n let label = \"Company count: \";\n if (context.parsed.y !== null) {\n label += context.parsed.y.toLocaleString();\n }\n if (context.parsed.x !== null) {\n label += ` (${context.parsed.x})`;\n }\n return label;\n }\n }\n },\n datalabels: {\n anchor: 'center',\n align: 'right',\n offset: 5,\n clamp: true,\n font: {\n weight: 'bold'\n },\n formatter: function (value, context) {\n return context.dataset.label;\n },\n color: function (context) {\n return context.dataset.borderColor;\n },\n display: function (context) { return (context.dataIndex === 0); }\n }\n }\n }\n });\n return this;\n\n }\n\n drawCumulativeLinechart() {\n const ctx = document.getElementById(`${this.field}LineChartCanvas`).getContext('2d');\n let sum = 0;\n this.linechartData = Object.assign([], this.elements).reverse().map(element => ({x: element.thing, y: sum += element.count}));\n const data = {\n datasets: [{\n label: 'Measured',\n data: this.linechartData,\n fill: false,\n showLine: true,\n borderColor: '#D10956',\n borderWidth: 3,\n pointRadius: 2,\n tension: 0.1,\n display: true\n }]\n };\n const scatterChart = new Chart(ctx, {\n type: 'scatter',\n data: data,\n options: {\n animation: false,\n aspectRatio: 1.7,\n scales: {\n x: {\n beginAtZero: false,\n title: {\n display: false,\n text: \"Year\",\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n min: 2000,\n ticks: {\n min: 2000,\n callback: function (value, index, values) {\n return (Number.isInteger(value)) ? value.toString() : null;\n },\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n }\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n display: false,\n }\n },\n y: {\n beginAtZero: true,\n title: {\n display: false,\n text: \"Count\",\n color: '#FFFFFF',\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n callback: function (value, index, values) {\n return value.toLocaleString();\n },\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n },\n maxTicksLimit: 7\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n drawTicks: false\n }\n }\n },\n plugins: {\n legend: {\n display: false,\n }, title: {\n display: false,\n text: `Usage statistics`,\n color: '#FFFFFF'\n },\n tooltip: {\n titleFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n bodyFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n footerFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n displayColors: false,\n callbacks: {\n label: function (context) {\n let label = \"Company count: \";\n if (context.parsed.y !== null) {\n label += context.parsed.y.toLocaleString();\n }\n if (context.parsed.x !== null) {\n label += ` (${context.parsed.x})`;\n }\n return label;\n }\n }\n },\n datalabels: {\n anchor: 'center',\n align: 'right',\n offset: 5,\n clamp: true,\n font: {\n weight: 'bold'\n },\n formatter: function (value, context) {\n return context.dataset.label;\n },\n color: function (context) {\n return context.dataset.borderColor;\n },\n display: function (context) { return (context.dataIndex === 0); }\n }\n }\n }\n });\n return this;\n }\n\n drawTimestampBarChart() {\n const self = this;\n const ctx = document.getElementById(`${this.field}${this.subfield ?? \"\"}LineChartCanvas`).getContext('2d');\n const data = {\n datasets: [{\n label: 'Postings',\n data: this.elements.map(element => ({ x: moment(element.thing, 'YYYY-MM'), y: element.count})),\n fill: true,\n showLine: true,\n borderColor: '#D10956',\n backgroundColor: '#D10956',\n borderWidth: 1,\n display: true,\n maxBarThickness: 100\n }]\n };\n const barChart = new Chart(ctx, {\n type: 'bar',\n data: data,\n options: {\n animation: false,\n aspectRatio: 1.7,\n scales: {\n x: {\n beginAtZero: false,\n type: 'time',\n time: {\n unit: \"month\",\n minUnit: \"month\"\n },\n title: {\n display: false,\n text: \"Year\",\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n color: \"#FFFFFF\",\n callback: function (value, index, values) {\n return value;\n },\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n }\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n display: false,\n }\n },\n y: {\n beginAtZero: true,\n title: {\n display: false,\n text: \"Count\",\n color: '#FFFFFF',\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n callback: function (value, index, values) {\n let tickValue;\n if (Number.isInteger(value)) {\n tickValue = value.toLocaleString();\n }\n return tickValue;\n },\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n },\n maxTicksLimit: 7\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n drawTicks: false\n }\n }\n },\n plugins: {\n legend: {\n display: false,\n },\n title: {\n display: false,\n color: '#FFFFFF'\n },\n tooltip: {\n titleFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n bodyFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n footerFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n displayColors: false,\n callbacks: {\n title: function (context) {\n return moment(context[0].parsed.x, 'x').format(\"YYYY-MM\");\n },\n label: function (context) {\n let label = context.dataset.label || '';\n if (label) {\n label += ': ';\n }\n if (context.parsed.y !== null) {\n label += Number(context.parsed.y.toFixed(1)).toLocaleString();\n }\n return label;\n }\n }\n },\n datalabels: {\n anchor: 'center',\n align: 'right',\n offset: 5,\n clamp: true,\n font: {\n weight: 'bold'\n },\n formatter: function (value, context) {\n return context.dataset.label;\n },\n color: function (context) {\n return context.dataset.borderColor;\n },\n display: function (context) { return (context.dataIndex === 0); }\n }\n }\n }\n });\n }\n\n drawTimestampLineChart() {\n const self = this;\n const ctx = document.getElementById(`${this.field}${this.subfield ?? \"\"}LineChartCanvas`).getContext('2d');\n const data = {\n datasets: [{\n label: 'Postings',\n data: this.elements.map(element => ({ x: moment(element.thing, \"YYYY-MM\"), y: element.count})),\n fill: false,\n showLine: true,\n borderColor: '#D10956',\n borderWidth: 3,\n pointRadius: 2,\n tension:0.2,\n display: true\n }]\n };\n const scatterChart = new Chart(ctx, {\n type: 'scatter',\n data: data,\n options: {\n animation: false,\n aspectRatio: 1.7,\n scales: {\n x: {\n beginAtZero: false,\n title: {\n display: false,\n text: \"Year\",\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n callback: function (value, index, values) {\n return moment(value, \"x\").format(\"YYYY-MM\");\n },\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n }\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n display: false,\n }\n },\n y: {\n beginAtZero: true,\n title: {\n display: false,\n text: \"Count\",\n color: '#FFFFFF',\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n color: \"#FFFFFF\",\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n },\n maxTicksLimit: 7\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n drawTicks: false\n }\n }\n },\n plugins: {\n legend: {\n display: false,\n },\n title: {\n display: false,\n color: '#FFFFFF'\n },\n tooltip: {\n titleFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n bodyFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n footerFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n displayColors: false,\n callbacks: {\n label: function (context) {\n let label = context.dataset.label || '';\n if (label) {\n label += ': ';\n }\n if (context.parsed.y !== null) {\n label += Number(context.parsed.y.toFixed(1)).toLocaleString();\n }\n if (context.parsed.x !== null) {\n label += ` (${moment(context.parsed.x, \"x\").format(\"YYYY-MM\")})`;\n }\n return label;\n }\n }\n },\n datalabels: {\n anchor: 'center',\n align: 'right',\n offset: 5,\n clamp: true,\n font: {\n weight: 'bold'\n },\n formatter: function (value, context) {\n return context.dataset.label;\n },\n color: function (context) {\n return context.dataset.borderColor;\n },\n display: function (context) { return (context.dataIndex === 0); }\n }\n }\n }\n });\n return this;\n }\n\n drawLinechart() {\n const ctx = document.getElementById(`${this.field}LineChartCanvas`).getContext('2d');\n const ctxLight = document.getElementById(`${this.field}LineChartCanvasLight`).getContext('2d');\n const data = {\n datasets: [{\n label: 'Measured',\n data: this.elements.map(element => ({ x: element.year, y: element.measuredTotal })),\n fill: false,\n showLine: true,\n borderColor: '#D10956',\n borderWidth: 3,\n pointRadius: 2,\n tension: 0.1,\n display: true\n }, {\n label: 'Projected',\n data: this.elements.map(element => ({ x: element.year, y: element.projectedTotal })),\n fill: false,\n showLine: true,\n borderColor: 'rgba(209, 9, 86, 0.7)',\n borderWidth: 3,\n borderDash: [10,5],\n pointRadius: 2,\n tension: 0.1,\n display: true\n }]\n };\n this.chart = this.newChart(ctx, data, \"#FFFFFF\", \"#0D062A\");\n this.chartLight = this.newChart(ctxLight, data, \"#000000\", \"#FFFFFF\");\n return this;\n }\n\n newChart(ctx, data, color, canvasBackgroundColor) {\n const self = this;\n const chart = new Chart(ctx, {\n type: 'scatter',\n data: data,\n options: {\n animation: false,\n aspectRatio: 1.7,\n scales: {\n x: {\n beginAtZero: false,\n title: {\n display: false,\n text: \"Year\",\n color: color,\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n callback: function (value, index, values) {\n return (Number.isInteger(value)) ? value.toString() : null;\n },\n color: color,\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n }\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n display: false,\n }\n },\n y: {\n beginAtZero: true,\n title: {\n display: false,\n text: \"Count\",\n color: color,\n font: {\n family: 'Gilmer-Regular, Poppins-Regular'\n }\n },\n ticks: {\n callback: function (value, index, values) {\n return self.formatLinechartLabel(value, false);\n },\n color: color,\n font: {\n family: 'Gilmer-Regular, Poppins-Regular',\n size: 13\n },\n maxTicksLimit: 7\n },\n grid: {\n borderColor: \"rgba(0, 0, 0, 0)\",\n color: \"#4f5251\",\n drawTicks: false\n }\n }\n },\n plugins: {\n customCanvasBackgroundColor: {\n color: canvasBackgroundColor,\n },\n legend: {\n display: false,\n }, title: {\n display: false,\n text: `Usage statistics`,\n color: color\n },\n tooltip: {\n titleFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n bodyFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n footerFont: {\n family: 'Gilmer-Regular, Poppins-Regular',\n },\n displayColors: false,\n callbacks: {\n label: function (context) {\n let label = context.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n if (context.parsed.y !== null) {\n label += self.formatLinechartLabel(context.parsed.y, false);\n }\n if (context.parsed.x !== null) {\n label += ` (${context.parsed.x})`;\n }\n return label;\n }\n }\n },\n datalabels: {\n anchor: 'center',\n align: 'right',\n offset: 5,\n clamp: true,\n font: {\n weight: 'bold'\n },\n formatter: function (value, context) {\n return context.dataset.label;\n },\n color: function (context) {\n return context.dataset.borderColor;\n },\n display: function (context) { return (context.dataIndex === 0); }\n }\n }\n },\n plugins: [plugin]\n });\n return chart;\n }\n\n addLinechartActions() {\n let linechartActionsHolder = coreFunctions.createElementHelper(\"div\", {class:\"linechartActions\"});\n linechartActionsHolder.appendChild(coreFunctions.createElementHelper(\"input\", {type: \"checkbox\", id: `${this.field}ChartLightModeToggle`}, {change: (event) => this.linechartLightModeToggle(event.target)}));\n linechartActionsHolder.appendChild(coreFunctions.createElementHelper(\"label\", {innerHTML: \" \", for: `${this.field}ChartLightModeToggle`, title: \"Invert line chart\", class: \"lightModeToggle\"}));\n linechartActionsHolder.appendChild(coreFunctions.createElementHelper(\"a\", {innerHTML: \" \", href: this.chart.toBase64Image(), title: \"Download chart\", class: \"downloadDarkChart\", download: `${this.field}_chart.png`}));\n linechartActionsHolder.appendChild(coreFunctions.createElementHelper(\"a\", {innerHTML: \" \", href: this.chartLight.toBase64Image(), title: \"Download chart\", class: \"downloadLightChart\", download: `${this.field}_chart.png`}));\n document.getElementById(`${this.field}LineChart`).appendChild(linechartActionsHolder);\n return this;\n }\n\n linechartLightModeToggle(element) {\n document.getElementById(`${this.field}LineChart`).setAttribute(\"lightMode\", (element.checked) ? 1 : 0);\n }\n\n\n formatLinechartLabel(value, formatFree) {\n if (this.dataType == \"currency\") {\n return new Intl.NumberFormat('en-EN', { style: 'currency', maximumFractionDigits: 0, currency: 'GBP', notation: 'compact' }).format(value);\n } else {\n return new Intl.NumberFormat('en-EN', { notation: 'compact', maximumFractionDigits: 0}).format(value);\n }\n }\n\n addLinechartKey() {\n let financialsKey, fieldCompanyTotalsHolder, fieldCompanyTotalsCheckbox, fieldCompanyTotalsLabel, fieldCompanyTotals, fieldCompanyCountsHolder;\n financialsKey = coreFunctions.createElementHelper(\"div\", { class: \"financialsKey\", innerHTML: \" Measured Projected\" });\n\n fieldCompanyTotalsHolder = financialsKey.appendChild(coreFunctions.createElementHelper(\"span\", { \"class\": \"companyTotalsControlHolder\" }));\n fieldCompanyTotalsCheckbox = fieldCompanyTotalsHolder.appendChild(coreFunctions.createElementHelper(\"input\", { type: \"checkbox\", id: `companyTotalsCheckbox${this.field}` }));\n fieldCompanyTotalsLabel = fieldCompanyTotalsHolder.appendChild(coreFunctions.createElementHelper(\"label\", { for: `companyTotalsCheckbox${this.field}`, innerHTML: \"?\" }));\n fieldCompanyTotals = fieldCompanyTotalsLabel.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"fieldCompanyTotals\" }));\n fieldCompanyTotals.appendChild(coreFunctions.createElementHelper(\"span\", { \"class\": \"fieldCompanyTotalsElement\", innerHTML: \"Projected data (shown in brackets) uses the most recently filed accounts to predict years for which accounts are not yet filed.\" })); // Explanation message\n fieldCompanyCountsHolder = fieldCompanyTotals.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"companyCountsHolder fieldCompanyTotalsElement\" })).appendChild(coreFunctions.createElementHelper(\"ul\"));\n\n this.elements.forEach(element => fieldCompanyCountsHolder.appendChild(element.formatYearlyCompanyTotals()));\n fieldCompanyCountsHolder.parentNode.appendChild(coreFunctions.createElementHelper(\"span\", { class: \"explanation\", innerHTML: 'No. of companies reporting' }));\n\n return financialsKey;\n }\n\n addCumulativeLinechartSummary() {\n let holder, recentResultsToProcess, cumulativeValuesForSummary, growthValue;\n const percentFormat = new Intl.NumberFormat('en', { style: 'percent', signDisplay: 'exceptZero', maximumSignificantDigits: 3, minimumSignificantDigits: 2});\n\n recentResultsToProcess = 10;\n if (this.linechartData.length > 0) {\n cumulativeValuesForSummary = this.linechartData.slice(-1 * recentResultsToProcess);\n growthValue = (cumulativeValuesForSummary[cumulativeValuesForSummary.length - 1].y - cumulativeValuesForSummary[0].y) / cumulativeValuesForSummary[0].y;\n\n // Total active companies\n let holderContent = `
${cumulativeValuesForSummary[cumulativeValuesForSummary.length - 1].y.toLocaleString()}
Active companies
`;\n holderContent += `
${percentFormat.format(growthValue)}
Growth: ${cumulativeValuesForSummary[0].x} - ${cumulativeValuesForSummary[cumulativeValuesForSummary.length - 1].x}
`;\n\n holder = coreFunctions.createElementHelper(\"div\", { class: \"cumulativeDataHolder\", innerHTML: holderContent });\n\n document.querySelector(`.barchartHolder[field='${this.field}'] .barchartContentWrapper[charttype=\"line\"]`).appendChild(holder);\n }\n\n return this;\n }\n}\n\nclass Barchart {\n constructor(field, elements, dataType, emptyFieldLabel, label, perCapitaData, totalCount, plotLocationQuotient, parent) {\n this.field = field;\n this.elements = elements;\n this.dataType = dataType;\n this.maximum = null;\n this.emptyFieldLabel = emptyFieldLabel;\n this.numberOfTopResultsToShow = 15;\n this.label = label;\n this.perCapitaData = perCapitaData;\n this.perCapitaMultiplier = 1000;\n this.totalCount = totalCount;\n this.plotLocationQuotient = plotLocationQuotient;\n this.calculationField = (this.plotLocationQuotient == undefined || this.plotLocationQuotient === false) ? \"count\" : \"quotient\";\n this.parent = parent;\n }\n\n getMaximumCount() {\n let field = this.calculationField;\n this.maximum = Math.max(...this.elements.map(element => Math.abs(element[field])));\n return this;\n }\n\n getMinimumCount() {\n let field = this.calculationField;\n return Math.min(...this.elements.map(element => element[field]));\n }\n\n addEnrichmentBarchartClasses() {\n return ` enrichmentBarchart${(this.getMinimumCount() <= 0) ? \" negativeValuesPresent\" : \"\"}`;\n }\n\n // Check element id's, see the maximum length\n getElementIdsDetails() {\n const elementIds = this.elements.flatMap((element) => {\n return (element.id) ? [element.id] : [];\n });\n const elementsHaveId = elementIds.length > 0;\n const regex = new RegExp(\"[A-Za-z]\"); // Check ID for alphabetical characters\n const idIsAlphaNumeric = (elementsHaveId) ? (elementIds.find(element => regex.test(element)) != undefined) : null;\n const idMaximumLength = (elementsHaveId) ? Math.max(...(elementIds.map(el => el.length))) : null;\n return {\n elementsHaveId: elementsHaveId,\n idIsAlphaNumeric: idIsAlphaNumeric,\n idMaximumLength: idMaximumLength\n }\n }\n\n createBarchart(displayAsPercentage) {\n let existingBarchartContentWrapper, barchartContentWrapper, maximumCount, barchartElementsHolder, numberOfTopResultsToShow, barchartExtraElementsHolder, dataType, calculationField;\n calculationField = this.calculationField;\n\n // Remove previously existing barchart if changing data source\n if (existingBarchartContentWrapper = document.querySelector(`.chartContentHolder[data-field='${this.field}'] .barchartContentWrapper`)) {\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).removeChild(existingBarchartContentWrapper);\n }\n\n maximumCount = this.maximum;\n let elementIdsDetails = this.getElementIdsDetails();\n dataType = this.dataType;\n numberOfTopResultsToShow = this.numberOfTopResultsToShow;\n\n barchartContentWrapper = coreFunctions.createElementHelper(\"div\", { class: \"barchartContentWrapper\", id: `${this.field}ChartContentWrapper`, charttype: \"bar\" });\n\n barchartElementsHolder = barchartContentWrapper.appendChild(coreFunctions.createElementHelper(\"div\", { class: `barchartContent${this.dataType == \"percentage\" ? this.addEnrichmentBarchartClasses() : \"\"}` })).appendChild(coreFunctions.createElementHelper(\"ul\"));\n barchartExtraElementsHolder = coreFunctions.createElementHelper(\"ul\", { class: \"barchartExtras\" });\n\n this.sortFieldElements().forEach((element, index) => {\n let barchartElement = (dataType == \"percentage\") ? element.createPercentageBarchartElement(maximumCount, index) : element.createBarchartElement(maximumCount, this.emptyFieldLabel, this.perCapitaData, this.perCapitaMultiplier, this.totalCount, ((displayAsPercentage && displayAsPercentage === true) ? true : false), this.plotLocationQuotient, index, elementIdsDetails);\n if (index < numberOfTopResultsToShow) {\n barchartElementsHolder.appendChild(barchartElement);\n } else {\n // TODO explore waiting until the show more button pressed\n barchartExtraElementsHolder.appendChild(barchartElement);\n }\n });\n\n barchartContentWrapper.querySelector(\".barchartContent\").appendChild(barchartExtraElementsHolder);\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).appendChild(barchartContentWrapper);\n this.addToggleExtraResultsControl();\n const widgetTitleLabel = `${this.label}${(this.parent.parent.listFiltersDescription) ? ` ${this.parent.parent.listFiltersDescription}` : \"\"}`;\n document.querySelector(`#${this.field}Widget .widgetTitle`).innerHTML = widgetTitleLabel;\n return this;\n }\n\n createSubgroupBarchart(title, subfield) {\n let barchartContentWrapper, maximumCount, barchartElementsHolder, numberOfTopResultsToShow, barchartExtraElementsHolder, dataType;\n\n maximumCount = this.maximum;\n let elementIdsDetails = this.getElementIdsDetails();\n dataType = this.dataType;\n numberOfTopResultsToShow = this.numberOfTopResultsToShow;\n\n barchartContentWrapper = coreFunctions.createElementHelper(\"div\", { class: \"barchartContentWrapper\", id: `${this.field}${subfield}ChartContentWrapper`, charttype: \"bar\" });\n\n barchartContentWrapper.appendChild(coreFunctions.createElementHelper(\"h4\", {innerHTML: title}));\n\n barchartElementsHolder = barchartContentWrapper.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"barchartContent\"})).appendChild(coreFunctions.createElementHelper(\"ul\"));\n barchartExtraElementsHolder = coreFunctions.createElementHelper(\"ul\", { class: \"barchartExtras\" });\n\n this.elements.forEach((element, index) => {\n let barchartElement = element.createBarchartElement(maximumCount, this.emptyFieldLabel, this.perCapitaData, this.perCapitaMultiplier, this.totalCount, false, this.plotLocationQuotient, index, elementIdsDetails);\n if (index < numberOfTopResultsToShow) {\n barchartElementsHolder.appendChild(barchartElement);\n } else {\n barchartExtraElementsHolder.appendChild(barchartElement);\n }\n });\n\n barchartContentWrapper.querySelector(\".barchartContent\").appendChild(barchartExtraElementsHolder);\n\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).appendChild(barchartContentWrapper);\n this.addSubfieldToggleExtraResultsControl();\n return this;\n }\n\n addSubfieldToggleExtraResultsControl() {\n let totalElements = this.totalElements();\n let numberOfTopResultsToShow = this.numberOfTopResultsToShow;\n const barchartObject = this;\n\n if (totalElements >= numberOfTopResultsToShow) {\n document.querySelector(`.barchartHolder[field='${this.field}'] .barchartContent`).appendChild(coreFunctions.createElementHelper(\"div\", { class: \"showExtraResultsControlHolder\" })).appendChild(coreFunctions.createElementHelper(\"button\", { class: \"actionControl showExtraResultsControl\", field: this.field, innerHTML: ` ` }, { click: (event) => this.toggleExtraResults(event.target) }));\n }\n }\n\n sortFieldElements() {\n if (this.calculationField == 'count') {\n return this.elements;\n } else {\n return [...this.elements].sort(function (a, b) { return b[\"quotient\"] - a[\"quotient\"]; });\n }\n }\n\n totalElements() {\n return this.elements.length;\n }\n\n addToggleExtraResultsControl() {\n let totalElements = this.totalElements();\n let numberOfTopResultsToShow = this.numberOfTopResultsToShow;\n const barchartObject = this;\n\n if (totalElements >= numberOfTopResultsToShow) {\n document.querySelector(`.barchartHolder[field='${this.field}'] .barchartContent`).appendChild(coreFunctions.createElementHelper(\"div\", { class: \"showExtraResultsControlHolder\" })).appendChild(coreFunctions.createElementHelper(\"button\", { class: \"actionControl showExtraResultsControl\", field: this.field, innerHTML: ` ` }, { click: (event) => this.showExtraResultsButtonClick(event.target) }));\n }\n }\n\n showExtraResultsButtonClick(element) {\n if (this.parent.subSubsection) {\n this.parent.parent.toggleSubsubSectionExtraResults(this.parent.subsection, this.parent.subSubsection, this.constructor.name);\n } else {\n this.toggleExtraResults(element);\n }\n }\n\n // Hide or show extra results\n toggleExtraResults(element) {\n // Extra results are currently visible\n if (element.classList.contains(\"open\")) {\n this.hideExtraResults(element);\n }\n // Extra results are not currently visible\n else {\n this.displayExtraResults(element);\n }\n }\n\n // Display bar chart extra results\n displayExtraResults(element) {\n // Show fields and update text\n element.classList.add(\"open\");\n document.querySelector(`.barchartHolder[field='${this.field}'] .barchartExtras`).classList.add(\"open\");\n }\n\n // Hide extra lines in barchart\n hideExtraResults(element) {\n let textElement = element.querySelector(\".iconMessage\");\n const barchartObject = this;\n // Remove open classes\n element.classList.remove(\"open\");\n document.querySelector(`.barchartHolder[field='${this.field}'] .barchartExtras`).classList.remove(\"open\");\n element.scrollIntoView({ block: \"center\" });\n // Update text on control\n // setTimeout(function () {\n // //textElement.innerHTML = `Show ${(barchartObject.totalElements() - barchartObject.numberOfTopResultsToShow).toLocaleString()} more values`;\n\n // }, 500);\n\n }\n}\n\nclass StackedBarchart {\n constructor(field, elements, dataType, stackedBarchartOptions) {\n this.field = field;\n this.elements = elements;\n this.dataType = dataType;\n this.sharedFieldId = stackedBarchartOptions.sharedFieldId;\n this.fieldIdsSharingMixedTotal = stackedBarchartOptions.fieldIdsSharingMixedTotal;\n this.mixedCount = this.calculateMixedCount();\n this.totalCount = this.calculateTotalCount();\n }\n\n createStackedBarchart() {\n let existingBarchartContentWrapper, barchartContentWrapper, barchartElementsHolder, stackedBar, stackedBarchartKey;\n\n // Remove previously existing barchart if changing data source\n if (existingBarchartContentWrapper = document.querySelector(`.chartContentHolder[data-field='${this.field}'] .barchartContentWrapper`)) {\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).removeChild(existingBarchartContentWrapper);\n }\n\n barchartContentWrapper = coreFunctions.createElementHelper(\"div\", { class: \"barchartContentWrapper\", id: `${this.field}ChartContentWrapper`});\n\n barchartElementsHolder = barchartContentWrapper.appendChild(coreFunctions.createElementHelper(\"div\", { class: `barchartContent`})).appendChild(coreFunctions.createElementHelper(\"ul\"));\n\n stackedBarchartKey = barchartContentWrapper.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"stackedBarchartKey\"}))\n\n stackedBar = barchartElementsHolder.appendChild(coreFunctions.createElementHelper(\"li\", {class: \"stackedBar\"}));\n this.elements.forEach(element => {\n const adjustedCount = this.calculateAdjustedCount(element);\n const isSharedField = (element.id == this.sharedFieldId);\n if (adjustedCount > 0) {\n stackedBar.appendChild(element.createStackedBarElement(adjustedCount, this.totalCount, isSharedField));\n stackedBarchartKey.appendChild(element.createStackedBarchartKeyElement());\n }\n });\n\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).appendChild(barchartContentWrapper);\n return this;\n }\n\n // Do not add any shared field counts to the total\n calculateTotalCount() {\n const fullElementsCount = this.elements.reduce((accumulator, element) => accumulator + element.count, 0);\n const totalCount = fullElementsCount - (this.fieldIdsSharingMixedTotal.length * this.mixedCount); // Remove over count caused by elements mixing\n return totalCount;\n }\n\n // Get total of shared data field if available\n calculateMixedCount() {\n let mixedCount;\n if (this.sharedFieldId) {\n const mixedField = this.elements.find(element => element.id == this.sharedFieldId);\n mixedCount = (mixedField) ? mixedField.count : null;\n }\n return mixedCount;\n }\n\n // Calculate adjusted value if count is shared with another field\n calculateAdjustedCount(element) {\n return (this.mixedCount && this.fieldIdsSharingMixedTotal.includes(element.id)) ? (element.count - this.mixedCount) : element.count;\n }\n}\n\nclass CompanyActiveDate {\n constructor (year, foundedCount, diedCount, activeCount) {\n this.year = year;\n this.foundedCount = foundedCount;\n this.diedCount = diedCount;\n this.activeCount = activeCount;\n }\n\n processElementForCompleteDownload() {\n return {\n \"Year\": this.year,\n \"Companies founded in year\": this.foundedCount,\n \"Companies died in year\": this.diedCount,\n \"Total active count\": this.activeCount\n };\n }\n\n\n getHeaders() {\n return [\n \"Year\",\n \"Companies founded in year\",\n \"Companies died in year\",\n \"Total active count\"\n ];\n }\n\n formatElementForCsv() {\n return [this.year, this.foundedCount, this.diedCount, this.activeCount];\n }\n}\n\nclass CompanyTradeDataItem {\n constructor (chapter, count) {\n this.chapter = chapter;\n this.count = count;\n }\n\n processElementForCompleteDownload() {\n return {\n \"Chapter\": this.chapter,\n \"Companies Count\": this.count,\n };\n }\n\n getHeaders() {\n return [\n \"Chapter\",\n \"Companies Count\"\n ];\n }\n\n formatElementForCsv() {\n return [this.year, this.foundedCount, this.diedCount, this.activeCount];\n }\n}\n\nclass Slider {\n constructor (field, fieldElements, title, sliderField, min, max, starts, series, compareField) {\n this.field = field;\n this.fieldElements = fieldElements;\n this.title = title;\n this.sliderField = sliderField;\n this.min = min;\n this.max = max;\n this.starts = starts;\n this.series = series;\n this.compareField = compareField;\n this.lowerValue = starts[0];\n this.upperValue = starts[1];\n }\n\n createSliderElements() {\n const holder = coreFunctions.createElementHelper(\"div\", { class: \"barchartContentWrapper\", id: `${this.field}SliderChartContentWrapper`, charttype: \"slider\" });\n holder.appendChild(coreFunctions.createElementHelper(\"h4\", {innerHTML: this.title}));\n const wrapper = holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-wrapper\"}));\n wrapper.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider\", id: `${this.field}Slider`}));\n wrapper.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-holder flex-row-holder\", \"data-field\": this.field}))\n document.querySelector(`.chartContentHolder[data-field='${this.field}']`).appendChild(holder);\n return this;\n }\n\n createSlider() {\n this.slider = document.getElementById(`${this.field}Slider`);\n const options = {\n start: this.starts,\n connect: [false, true, false],\n step: 1,\n range: {\n min: this.min,\n max: this.max\n },\n format: {\n to: function (value) {\n return value;\n },\n from: function (value) {\n return Number(value);\n }\n },\n tooltips: [true, true]\n }\n noUiSlider.create(this.slider, options);\n this.slider.noUiSlider.on(\"change\", (values, handle) => this.onSliderChange(values, handle));\n return this;\n }\n\n onSliderChange(values, handle) {\n this.lowerValue = values[0];\n this.upperValue = values[1];\n this.updateSliderSummary();\n }\n\n updateSliderSummary() {\n let holder;\n if (holder = document.querySelector(`.slider-summary-holder[data-field='${this.field}']`)) {\n coreFunctions.clearElementChildren(holder);\n const period = `${this.lowerValue}${(this.upperValue != this.lowerValue) ? ` - ${this.upperValue}` : \"\"}`;\n const results = this.fieldElements.filter(element => (element[this.sliderField] <= this.upperValue && element[this.sliderField] >= this.lowerValue));\n this.series.forEach(series => {\n const sum = this.sumSeriesValues(results, series.yField);\n if (sum) {\n holder.appendChild(this.createSeriesElement(series, sum, period));\n }\n });\n\n const compareField = this.createCompareFieldElement(period);\n if (compareField) {\n holder.appendChild(compareField);\n }\n\n }\n\n }\n\n createCompareFieldElement(period) {\n let wrapper, startValue, endValue, holder;\n if (startValue = this.fieldElements.find(element => element[this.compareField.xField] == this.lowerValue)) {\n const startTotal = startValue[this.compareField.yField];\n wrapper = coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-element\"});\n\n holder = wrapper.appendChild(coreFunctions.createElementHelper(\"div\", {class:\"slider-summary-element\"}));\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-total\", innerHTML: startTotal.toLocaleString()}));\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-label\", innerHTML: `${this.lowerValue} ${this.compareField.label}`}));\n\n if (this.upperValue != this.lowerValue && (endValue = this.fieldElements.find(element => element[this.compareField.xField] == this.upperValue))) {\n const endTotal = endValue[this.compareField.yField];\n holder = wrapper.appendChild(coreFunctions.createElementHelper(\"div\", {class:\"slider-summary-element\"}));\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-total\", innerHTML: endTotal.toLocaleString()}));\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-label\", innerHTML: `${this.upperValue} ${this.compareField.label}`}));\n\n const growth = (endTotal - startTotal) / startTotal;\n const growthStyle = (growth < 0) ? \"orange\" : \"green\";\n const percentFormat = new Intl.NumberFormat('en', { style: 'percent', signDisplay: 'exceptZero', maximumSignificantDigits: 2, minimumSignificantDigits: 2});\n\n holder = wrapper.appendChild(coreFunctions.createElementHelper(\"div\", {class:\"slider-summary-element\"}));\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: `slider-summary-total ${growthStyle}`, innerHTML: percentFormat.format(growth)}));\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-label\", innerHTML: `Growth
${period}`}));\n }\n }\n\n return wrapper;\n }\n\n\n createSeriesElement(series, sum, period) {\n const holder = coreFunctions.createElementHelper(\"div\", {class:\"slider-summary-element\"});\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-total\", style: `color: ${series.color};`, innerHTML: sum.toLocaleString()}));\n holder.appendChild(coreFunctions.createElementHelper(\"div\", {class: \"slider-summary-label\", innerHTML: `${series.label}
${period}`}));\n return holder;\n }\n\n sumSeriesValues(array, field) {\n return array.reduce((sum, element) => sum + element[field], 0);\n }\n}\n\nclass DataTable {\n constructor (field, fieldElements, headings, columns, drilldown, title, parent) {\n this.field = field;\n this.fieldElements = fieldElements;\n this.drilldown = drilldown;\n this.title = title;\n this.headings = this.processHeadings(headings);\n this.columns = columns;\n this.parent = parent;\n\n }\n\n processHeadings(headings) {\n if (this.drilldown) {\n headings.unshift(\" \");\n }\n return headings;\n }\n\n createDataTableElement() {\n const holder = document.querySelector(`.chartContentHolder[data-field='${this.field}']`);\n const wrapper = coreFunctions.createElementHelper(\"div\", {class: \"data-table-holder\"});\n wrapper.appendChild(coreFunctions.createElementHelper(\"h4\", {innerHTML: this.title}));\n const tableHolder = wrapper.appendChild(coreFunctions.createElementHelper(\"div\", { class: \"table-holder\"}));\n const table = this.createTable();\n if (this.drilldown) {\n const form = tableHolder.appendChild(coreFunctions.createElementHelper(\"form\"));\n form.appendChild(table);\n } else {\n tableHolder.appendChild(table);\n }\n holder.appendChild(wrapper);\n }\n\n createTable() {\n const table = coreFunctions.createElementHelper(\"table\", {class: \"table-holder fixed-head-table\"});\n table.appendChild(this.createTableHeader());\n table.appendChild(this.createTableElements());\n return table;\n }\n\n createTableHeader() {\n const thead = document.createElement(\"thead\");\n const tr = thead.appendChild(coreFunctions.createElementHelper(\"tr\"));\n this.headings.forEach(heading => tr.appendChild(coreFunctions.createElementHelper(\"th\", {innerHTML: heading})));\n return thead;\n }\n\n createTableElements() {\n const tbody = document.createElement(\"tbody\");\n this.fieldElements.forEach((element, index) => tbody.appendChild(this.createFieldElementRow(element, index)));\n return tbody;\n }\n\n createFieldElementRow(element, index) {\n const tr = document.createElement(\"tr\");\n if (this.drilldown) tr.appendChild(this.createDataDrilldownControl(element, index));\n this.columns.forEach(column => tr.appendChild(column.createColumnCell(element)))\n return tr;\n }\n\n dataDrilldownToggle(element) {\n const value = element.value;\n const keyField = element.dataset.drilldown_keyfield;\n const labelField = element.dataset.drilldown_labelfield;\n const chart = element.dataset.drilldown_chart;\n this.parent.updateChartSourceData(value, labelField, keyField, chart);\n }\n\n createDataDrilldownControl(element, index) {\n const cell = document.createElement(\"td\");\n const key = this.columns[0].field;\n const id = `${this.field}-${element[key]}-drilldownToggle`;\n const holder = cell.appendChild(coreFunctions.createElementHelper(\"span\", {class: \"drilldown-holder\"}));\n const input = holder.appendChild(coreFunctions.createElementHelper(\"input\", {id: id, type: \"radio\", name: `${this.field}Drilldown`, value: element[key], \"data-drilldown_keyfield\": this.drilldown.keyField, \"data-drilldown_labelfield\": this.drilldown.labelField, \"data-drilldown_chart\": this.drilldown.chart}, {change: (event) => this.dataDrilldownToggle(event.target)}));\n if (index == 0) {\n input.checked = true;\n }\n holder.appendChild(coreFunctions.createElementHelper(\"label\", {for: id, innerHTML: \" \"}));\n return cell;\n }\n}\n\nclass DataTableColumn {\n constructor (field, dataType) {\n this.field = field;\n this.dataType = dataType;\n this.currencyFormat = new Intl.NumberFormat('en-EN', { style: 'currency', maximumFractionDigits: 0, currency: 'GBP' });\n this.percentFormat = new Intl.NumberFormat('en', { style: 'percent', signDisplay: 'exceptZero', minimumSignificantDigits: 2});\n }\n\n createColumnCell(element) {\n let value = (element[this.field]) ? this.formatValue(element[this.field]) : \"N/A\";\n const td = coreFunctions.createElementHelper(\"td\", {innerHTML: value});\n return td;\n }\n\n formatValue(value) {\n switch (this.dataType) {\n case \"number\":\n value = `${value.toLocaleString()}`;\n break;\n case \"currency\":\n value = `${this.currencyFormat.format(value)}`;\n break;\n case \"percent\":\n value = this.percentFormat.format(value);\n break;\n default:\n value = value;\n };\n return value;\n }\n}\n\nclass JobPostingInsight {\n constructor (field, soc4Code, soc4Name, postings, medianSalary, timeSeries) {\n this.field = field;\n this.soc4Code = soc4Code;\n this.soc4Name = soc4Name;\n this.postings = postings;\n this.medianSalary = medianSalary ? parseInt(medianSalary) : medianSalary;\n this.timeSeries = timeSeries;\n }\n\n processElementForCompleteDownload() {\n return {\n \"SOC4 code\": this.soc4Code,\n \"SOC4 name\": this.soc4Name,\n \"Job postings\": this.postings,\n \"Median salary (GBP)\": this.medianSalary\n };\n }\n\n getHeaders() {\n return [\"SOC4 code\", \"SOC4 name\", \"Job postings\", \"Median salary (GBP)\"];\n }\n\n formatElementForCsv() {\n return [this.soc4Code, this.soc4Name, this.postings, this.medianSalary];\n }\n}"],"names":["Analysis","constructor","companiesConsidered","cutoff","modelCode","title","listID","this","fields","listSize","bestEstimateTotalEmployees","bestEstimateTotalEmployeesCompaniesUsed","bestEstimateTotalTurnover","bestEstimateTotalTurnoverCompaniesUsed","companiesWithDealroomFunding","totalDealroomFunding","totalInnovateUkFunding","bestEstimateGrowthPercentagePerYear","totalInnovateUKGrantsWon","bestEstimateGVA","bestEstimateGVACompaniesUsed","femaleDirectors","maleDirectors","unknownGenderDirectors","womenLedCompanies","womenFoundedCompanies","summaryTable","companiesWithAnomalies","filtersObject","filtersForSearch","listFiltersDescription","getAnalysis","callback","callbackArguments","let","url","input","self","model_code","Object","assign","coreFunctions","xhrHelper","response","analysisResponse","JSON","parse","processAnalysisResponse","console","log","stringify","getSummaryTableData","filters","CompanyStatus","summaryTableResponse","processSummaryTableData","formatKnowledgeBaseTooltipLink","text","anchorText","mapAttributions","lightcastDataExplainer","locationsKnowledgeBaseLink","keywordsKnowledgeBaseLink","rticsAndSectorsKnowledgeBaseLink","lightcastLink","urlPath","checkForDebugMessages","resetAnalysis","updateAnalysis","analysisFieldAvailable","LANameCounts","length","newAnalysisField","addAnalysisFieldElements","addTotalCount","CompaniesConsidered","EmployeesByLA","BestEstimateTotalEmployees","TurnoversByLA","BestEstimateTotalTurnover","CityCounts","EmployeesByCity","TurnoversByCity","ConstituencyCounts","EmployeesByConstituency","TurnoversByConstituency","LEPCounts","EmployeesByLEP","TurnoversByLEP","NUTS1Counts","EmployeesByITL1","TurnoversByITL1","NUTS2CodeCounts","EmployeesByITL2","TurnoversByITL2","UltimateParentNationsCounts","UltimateParentNationsEmployees","UltimateParentNationsTurnovers","SectorKeywordCounts","SectorKeywordEnrichment","InnovationKeywordCounts","InnovationKeywordEnrichment","FounderGenderBusinessCounts","sharedFieldId","fieldIdsSharingMixedTotal","CompanySizeEmployees","addAnalysisFinancialFieldElements","EmployeesByYear","MeasuredYearValues","ProjectedYearValues","createTopCompanies","TopCompanies","CompaniesActiveOrStruckoff","CompanyStatuses","CompanyGrowthStages","CompanyGrowthRates","JobPostingInsights","charts","type","subfield","headings","columns","DataTableColumn","drilldown","keyField","labelField","chart","subtype","defaults","field","label","value","addJobPostingInsightsElements","CompanyJobPostingsOverTimeBySOC4","processJobPostingsOverTimeData","CompanyJobPostingsOverTimeByLOT","JobPostingsBySOC4Name","AverageAdvertisedSalaryBySOC4Name","JobPostingsBySkill","slice","AveragePostingDurationBySkill","JobPostingsBySoftwareSkill","AveragePostingDurationBySoftwareSkill","JobPostingsBySpecializedSkill","AveragePostingDurationBySpecializedSkill","JobPostingsByCertificationsSkill","AveragePostingDurationByCertificationsSkill","JobPostingsByCommonSkill","AveragePostingDurationByCommonSkill","RTICBusinessCounts","RTICEmployees","RTICJobPostings","RTICTurnovers","RTICVerticalBusinessCounts","RTICVerticalEmployees","RTICVerticalJobPostings","RTICVerticalTurnovers","CICBusinessCounts","CICEmployees","CICJobPostings","CICTurnovers","CICVerticalBusinessCounts","CICVerticalEmployees","CICVerticalJobPostings","CICVerticalTurnovers","SICCounts","SICEmployees","SICTurnovers","RSICCounts","RSICEmployees","RSICTurnovers","SICHLUCounts","SICHLUEmployees","SICHLUTurnovers","CompanyActiveDates","xField","yField","series","cumulateValues","color","min","max","Date","getFullYear","starts","sliderField","compareField","addCompanyActiveDatesElements","TradeImportByChapter","TradeImportTotalCompanies","TradeExportByChapter","TradeExportTotalCompanies","NET_WORTH","TurnoverByYear","PROFIT_AFTER_TAX","TOTAL_CURRENT_ASSETS","TOTAL_LIABILITIES","DealroomFundingByYear","processDealroomData","DealroomFundingRoundsByYear","InnovateUKFundingByYear","processInnovateUkData","setSummaryTableToggleEvent","document","getElementById","addEventListener","element","target","checked","querySelectorAll","innerHTML","classList","add","window","scrollTo","top","behavior","analysisLoaded","updateUrlAddressQuery","resetAnalysisContent","updateAnalysisFiltersDescription","createWidgetSubsections","createAnalysisWidgets","syncSubsubsectionbubbleMapWidgets","createAnalysisSummaryBox","addAnalyisSummary","displaySectionNavigation","humanReadableFiltersRepresentation","regex","getHumanReadableFiltersRepresentation","start","RegExp","replace","trim","data","hasOwnProperty","undefined","Array","isArray","checkUrlQueryFields","queryListID","queryModelCode","queryCutoff","queryListSize","queryRtic","rticSector","rticVertical","getQueryVariable","companyLists","presetList","validatePresetModelCode","Number","querySelector","toggleCutoffControl","decodeURIComponent","rticFilters","preloadRticSector","subsection","dataType","explanation","chartType","allowedChartTypes","thingColumnLabel","emptyFieldLabel","displayDataAsPercentage","locationFilterField","subSubsection","stackedBarchartOptions","analysisField","AnalysisField","push","setAnalysisProperties","analysis","listDetails","returnCount","Cutoff","BestEstimateTotalEmployeesCompaniesUsed","BestEstimateTotalTurnoverCompaniesUsed","TotalDealroomFunding","CompaniesWithDealroomFunding","TotalInnovateUKFunding","TotalInnovateUKGrantsWon","BestEstimateGrowthPercentagePerYear","bestEstimateGrowthPercentagePerYearCompaniesUsed","BestEstimateGrowthPercentagePerYearCompaniesUsed","BestEstimateGVA","BestEstimateGVACompaniesUsed","ActiveFemaleDirectors","ActiveMaleDirectors","ActiveUnknownGenderDirectors","WomenLedCompanies","WomenFoundedCompanies","SummaryTable","CompaniesWithAnomalousFinancials","tradeImportTotalCompanies","tradeExportTotalCompanies","listSummaryHolder","concat","map","filter","item","i","ar","indexOf","forEach","subsectionHolder","createElementHelper","class","data-section","appendChild","createSubSubsectionSelect","click","dataset","section","scrollIntoView","block","subSubsectionControls","subSubsectionSelect","Set","analyse","listAnalysis","flatMap","subSubsectionSelectHolder","data-subsection","change","subSubsectionOnchange","event","hideSubSubsectionWidgets","processActiveSubSubsection","refreshSubSubsectionWidgetExplanation","subSubsectionWidgets","showSubSubsectionWidgets","subSubsectionFields","checkExtraSubSubSectionControls","createSubSubsectionWidgets","createAnalysisWidget","widgets","remove","existingControl","find","widget","fieldHasLocationQuotientData","processLocationQuotientSubSubSectionControl","hasPercentageData","processAbsolutePercentageSubSubSectionControl","checkSubSubsectionChartTypes","updateLocationQuotientSubSubSectionControl","filterByLocationIsActive","createLocationQuotientSubSubSectionControl","generalFilters","filterGroupIsActive","holder","from","control","subsubsection","locationQuotientSubSubSectionChange","controls","id","data-subsubsection","data-source","name","for","createTooltipElement","dataSource","locationQuotientControlChange","updateAbsolutePercentageSubSubSectionControl","createAbsolutePercentageSubSubSectionControl","absolutePercentageSubSubSectionChange","absolutePercentageDataToggleChange","sectionsList","children","nextElementSibling","removeChild","firstChild","addAnalyseFieldToPage","bubbleMapWidgets","bubbleMap","siblingBubbleMap","sync","split","removeSubSubsectionChartTypesControl","createSubSubsectionChartTypesControl","modalChartType","getMode","includes","chartTypeSubSubsectionChange","checkForChartRefresh","listSummaryExplanationHolder","listSummaryPanel","listSummaryWrapper","contentHolder","listSummaryHeader","addResultsToAnalysisSummary","locationAnalysisField","filteredLocations","totalTurnoverSummary","totalEmployeesSummary","gvaSummary","womanLedSummary","tradeDataSummary","locationFieldSum","totalDirectors","currencyFormat","Intl","NumberFormat","style","maximumFractionDigits","currency","percentFormat","signDisplay","minimumSignificantDigits","getActiveLocationFilters","toLocaleString","findLocationAnalysisField","sumOverElements","locations","totalEmployeesSummaryLocationHolder","formatElementNames","names","pluraliseWord","totalTurnoverSummaryLocationHolder","format","calculateGvaPerEmployeeEstimate","getTotalDirectors","comparisonGroup","createSummaryTable","createSummaryTableContent","getSummaryTableRowDescription","Has_CompanyNumber","Has_CompanyName","Has_CountryOfOrigin","Has_Facebook","Has_Instagram","Has_Twitter","Has_Linkedin","Has_Youtube","Has_IncorporationDate","Has_RegisteredAddress","Has_RegisteredPostcode","Has_CompanyCategory","Has_Website","Has_CompanyDescription","Has_WomenLed","Has_HighGrowth","Has_LocationDetails","Has_SICHLUs","Has_SICs","Has_SectorKeywords","Has_InnovationKeywords","Has_ManufacturingKeywords","Has_CompanyFinancials","Has_Officers","Has_TonnesOfC02equivGHGPerYear","Has_PhoneNumbers","Has_EmailAddresses","Has_GroupStructure","Has_PersonsWithSignificantControl","Has_ShareHolders","Has_CompanyStatus","Has_RTICs","Has_SimilarCompanies","Has_InnovationScore","Has_BestEstimateTurnover","Has_BestEstimateEmployees","Has_DealroomFunding","Has_InnovateUKFunding","Has_360GivingFunding","Has_HVMCCapabilities","Has_EstimatedGVA","Has_ESGStatementAnchors","Has_Scaleup","Has_WomenFounded","Has_OnlyWomenFounded","Has_MetaKeywords","analysisObject","tableHolder","table","e","downloadSummaryTable","tableBody","createSummaryTableRow","formatSummaryTableField","valuePercentage","valueFormatted","maximumSignificantDigits","valuePercentageFormatted","row","data-type","word","join","a","csvData","processSummaryTableCsvData","csv","Papa","unparse","blob","Blob","fileTitle","storedFiltersCode","navigator","msSaveOrOpenBlob","msSaveBlob","createElement","href","URL","createObjectURL","download","body","percentage","unit","fieldType","analysisFilteredByRegisteredAddresses","locationFilters","page","getFilteredLocations","array","ListFormat","hideSectionNavigation","editWidgetSubmit","form","newChartType","hideOverlay","classificationRelease","query","history","replaceState","prepareCompleteAnalysisDownload","processCompleteAnalysisDownloadData","filename","zip_filename","downloadCompleteAnalysis","processedTopCompanyData","completeAnaylsisDownloadData","processFieldForCompleteAnalysisDownload","checkTopCompaniesForCompleteDownload","isNaN","Count","sort","b","Thing","toString","parseInt","moment","toggleSubsubSectionExtraResults","getAnalysisFieldsInSubsubsection","button","toggleExtraResults","toggle","updateSubSubsectionMapVisibleMarkers","resultsToShow","updateMapVisibleMarkers","createSubSubsectionWidgetExplanation","tooltipContainsKnowledgeBaseLinkOnly","tooltip","div","childNodes","nodeType","Node","TEXT_NODE","reduce","accumulator","listTitle","parent","fieldElements","perCapitaElements","perCapitaMultiplier","topCompanies","totalCount","locationQuotientElements","total","elements","fieldsToCheck","some","count","dataHasLocationFields","rticsFilterIsActive","CompanyActiveDate","Year","Founded_Count","Died_Count","ActiveCount","JobPostingInsight","SOC4Code","SOC4Name","Postings","Median_Salary","JobPostingsAndSalariesTimeSeries","nameField","analysisFieldObject","fieldHasLocationData","newAnalysisFieldElement","Latitude","Longitude","Quotient","ID","thing","latitude","longitude","quotient","analysisFieldElement","AnalysisFieldElement","addPerCapitaFieldElements","newPerCapitaElement","fieldHasIdData","measuredYearValues","projectedYearValues","measuredYears","year","measuredYearValue","measuredYearCompanies","projectedYearValue","projectedYearCompanies","measuredYear","Companies","projectedYearSearch","projectedYear","newAnalysisFinancialFieldElement","sortByField","reverse","AnalysisFinancialFieldElement","addPercentageFieldElements","hasLocationData","subSubsectionSelectElement","createGeneralWidget","createLocationQuotientControl","createDataChart","createMap","createAbsolutePercentageDataToggleControl","addTopCompaniesToPage","allowZeroValues","addTopCompanies","createLocationWidget","locationContentContainer","locationWidgetHolder","locationWidgetWrapper","locationData","insertBefore","lastChild","createWidgetTitleBar","createLocationWidgetVisualisationHolder","mapVisualisation","data-chartgroup","data-field","barchartHolder","createWidgetControlsElements","insightsWidgetActionsControlHolder","analyisFieldObject","downloadAnalysisData","createWidgetExplanationElement","widgetExplanationHolder","titleBar","widgetTitleLabel","widgetTitle","widgetControls","prepareEditWidgetControls","chartTypeControls","disabled","showOverlay","processCsvData","processCsvFinancialData","listSummary","output","measuredValues","projectedTotal","measuredTotal","measuredCompanies","projectedEntry","entry","projectedCompanies","totalElements","header","fieldElement","hasLocationQuotientData","getHeaders","formatElementForCsv","resetDataChart","existingChartContent","parentNode","processChartObject","Linechart","prepareLinechartHolder","isFinancialField","drawLinechart","addLinechartActions","drawCumulativeLinechart","addCumulativeLinechartSummary","drawSeriesLinechart","chartSeries","drawTimestampBarChart","StackedBarchart","createStackedBarchart","FinancialsBarchart","getMaximumCount","createBarchart","Barchart","updateChartSourceData","chartObject","processLinechartObject","chartSettings","prepareSubgroupLinechartHolder","processTimeSeriesData","clearExistingLinechartHolder","getChartLabel","chartElements","createSubgroupBarchart","Slider","createSliderElements","createSlider","updateSliderSummary","DataTable","createDataTableElement","settings","object","timeSeries","formatTimestamp","Timestamp","timestamp","BubbleMap","createMapBubbles","getMaxCount","addBubblesToMap","createPerCapitaMap","createLocationQuotientMap","processedFieldForDownload","processedFieldElement","processElementForCompleteDownload","Location quotient","topCompaniesAvailable","processTopCompaniesForCompleteDownload","hasPercapitaData","locationQuotientSearch","location","locationSearch","createPerCapitaControl","perCapitaControlChange","isSectorsSubsectionMember","before","topCompaniesToShow","company","newTopCompany","CompanyName","CompanyNumber","companyName","companyNumber","topCompany","AnalysisFinancialFieldTopCompany","topCompaniesHolder","primaryListHolder","secondaryListHolder","topCompaniesTotal","downloadTopCompanies","toggleExtraTopCompanies","createTopCompanyListElement","processTopCompaniesCsvData","formatTopCompanyForCsv","closest","contains","processedTopCompaniesForDownload","index","processTopCompanyForCompleteDownload","plotLocationQuotient","mapElements","maxRadius","maxTotal","mapClusters","markersToShow","existingMapContainer","mapHolder","resultsControl","mapObject","L","zoomControl","attributionControl","scrollWheelZoom","setView","zoom","position","addTo","tileLayer","attribution","subdomains","maxZoom","className","Control","extend","options","onAdd","visibleResultsControl","container","DomUtil","create","DomEvent","on","ev","markersToShowOnChange","parseFloat","addControl","Math","getContainer","hasLayer","removeLayer","createMapClusters","addLayer","sortBubbleElements","countMultiplier","getBubbleCountMultiplier","mapBubble","MapBubble","scaleFactor","sqrt","numberFormat","notation","markerClusterGroup","maxClusterRadius","polygonOptions","disableClusteringAtZoom","iconCreateFunction","cluster","markers","getAllChildMarkers","radius","divIcon","html","getChildCount","iconSize","point","marker","addBubbleToMap","addBubblesToMapOLD","mapFeatureGroup","visibleFeatureGroup","leafletBubblesArray","leafletBubble","featureGroup","getLayers","fitBounds","getBounds","LatLng","center","circleMarker","stroke","opacity","fill","fillColor","fillOpacity","bindPopup","openPopup","closePopup","bindTooltip","permanent","direction","refreshMarker","hideMarker","displayMarker","getTooltip","formatTooltipValue","getElement","minimumFractionDigits","getFieldElementType","formatFinancialFieldValue","formatFree","formatNumericalValue","barCount","createFinancialsBarchartElement","maximumCount","barWidth","barElementLi","barContainer","formatYearlyCompanyTotals","valuesHolder","Measured total (GBP)","Measured companies","Projected total (GBP)","Projected companies","topCompanyListElement","formatTopCompanyValue","Position","Company number","Company name","Total","sicDescription","addExtraDescription","extraDescription","sicSearch","startsWith","sicCodes","sic","code","description","onBarHover","throttle","removeAllBarHighlights","addBarHighlightsToSiblings","chartGroup","chartgroup","createBarchartElement","isPercapitaData","displayAsPercentage","elementIdsDetails","barIdWidthIsAdjusted","fieldIsRticVertical","hasLongLabel","test","displayElementId","elementsHaveId","idMaximumLength","barIdContent","elementName","barField","data-name","data-position","mouseenter","mouseleave","idIsAlphaNumeric","toFixed","createStackedBarElement","adjustedCount","isSharedField","barElementLabel","data-id","data-percent","stackedBarchartElementOnMouseEnter","stackedBarchartElementOnMouseLeave","createStackedBarchartKeyElement","stackedBarKeyElement","sharedElement","previousElementSibling","formatPercentageCount","createPercentageBarchartElement","maxWidth","abs","headers","processedElementObject","maximum","numberOfTopResultsToShow","measuredTotals","projectedTotals","barchartContentWrapper","barchartContent","barchartElementsHolder","charttype","addFinancialsBarchartKey","barchartElement","financialsKey","fieldCompanyTotalsHolder","fieldCompanyTotalsLabel","fieldCompanyTotals","fieldCompanyCountsHolder","linechartData","numberOfGridlines","chartLight","linechartContentWrapper","addLinechartKey","linechartHolder","setAttribute","createSeriesLinechartKey","keyHolder","keyElement","formatSeriesDataset","sum","cumulativeSum","x","y","seriesData","showLine","borderColor","borderWidth","pointRadius","tension","display","ctx","getContext","datasets","Chart","animation","aspectRatio","scales","beginAtZero","font","family","ticks","values","isInteger","size","grid","maxTicksLimit","drawTicks","plugins","legend","titleFont","bodyFont","footerFont","displayColors","callbacks","context","parsed","datalabels","anchor","align","offset","clamp","weight","formatter","dataIndex","backgroundColor","maxBarThickness","time","minUnit","tickValue","drawTimestampLineChart","ctxLight","borderDash","newChart","canvasBackgroundColor","formatLinechartLabel","customCanvasBackgroundColor","plugin","linechartActionsHolder","linechartLightModeToggle","toBase64Image","cumulativeValuesForSummary","growthValue","holderContent","perCapitaData","calculationField","getMinimumCount","addEnrichmentBarchartClasses","getElementIdsDetails","elementIds","el","existingBarchartContentWrapper","barchartExtraElementsHolder","sortFieldElements","addToggleExtraResultsControl","addSubfieldToggleExtraResultsControl","showExtraResultsButtonClick","hideExtraResults","displayExtraResults","mixedCount","calculateMixedCount","calculateTotalCount","stackedBar","stackedBarchartKey","calculateAdjustedCount","mixedField","foundedCount","diedCount","activeCount","Companies founded in year","Companies died in year","Total active count","CompanyTradeDataItem","chapter","Chapter","Companies Count","lowerValue","upperValue","wrapper","slider","connect","step","range","to","tooltips","noUiSlider","handle","onSliderChange","clearElementChildren","period","results","sumSeriesValues","createSeriesElement","createCompareFieldElement","startValue","endValue","growth","growthStyle","startTotal","endTotal","processHeadings","unshift","createTable","createTableHeader","createTableElements","thead","tr","heading","tbody","createFieldElementRow","createDataDrilldownControl","column","createColumnCell","dataDrilldownToggle","drilldown_keyfield","drilldown_labelfield","drilldown_chart","cell","key","data-drilldown_keyfield","data-drilldown_labelfield","data-drilldown_chart","formatValue","soc4Code","soc4Name","postings","medianSalary","SOC4 code","SOC4 name","Job postings","Median salary (GBP)"],"mappings":"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"}