1// dichiarazione del namespace 2var it = it || {}; 3it.bookingexpert = it.bookingexpert || {}; 4 5// classe per la visualizzazione del widget di ricerca 6it.bookingexpert.SearchBox = {}; 7// dizionario codice/html dei widget di ricerca 8it.bookingexpert.SearchBox.html = []; 9// riferimento all'ultimo target 10it.bookingexpert.SearchBox.target = null; 11 12it.bookingexpert.SearchBox.gs = {}; 13// carica il widtget associato al codice specificato all'interno di target 14it.bookingexpert.SearchBox.load = function (target, code, opts) { 15 if (typeof target === 'string') { 16 target = document.getElementById(target); 17 } 18 it.bookingexpert.SearchBox.target = target; 19 if (!code) { 20 code = ''; 21 } 22 // impostazioni predefinite 23 opts = opts || {}; 24 opts.modaltarget = opts.modaltarget || 'bemodalframe'; 25 // cerca il box associato al codice 26 var found = null; 27 for (var i = 0; i < it.bookingexpert.SearchBox.html.length; i++) { 28 var box = it.bookingexpert.SearchBox.html[i]; 29 if (code === '' || box.code === code) { 30 found = box.html; 31 break; 32 } 33 } 34 // se box non trovato mostra quello di default 35 if (found === null || found === '') { 36 found = '{simpleform}'; 37 } 38 // visualizza la form di ricerca 39 it.bookingexpert.SearchBox.template(target, opts, found); 40 // imposta i parametri per il tracciamento su google analytics 41 it.bookingexpert.SearchBox.googleAnalytics('ga', null); 42 //initialize Booking Booster 43 it.bookingexpert.SearchBox.bookingBooster(target); 44}; 45// imposta i parametri per il tracciamento su google analytics 46it.bookingexpert.SearchBox.googleAnalytics = function (gavar, target) { 47 var ga = window[gavar]; 48 if (typeof ga !== 'undefined' && typeof jQuery !== 'undefined') { 49 ga(function () { 50 var trackers = ga.getAll(); 51 trackers.forEach(function (tracker) { 52 var linker = new window.gaplugins.Linker(tracker); 53 var host = it.bookingexpert.SearchBox.url; 54 jQuery("a[href*='" + host + "']", target).click(function () { 55 linker.decorate(this); 56 }); 57 jQuery("form[action*='" + host + "']", target).submit(function () { 58 linker.decorate(this); 59 }); 60 }); 61 }); 62 } 63}; 64// include il file javascript esterno ed esegue la funzione callback appena pronto 65it.bookingexpert.SearchBox.template = function (target, opts, html) { 66 // recupera i tag script dal codice del box 67 var scripts = ''; 68 var cleaned = html.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function () { 69 scripts += arguments[0]; 70 return ''; 71 }); 72 // blocco offerte 73 cleaned = cleaned.replace(/\{offers(:([\d\w]+))?\}([\s\S]*?)\{\/offers\}/g, function (a, c, d, b) { 74 var h = ''; 75 if (typeof it.bookingexpert.SearchBox.offers !== 'undefined') { 76 // cerca estensione 77 var n = null; 78 if (d) { 79 for (var g = 0; g < it.bookingexpert.SearchBox.jsonOffers.length; g++) { 80 n = it.bookingexpert.SearchBox.jsonOffers[g]; 81 if (n.code === d) { 82 break; 83 } 84 } 85 } 86 // formatta le offerte 87 for (var j = 0; j < it.bookingexpert.SearchBox.offers.length; j++) { 88 var f = it.bookingexpert.SearchBox.offers[j]; 89 if (n !== null) { 90 var q = false; 91 var r = f.type === 'rate' ? n.rates : n.sales; 92 if (r !== null) { 93 for (var g = 0; g < r.length; g++) { 94 if (r[g] === f.id) { 95 q = true; 96 break; 97 } 98 } 99 } 100 if (!n.exclude && !q || n.exclude && q) { 101 continue; 102 } 103 } 104 h += b.replace(/\{([^\}]+)\}/g, function (c, d) { 105 var f = it.bookingexpert.SearchBox.offers[j]; 106 var e = d.split('.'); 107 for (var g = 0; g < e.length; g++) { 108 if (e[g] === 'hotel' && typeof it.bookingexpert.SearchBox.domain !== 'undefined') { 109 // cerca informazioni hotel nel dominio 110 for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { 111 var t = it.bookingexpert.SearchBox.domain.hotels[i]; 112 if (t.id === f[e[g]]) { 113 f = t; 114 break; 115 } 116 } 117 } else { 118 f = f[e[g]]; 119 } 120 if (f === null) { 121 break; 122 } 123 } 124 return f === null ? '' : f; 125 }); 126 } 127 } 128 return h; 129 }); 130 // sostituisce i blocchi fino a esaurimento degli stessi 131 var blockexp = /\{(simpleform|hidden|services|categories|places|hotels|dates|guests|guesttypes|guesttypesgroups|ages|options|fieldset|coupon|agencycode|collections)(:(.+?))?\}/g; 132 var temp = ''; 133 while (temp !== cleaned) { 134 temp = cleaned; 135 cleaned = temp.replace(blockexp, it.bookingexpert.SearchBox.replace); 136 } 137 // stampa nella destinazione solo html 138 target.innerHTML = cleaned; 139 // registra gli eventi predefiniti 140 var forms = target.getElementsByTagName('form'); 141 for (var x = 0; x < forms.length; x++) { 142 if (forms[x].target === opts.modaltarget) { 143 forms[x].onsubmit = it.bookingexpert.SearchBox.modal; 144 } 145 } 146 // crea i tag script e esegue il codice 147 var div = document.createElement('div'); 148 div.innerHTML = '.' + scripts; 149 for (var x = 1; x < div.childNodes.length; x++) { 150 var node = div.childNodes[x]; 151 var src = node.getAttribute('src'); 152 var script = document.createElement('script'); 153 script.setAttribute('type', 'text/javascript'); 154 if (src !== null) { 155 script.setAttribute('src', src); 156 } 157 script.text = node.innerHTML; 158 target.appendChild(script); 159 } 160}; 161// codice html per la generazione del form default 162it.bookingexpert.SearchBox.replace = function () { 163 var b = arguments[1]; 164 var c = arguments[3]; 165 if (b === 'simpleform') {
166 return it.bookingexpert.SearchBox.replaceSimpleForm(); 167 } else if (b === 'fieldset') { 168 return it.bookingexpert.SearchBox.replaceFieldset(c); 169 } else if (b === 'hidden') { 170 return it.bookingexpert.SearchBox.replaceHidden(); 171 } else if (b === 'places') { 172 return it.bookingexpert.SearchBox.replacePlaces(); 173 } else if (b === 'hotels') { 174 return it.bookingexpert.SearchBox.replaceHotels(); 175 } else if (b === 'guests') { 176 return it.bookingexpert.SearchBox.replaceGuests(c); 177 } else if (b === 'guesttypes') { 178 return it.bookingexpert.SearchBox.replaceGuesttypes(c); 179 } else if (b === 'guesttypesgroups') { 180 return it.bookingexpert.SearchBox.replaceGuesttypesGroups(c); 181 } else if (b === 'services') { 182 return it.bookingexpert.SearchBox.replaceServices(); 183 } else if (b === 'options') { 184 return it.bookingexpert.SearchBox.replaceOptions(c); 185 } else if (b === 'ages') { 186 return it.bookingexpert.SearchBox.replaceAges(c); 187 } else if (b === 'coupon') { 188 return it.bookingexpert.SearchBox.replaceCoupon(c); 189 } else if (b === 'agencycode') { 190 return it.bookingexpert.SearchBox.replaceAgencies(c); 191 } else if (b === 'categories') { 192 return it.bookingexpert.SearchBox.replaceCategories(c); 193 } else if (b === 'dates') { 194 return it.bookingexpert.SearchBox.replaceDates(c); 195 } else if (b === 'collections') { 196 return it.bookingexpert.SearchBox.replaceCollections(c); 197 } 198 return ''; 199}; 200 201it.bookingexpert.SearchBox.writeOptions = function (c) { 202 if (!c) { 203 c = '0,9'; 204 } 205 var a = c.split(',').map(function (item) { 206 return parseInt(item, 10); 207 }); 208 var str = ''; 209 for (var y = a[0]; y <= a[1]; y++) { 210 str += '<option value="' + y + '"'; 211 if (a[2] == y) { 212 str += ' selected="selected"'; 213 } 214 str += '>' + y + '</option>'; 215 } 216 return str; 217 218}; 219// sostituisce le options per le select dinamiche 220it.bookingexpert.SearchBox.replaceOptions = function (c) { 221 var str = it.bookingexpert.SearchBox.writeOptions(c); 222 var a = c.split(','); 223 if (a.length === 5 && a[4] === 'guest') { 224 it.bookingexpert.SearchBox.gs['guesttypes[0][' + a[3] + ']'] = a[2]; 225 } 226 return str; 227}; 228 229it.bookingexpert.SearchBox.replaceAges = function (c) { 230 // debugger; 231 var a = c.split(','); 232 var str = ''; 233 // $id,$min,$defval,$agefrom,$ageto,$agedefault,$ageselect,$useagedefault 234 if (a[6] === "true") { 235 str += '<div>'; 236 if (a[2] !== '0') { 237 if (!a[3]) { 238 a[3] = 0; 239 } 240 if (!a[4] || a[4] === "null") { 241 a[4] = 18; 242 } else if (a[4] > 18) { 243 a[4] = 18; 244 } 245 for (x = a[1]; x < a[2]; x++) { 246 247 str += it.bookingexpert.SearchBox.strAgeForReplacer(a[0], a[3], a[4], a[5], a[7]); 248 } 249 } 250 str += '</div>'; 251 } 252 return str; 253 254}; 255 256// it.bookingexpert.SearchBox.showAges = function (guest, agefrom, ageto, agedefault, ageselect, useagedefault) { 257it.bookingexpert.SearchBox.showAges = function (guest, agefrom, ageto, agedefault, ageUsage) { 258 259 let ageselect = ageUsage.split('_')[0] === 'true'; 260 let useagedefault = ageUsage.split('_')[1] === 'true'; 261 262 // console.log('ageUsage ' + ageUsage); 263 // console.log('ageselect ' + ageselect); 264 // console.log('useagedefault ' + useagedefault); 265 // let ageselect, useagedefault = ageUsage.split('_')[0]; 266 267 // console.log({ arguments }) 268 // id, agefrom, ageto, agedefault, ageselect 269 // debugger; 270 if (ageselect) { 271 if (!agefrom) { 272 agefrom = 0; 273 } 274 if (!ageto) { 275 ageto = 18; 276 } else if (ageto > 18) { 277 ageto = 18; 278 } 279 var newone = parseInt(jQuery(guest).val()); 280 var oldone = parseInt(it.bookingexpert.SearchBox.gs[jQuery(guest).attr('name')]); 281 if (newone > oldone) { 282 for (x = oldone; x < newone; x++) { 283 var str = it.bookingexpert.SearchBox.strAge(jQuery(guest).attr('guestid'), agefrom, ageto, (useagedefault ? agedefault : -1)); 284 jQuery('select[name="guesttypes[0][' + jQuery(guest).attr('guestid') + ']"]').parent('div').children('div').first().append(str); 285 } 286 } else { 287 for (x = oldone; x > newone; x--) { 288 jQuery(guest).parent('div').children('div').first().children("div[name='eta']").last().remove(); 289 } 290 } 291 it.bookingexpert.SearchBox.gs[jQuery(guest).attr('name')] = newone; 292 293 } 294}; 295 296it.bookingexpert.SearchBox.showGroupAges = function (guest, agefrom, ageto, agedefault, ageselect) { 297 // id, agefrom, ageto, agedefault, ageselect 298 if (ageselect) { 299 if (!agefrom) { 300 agefrom = 0; 301 } 302 if (!ageto) { 303 ageto = 18; 304 } else if (ageto > 18) { 305 ageto = 18; 306 } 307 var newone = jQuery(guest).val(); 308 var oldone = it.bookingexpert.SearchBox.gs[jQuery(guest).attr('name')]; 309 if (oldone === undefined && newone > 0) { 310 oldone = 0; 311 } 312 if (newone > oldone) { 313 for (x = oldone; x < newone; x++) { 314 var str = it.bookingexpert.SearchBox.strAge(jQuery(guest).attr('guestid'), agefrom, ageto, -1); 315 jQuery('select[name="guesttypesgroups[0][' + jQuery(guest).attr('guestid') + ']"]').parent('div').children('div').first().append(str); 316 } 317 } else { 318 for (x = oldone; x > newone; x--) { 319 jQuery(guest).parent('div').children('div').first().children("div[name='eta']").last().remove(); 320 } 321 } 322 it.bookingexpert.SearchBox.gs[jQuery(guest).attr('name')] = newone; 323 324 } 325}; 326 327it.bookingexpert.SearchBox.strAgeForReplacer = function (guest, agefrom, ageto, agedefault, useAgeDefault) { 328 // debugger; 329 return it.bookingexpert.SearchBox.strAge(guest, agefrom, ageto, useAgeDefault === 'true' ? agedefault : -1); 330} 331 332it.bookingexpert.SearchBox.strAge = function (guest, agefrom, ageto, agedefault) { 333 var str = '<div name="eta"><label>' + it.bookingexpert.SearchBox.lang.age + '</label>'; 334 str += `<select name="ages[0][${guest}]" ${agedefault < 0 ? ' required="required"' : ''}>`; 335 str += (agedefault < 0) ? '<option value=""> - </option>' : ''; 336 str += it.bookingexpert.SearchBox.writeOptions('' + agefrom + ',' + ageto + ',' + agedefault); 337 str += '</select></div>'; 338 return str; 339}; 340 341 342 343// sostituisce blocco per luoghi hotels 344it.bookingexpert.SearchBox.onPlaceChange = function (sender) { 345 if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { 346 var place = sender.value; 347 jQuery('select[name=hotel]', it.bookingexpert.SearchBox.target).each(function () { 348 this.options.length = 1; 349 for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { 350 var h = it.bookingexpert.SearchBox.domain.hotels[i]; 351 if (place === '' || place === h.city) { 352 this.options[this.options.length] = new Option(h.name, h.id); 353 } 354 } 355 }); 356 } 357}; 358// sostituisce blocco date nel caso sia un ecopmmerce prodotti 359it.bookingexpert.SearchBox.replaceDates = function () { 360 var str = ''; 361 if (typeof it.bookingexpert.SearchBox.ecommerce !== 'undefined' && it.bookingexpert.SearchBox.hasDates) { 362 str += '<div><label>'; 363 str += it.bookingexpert.SearchBox.lang.checkin; 364 str += '</label><input type="text" name="checkin" value="" /></div>'; 365 str += '<div><label>'; 366 str += it.bookingexpert.SearchBox.lang.checkout; 367 str += '</label><input type="text" name="checkout" value="" /></div>'; 368 } 369 return str; 370}; 371it.bookingexpert.SearchBox.replaceServices = function () { 372 var str = ''; 373 if (typeof it.bookingexpert.SearchBox.services !== 'undefined') { 374 str += '<div><label>'; 375 str += it.bookingexpert.SearchBox.lang.service; 376 str += '</label>'; 377 str += '<select name="service">'; 378 str += '<option value="">'; 379 str += it.bookingexpert.SearchBox.lang.all; 380 str += '</option>'; 381 for (var i = 0; i < it.bookingexpert.SearchBox.services.length; i++) { 382 var h = it.bookingexpert.SearchBox.services[i]; 383 str += '<option value="'; 384 str += h.id; 385 str += '">'; 386 str += h.name; 387 str += '</option>'; 388 } 389 str += '</select>'; 390 str += '</div>'; 391 } 392 return str; 393}; 394// sostituisce blocco per luoghi hotels 395it.bookingexpert.SearchBox.replacePlaces = function () { 396 var str = ''; 397 if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { 398 var places = {}; 399 var sorted = []; 400 for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { 401 var h = it.bookingexpert.SearchBox.domain.hotels[i]; 402 if (!places[h.city]) { 403 places[h.city] = 1; 404 sorted.push(h.city); 405 } 406 } 407 sorted.sort(); 408 str += '<select onchange="it.bookingexpert.SearchBox.onPlaceChange(this)" name="place">'; 409 str += '<option value="">'; 410 str += it.bookingexpert.SearchBox.lang.allplaces; 411 str += '</option>'; 412 for (var i in sorted) { 413 str += '<option>'; 414 str += sorted[i]; 415 str += '</option>'; 416 } 417 str += '</select>'; 418 } 419 return str; 420}; 421// sostituisce blocco per nomi hotels 422it.bookingexpert.SearchBox.replaceHotels = function () { 423 var str = ''; 424 if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { 425 str += '<select name="hotel">'; 426 str += '<option value="">'; 427 str += it.bookingexpert.SearchBox.lang.allhotels; 428 str += '</option>'; 429 for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { 430 var h = it.bookingexpert.SearchBox.domain.hotels[i]; 431 str += '<option value="'; 432 str += h.id; 433 str += '">'; 434 str += h.name; 435 str += '</option>'; 436 } 437 str += '</select>'; 438 } 439 return str; 440}; 441// sostituisce blocco per combiazioni ospiti 442it.bookingexpert.SearchBox.replaceGuests = function (c) { 443 if (!c) { 444 c = '<option value="$id"$favhtml>$description</option>'; 445 } 446 return it.bookingexpert.SearchBox.replaceFields(it.bookingexpert.SearchBox.guests, c
446); 447}; 448// sostituisce blocco per tipologie ospiti 449it.bookingexpert.SearchBox.replaceGuesttypes = function (c) { 450 // console.log({ c }) 451 if (!c) { 452 // <option>0</option> 453 c = '<div><label>$name</label><select name="guesttypes[0][$id]" guestid="$id"' 454 + ' onchange="it.bookingexpert.SearchBox.showAges(this, $agefrom, $ageto, $agedefault, \'$ageselect_$useagedefault\')">' 455 + '{options:$min,$max,$defval,$id,guest}</select>{ages:$id,$min,$defval,$agefrom,$ageto,$agedefault,$ageselect,$useagedefault}</div>'; 456 } 457 return it.bookingexpert.SearchBox.replaceFields(it.bookingexpert.SearchBox.guesttypes, c); 458}; 459// sostituisce blocco per tipologie ospiti (gruppi) 460it.bookingexpert.SearchBox.replaceGuesttypesGroups = function (c) { 461 if (!c) { 462 // <option>0</option> 463 c = '<div><label>$name</label><select name="guesttypesgroups[0][$id]" guestid="$id"' 464 + ' onchange="it.bookingexpert.SearchBox.showGroupAges(this, $agefrom, $ageto, $agedefault, $ageselect)">' 465 + '{options:$min,$max,$defval,$id,guest}</select>{ages:$id,$min,$defval,$agefrom,$ageto,$agedefault,$ageselect,-1}</div>'; 466 } 467 return it.bookingexpert.SearchBox.replaceFields(it.bookingexpert.SearchBox.guesttypesgroups, c); 468}; 469// sostituisce blocco per coupon 470it.bookingexpert.SearchBox.replaceCoupon = function (c) { 471 var str = '<div><label>'; 472 str += it.bookingexpert.SearchBox.lang.coupon; 473 str += '</label><input type="text" name="coupon" /></div>'; 474 return str; 475}; 476// sostituisce blocco per agenzie 477it.bookingexpert.SearchBox.replaceAgencies = function (c) { 478 var str = '<div><label>'; 479 str += it.bookingexpert.SearchBox.lang.agencycode; 480 str += '</label><input type="text" name="agencycode" /></div>'; 481 return str; 482}; 483// sostituisce blocco per tag/zone (collections) 484it.bookingexpert.SearchBox.replaceCollections = function () { 485 var str = '<div><label>'; 486 str += it.bookingexpert.SearchBox.lang.collections; 487 str += '</label>'; 488 if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { 489 str += '<ul>'; 490 for (var i = 0; i < it.bookingexpert.SearchBox.collections.length; i++) { 491 var h = it.bookingexpert.SearchBox.collections[i]; 492 str += '<li><input type="checkbox" name="collections[]" class="checkbox" value="'; 493 str += h.id; 494 str += '" />'; 495 str += h.title; 496 str += '</li>'; 497 } 498 str += '</ul>'; 499 } 500 str += '</div>'; 501 return str; 502}; 503// sostituisce i segnaposti con i rispettivi valori 504it.bookingexpert.SearchBox.replaceFields = function (a, c) { 505 // debugger; 506 var fieldexp = /\$([a-z]+)/g; 507 var str = ''; 508 if (a) { 509 for (var x = 0; x < a.length; x++) { 510 str += c.replace(fieldexp, function () { 511 return a[x][arguments[1]]; 512 }); 513 } 514 } 515 return str; 516}; 517 518it.bookingexpert.SearchBox.onCategoryChange = function (sender) { 519 var category = sender.value; 520 jQuery('select[name=service]', it.bookingexpert.SearchBox.target).each(function () { 521 for (var i = 0; i < this.options.length; i++) { 522 this.options[i] = null; 523 } 524 this.options[0] = new Option('', ''); 525 var j = 1; 526 for (i = 0; i < it.bookingexpert.SearchBox.services.length; i++) { 527 if (it.bookingexpert.SearchBox.services[i].category == category || category == '') { 528 this.options[j++] = new Option(it.bookingexpert.SearchBox.services[i].name, it.bookingexpert.SearchBox.services[i].id); 529 } 530 } 531 this.options.length = j; 532 }); 533}; 534 535// sostituisce blocco per servizi ecommerce 536it.bookingexpert.SearchBox.replaceCategories = function () { 537 var str = ''; 538 if (typeof it.bookingexpert.SearchBox.categories !== 'undefined') { 539 str += '<div><label>'; 540 str += it.bookingexpert.SearchBox.lang.category; 541 str += '</label>'; 542 str += '<select name="category" onchange="it.bookingexpert.SearchBox.onCategoryChange(this)">'; 543 str += '<option value="">'; 544 str += it.bookingexpert.SearchBox.lang.all; 545 str += '</option>'; 546 for (var i = 0; i < it.bookingexpert.SearchBox.categories.length; i++) { 547 var h = it.bookingexpert.SearchBox.categories[i]; 548 str += '<option value="'; 549 str += h.id; 550 str += '">'; 551 str += h.name; 552 str += '</option>'; 553 } 554 str += '</select>'; 555 str += '</div>'; 556 } 557 return str; 558}; 559// codice html per la generazione del form default 560it.bookingexpert.SearchBox.replaceSimpleForm = function () { 561 var str = '<form target="_blank" action="'; 562 str += it.bookingexpert.SearchBox.url; 563 str += it.bookingexpert.SearchBox.contextPath; 564 str += it.bookingexpert.SearchBox.action; 565 str += '" method="post">'; 566 str += '{fieldset:nights}</form>'; 567 return str; 568}; 569// campi hidden 570it.bookingexpert.SearchBox.replaceHidden = function () { 571 var str = ''; 572 if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { 573 str += '<input type="hidden" name="domain" value="'; 574 str += it.bookingexpert.SearchBox.domain.id; 575 str += '" />'; 576 } else { 577 str += '<input type="hidden" name="hotel" value="'; 578 str += it.bookingexpert.SearchBox.hotel; 579 str += '" />'; 580 } 581 str += '<input type="hidden" name="lang" value="'; 582 str += it.bookingexpert.SearchBox.lang.code; 583 str += '" />'; 584 585 str += '<input type="hidden" name="bbtmSearchbar" id="bbtmSearchbar" value="" />'; 586 587 if (typeof it.bookingexpert.SearchBox.ecommerce !== 'undefined') { 588 str += '<input type="hidden" name="ecommerce" value="'; 589 str += it.bookingexpert.SearchBox.ecommerce; 590 str += '" />'; 591 } 592 return str; 593}; 594// codice html per la generazione dei campi della form 595it.bookingexpert.SearchBox.replaceFieldset = function (b) { 596 var str = '{hidden}'; 597 if (typeof it.bookingexpert.SearchBox.ecommerce === 'undefined' || it.bookingexpert.SearchBox.hasDates) { 598 str += '<div><label>'; 599 str += it.bookingexpert.SearchBox.lang.checkin; 600 str += '</label><input type="text" name="checkin" value="'; 601 if (it.bookingexpert.SearchBox.layout.checkin) { 602 str += it.bookingexpert.SearchBox.layout.checkin; 603 } 604 str += '" /></div><div><label>'; 605 if (b === 'nights') { 606 str += it.bookingexpert.SearchBox.lang.nights; 607 str += '</label><select name="nights">{options:1,10,'; 608 str += it.bookingexpert.SearchBox.layout.nights; 609 str += '}</select>'; 610 } else if (b === 'checkout') { 611 str += it.bookingexpert.SearchBox.lang.checkout; 612 str += '</label><input type="text" name="checkout" value="" />'; 613 } 614 str += '</div>'; 615 } 616 str += '<div><label>'; 617 str += it.bookingexpert.SearchBox.lang.guests; 618 str += '</label><select name="guests[]">{guests}</select></div><div>'; 619 str += '<input type="submit" name="search" value="'; 620 str += it.bookingexpert.SearchBox.lang.search; 621 str += '" /></div><a href="http://www.bookingexpert.it" target="_blank"><img src="'; 622 str += it.bookingexpert.SearchBox.url; 623 str += '/resources/images/searchboxpowered.png" alt="" /><span>'; 624 str += it.bookingexpert.SearchBox.lang.ssl; 625 str += '</span></a>'; 626 return str; 627}; 628// include il file javascript esterno ed esegue la funzione callback appena pronto 629it.bookingexpert.SearchBox.include = function (src, callback) { 630 if (src instanceof Array) { 631 var tail = src; 632 src = tail.shift(); 633 if (tail.length > 0) { 634 var prevcallback = callback; 635 callback = function () { 636 it.bookingexpert.SearchBox.include(tail, prevcallback); 637 }; 638 } 639 } 640 var script = document.createElement('script'); 641 script.setAttribute('type', 'text/javascript'); 642 if (callback) { 643 if (script.readyState) { 644 // IE 645 script.onreadystatechange = function () { 646 if (script.readyState === "loaded" || script.readyState === "complete") { 647 script.onreadystatechange = null; 648 callback(); 649 } 650 }; 651 } else { 652 // Others 653 script.onload = callback; 654 } 655 } 656 script.src = src; 657 document.getElementsByTagName("head")[0].appendChild(script); 658}; 659// apre una finestra modale per la destinazione del post di una form 660it.bookingexpert.SearchBox.modal = function () { 661 var iframe = document.getElementsByName(this.target); 662 if (iframe.length === 0) { 663 // crea il frame interno 664 iframe = document.createElement('iframe'); 665 iframe.setAttribute('name', this.target); 666 iframe.className = this.target; 667 // div container (padding) 668 var container = document.createElement('div'); 669 container.className = this.target + 'container'; 670 container.appendChild(iframe); 671 // div background (opacity) 672 var background = document.createElement('div'); 673 background.className = this.target + 'background'; 674 background.appendChild(container); 675 background.onclick = function () { 676 this.parentNode.removeChild(this); 677 }; 678 document.body.appendChild(background); 679 } 680}; 681// formatta una data in stringa 682it.bookingexpert.SearchBox.dateToString = function (s, v) { 683 if (!s) 684 s = 'd/m/Y'; 685 if (!v) 686 v = new Date(); 687 var x = { 688 d: v.getDate(), 689 m: v.getMonth(), 690 Y: v.getFullYear() 691 }; 692 if (x.d < 10) 693 x.d = '0' + x.d; 694 if (x.m < 10) 695 x.m = '0' + x.m; 696 return s.replace(/[Ymd]/g, function () { 697 return x[arguments[0]]; 698 }); 699}; 700// trasforma una casella input in un selettore di date 701it.bookingexpert.SearchBox.datepicker = function (a) { 702 a.setAttribute('type', 'hidden'); 703 var selday = document.createElement('select'); 704 var selmonth = document.createElement('select'); 705 var selyear = document.createElement('select'); 706 var now = new Date(); 707 for (var i = 1; i <= 31; i++) 708 selday.options[selday.options.length] = new Option(i < 10 ? '0' + i : i); 709 for (var i = 1; i <= 12; i++) 710 selmonth.options[selmonth.options.length] = new Option(it.bookingexpert.SearchBox.lang['month' + i], i < 10 ? '0' + i : i); 711 for (var i = now.getFullYear(); i <= now.getFullYear() + 2; i++) 712 selyear.options[selyear.options.length] = new Option(i, i); 713 selday.selectedIndex = now.getDate() - 1; 714 selmonth.selectedIndex = now.getMonth(); 715 selyear.selectedIndex = 0; 716 selday.onchange = selmonth.onchange = selyear.onchange = function () { 717 a.value = selyear.value + '/' + selmonth.value + '/' + selday.value; 718 }; 719 a.value = selyear.value + '/' + selmonth.value + '/' + selday.value; 720 a.parentNode.insertBefore(selday, a); 721 a.parentNode.insertBefore(selmonth, a); 722 a.parentNode.insertBefore(selyear, a); 723}; 724// carica il widget per la struttura selezionata
725it.bookingexpert.SearchBox.loadHotel = function (id, target, code) { 726 if (id > 0) { 727 var u = it.bookingexpert.SearchBox.url; 728 u += it.bookingexpert.SearchBox.contextPath; 729 if (typeof it.bookingexpert.SearchBox.ecommerce === 'undefined') { 730 u += "/websites/searchbox?static=false&hotel="; 731 } else { 732 u += "/websites/servicebox?static=false&hotel="; 733 } 734 u += id; 735 u += "&lang="; 736 u += it.bookingexpert.SearchBox.lang.code; 737 if (target && code) { 738 u += "&target="; 739 u += target; 740 u += "&code="; 741 u += code; 742 } 743 var scriptid = 'besearchboxhoteldyn'; 744 var script = document.getElementById(scriptid); 745 if (script) 746 script.parentNode.removeChild(script); 747 script = document.createElement('script'); 748 script.src = u; 749 script.id = scriptid; 750 document.body.appendChild(script); 751 } 752}; 753// seleziona uno degli hotel nel dominio 754it.bookingexpert.SearchBox.selectDomainHotel = function (id) { 755 if (typeof it.bookingexpert.SearchBox.domain !== 'undefined') { 756 jQuery('select[name=hotel]', it.bookingexpert.SearchBox.target).val(id); 757 for (var i = 0; i < it.bookingexpert.SearchBox.domain.hotels.length; i++) { 758 var h = it.bookingexpert.SearchBox.domain.hotels[i]; 759 if (id === h.id) { 760 jQuery('select[name=place]', it.bookingexpert.SearchBox.target).val(h.city); 761 } 762 } 763 } 764}; 765// trasforma una casella input in un selettore di date 766it.bookingexpert.SearchBox.getCheckout = function () { 767 var d = new Date(it.bookingexpert.SearchBox.layout.checkin); 768 d.setDate(d.getDate() + it.bookingexpert.SearchBox.layout.nights); 769 return d; 770}; 771 772it.bookingexpert.SearchBox.isMobile = function () { 773 var check = false; 774 (function (a) { 775 if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) 776 check = true; 777 })(navigator.userAgent || navigator.vendor || window.opera); 778 return check; 779 780 // fixIsMobile 781 // il precedente controllo va rivisto, 782 // utilizzerei il touch e < 1280px con una funzione di questo tipo 783 784 // const hasMatchMedia = typeof window.matchMedia === 'function'; 785 786 // const isTouch = hasMatchMedia 787 // ? window.matchMedia('(any-pointer: coarse)').matches 788 // : ('ontouchstart' in window || navigator.maxTouchPoints > 0); 789
790 // const isNarrow = hasMatchMedia 791 // ? window.matchMedia('(max-width: 1279px)').matches 792 // : window.innerWidth < 1440; 793 794 // return isTouch && isNarrow; 795}; 796 797it.bookingexpert.SearchBox.bookingBooster = function (target) { 798 const booster = ` 799 import { BBTM } from "https://cdn.bookingbooster.it/bbtm/0.8.X/vendor.js"; 800 const bbtm = new BBTM(); 801 initializeBookingBooster(); 802 803 async function initializeBookingBooster() { 804 console.log("BOOSTER: initializeBookingBooster()"); 805 await bbtm.init() 806 .then((session) => { 807 console.log("BOOSTER: then", session); 808 $("#bbtmSearchbar").val(bbtm.getSessionToken()?.toString()); 809 }) 810 .catch((error) => { 811 console.error("BOOSTER: catch", error); 812 }); 813 } 814 `; 815 816 const script = document.createElement("script"); 817 script.setAttribute("type", "module"); 818 script.text = booster; 819 820 target.appendChild(script); 821};it.bookingexpert.SearchBox.lang = {"code":"en","ssl":"Information protected with 256 bit SSL Certificate","search":"Search","checkin":"Check-in","month12":"Dec","month11":"Nov","collections":"Tag\/Areas","agencycode":"Agencies\/Companies\/TO","checkout":"Check-out","all":"","month1":"Jan","allplaces":"All locations","month2":"Feb","month3":"Mar","month4":"Apr","coupon":"Coupon","month5":"May","month6":"Jun","month7":"Jul","month8":"Aug","month9":"Sep","month10":"Oct","nights":"Nights","service":"Additional service","guests":"Guests","allhotels":"All Properties","category":"Category","age":"Age (years)"};it.bookingexpert.SearchBox.action = "\/simple\/step1";it.bookingexpert.SearchBox.url = "https:\/\/booking.borgodelcabreo.it";it.bookingexpert.SearchBox.contextPath = "\/book";it.bookingexpert.SearchBox.html = [{"code":"Default","html":"<form action=\"https:\/\/booking.borgodelcabreo.it\/book\/simple\/step1\" target=\"_blank\">\r\n {hidden}\r\n <div class=\"checkin\">\r\n <label>Arrival<\/label>\r\n <div class=\"searchboxIn\">\r\n <span class=\"searchboxInDay\"><\/span>\r\n <span class=\"searchboxInMonths\"><\/span>\r\n <\/div>\r\n <input type=\"text\" name=\"checkin\" value=\"\" \/>\r\n <\/div>\r\n <div class=\"checkout\">\r\n <label>Departure<\/label>\r\n <div class=\"searchboxOut\">\r\n <span class=\"searchboxOutDay\"><\/span>\r\n <span class=\"searchboxOutMonths\"><\/span>\r\n <\/div>\r\n <input type=\"text\" name=\"checkout\" value=\"\" \/>\r\n <\/div>\r\n {guesttypes}\r\n {coupon}\r\n <div>\r\n <input type=\"submit\" name=\"search\" value=\"Book\" \/>\r\n <\/div>\r\n<\/form>\r\n<script type=\"text\/javascript\">\r\n \/\/ impostazioni globali datepicker\r\n var dplang = jQuery.datepicker.regional[\"en\"];\r\n var m = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n var dpopts = {\r\n dateFormat:'dd-mm-yy',\r\n showOtherMonths: true,\r\n minDate:new Date(),\r\n beforeShowDay: function(date){\r\n var dateMin = checkin.datepicker(\"getDate\");\r\n var dateMax = checkout.datepicker(\"getDate\");\r\n return [true, date >= dateMin && date <= dateMax ? 'date-range-selected' : ''];\r\n }\r\n };\r\n \/\/ inizializza data arrivo e partenza\r\n var checkin = jQuery(\"#searchbox input[name=checkin]\");\r\n var checkout = jQuery(\"#searchbox input[name=checkout]\");\r\n checkin.datepicker(dpopts, dplang);\r\n checkout.datepicker(dpopts, dplang);\r\n checkin.datepicker('option', 'onSelect', function() {\r\n var dateMin = checkin.datepicker(\"getDate\");\r\n var rMin = new Date(dateMin.getFullYear(), dateMin.getMonth(),dateMin.getDate() + 1); \r\n checkout.datepicker(\"option\", \"minDate\", rMin);\r\n var dayIn = jQuery.datepicker.formatDate('dd', checkin.datepicker('getDate'));\r\n var dayOut = jQuery.datepicker.formatDate('dd', checkout.datepicker('getDate'));\r\n monthIn = jQuery.datepicker.formatDate('MM', checkin.datepicker('getDate'), {monthNames: m});\r\n monthOut = jQuery.datepicker.formatDate('MM', checkout.datepicker('getDate'), {monthNames: m});\r\n jQuery('.searchboxInDay').text(dayIn);\r\n jQuery('.searchboxOutDay').text(dayOut);\r\n jQuery('.searchboxInMonths').text(monthIn);\r\n jQuery('.searchboxOutMonths').text(monthOut);\r\n });\r\n checkout.datepicker('option', 'onSelect', function () {\r\n jQuery('.searchboxOutDay').text(jQuery.datepicker.formatDate('dd', checkout.datepicker('getDate')));\r\n }); \r\n \/\/ imposta i valori predefiniti\r\n checkin.datepicker('setDate', new Date(it.bookingexpert.SearchBox.layout.checkin));\r\n checkout.datepicker('setDate', it.bookingexpert.SearchBox.getCheckout());\r\n var dayIn = jQuery.datepicker.formatDate('dd', checkin.datepicker('getDate'));\r\n var dayOut = jQuery.datepicker.formatDate('dd', checkout.datepicker('getDate'));\r\n var monthIn = jQuery.datepicker.formatDate('MM', checkin.datepicker('getDate'), {monthNames: m});\r\n var monthOut = jQuery.datepicker.formatDate('MM', checkout.datepicker('getDate'), {monthNames: m});\r\n jQuery('.searchboxInDay').text(dayIn);\r\n jQuery('.searchboxOutDay').text(dayOut);\r\n jQuery('.searchboxInMonths').text(monthIn);\r\n jQuery('.searchboxOutMonths').text(monthOut);\r\n jQuery('#ui-datepicker-div').hide();\r\n \/\/ trigger datepicker show\r\n jQuery('.searchboxIn').click(function (){\r\n jQuery(checkin).datepicker('show');\r\n });\r\n jQuery('.searchboxOut').click(function (){\r\n jQuery(checkout).datepicker('show');\r\n });\r\n if (it.bookingexpert.SearchBox.isMobile()) {\r\n function changeCheckOut() {\r\n if (new Date(checkin.val()) >= new Date(this.value)) {\r\n var c = new Date(checkin.val());\r\n c.setDate(c.getDate() + 1);\r\n this.value = c.toISOString().substring(0, 10);\r\n }\r\n }\r\n\r\n checkin.attr('type', 'date').datepicker('destroy').val(new Date(it.bookingexpert.SearchBox.layout.checkin).toISOString().substring(0, 10));\r\n checkout.attr('type', 'date').datepicker('destroy').val(it.bookingexpert.SearchBox.getCheckout().toISOString().substring(0, 10));\r\n checkin.change(function () {\r\n if (new Date(this.value) < new Date()) {\r\n this.value = new Date().toISOString().substring(0, 10);\r\n }\r\n });\r\n checkout.change(changeCheckOut).focus(changeCheckOut);\r\n }\r\n<\/script>"}];it.bookingexpert.SearchBox.hotel = "20054";it.bookingexpert.SearchBox.layout = {"id":5255,"nights":1,"checkin":"2026-10-05"};it.bookingexpert.SearchBox.guests = [{"id":98174,"favorite":false,"description":"2 Adults + 2 Babies (0-2)","favhtml":""},{"id":98173,"favorite":false,"description":"1 Adult + 2 Babies (0-2)","favhtml":""},{"id":98175,"favorite":false,"description":"1 Adult + 3 Babies (0-2)","favhtml":""},{"id":98166,"favorite":false,"description":"1 Adult","favhtml":""},{"id":98168,"favorite":false,"description":"3 Adults","favhtml":""},{"id":98167,"favorite":true,"description":"2 Adults","favhtml":" selected=\"selected\""},{"id":98170,"favorite":false,"description":"1 Adult + 1 Baby (0-2)","favhtml":""},{"id":98169,"favorite":false,"description":"4 Adults","favhtml":""},{"id":98172,"favorite":false,"description":"3 Adults + 1 Baby (0-2)","favhtml":""},{"id":98171,"favorite":false,"description":"2 Adults + 1 Baby (0-2)","favhtml":""}];it.bookingexpert.SearchBox.guesttypes = [{"id":9677,"defval":2,"min":1,"max":4,"agefrom":3,"agedefault":18,"ageto":null,"ageselect":false,"useagedefault":true,"name":"Adults"},{"id":9679,"defval":0,"min":0,"max":3,"agefrom":0,"agedefault":0,"ageto":2,"ageselect":false,"useagedefault":true,"name":"Babies (0-2)"}];it.bookingexpert.SearchBox.collections = [];
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.