(function(){
  var embedId = +(new Date()) + '-' + Math.random().toString().substr(2);
  var initialHeight = "";
  var staticHeight = "";
  var embedSrc = "";
  var isFallback = !window.JSON || !window.addEventListener; // Quirksmode / old IE.
  var fallbackSrc = "";
  var isWrapped = false;
  var isLightframed = true;
  var isAlwaysLightframed = false;
  var lightframePath = "https://fareharbor.com/embeds/book";
  var originPath = "https://fareharbor.com";
  var apiVersion = "";

  // We don't allow lightframes on touch devices because they suck; except The Denz
  // has a touchscreen laptop so toss in a width check. And sometimes we want to
  // let people just force a lightframe. Also `document.body` is `null` when this
  // is run in the <HEAD> so we can't add stuff to the body, and therefore can't
  // lightframe.  We don't lightframe when we are ourselves iframed (WIX / FB).
  // And we can't lightframe on unsupported browsers.
  var isTouchEnabled = ('ontouchstart' in window) || navigator.msMaxTouchPoints;
  var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
  var shouldLightframe = isLightframed &&
    (isAlwaysLightframed || (!isTouchEnabled || width > 1100)) &&
    (document.body !== null) &&
    (window.top === window.self) &&
    !isFallback;

  // Ensures that a lightframe iframe exists.
  var createLightframe = function(){
    // Don't create more than one.
    var lightframe = document.getElementById('fareharbor-lightframe');
    if(lightframe){
      return;
    }

    // Wrapper so we get a nice overlay.
    var container = document.createElement('div');
    container.id = 'fareharbor-lightframe';
    container.innerHTML =
      '<style>#fareharbor-lightframe-iframe {   z-index: 999999999 !important;   border: 0px none transparent !important;   overflow-x: hidden !important;   overflow-y: auto !important;   visibility: visible !important;   margin: 0px !important;   padding: 0px !important;      -webkit-overflow-scrolling: touch;   overflow-scrolling: touch;    position: fixed !important;   top: 0 !important;   right: 0 !important;   bottom: 0 !important;   left: 0 !important;   width: 100% !important;   height: 100% !important;   background: transparent !important;   -webkit-tap-highlight-color: transparent;      display: none; }  #fareharbor-lightframe.showing #fareharbor-lightframe-iframe, #fareharbor-lightframe.showing #fareharbor-lightframe-shade {   display: block !important; }  #fareharbor-lightframe-shade {   position: fixed !important;   top: 0 !important;   right: 0 !important;   bottom: 0 !important;   left: 0 !important;   width: 100% !important;   height: 100% !important;   margin: 0px !important;   padding: 0px !important;   visibility: visible !important;   overflow: hidden !important;   border: 0px none transparent !important;   z-index: 999999998 !important;   background: rgba(0, 0, 0, 0.75) !important;    display: none; }  #fareharbor-lightframe-loading {   display: none;   visibility: visible !important;      width: 64px !important;   height: 64px !important;   position: fixed !important;   top: 50% !important;   left: 50% !important;   margin-top: -50px !important;   margin-left: -32px !important;   padding: 0px !important;      background: #fff !important;      -webkit-border-radius: 10px;   -moz-border-radius: 10px;   border-radius: 10px;      z-index: 999999999 !important;    background-image: url(data:image/gif;base64,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) !important;   background-repeat: no-repeat !important;   background-position: 50% 50% !important; }  #fareharbor-lightframe-loading.loading {   display: block; }</style>' +
      '<div id="fareharbor-lightframe-shade"></div>' +
      '<div id="fareharbor-lightframe-loading"></div>';
    document.body.insertBefore(container, document.body.firstChild);
  };

  // Add GA if available.
  var linkCrossDomain = function(url){
    var clientId = '';
    var trackingId = '';

    try {
      if(window.GoogleAnalyticsObject){
        var gaTracker = window[window.GoogleAnalyticsObject];

        // Make sure the tracker is actually loaded.
        if(gaTracker && gaTracker.getAll){
          var pageTracker = gaTracker.getAll()[0];
          if(pageTracker){
            clientId = pageTracker.get("clientId");
            trackingId = pageTracker.get("trackingId");
          }
        }
      }
    }
    catch(e){
      clientId = trackingId = '';
    }

    if(clientId && trackingId){
      var sep = url.indexOf('?') === -1 ? '?' : '&';
      return url + sep + 'ga-cid=' + clientId + '&ga-tid=' + trackingId;
    }

    return url;
  };

  var bodyOverflow = '';
  var documentOverflow = '';

  var openLightframe = function(url){
    // Cross-domain here instead of in the public API so that even stuff opened
    // by other embeds get tracking.
    url = linkCrossDomain(url);
    
    // If we don't have a lightframe, just navigate.
    var lightframe = document.getElementById('fareharbor-lightframe');
    if(!lightframe){
      // Be sure to navigate the top frame.
      window.top.location.href = originPath + url;
      return false;
    }

    var iframe = document.getElementById('fareharbor-lightframe-iframe');
    var lightframeLoading = document.getElementById('fareharbor-lightframe-loading');

    lightframeLoading.className = 'loading';
    lightframe.className = 'showing';

    // Create the iframe on the fly, and remove it on close, instead of
    // keeping it around in between with src="about:blank", because Firefox
    // will leave the about:blank in the history so you can "go back" to it
    // leaving you with a lightframe shade and no lightframe.
    if(!iframe){
      // Save the previous overlow; save it in a global location so that we
      // can close it from a different embed than opened it.
      window.FH = window.FH || {};
      window.FH._bodyOverflow = document.body.style.overflow;
      window.FH._documentOverflow = document.documentElement.style.overflow;
      document.body.style.overflow = 'hidden';
      document.documentElement.style.overflow = 'hidden';

      iframe = document.createElement('iframe');
      iframe.id = 'fareharbor-lightframe-iframe';
      iframe.name = 'fareharbor-lightframe';
      iframe.frameBorder = '0';
      iframe.border = '0';
      iframe.width = '100%';
      iframe.style.opacity = '0'; // Prettier transitions.
      iframe.src = lightframePath + url;
      lightframe.appendChild(iframe);
    }
    else {
      // In case someone tries to open it while it is already open
      // just leave it there.
      iframe.style.opacity = '0';
      
      // TODO: pushstate navigate via post-message.
      iframe.src = lightframePath + url;
    }
    
    return true;
  };
  
  var closeLightframe = function(){
    var lightframe = document.getElementById('fareharbor-lightframe');
    var iframe =  document.getElementById('fareharbor-lightframe-iframe');
    if(!lightframe){
      return false;
    }
    lightframe.className = '';

    // Have to actually remove it (see above); check if it's
    // still there in case another embed removed it first.
    var wasRemoved = false;
    if(iframe){
      lightframe.removeChild(iframe);
      wasRemoved = true;
    }

    document.body.style.overflow = window.FH._bodyOverflow;
    document.documentElement.style.overflow = window.FH._documentOverflow;
    
    return true;
  };
  
  // Write in a simple iframe fallback.
  var createFallback = function(fallbackSrc){
    if(!fallbackSrc){
      return;
    }
    
    // We might not have JSON here, but we know embedId has no quotes.
    var fallbackOptions = '{"embedId":"' + embedId + '"}';
    fallbackOptions = encodeURIComponent(fallbackOptions);
    
    // Never wrap the fallback. 
    document.write('<iframe id="' + embedId + '" name="fareharbor-embed:' + fallbackOptions + '" frameborder=0 border=0 width="100%" src="' + fallbackSrc + '"></iframe>');
    
    var fallback = document.getElementById(embedId);
    fallback.style.height = "";
    
    return fallback; 
  };
  
  var createEmbed = function(){
    if(!embedSrc){
      return;
    }
    
    var embedOptions = window.JSON.stringify({
      embedId: embedId,
      isLightframed: shouldLightframe
    });
    embedOptions = encodeURIComponent(embedOptions);
    var iframeHtml = '<iframe id="' + embedId + '" name="fareharbor-embed:' + embedOptions + '" frameborder=0 border=0 width="100%" src="' + embedSrc + '"></iframe>';
    
    // Wrap
    if(isWrapped){
      document.write(
        '<style></style>' +
        '<div class="fareharbor-calendar-wrap">' +
        iframeHtml +
        ' <a href="https://fareharbor.com/" class="fareharbor-powered-by-link" title="Reservation software for activities" style="display: inline !important;">Online booking by FareHarbor</a>' +
        '</div>'
      );
    }
    else {
      document.write(iframeHtml);
    }
    
    // Initial height so it's not colapsed.
    var iframe = document.getElementById(embedId);
    iframe.style.height = initialHeight;
    
    // Some embeds (notably buttons) have a static height, so let's
    // just set it off the bat and then skip listening for resize.
    if(staticHeight){
      iframe.style.height = staticHeight;
    }
  };
  
  // Enable JS API; it works even when lightframing is disabled by simply
  // going off-site.
  var isReady = false;
  if(!window.FH){
    isReady = true;
    (function(){
  var QUERY_KEYS = {
    asn: 'asn',
    asnRef: 'asn-ref',
    ref: 'ref',
    items: 'selected-items',
    fullItems: 'full-items',
    kiosk: 'kiosk',
    sheet: 'sheet'
  };
  
  var DEFAULTS = {
    fullItems: 'no'
  };
   
  var encodeUriQuery = function(val, pctEncodeSpaces) {
    return encodeURIComponent(val).
       replace(/%40/gi, '@').
       replace(/%3A/gi, ':').
       replace(/%24/g, '$').
       replace(/%2C/gi, ',').
       replace(/%2F/gi, '/').
       replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
  };
  
  var query = function(options){
    var parts = [];
    var queryKey, queryValue;
    for(var key in QUERY_KEYS){
      queryKey = QUERY_KEYS[key];
      queryValue = options[key];
      if(!queryValue){
        queryValue = DEFAULTS[key];
      }
      if(queryValue){
        parts.push(encodeUriQuery(queryKey, true) + '=' + encodeUriQuery(queryValue, true));
      }
    }
    return parts.length ? ('?' + parts.join('&')) : '';
  };
  
  window.FH = {};
  window.FH.open = function(options){
    try {
      // Shortname is required or nothing works.
      options = options || {};
      if(!options.shortname){
        return false;
      }
      
      // Construct a client-side URL for the book embed.
      var path = '/' + options.shortname + '/';
      if(options.view){
        if(options.view === 'items'){
          // Done.
        }
        else if(options.view === 'all-availability'){
          path += 'items/calendar/';
        }
        else if(options.view.item){
          path += 'items/' + options.view.item.toString() + '/';
          if(options.view.availability){
            path += 'availability/' + options.view.availability.toString() + '/book/';
          }
          else {
            path += 'calendar/';
          }
        }
      }
      
      // Convert items to selected-items structure.
      options.items = options.items ?
        options.items.join(',') :
        null;
      
      // Thread relevant query parameters through.
      path += query(options);
      
      return openLightframe(path);
    } catch(e){
      return false;
    }
  };
  
  window.FH.close = function(){
    return closeLightframe();
  };
})();

  }
  
  // Either we're in an unsupported browser or running in
  // quirksmode; either way we're effed.
  if(isFallback){
    createFallback(fallbackSrc);
    
    // Don't write in the actual embed.
    return;
  }
  
  // Add the lightframe only if requested and we can actually support it.
  if(shouldLightframe){
    createLightframe();
  }
  
  // We need to pass the unique embed id to the iframe so that we can distinguish
  // different embeds on the same page.
  createEmbed();
  
  // Try to disable the bfcache.
  window.addEventListener('unload', function(){});
  window.addEventListener('beforeunload', function(){});
  
  // Resizes the iframe given an explicit height in pixels.
  var resize = function(message){
    if(staticHeight){
      return;
    }
    if(message.embedId !== embedId){
      return;
    }
    var height = message.height;
    var iframe = document.getElementById(embedId);
    if(iframe && height){
      iframe.style.height = height + "px";
    }
  };
  
  // Listen for requests to open the lightframe, but only from our
  // own embed.
  var open = function(message){
    if(message.embedId !== embedId){
      return;
    }
    openLightframe(message.url);
  };
  
  // Listens for requests to close the lightframe from all embeds;
  // the embed that initially caused the creation of the lightframe
  // is responsible for managing its visibility (classes and such).
  var close = function(message){
    // Ignore which embed wants to close it because the actual lightframe
    // doesn't know.
    closeLightframe();
  };
  
  // Listen for the lightframe to have successfully loaded and hide the spinner;
  // depends on reloading the lightframe on every `fareharbor.open`.
  var ready = function(message){
    var iframe = document.getElementById('fareharbor-lightframe-iframe');
    var lightframeLoading = document.getElementById('fareharbor-lightframe-loading');
    iframe && (iframe.style.opacity = '');
    lightframeLoading && (lightframeLoading.className = '');
  };
  
  // Map FH events to handlers.
  var handlers = {};
  handlers['fareharbor.height'] = resize;
  handlers['fareharbor.open'] = open;
  handlers['fareharbor.close'] = close;
  handlers['fareharbor.ready'] = ready;

  // Listen to message from the iframe.
  window.addEventListener('message', function(e) {
    var message;
    try {
      message = window.JSON.parse(e.data);
    }
    catch(e){
      return;
    }
    
    var handler;
    if(message.event){
      handler = handlers[message.event];
    }
    
    if(message && handler){
      handler(message);
    }
  }, false);
  
  // Only mark the document as ready once.
  if(isReady){
    document.documentElement && (document.documentElement.className += ' fh-ready');
  }
})();
