Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

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