if (![].includes) { Array.prototype.includes = function(searchElement /*, fromIndex*/ ) { 'use strict'; var O = Object(this); var len = parseInt(O.length) || 0; if (len === 0) { return false; } var n = parseInt(arguments[1]) || 0; var k; if (n >= 0) { k = n; } else { k = len + n; if (k < 0) {k = 0;} } var currentElement; while (k < len) { currentElement = O[k]; if (searchElement === currentElement || (searchElement !== searchElement && currentElement !== currentElement)) { return true; } k++; } return false; }; } var robecoKeuzehulp = (function(config){ var fondsenData = config.funds; var data = { risc: [], region: [], sustainable: false, dividend: false, types: [], }; var dataLabels = {}; var selection = []; var listeners = { 'count': [], 'url': [], 'label.risc': [], 'label.region': [], 'label.sustainable': [], 'label.dividend': [], 'label.types': [], }; var getLabel = function getLabel(el) { var label = $(el).attr('data-label'); if (label) { return label; } var labelselector = $(el).attr('data-label-selector'); if (labelselector) { var parent = el; var labelparent = $(el).attr('data-label-parent'); if (labelparent) { parent = $(el).closest(labelparent); } return $(labelselector, parent).text(); } return ''; } var intersect = function (arr1, arr2) { return arr1.filter(function(value) {return arr2.includes(value);}); } var contains = function (arr1, value) { return arr1.indexOf(value) !== -1; }; var some = function (arr1, cb) { return arr1.some(cb); } var emit = function (event, data) { if (!listeners[event]) { throw "Event doesn't exists"; } for (var i = 0; i < listeners[event].length; i++) { listeners[event][i](data); } } var updateData = function updateData(key) { switch (key) { case 'risc': data.risc = $(config.answerElements.risc).filter(':checked').map(function(idx,el){return $(el).attr('name');}).toArray(); dataLabels.risc = $(config.answerElements.risc).filter(':checked').map(function(idx,el){return getLabel(el);}).toArray(); break; case 'region': data.region = $(config.answerElements.region).filter(':checked').map(function(idx,el){return $(el).attr('name');}).toArray(); dataLabels.region = $(config.answerElements.region).filter(':checked').map(function(idx,el){return getLabel(el);}).toArray(); break; case 'sustainable': data.sustainable = $(config.answerElements.sustainable).filter(':checked').val() === '1'; dataLabels.sustainable = getLabel($(config.answerElements.sustainable).filter(':checked')); break; case 'dividend': data.dividend = $(config.answerElements.dividend).filter(':checked').val() === '1'; dataLabels.dividend = getLabel($(config.answerElements.dividend).filter(':checked')); break; case 'types': data.types = $(config.answerElements.types).filter(':checked').map(function(idx,el){return $(el).attr('name');}).toArray(); dataLabels.types = $(config.answerElements.types).filter(':checked').map(function(idx,el){return getLabel(el);}).toArray(); break; } emit('label.' + key, dataLabels[key]); } var calculate = function calculate() { selection = []; var particularities = []; if (data.sustainable) { particularities.push(2); } if (data.dividend) { particularities.push(0); } if (data.types && contains(data.types, 'example')) { particularities.push(3); } for (var i = 0; i < fondsenData.funds.length; i++) { var fund = fondsenData.funds[i]; if (contains(particularities, 3)) { if (contains(fund.particularities, 3)) { selection.push(fund); } continue; } if (data.region && data.region.length) { var requiredRegions = data.region.map(function(r) { return { worldwide : 0, usa : 1, asiapacific: 2, europe : 3, emerging : 4 }[r]; }); if (!some(fund.regions, function(r) {return contains(requiredRegions, r);})) { continue; } } if (data.types && intersect(data.types, ['stock', 'obligations', 'mix']).length) { var requiredTypes = data.types.map(function(r) { return { stock : 0, obligations: 1, mix : 2, }[r]; }); if (!contains(requiredTypes, fund.type)) { continue; } } if (data.risc && data.risc.length) { var requiredRiscs = data.risc.map(function(r) { return { low : [1,2,3], medium : [4,5], high : [6,7] }[r]; }); if (!some(requiredRiscs, function(r) {return contains(r, fund.performanceRiskRating);})) { continue; } } if (particularities.length) { if (!some(fund.particularities, function(el) {return contains(particularities, el);})) { continue; } } selection.push(fund); } var url = 'https://www.robeco.nl/zelf-beleggen/fondsen/?sort=risk&dir=desc'; var urlParams = {}; var particularities = []; if (data.types && contains(data.types, 'example')) { particularities.push(3); } else { if (data.risc) { var ratings; switch (data.risc) { case 'low': urlParams.performanceRiskRating = '1,2,3'; break; case 'medium': urlParams.performanceRiskRating = '4,5'; break; case 'high': urlParams.performanceRiskRating = '6,7'; break; } } if (data.risc && data.risc.length) { urlParams.performanceRiskRating = []; if (contains(data.risc, 'low')) { urlParams.performanceRiskRating.push(1); urlParams.performanceRiskRating.push(2); urlParams.performanceRiskRating.push(3); } if (contains(data.risc, 'medium')) { urlParams.performanceRiskRating.push(4); urlParams.performanceRiskRating.push(5); } if (contains(data.risc, 'high')) { urlParams.performanceRiskRating.push(6); urlParams.performanceRiskRating.push(7); } urlParams.performanceRiskRating = urlParams.performanceRiskRating.join(','); } if (data.region && data.region.length) { urlParams.regions = []; if (contains(data.region, 'worldwide')) urlParams.regions.push(0); if (contains(data.region, 'usa')) urlParams.regions.push(1); if (contains(data.region, 'asiapacific')) urlParams.regions.push(2); if (contains(data.region, 'europe')) urlParams.regions.push(3); if (contains(data.region, 'emerging')) urlParams.regions.push(4); urlParams.regions = urlParams.regions.join(','); } if (data.sustainable) { particularities.push(2); } if (data.dividend) { particularities.push(0); } if (data.types && intersect(data.types, ['stock', 'obligations', 'mix']).length) { urlParams.types = []; if (contains(data.types, 'stock')) urlParams.types.push(0); if (contains(data.types, 'obligations')) urlParams.types.push(1); if (contains(data.types, 'mix')) urlParams.types.push(2); urlParams.types = urlParams.types.join(','); } } if (particularities.length) { urlParams.particularities = particularities.join(','); } for (var param in urlParams) { url += '&' + param + '=' + urlParams[param]; } emit('count', selection.length); emit('url', url); } var addListener = function addListener(event, callback) { if (!listeners[event]) { throw "Event doesn't exists"; } listeners[event].push(callback); } var keys = ['risc', 'sustainable', 'region', 'dividend', 'types']; var currentVal = {}; for (var i in keys) { console.log(keys[i]); if (config.answerElements[keys[i]]) for (var j = 0; j < config.answerElements[keys[i]].length; j++) { if ($(config.answerElements[keys[i]][j]).attr('type') === 'radio') { $(config.answerElements[keys[i]][j]).click((function(key){ return function(e) { console.log('click', $(this).prop('checked')); // console.log('click', $(this).prop('is-checked')); if (currentVal[key] == $(this).val()) { $(this).prop('checked', false); currentVal[key] = null; updateData(key); calculate(); } }; })(keys[i])); } $(config.answerElements[keys[i]][j]).change((function(key){ return function(){ updateData(key); currentVal[key] = $(this).val(); if ($(this).is(':checked')) { config.measure({ event_name: 'klik-antwoord', //event31 event_action: 'keuzehulp', event_label: (dataLabels[key] instanceof Array ? dataLabels[key] : [dataLabels[key]] ).join(';').toLowerCase(), theme: { risc: 'rendement en risico', sustainable: 'duurzaam', region: 'regio', dividend: 'dividend', types: 'type beleggingen' }[key] }); } calculate(); } })(keys[i])); } } $('[data-measure]').click(function() { if ($(this).attr('data-measure') == 'cta') { config.measure({ event_name: 'campaign-cta', event_action: 'keuzehulp', event_label: $(this).attr('data-measure-label'), marketingcampaign: 'keuzehulp', available_funds: selection.length.toString() }); } else { config.measure({ event_name: 'klik-' + $(this).attr('data-measure'), event_action: 'keuzehulp', event_label: $(this).attr('data-measure-label') }); } }); return { calculate: calculate, listen: addListener } });