1<!DOCTYPE html> 2<html dir='ltr' lang='en'> 3<head> 4 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 8 <meta name="robots" content="index,follow" /> 9 <meta name="language" content="en" /> 10 <meta name="author" content="Querfeld's Wiener Kaffeehaus GesmbH" /> 11 <meta name="publisher" content="Querfeld's Wiener Kaffeehaus GesmbH" /> 12 <meta name="company" content="Querfeld's Wiener Kaffeehaus GesmbH" /> 13 <meta name="page-topic" content="Gutscheine Querfeld's Wiener Kaffeehaus" /> 14 <meta name="reply-to" content="" /> 15 <meta name="distribution" content="global" /> 16 <meta name="revisit-after" content="5" /> 17<link rel="apple-touch-icon" sizes="57x57" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-57x57.png"> 18<link rel="apple-touch-icon" sizes="60x60" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-60x60.png"> 19<link rel="apple-touch-icon" sizes="72x72" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-72x72.png"> 20<link rel="apple-touch-icon" sizes="76x76" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-76x76.png"> 21<link rel="apple-touch-icon" sizes="114x114" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-114x114.png"> 22<link rel="apple-touch-icon" sizes="120x120" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-120x120.png"> 23<link rel="apple-touch-icon" sizes="144x144" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-144x144.png"> 24<link rel="apple-touch-icon" sizes="152x152" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-152x152.png"> 25<link rel="apple-touch-icon" sizes="180x180" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/apple-icon-180x180.png"> 26<link rel="icon" type="image/png" sizes="16x16" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/favicon-16x16.png"> 27<link rel="icon" type="image/png" sizes="32x32" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/favicon-32x32.png"> 28<link rel="icon" type="image/png" sizes="96x96" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/favicon-96x96.png"> 29<link rel="icon" type="image/png" sizes="192x192" href="https://gutscheine.cafe-wien.at/templates/qwk/favicon/android-icon-192x192.png"> 30<meta name="msapplication-TitleImage" content="https://gutscheine.cafe-wien.at/templates/qwk/favicon/ms-icon-144x144.png"> 31<link rel="alternate" hreflang="de" href="https://gutscheine.cafe-wien.at/" /> 32<link rel="alternate" hreflang="en" href="https://gutscheine.cafe-wien.at/en" /> 33<link rel="alternate" hreflang="x-default" href="https://gutscheine.cafe-wien.at/en" /> 34 <meta name="description" content="Schenken Sie Ihren Liebsten unvergessliche Genussmomente mit unseren exklusiven Gutscheinen. Ob für einen gemütlichen Brunch oder einen schnellen Kaffee zum Mitnehmen â bei uns finden Sie das perfekte Geschenk für jeden Anlass. Bestellen Sie jetzt online und lassen Sie sich von unserem schnellen und zuverlässigen Service begeistern. Besuchen Sie uns noch heute und erleben Sie die Magie des Kaffeegenusses in unseren Kaffeehäusern!" /> 35 <meta name="keywords" content="Gutscheine Gutscheinpakete Gutscheine Schenken Freude Urlaub Kaffee Geschenk Wien" /> 36 <title>Gutscheine Querfeld's Wiener Kaffeehaus</title> 37 <link rel="canonical" href="https://gutscheine.cafe-wien.at/en" /> 38 39<!-- icon template -->
40<script type="text/html" id="manage-consent-template"> 41 <svg width="40" height="40" version="1.1" viewBox="0 0 23.138 27.429" xmlns="http://www.w3.org/2000/svg"> 42 <g transform="translate(.24982 .72053)" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8521"> 43 <path d="m11.479 17.811c0.69344 3.9193 3.6964 7.0479 6.5726 7.2872"/> 44 <path d="m12.771 25.774c-10.207-8.2456 0.09164-17.214 1.9773-8.0642 1.5655 7.8623 8.9959 1.0835 6.208-4.4861-7.0193-13.782-25.331-3.8717-16.481 12.134"/> 45 <path d="m8.0864 25.566c-8.8039-10.91 5.8265-23.049 10.189-8.5278"/> 46 <path d="m21.953 8.9673c-7.2914-8.3059-16.657-6.975-21.271 1.964"/> 47 <path d="m20.404 3.6563c-7.5124-5.3367-13.285-4.0659-19.069 0.95229"/> 48 </g> 49 </svg> 50</script>
vendor: 1 bytes, line 50
50
51<script type="text/css" id="klaro-css-override"> 52/* 53 * Custom CSS override for Klaro ConsentManager 54 */ 55 56/* overlay transparent background */ 57.klaro .cookie-modal .cm-bg { 58 background-color: rgba(0,0,0,0.5); 59} 60 61/* modal */ 62.klaro .cookie-modal .cm-modal.cm-klaro, .klaro .cookie-notice:not(.cookie-modal-notice) { 63 background-color: rgb(255, 255, 255); 64} 65 66/* keywords */ 67.klaro .cookie-notice strong { 68 color: rgb(153, 123, 46); 69} 70 71/* heading */ 72.klaro .cookie-modal h1 { 73 color: rgb(153, 123, 46); 74} 75 76/* text color */ 77.klaro .cookie-modal p, .klaro .cookie-modal strong, .klaro .cookie-modal h1, .klaro .cookie-modal h2, .klaro .cookie-modal ul, .klaro .cookie-modal li, .klaro .cookie-notice p, .klaro .cookie-notice strong, .klaro .cookie-notice h1, .klaro .cookie-notice h2, .klaro .cookie-notice ul, .klaro .cookie-notice li { 78 color: rgb(56, 56, 56); 79} 80 81/* text color dark */ 82.klaro .cookie-modal .cm-list-description, .klaro .cookie-notice .cm-list-description { 83 color: rgb(56, 56, 56); 84} 85 86/* header (general description) */ 87.klaro .cookie-modal .cm-modal .cm-header { 88 border-bottom: 1px solid rgb(56, 56, 56); 89} 90 91/* footer (save-buttons) */ 92.klaro .cookie-modal .cm-modal .cm-footer { 93 border-top: 1px solid rgb(56, 56, 56); 94} 95 96/* link color */ 97.klaro .cookie-modal a, .klaro .cookie-notice a { 98 color: rgb(80, 80, 80); 99} 100 101/* toggle input */ 102.klaro .cookie-modal .cm-list-label .slider, .klaro .cookie-notice .cm-list-label .slider { 103 background-color: rgb(56, 56, 56); 104} 105 106/* input checked */ 107.klaro .cookie-modal .cm-list-input:checked+.cm-list-label .slider, .klaro .cookie-notice .cm-list-input:checked+.cm-list-label .slider { 108 background-color: rgb(153, 123, 46); 109} 110 111/* input locked */ 112.klaro .cookie-modal .cm-list-input.required:checked+.cm-list-label .slider, .klaro .cookie-notice .cm-list-input.required:checked+.cm-list-label .slider { 113 background-color: rgb(153, 123, 46); 114} 115 116/* input half locked */ 117 .klaro .cookie-modal .cm-list-input.only-required+.cm-list-label .slider, .klaro .cookie-notice .cm-list-input.only-required+.cm-list-label .slider 118, .klaro .cookie-modal .cm-list-input.half-checked:checked+.cm-list-label .slider, .klaro .cookie-notice .cm-list-input.half-checked:checked+.cm-list-label .slider { 119 background-color: rgb(153, 123, 46); 120} 121 122/*close button*/ 123.klaro .cookie-modal .cm-modal .hide svg { 124 stroke: rgb(153, 123, 46); 125} 126 127/* button */ 128.klaro .cookie-modal .cm-btn, .klaro .cookie-notice .cm-btn { 129 background-color: rgb(56, 56, 56); 130 color: #ffffff; 131} 132 133/* button success */ 134.klaro .cookie-modal .cm-btn.cm-btn-info, .klaro .cookie-notice .cm-btn.cm-btn-info 135, .klaro .cookie-modal .cm-btn.cm-btn-success, .klaro .cookie-notice .cm-btn.cm-btn-success 136{ 137 background-color: rgb(153, 123, 46); 138 color: #ffffff; 139} 140 141/* fingerprint icon */ 142#klaro-edit-btn { 143 stroke: #2B3435; 144 stroke: rgb(80, 80, 80); 145} 146 147/* position fix for purpose item list */ 148#klaro label, #klaro div.label { 149 position: unset !important; 150} 151 152.klaro .cookie-modal .cm-btn, .klaro .cookie-notice .cm-btn { 153 padding: 0.6em; 154} 155 156.klaro #id-cookie-title { 157 font-size: 20px; 158} 159 160</script>
vendor: 1 bytes, line 160
160
161<script type="text/javascript"> 162 163!function (w, d) { 164 165 let configWithCallback = {"acceptAll":true,"mustConsent":null,"showNoticeTitle":true,"services":[{"name":"Session","default":null,"purposes":["functional"],"cookies":[["\/^XTCsid\\d*$\/"],["\/^XTCsid\\d*$\/","\/",".cafe-wien.at"],["\/^XTCsid\\d*$\/","\/","cafe-wien.at"],["\/^XTCsid\\d*$\/","\/","gutscheine.cafe-wien.at"]],"required":true},{"name":"Warenkorb","default":null,"purposes":["functional"],"cookies":[["cart_id"],["cart_id","\/",".cafe-wien.at"],["cart_id","\/","cafe-wien.at"],["cart_id","\/","gutscheine.cafe-wien.at"]],"required":true},{"name":"Land","default":null,"purposes":["functional"],"cookies":[["inc_visitor_country_iso2"],["inc_visitor_country_iso2","\/",".cafe-wien.at"],["inc_visitor_country_iso2","\/","cafe-wien.at"],["inc_visitor_country_iso2","\/","gutscheine.cafe-wien.at"]],"required":true},{"name":"Referenz URL","default":null,"purposes":["functional"],"cookies":[["referrer_url"],["referrer_url","\/",".cafe-wien.at"],["referrer_url","\/","cafe-wien.at"],["referrer_url","\/","gutscheine.cafe-wien.at"]],"required":true},{"name":"Safari Drittanbieter Cookie Check","default":null,"purposes":["functional"],"cookies":[["safari_third_cookie"],["safari_third_cookie","\/",".cafe-wien.at"],["safari_third_cookie","\/","cafe-wien.at"],["safari_third_cookie","\/","gutscheine.cafe-wien.at"]],"required":true},{"name":"FacebookPixel","default":null,"purposes":["marketing"],"cookies":[["^_fbp"],["^_fbp","\/",".cafe-wien.at"],["^_fbp","\/","cafe-wien.at"],["^_fbp","\/","gutscheine.cafe-wien.at"]],"required":false}],"translations":{"de":{"Session":{"title":"Session","description":""},"Warenkorb":{"title":"Warenkorb","description":""},"Land":{"title":"Land","description":""},"Referenz URL":{"title":"Referenz URL","description":""},"Safari Drittanbieter Cookie Check":{"title":"Safari Drittanbieter Cookie Check","description":""},"FacebookPixel":{"title":"FacebookPixel","description":""},"purposes":{"advertisement":{"title":"Anzeigen","description":"Diese Dienste verarbeiten pers\u00f6nliche Daten, um Ihnen personalisierte oder interessenbezogene Werbung zu zeigen."},"functional":{"title":"Essenziell","description":"Essenzielle Cookies erm\u00f6glichen grundlegende Funktionen und sind f\u00fcr die einwandfreie Funktion der Website erforderlich."},"marketing":{"title":"Marketing","description":"Marketing Cookies werden von Drittanbietern oder Publishern verwendet, um personalisierte Werbung anzuzeigen. Sie tun dies, indem sie Besucher \u00fcber Websites hinweg verfolgen."},"performance":{"title":"Optimierung der Leistung","description":"Diese Dienste verarbeiten personenbezogene Daten, um den von dieser Website angebotenen Service zu optimieren."}},"consentModal":{"title":"Wir sch\u00e4tzen Ihre Privatsph\u00e4re","description":"Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\r\nHier k\u00f6nnen Sie verschiedene auf dieser Website verwendete Tags \/ Tracker \/ Analyse-Tools ausw\u00e4hlen und deaktivieren."},"consentNotice":{"description":"Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.","learnMore":"Erweiterte Einstellungen "}},"en":{"Session":{"title":"Session","description":""},"Warenkorb":{"title":"Shopping Cart","description":""},"Land":{"title":"Country","description":""},"Referenz URL":{"title":"referrer url","description":""},"Safari Drittanbieter Cookie Check":{"title":"safari third party check","description":""},"FacebookPixel":{"title":"FacebookPixel","description":""},"purposes":{"advertisement":{"title":"Advertisements","description":"These services process personal information to sho"},"functional":{"title":"Essential","description":"Essential cookies enable fundamental functionaliti"},"marketing":{"title":"Marketing","description":"Marketing cookies are used by third parties or pub"},"performance":{"title":"Performance Optimization","description":"The
165se services process personal information to opt"}},"consentModal":{"title":"We value your privacy","description":"We use cookies on our website. Some of them are essential, while others help us to improve this website and your experience.\r\nHere you can choose or deactivate different tags \/ tracker \/ analytic-tools used on this website."},"consentNotice":{"description":"We use cookies on our website. Some of them are essential, while others help us to improve this website and your experience.","learnMore":"advanced settings "}},"it":{"Session":{"title":"Session","description":""},"Warenkorb":{"title":"carrello della spesa","description":""},"Land":{"title":"nazione","description":""},"Referenz URL":{"title":"URL di riferimento","description":""},"Safari Drittanbieter Cookie Check":{"title":"cookie di terze parti safari","description":""},"consentNotice":{"learnMore":"impostazioni avanzate "}},"fr":{"Session":{"title":"Session","description":""},"Warenkorb":{"title":"Panier","description":""},"Land":{"title":"Pays","description":""},"Referenz URL":{"title":"URL de r\u00e9f\u00e9rence","description":""}
165,"Safari Drittanbieter Cookie Check":{"title":"cookie tiers safari","description":""},"consentNotice":{"learnMore":"r\u00e9glages avanc\u00e9s "}},"sl":{"Warenkorb":{"title":"Ko\u0161arica","description":""},"Land":{"title":"Dr\u017eava","description":""},"Referenz URL":{"title":"Napotitveni URL","description":""},"Safari Drittanbieter Cookie Check":{"title":"Safari preverjanje tretje osebe","description":""},"consentModal":{"privacyPolicy":{"text":" "}},"app":{"required":{"title":"obvezno"},"purpose":"Namen"},"purposeItem":{"app":"Namen","apps":"Nameni"},"decline":"Zavrni","ok":"V redu","acceptSelected":"Sprejmi izbrano","acceptAll":"Sprejmi vse","poweredBy":"Klaro!"},"hr":{"Warenkorb":{"title":"Ko\u0161arica","description":""},"Land":{"title":"Dr\u017eava","description":""},"Referenz URL":{"title":"Referentni URL","description":""},"Safari Drittanbieter Cookie Check":{"title":"Safari provjera tre\u0107e strane","description":""},"consentNotice":{"learnMore":"Saznajte vi\u0161e "},"purposeItem":{"app":"Svrha","apps":"Svrhe"},"acceptSelected":"Prihvati odabrano","acceptAll":"Prihvati sve"}}}; 166 for (let a of configWithCallback.services) { 167 a.callback = function (s, o) { 168 //callback for specific service 169 } 170 } 171 172 configWithCallback.callback = function (s, o) { 173 //callback for every service 174 if (0) { 175 window.dataLayer = window.dataLayer || [] 176 dataLayer.push({event: "consentManagerChange", service_name: o.name, service_value: s}); 177 } 178 } 179 180 var 181 // script element 182 klaroScript = d.createElement("SCRIPT") 183 184 // Klaro source - current version: 0.7.22 185 , klaroSrc = "https://gutscheine.cafe-wien.at/includes/javascript/klaro/klaro.js" 186 187 // load indicator 188 , klaroLoaded = false 189 190 , klaroCssOverride = d.querySelector("#klaro-css-override") 191 192 // main function 193 , callback = function () { 194 var consentConfig = (configWithCallback); 195 var i, x, cookies, rgx, editBtn, style; 196 197 window.consentConfig = consentConfig; 198 199 // turn cookie regex strings to actual regex 200 for(i = 0; i < consentConfig.services.length; i++) { 201 cookies = consentConfig.services[i].cookies; 202 for(x = 0; x < cookies.length; x++) { 203 204 if(cookies[x][0].match(/^\/?\^|\$$/)) { 205 rgx = new RegExp(cookies[x][0].replace(/^\/|\/$/g, "")); 206 consentConfig.services[i].cookies[x][0] = rgx; 207 } 208 } 209 } 210 211 // append klaroManager to global scope 212 window.klaroManager = klaro.getManager(consentConfig); 213 214 // dynamically append style element after Klaro was loaded 215 // to make sure styles are overridden 216 style = d.createElement("STYLE"); 217 style.innerHTML = klaroCssOverride.innerHTML; 218 d.head.appendChild(style); 219 220 // note: after confirmation, Kalro can't be displayed as notice 221 if(!klaroManager.confirmed) { 222 klaro.show(consentConfig); 223 } 224 225 // add edit button (fingerprint icon) 226 editBtn = d.createElement("a"); 227 editBtn.href = "#"; 228 editBtn.title = "edit cookies "; 229 editBtn.innerHTML = d.querySelector("#manage-consent-template").innerHTML; 230 editBtn.id = "klaro-edit-btn"; 231 editBtn.style = "position:fixed; bottom:20px; right:20px; font-size:10px;"; 232 editBtn.addEventListener("click", function(event) { 233 event.preventDefault(); 234 klaro.show(consentConfig); 235 return false; 236 }); 237 d.body.appendChild(editBtn); 238 } 239 240 241 // load trigger for main function 242 , loadCallback = function() { 243 // check if Klaro was loaded and document is ready 244 if(klaroLoaded === false || ["interactive", "complete"].indexOf(d.readyState) === -1) { 245 return; 246 } 247 248 callback(); 249 250 d.removeEventListener("readystatechange", loadCallback); 251 klaroScript.removeEventListener("load", loadCallback); 252 } 253 254 ; 255 256 257 d.addEventListener("readystatechange", loadCallback); 258 259 // append script element to load Klaro.js 260 klaroScript.src = klaroSrc;
261 klaroScript.addEventListener("load", function() { 262 klaroLoaded = true; 263 loadCallback(); 264 }); 265 d.head.appendChild(klaroScript); 266 267 loadCallback(); 268} (window, document); 269 270</script>
270 271<!-- Google Tag Manager -->
272<script>
vendor: 341 bytes, lines 272-276
272 273 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'}); 274 var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:''; 275 j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); }) 276 (window,document,'script','dataLayer','
276GTM-KRB2DS3
vendor: 4 bytes, line 276
276');
277</script>
vendor: 68 bytes, lines 277-278
277 278<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
278GTM-KRB2DS3
vendor: 83 bytes, line 278
278" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
279<!-- End Google Tag Manager -->
280<script> 281 function waitForGTM(callback) { 282 const timeout = 5000; 283 const start = Date.now(); 284 (function isLoaded() { 285 if (checkGTMs()) { 286 callback(); 287 } else if (Date.now() - start < timeout) { 288 setTimeout(isLoaded, 50); 289 } else { 290 console.log('GTM not loaded in time'); 291 } 292 })(); 293 294 function checkGTMs() { 295 296 297 298 if (!window.google_tag_manager) { 299 return false; 300 } 301 302 303 if (!window.google_tag_manager['GTM-KRB2DS3']) { 304 return false; 305 } 306 307 308 return true; 309 } 310 } 311</script>
311 312 313
314<script data-type="text/javascript" data-name="FacebookPixel" type="text/plain">
vendor: 439 bytes, lines 314-320
314 315 !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? 316 n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; 317 n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; 318 t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, 319 document,'script','https://connect.facebook.net/en_US/fbevents.js'); 320 fbq('init', '
320586203133161955
vendor: 39 bytes, lines 320-322
320'); 321 322 fbq('track', 'PageView');
323</script>
323 324 325<!-- Copyright (c) 2000-2020 etracker GmbH. All rights reserved. --> 326<!-- This material may not be reproduced, displayed, modified or distributed --> 327<!-- without the express prior written permission of the copyright holder. --> 328<!-- etracker tracklet 5.0 -->
329<script> 330 331 var et_seg1 = "qwk"; 332 var et_seg2 = "ecom"; 333</script>
vendor: 1 bytes, line 333
333
334<script id="_etLoader" data-block-cookies="true" data-respect-dnt="true" data-secure-code="OXELj9" src="//code.etracker.com/code/e.js" async></script>
334 335<!-- etracker tracklet 5.0 end --> 336 337 <base href="https://gutscheine.cafe-wien.at/" /> 338 339 <link rel="stylesheet" type="text/css" href="templates/qwk/t1/stylesheet.css?v=2157"/> 340 341
341<script> 342 343// init CookieHandler in global namespace 344var CookieHandler; 345 346 347!function (w, d) { 348 349 "use strict"; 350 351 352 /** {Object} */ 353 var COOKIE_SUPPORT = {"device":null,"version":"","isSafari":false,"isMobile":false,"browser":null,"sameSiteSupport":true,"isFbAppBrowser":false}, 354 355 356 /** 357 * 358 * @param v 359 * @returns {boolean} 360 * @private 361 */ 362 _bool = function (v) { 363 if(typeof v === "string" && v.toUpperCase() === "FALSE") { 364 return false; 365 } 366 return !!v; 367 } 368 /** 369 * 370 * @param v 371 * @returns {boolean} 372 * @private 373 */ 374 , _defined = function (v) { 375 return typeof v !== "undefined"; 376 } 377 ; 378 379 /** 380 * 381 * @type {{get: CookieHandler.get, set: CookieHandler.set, remove: CookieHandler.remove}} 382 */ 383 CookieHandler = { 384 /** 385 * get all cookies or cookie value by name 386 * @param name {string} 387 * @returns {*} 388 */ 389 get : function (name) { 390 var cookies = document.cookie.split(/\s*;\s*/) // array with cookie strings (name=value) 391 , i // iterator number 392 , t // temporary array containing name and value ([name, value]) 393 , r = {} // result object 394 ; 395 for(i = 0; i < cookies.length; i++) { 396 t = cookies[i].split("="); 397 t[0] = decodeURIComponent(t[0]); 398 t[1] = decodeURIComponent(t[1]); 399 r[t[0]] = t[1]; 400 if(name && t[0] === name) { 401 return t[1]; 402 } 403 } 404 return r; 405 }, 406 /** 407 * sets cookie and adds default flags if not given 408 * @param name {string} 409 * @param value {string} 410 * @param s {object} 411 * object containing the settings i.e. 412 * { 413 * path : "/", 414 * domain : "example.com", 415 * expires : 86400, // seconds till expiration date (will be converted to date string) 416 * SameSite: "none", 417 * secure : true 418 * } 419 * @returns {string|boolean} 420 */ 421 set : function (name, value, s) { 422 var parts, 423 i, 424 cookieStr, 425 remove = false; 426 427 // prepare value and name 428 // .get() will always return a string 429 value = value.toString(); 430 name = name.toString(); 431 s = s || {}; 432 433 parts = [encodeURIComponent(name) + "=" + encodeURIComponent(value)]; 434 435 if(!_defined(s.SameSite) && document.location.protocol === 'https:') { 436 // Safari turns any SameSite flag into strict => solution: do not add it 437 if(COOKIE_SUPPORT.sameSiteSupport === true) { 438 s.SameSite = "none"; 439 } 440 if(!_defined(s.secure)) { 441 s.secure = true; 442 } 443 } 444 445 for(i in s) { 446 switch(i) { 447 case "expires": 448 if(s[i] < 0) { 449 remove = true; 450 } 451 s[i] = (new Date(Date.now()+(s[i] * 1000))).toGMTString(); 452 break; 453 case "secure": 454 if(_bool(s[i])) { 455 s[i] = ""; 456 } else { 457 delete s[i]; 458 } 459 break; 460 case "path": 461 case "domain": 462 case "SameSite": 463 default: 464 break; 465 } 466 if(_defined(s[i])) { 467 parts.push(i + (s[i] ? "=" + s[i] : "")); 468 } 469 } 470 cookieStr = parts.join("; "); 471 document.cookie = cookieStr; 472 473 if(remove === false && this.get(name) !== value) { 474 console.error("Cookiehandler.set() failed to set cookie with string \"" + cookieStr + "\""); 475 return false;
476 } 477 478 console.info("CookieHandler.set() set cookie with string %c\"" + cookieStr + "\"", "color: #50B000; text-decoration: underline;"); 479 return cookieStr; 480 }, 481 /** 482 * remove cookie by name (sets expiration date 1 minute in the past) 483 * @param name 484 * @returns {*} 485 */ 486 remove : function (name) { 487 return this.set(name, "", {expires : -60}); 488 }, 489 490 /** 491 * prints help to console 492 */ 493 help : function () { 494 var nl = "\n", 495 tb = "\t", 496 lines = [ 497 "CookieHandler.get([name]) {...}" 498 , tb + "Returns cookie value by name." 499 , tb + "Returns object with key => values if no name given." 500 , "" 501 , "CookieHandler.set(name, value[, s]) {...}" 502 , tb + "Sets the cookie with name and value." 503 , tb + "The third parameter s(ettings) is optional." 504 , tb + "Returns false on error." 505 , tb + "Some settings may be applied by default (SameSite=none; secure)" 506 , tb + "example:" 507 , tb + "{" 508 , tb + " path : \"/\"," 509 , tb + " domain : \"example.com\"," 510 , tb + " expires : 86400, // seconds till expiration date (will be converted to date string)" 511 , tb + " SameSite: \"none\"," 512 , tb + " secure : true" 513 , tb + "}" 514 , "" 515 , "CookieHandler.remove(name) {...}" 516 , tb + "Removes cookie by setting its expiration date 1 minute into the past." 517 , "" 518 , "CookieHandler.help() {...}" 519 , tb + "Prints help to console." 520 ]; 521 522 console.info("%c" + lines.join(nl), "color: #888888;"); 523 } 524 }; 525 526 527} (window, document); 528 </script>
528 529 530
530<script> 531 var selected; 532 var submitter = null; 533 534 function submitFunction() { 535 submitter = 1; 536 } 537 function popupWindow(url) { 538 window.open(url,'popupWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150') 539 } 540 541 function selectRowEffect(object, buttonSelect) { 542 if (!selected) { 543 if (document.getElementById) { 544 selected = document.getElementById('defaultSelected'); 545 } else { 546 selected = document.all['defaultSelected']; 547 } 548 } 549 550 if (selected) selected.className = 'moduleRow'; 551 object.className = 'moduleRowSelected'; 552 selected = object; 553 } 554 555 function rowOverEffect(object) { 556 if (object.className == 'moduleRow') object.className = 'moduleRowOver'; 557 } 558 559 function rowOutEffect(object) { 560 if (object.className == 'moduleRowOver') object.className = 'moduleRow'; 561 } 562 563 564 // Für Checkout Prozess 565 566 function selectRowEffectCheckoutP(object, buttonSelect) { 567 568 if (selected) selected.className = 'moduleRowCheckout'; 569 object.className = 'moduleRowSelectedCheckout'; 570 selected = object; 571 572 } 573 574 function selectRowEffectCheckout(object, buttonSelect) { 575 576 if (!selected) { 577 if (document.getElementById) { 578 selected = document.getElementById('defaultSelected'); 579 } else { 580 selected = document.all['defaultSelected']; 581 } 582 } 583 584 if (selected) { 585 selected.className = 'moduleRowCheckout'; 586 var oldPayment = $(selected).find(":radio").attr("value"); 587 if(selected !== object) { 588 $("#subDiv_"+oldPayment).slideUp(function() { 589 crossDomainIframeResize(false); 590 }); 591 } 592 } 593 object.className = 'moduleRowSelectedCheckout'; 594 selected = object; 595 596 $(object).find(":radio").attr("checked", "checked"); 597 var payment = $(object).find(":radio").attr("value"); 598 $("#subDiv_"+payment).slideDown(function() { 599 crossDomainIframeResize(false); 600 }); 601 602 //remove subselection 603 if (typeof subSelected !== "undefined" && subSelected) { 604 subSelected.className = 'moduleSubRowCheckout'; 605 } 606 } 607 608 function rowOverEffectCheckout(object) { 609 if (object.className == 'moduleRowCheckout') object.className = 'moduleRowOverCheckout'; 610 } 611 612 function rowOutEffectCheckout(object) { 613 if (object.className == 'moduleRowOverCheckout') object.className = 'moduleRowCheckout'; 614 } 615 616 // ENDE 617 618 // Für Checkout Prozess im Administrationsbereich (ROX) 619 620 function selectRowEffectCheckoutROX(object, buttonSelect) { 621 if (!selected) { 622 if (document.getElementById) { 623 selected = document.getElementById('defaultSelected'); 624 } else { 625 selected = document.all['defaultSelected']; 626 } 627 } 628 629 if (selected) 630 selected.className = 'moduleRowCheckout_rox'; 631 object.className = 'moduleRowSelectedCheckout_rox'; 632 selected = object; 633 634 } 635 636 function rowOverEffectCheckoutROX(object) { 637 if (object.className == 'moduleRowCheckout_rox') object.className = 'moduleRowOverCheckout_rox'; 638 } 639 640 function rowOutEffectCheckoutROX(object) { 641 if (object.className == 'moduleRowOverCheckout_rox') object.className = 'moduleRowCheckout_rox'; 642 } 643 644 // ENDE 645 646 function optimizeSizeSelectbox() 647 { 648 var inputSize = $(":text").eq(-1).outerWidth(); 649 var webbrowser = jQuery.browser; 650 var sizeEdit = 0; 651 chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; 652 653 if(inputSize > 20) 654 { 655 $("select").css("width", inputSize + sizeEdit); 656 } 657 } 658 // ENDE 659 660 function popupImageWindow(url) { 661 window.open(url,'popupImageWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150') 662 } 663 </script>
663 664
664<script> 665 if (top === self && "" != ''){ 666 function iCheckWebsiteRedirect() 667 { 668 window.location = ""; 669 } 670 671 if(typeof jQuery == "undefined" || false === false) 672 { 673 iCheckWebsiteRedirect(); 674 } 675 else 676 { 677 jQuery.ajax({ 678 url: "logoff.php?action=ajax", 679 success: function() { 680 iCheckWebsiteRedirect(); 681 }, 682 error: function() { 683 iCheckWebsiteRedirect(); 684 }, 685 async: false 686 }); 687 } 688 } 689 </script>
689 690
691<script type="text/javascript" src="./templates/qwk/t1/javascript/libs/jquery/jquery.js"></script>
vendor: 1 bytes, line 691
691
692<script type="text/javascript" src="./templates/qwk/t1/javascript/libs/jquery-ui/jquery-ui.js"></script>
692 693
694<script type="text/javascript" > 695 696 function strpos (haystack, needle, offset) { 697 // Finds position of first occurrence of a string within another 698 var i = (haystack+'').indexOf(needle, (offset ? offset : 0)); 699 return i === -1 ? false : i; 700 } 701 702 var prevHeight = 0, alreadyJumped = false; 703 function crossDomainIframeResize(jumpToNavtrailAnchor, jumpOffset) { 704 705 var iframe = document.getElementById( 'inneriframe' ); 706 707 if (typeof jumpOffset == "undefined") jumpOffset = 0; 708 709 // webkit browsers (safari,chrome) provide wrong scrollHeight so get only offsetHeight ### 10_215 ### 710 711 var height = $("#navtrail_anchor").height(); 712 //var height = document.body.offsetHeight; 713 if (height != prevHeight || jumpToNavtrailAnchor) { 714 prevHeight = height; 715 716 if(height == 0) { 717 height = 1800; 718 } 719 720 if (window.parent != window) { 721 try { 722 if(window.parent.updateIFrame) 723 window.parent.updateIFrame(height,''); 724 725 } catch (e) { 726 //console.warn("not embedded in start.php"); 727 } 728 729 try { 730 731 var navtrailJumpOffset 732 = parseInt(window.getComputedStyle(document.getElementById("navtrail_anchor")).marginTop) 733 + jumpOffset; 734 735 if (typeof console !== "undefined") { 736 console.warn("ResizeIframe url is not configured. Fallback to postMessge-API."); 737 if (!alreadyJumped || jumpToNavtrailAnchor) { 738 window.top.postMessage(["Inc.updateIFrame", height, true, navtrailJumpOffset], "*"); 739 alreadyJumped = true; 740 } else { 741 window.top.postMessage(["Inc.updateIFrame", height], "*"); 742 } 743 } 744 } catch (e) { 745 console.error(e); 746 } 747 } else { 748 $("body").addClass("standalone"); 749 } 750 } 751 } 752 753 $().ready(function() { 754 crossDomainIframeResize(true); 755 }); 756 757 $(window).on("load", function() { 758 setTimeout(function() {crossDomainIframeResize(true) }, 300); 759 crossDomainIframeResize(true); 760 $(window).resize(function() { 761 if (crossDomainResizeHandler) clearTimeout(crossDomainResizeHandler); 762 crossDomainResizeHandler = setTimeout(function() {crossDomainIframeResize(false) }, 300); 763 }); 764 }); 765 766</script>
766 767<!-- xtc_get_shop_analytics_code -->
767<script> 768 // Input Replacement 769 function textReplacement(input){ 770 var originalvalue = input.val(); 771 input.focus( function(){ 772 if( $.trim(input.val()) == originalvalue ){ input.val(''); } 773 }); 774 input.blur( function(){ 775 if( $.trim(input.val()) == '' ){ input.val(originalvalue); } 776 }); 777 } 778 779 // FIX SAFARI THIRD PARTY COOKIE PROBLEM 780 if (window.top != window) { // wenn in iframe 781 if (navigator.userAgent.indexOf("Safari") >= 0 && navigator.userAgent.indexOf("Chrome") == -1) { // und der Browser ist safari 782 783 var safariCookieFirstPartySaved = false; 784 785 var safariPopupFunc = function (event) { 786 var target; 787 if (document.cookie.indexOf("safari_third_cookie=1") == -1 && (!localStorage || (localStorage && localStorage.getItem("safari_third_cookie") !== "1"))) { // only ONCE 788 789 // find target of click event 790 target = event.target || event.srcElement; 791 if(target.nodeType === 3) { 792 target = target.parentNode; 793 } 794 795 CookieHandler.set("safari_third_cookie", "1"); 796 try { 797 localStorage.setItem("safari_third_cookie", "1"); 798 } catch(e) { 799 console.log("localStorage could not be written"); 800 } 801 802 if (!safariCookieFirstPartySaved) { 803 var safariCookieUrl = "https://gutscheine.cafe-wien.at/safari_third_party.php"; 804 var safariPopup = window.open(safariCookieUrl); 805 if (safariPopup) { 806 safariPopup.blur(); 807 window.focus(); 808 } else { 809 if (console) console.log("Safari Third Party Fix probably blocked by popup blocker."); 810 } 811 safariCookieFirstPartySaved = true; 812 } 813 814 // check for file input and 815 // use preventDefault to stop file dialog in Safari 816 if(target && target.nodeName === 'INPUT' && target.type === 'file') { 817 event.preventDefault(); 818 return false; 819 } 820 } 821 window.removeEventListener('click', safariPopupFunc); 822 }; 823 824 window.addEventListener('click', safariPopupFunc); 825 // $(window).one('click', safariPopupFunc); 826 827 } 828 } 829 </script>
829 830
831<script> 832 document.addEventListener("DOMContentLoaded", function() { 833 var html = '<div class="cookie-msg">' + 834 'This website uses cookies to improve the user experience and to provide users with specific services and features. ' + 835 '<a href="https://gutscheine.cafe-wien.at/en/data-protection" target="_blank" rel="noopener" class="cookie-details">Show details</a> ' + 836 '<div class="button">' + 837 '<a id="cookie-btn" class="buttonLink">OK</a>' + 838 '</div>' + 839 '</div>'; 840 var div = document.createElement("div"); 841 div.innerHTML = html; 842 div.id = "cookie-bar"; 843 div.style.display = 'none'; 844 845 if (localStorage && localStorage.getItem("cookiesallowed") !== "1") { 846 div.style.display = 'block'; 847 } 848 document.body.appendChild(div); 849 document.getElementById("cookie-btn").addEventListener("click", function() { 850 if (localStorage) { 851 localStorage.setItem("cookiesallowed", "1"); 852 div.style.display = 'none'; 853 } 854 }); 855 }); 856</script>
856 857<style> 858 #cookie-bar { 859 z-index: 1000; 860 position: fixed; 861 bottom: 0; 862 left: 0; 863 right: 0; 864 background:white; 865 } 866 .cookie-msg { 867 padding:1em; 868 text-align: center; 869 } 870 .cookie-msg .button, .cookie-msg .button .buttonLink { 871 display: inline-block; 872 vertical-align: middle; 873 } 874</style> 875 876
877<script type="text/javascript"> 878 !function(w, d) { 879 880 "use strict"; 881 882 /** 883 * @type Array 884 */ 885 var localStorageWhitelist = []; 886 887 /** 888 * 889 * @param name 890 * @param whitelist 891 * @param getResult 892 * @returns {boolean} 893 */ 894 var whitelistCheck = function (name, whitelist, getResult) { 895 if(whitelist.indexOf(name) === -1) { 896 if(getResult) { 897 return false; 898 } 899 throw "\"" + name + "\" not whitelisted! whitelist: " + whitelist.join(", "); 900 } 901 return true; 902 }; 903 904 /** 905 * 906 * @type {} 907 * object containing functions that can be called from outside 908 */ 909 var Inc = { 910 911 setLocalStorage : function (name, value) { 912 whitelistCheck(name, localStorageWhitelist); 913 localStorage.setItem(name, value); 914 } 915 , removeLocalStorage : function (name) { 916 whitelistCheck(name, localStorageWhitelist); 917 localStorage.removeItem(name); 918 } 919 920 921 , consentManager : { 922 /** 923 * accept/reject single service and it's cookies 924 * @param name 925 * @param value 926 */ 927 set : function (name, value) { 928 if(typeof klaroManager === "undefined") return console.error("klaroManager undefined!"); 929 klaroManager.updateConsent(name, !!value); 930 klaroManager.saveAndApplyConsents(); 931 } 932 933 /** 934 * reset service to default 935 * @param name 936 */ 937 , reset : function (name) { 938 if(typeof klaroManager === "undefined") return console.error("klaroManager undefined!"); 939 if(name) { 940 this.set(klaroManager.getDefaultConsent(name)); 941 return; 942 } 943 klaroManager.resetConsents(); 944 klaroManager.saveAndApplyConsents(); 945 } 946 947 /** 948 * accept/reject all services and their cookies that match given purpose 949 * @param purpose 950 * @param value 951 */ 952 , setByPurpose : function (purpose, value) { 953 if(typeof klaroManager === "undefined") return console.error("klaroManager undefined!"); 954 var services = klaroManager.config.services, i; 955 for(i = 0; i < services.length; i++) { 956 if(services[i].purposes.indexOf(purpose) !== -1) { 957 this.set(services[i].name, value); 958 } 959 } 960 klaroManager.saveAndApplyConsents(); 961 } 962 963 /** 964 * accept/reject all services and their cookies that are optional 965 * @param value 966 */ 967 , setByOptional : function ( value ) { 968 if(typeof klaroManager === "undefined") return console.error("klaroManager undefined!"); 969 var services = klaroManager.config.services, i; 970 for(i = 0; i < services.length; i++) { 971 if(services[i].required === false) { 972 this.set(services[i].name, value); 973 } 974 } 975 klaroManager.saveAndApplyConsents(); 976 977 } 978 979 /** 980 * alias for this.setByOptional() 981 * @param value 982 * @returns {void | undefined} 983 */ 984 , setAll : function ( value ) { 985 return this.setByOptional ( value ); 986 } 987 } 988 989 }; 990 991 w.incTest = Inc; 992 993 // listen for postMessage event 994 w.addEventListener("message", function (event) { 995 996 var funcName, args, rawName, returnValue, funcArr, tempFunc, i; 997 998 // check data-type 999 switch(({}).toString.call(event.data).replace(/^\[\w+ |\]$/g,"").toUpperCase()) { 1000 // array 1001 case "ARRAY": 1002 args = event.data; 1003 rawName = args.shift(); 1004 funcName = rawName.replace(/^inc(ert)?\./i, ""); 1005 funcArr = funcName.split("."); 1006 1007 // check if function name is prefixed with Inc. or Incert. 1008 if(funcName === rawName) { 1009 return; 1010 } 1011 1012 tempFunc = Inc; 1013 1014 // search in IncertClass instance 1015 for( i = 0; i < funcArr.length; i++) { 1016 if(!tempFunc[funcArr[i]]) { 1017 break; 1018 } 1019 if(i === (funcArr.length -1)) { 1020 // apply args to function with appropriate context 1021 returnValue = tempFunc[funcArr[i]].apply(tempFunc, args); 1022 console.info("\"" + rawName + "\" called successfully!; arguments:", args, "; returnValue:", returnValue); 1023 return; 1024 } 1025 tempFunc = tempFunc[funcArr[i]]; 1026 } 1027 1028 throw "\"" + rawName + "\" is not defined"; 1029 1030 break; 1031 default: 1032 break; 1033 } 1034 }); 1035 } (window, document); 1036</script>
1036 1037 1038</head> 1039<body class="body" onload="crossDomainIframeResize();"> 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
1061<script> 1062 var oneColumnWindowWidth = parseInt("600") || 400, 1063 twoColumnWindowWidth = parseInt("1200") || 640, 1064 respDropSidebarWindowWidth = parseInt("800") || 800, 1065 voucherSliderItemMargin = ((parseInt("20") || 20) / 2), 1066 listingSpecialCountdownFormat = "" | "%DT %Hh %Mm %Ss"; 1067 1068 //Thumbs Voucher Slider Settings (see slick-init.js) 1069 var voucherSliderShowArrows = ("" == "1") || false, 1070 voucherSliderShowDots = ("1" == "1") || false, 1071 voucherSliderCenterMode = ("" == "1") || false, 1072 vSliderMinItems = parseInt("1") || 1, 1073 vSliderMaxItems = parseInt("2") || 3, 1074 cSliderMinItems = parseInt("1") || 1, 1075 cSliderMaxItems = parseInt("3") || 1, 1076 voucherSliderItemsToShowMobile = parseInt("3") || 1, 1077 voucherSliderItemsToShowTablet = parseInt("5") || 3, 1078 voucherSliderItemsToShowDesktop = parseInt("5") || 5; 1079 1080 var currentCurrencySymbol = "\u20ac"; 1081</script>
1081 1082 1083
1084<script> 1085 const subShopId = -1; 1086</script>
1086 1087
1088<script type="text/javascript" 1089 src="./templates/qwk/t1/javascript/live.min.js?v=2157"></script>
1089 1090 1091<div class="body-inc " id="navtrail_anchor"> 1092 <!--Header --> 1093 <header class="inc-header sticky"> 1094 <a href="#inc-body" class="sr-only">to main</a> 1095 <div class="inc-header-inner"> 1096 1097 1098<div class="box-header"> 1099 <a href="https://gutscheine.cafe-wien.at/en" class="header-logo" > 1100 <img src="templates/qwk/images/exp_logo.png" alt="home" /> 1101 </a> 1102 <a class="customer-website" href="https://www.cafe-wien.at/" target="_blank"> <span class="icon-sphere" aria-hidden="true"></span> 1103 <span class="website-url hidden-xs" >to the website</span> 1104 </a> 1105 </div> 1106 1107 <div class="inc-navigation-container "> 1108 1109 1110 1111 1112<ul class="inc-page-navigation" role="navigation" id="inc-page-navigation-container"> 1113 <li> 1114 <a href="https://www.cafe-wien.at/de/die-cafes/standorte.html"> 1115 Our cafes & restaurants 1116 </a> 1117 </li> 1118 <li class="language-switch-burger hidden-navi-sm-md-lg"> 1119 1120<div class="language-switch"> 1121 <div class="language-switch-shortcode"> 1122 <a href="https://gutscheine.cafe-wien.at/" aria-label="Deutsch" class="language-item "> 1123 <span class="language-item-shortcode">de</span> 1124 </a> 1125 <a href="https://gutscheine.cafe-wien.at/en" aria-label="Englisch" class="language-item selected"> 1126 <span class="language-item-shortcode">en</span> 1127 </a> 1128 </div> 1129 </div> 1130 1131
1132<script> 1133 $(".language-toggle-active-element").on('click', function(event){ 1134 event.stopImmediatePropagation(); 1135 $(this).parent().toggleClass('opened'); 1136 }); 1137</script>
1137 1138 1139 </li> 1140 </ul> 1141
1142<script> 1143 let id = 0; 1144 let currentId = 0; 1145</script>
1145 1146 1147 1148 1149 <ul class="inc-shop-navi"> 1150 <li class="inc-nav-item"> 1151 <a class="inc-nav-link inc-nav-value-check-page" href="https://gutscheine.cafe-wien.at/en/value-check" title="Value check" aria-label="Value check"> 1152 <i class="im icon-card" aria-hidden="true"></i> 1153 <span class="inc-nav-link-caption">Value check</span> 1154 </a> 1155 </li> 1156 1157 <!-- 1158 <li class="inc-nav-item"> 1159 <a class="inc-nav-link inc-nav-account" href="https://gutscheine.cafe-wien.at/en/value-check" title="User account" aria-label="User account"> 1160 <i class="im icon-card" aria-hidden="true"></i> 1161 <span class="inc-nav-link-caption">Value check</span> 1162 </a> 1163 </li> 1164 --> 1165 1166 <li class="inc-nav-item "> 1167 <a class="inc-nav-link inc-nav-cart inc-modal-control" 1168 href="https://gutscheine.cafe-wien.at/en/shoppingcart" data-toggle="modal-cart"> 1169 <div class="inc-nav-cart-inner"> 1170 <i class="im icon-shopping-cart" aria-hidden="true"></i> 1171 <span class="inc-nav-link-caption"> Voucher Basket</span> 1172 <span id="inc-cartItemCount" 1173 class="empty">0</span> 1174 </div> 1175 </a> 1176 <div class="inc-modal-menu inc-nav-cart " id="modal-cart"> 1177 <div class="inc-modal-menu-inner"> 1178 1179 1180 1181 1182 1183<div class="infobox-cart"> 1184 <div class="infobox-cart-header"> 1185 <h3><a href="https://gutscheine.cafe-wien.at/en/shoppingcart">Your shopping cart</a></h3> 1186 </div> 1187 <div class="infobox-cart-content-container"> 1188 <table class="infobox-cart-content"> 1189 <tbody class="infobox-cart-content-tbody"> 1190 <!-- Fill via Ajax --> 1191 </tbody> 1192 </table> 1193 <div class="infobox-cart-empty-content" style="display: none;"> 1194 You do not have any products in your shopping cart yet. 1195 </div> 1196 </div> 1197 <div id="infobox-cart-reservations"></div> 1198</div> 1199<div class="inc-modal-menu-footer"> 1200 <div class="infobox-cart-total-sum-text-container"> 1201 <div class="infobox-cart-total-sum-text"> 1202 Total 1203 <span id="infobox-cart-total-sum"></span> 1204 </div> 1205 <span id="infobox-cart-total-points"></span> 1206 1207 <div class="infobox-shipping-link"> 1208 <a href="https://gutscheine.cafe-wien.at/en/popup?coID=1" class="ajax popup"> 1209 excl. shipping costs 1210 </a> 1211 </div> 1212 </div> 1213 1214 1215 <a class="call-to-action" href="https://gutscheine.cafe-wien.at/en/checkout-shop">Checkout</a> 1216 </div> 1217
1218<script> 1219 let showCartImage = ""; 1220 let showCartItemQuantity = ""; 1221 let showCartItemDelete = ""; 1222 let pointSingleLabel = "Point"; 1223 let pointsMultipleLabel = "Points"; 1224</script>
1224 1225 1226
1227<script> 1228 $().ready(function () { 1229 1230 loadShoppingCart(); 1231 }); 1232 1233 if (!String.format) { 1234 // String format function is used to inject variables into lang-file strings 1235 // {i} indicators will be replaced by the corresponding variables 1236 String.format = function (format) { 1237 var args = Array.prototype.slice.call(arguments, 1); 1238 return format.replace(/{(\d+)}/g, function (match, number) { 1239 return typeof args[number] != 'undefined' ? args[number] : match; 1240 }); 1241 }; 1242 } 1243 1244 1245</script>
1245 1246 1247 1248 </div> 1249 </div> 1250 </li> 1251 1252 <div class="hidden-navi-xs"> 1253 1254<div class="language-switch"> 1255 <div class="language-switch-shortcode"> 1256 <a href="https://gutscheine.cafe-wien.at/" aria-label="Deutsch" class="language-item "> 1257 <span class="language-item-shortcode">de</span> 1258 </a> 1259 <a href="https://gutscheine.cafe-wien.at/en" aria-label="Englisch" class="language-item selected"> 1260 <span class="language-item-shortcode">en</span> 1261 </a> 1262 </div> 1263 </div> 1264 1265
1266<script> 1267 $(".language-toggle-active-element").on('click', function(event){ 1268 event.stopImmediatePropagation(); 1269 $(this).parent().toggleClass('opened'); 1270 }); 1271</script>
1271 1272 1273 </div> 1274 </ul> 1275 1276 1277<button type="button" id="navigation-toggle-responsive" aria-expanded="false" aria-controls="inc-page-navigation-container"> 1278 <span class="sr-only"> 1279 <span class="navigation-toggle-responsive-open">Open Navigation</span> 1280 <span class="navigation-toggle-responsive-close" style="display: none">Close Navigation</span> 1281 </span> 1282 <div class="navigation-toggle-responsive-burger" aria-hidden="true"> 1283 <span></span> 1284 <span></span> 1285 <span></span> 1286 </div> 1287</button>
1288<script src="./templates/qwk/t1/javascript/header-mobile.js"></script>
1288 </div> 1289 </div> 1290 </header> 1291 1292 <noscript> 1293 <div class="inc-error-box center" role="alert"> 1294 JavaScript must be enabled in order for you to use this shop in standard view. However, it seems JavaScript is either disabled or not supported by your browser. To use standard view, enable JavaScript by changing your browser options. 1295 </div> 1296 </noscript> 1297 1298 <!--Sidebar --> 1299 1300 <!--Content --> 1301 <div class="content-inc " id="inc-body" role="main"> 1302 <!-- Breadcrumbs / Navtrail and Wizard --> 1303 1304 1305 <!-- DISPLAY_CATEGORIES_WITH_PRODUCTS --> 1306 1307 1308 1309<div class="inc-startpage"> 1310 1311 1312 1313 1314<!-- Implement Slick Slider -->
1315<script type="text/javascript" src="./templates/qwk/t1/javascript/libs/slick/slick.js"></script>
1315 1316<link rel="stylesheet" href="./templates/qwk/t1/javascript/libs/slick/slick.css" /> 1317
1318<script> 1319 //News Slider Settings Init (see slick-news.js) 1320 var newsSliderShowArrows = ("" == "1") || false, 1321 newsSliderShowDots = ("1" == "1") || false, 1322 newsSliderInfinite = ("1" == "1") || false; 1323</script>
1323 1324 1325 1326 1327 1328 1329 1330 1331 <section class="inc-startpage-section inc-startpage-text "> 1332 <div class="inc-content-container"> 1333 <h1><br /> 1334Welcome to the Querfeld gift shop!</h1> </div> 1335 </section> 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 <section class="inc-startpage-section infobox-cat-teaser "> 1347 <div class="inc-content-container"> 1348 1349 1350
1350<script> 1351 async function getCat(callback, id){ 1352 let d = new Date(); 1353 await $.ajax({ 1354 url: appendSubShopId("api/frontend/eventSequence?includeLinks&includeEventDates&eventDateLimit=10&q=eq(categoryId," + id + ")sort(%2BexternalId)&eventDateFrom=" + (d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate())), 1355 async:true, 1356 success: (data) =>{ 1357 callback(true, id, data); 1358 }, 1359 error: () => { 1360 callback(false); 1361 } 1362 }); 1363 } 1364 1365 function renderEventSequence(success, id, data){ 1366 if(success){ 1367 if(data.length > 0){ 1368 $("#inc-category-item-"+id+" > .inc-category-item-inner").append('<div id="inc-event-sequences-{$id}"></div>'); 1369 for (let i = 0; i < data.length; i++) { 1370 if(!data[i].hasOwnProperty("eventDates")) continue; 1371 for (let j = 0; j < data[i].eventDates.length; j++) { 1372 let object = data[i].eventDates[j]; 1373 for (let item of object.eventProducts) { 1374 if(!data[i].hasOwnProperty("eventProductLink")) { 1375 1376 let salesStartArray = (''+object.salesStart).split(/[- :]/); 1377 let salesEndArray = (''+object.salesEnd).split(/[- :]/); 1378 object.salesStart = new Date(salesStartArray[0], salesStartArray[1]-1, salesStartArray[2], salesStartArray[3], salesStartArray[4], salesStartArray[5]); 1379 object.salesEnd = new Date(salesEndArray[0], salesEndArray[1]-1, salesEndArray[2], salesEndArray[3], salesEndArray[4], salesEndArray[5]); 1380 1381 if(!(object.state == "SOLD_OUT" || object.state == "ELAPSED" || object.state == "CANCELED" || object.available == 0 || item.available == 0 || object.salesStart > new Date() || object.salesEnd < new Date())) { 1382 data[i].eventProductLink = item.productLink; 1383 } 1384 } else break; 1385 } 1386 } 1387 let object = data[i], image; 1388 object.sequenceImage == null ? image = object.image : image = object.sequenceImage; 1389 if(!object.hasOwnProperty("eventProductLink")) continue; 1390 $("#inc-event-sequences-"+id).append(` 1391 <div class="inc-event-item"> 1392 <div class="inc-event-image"> 1393 <img src="${image}"/> 1394 </div> 1395 <div class="inc-event-inner"> 1396 <h2>${object.name}</h2> 1397 <p>${object.description.substr(0, 200) + "\u2026"}</p> 1398 <a class="call-to-action" href="${object.eventProductLink}"></a> 1399 </div> 1400 </div>`); 1401 } 1402 if (typeof $.fn.slick !== "undefined") { 1403 $("#inc-event-sequences-"+id).slick({ 1404 arrows: true, 1405 dots: true, 1406 slidesToShow: 3, 1407 slidesToScroll: 3, 1408 infinite: true, 1409 responsive: [ 1410 { 1411 breakpoint: oneColumnWindowWidth, 1412 settings: { 1413 swipeToSlide: true, 1414 slidesToShow: 1 1415 } 1416 } 1417 ] 1418 }); 1419 } 1420 } 1421 } else{ 1422 console.log("yikes!"); 1423 } 1424 } 1425 </script>
1425 1426 1427 1428 <h2 class="contentsTopicsStartpage">Our categories</h2> <div class="inc-category-list-item-wrapper"> 1429 <!-- 1430 --> 1431 <!-- Different data, so different calls (if) --> 1432 1433 1434 1435<a class="inc-category-item" id="inc-category-item-32" href="https://gutscheine.cafe-wien.at/en/cafe-landtmann" > 1436 <div class="inc-category-item-inner"> 1437 <div class="inc-category-item-image"> 1438 <img src="templates/qwk/images/categories/32.jpg" alt="" title=""/> 1439 </div> 1440 <div class="inc-category-item-desc"> 1441 <div class="inc-category-item-desc-inner"> 1442 <h3> 1443 Café Landtmann 1444 </h3> 1445 1446 <div class="inc-category-item-more-link"> 1447 show more 1448 </div> 1449 </div> 1450 </div> 1451 </div> 1452</a> <!-- 1453 --> 1454 <!-- Different data, so different calls (if) --> 1455 1456 1457 1458<a class="inc-category-item" id="inc-category-item-36" href="https://gutscheine.cafe-wien.at/en/cafe-museum" > 1459 <div class="inc-category-item-inner"> 1460 <div class="inc-category-item-image"> 1461 <img src="templates/qwk/images/categories/36.jpg" alt="" title=""/> 1462 </div> 1463 <div class="inc-category-item-desc"> 1464 <div class="inc-category-item-desc-inner"> 1465 <h3> 1466 Café Museum 1467 </h3> 1468 1469 <div class="inc-category-item-more-link"> 1470 show more 1471 </div> 1472 </div> 1473 </div> 1474 </div> 1475</a> <!-- 1476 --> 1477 <!-- Different data, so different calls (if) --> 1478 1479 1480 1481<a class="inc-category-item" id="inc-category-item-40" href="https://gutscheine.cafe-wien.at/en/cafe-mozart" > 1482 <div class="inc-category-item-inner"> 1483 <div class="inc-category-item-image"> 1484 <img src="templates/qwk/images/categories/40.jpg" alt="" title=""/> 1485 </div> 1486 <div class="inc-category-item-desc"> 1487 <div class="inc-category-item-desc-inner"> 1488 <h3> 1489 Café Mozart 1490 </h3> 1491 1492 <div class="inc-category-item-more-link"> 1493 show more 1494 </div> 1495 </div> 1496 </div> 1497 </div> 1498</a> <!-- 1499 --> 1500 <!-- Different data, so different calls (if) --> 1501 1502 1503 1504<a class="inc-category-item" id="inc-category-item-44" href="https://gutscheine.cafe-wien.at/en/crossfields" > 1505 <div class="inc-category-item-inner"> 1506 <div class="inc-category-item-image"> 1507 <img src="templates/qwk/images/categories/44.jpg" alt="" title=""/> 1508 </div> 1509 <div class="inc-category-item-desc"> 1510 <div class="inc-category-item-desc-inner"> 1511 <h3> 1512 Crossfield's 1513 </h3> 1514 1515 <div class="inc-category-item-more-link"> 1516 show more 1517 </div> 1518 </div> 1519 </div> 1520 </div> 1521</a> <!-- 1522 --> 1523 <!-- Different data, so different calls (if) --> 1524 1525 1526 1527<a class="inc-category-item" id="inc-category-item-52" href="https://gutscheine.cafe-wien.at/en/bootshaus" > 1528 <div class="inc-category-item-inner"> 1529 <div class="inc-category-item-image"> 1530 <img src="templates/qwk/images/categories/52.jpg" alt="" title=""/> 1531 </div> 1532 <div class="inc-category-item-desc"> 1533 <div class="inc-category-item-desc-inner"> 1534 <h3> 1535 Bootshaus 1536 </h3> 1537 1538 <div class="inc-category-item-more-link"> 1539 show more 1540 </div> 1541 </div> 1542 </div> 1543 </div> 1544</a> <!-- 1545 --> 1546 <!-- Different data, so different calls (if) --> 1547 1548 1549 1550<a class="inc-category-item" id="inc-category-item-56" href="https://gutscheine.cafe-wien.at/en/napoleon" > 1551 <div class="inc-category-item-inner"> 1552 <div class="inc-category-item-image"> 1553 <img src="templates/qwk/images/categories/56.jpg" alt="" title=""/> 1554 </div> 1555 <div class="inc-category-item-desc"> 1556 <div class="inc-category-item-desc-inner"> 1557 <h3> 1558 Napoleon 1559 </h3> 1560 1561 <div class="inc-category-item-more-link"> 1562 show more 1563 </div> 1564 </div> 1565 </div> 1566 </div> 1567</a> <!-- 1568 --> 1569 <!-- Different data, so different calls (if) --> 1570 1571 1572 1573<a class="inc-category-item" id="inc-category-item-60" href="https://gutscheine.cafe-wien.at/en?cat=c60_.html" > 1574 <div class="inc-category-item-inner"> 1575 <div class="inc-category-item-image"> 1576 <img src="templates/qwk/images/categories/60.jpg" alt="" title=""/> 1577 </div> 1578 <div class="inc-category-item-desc"> 1579 <div class="inc-category-item-desc-inner"> 1580 <h3> 1581 1582 </h3> 1583 1584 <div class="inc-category-item-more-link"> 1585 show more 1586 </div> 1587 </div> 1588 </div> 1589 </div> 1590</a> <!-- 1591 --> 1592 </div> 1593 </div> 1594 </section> 1595
1595<script> 1596 const max_category_items = 3; 1597 </script>
1597 1598
1598<script type="text/javascript" src="./templates/qwk/t1/javascript/category-list-fill-row.js"></script>
1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627<div id="inc-faq-container"> 1628 <div class="inc-content-container"> 1629 <h2 class="contentsTopicsStartpage">FAQ</h2> 1630 <div id="inc-faq-accordion" class="accordion faq"></div> 1631 </div> 1632</div> 1633
1634<script> 1635 let filterSection = "startpage"; 1636 let filterProduct = ""; 1637 let filterCategory = ""; 1638 1639 let filterParentProduct = ""; 1640</script>
1640 1641
1642<script> 1643 let faqUrl= "api/frontend/faq"; 1644 1645 if(filterSection !== '') faqUrl += "/" + filterSection; 1646 1647 if(filterParentProduct !== '') faqUrl += "?product=" + filterParentProduct; 1648 else if(filterProduct !== '') faqUrl += "?product=" + filterProduct; 1649 1650 if(filterCategory !== '' && filterProduct == '') faqUrl += "?category=" + filterCategory; 1651 else if(filterCategory !== '') faqUrl += "&category=" + filterCategory; 1652 1653 $().ready(function() { 1654 getFaqData(); 1655 }); 1656 async function getFaqData() { 1657 await $.ajax({ 1658 url: appendSubShopId(faqUrl), 1659 async: true, 1660 success: (data) => { 1661 if(data.length > 0) { 1662 //FAQ SCHEMA (SEO) 1663 const script = document.createElement('script'); 1664 script.setAttribute('type', 'application/ld+json'); 1665 var schemaData = { 1666 "@context":"https://schema.org", 1667 "@type":"FAQPage", 1668 "mainEntity":[] 1669 }; 1670 1671 //All Questions and answers 1672 for (let i = 0; i < data.length; i++) { 1673 let accordionRowButton = `<button type="button" aria-expanded="false" class="accordion-button" 1674 aria-controls="sect${i}" id="accordion-sect-${i}">${data[i].question}</button>`; 1675 1676 let accordionRowInner = `<div id="sect${i}" role="region" aria-labelledby="accordion-sect-${i}" 1677 class="accordion-content" style="height:0;"><div class="accordion-content-inner">${data[i].answer}</div></div>`; 1678 $('#inc-faq-accordion').append($('<div class="accordion-section"></div>').append(accordionRowButton).append(accordionRowInner)); 1679 1680 1681 //FAQ schema (SEO)s 1682 schemaData.mainEntity.push({ 1683 "@type":"Question", 1684 "name":data[i].question, 1685 "acceptedAnswer": { 1686 "@type": "Answer", 1687 "text":data[i].answer 1688 } 1689 }); 1690 } 1691 1692 //FAQ schema (SEO) 1693 script.textContent = JSON.stringify(schemaData); 1694 document.head.appendChild(script); 1695 } else { 1696 $('#inc-faq-container').hide(); 1697 } 1698 }, 1699 error: () => { 1700 console.log('error getting faq'); 1701 1702 $('#inc-faq-container').hide(); 1703 } 1704 }); 1705 } 1706</script>
1706 1707</div> 1708 1709 1710 1711 <section class="inc-section-value-check"> 1712 1713 1714 1715 1716 <div class="infobox-value-check"> 1717 <div class="inc-content-container"> 1718 <h2> 1719 Value check & digital storage 1720 </h2> 1721 <div class="infobox-content"> 1722 1723
1724<script src="./templates/qwk/t1/javascript/libs/vue/vue.js"></script>
vendor: 1 bytes, line 1724
1724
1725<script src="./templates/qwk/t1/javascript/libs/qrcodejs/qrcodejs.js"></script>
vendor: 1 bytes, line 1725
1725
1726<script type="text/javascript" src="./templates/qwk/t1/javascript/getCaptcha.js"></script>
1726 1727
1728<script> 1729 const currentRequestCount = null; 1730 const maxRequestCount = 3; 1731</script>
1731 1732 <div id="inc-value-check"> 1733 <div class="inc-voucher-lookup-container"> 1734 <div class="inc-value-check-form"> 1735 <div class="inc-content-container"> 1736 <p> 1737 Enter the barcode / QR code, check the value and save it in the wallet on your smartphone. 1738 </p> 1739 <message 1740 v-bind:status="status" 1741 ></message> 1742 <check-form 1743 v-on:set-status="setStatus" 1744 v-on:set-success-message="setSuccessMessage" 1745 ></check-form> 1746 </div> 1747 </div> 1748 <div class="inc-value-check-result " v-if="success.show"> 1749 <div class="inc-content-container"> 1750 <booking 1751 v-bind:status="status" 1752 v-bind:success="success"> 1753 </booking> 1754 <div class="inc-value-check-result-inner "> 1755 <status 1756 v-bind:status="status" 1757 v-bind:success="success" 1758 ></status> 1759 <recharge-value-card 1760 v-bind:status="status" 1761 v-bind:success="success"> 1762 </recharge-value-card> 1763 <qrcode 1764 v-bind:status="status" 1765 v-bind:success="success" 1766 ></qrcode> 1767 </div> 1768 </div> 1769 </div> 1770 </div> 1771 </div> 1772 1773
1774<script type="text/x-template" id="message"> 1775 <div v-if="!status.state && status.msg" class="inc-error-box">{{ status.msg }}</div> 1776</script>
vendor: 1 bytes, line 1776
1776
1777<script type="text/x-template" id="status"> 1778 <div id="inc-value-check-response-details" class="inc-value-check-result-item" v-if="success.show"> 1779 <h3>{{response.name}}</h3> 1780 <span class="voucher-price"> 1781 <span class="currency-left">â¬</span> 1782 {{ response.currentValue }} 1783 <span class="currency-left"></span> 1784 </span> 1785 1786 <p>{{response.shortDescription}}</p> 1787 1788 <p class="voucher-redeem-date-info"> 1789 <span><b>Issue date:</b> <span>{{response.issueDate}}</span></span><br/> 1790 <span><b>Valid until:</b> <span>{{response.validUntil}}</span></span> 1791 </p> 1792 1793 1794 </div> 1795</script>
1795 1796
1797<script type="text/x-template" id="qrcode"> 1798 <div id="inc-value-check-qr-code" class="inc-value-check-result-item" v-if="success.show"> 1799 <h3>Download and save in wallet.</h3> 1800 <p></p> 1801 <div id="qr-code-outlet"></div> 1802 <a href="" id="qr-code-link" class="inc-download-link default-button"><span class="icon-download"></span>Download</a> 1803 </div> 1804</script>
1804 1805
1806<script type="text/x-template" id="booking"> 1807 <div id="inc-value-check-info-booking" v-if="success.show" class="inc-value-check-result-item"> 1808 {{response.code}} 1809 Code is valid. 1810 <template v-if="response.master"> 1811 You can redeem the item: 1812 <a v-bind:href="response.variantTicketMaster.link">{{ response.variantTicketMaster.name }}</a> 1813 <button class="call-to-action" onclick="fetchProductVariants(openQuickbuy, response.master, true, '', true)"> Book now </button> 1814 </template> 1815 <template v-else> 1816 You can redeem the item now. 1817 </template> 1818 <form id="applyVoucherForm" class="hidden" action="" method="post"> 1819 <input type="text" name="gv_redeem_code" v-bind:value="response.code"/> 1820 </form> 1821 </div> 1822</script>
1822 1823
1824<script type="text/x-template" id="recharge-value-card"> 1825 <div id="inc-value-check-recharge" class="inc-value-check-result-item" v-if="success.show && success.chargeLimits"> 1826 <div class="inc-value-recharge-form" > 1827 <h3>Recharge prepaid card</h3> 1828 1829 <p>Here you can easily recharge your value card</p> 1830 1831 <form v-on:submit="validate" class="inc-form-inner "> 1832 <div class="inc-value-recharge-form-inner"> 1833 <div class="form-field"> 1834 <span class="currency-left">â¬</span> 1835 <input type="text" v-model="updateValue.value" :class="(updateValue.value ? 'not-empty' : '') + (updateValue.hasError ? ' invalid' : '')" 1836 placeholder="Enter value" required/> 1837 <span class="currency-right"></span> 1838 </div> 1839 <button class="button call-to-action" type="submit">Recharge</button> 1840 </div> 1841 <span class="error" v-if="updateValue.hasMinError"> 1842 The minimum amount is â¬{{success.chargeLimits.min}} 1843 </span> 1844 <span class="error" v-if="updateValue.hasMaxError"> 1845 The maximum amount is â¬{{success.chargeLimits.min}} 1846 </span> 1847 </form> 1848 </div> 1849 </div> 1850 1851</script>
1851 1852
1853<script type="text/x-template" id="check-form"> 1854 <form v-on:submit="validate" class="inc-form-inner inc-value-check-form"> 1855 <div class="inc-value-check-form-inner"> 1856 <div class="form-field"> 1857 <input type="text" v-model="voucher.value" :class="(voucher.value ? 'not-empty' : '') + (voucher.hasError ? ' invalid' : '')" 1858 placeholder="Enter code." required/> 1859 </div> 1860 <button class="button call-to-action" type="submit">Verify Code</button> 1861 </div> 1862 <div ref="captcha"></div> 1863 </form> 1864</script>
1864 1865
1866<script> 1867 window.addEventListener('DOMContentLoaded', function() { 1868 1869 Vue.component("status", 1870 { 1871 template: "#status", 1872 props: ["status", "success"], 1873 methods: { 1874 applyVoucher: function(){ 1875 $('#applyVoucherForm').submit(); 1876 } 1877 } 1878 }); 1879 Vue.component("booking", 1880 { 1881 template: "#booking", 1882 props: ["status", "success"] 1883 }); 1884 1885 Vue.component("qrcode", 1886 { 1887 template: "#qrcode", 1888 props: ["status", "success"] 1889 }); 1890 1891 Vue.component("message", 1892 { 1893 template: "#message", 1894 props: ["status", "success"] 1895 }); 1896 1897 Vue.component("recharge-value-card", 1898 { 1899 template: "#recharge-value-card", 1900 props: ["status", "success"], 1901 data: function () { 1902 let getParams = new URLSearchParams(location.search); 1903 let rechargeValue = ''; 1904 if(getParams.has('code')){ 1905 rechargeValue = getParams.get('code'); 1906 } 1907 return { 1908 updateValue: 1909 { 1910 value: rechargeValue, 1911 hasError: false, 1912 hasMinError: false, 1913 hasMaxError: false 1914 } 1915 } 1916 }, 1917 methods: 1918 { 1919 validate: function (e) { 1920 if(e) e.preventDefault(); 1921 this._data.updateValue.hasError = false; 1922 let value = parseFloat(this._data.updateValue.value); 1923 if (!this._data.updateValue.value || this._data.updateValue.value.trim() == "") { 1924 this._data.updateValue.hasError = true; 1925 return; 1926 } 1927 else { 1928 if(value < voucherValueCheck.success.chargeLimits.min) { 1929 this._data.updateValue.hasMinError = true; 1930 this._data.updateValue.hasError = true; 1931 return; 1932 } 1933 else if(value > voucherValueCheck.success.chargeLimits.max) { 1934 this._data.updateValue.hasMaxError = true; 1935 this._data.updateValue.hasError = true; 1936 return; 1937 } 1938 var _this = this; 1939 _this.submitRequest(null); 1940 } 1941 }, 1942 submitRequest() { 1943 var _this = this; 1944 fetch("/api/frontend/shoppingCart/addCardRecharge", { 1945 method: "POST", 1946 body: JSON.stringify({ 1947 cardCode: voucherValueCheck.success.code, 1948 rechargeAmount: parseFloat(this.updateValue.value) 1949 }) 1950 }) 1951 .then(async response => { 1952 const data = await response.json(); 1953 if(response.status == 200) { 1954 location.href= data; //link to shoppingcart 1955 } 1956 }) 1957 .catch((err) => { 1958 console.error(err); 1959 }); 1960 } 1961 } 1962 }); 1963 Vue.component("check-form", 1964 { 1965 template: "#check-form", 1966 props: [], 1967 data: function () { 1968 let getParams = new URLSearchParams(location.search); 1969 let code = ''; 1970 if(getParams.has('code')){ 1971 code = getParams.get('code'); 1972 } 1973 return { 1974 attempt: { 1975 current: currentRequestCount, 1976 tracked: 0, 1977 max: maxRequestCount 1978 }, 1979 voucher: 1980 { 1981 value: code, 1982 hasError: false 1983 }, 1984 success: false, 1985 captcha: { 1986 instance: null 1987 } 1988 } 1989 }, 1990 mounted: function(){ 1991 if(this.voucher.value != '') 1992 this.validate(null, true); 1993 }, 1994 methods: 1995 { 1996 renderQRCode: function (token) { 1997 setTimeout(function () { 1998 let url = window.location.origin + "/download_passbook.php?token=" + token; 1999 2000 // QRCode can't handle strings in the length range of 192 - 220 2001 // https://stackoverflow.com/questions/30796584/qrcode-js-error-code-length-overflow-17161056/73544657#comment123108831_34890253 2002 if (url.length >= 192) { 2003 url = url.padEnd(220); 2004 } 2005 2006 $('#qr-code-outlet').html(''); 2007 new QRCode( 2008 document.getElementById("qr-code-outlet"), 2009 url); 2010 document.getElementById("qr-code-link").setAttribute("href", url); 2011 }, 200) 2012 }, 2013 setStatus: function (msg, state) { 2014 this.$emit( 2015 'set-status', 2016 { 2017 msg: msg, 2018 status: state 2019 } 2020 ); 2021 }, 2022 setSuccessMessage: function (response) { 2023 if (typeof response !== "undefined") { 2024 this.$emit( 2025 'set-success-message', 2026 { 2027 initialValue: response.initialValue, 2028 currentValue: response.currentValue, 2029 orderId: response.orderId, 2030 code: response.code, 2031 chargeLimits: response.chargeLimits, 2032 show: true 2033 } 2034 ); 2035 } else { 2036 this.$emit( 2037 'set-success-message', 2038 false 2039 ); 2040 } 2041 }, 2042 requiresCaptcha: function () 2043 { 2044 return this._data.captcha.instance || (this._data.attempt.tracked + this._data.attempt.current >= this._data.attempt.max); 2045 }, 2046 validate: function (e) { 2047 if(e) e.preventDefault(); 2048 this._data.voucher.hasError = false;
2049 this.setStatus("", false); 2050 this.setSuccessMessage(); 2051 if (!this._data.voucher.value || this._data.voucher.value.trim() == "") { 2052 this._data.voucher.hasError = true; 2053 this.setStatus("Please enter a code.", false); 2054 } 2055 else if(this.requiresCaptcha() && !this._data.captcha.instance.validate()) 2056 { 2057 this.setStatus("", false); 2058 } 2059 else { 2060 var _this = this; 2061 if (this.requiresCaptcha()) { 2062 this._data.captcha.instance.submit().then(function (captchaData) { 2063 _this.submitRequest(captchaData); 2064 }); 2065 } 2066 else { 2067 _this.submitRequest(null); 2068 } 2069 } 2070 }, 2071 submitRequest(captchaData) { 2072 var _this = this; 2073 const captchaParams = captchaData ? '?' + new URLSearchParams(captchaData).toString() : ''; 2074 2075 let voucherValue = _this._data.voucher.value.replaceAll("=", "%3D").replaceAll("&", "%26").replaceAll("?", "%3F").replaceAll("/", "%E2"); 2076 fetch("api/redeemapp/voucher/valueCheck/" + voucherValue + captchaParams) 2077 .then(function (res) { return res.json(); }) 2078 .then(function (res) { 2079 response = res; 2080 try { 2081 if (parseInt(response.status) === -1) { 2082 _this.setStatus("Please check the captcha input.", false); 2083 // _this.increaseAttempt(); 2084 _this.renderCaptcha(); 2085 } 2086 else if (!response.status) { 2087 _this._data.voucher.hasError = true; 2088 _this.setStatus("Invalid code.", false); 2089 _this.increaseAttempt(); 2090 } else { 2091 if(response.variantTicketMaster) { 2092 response.master = { 2093 VARIANT_PRODUCT_IDS: response.variantTicketMaster.variants, 2094 PRODUCTS_IMAGE_POPUP: response.variantTicketMaster.image, 2095 PRODUCTS_LINK: response.variantTicketMaster.link, 2096 PRODUCTS_ID: response.variantTicketMaster.id, 2097 PRODUCTS_NAME: response.variantTicketMaster.name, 2098 PRODUCTS_IMAGE_ALT_TEXT: response.variantTicketMaster.imageAltText 2099 }; 2100 presetVariant = response.assignedVariantTicketId; 2101 } 2102 _this.setSuccessMessage(response); 2103 if(response.pkpassToken) _this.renderQRCode(response.pkpassToken); 2104 $('#applyVoucherForm input[name=gv_redeem_code]').val(response.code); 2105 productsId = response.variantTicketMaster ? response.variantTicketMaster.id : ''; 2106 2107 2108 2109 } 2110 if (typeof crossDomainIframeResize === "function") setTimeout(function(){crossDomainIframeResize(false);}, 0); 2111 } catch (exception) { 2112 if (exception instanceof SyntaxError) { 2113 _this.setStatus("An internal error has occurred. Please try again.", false); 2114 _this.increaseAttempt(); 2115 } 2116 else { 2117 console.error(exception); 2118 } 2119 } 2120 }).catch(function (err) { 2121 if (err.response && err.response.data.code == "ERR_VOUCHER_CANCELED") 2122 { 2123 _this.setStatus("This item has been cancelled and can no longer be redeemed.", false); 2124 } 2125 else 2126 { 2127 _this.increaseAttempt(); 2128 } 2129 }); 2130 }, 2131 increaseAttempt: function () { 2132 this._data.attempt.tracked++; 2133 2134 if (this._data.captcha.instance) { 2135 this._data.captcha.instance.refresh(); 2136 } 2137 else if (this.requiresCaptcha()) { 2138 this.renderCaptcha(); 2139 } 2140 }, 2141 renderCaptcha: function () { 2142 var _this = this; 2143 getCaptcha().then(function () { 2144 _this._data.captcha.instance = IncCaptcha.render(_this.$refs.captcha); 2145 _this.$refs.captcha.classList.add('captcha-container'); 2146 }); 2147 } 2148 }, 2149 mounted: function () { 2150 if (this.requiresCaptcha()) { 2151 this.renderCaptcha(); 2152 } 2153 } 2154 }); 2155 2156 Vue.config.ignoredElements = ['d']; 2157 2158 var voucherValueCheck = new Vue( 2159 { 2160 el: "#inc-value-check", 2161 data: 2162 { 2163 status: 2164 { 2165 state: "", 2166 msg: "" 2167 }, 2168 success: 2169 { 2170 initialValue: "", 2171 currentValue: "", 2172 orderId: "", 2173 show: false, 2174 code: "", 2175 chargeLimits: { 2176 min: null, 2177 max: null 2178 }, 2179 }, 2180 downloadUrl: "" 2181 }, 2182 methods: 2183 { 2184 setStatus: function (status) { 2185 this.status.state = status.state; 2186 this.status.msg = status.msg; 2187 }, 2188 setSuccessMessage: function (response) { 2189 if (response) { 2190 this.success.show = true; 2191 this.success.initialValue = response.initialValue; 2192 this.success.currentValue = response.currentValue; 2193 this.success.orderId = response.orderId; 2194 this.success.code = response.code; 2195 this.success.chargeLimits = response.chargeLimits; 2196 } else { 2197 this.success.show = false;
2198 } 2199 } 2200 } 2201 } 2202 ); 2203 }); 2204</script>
2204 2205 2206 2207 </div> 2208 </div> 2209 </div> 2210 2211 </section> 2212 </div> 2213 2214 <!--Footer --> 2215 <footer> 2216 <div class="footer-main-bar"> 2217 <div class="inner-footer-main-bar inc-content-container cc-clear-padding-top-bottom"> 2218 <div class="footer-content-links footer-column"> 2219 2220 2221 2222<div class="infobox-more"> 2223 <h3>Info</h3> 2224 <div class="infobox-content-left"> 2225 <ul class="content-links"><li><a class="content_link" href="https://gutscheine.cafe-wien.at/en/withdrawal-form"> Withdrawal</a></li><li><a class="content_link" href="https://gutscheine.cafe-wien.at/en/postage-costs"> Postage</a></li><li><a class="content_link" href="https://gutscheine.cafe-wien.at/en/data-protection"> Privacy</a></li><li><a class="content_link" href="https://gutscheine.cafe-wien.at/en/general-terms-and-conditions"> General terms and conditions</a></li><li><a class="content_link" href="https://gutscheine.cafe-wien.at/en/imprint"> Imprint</a></li><li><a class="content_link" href="https://gutscheine.cafe-wien.at/en/contact"> Contact</a></li></ul> 2226 </div> 2227</div> 2228 2229 </div> 2230 <div class="footer-column footer-column-incert-logo"> 2231 <!-- Incert Logo --> 2232 <div class="incert-logo" role="contentinfo" aria-label="author of the website"> 2233 <span class="incert-logo-info ">eCommerce-System by</span> 2234 <a target="_blank" href="https://www.incert.at" class="incert-logo-link"> 2235 <img class="regular-incert-logo" src="./images/incert-logo.png" alt="INCERT eTourismus GmbH" /> 2236 <img class="hover-incert-logo" src="./images/incert-logo-green.png" alt="INCERT eTourismus GmbH hover" aria-hidden="true" /> 2237 </a> 2238 </div> </div> 2239 </div> 2240 </div> 2241 2242 </footer> 2243 </div> 2244
2245<script type="text/javascript" src="./templates/qwk/t1/javascript/localization/datepicker-en.js"></script>
vendor: 1 bytes, line 2245
2245
2246<script> 2247 let lightboxImages = []; 2248 let lightboxContent = []; 2249</script>
2249 2250<div id="inc-lightbox" class="inc-lightbox-overlay inc-lightbox-close"> 2251 2252 <div class="inc-lightbox-inner"> 2253 <button class="inc-lightbox-switch inc-prev" disabled></button> 2254 <button class="inc-lightbox-close"></button> 2255 <h3 class="inc-lightbox-header"></h3> 2256 <div class="inc-lightbox-content"></div> 2257 2258 <div class="inc-cart-info"> 2259 <p class="inc-lightbox-message"></p> 2260 <div class="inc-lightbox-buttons"> 2261 <button class="inc-lightbox-close">more vouchers</button> 2262 <div><a role="button" href="https://gutscheine.cafe-wien.at/en/shoppingcart">checkout</a></div> 2263 </div> 2264 </div> 2265 2266 <button class="inc-lightbox-switch inc-next" disabled></button> 2267 </div> 2268</div> 2269
2270<script type="text/html" id="inc-lightbox-reference"> 2271 <div class="inc-lightbox-overlay inc-lightbox-close"></div> 2272 <div class="inc-lightbox-inner"> 2273 <button class="inc-lightbox-close"></button> 2274 <div class="inc-cart-info"> 2275 <p class="inc-lightbox-message">Message</p> 2276 <div class="inc-lightbox-buttons"> 2277 <button class="inc-lightbox-close">more vouchers</button> 2278 <div><a role="button" href="https://gutscheine.cafe-wien.at/en/shoppingcart">checkout</a></div> 2279 </div> 2280 </div> 2281 </div> 2282</script>
2282 2283 2284 2285 2286
2286<script>var CURRENT_TEMPLATE = "qwk/t1";</script>
2286 2287
2287<script> 2288 var $meta = $("<meta>").attr("name", "viewport").attr("content", "width=device-width"); 2289 $("head").append($meta); 2290 </script>
2290 2291 2292
2292<script> 2293 //Systeme die in FB integriert sind und wenn man dort im Warenkorb auf "Bestellen" klickt, 2294 //dass man weitergeleitet wird in ein neues Fenster und nicht in FB 2295 if (window.parent.testFacebook && window.parent.testFacebook() == "true") { 2296 $().ready(function () { 2297 $("body").addClass("facebook"); 2298 $(".total_sum_buttons div.button a.buttonLink").click(function () { 2299 2300 window.open("?gotocat=checkout", "_blank"); 2301 window.location.href = "index.php"; 2302 2303 return false; 2304 }); 2305 }); 2306 } 2307 </script>
2307 2308
2308<script> 2309 (function() 2310 { 2311 var div = document.createElement('DIV'); 2312 div.setAttribute('style', 'display:none;'); 2313 div.innerHTML = '<iframe id="inneriframe" width="1" height="1"></iframe>'; 2314 document.body.appendChild(div); 2315 })(); 2316 </script>
2316 </body> </html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.