;var bluevizi = (function (bluevizi) { bluevizi.config= { endPoint :"https://blue-ngo.ew.r.appspot.com" } bluevizi.loadAssets=function (assets, finalCallback) { function loadNext(index) { if (index < assets.length) { var asset; if (assets[index].type === 'js') { asset = document.createElement("script"); asset.src = assets[index].url; if (assets[index].async) { asset.async = true; } } else if (assets[index].type === 'css') { asset = document.createElement("link"); asset.href = assets[index].url; asset.rel = "stylesheet"; if (assets[index].integrity) { asset.integrity = assets[index].integrity; asset.crossOrigin = assets[index].crossOrigin; } } asset.onload = function() { loadNext(index + 1); }; document.head.appendChild(asset); } else { finalCallback(); } } loadNext(0); } bluevizi.gtag=function (arguments){ dataLayer.push(arguments); } bluevizi.init=function () { bluevizi.loadAssets([ {type: 'js', url: "https://www.googletagmanager.com/gtag/js?id=G-2GFBYVTND2", async: true}, {type: 'js', url: "https://d3js.org/d3.v5.min.js"}, /* */ { type: 'css', url: "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css", integrity: "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65", crossOrigin: "anonymous" }, /* */ { type: 'js', url: "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js", integrity:"sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4", crossOrigin: "anonymous" }, {type: 'css', url: "https://cdnjs.cloudflare.com/ajax/libs/select2/4.1.0-rc.0/css/select2.min.css"}, {type: 'js', url: "https://code.jquery.com/jquery-3.5.1.slim.min.js"}, {type: 'js', url: "https://cdnjs.cloudflare.com/ajax/libs/select2/4.1.0-rc.0/js/select2.min.js"}, {type: 'js', url: "https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.3/dist/umd/popper.min.js"}, {type: 'js', url: "https://cdnjs.cloudflare.com/ajax/libs/plotly.js/1.58.5/plotly.min.js"} ], function () { window.dataLayer = window.dataLayer || []; bluevizi.gtag('js', new Date()); bluevizi.gtag('config', 'G-2GFBYVTND2'); bluevizi.do() $(document).ready(function () { showLoadingOverlay() fetch("https://blue-ngo.ew.r.appspot.com/data/all") .then((response) => response.json()) .then((all) => { var modalElement = $('#staticContainer'); $("#country").select2({ //dropdownParent: modalElement, placeholder: "Country", allowClear: true, data: all.country, width:'resolve' }); $("#company").select2({ //dropdownParent: modalElement, placeholder: "Company", allowClear: true, data: all.company, width:'resolve' }); $("#companyNav").select2({ //dropdownParent: modalElement, placeholder: "Select company name... ", allowClear: false, width:'100%', data: all.company }).val(null).trigger('change'); $("#index").select2({ // dropdownParent: modalElement, placeholder: "Index", allowClear: true, data: all.index, width:'resolve' }).on('select2:open', function(e) { var width = $('.select2-container--open').outerWidth(false) + 'px'; $('.select2-dropdown').css('width', width); }); $("#sector").select2({ //dropdownParent: modalElement, placeholder: "Industry", allowClear: true, data: all.sector, width:'resolve' }); const selectedOptions = getSelectedOptions(); clearPlot(); callApi(selectedOptions); }); $('input[type=radio][name=selector]').change(function () { $('#country, #company, #index, #sector').val(null).trigger('change'); $('#countryGroup, #indexGroup, #sectorGroup, #companyGroup').hide(); var selectedGroup = $('#' + this.value + 'Group'); selectedGroup.show(); // Set focus on the Select2 element within the shown group var select2element = selectedGroup.find('select').first(); select2element.select2('open'); }); }); $('#applyBtn').click(function () { const selectedOptions = getSelectedOptions(); clearPlot(); callApi(selectedOptions); }); $('#codeBtnCSV').click(function () { let selectedOptions = getSelectedOptions(); selectedOptions.format='csv' downLoad(selectedOptions) const hashParams = {}; hashParams["filter"] = JSON.stringify(selectedOptions); window.location.hash = '#' + new URLSearchParams(hashParams).toString(); }); $('#codeBtnXLS').click(function () { let selectedOptions = getSelectedOptions(); selectedOptions.format='xlsx' downLoad(selectedOptions) const hashParams = {}; hashParams["filter"] = JSON.stringify(selectedOptions); window.location.hash = '#' + new URLSearchParams(hashParams).toString(); }); // Add a change event listener $('#companyBtn').click(function (e) { console.log("") let company = $('#companyNav').val(); window.open("https://data.carbonary.com/companies/idx/" + company, '_blank'); }); }); } bluevizi.do=function(data) { let layout = document.getElementsByClassName("blue-tool"); let d = document.createElement("div") let styles = [ /* `.select2-search__field {border: 1px solid black !important;}`,*/ `.select2-container { width: 100% !important; }`, `.select2-selection__arrow { display: none; }`, `.custom-select2 { width: 100% !important },`, `#staticContainer {font-size: 90%; color: black}`, `.applyBtn { background-color: transparent; border-color: #326613; color: #326613; }`, `.tooltip-inner {text-align:left;}`, `.custom-tooltip-A { --bs-tooltip-bg: #7CC644; --bs-tooltip-color:black; --bs-tooltip-padding-x:0.25rem; --bs-tooltip-padding-y:0; }`, `.custom-tooltip-B { --bs-tooltip-bg: #1C98ED; --bs-tooltip-color:black; --bs-tooltip-padding-x:0.25rem; --bs-tooltip-padding-y:0; }`, `.custom-tooltip-C { --bs-tooltip-bg: #FFD230; --bs-tooltip-color:black; --bs-tooltip-padding-x:0.25rem; --bs-tooltip-padding-y:0; }`, `.custom-tooltip-D { --bs-tooltip-bg: #EE6D23; --bs-tooltip-color:black; --bs-tooltip-padding-x:0.25rem; --bs-tooltip-padding-y:0; }`, `.custom-tooltip-E { --bs-tooltip-bg: #CB1717; --bs-tooltip-color:black; --bs-tooltip-padding-x:0.25rem; --bs-tooltip-padding-y:0; }`, `.custom-tooltip-F { --bs-tooltip-bg: #818289; --bs-tooltip-color:black; --bs-tooltip-padding-x:0.25rem; --bs-tooltip-padding-y:0; }`, `.select2-selection__choice__display { word-wrap: break-word !important; white-space: normal !important; color: black; }`, `.loading-hidden {display: none;} #loading-overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(255, 255, 255, 0.8);z-index: 9999;} .loading-spinner {position: absolute;top: 50%;left: 50%;width: 50px;height: 50px;margin: -25px 0 0 -25px;border: 5px solid #ccc;border-top-color: #333;border-radius: 50%;animation: spin 1s linear infinite;}@keyframes spin {100% { transform: rotate(360deg);}}`, `@font-face {font-family: adelle-sans; src: url(https://use.typekit.net/af/f7d2b8/00000000000000007735a1d6/30/l?subset_id=2&fvd=n3&v=3) format("woff2"), url(https://use.typekit.net/af/f7d2b8/00000000000000007735a1d6/30/d?subset_id=2&fvd=n3&v=3) format("woff"), url(https://use.typekit.net/af/f7d2b8/00000000000000007735a1d6/30/a?subset_id=2&fvd=n3&v=3) format("opentype"); font-weight: 300;font-style: normal;font-stretch: normal;font-display: auto;} body {font-family: adelle-sans;}` ]; styles.forEach(function(styleContent) { var styleEl = document.createElement('style'); styleEl.innerHTML = styleContent; document.head.appendChild(styleEl); }); d.innerHTML='
' + '
' + '
' + '
' + '
' + '
' + '

Benchmarking

' + '

Search by:

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

Company profiles

' + '
' + '' + '
' + '
' + '
' + '
' + '' + '
'+ '
' + '
' + '
' + '
' + '\t'+ '
'+ '
' + '
' + '
' + '' + '
' + '
' + '
' + '
' + '
' + '
' + //'

Disclaimer1111: We provide best estimates for data that has not been disclosed or is deemed to have been under-reported. For more details, visit our FAQs.

' + '
' + '
' layout[0].appendChild(d) } function showLoadingOverlay() { $('#error-box').addClass('d-none'); document.getElementById('loading-overlay').classList.remove('loading-hidden'); } function hideLoadingOverlay() { document.getElementById('loading-overlay').classList.add('loading-hidden'); } function getSelectedOptions() { let filter = $('input[type=radio][name=selector]:checked').val(); let topBy = $('input[type=radio][name=topBy]:checked').val(); let scaleBy = $('input[type=radio][name=scaleBy]:checked').val(); let show = $('input[type=radio][name=show]:checked').val(); let country = $('#country').val(); let company = $('#company').val(); let index = $('#index').val(); let sector = $('#sector').val(); let count = $('#count').val(); let viewType ="v2"; return {filter, topBy, show, country, company, index, sector, count, scaleBy, viewType}; } async function callApi(data) { showLoadingOverlay() const endpoint = "https://blue-ngo.ew.r.appspot.com/data/graph"; try { const response = await fetch(endpoint, { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify(data) }); if (response.ok) { const responseData = await response.json(); if (responseData.code == 200) { unitCreateBubbleChart(data, responseData.data) //unitCreateBubbleChart(data, responseData.data) } else { $('#error-box').removeClass('d-none'); } hideLoadingOverlay() } else { $('#error-box').removeClass('d-none'); console.error(`API call failed with status: ${response.status}`); } } catch (error) { $('#error-box').removeClass('d-none'); console.error("Error during API call:", error); } } async function downLoad(data) { const endpoint = "https://blue-ngo.ew.r.appspot.com/data/download"; try { const response = await fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }); if (response.ok) { const responseData = await response.blob(); const url = window.URL.createObjectURL(responseData); const downloadLink = document.createElement('a'); downloadLink.href = url; downloadLink.download = 'carbonary-data.' +data.format.toLowerCase(); downloadLink.style.display = 'none'; document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); } else { console.error(`API call failed with status: ${response.status}`); } } catch (error) { console.error("Error during API call:", error); } } function logScaleAndNormalize(dataArray, newSizeMin, newSizeMax) { if (dataArray.length === 1) { return [100];} const logDataArray = dataArray.map(value => Math.log10(value.marketCapitalization)); let minValue = Math.min(...logDataArray); if (minValue === -Infinity) { minValue = -1000;} let maxValue = Math.max(...logDataArray); if (maxValue === minValue) { return logDataArray.map(() => newSizeMin);} const normalizedDataArray = logDataArray.map(value => { const normalizedValue = ((value - minValue) / (maxValue - minValue)) * (newSizeMax - newSizeMin) + newSizeMin; return normalizedValue; }); return normalizedDataArray; } function truncateString(inputString) { if (inputString.length <= 10) { return inputString;} else {return inputString.substring(0, 10) + "..";} } function formatCurrencyUSD(value) { const isNegative = value < 0; if (isNegative) { value = -value; } value = Math.round(value); const formatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0, }); const formattedValue = formatter.format(value); return isNegative ? `- ${formattedValue}` : formattedValue; } function createHover(entry) { const hoverTemplate = `Name: ${entry.name}
Country: ${entry.country}
Ticker: ${entry.ticker}
Financial capacity: ${formatCurrencyUSD(entry.incomeBeforeTax)} per ton CO2eq
% Total residual emissions offset: ${toPercentage(entry.progress)}`; return hoverTemplate } function toPercentage(decimal, precision = 0) { const percentage = decimal * 100; const rounded = percentage.toFixed(precision); return `${rounded}%`; } function textPosition() { const directions = ["bottom"]; const randomIndex = Math.floor(Math.random() * directions.length); return directions[randomIndex]; } function determineHeight() { return 150; } bluevizi.initTooltips=function() { const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) /*const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl,{ trigger: 'manual' })) tooltipList.forEach(function (tooltip) { tooltip.show(); });*/ } function createRowElement(code, name, color,tooltip) { // Create new elements let rowDiv = document.createElement('div'); let colDiv1 = document.createElement('div'); let colDiv2 = document.createElement('div'); let chartDiv = document.createElement('div'); rowDiv.className = 'row mb-3 bg-body'; colDiv1.className = 'col-md-1 d-flex justify-content-center align-items-center text-center rounded'; colDiv2.className = 'col-md-11 text-center shadow rounded'; colDiv1.style.backgroundColor = color; colDiv1.style.padding = '5px'; colDiv1.style.borderRadius = '10%'; colDiv1.style.color = 'white'; colDiv1.style.fontSize = '30px'; colDiv1.style.fontWeight = 900; colDiv1.textContent = `${code}`; colDiv1.setAttribute('data-bs-placement', 'right'); colDiv1.setAttribute('data-bs-toggle', 'tooltip'); colDiv1.setAttribute('data-bs-html', 'true'); colDiv1.setAttribute('data-bs-title', tooltip); colDiv1.setAttribute('data-bs-title', tooltip); colDiv1.setAttribute('data-bs-custom-class', `custom-tooltip-${code}`) chartDiv.id = `chart-container-${code}`; colDiv2.appendChild(chartDiv); rowDiv.appendChild(colDiv1); rowDiv.appendChild(colDiv2); return rowDiv; } function createChar(code, index) { let chartDiv = document.createElement('div'); chartDiv.id = `chart-${code}-${index}`; let c =document.getElementById(`chart-container-${code}`) c.appendChild(chartDiv); return chartDiv; } function determineChunkSize() { var width = $('#staticContainer').width(); console.log(window.innerWidth); console.log(width); if (width <=400) { return 3; } else if (width <= 768) { return 5; } else { return 10; } } function chunkArray(array, chunkSize) { let result = []; for (let i = 0; i < array.length; i += chunkSize) { result.push(array.slice(i, i + chunkSize)); } return result; } function build(key,bucket, index) { let names = bucket.map(label => label.name); let trace = { x: names, y: new Array(names.length).fill(0), text: bucket.map((entry) => `${truncateString(entry.name)}`), textposition: bucket.map((entry) => textPosition()), hovertemplate: bucket.map((entry) => createHover(entry)), mode: "markers+text", customdata: bucket.map((entry) => "https://data.carbonary.com/companies/idx/" + entry.name), marker: { size: bucket.map((entry)=> entry.normalizedMarketCap), //logScaleAndNormalize(bucket, 20, 80), color: bucket.map((entry) => convertLetterToColor(entry.classification)), opacity: 0.6, } }; let config = {responsive: true, displaylogo: false, displayModeBar: false} let layout = { hoverlabel: { font: { color: 'black' // Font color for the hover labels } }, height: determineHeight(), autosize: true, usePlotlyDefault: false, plot_bgcolor: 'rgba(0,0,0,0)', margin: { // Adjust the margins to remove extra space l: 0, r: 0, b: 0, t: 0, pad: 0 }, xaxis: { showticklabels: false, showgrid: false, zeroline: false, }, yaxis: { showticklabels: false, showgrid: false, zeroline: false, }, font: { family: 'adelle-sans;', size: 10, color: '#000' }, hovermode: "closest", showlegend: false, dragmode:false }; createChar(key,index) const chartId = `chart-${key}-${index}`; let plotlyChart = document.getElementById(chartId); Plotly.newPlot(plotlyChart, [trace], layout, config); // Add hover event plotlyChart.on('plotly_hover', function(data){ changeCursorStyle(chartId, 'pointer'); }); // Add unhover event plotlyChart.on('plotly_unhover', function(data){ changeCursorStyle(chartId, 'default'); }); // Add click event plotlyChart.on('plotly_click', function(data){ let cnt = data.points.length; for(i=0; i < cnt; i++){ let url = data.points[i].customdata bluevizi.gtag('event', 'click', { 'event_category': 'bubble', 'event_label': data.points[i].text }); window.open(url, '_blank'); } }); } function changeCursorStyle(id, style){ let plotlyChart = $('#' + id + ' .nsewdrag'); if(plotlyChart.length > 0) { plotlyChart.css('cursor', style); } } function unitCreateBubbleChart(payload, postData) { let lb =postData.labels let container =document.getElementById('graphcontainer') for (let key in lb) { if (lb.hasOwnProperty(key)) { let traces = lb[key]; traces.sort((a, b) => a.name.localeCompare(b.name)); if (traces.length > 0){ let tracesBuckets = chunkArray(traces, determineChunkSize()); let rowElement = createRowElement(key, convertLetterToName(key),convertLetterToColor(key),getToolTip(key)) container.appendChild(rowElement) tracesBuckets.forEach((bucket, index) => build(key,bucket,index)) }else { let rowElement = createRowElement(key, convertLetterToName(key),convertLetterToColor(key),getToolTip(key)) container.appendChild(rowElement) } } } bluevizi.initTooltips() } function clearPlot() { document.getElementById('graphcontainer').innerHTML=''; } function getToolTip(letter) { let tooltipContent = { "A": "