// https://tc39.github.io/ecma262/#sec-array.prototype.find if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { value: function (predicate) { // 1. Let O be ? ToObject(this value). if (this == null) { throw new TypeError('"this" is null or not defined') } var o = Object(this) // 2. Let len be ? ToLength(? Get(O, "length")). var len = o.length >>> 0 // 3. If IsCallable(predicate) is false, throw a TypeError exception. if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function') } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. var thisArg = arguments[1] // 5. Let k be 0. var k = 0 // 6. Repeat, while k < len while (k < len) { // a. Let Pk be ! ToString(k). // b. Let kValue be ? Get(O, Pk). // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). // d. If testResult is true, return kValue. var kValue = o[k] if (predicate.call(thisArg, kValue, k, o)) { return kValue } // e. Increase k by 1. k++ } // 7. Return undefined. return undefined }, configurable: true, writable: true }) } // https://tc39.github.io/ecma262/#sec-array.prototype.includes if (!Array.prototype.includes) { Object.defineProperty(Array.prototype, 'includes', { value: function (valueToFind, fromIndex) { if (this == null) { throw new TypeError('"this" is null or not defined') } // 1. Let O be ? ToObject(this value). var o = Object(this) // 2. Let len be ? ToLength(? Get(O, "length")). var len = o.length >>> 0 // 3. If len is 0, return false. if (len === 0) { return false } // 4. Let n be ? ToInteger(fromIndex). // (If fromIndex is undefined, this step produces the value 0.) var n = fromIndex | 0 // 5. If n ≥ 0, then // a. Let k be n. // 6. Else n < 0, // a. Let k be len + n. // b. If k < 0, let k be 0. var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0) function sameValueZero (x, y) { return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)) } // 7. Repeat, while k < len while (k < len) { // a. Let elementK be the result of ? Get(O, ! ToString(k)). // b. If SameValueZero(valueToFind, elementK) is true, return true. if (sameValueZero(o[k], valueToFind)) { return true } // c. Increase k by 1. k++ } // 8. Return false return false } }) } if (!Array.from) { Array.from = (function () { var toStr = Object.prototype.toString var isCallable = function (fn) { return typeof fn === 'function' || toStr.call(fn) === '[object Function]' } var toInteger = function (value) { var number = Number(value) if (isNaN(number)) { return 0 } if (number === 0 || !isFinite(number)) { return number } return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)) } var maxSafeInteger = Math.pow(2, 53) - 1 var toLength = function (value) { var len = toInteger(value) return Math.min(Math.max(len, 0), maxSafeInteger) } // The length property of the from method is 1. return function from (arrayLike /*, mapFn, thisArg */) { // 1. Let C be the this value. var C = this // 2. Let items be ToObject(arrayLike). var items = Object(arrayLike) // 3. ReturnIfAbrupt(items). if (arrayLike == null) { throw new TypeError('Array.from requires an array-like object - not null or undefined') } // 4. If mapfn is undefined, then let mapping be false. var mapFn = arguments.length > 1 ? arguments[1] : void undefined var T if (typeof mapFn !== 'undefined') { // 5. else // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. if (!isCallable(mapFn)) { throw new TypeError('Array.from: when provided, the second argument must be a function') } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. if (arguments.length > 2) { T = arguments[2] } } // 10. Let lenValue be Get(items, "length"). // 11. Let len be ToLength(lenValue). var len = toLength(items.length) // 13. If IsConstructor(C) is true, then // 13. a. Let A be the result of calling the [[Construct]] internal method // of C with an argument list containing the single item len. // 14. a. Else, Let A be ArrayCreate(len). var A = isCallable(C) ? Object(new C(len)) : new Array(len) // 16. Let k be 0. var k = 0 // 17. Repeat, while k < len… (also steps a - h) var kValue while (k < len) { kValue = items[k] if (mapFn) { A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k) } else { A[k] = kValue } k += 1 } // 18. Let putStatus be Put(A, "length", len, true). A.length = len // 20. Return A. return A } }()) } // Production steps of ECMA-262, Edition 5, 15.4.4.18 // Reference: http://es5.github.io/#x15.4.4.18 if (!Array.prototype.forEach) { Array.prototype.forEach = function (callback /*, thisArg */) { var T, k if (this == null) { throw new TypeError('this is null or not defined') } // 1. Let O be the result of calling toObject() passing the // |this| value as the argument. var O = Object(this) // 2. Let lenValue be the result of calling the Get() internal // method of O with the argument "length". // 3. Let len be toUint32(lenValue). var len = O.length >>> 0 // 4. If isCallable(callback) is false, throw a TypeError exception. // See: http://es5.github.com/#x9.11 if (typeof callback !== 'function') { throw new TypeError(callback + ' is not a function') } // 5. If thisArg was supplied, let T be thisArg; else let // T be undefined. if (arguments.length > 1) { T = arguments[1] } // 6. Let k be 0. k = 0 // 7. Repeat while k < len. while (k < len) { var kValue // a. Let Pk be ToString(k). // This is implicit for LHS operands of the in operator. // b. Let kPresent be the result of calling the HasProperty // internal method of O with argument Pk. // This step can be combined with c. // c. If kPresent is true, then if (k in O) { // i. Let kValue be the result of calling the Get internal // method of O with argument Pk. kValue = O[k] // ii. Call the Call internal method of callback with T as // the this value and argument list containing kValue, k, and O. callback.call(T, kValue, k, O) } // d. Increase k by 1. k++ } // 8. return undefined. } } /*! https://mths.be/startswith v0.2.0 by @mathias */ if (!String.prototype.startsWith) { (function () { 'use strict' // needed to support `apply`/`call` with `undefined`/`null` var defineProperty = (function () { // IE 8 only supports `Object.defineProperty` on DOM elements try { var object = {} var $defineProperty = Object.defineProperty var result = $defineProperty(object, object, object) && $defineProperty } catch (error) {} return result }()) var toString = {}.toString var startsWith = function (search) { if (this == null) { throw TypeError() } var string = String(this) if (search && toString.call(search) === '[object RegExp]') { throw TypeError() } var stringLength = string.length var searchString = String(search) var searchLength = searchString.length var position = arguments.length > 1 ? arguments[1] : undefined // `ToInteger` var pos = position ? Number(position) : 0 if (pos !== pos) { // better `isNaN` pos = 0 } var start = Math.min(Math.max(pos, 0), stringLength) // Avoid the `indexOf` call if no match is possible if (searchLength + start > stringLength) { return false } var index = -1 while (++index < searchLength) { if (string.charCodeAt(start + index) !== searchString.charCodeAt(index)) { return false } } return true } if (defineProperty) { defineProperty(String.prototype, 'startsWith', { 'value': startsWith, 'configurable': true, 'writable': true }) } else { String.prototype.startsWith = startsWith } }()) } /*! * document.currentScript * Polyfill for `document.currentScript`. * Copyright (c) 2016 James M. Greene * Licensed MIT * https://github.com/JamesMGreene/document.currentScript * v1.1.0 */ (function () { // Live NodeList collection var scripts = document.getElementsByTagName('script') // Check if the browser supports the `readyState` property on `script` elements var supportsScriptReadyState = 'readyState' in (scripts[0] || document.createElement('script')) // Lousy browser detection for [not] Opera var isNotOpera = !window.opera || window.opera.toString() !== '[object Opera]' // Guaranteed accurate in IE 6-10. // Not supported in any other browsers. =( var canPolyfill = supportsScriptReadyState && isNotOpera // Attempt to retrieve the native `document.currentScript` accessor method var nativeCurrentScriptFn = (function (doc) { /* jshint proto:true */ var hasNativeMethod = 'currentScript' in doc var canGetDescriptor = typeof Object.getOwnPropertyDescriptor === 'function' var canGetPrototype = typeof Object.getPrototypeOf === 'function' var canUseDunderProto = typeof 'test'.__proto__ === 'object' function _invokeNativeCurrentScriptMethod () { var des, csFnIsNotOurs = true if (canGetDescriptor) { des = Object.getOwnPropertyDescriptor(doc, 'currentScript') || undefined if (des && typeof des.get === 'function' && des.get === _currentEvaluatingScript) { csFnIsNotOurs = false } } // Potentially dangerous hack... return csFnIsNotOurs ? doc.currentScript : null } function _getProto (obj) { var proto if (obj != null) { proto = ( canGetPrototype ? Object.getPrototypeOf(obj) : canUseDunderProto ? obj.__proto__ : obj.constructor != null ? obj.constructor.prototype : undefined ) } return proto } var nativeFn = (function _getCurrentScriptDef (docSelfOrAncestor, doc) { var des, cs if ( hasNativeMethod && canGetDescriptor && docSelfOrAncestor && docSelfOrAncestor !== Object.prototype && doc && doc !== Object.prototype ) { if (canGetDescriptor) { des = Object.getOwnPropertyDescriptor(docSelfOrAncestor, 'currentScript') || undefined if (des && typeof des.get === 'function') { cs = des.get } } if (!cs) { cs = _getCurrentScriptDef(_getProto(docSelfOrAncestor), doc) } } if (!cs) { cs = _invokeNativeCurrentScriptMethod } else if (cs === _currentEvaluatingScript) { cs = undefined } return cs })(doc, doc) return nativeFn })(document) // Top-level API (compliant with `document.currentScript` specifications) // // Get the currently "executing" (i.e. EVALUATING) `script` DOM // element, per the spec requirements for `document.currentScript`. // // IMPORTANT: This polyfill CANNOT achieve 100% accurate results // cross-browser. ;_; function _currentEvaluatingScript () { // Yes, this IS possible, i.e. if a script removes other scripts (or itself) if (scripts.length === 0) { return null } // Guaranteed accurate in IE 6-10. // Not supported in any other browsers. =( if (canPolyfill) { for (var i = scripts.length; i--;) { if (scripts[i] && scripts[i].readyState === 'interactive') { return scripts[i] } } } // If the native method exists, defer to that as a last-ditch effort if ( typeof nativeCurrentScriptFn === 'function' && _currentEvaluatingScript.doNotDeferToNativeMethod !== true ) { return nativeCurrentScriptFn.call(document) || null } // Any other attempts cannot be guaranteed and, as such, should be left out // from this "Strict Mode" behavior. // Alas, returning `null` here is not necessarily accurate either. // We could return `undefined` instead but that would not comply with the spec // in cases where it should correctly be returning `null`. return null } // Allow a last-ditch effort to use the native `document.currentScript` accessor // method (if it exists and can be retrieved)? _currentEvaluatingScript.doNotDeferToNativeMethod = false // Inspect the polyfill-ability of this browser var needsPolyfill = !('currentScript' in document) var canDefineProp = typeof Object.defineProperty === 'function' && (function () { var result try { Object.defineProperty(document, '_xyz', { get: function () { return 'blah' }, configurable: true }) result = document._xyz === 'blah' delete document._xyz } catch (e) { result = false } return result })() // Add the "private" property for testing, even if the real property can be polyfilled document._currentScript = _currentEvaluatingScript // Polyfill it! if (needsPolyfill && canDefineProp && typeof canPolyfill !== 'undefined' && canPolyfill) { Object.defineProperty(document, 'currentScript', { get: _currentEvaluatingScript }) } })() const revolugoIframe = document.createElement('iframe') revolugoIframe.setAttribute('frameborder', '0') revolugoIframe.setAttribute('width', '100%') revolugoIframe.setAttribute('height', '600px') let revolugoInlineStyle = 'border: 1px solid #dddddd; max-height: 80vh;' const currentScript = document._currentScript() const revolugoLangAttribute = Array.from(currentScript.attributes).find(attr => attr.name === 'data-lang') const revolugoLang = revolugoLangAttribute ? revolugoLangAttribute.value : undefined let revolugoIframeSrc = `https://platform.revolugo.com/${revolugoLang && ['en', 'fr'].includes(revolugoLang) ? `${revolugoLang}/` : ''}hotels?embedded=true` if (''.length) currentScript.setAttribute('data-wid', '') const wid = currentScript.attributes['data-wid'] && currentScript.attributes['data-wid'].value if (wid) currentScript.setAttribute('data-wid', wid) Array.from(currentScript.attributes).forEach(attr => { switch (attr.name) { case 'data-height': revolugoInlineStyle += `height: ${attr.value};` break default: if (attr.name.startsWith('data-')) revolugoIframeSrc += `&${attr.name.replace('data-', '')}=${attr.value}` } }) revolugoIframe.setAttribute('style', revolugoInlineStyle) revolugoIframe.setAttribute('src', encodeURI(revolugoIframeSrc)) let revolugoEmbedScriptTag = document.getElementById('revolugo-widget') if (!revolugoEmbedScriptTag) { const scriptTags = document.getElementsByTagName('script') for (var i = 0; i < scriptTags.length; i++) { if (scriptTags[i].src.indexOf('revolugo') > -1) { revolugoEmbedScriptTag = scriptTags[i] } } } if (revolugoEmbedScriptTag) { const parentTag = revolugoEmbedScriptTag.parentNode parentTag.appendChild(revolugoIframe) parentTag.removeChild(revolugoEmbedScriptTag) }