var pgInit = {}; pgInit.vars = { promotions: '[{"id":"29","title":"# another Early booking","description":"# Teaser another Early booking","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo37&startDay=2026-06-12","image":""},{"id":"18","title":"Advance > 60 days ","description":"# teaser Advance > 60 days ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo26&startDay=2026-08-08","image":""},{"id":"27","title":"Copy of Free days ( CheapestDays )","description":"# Teaser Free days ( CheapestDays ) ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=4&preselect=promo35&startDay=2026-06-08","image":"https:\/\/secure.guestcentric.org\/bin\/8e301b6b8524aa6d\/thumb-longer-stay-at-the-pool--2.webp"},{"id":"15","title":"Free days ( CheapestDays )","description":"# Teaser Free days ( CheapestDays ) ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=6&preselect=promo23&startDay=2026-06-08","image":""},{"id":"16","title":"Free days ( combination ) ","description":"# Teaser Free days ( combination ) ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=10&preselect=promo24&startDay=2026-06-08","image":""},{"id":"14","title":"Free days ( LastDays ).","description":"# Teaser Free days ( LastDays ) ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo22&startDay=2026-06-08","image":""},{"id":"26","title":"Free days (initial 2) not single","description":"# Teaser Free days (initial 2) not single","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=4&preselect=promo34&startDay=2026-06-10","image":""},{"id":"20","title":"Free days - Updated","description":"Free days - Last Days","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo28&startDay=2026-06-08","image":""},{"id":"24","title":"Free days promotions - edited","description":"Free days promotions","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=3&preselect=promo32&startDay=2026-06-08","image":""},{"id":"32","title":"FreeAds 2","description":"teaser","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo40&startDay=2026-06-08","image":""},{"id":"12","title":"Google Free Ads with ABD","description":"teaser advance booking days","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo20&startDay=2026-06-22","image":""},{"id":"31","title":"GoogleFreeAds PPO","description":"teaser GoogleFreeAds PPO","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo39&startDay=2026-06-08","image":""},{"id":"33","title":"GoogleFreeAds PPO2","description":"teaser GoogleFreeAds PPO2","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo41&startDay=2026-06-08","image":""},{"id":"22","title":"Increase - edited","description":"Increase ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo30&startDay=2026-06-11","image":""},{"id":"17","title":"Long stays min 4 ( free last 2 days)","description":"# teaser Long stays min 4 ( free last 2 days)","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=4&preselect=promo25&startDay=2026-06-08","image":""},{"id":"3","title":"Longer stay","description":"Valid for reservations with a minimum of 3 nights ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=3&preselect=promo5&startDay=2026-06-08","image":"https:\/\/secure.guestcentric.org\/bin\/8e301b6b8524aa6d\/thumb-longer-stay-at-the-pool--1.webp"},{"id":"28","title":"Non Refundable Family and Double","description":"# teaser Non refundable rate","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo36&startDay=2026-06-08","image":"https:\/\/secure.guestcentric.org\/bin\/8e301b6b8524aa6d\/thumb-tempimagecnqgtu-1.gif"},{"id":"34","title":"NRF - Weekend getaway","description":"Get a full city experience","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo42&startDay=2026-06-08","image":"https:\/\/secure.guestcentric.org\/bin\/8e301b6b8524aa6d\/thumb-tempimageeznqes-1.gif"},{"id":"41","title":"Promo GUEST-12940","description":"# teaser Promo GUEST-12940","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo55&startDay=2026-06-10","image":""},{"id":"39","title":"Promotion GUEST-12940 edited","description":"# Teaser Promotion GUEST-12940","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo53&startDay=2026-06-08","image":""},{"id":"30","title":"Promotion with arrival day","description":"","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo38&startDay=2026-06-10","image":""},{"id":"40","title":"test ","description":"# teaser test ","linkLabel":"Lis\u00e4infoa saat t\u00e4st\u00e4","link":"10","bookBtn":"https:\/\/roomsfortourists.guestcentric.org\/?gc=8fc61d049b75a9c2747cf545f1ab2174&l=fi&nrNights=2&preselect=promo54&startDay=2026-06-08","image":""}]', displayTime: 10, transitionTime: 1.5, frameworkPath: 'https://secure.guestcentric.org/js/yui/build/' }; /** * Promotions gadget — in-banner rotator (promotionsGadget.v03.js; replaces promotionsGadget.v01.js) * Behavior aligned with promotionsGadget.v01.js (YUI): same DOM classes, timing, fades, gadget stack. * Note: PromotionsGadget.v02.js is a different script (listing / best-rate page), not this file. */ (function () { 'use strict'; if (typeof window.pgInit === 'undefined' || !pgInit.vars) { return; } // frameworkPath was only required for YUILoader in v01; optional for v03 var gadget = { gadget: 'promotionGadget', status: 'waiting', start: init }; if (!window.gcGadgetStack) { gadget.status = 'loading'; window.gcGadgetStack = [gadget]; gadget.start(); } else if (gcGadgetStack[gcGadgetStack.length - 1].status === 'loaded') { gadget.status = 'loading'; gcGadgetStack.push(gadget); gadget.start(); } else { gcGadgetStack.push(gadget); } function changeGadgetStatus() { for (var i = 0, li = gcGadgetStack.length; i < li; i++) { var cur = gcGadgetStack[i]; if (cur.status === 'loading') { cur.status = 'loaded'; } else if (cur.status === 'waiting') { cur.status = 'loading'; cur.start(); break; } } } function init() { try { if (!pgInit) { return; } setGadget(); } catch (err) { changeGadgetStatus(); return false; } } function setGadget() { changeGadgetStatus(); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', parseGadgets); } else { parseGadgets(); } } function parseGadgets() { var nodes = document.getElementsByClassName('promotionsgadget'); try { pgInit.vars.decodedPromotions = JSON.parse(pgInit.vars.promotions); } catch (e) { return; } for (var i = 0, li = nodes.length; i < li; i++) { if (pgInit.vars.decodedPromotions.length === 0) { nodes[i].style.display = 'none'; } else if (nodes[i].className.indexOf('parsed') === -1) { new PromotionsGadget(nodes[i], pgInit.vars); } } } window.vars = window.vars || []; function PromotionsGadget(node, settings) { var self = this; // displayTime / transitionTime from API are in seconds (same as v01 + YUI Anim) this.intervalSec = parseFloat(settings.displayTime) || 5; this.fadeSec = parseFloat(settings.transitionTime) || 1; this.fadeMs = Math.max(0, this.fadeSec * 1000); this.domNode = node; this.domNode.className += ' parsed'; this.currentPromotion = null; this.oldPromotionIndex = -1; this.slideshowTimer = null; this.isTransitioning = false; this.baseOpacity = readBaseOpacity(node); this.build = function () { self.currentPromotion = self.getPromotion(); if (!self.currentPromotion) { node.style.display = 'none'; return; } self.wrapperNode = document.createElement('div'); self.wrapperNode.className = 'prgWrapper'; node.appendChild(self.wrapperNode); self.titleNode = document.createElement('div'); self.titleNode.className = 'prgTitle'; self.titleNode.innerHTML = self.currentPromotion.title; self.wrapperNode.appendChild(self.titleNode); self.imgWrapperNode = document.createElement('div'); self.imgWrapperNode.className = 'prgImgWrapper'; self.wrapperNode.appendChild(self.imgWrapperNode); self.imgNode = document.createElement('img'); self.imgNode.loading = 'lazy'; self.imgNode.className = 'prgImage'; self.imgNode.src = self.currentPromotion.image || ''; self.imgNode.style.visibility = self.currentPromotion.image ? 'visible' : 'hidden'; self.imgWrapperNode.appendChild(self.imgNode); self.linkLabel = document.createElement('div'); self.linkLabel.className = 'prgClick'; self.linkLabel.innerHTML = self.currentPromotion.linkLabel || ''; self.wrapperNode.appendChild(self.linkLabel); self.description = document.createElement('div'); self.description.className = 'prgDescription'; self.description.innerHTML = self.currentPromotion.description || ''; self.wrapperNode.appendChild(self.description); self.link = self.currentPromotion.bookBtn; node.style.visibility = 'visible'; node.addEventListener('click', function (ev) { self.openPromotion(); }); node.style.cursor = 'pointer'; self.startSlideshow(); }; this.startSlideshow = function () { if (settings.decodedPromotions.length <= 1) { return; } if (self.slideshowTimer) { clearInterval(self.slideshowTimer); } self.slideshowTimer = setInterval(function () { if (!self.isTransitioning) { self.refresh(); } }, self.intervalSec * 1000); }; this.refresh = function () { if (self.isTransitioning || settings.decodedPromotions.length <= 1) { return; } var newPromotion = self.getPromotion(); if (!newPromotion) { return; } self.isTransitioning = true; fadeElement(node, self.baseOpacity, 0, self.fadeMs, function () { if (!newPromotion.image) { self.imgNode.style.visibility = 'hidden'; } else { self.imgNode.style.visibility = 'visible'; } self.titleNode.innerHTML = newPromotion.title || ''; self.imgNode.src = newPromotion.image || ''; self.linkLabel.innerHTML = newPromotion.linkLabel || ''; self.description.innerHTML = newPromotion.description || ''; window.vars.push(newPromotion.description); self.link = newPromotion.bookBtn; self.currentPromotion = newPromotion; fadeElement(node, 0, self.baseOpacity, self.fadeMs, function () { self.isTransitioning = false; }); }); }; this.getPromotion = function () { var promotions = settings.decodedPromotions; if (!promotions || promotions.length === 0) { return null; } var randIndex = 0; if (promotions.length > 1) { randIndex = Math.floor(Math.random() * promotions.length); while (randIndex === self.oldPromotionIndex) { randIndex = Math.floor(Math.random() * promotions.length); } self.oldPromotionIndex = randIndex; } return promotions[randIndex]; }; this.openPromotion = function () { var ga = window[window.GoogleAnalyticsObject]; var linkerParam = ''; if (ga && ga.getAll) { linkerParam = '&' + ga.getAll()[0].get('linkerParam'); } var href = self.link + '&url=' + encodeURIComponent(window.location.toString()) + linkerParam; if (window.self === window.top) { window.open(href, '_self'); } else { window.open(href, '_blank'); } }; this.build(); } function readBaseOpacity(el) { var o = window.getComputedStyle(el).opacity; var n = parseFloat(o); return isNaN(n) ? 1 : Math.min(1, Math.max(0, n)); } /** * Ease-out cubic (similar to YUI easeOut for opacity tweens) */ function easeOutCubic(t) { var p = 1 - t; return 1 - p * p * p; } function fadeElement(el, from, to, durationMs, done) { if (durationMs <= 0) { el.style.opacity = String(to); if (done) { done(); } return; } var start = null; function step(ts) { if (start === null) { start = ts; } var p = (ts - start) / durationMs; if (p > 1) { p = 1; } var eased = easeOutCubic(p); var v = from + (to - from) * eased; el.style.opacity = String(v); if (p < 1) { requestAnimationFrame(step); } else if (done) { done(); } } requestAnimationFrame(step); } })();