/* * searchbox.js * Copyright (C) 2013 Nexteam S.r.l., All rights reserved. */ // dichiarazione del namespace var it = it || {}; it.bookingexpert = it.bookingexpert || {}; // classe per la visualizzazione del widget di ricerca it.bookingexpert.SearchBox = {}; // dizionario codice/html dei widget di ricerca it.bookingexpert.SearchBox.html = []; // riferimento all'ultimo target it.bookingexpert.SearchBox.target = null; // carica il widtget associato al codice specificato all'interno di target it.bookingexpert.SearchBox.load = function (target, code, opts) { if (typeof target === 'string') { target = document.getElementById(target); } it.bookingexpert.SearchBox.target = target; if (!code) { code = ''; } // impostazioni predefinite opts = opts || {}; opts.modaltarget = opts.modaltarget || 'bemodalframe'; // cerca il box associato al codice var found = null; for (var i = 0; i < it.bookingexpert.SearchBox.html.length; i++) { var box = it.bookingexpert.SearchBox.html[i]; if (code === '' || box.code === code) { found = box.html; break; } } // se box non trovato mostra quello di default if (found === null || found === '') { found = '{simpleform}'; } // visualizza la form di ricerca it.bookingexpert.SearchBox.template(target, opts, found); // imposta i parametri per il tracciamento su google analytics it.bookingexpert.SearchBox.googleAnalytics('ga', null); }; // imposta i parametri per il tracciamento su google analytics it.bookingexpert.SearchBox.googleAnalytics = function (gavar, target) { var ga = window[gavar]; if (typeof ga !== 'undefined' && typeof jQuery !== 'undefined') { ga(function (tracker) { var linker = new window.gaplugins.Linker(tracker); var host = it.bookingexpert.SearchBox.url; // var host = 'be.bookingexpert.it'; // var host = 'localhost'; jQuery("a[href*='" + host + "']", target).click(function () { linker.decorate(this); }); jQuery("form[action*='" + host + "']", target).submit(function () { linker.decorate(this); //var g = jQuery('input[name=ga]'); //if (g.length === 0) { // var h = document.createElement('input'); // h.setAttribute('type', 'hidden'); // h.setAttribute('name', 'ga'); // h.value = tracker.get('linkerParam'); // this.appendChild(h); //} }); }); } }; // include il file javascript esterno ed esegue la funzione callback appena pronto it.bookingexpert.SearchBox.template = function (target, opts, html) { // recupera i tag script dal codice del box var scripts = ''; var cleaned = html.replace(/]*>([\s\S]*?)<\/script>/gi, function () { scripts += arguments[0]; return ''; }); // blocco offerte cleaned = cleaned.replace(/\{offers(:([\d\w]+))?\}([\s\S]*?)\{\/offers\}/g, function (a, c, d, b) { var h = ''; if (typeof it.bookingexpert.SearchBox.offers !== 'undefined') { // cerca estensione var n = null; if (d) { for (var g = 0; g < it.bookingexpert.SearchBox.jsonOffers.length; g++) { n = it.bookingexpert.SearchBox.jsonOffers[g]; if (n.code === d) { break; } } } // formatta le offerte for (var j = 0; j < it.bookingexpert.SearchBox.offers.length; j++) { var f = it.bookingexpert.SearchBox.offers[j]; if (n !== null) { var q = false; var r = f.type === 'rate' ? n.rates : n.sales; if (r !== null) { for (var g = 0; g < r.length; g++) { if (r[g] === f.id) { q = true; break; } } } if (!n.exclude && !q || n.exclude && q) { continue; } } h += b.replace(/\{([^\}]+)\}/g, function (c, d) { var f = it.bookingexpert.SearchBox.offers[j]; var e = d.split('.'); for (var g = 0; g < e.length; g++) { if (e[g] === 'hotel' && typeof it.bookingexpert.SearchBox.domain !== 'undefined') { // cerca informazioni hotel nel dominio for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { var t = it.bookingexpert.SearchBox.domain.hotels[i]; if (t.id === f[e[g]]) { f = t; break; } } } else { f = f[e[g]]; } if (f === null) { break; } } return f === null ? '' : f; }); } } return h; }); // sostituisce i blocchi fino a esaurimento degli stessi var blockexp = /\{(simpleform|hidden|services|places|hotels|guests|guesttypes|options|fieldset|coupon)(:(.+?))?\}/g; var temp = ''; while (temp !== cleaned) { temp = cleaned; cleaned = temp.replace(blockexp, it.bookingexpert.SearchBox.replace); } // stampa nella destinazione solo html target.innerHTML = cleaned; // registra gli eventi predefiniti var forms = target.getElementsByTagName('form'); for (var x = 0; x < forms.length; x++) { if (forms[x].target === opts.modaltarget) { forms[x].onsubmit = it.bookingexpert.SearchBox.modal; } } // crea i tag script e esegue il codice var div = document.createElement('div'); div.innerHTML = '.' + scripts; for (var x = 1; x < div.childNodes.length; x++) { var node = div.childNodes[x]; var src = node.getAttribute('src'); var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); if (src !== null) { script.setAttribute('src', src); } script.text = node.innerHTML; target.appendChild(script); } }; // codice html per la generazione del form default it.bookingexpert.SearchBox.replace = function () { var b = arguments[1]; var c = arguments[3]; if (b === 'simpleform') { return it.bookingexpert.SearchBox.replaceSimpleForm(); } else if (b === 'fieldset') { return it.bookingexpert.SearchBox.replaceFieldset(c); } else if (b === 'hidden') { return it.bookingexpert.SearchBox.replaceHidden(); } else if (b === 'places') { return it.bookingexpert.SearchBox.replacePlaces(); } else if (b === 'hotels') { return it.bookingexpert.SearchBox.replaceHotels(); } else if (b === 'guests') { return it.bookingexpert.SearchBox.replaceGuests(c); } else if (b === 'guesttypes') { return it.bookingexpert.SearchBox.replaceGuesttypes(c); } else if (b === 'services') { return it.bookingexpert.SearchBox.replaceServices(); } else if (b === 'options') { return it.bookingexpert.SearchBox.replaceOptions(c); } else if (b === 'coupon') { return it.bookingexpert.SearchBox.replaceCoupon(c); } return ''; }; // sostituisce le options per le select dinamiche it.bookingexpert.SearchBox.replaceOptions = function (c) { if (!c) { c = '0,9'; } var a = c.split(','); var str = ''; for (var y = a[0]; y <= a[1]; y++) { str += ''; } return str; }; // sostituisce blocco per luoghi hotels it.bookingexpert.SearchBox.onPlaceChange = function (sender) { if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { var place = sender.value; jQuery('select[name=hotel]', it.bookingexpert.SearchBox.target).each(function () { this.options.length = 1; for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { var h = it.bookingexpert.SearchBox.domain.hotels[i]; if (place === '' || place === h.city) { this.options[this.options.length] = new Option(h.name, h.id); } } }); } }; // sostituisce blocco per servizi ecommerce it.bookingexpert.SearchBox.replaceServices = function () { var str = ''; if (typeof it.bookingexpert.SearchBox.services !== 'undefined') { str += ''; } return str; }; // sostituisce blocco per luoghi hotels it.bookingexpert.SearchBox.replacePlaces = function () { var str = ''; if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { var places = {}; var sorted = []; for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { var h = it.bookingexpert.SearchBox.domain.hotels[i]; if (!places[h.city]) { places[h.city] = 1; sorted.push(h.city); } } sorted.sort(); str += ''; } return str; }; // sostituisce blocco per nomi hotels it.bookingexpert.SearchBox.replaceHotels = function () { var str = ''; if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { str += ''; } return str; }; // sostituisce blocco per combiazioni ospiti it.bookingexpert.SearchBox.replaceGuests = function (c) { if (!c) { c = ''; } return it.bookingexpert.SearchBox.replaceFields(it.bookingexpert.SearchBox.guests, c); }; // sostituisce blocco per tipologie ospiti it.bookingexpert.SearchBox.replaceGuesttypes = function (c) { if (!c) { // c = '
'; } return it.bookingexpert.SearchBox.replaceFields(it.bookingexpert.SearchBox.guesttypes, c); }; // sostituisce blocco per coupon it.bookingexpert.SearchBox.replaceCoupon = function (c) { var str = '
'; return str; }; // sostituisce i segnaposti con i rispettivi valori it.bookingexpert.SearchBox.replaceFields = function (a, c) { var fieldexp = /\$([a-z]+)/g; var str = ''; for (var x = 0; x < a.length; x++) { str += c.replace(fieldexp, function () { return a[x][arguments[1]]; }); } return str; }; // codice html per la generazione del form default it.bookingexpert.SearchBox.replaceSimpleForm = function () { var str = '
'; str += '{fieldset:nights}
'; return str; }; // campi hidden it.bookingexpert.SearchBox.replaceHidden = function () { var str = ''; if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { str += ''; } else { str += ''; } str += ''; return str; }; // codice html per la generazione dei campi della form it.bookingexpert.SearchBox.replaceFieldset = function (b) { var str = '{hidden}
'; } else if (b === 'checkout') { str += it.bookingexpert.SearchBox.lang.checkout; str += ''; } str += '
'; str += '
'; str += it.bookingexpert.SearchBox.lang.ssl; str += ''; return str; }; // include il file javascript esterno ed esegue la funzione callback appena pronto it.bookingexpert.SearchBox.include = function (src, callback) { if (src instanceof Array) { var tail = src; src = tail.shift(); if (tail.length > 0) { var prevcallback = callback; callback = function () { it.bookingexpert.SearchBox.include(tail, prevcallback); }; } } var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); if (callback) { if (script.readyState) { // IE script.onreadystatechange = function () { if (script.readyState === "loaded" || script.readyState === "complete") { script.onreadystatechange = null; callback(); } }; } else { // Others script.onload = callback; } } script.src = src; document.getElementsByTagName("head")[0].appendChild(script); }; // apre una finestra modale per la destinazione del post di una form it.bookingexpert.SearchBox.modal = function () { var iframe = document.getElementsByName(this.target); if (iframe.length === 0) { // crea il frame interno iframe = document.createElement('iframe'); iframe.setAttribute('name', this.target); iframe.className = this.target; // div container (padding) var container = document.createElement('div'); container.className = this.target + 'container'; container.appendChild(iframe); // div background (opacity) var background = document.createElement('div'); background.className = this.target + 'background'; background.appendChild(container); background.onclick = function () { this.parentNode.removeChild(this); }; document.body.appendChild(background); } }; // formatta una data in stringa it.bookingexpert.SearchBox.dateToString = function (s, v) { if (!s) s = 'd/m/Y'; if (!v) v = new Date(); var x = { d: v.getDate(), m: v.getMonth(), Y: v.getFullYear() }; if (x.d < 10) x.d = '0' + x.d; if (x.m < 10) x.m = '0' + x.m; return s.replace(/[Ymd]/g, function () { return x[arguments[0]]; }); }; // trasforma una casella input in un selettore di date it.bookingexpert.SearchBox.datepicker = function (a) { a.setAttribute('type', 'hidden'); var selday = document.createElement('select'); var selmonth = document.createElement('select'); var selyear = document.createElement('select'); var now = new Date(); for (var i = 1; i <= 31; i++) selday.options[selday.options.length] = new Option(i < 10 ? '0' + i : i); for (var i = 1; i <= 12; i++) selmonth.options[selmonth.options.length] = new Option(it.bookingexpert.SearchBox.lang['month' + i], i < 10 ? '0' + i : i); for (var i = now.getFullYear(); i <= now.getFullYear() + 2; i++) selyear.options[selyear.options.length] = new Option(i, i); selday.selectedIndex = now.getDate() - 1; selmonth.selectedIndex = now.getMonth(); selyear.selectedIndex = 0; selday.onchange = selmonth.onchange = selyear.onchange = function () { a.value = selyear.value + '/' + selmonth.value + '/' + selday.value; }; a.value = selyear.value + '/' + selmonth.value + '/' + selday.value; a.parentNode.insertBefore(selday, a); a.parentNode.insertBefore(selmonth, a); a.parentNode.insertBefore(selyear, a); }; // carica il widget per la struttura selezionata it.bookingexpert.SearchBox.loadHotel = function (id, target, code) { if (id > 0) { var u = it.bookingexpert.SearchBox.url; u += it.bookingexpert.SearchBox.contextPath; u += "/websites/searchbox?static=false&hotel="; u += id; u += "&lang="; u += it.bookingexpert.SearchBox.lang.code; if (target && code) { u += "&target="; u += target; u += "&code="; u += code; } var scriptid = 'besearchboxhoteldyn'; var script = document.getElementById(scriptid); if (script) script.parentNode.removeChild(script); script = document.createElement('script'); script.src = u; script.id = scriptid; document.body.appendChild(script); } }; // seleziona uno degli hotel nel dominio it.bookingexpert.SearchBox.selectDomainHotel = function (id) { if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { jQuery('select[name=hotel]', it.bookingexpert.SearchBox.target).val(id); for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { var h = it.bookingexpert.SearchBox.domain.hotels[i]; if (id === h.id) { jQuery('select[name=place]', it.bookingexpert.SearchBox.target).val(h.city); } } } }; // trasforma una casella input in un selettore di date it.bookingexpert.SearchBox.getCheckout = function () { var d = new Date(it.bookingexpert.SearchBox.layout.checkin); d.setDate(d.getDate() + it.bookingexpert.SearchBox.layout.nights); return d; };it.bookingexpert.SearchBox.lang = {"month1":"Jan","allplaces":"All locations","month2":"Feb","code":"en","month3":"Mar","month4":"Apr","coupon":"Coupon","month5":"May","month6":"Jun","month7":"Jul","month8":"Aug","month9":"Sep","month10":"Oct","ssl":"Information protected with 256 bit SSL Certificate","search":"Search","checkin":"Check-in","month12":"Dec","month11":"Nov","nights":"Nights","guests":"Guests","allhotels":"All Hotels","checkout":"Check-out"};it.bookingexpert.SearchBox.url = "https:\/\/be.bookingexpert.it";it.bookingexpert.SearchBox.contextPath = "\/book";it.bookingexpert.SearchBox.html = [{"code":"Offers","html":"{offers}\r\n \r\n
{name}<\/div>\r\n \"{name}\"\/\r\n
{description}<\/div>\r\n
Price from {pricefrom}<\/span><\/div>\r\n
Book<\/div>\r\n <\/a>\r\n{\/offers}"},{"code":"Default","html":"

Secure Online Booking<\/h4>\r\n

CHECK ROOM AVAILABILITY, RATES AND BOOK ONLINE.<\/p>\r\n

\r\n {hidden}\r\n