const $ = require('jquery');
const Bloodhound = require("typeahead.js/dist/bloodhound.js");
const Typeahead = require("typeahead.js/dist/typeahead.jquery.js");
class Finder {
constructor(section) {
const t = this;
this.serviceUrlBase = "/blueprint/servlet/serviceport/ihkfinder";
this.ihklListUrl = 'services/ihkList.json';//this.serviceUrlBase + "/ihk/all";
this.communitiesUrl = 'services/communities.json';//this.serviceUrlBase + "/community/all";
// berechnen d
// center ist geolocation aus js api
// item die IHK
/*
const p = 0.017453292519943295;
const c = Math.cos;
const a = 0.5 - c((item.lat - center.lat) * p) / 2 + c(center.lat * p) * c(item.lat * p) * (1 - c((item.lng - center.lng) * p)) / 2;
const distance = 12742 * Math.asin(Math.sqrt(a));
*/
$(section).addClass("initialized");
t.section = section;
t.map = section.find('.map');
t.form = section.find('.ihk-finder');
t.charMap = {
'a': /[àáâ]/gi,
'c': /[ç]/gi,
'e': /[èéêë]/gi,
'i': /[ï]/gi,
'o': /[ô]/gi,
'oe': /[œ]/gi,
'u': /[ü]/gi,
's': /[ß]/gi
};
t.loadLocations();
}
loadLocations() {
const t = this;
$('.page-header .toggle-ihk-list').on('click', function (e) {
e.preventDefault();
$('.page-header').toggleClass('nav-open');
});
t.mapBox = {
top: 55.1,
right: 15.2,
bottom: 47.1,
left: 5.8
};
t.indexLetter = "";
t.ihkIndex = $('
').appendTo($('.page-header .ihk-list'));
$.getJSON(this.ihklListUrl, function (response) {
if (response.jsonResponse && response.status === 200) {
t.ihkList = response.jsonResponse.sort((a, b) => {
const countryNameA = a.country.toUpperCase(); // ignore upper and lowercase
const countryNameB = b.country.toUpperCase(); // ignore upper and lowercase
// Sort by country
if (countryNameA < countryNameB) {
return -1;
}
if (countryNameA > countryNameB) {
return 1;
}
const ihkNameA = a.name.toUpperCase(); // ignore upper and lowercase
const ihkNameB = b.name.toUpperCase(); // ignore upper and lowercase
// Sort by name
if (ihkNameA < ihkNameB) {
return -1;
}
if (ihkNameA > ihkNameB) {
return 1;
}
// names must be equal
return 0;
});
$.each(response.jsonResponse, function () {
t.setMarker(this);
t.buildListItem(this);
});
t.initForm();
}
})
}
/*
buildListItem(json) {
const t = this;
const li = $('').appendTo(t.ihkIndex);
//todo urls
// $('').attr('data-ihknr', json.ihknr).text(json.name).attr('href', json.link[0].url).appendTo(li);
$('').attr('data-ihknr', json.ihknr).text(json.name).appendTo(li);
if (t.indexLetter != json.country) {
t.indexLetter = json.country;
li.prepend($('').text(t.indexLetter));
}
}
*/
buildListItem(json) {
const t = this;
//todo urls, API muss noch erweitert
// $('').attr('data-ihknr', json.ihknr).text(json.name).attr('href', json.link[0].url).appendTo(li);
// generiere parent Element, Bundesland
if (t.indexLetter !== json.country) {
const parentLi = $('');
const itemLi = $('');
const ul =$('').appendTo(parentLi);
t.indexLetter = json.country;
const a = $('').attr('data-ihknr', json.ihknr).text(json.name).appendTo(itemLi);
parentLi.addClass("with-index");
parentLi.prepend($('').text(t.indexLetter));
itemLi.appendTo(ul);
parentLi.appendTo(t.ihkIndex);
}
// Generiere einzelne IHKS
else {
const liSecond = $('');
const parentIndex = $(t.ihkIndex).find(".with-index").last().find("ul");
const a = $('').attr('data-ihknr', json.ihknr).text(json.name).appendTo(liSecond);
liSecond.appendTo(parentIndex);
}
}
setMarker(json) {
const t = this;
const marker = $('');
const opener = $('').appendTo(marker);
const tooltip = $('').appendTo(marker);
const contents = $('');
// const name = json.name.replace('Industrie- und Handelskammer', 'IHK');
const name = json.longname;
const closer = $('');
tooltip.append($('').text(name));
tooltip.append(closer);
tooltip.append(contents);
if (name.length > 65) {
tooltip.addClass('extra-long-name');
}
else if (name.length > 40) {
tooltip.addClass('long-name');
}
contents.append($('').html(json.street + '
' + json.zip + ' ' + json.city));
//todo url nachtragen
// contents.append($('').attr('href', json.link[0].url).text('Zu Ihrer IHK'));
contents.append($('').text('Zu Ihrer IHK'));
marker.css({
'left': Math.round((json.geodata.latitude - t.mapBox.left) / (t.mapBox.right - t.mapBox.left) * 10000) / 100 + '%',
'top': Math.round((json.geodata.longitude - t.mapBox.top) / (t.mapBox.bottom - t.mapBox.top) * 10000) / 100 + '%'
});
t.map.append(marker);
opener.on('click', (e) => {
e.preventDefault();
const marker = $(e.currentTarget).closest('.marker');
if (marker.hasClass('open')) {
marker.removeClass('open');
}
else {
this.openMarker(marker);
}
});
closer.on('click', function (e) {
const marker = $(this).closest('.marker').removeClass('open');
t.setMarkerTabindex(marker);
});
marker.find('.btn').on('click', function (e) {
e.preventDefault();
t.navigateTo($(this));
})
}
openMarker(marker) {
marker.addClass('open');
const prevMarker = marker.siblings('.open');
const tooltip = marker.find('.tooltip');
let maxOffset = 280;
if (tooltip.hasClass('long-name')) {
maxOffset = 310;
}
if (tooltip.hasClass('extra-long-name')) {
maxOffset = 340;
}
if (marker.offset().top < maxOffset) {
marker.addClass('sideways');
}
else {
marker.removeClass('sideways');
}
this.setMarkerTabindex(marker);
if (prevMarker.length) {
prevMarker.removeClass('open');
this.setMarkerTabindex(prevMarker);
}
}
initForm() {
const t = this;
$.getJSON(this.communitiesUrl, function (response) {
if (response.jsonResponse && response.status === 200) {
t.communities = response.jsonResponse;
t.initBloodhound(t.communities);
}
t.form.on('submit', function () {
if ($('.tt-cursor').length) {
$('.tt-cursor').trigger('click');
} else if ($('.tt-suggestion').length > 1) {
$('.tt-suggestion').first().trigger('click');
}
return false;
});
});
}
initBloodhound(data) {
const t = this;
$.each(data, function (index, value) {
data[index]['normName'] = t.normalize(data[index].name);
});
data.sort(function (a, b) {
if (a.name < b.name) return -1;
if (a.name > b.name) return 1;
return 0;
});
t.communities = new Bloodhound({
datumTokenizer: function (d) {
var titleTokens = Bloodhound.tokenizers.whitespace(d.normName);
return titleTokens.concat(d.zips)
},
queryTokenizer: function (q) {
var normalized = t.normalize(q);
return Bloodhound.tokenizers.whitespace(normalized);
},
local: data,
limit: 50
});
t.communities.initialize();
var src = {
name: 'communities',
displayKey: 'name',
source: t.communities.ttAdapter(),
templates: {
empty: ['Leider nichts gefunden
'].join('\n'),
suggestion: function (e) {
return ('' + e.name + '' + (e.zips ? e.zips.join(', ') : ' ') + '
');
}
}
}
t.initTypeahead(src);
}
initTypeahead(source) {
const t = this;
const input = t.form.find('input[type="text"]');
input.typeahead({
highlight: true,
ttl_ms: 0
},
source
);
input.bind('typeahead:selected', (e, item, sourceName) => {
const marker = $('.marker#ihk-' + item.ihknr);
this.openMarker(marker);
const prevMarker = marker.siblings('.open').removeClass('open');
marker.siblings().removeClass('hover');
t.setMarkerTabindex(marker);
if (prevMarker.length) {
t.setMarkerTabindex(prevMarker);
}
});
input.bind('typeahead:autocompleted', function (e, item) {
//console.log(item);
})
t.form.on('mouseenter', '.tt-suggestion', function () {
$('.marker#ihk-' + $(this).attr('data-id')).addClass('hover').siblings('hover').removeClass('hover');
})
t.form.on('mouseleave', '.tt-suggestion', function () {
$('.marker#ihk-' + $(this).attr('data-id')).removeClass('hover');
})
t.form.on('keyup', function () {
if (t.form.find('.tt-cursor').length) {
$('.marker#ihk-' + t.form.find('.tt-cursor').attr('data-id')).addClass('hover').siblings('.hover').removeClass('hover');
const openMarker = $('.marker.open').removeClass('open');
if (openMarker.length) {
t.setMarkerTabindex(openMarker);
}
} else {
$('.marker.hover').removeClass('hover');
}
})
}
setMarkerTabindex(marker) {
const t = this;
if (marker.hasClass('open')) {
marker.find('.tooltip a, .tooltip button').removeAttr('tabindex');
marker.find('.btn').focus();
marker.removeClass('hover').siblings('.hover').removeClass('hover');
if (!marker.is(':visible')) {
t.navigateTo(marker.find('.btn'));
}
} else {
marker.find('.tooltip a, .tooltip button').attr('tabindex', '-1');
}
}
navigateTo(link) {
console.log('SET COOKIE: ' + link.attr('data-ihknr'));
window.location = link.attr('href');
}
normalize(str) {
const t = this;
$.each(t.charMap, function (normalized, regex) {
str = str.replace(regex, normalized);
});
return str;
}
}
$(document).ready(function () {
$('.ihk-selection:not(.initialized)').each(function (i) {
new Finder($(this));
});
});