Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

553 rindas
22 KiB

  1. document.addEventListener("DOMContentLoaded", function () {
  2. let groupSelectElement = document.getElementById("election-group"),
  3. areaSelectElement = document.getElementById("election-area"),
  4. formContainer = document.querySelector(".election-form--form");
  5. // STEP 1: LOAD SEARCH ITEMS
  6. // Load all groups and areas
  7. if (formContainer) {
  8. fetch("https://ihk-wahl.info/selects?ihk_id=M6uOiDGzTD7SlhF1")
  9. .then(response => {
  10. if (!response.ok) {
  11. throw new Error('Network response was not ok');
  12. }
  13. return response.json();
  14. })
  15. .then(data => {
  16. // Fill in groups
  17. // Remove old entries
  18. while (groupSelectElement.firstChild) {
  19. groupSelectElement.removeChild(groupSelectElement.firstChild);
  20. }
  21. // Sort groups alphabetically by name
  22. let sortedGroups = data.groups.slice().sort(function (a, b) {
  23. return a.number.localeCompare(b.number);
  24. });
  25. // Populate with sorted options
  26. let groupsOptionElement = document.createElement("option");
  27. groupsOptionElement.value = "-";
  28. groupsOptionElement.textContent = "Wahlgruppe (Alle)";
  29. groupsOptionElement.setAttribute("data-number", "");
  30. groupsOptionElement.setAttribute("data-title", "Alle");
  31. groupSelectElement.appendChild(groupsOptionElement);
  32. sortedGroups.forEach(function (group) {
  33. let groupsOptionElement = document.createElement("option");
  34. groupsOptionElement.value = group.id;
  35. groupsOptionElement.textContent = group.number + " " + group.title;
  36. groupsOptionElement.setAttribute("data-number", group.number);
  37. groupsOptionElement.setAttribute("data-title", group.title);
  38. groupSelectElement.appendChild(groupsOptionElement);
  39. });
  40. // Fill in areas
  41. // Remove old entries
  42. while (areaSelectElement.firstChild) {
  43. areaSelectElement.removeChild(areaSelectElement.firstChild);
  44. }
  45. // Sort groups alphabetically by name
  46. let sortedAreas = data.districts.slice().sort(function (a, b) {
  47. return a.number.localeCompare(b.number);
  48. });
  49. // Populate with sorted options
  50. let areasOptionElement = document.createElement("option");
  51. areasOptionElement.value = "-";
  52. areasOptionElement.textContent = "Wahlbezirk (Alle)";
  53. areasOptionElement.setAttribute("data-number", "");
  54. areasOptionElement.setAttribute("data-title", "Alle");
  55. areaSelectElement.appendChild(areasOptionElement);
  56. sortedAreas.forEach(function (district) {
  57. let areasOptionElement = document.createElement("option");
  58. areasOptionElement.value = district.id;
  59. areasOptionElement.textContent = district.number + " " + district.title;
  60. areasOptionElement.setAttribute("data-number", district.number);
  61. areasOptionElement.setAttribute("data-title", district.title);
  62. areaSelectElement.appendChild(areasOptionElement);
  63. });
  64. })
  65. .catch(error => {
  66. // Handle errors here
  67. console.error('Fetch error:', error);
  68. });
  69. // STEP 2: CLICK SEARCH
  70. // Click on search
  71. const hiddenInput = document.createElement('input');
  72. hiddenInput.type = 'hidden';
  73. hiddenInput.name = 'ihk_id';
  74. hiddenInput.value = 'M6uOiDGzTD7SlhF1';
  75. formContainer.appendChild(hiddenInput);
  76. formContainer.onsubmit = function (e) {
  77. e.preventDefault();
  78. submitForm(e);
  79. };
  80. let selectElements = formContainer.querySelectorAll("select");
  81. selectElements.forEach(select => {
  82. select.addEventListener("change", function (e) {
  83. submitForm();
  84. });
  85. });
  86. document.addEventListener("click", function (event) {
  87. // click one of the search again links
  88. if (event.target && (event.target.getAttribute("data-search") === "group" || event.target.getAttribute("data-search") === "area")) {
  89. let id = event.target.getAttribute("data-id");
  90. document.getElementById("election-searchstring").value = "";
  91. if (event.target.getAttribute("data-search") === "group") {
  92. document.getElementById("election-group").value = id;
  93. document.getElementById("election-area").value = "-";
  94. } else if (event.target.getAttribute("data-search") === "area") {
  95. document.getElementById("election-group").value = "-";
  96. document.getElementById("election-area").value = id;
  97. }
  98. submitForm();
  99. }
  100. // click the detail page link
  101. const topBoxElement = event.target.closest(".top-box");
  102. if (topBoxElement) {
  103. let ihkId = topBoxElement.getAttribute("data-ihk_id"),
  104. candidate = topBoxElement.getAttribute("data-c");
  105. showDetailPage(event, ihkId, candidate);
  106. }
  107. // click the back button
  108. if (event.target.closest(".election-detail--back a")) {
  109. event.preventDefault();
  110. hideDetailPage();
  111. }
  112. });
  113. }
  114. // STEP 3 NEW: SET LINK AND LOAD DETAIL PAGE
  115. });
  116. function submitForm(e) {
  117. let formData,
  118. groupSelectElement = document.getElementById("election-group"),
  119. areaSelectElement = document.getElementById("election-area"),
  120. xhr = new XMLHttpRequest();
  121. if(e) {
  122. formData = new FormData(e.target);
  123. } else {
  124. formData = new FormData(document.querySelector(".election-form--form"));
  125. }
  126. xhr.open("POST", "https://ihk-wahl.info/search", true);
  127. xhr.onreadystatechange = function() {
  128. if (xhr.readyState === XMLHttpRequest.DONE) {
  129. if (xhr.status === 200) {
  130. console.log("Form data sent successfully!");
  131. let data = JSON.parse(xhr.responseText); // Assuming the backend sends JSON response
  132. // Add badge with result (group and area)
  133. let badgeGroupsAreas = document.querySelector(".election-result-list--header-left"),
  134. selectedGroupOption = groupSelectElement.options[groupSelectElement.selectedIndex],
  135. groupNumber = selectedGroupOption.getAttribute("data-number"),
  136. groupTitle = selectedGroupOption.getAttribute("data-title"),
  137. selectedAreaOption = areaSelectElement.options[areaSelectElement.selectedIndex],
  138. areaNumber = selectedAreaOption.getAttribute("data-number"),
  139. areaTitle = selectedAreaOption.getAttribute("data-title"),
  140. searchContent = document.getElementById("election-searchstring");
  141. let badgeHtml = "";
  142. badgeHtml += (groupNumber !== "" || groupTitle !== "") && (groupTitle !== "Alle") ? `
  143. <div class="election-result-list-badge inverted closable" data-name="group">
  144. <div class="badge-inner">
  145. <p>Wahlgruppe ${groupNumber}: <span>${groupTitle}</span></p>
  146. </div>
  147. </div>
  148. ` : '';
  149. badgeHtml += (areaNumber !== "" || areaTitle !== "") && (areaTitle !== "Alle") ? `
  150. <div class="election-result-list-badge inverted closable" data-name="area">
  151. <div class="badge-inner">
  152. <p>Wahlbezirk ${areaNumber}: <span>${areaTitle}</span></p>
  153. </div>
  154. </div>
  155. ` : '';
  156. badgeHtml += searchContent.value !== "" ? `
  157. <div class="election-result-list-badge inverted closable" data-name="searchstring">
  158. <div class="badge-inner">
  159. <p>Suchbegriff: <span>${searchContent.value}</span></p>
  160. </div>
  161. </div>
  162. ` : '';
  163. badgeGroupsAreas.innerHTML = badgeHtml;
  164. let badgeElements = badgeGroupsAreas.querySelectorAll(".election-result-list-badge");
  165. badgeElements.forEach(badgeElement => {
  166. badgeElement.addEventListener("click", badgeClick);
  167. });
  168. // Add badge with index of results
  169. let badgeResultsContainer = document.querySelector(".election-result-list--header"),
  170. badgeResults = null,
  171. resultsIndex = "";
  172. // Iterate through the direct children of headerElement
  173. for (let i = 0; i < badgeResultsContainer.children.length; i++) {
  174. let child = badgeResultsContainer.children[i];
  175. if (child.classList.contains("election-result-list-badge")) {
  176. badgeResults = child;
  177. break;
  178. }
  179. }
  180. resultsIndex = data.res.length;
  181. // Insert Badge with resultsIndex
  182. badgeResults.innerHTML = `
  183. <div class="badge-inner">
  184. <p>${resultsIndex}<span>Kanditat:innen</span></p>
  185. </div>
  186. `;
  187. // Add candidates to list
  188. let candidatesContainer = document.querySelector(".election-result-list--inner");
  189. candidatesContainer.innerHTML = "";
  190. // Sort groups alphabetically by name
  191. let sortedCandidates = data.res.slice().sort(function (a, b) {
  192. return a.last_name.localeCompare(b.last_name);
  193. });
  194. sortedCandidates.forEach(function (candidate) {
  195. let html = `
  196. <div class="election-result-list-item">
  197. <span class="top-box" data-ihk_id="${data.ihk_id}" data-c="${candidate.candidate_id}">
  198. <div class="image-box">
  199. <img src="${candidate.img_path}" loading="lazy" class="loading" width="310" height="310">
  200. </div>
  201. <h3>${candidate.first_name} ${candidate.last_name}</h3>
  202. </span>
  203. <div class="text-box">
  204. <div class="job-box">
  205. <span class="icon-small-election-group" data-search="group" data-id="${candidate.candidate_election_group_id}">${candidate.candidate_election_group_name}</span>
  206. </div>
  207. <div class="city-box">
  208. <span class="icon-small-icon-election-location" data-search="area" data-id="${candidate.candidate_election_district_id}">${candidate.candidate_election_district_name}</span>
  209. </div>
  210. </div>
  211. </div>
  212. `;
  213. candidatesContainer.innerHTML += html;
  214. });
  215. } else {
  216. console.error("Error sending form data.");
  217. }
  218. }
  219. };
  220. xhr.send(formData);
  221. }
  222. // Return phone number to call
  223. function formatNumberLink(phoneNo) {
  224. const phoneNoStripped = phoneNo.replace(/\D/g, '');
  225. if (phoneNoStripped !== "") {
  226. let formatedNo = phoneNoStripped;
  227. if (phoneNoStripped.startsWith('49')) {
  228. // has leading 49 - countrycode
  229. formatedNo = `00${phoneNoStripped}`;
  230. } else if (phoneNoStripped.startsWith('0')) {
  231. if (phoneNoStripped.startsWith('000')) {
  232. // has three leading zeros - countrycode with error?
  233. formatedNo = phoneNoStripped.substr(1);
  234. } else if (phoneNoStripped.startsWith('00')) {
  235. // has two leading zeros - countrycode
  236. // Do nothing
  237. } else {
  238. // has leading zero
  239. formatedNo = `0049${phoneNoStripped.substr(1)}`;
  240. }
  241. }
  242. return formatedNo;
  243. }
  244. return phoneNo;
  245. }
  246. // Return phone number to show on website
  247. function formatNumberOutput(phoneNo) {
  248. const allowedChars = /[0-9\-\/\s]/g;
  249. if (phoneNo.match(allowedChars) !== null) {
  250. const phoneNoStripped = phoneNo.match(allowedChars).join('');
  251. let formatedNo = phoneNoStripped;
  252. if (phoneNoStripped.startsWith('49')) {
  253. // has leading 49 - countrycode
  254. formatedNo = `+${phoneNoStripped}`;
  255. } else if (phoneNoStripped.startsWith('0')) {
  256. if (phoneNoStripped.startsWith('000')) {
  257. // has three leading zeros - countrycode with error?
  258. formatedNo = `+${phoneNoStripped.substr(3)}`;
  259. } else if (phoneNoStripped.startsWith('00')) {
  260. // has two leading zeros - countrycode
  261. formatedNo = `+${phoneNoStripped.substr(2, 2)} ${phoneNoStripped.substr(4)}`;
  262. } else {
  263. // has leading zero
  264. formatedNo = `+49 ${phoneNoStripped.substr(1)}`;
  265. }
  266. }
  267. // Überprüfe, ob nach "+49" ein Leerzeichen folgt, falls nicht, füge es hinzu
  268. if (formatedNo.startsWith('+49') && !formatedNo.includes(' ', 3)) {
  269. formatedNo = `${formatedNo.slice(0, 3)} ${formatedNo.slice(3)}`;
  270. }
  271. return formatedNo;
  272. }
  273. return phoneNo;
  274. }
  275. // STEP 2B: CLICK BADGE (RELOAD SEARCH)
  276. function badgeClick(e) {
  277. const clickedBadge = e.target.closest(".election-result-list-badge"),
  278. dataName = clickedBadge.getAttribute("data-name");
  279. if (dataName === "group") {
  280. let groupSelectElement = document.getElementById("election-group");
  281. groupSelectElement.value = "-";
  282. } else if (dataName === "area") {
  283. let areaSelectElement = document.getElementById("election-area");
  284. areaSelectElement.value = "-";
  285. } else if (dataName === "searchstring") {
  286. let searchElement = document.getElementById("election-searchstring");
  287. searchElement.value = "";
  288. }
  289. submitForm();
  290. }
  291. // STEP 3: LOAD DETAIL PAGE
  292. function showDetailPage(e, ihkIdValue, cValue) {
  293. let electionDetail = document.querySelector(".election-detail"),
  294. electionDetailText = electionDetail.querySelector('.election-detail--text'),
  295. electionDetailVideo = electionDetail.querySelector('.election-detail--video'),
  296. electionDetailInfo = electionDetail.querySelector('.election-detail--info'),
  297. htmlText = '',
  298. htmlVideo = '',
  299. htmlInfo = '',
  300. staticElectionOverviewElement = document.getElementById("static-election-overview"),
  301. staticElectionDetailElement = document.getElementById("static-election-detail");
  302. fetch("https://ihk-wahl.info/candidate?ihk_id=" + ihkIdValue + "&candidate=" + cValue)
  303. .then(response => {
  304. if (!response.ok) {
  305. throw new Error('Network response was not ok');
  306. }
  307. return response.json();
  308. })
  309. .then(data => {
  310. console.log(data);
  311. // Build the detail page for the candidate
  312. htmlText += data.img_path ? `
  313. <img src="${data.img_path}" loading="lazy" class="loading" width="545" height="526">
  314. ` : '';
  315. htmlText += '<div class="text-box">';
  316. htmlText += (data.first_name && data.last_name) ? `
  317. <h1>${data.first_name} ${data.last_name}</h1>
  318. ` : '';
  319. htmlText += data.position ? `
  320. <p class="subheadline">${data.position}</p>
  321. ` : '';
  322. htmlText += data.election_statement ? `
  323. <h2>Was möchten Sie bewegen?</h2>
  324. <p>${data.election_statement}</p>
  325. ` : '';
  326. if (data.twitter_link || data.facebook_link || data.xing_link ||
  327. data.whatsapp_link || data.linkedin_link || data.threema_link ||
  328. data.telegram_link) {
  329. htmlText += `
  330. <div class="social-media">
  331. <p>Meine Kanäle</p>
  332. <ul class="social-icons">
  333. `;
  334. }
  335. htmlText += data.twitter_link ? `
  336. <li><a class="social-share twitter" href="${data.twitter_link}"></a></li>
  337. ` : '';
  338. htmlText += data.facebook_link ? `
  339. <li><a class="social-share facebook" href="${data.facebook_link}"></a></li>
  340. ` : '';
  341. htmlText += data.xing_link ? `
  342. <li><a class="social-share xing" href="${data.xing_link}"></a></li>
  343. ` : '';
  344. htmlText += data.whatsapp_link ? `
  345. <li><a class="social-share whatsapp" href="${data.whatsapp_link}"></a></li>
  346. ` : '';
  347. htmlText += data.linkedin_link ? `
  348. <li><a class="social-share linkedin" href="${data.linkedin_link}"></a></li>
  349. ` : '';
  350. htmlText += data.threema_link ? `
  351. <li><a class="social-share threema" href="${data.threema_link}"></a></li>
  352. ` : '';
  353. htmlText += data.telegram_link ? `
  354. <li><a class="social-share telegram" href="${data.telegram_link}"></a></li>
  355. ` : '';
  356. if (data.twitter_link || data.facebook_link || data.xing_link ||
  357. data.whatsapp_link || data.linkedin_link || data.threema_link ||
  358. data.telegram_link) {
  359. htmlText += `
  360. </ul>
  361. </div>
  362. `;
  363. }
  364. htmlText += '</div>';
  365. electionDetailText.innerHTML = htmlText;
  366. htmlVideo += data.video_path ? `
  367. <div className="video-container">
  368. <figure className="video">
  369. <div className="video-box">
  370. ` : '';
  371. if (data.video_path && data.video_img_path) {
  372. htmlVideo += `
  373. <video src="${data.video_path}" controls="" poster="${data.video_img_path}"></video>
  374. `;
  375. } else if (data.video_path) {
  376. htmlVideo += `
  377. <video src="${data.video_path}" controls=""></video>
  378. `;
  379. }
  380. htmlVideo += data.video_path ? `
  381. </div>
  382. </figure>
  383. </div>
  384. ` : '';
  385. electionDetailVideo.innerHTML = htmlVideo;
  386. htmlInfo += (data.candidate_election_group_id && data.candidate_election_group_name) ? `
  387. <div class="info-box info-box-01">
  388. <p class="info-headline">Wahlgruppe 02</p>
  389. <p class="info-box--content info-box--text">
  390. <a href="${data.candidate_election_group_id}">${data.candidate_election_group_name}</a>
  391. </p>
  392. </div>
  393. ` : '';
  394. htmlInfo += (data.candidate_election_district_id && data.candidate_election_district_name) ? `
  395. <div class="info-box info-box-02">
  396. <p class="info-headline">Wahlbezirk 05</p>
  397. <p class="info-box--content info-box--text">
  398. <a href="${data.candidate_election_district_id}">${data.candidate_election_district_name}</a>
  399. </p>
  400. </div>
  401. ` : '';
  402. htmlInfo += '<div class="info-box info-box-03">';
  403. htmlInfo += data.company ? `
  404. <p class="info-headline">Unternehmen</p>
  405. <div class="info-box--content">
  406. <p class="headline">${data.company}</p>
  407. ` : '';
  408. htmlInfo += data.company_address ? `
  409. <p className="address">${data.company_address}</p>
  410. ` : '';
  411. htmlInfo += data.website ? `
  412. <p>
  413. <a href="${data.website}" target="_blank">Unternehmenswebseite</a>
  414. </p>
  415. ` : '';
  416. htmlInfo += data.email ? `
  417. <p>
  418. <a href="mailto:${data.email}">E-Mail</a>
  419. </p>
  420. ` : '';
  421. if (data.phone) {
  422. htmlInfo += `
  423. <p>
  424. <a href="tel:${formatNumberLink(data.phone)}">${formatNumberOutput(data.phone)}</a>
  425. </p>
  426. `;
  427. console.log(data);
  428. }
  429. if (data.phone2) {
  430. htmlInfo += `
  431. <p>
  432. <a href="tel:${formatNumberLink(data.phone2)}">${formatNumberOutput(data.phone2)}</a>
  433. </p>
  434. `;
  435. }
  436. htmlInfo += data.company ? `
  437. </div>
  438. ` : '';
  439. htmlInfo += '</div>';
  440. electionDetailInfo.innerHTML = htmlInfo;
  441. staticElectionOverviewElement.style.display = "none";
  442. staticElectionDetailElement.style.display = "block";
  443. if (staticElectionDetailElement) {
  444. staticElectionDetailElement.scrollIntoView({
  445. behavior: "smooth",
  446. block: "start",
  447. });
  448. }
  449. })
  450. .catch(error => {
  451. // Handle errors here
  452. console.error('Fetch error:', error);
  453. });
  454. }
  455. function hideDetailPage(e) {
  456. let staticElectionOverviewElement = document.getElementById("static-election-overview"),
  457. staticElectionDetailElement = document.getElementById("static-election-detail");
  458. staticElectionOverviewElement.style.display = "block";
  459. staticElectionDetailElement.style.display = "none";
  460. if (staticElectionOverviewElement) {
  461. staticElectionOverviewElement.scrollIntoView({
  462. behavior: "smooth",
  463. block: "start",
  464. });
  465. }
  466. }