(function() {
  var targetHost = 'https://express.dolanautogroup.com';
  var vinParam = '';
  var buttonSelector = '.roadster-btn';
  var isTouch = (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);
  var body = document.body;
  var disabled = false;
  var wantPreload = true;
  var marketplaceType = 'express';

  var loadedVin, visibleVin;
  window.roadster = window.roadster || {};

  var link  = document.createElement('link');
  link.rel  = 'stylesheet';
  link.href = 'https://roadster.com/assets/embedded-32c1e910bc01fe5aa301d6660621a540bddcb4af0b5a8404edd24f5db0d2f96e.css';
  document.head.appendChild(link);

  var container = document.createElement('div');
  container.id = 'roadster-container';
  if (!document.getElementById(container.id)) {
    container.innerHTML = '\
      <div id="roadster-backdrop"></div>\
      <div id="roadster-loader"></div>\
      <button id="roadster-close" type="button">\
        <svg fill="currentColor" viewBox="0 0 260 260" width="24" height="24">\
          <path d="M6.17 259.907l-5.94-5.94L254.01.19l5.94 5.938zm247.66-.02L.05 6.107 5.99.17l253.78 253.778z"></path>\
        </svg>\
      </button>\
      <iframe id="roadster-iframe" frameborder="0" seamless></iframe>';

    if (false) container.classList.add('is-left');

    body.appendChild(container);
  }

  var close = document.getElementById('roadster-close'),
      iframe = document.getElementById('roadster-iframe'),
      backdrop = document.getElementById('roadster-backdrop'),
      loader = document.getElementById('roadster-loader'),
      viewport = document.querySelector('meta[name=viewport]');

  var roadsterViewport = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';
  var initialViewport = viewport ? viewport.getAttribute('content') : null;

  close.addEventListener(isTouch ? 'touchend' : 'click', closeFrame);

  var slideFrame = function() {
    loader.style.display = 'none';
    iframe.style.transform = 'none';
  }

  var preloadFrame = function(vin) {
    if (wantPreload && vin) {
      loadFrame(vin);
    }
  }

  var loadFrame = function(vin) {
    var localhost = window.location.href.replace(window.location.search, '');
    var src = targetHost + '/express/' + vin + '?embed=' + encodeURI(localhost);
    if (marketplaceType == 'express') {
      src = src + '&' + gaCrossDomainTracking();
    }
    iframe.setAttribute('src', src);
    wantPreload = false;
    loadedVin = vin;
  }

  var showFrame = function(event, vin) {
    if (visibleVin == vin) { return; }
    visibleVin = vin;
    if (event) {
      event.stopPropagation();
      event.preventDefault();
    }

    body.classList.add('roadster-body');
    container.style.visibility = 'visible';
    backdrop.style.opacity = 1;

    if (initialViewport) {
      viewport.setAttribute('content', roadsterViewport);
    } else {
      viewport = document.createElement('meta');
      viewport.name = 'viewport';
      viewport.setAttribute('content', roadsterViewport);
      document.head.appendChild(viewport);
    }

    if (loadedVin != vin) {
      loadFrame(vin);
      iframe.onload = slideFrame;
    } else {
      setTimeout(slideFrame, 500);
    }

    setTimeout(function() {
      for (var i = 0; i < window.frames.length; i++) {
        if (window.frames[i]) {
          try {
            window.frames[i].postMessage('openFrame', '*');
          }
          catch(e) {
            // continue to the next frame
          }
        }
      }
    }, 2000);

    if (window.history && history.replaceState) {
      history.replaceState({roadster_vin: vin}, null);
    }

    if (typeof window.jQuery !== 'undefined') {
      jQuery(document).trigger('roadsterCalculatePaymentClick');
    }

    return true;
  }

  var processMessage = function(event) {
    if (event && event.data == 'closeFrame') {
      closeFrame();
    }
    if (event && event.data == 'enableButtons') {
      enableButtons();
    }
  }

  var closeFrame = function() {
    visibleVin = null;
    loader.style.display = close.style.display = 'none';
    backdrop.style.opacity = '';
    iframe.style.transform = '';
    setTimeout(function() {
      loader.style.display = close.style.display = '';
      container.style.visibility = '';
      body.classList.remove('roadster-body');
      if (initialViewport) {
        viewport.setAttribute('content', initialViewport);
      } else {
        document.head.removeChild(viewport);
      }
    }, 500);
    if (window.history && history.replaceState) {
      history.replaceState({}, null);
    }
  }

  var enableDelegatedButtons = function() {
    jQuery(document).on('click', buttonSelector, function(event) {
      var btn = jQuery(this).get(0);
      if (btn) {
        var vin = getButtonVin(btn);

        if (vin) {
          showFrame(event, vin);
        }
      }
    });

    var buttons = document.querySelectorAll(buttonSelector);
    if (buttons.length) {
      return getButtonVin(buttons[0]);
    }
  }

  var getButtonVin = function(btn) {
    var vin = vinParam;
    if (/\/express\/(used\/)?[0-9A-Z]{17}/.test(btn.href)) {
      vin = vin || btn.href.match(/[0-9A-Z]{17}/)[0];
    }
    return vin || jQuery(btn).data('vin') || jQuery(btn).closest('.hproduct').data('vin') || jQuery('.hproduct').data('vin') || jQuery('.tps-roadster-btn').data('vin');
  }

  var enableButtons = function() {
    var buttons = document.querySelectorAll(buttonSelector);
    var vinToPreload = null;
    [].forEach.call(buttons, function(btn) {
      var vin = getButtonVin(btn);

      if (vin) {
        btn.addEventListener('click', function(event) { showFrame(event, vin) });
        vinToPreload = vinToPreload || vin;
      }
    });
    return vinToPreload;
  }

  var initFrame = function(event) {
    if (!window.roadster.initialized && !disabled) {
      window.roadster.initialized = true;
      var vinToPreload = enableDelegatedButtons();

      if (window.history && history.state && history.state.roadster_vin) {
        showFrame(event, history.state.roadster_vin);
      }

      window.addEventListener("message", processMessage, false);
    }

    window.setTimeout(function() {
      vinToPreload = vinToPreload || window.roadster.vinToPreload;
      preloadFrame(vinToPreload);
    }, 500);
  }

  var domReady = function(callback) {
    document.readyState === 'loading' ? document.addEventListener("DOMContentLoaded", callback) : window.setTimeout(callback, 100);
  }

  var gaCrossDomainTracking = function() {
    if (window.ga) {
      try {
        var trackers = ga.getAll();
        var linkerParam = trackers[0].get('linkerParam');
        return linkerParam;
      }
      catch(e) {
        return '';
      }
    }
    return '';
  }

  window.roadster.showFrame = showFrame;

  domReady(initFrame);


}());