{"version":3,"file":"tp.widget.bootstrap.min.js","sources":["tp.widget.bootstrap.js"],"sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar EMPTY_WIDGET_ID = '000000000000000000000000';\nvar LAZY_LOADED_WIDGETS = ['54d39695764ea907c0f34825', '577258fb31f02306e4e3aaf9'];\n\nexports.EMPTY_WIDGET_ID = EMPTY_WIDGET_ID;\nexports.LAZY_LOADED_WIDGETS = LAZY_LOADED_WIDGETS;\n\n},{}],2:[function(require,module,exports){\n'use strict';\n\nvar hasCreatedJsonLd = false;\nfunction createJsonLdElement(jsonLdData) {\n  /* eslint-disable no-empty */\n  try {\n    if (hasCreatedJsonLd) {\n      return;\n    }\n\n    var jsonElement = document.createElement('script');\n    jsonElement.setAttribute('type', 'application/ld+json');\n    jsonElement.innerHTML = JSON.stringify(jsonLdData);\n    document.head.appendChild(document.createComment('Added by Trustpilot'));\n    document.head.appendChild(jsonElement);\n    document.head.appendChild(document.createComment('/Added by Trustpilot'));\n    hasCreatedJsonLd = true;\n  } catch (ignoreIE8) {}\n  /* eslint-enable no-empty */\n}\n\nvar xhr = require('./xhr.js');\n\nfunction getLocalBusinessSnippet(_ref) {\n  var businessunitId = _ref.businessunitId,\n      location = _ref.location,\n      locale = _ref.locale,\n      templateId = _ref.templateId;\n\n  var params = ['url=' + encodeURIComponent(window.location.href), 'templateId=' + templateId, 'locale=' + locale].join('&');\n  var locationPath = '/data/jsonld/business-unit/' + businessunitId + '/location/' + location;\n  var url = '#{WidgetRoot}' + locationPath + '?' + params;\n\n  xhr.xhrGet({\n    url: url,\n    success: function success(data) {\n      data.url = document.location.href;\n      data['@id'] = document.location.href;\n      createJsonLdElement(data, null);\n    },\n    error: function error(data) {\n      // eslint-disable-next-line\n      console.error(data);\n    }\n  });\n}\n\nfunction getProductSnippet(_ref2) {\n  var businessunitId = _ref2.businessunitId,\n      locale = _ref2.locale,\n      templateId = _ref2.templateId,\n      name = _ref2.name,\n      sku = _ref2.sku,\n      reviewnumber = _ref2.reviewnumber,\n      price = _ref2.price,\n      priceCurrency = _ref2.priceCurrency,\n      availability = _ref2.availability;\n\n  var language = locale && locale.split('-')[0];\n\n  var includeImported = templateId === '5763bccae0a06d08e809ecbb'; // multisource seo\n  var regularPath = '/data/jsonld/business-unit/' + businessunitId + '/product';\n  var importedPath = '/data/jsonld/business-unit/' + businessunitId + '/product-imported';\n  var path = includeImported ? importedPath : regularPath;\n\n  var url = '#{WidgetRoot}' + path + '?sku=' + encodeURIComponent(sku) + '&numberOfReviews=' + (reviewnumber || 10) + (name ? '&productName=' + encodeURIComponent(name) : '') + '&language=' + language + '&templateId=' + templateId + '&url=' + encodeURIComponent(window.location.origin + window.location.pathname);\n\n  var offer = price && priceCurrency && availability ? {\n    '@type': 'Offer',\n    priceCurrency: priceCurrency,\n    price: price,\n    availability: availability\n  } : null;\n\n  xhr.xhrGet({\n    url: url,\n    success: function success(data) {\n      if (offer) {\n        data.offers = offer;\n      }\n      // Structured Data rules: Either ‘offers’, ‘review’ or ‘aggregateRating’ should be specified\n      if (data.offers || data.review || data.aggregateRating) {\n        createJsonLdElement(data, offer);\n      }\n    },\n    error: function error(data) {\n      // eslint-disable-next-line\n      console.error(data);\n    }\n  });\n}\n\nvar snippet = function snippet(dataset) {\n  if (hasCreatedJsonLd) {\n    // in case there's a second widget with snippet markup\n    return false;\n  }\n\n  var isPRCarousel = dataset.templateId === '60f537b5b0f1639de1fe048c'; // PR Carousel\n\n  if (dataset.schemaType && dataset.location) {\n    // LocalBusiness JSON-LD\n    getLocalBusinessSnippet(dataset);\n    return true;\n  } else if (dataset.sku) {\n    if (dataset.name || isPRCarousel && dataset.schemaType === 'Product') {\n      // product JSON-LD\n      getProductSnippet(dataset);\n      return true;\n    }\n  }\n  return false;\n};\n\nmodule.exports = snippet;\n\n},{\"./xhr.js\":7}],3:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _snippets = require('./snippets');\n\nvar _snippets2 = _interopRequireDefault(_snippets);\n\nvar _widget = require('./widget');\n\nvar _widget2 = _interopRequireDefault(_widget);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar WidgetManagement = function () {\n  function WidgetManagement(window, document, version) {\n    _classCallCheck(this, WidgetManagement);\n\n    this.window = window;\n    this.document = document;\n    this.widgets = [];\n    this.stats = {\n      applied: 0,\n      findAndApplyCalls: 0,\n      applyFromDomCalls: 0,\n      elements: 0\n    };\n    this.version = version;\n  }\n\n  /**\n   * Check the state of loading, and then initialize the widgets on the page.\n   */\n\n\n  _createClass(WidgetManagement, [{\n    key: 'initializeOnPageLoad',\n    value: function initializeOnPageLoad() {\n      if (this.document.readyState !== 'loading') {\n        this.findAndApplyWidgets();\n      } else {\n        this.document.addEventListener('DOMContentLoaded', this.findAndApplyWidgets.bind(this));\n      }\n    }\n\n    /**\n     * Create a widget at a given DOM element.\n     *\n     * This method will construct a widget on a DOM element. If it has already\n     * been loaded, it will only be created if the forceReload flag is true.\n     *\n     * @param {HTMLElement} element - The DOM element on which to create a widget\n     * @param {Boolean} forceReload - Flag whether to force a reload of an\n     * already existing widget\n     */\n\n  }, {\n    key: 'applyWidgetFromDomElement',\n    value: function applyWidgetFromDomElement(element, forceReload) {\n      var alreadyLoaded = element.firstChild && element.firstChild.tagName === 'IFRAME';\n\n      if (alreadyLoaded && !forceReload) {\n        return;\n      }\n\n      this.createWidget(element);\n    }\n\n    /**\n     * Find all widget container elements and initalize widgets in each.\n     *\n     * This method is called by some of our clients when using SPAs. We should\n     * treat this as a documented public method and ensure it works consistently\n     * and properly.\n     */\n\n  }, {\n    key: 'findAndApplyWidgets',\n    value: function findAndApplyWidgets() {\n      var _this = this;\n\n      this.stats.findAndApplyCalls += 1;\n      var elements = this.widgetElements;\n\n      if (!elements || elements.length === 0) {\n        return;\n      }\n      this.stats.elements = elements.length;\n      elements.forEach(function (element) {\n        return _this.createWidget(element);\n      });\n    }\n\n    /**\n     * Create a widget at the given element.\n     *\n     * Takes a DOM element and constructs a widget at that element.\n     */\n\n  }, {\n    key: 'createWidget',\n    value: function createWidget(element) {\n      this.removeWidget(element);\n\n      var dataset = element.dataset;\n      (0, _snippets2.default)(dataset);\n\n      var widgetArgs = { container: element, dataset: dataset };\n      var widget = new _widget2.default(widgetArgs);\n      widget.initialize();\n\n      this.stats.applied += 1;\n      this.stats.applyFromDomCalls += 1;\n      this.widgets.push(widget);\n\n      return widget;\n    }\n\n    /**\n     * Remove a widget element from the DOM.\n     */\n\n  }, {\n    key: 'removeWidget',\n    value: function removeWidget(element) {\n      while (element.firstChild) {\n        element.removeChild(element.firstChild);\n      }\n\n      // Clean up lazy loaded widgets\n      this.widgets.filter(function (widget) {\n        return widget.isLazyLoaded && widget.isSameNodeAs(element);\n      }).forEach(function (widget) {\n        widget.destroy();\n      });\n    }\n\n    /**\n     * Close all open popups.\n     */\n\n  }, {\n    key: 'closePopups',\n    value: function closePopups() {\n      this.widgets.forEach(function (widget) {\n        return widget.closePopup();\n      });\n    }\n  }, {\n    key: 'businessUnitId',\n    get: function get() {\n      return this.widgetElements[0].dataset.businessunitId;\n    }\n  }, {\n    key: 'widgetElements',\n    get: function get() {\n      return [].slice.call(this.document.getElementsByClassName('trustpilot-widget'));\n    }\n  }]);\n\n  return WidgetManagement;\n}();\n\nexports.default = WidgetManagement;\n\n},{\"./snippets\":2,\"./widget\":5}],4:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar widgetHtmlFile = 'index.html';\nvar widgetHtmlAllowRobotsFile = 'index_allow_robots.html';\nvar widgetIFrameOrigin = '#{WidgetRoot}';\nvar widgetBaseUrl = '#{WidgetRoot}/trustboxes';\nvar widgetsThatCanAllowRobots = '#{WidgetsThatCanAllowRobots}'.split(',');\n\nfunction makeIframeElement(options) {\n  var iframe = document.createElement('iframe');\n  iframe.style.position = options.position;\n  iframe.style.zIndex = options.zindex;\n  iframe.style.margin = options.margin;\n  iframe.style.top = options.top;\n  iframe.style.bottom = options.bottom;\n  iframe.style.left = options.left;\n  iframe.style.right = options.right;\n  iframe.style.height = options.height;\n  iframe.style.width = options.width;\n  iframe.style.minHeight = options.minHeight;\n  iframe.style.minWidth = options.minWidth;\n  iframe.style.borderStyle = options.borderStyle;\n  iframe.style.backgroundColor = options.backgroundColor;\n  iframe.style.display = options.display;\n  iframe.style.overflow = options.overflow;\n  iframe.allowTransparency = options.allowTransparency;\n  iframe.title = 'Customer reviews powered by Trustpilot';\n  iframe.loading = options.loading || 'auto';\n  iframe.src = options.src;\n\n  if (options.allow) {\n    iframe.allow = options.allow;\n  }\n\n  return iframe;\n}\n\nfunction getAttributeValue(attribute) {\n  var suffixRegEx = /(px|\\%)/i;\n  var value = '';\n\n  if (attribute && attribute.length > 0) {\n    attribute = attribute.toLowerCase();\n    if (suffixRegEx.test(attribute)) {\n      value = attribute;\n    } else {\n      value = attribute + 'px';\n    }\n  }\n  return value;\n}\n\nvar IFrame = function () {\n  function IFrame(name, dataset, iframeData) {\n    var isScrollBlocking = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n    _classCallCheck(this, IFrame);\n\n    this.OVERFLOW_PROPERTIES = ['overflow', 'overflow-x', 'overflow-y'];\n\n    this.name = name;\n    this.dataset = dataset;\n    this.iframeData = iframeData || this.defaultIframeOptions;\n    this.defaultOverflowProperties = {};\n    this.isVisible = false;\n    this.isScrollBlocking = isScrollBlocking;\n  }\n\n  _createClass(IFrame, [{\n    key: 'getIframeOptionsFromData',\n    value: function getIframeOptionsFromData() {\n      var iframeData = this.iframeData || { styles: {} };\n      return _extends({}, this.defaultIframeOptions, {\n        position: iframeData.styles.position || '',\n        zindex: iframeData.styles.zindex || '',\n        margin: iframeData.styles.margin || '',\n        top: iframeData.styles.top || '',\n        bottom: iframeData.styles.bottom || '',\n        left: iframeData.styles.left || '',\n        right: iframeData.styles.right || '',\n        height: iframeData.styles.height || '',\n        width: iframeData.styles.width || this.defaultIframeOptions.styles.width || '',\n        minWidth: iframeData.styles.minWidth || '',\n        minHeight: iframeData.styles.minHeight || '',\n        display: iframeData.show ? 'block' : 'none',\n        src: this.baseUrl + iframeData.source + this.queryString,\n        borderStyle: this.defaultIframeOptions.styles.borderStyle,\n        overflow: this.defaultIframeOptions.styles.overflow,\n        loading: this.dataset.loading,\n        allow: iframeData.allow\n      });\n    }\n  }, {\n    key: 'initialize',\n    value: function initialize(container, onLoad) {\n      this._iframe = makeIframeElement(this.getIframeOptionsFromData());\n\n      container.appendChild(this._iframe);\n      this._iframe.addEventListener('load', onLoad);\n    }\n  }, {\n    key: 'sendMessage',\n    value: function sendMessage(message) {\n      if (this._iframe.contentWindow) {\n        message = JSON.stringify(message); // This is to make it IE8 compatible\n        this._iframe.contentWindow.postMessage(message, widgetIFrameOrigin);\n      }\n    }\n  }, {\n    key: 'isInViewport',\n    value: function isInViewport(allowance) {\n      var rect = this._iframe.getBoundingClientRect();\n\n      var rectSize = {\n        width: rect.width || this._iframe.offsetWidth,\n        height: rect.height || this._iframe.offsetHeight\n      };\n\n      return rect.top >= 0 && rect.left >= 0 && rect.bottom - rectSize.height * allowance <= (window.innerHeight || document.documentElement.clientHeight) && rect.right - rectSize.width * allowance <= (window.innerWidth || document.documentElement.clientWidth);\n    }\n  }, {\n    key: 'setWidgetId',\n    value: function setWidgetId(widgetId) {\n      this.sendMessage({ command: 'setId', widgetId: widgetId });\n    }\n  }, {\n    key: 'setStyle',\n    value: function setStyle(styles) {\n      var _this = this;\n\n      Object.keys(styles).forEach(function (property) {\n        var style = styles[property];\n        _this._iframe.style[property] = style;\n      });\n    }\n  }, {\n    key: 'isScrollBlockingPopup',\n    value: function isScrollBlockingPopup() {\n      return this.name === 'popup' && this.isScrollBlocking;\n    }\n  }, {\n    key: 'disablePageScroll',\n    value: function disablePageScroll() {\n      this.defaultOverflowProperties = this.OVERFLOW_PROPERTIES.reduce(function (dict, property) {\n        dict[property] = document.body.style.getPropertyValue(property);\n        return dict;\n      }, {});\n      document.body.style.overflow = 'hidden';\n    }\n  }, {\n    key: 'restorePageScroll',\n    value: function restorePageScroll() {\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = this.OVERFLOW_PROPERTIES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var property = _step.value;\n\n          document.body.style.removeProperty(property);\n          if (this.defaultOverflowProperties[property]) {\n            document.body.style.setProperty(property, this.defaultOverflowProperties[property]);\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: 'show',\n    value: function show() {\n      if (this.isScrollBlockingPopup() && !this.isVisible) {\n        this.disablePageScroll();\n      }\n      this._iframe.style.display = 'block';\n      this.isVisible = true;\n    }\n  }, {\n    key: 'hide',\n    value: function hide() {\n      if (this.isScrollBlockingPopup() && this.isVisible) {\n        this.restorePageScroll();\n      }\n      this._iframe.style.display = 'none';\n      this.isVisible = false;\n    }\n  }, {\n    key: 'focus',\n    value: function focus() {\n      this._iframe.contentWindow.focus();\n    }\n  }, {\n    key: 'resizeHeight',\n    value: function resizeHeight(height) {\n      if (typeof height !== 'number' || height === 0) {\n        return;\n      }\n      this._iframe.style.height = height + 'px';\n    }\n  }, {\n    key: '_shouldAllowRobots',\n    value: function _shouldAllowRobots() {\n      return this.dataset.allowRobots === 'true' && this.dataset.location && widgetsThatCanAllowRobots.indexOf(this.templateId) > -1;\n    }\n  }, {\n    key: 'dimensions',\n    get: function get() {\n      return {\n        height: getAttributeValue(this.dataset.styleHeight),\n        width: getAttributeValue(this.dataset.styleWidth)\n      };\n    }\n\n    /**\n     * Get the query string for populating this iframe's URL.\n     *\n     * The query string also includes hash parameters. These are used to ensure\n     * that the URL does not contain unneeded query params for fetching the\n     * Trustbox HTML itself as we include a number of parameters only needed for\n     * making the TrustBox data call.\n     */\n\n  }, {\n    key: 'queryString',\n    get: function get() {\n      var _this2 = this;\n\n      var mkPair = function mkPair(attribute) {\n        return attribute + '=' + encodeURIComponent(_this2.dataset[attribute]);\n      };\n      var mkPairs = function mkPairs(p) {\n        return Object.keys(_this2.dataset).filter(p).map(mkPair);\n      };\n\n      var searchKeys = ['businessunitId', 'templateId'];\n      var searchPairs = mkPairs(function (k) {\n        return searchKeys.indexOf(k) !== -1;\n      });\n      var hashPairs = mkPairs(function (k) {\n        return searchKeys.indexOf(k) === -1 && k !== 'allowRobots';\n      });\n      return '?' + searchPairs.join('&') + '#' + hashPairs.join('&');\n    }\n  }, {\n    key: 'templateId',\n    get: function get() {\n      return this.dataset.templateId;\n    }\n  }, {\n    key: 'baseUrl',\n    get: function get() {\n      return widgetBaseUrl + '/' + this.templateId + '/';\n    }\n  }, {\n    key: 'defaultIframeOptions',\n    get: function get() {\n      return {\n        source: this._shouldAllowRobots() ? widgetHtmlAllowRobotsFile : widgetHtmlFile,\n        allowTransparency: 'true',\n        styles: {\n          borderStyle: 'none',\n          backgroundColor: 'transparent',\n          display: 'block',\n          overflow: 'hidden',\n          height: this.dimensions.height,\n          width: this.dimensions.width,\n          position: 'relative'\n        },\n        show: true\n      };\n    }\n  }]);\n\n  return IFrame;\n}();\n\nexports.default = IFrame;\n\n},{}],5:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _tracking = require('./tracking');\n\nvar _tracking2 = _interopRequireDefault(_tracking);\n\nvar _iframe = require('./iframe');\n\nvar _iframe2 = _interopRequireDefault(_iframe);\n\nvar _constants = require('./../constants');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Widget = function () {\n  _createClass(Widget, null, [{\n    key: 'generateId',\n    value: function generateId() {\n      var usedIds = this.usedIds;\n      var currId = void 0;\n      do {\n        currId = Math.random();\n      } while (usedIds.indexOf(currId) !== -1);\n      return this.usedIds.push(currId);\n    }\n  }]);\n\n  function Widget(_ref) {\n    var _this = this;\n\n    var container = _ref.container,\n        dataset = _ref.dataset,\n        session = _ref.session,\n        anonymousId = _ref.anonymousId,\n        testId = _ref.testId,\n        sessionExpiry = _ref.sessionExpiry;\n\n    _classCallCheck(this, Widget);\n\n    // Check for required args\n    var requiredArgs = {\n      container: container,\n      dataset: dataset,\n      templateId: dataset.templateId,\n      businessUnitId: dataset.businessunitId,\n      locale: dataset.locale\n    };\n    Object.keys(requiredArgs).forEach(function (arg) {\n      if (!requiredArgs[arg]) {\n        throw 'No ' + arg + ' supplied for TrustBox';\n      }\n    });\n\n    this.container = container;\n    this.container.style.position = 'relative';\n\n    this.dataset = dataset;\n    this.iframes = {};\n    this.tracking = new _tracking2.default(function (payload) {\n      return _this.iframes.main.sendMessage(payload);\n    }, function () {\n      return _this.isInViewport(0.5);\n    }, {\n      session: session,\n      group: dataset.group,\n      sessionExpiry: sessionExpiry,\n      anonymousId: anonymousId,\n      testId: testId,\n      templateId: dataset.templateId\n    });\n    this.isLazyLoaded = _constants.LAZY_LOADED_WIDGETS.indexOf(dataset.templateId) > -1;\n    this.lazyLoadTimeout = null;\n    this.isSameNodeAs = this.isSameNodeAs.bind(this);\n    this.destroy = this.destroy.bind(this);\n\n    this.stats = { createIFrameCalls: 0, iframeLoadEvents: 0, events: {}, pongSent: false };\n    // Doing this only once before putting in the event loop\n    this.initialize = this.initialize.bind(this);\n  }\n\n  _createClass(Widget, [{\n    key: 'isContainerInViewport',\n    value: function isContainerInViewport() {\n      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 200;\n\n      var rect = this.container.getBoundingClientRect();\n\n      var rectSize = {\n        width: rect.width || this.container.offsetWidth,\n        height: rect.height || this.container.offsetHeight\n      };\n\n      return rect.top >= 0 && rect.left >= 0 && rect.bottom - rectSize.height - offset <= (window.innerHeight || document.documentElement.clientHeight) && rect.right - rectSize.width - offset <= (window.innerWidth || document.documentElement.clientWidth);\n    }\n  }, {\n    key: 'initialize',\n    value: function initialize() {\n      if (!this.isLazyLoaded || this.isContainerInViewport()) {\n        this._widgetIFrameOrigin = '#{WidgetRoot}';\n        this.createIFrame('main');\n        this.attachMessageListener();\n      } else {\n        this.lazyLoadTimeout = setTimeout(this.initialize, 500);\n      }\n    }\n  }, {\n    key: 'handleCommand',\n    value: function handleCommand(_ref2) {\n      var data = _ref2.data,\n          origin = _ref2.origin;\n\n      try {\n        var parsedData = typeof data === 'string' ? JSON.parse(data) : data;\n        // Check if event is valid, i.e. it has a correct origin and widgetId.\n        var isValidEvent = origin === this._widgetIFrameOrigin && parsedData.widgetId === this.id;\n        if (!isValidEvent) {\n          return false;\n        }\n        return this.widgetIframeMessageHandler(parsedData);\n      } catch (ex) {\n        // eslint-disable-next-line\n        return false;\n      }\n    }\n  }, {\n    key: 'attachMessageListener',\n    value: function attachMessageListener() {\n      window.addEventListener('message', this.handleCommand.bind(this), false);\n    }\n\n    /**\n     * Handle messages intended for widgets/iframes.\n     *\n     * @param {Object} data - The message received.\n     * @param {Function} fallback - An optional function called where no matching\n     * action is found for the message received.\n     */\n\n  }, {\n    key: 'widgetIframeMessageHandler',\n    value: function widgetIframeMessageHandler(data) {\n      var _this2 = this;\n\n      var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n\n      this.stats.events[data.command] = (this.stats.events[data.command] || 0) + 1;\n      var name = data.name,\n          style = data.style,\n          height = data.height,\n          targets = data.targets,\n          attachToBody = data.attachToBody;\n\n      var targetIFrame = this.iframes[name];\n\n      var actions = {\n        createIFrame: function createIFrame() {\n          return _this2.createIFrame(name, data, attachToBody);\n        },\n        setStyle: function setStyle() {\n          return targetIFrame.setStyle(style);\n        },\n        show: function show() {\n          return targetIFrame.show();\n        },\n        hide: function hide() {\n          return targetIFrame.hide();\n        },\n        focus: function focus() {\n          return targetIFrame.focus();\n        },\n        loaded: function loaded() {\n          return _this2.iframes.main.sendMessage('loaded');\n        },\n        message: function message() {\n          return targetIFrame.sendMessage(data);\n        },\n        ping: function ping() {\n          _this2.iframes.main.sendMessage({ command: 'pong' });\n          _this2.stats.pongSent = true;\n        },\n        'resize-height': function resizeHeight() {\n          return _this2.getIframeOrMain(name).resizeHeight(height);\n        },\n        impression: function impression() {\n          return _this2.tracking.initialize();\n        },\n        scrollTo: function scrollTo() {\n          return _this2.scrollToTrustBox(targets);\n        }\n      };\n\n      var action = actions[data.command];\n      if (action) {\n        action();\n        return true;\n      }\n\n      fallback();\n      return false;\n    }\n  }, {\n    key: 'createIFrame',\n    value: function createIFrame(name, iframeData) {\n      var _this3 = this;\n\n      var attachToBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var iframe = new _iframe2.default(name, this.dataset, iframeData, attachToBody);\n      this.iframes[name] = iframe;\n\n      this.stats.createIFrameCalls += 1;\n      iframe.initialize(attachToBody ? document.body : this.container, function () {\n        iframe.setWidgetId(_this3.id);\n        _this3.stats.iframeLoadEvents += 1;\n      });\n    }\n  }, {\n    key: 'getIframeOrMain',\n    value: function getIframeOrMain(iframeName) {\n      return this.iframes[iframeName] || this.iframes.main;\n    }\n  }, {\n    key: 'isInViewport',\n    value: function isInViewport(allowance) {\n      return this.iframes.main.isInViewport(allowance);\n    }\n  }, {\n    key: 'isSameNodeAs',\n    value: function isSameNodeAs(element) {\n      try {\n        return this.container.isSameNode(element);\n      } catch (e) {\n        return false;\n      }\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.lazyLoadTimeout) {\n        clearTimeout(this.lazyLoadTimeout);\n      }\n    }\n  }, {\n    key: 'closePopup',\n    value: function closePopup() {\n      // Only execute if we have a popup iframe\n      if ('popup' in this.iframes) {\n        // Message payload used to signal to the main iframe that a popup\n        // has been closed. This mirrors the message defined in the vanilla\n        // framework at\n        // https://github.com/trustpilot/node-trustbox-framework-vanilla/blob/09d18b9d3a8032bca52c87a9ad0364e464db2c3d/modules/communication.js#L85function.\n        var mainPayload = {\n          name: 'main',\n          command: 'message',\n          message: 'popup toggled',\n          visible: false\n        };\n        this.iframes.main.sendMessage(mainPayload);\n        this.iframes.popup.hide();\n      }\n    }\n  }, {\n    key: 'scrollToTrustBox',\n    value: function scrollToTrustBox() {\n      var templateIds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n      var elem = document.querySelector(templateIds.map(function (t) {\n        return '[data-template-id=\\'' + t + '\\']';\n      }).join(','));\n      if (elem) {\n        var iframe = elem.querySelector('iframe');\n        if (iframe) {\n          elem.scrollIntoView({ behavior: 'smooth' });\n          iframe.contentWindow.focus();\n        }\n      }\n    }\n  }, {\n    key: 'id',\n    get: function get() {\n      if (!this._id) {\n        this._id = this.constructor.generateId();\n      }\n      return this._id;\n    }\n  }]);\n\n  return Widget;\n}();\n\nWidget.usedIds = [];\nexports.default = Widget;\n\n},{\"./../constants\":1,\"./iframe\":4,\"./tracking\":6}],6:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _constants = require('../constants');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Tracking = function () {\n  function Tracking(sendMessage, isTrustBoxVisible, _ref) {\n    var session = _ref.session,\n        sessionExpiry = _ref.sessionExpiry,\n        group = _ref.group,\n        anonymousId = _ref.anonymousId,\n        testId = _ref.testId,\n        templateId = _ref.templateId;\n\n    _classCallCheck(this, Tracking);\n\n    this.hasSentImpression = false;\n    this.hasSentViewTracking = false;\n    this.sendMessage = sendMessage;\n    this.isTrustBoxVisible = isTrustBoxVisible;\n\n    this.session = session;\n    this.group = group;\n    this.sessionExpiry = sessionExpiry;\n    this.anonymousId = anonymousId;\n    this.testId = testId;\n    this.templateId = templateId;\n  }\n\n  /**\n   * Initialize a Tracking instance.\n   *\n   * This should only be called once the TrustBox has indicated it is ready to\n   * handle tracking events.\n   */\n\n\n  _createClass(Tracking, [{\n    key: 'initialize',\n    value: function initialize() {\n      this.sendImpressionData();\n      this.attachListener();\n      this.shouldDetachListener();\n    }\n  }, {\n    key: 'getTrackingData',\n    value: function getTrackingData(commandName) {\n      var data = {\n        command: commandName,\n        url: window.document.URL,\n        referrer: window.document.referrer,\n        userAgent: window.navigator.userAgent,\n        language: window.navigator.userLanguage || window.navigator.language,\n        platform: window.navigator.platform\n      };\n\n      if (this.session && this.group) {\n        data.session = this.session;\n        data.sessionExpiry = this.sessionExpiry;\n      }\n\n      if (this.anonymousId) {\n        data.anonymousId = this.anonymousId;\n      }\n\n      if (this.testId) {\n        data.testId = this.testId;\n      }\n\n      return data;\n    }\n  }, {\n    key: 'sendImpressionData',\n    value: function sendImpressionData() {\n      if (this.hasSentImpression) {\n        return;\n      }\n      this.hasSentImpression = true;\n\n      var data = this.getTrackingData('impression-received');\n      this.sendMessage(data);\n    }\n  }, {\n    key: 'sendVisibilityData',\n    value: function sendVisibilityData() {\n      if (this.hasSentViewTracking) {\n        return;\n      }\n      this.hasSentViewTracking = true;\n\n      var data = this.getTrackingData('trustbox-in-viewport');\n      this.sendMessage(data);\n    }\n  }, {\n    key: 'attachListener',\n    value: function attachListener() {\n      var _arguments = arguments,\n          _this = this;\n\n      var debounce = function debounce(func, wait) {\n        var timeout = void 0;\n        return function () {\n          var args = _arguments;\n          var later = function later() {\n            timeout = null;\n            func(args);\n          };\n          clearTimeout(timeout);\n          timeout = setTimeout(later, wait);\n        };\n      };\n\n      var checkViewPortVisibility = debounce(function () {\n        var isEmptyWidget = _this.templateId === _constants.EMPTY_WIDGET_ID; // Filter out empty iframe widgets from the view tracking\n        var removeListener = isEmptyWidget || _this.shouldDetachListener();\n        if (removeListener) {\n          /* eslint-disable */\n          window.removeEventListener('scroll', scrollEventListener, eventOptions);\n          window.removeEventListener('resize', resizeEventListener, eventOptions);\n          /* eslint-enable */\n        }\n      }, 100);\n\n      var eventOptions = { passive: true, capture: false };\n      var scrollEventListener = window.addEventListener('scroll', checkViewPortVisibility, eventOptions);\n      var resizeEventListener = window.addEventListener('resize', checkViewPortVisibility, eventOptions);\n      checkViewPortVisibility();\n    }\n\n    /**\n     * Track the visibility of the TrustBox.\n     *\n     * What this method actually does is set the current 'seen' state of the\n     * TrustBox, and returns a boolean flag which can be used to determine\n     * whether or not to continue listening for visibility events and calling\n     * this method.\n     */\n\n  }, {\n    key: 'shouldDetachListener',\n    value: function shouldDetachListener() {\n      // we can't send the view data until the iframe is ready to receive it.\n      // We're using `hasSentImpression` to know it's loaded and rely on the\n      // `impression` message handler to call us when that changes.\n      if (this.hasSentViewTracking) {\n        return true;\n      }\n\n      // already detected it, weren't ready to send earlier though\n      if (this.hasBeenVisible) {\n        if (this.hasSentImpression) {\n          this.sendVisibilityData();\n        }\n        return true;\n      }\n\n      if (!this.isTrustBoxVisible()) {\n        return false;\n      }\n\n      if (!this.hasSentImpression) {\n        this.hasBeenVisible = true;\n        return true;\n      }\n\n      this.sendVisibilityData();\n      return true;\n    }\n  }]);\n\n  return Tracking;\n}();\n\nexports.default = Tracking;\n\n},{\"../constants\":1}],7:[function(require,module,exports){\n'use strict';\n\nfunction parse(req) {\n  try {\n    return JSON.parse(req.responseText);\n  } catch (e) {\n    return req.responseText;\n  }\n}\n\nfunction xhrGet(params) {\n  var request = new window.XMLHttpRequest();\n  request.open('GET', params.url, true);\n  request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n  request.onreadystatechange = function () {\n    if (request.readyState === 4) {\n      if (request.status >= 200 && request.status < 300) {\n        params.success(parse(request));\n      } else if (params.error) {\n        params.error(parse(request));\n      }\n    }\n  };\n  request.send();\n}\n\nmodule.exports = { xhrGet: xhrGet };\n\n},{}],8:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/* eslint global-require: 0 */\n(function (currentVersion) {\n  try {\n    (function () {\n      var WidgetManagement = require('./lib/widget-management.js').default;\n\n      var isLoaded = window.Trustpilot && Object.keys(window.Trustpilot).length > 0;\n      window.Trustpilot = isLoaded ? window.Trustpilot : {\n        loadFromElement: function loadFromElement(element, forceReload) {\n          if (!element) {\n            // eslint-disable-next-line\n            console.error('No element supplied to \"Trustpilot.loadFromElement\"');\n            return;\n          }\n          return this.Modules.WidgetManagement && this.Modules.WidgetManagement.applyWidgetFromDomElement(element, forceReload);\n        }\n      };\n      window.Trustpilot.Modules = window.Trustpilot.Modules || {};\n\n      if (!window.Trustpilot.Modules.WidgetManagement) {\n        window.Trustpilot.Modules.WidgetManagement = new WidgetManagement(window, document, currentVersion);\n        window.Trustpilot.Modules.WidgetManagement.initializeOnPageLoad();\n\n        // Use as a fallback. Try to load trustbox no matter what\n        window.addEventListener('load', function () {\n          try {\n            var elementArray = document.getElementsByClassName('trustpilot-widget');\n            for (var i = 0; i < elementArray.length; ++i) {\n              var trustbox = elementArray[i];\n              var tagName = trustbox.firstChild && trustbox.firstChild.tagName;\n              if (tagName && tagName !== 'IFRAME') {\n                window.Trustpilot.loadFromElement(trustbox);\n              }\n            }\n          } catch (e) {\n            // eslint-disable-next-line\n            console.error('Error loading trustboxes ' + e);\n          }\n        });\n      } else if (window.Trustpilot.Modules.WidgetManagement.version !== currentVersion) {\n        // eslint-disable-next-line\n        console.log('Detected legacy TrustBox bootstrap with version:', window.Trustpilot.Modules.WidgetManagement.version, ', current:', currentVersion);\n      }\n      window.addEventListener('click', function () {\n        window.Trustpilot.Modules.WidgetManagement.closePopups();\n      });\n    })();\n  } catch (e) {\n    (function () {\n      function postError(message) {\n        // eslint-disable-next-line\n        console.error('Error on bootstrap:' + message);\n\n        var url = '#{WidgetRoot}/feedback/report-error';\n        var params = ['error=' + encodeURIComponent(message), 'uri=' + encodeURIComponent(document.URL), 'bootstrapVersion=' + currentVersion].join('&');\n\n        var img = document.createElement('img');\n        img.src = url + '?' + params;\n      }\n\n      try {\n        if ((typeof e === 'undefined' ? 'undefined' : _typeof(e)) === 'object') {\n          postError(e.message);\n        } else {\n          postError(e);\n        }\n      } catch (e) {\n        // eslint-disable-next-line\n        console.error('Error on error reporting method:' + e);\n      }\n    })();\n  }\n})('#{Octopus.Release.Number}');\n\n},{\"./lib/widget-management.js\":3}]},{},[8]);\n"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","Object","defineProperty","value","EMPTY_WIDGET_ID","LAZY_LOADED_WIDGETS","2","hasCreatedJsonLd","createJsonLdElement","jsonLdData","jsonElement","document","createElement","setAttribute","innerHTML","JSON","stringify","head","appendChild","createComment","ignoreIE8","xhr","dataset","reviewnumber","price","priceCurrency","offer","_ref","businessunitId","location","locale","isPRCarousel","templateId","schemaType","params","encodeURIComponent","window","href","join","xhrGet","url","success","data","error","console","sku","name","_ref2","availability","language","split","origin","pathname","@type","offers","review","aggregateRating","./xhr.js","3","_createClass","Constructor","protoProps","staticProps","defineProperties","prototype","target","props","descriptor","enumerable","configurable","writable","key","_snippets2","_interopRequireDefault","_widget2","obj","__esModule","default","WidgetManagement","this","readyState","findAndApplyWidgets","addEventListener","bind","element","forceReload","firstChild","tagName","createWidget","_this","elements","stats","findAndApplyCalls","widgetElements","forEach","removeWidget","widget","container","initialize","applied","applyFromDomCalls","widgets","push","removeChild","filter","isLazyLoaded","isSameNodeAs","destroy","closePopup","get","slice","getElementsByClassName","version","TypeError","./snippets","./widget","4","_extends","assign","arguments","source","hasOwnProperty","widgetsThatCanAllowRobots","getAttributeValue","attribute","toLowerCase","test","IFrame","iframeData","styles","defaultIframeOptions","position","zindex","margin","top","bottom","left","right","height","width","minWidth","minHeight","display","show","src","baseUrl","queryString","borderStyle","overflow","loading","allow","onLoad","options","iframe","_iframe","getIframeOptionsFromData","style","zIndex","backgroundColor","allowTransparency","title","message","contentWindow","postMessage","allowance","rect","getBoundingClientRect","rectSize","offsetWidth","offsetHeight","innerHeight","documentElement","clientHeight","innerWidth","clientWidth","widgetId","sendMessage","command","keys","property","isScrollBlocking","defaultOverflowProperties","OVERFLOW_PROPERTIES","reduce","dict","body","getPropertyValue","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","Symbol","iterator","next","done","removeProperty","setProperty","err","return","isScrollBlockingPopup","isVisible","disablePageScroll","restorePageScroll","focus","allowRobots","indexOf","styleHeight","styleWidth","mkPair","_this2","mkPairs","map","searchKeys","searchPairs","k","hashPairs","widgetBaseUrl","_shouldAllowRobots","dimensions","instance","5","_tracking2","_iframe2","_constants","Widget","usedIds","currId","Math","random","offset","isContainerInViewport","_widgetIFrameOrigin","createIFrame","attachMessageListener","lazyLoadTimeout","setTimeout","parsedData","parse","id","widgetIframeMessageHandler","ex","handleCommand","fallback","events","targets","attachToBody","targetIFrame","iframes","action","setStyle","hide","loaded","main","ping","pongSent","resize-height","getIframeOrMain","resizeHeight","impression","tracking","scrollTo","scrollToTrustBox","_this3","createIFrameCalls","setWidgetId","iframeLoadEvents","iframeName","isInViewport","isSameNode","clearTimeout","visible","popup","templateIds","elem","querySelector","scrollIntoView","behavior","_id","constructor","generateId","session","anonymousId","testId","sessionExpiry","requiredArgs","businessUnitId","arg","payload","group","./../constants","./iframe","./tracking","6","Tracking","sendImpressionData","attachListener","shouldDetachListener","commandName","URL","referrer","userAgent","navigator","userLanguage","platform","hasSentImpression","getTrackingData","hasSentViewTracking","func","wait","timeout","_arguments","checkViewPortVisibility","removeEventListener","scrollEventListener","eventOptions","resizeEventListener","args","passive","capture","hasBeenVisible","sendVisibilityData","isTrustBoxVisible","../constants","7","req","responseText","request","XMLHttpRequest","open","setRequestHeader","onreadystatechange","status","send","8","isLoaded","_typeof","currentVersion","Trustpilot","loadFromElement","Modules","applyWidgetFromDomElement","log","initializeOnPageLoad","elementArray","trustbox","closePopups","postError","./lib/widget-management.js"],"mappings":"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"}