/* Embed v2 */
var doWhen = function (func, expressionFunc, failFunc, iterations) {
  iterations = iterations || 0
  failFunc = failFunc || function () { console.warn('weld-embedder: no weld-embed div found') }
  iterations >= 100
    ? failFunc()
    : expressionFunc()
      ? func()
      : setTimeout(doWhen.bind(undefined, func, expressionFunc, failFunc, iterations + 1), 10)
}

var createWeldEmbed = function (embedDiv, rendererVersion, apiServer, projectRef, screenRef) {
  var createFriendlyIframe = function (parentElement) {
    var iframe = document.createElement('iframe')
    iframe.src = 'about:blank'
    iframe.width = '100%'
    iframe.height = '100%'
    iframe.frameBorder = '0'
    parentElement.appendChild(iframe)
    return iframe
  }
  var newIframe = createFriendlyIframe(embedDiv)

  var getHtmlFileUrl = function (cb) {
    var htmlUrl
    if (rendererVersion === '2') {
      // React Renderer v2
      if ((projectRef.indexOf('slug:') !== -1) || (screenRef && screenRef.indexOf('slug:') !== -1)) console.warn('weld-renderer-react does not support "slug:" properties.')
      var loadReactHtml = function () {
        htmlUrl = 'https://api.weld.io/render/html/' + projectRef + (screenRef ? '/' + screenRef : '') + (apiServer ? '?server=' + apiServer : '')
        cb(htmlUrl)
      }
      doWhen(
        loadReactHtml,
        function () {
          return newIframe.contentWindow.innerWidth > 0
        },
        loadReactHtml.bind(undefined, 1024, 1)
      )
    } else {
      // Classic Renderer v1 (AngularJS)
      htmlUrl = 'https://api.weld.io/embed/' + projectRef + (screenRef ? '/' + screenRef : '') + '.html'
      cb(htmlUrl)
    }
  }

  var httpGetAsync = function () {
    var httpGetIE10 = function (url, callback) {
      var httpReq = new window.XDomainRequest()
      httpReq.open('get', url)
      httpReq.onload = function () {
        callback(httpReq.responseText, httpReq.getResponseHeader('X-Canvas-Height'))
      }
      setTimeout(httpReq.send, 0)
    }

    var httpGetOtherBrowsers = function (url, callback) {
      var httpReq = new window.XMLHttpRequest()
      httpReq.onreadystatechange = function () {
        if (httpReq.readyState === 4 && httpReq.status === 200) {
          callback(httpReq.responseText, httpReq.getResponseHeader('X-Canvas-Height'))
        }
      }
      httpReq.open('GET', url, true)
      httpReq.send(null)
    }

    return window.XDomainRequest ? httpGetIE10 : httpGetOtherBrowsers
  }

  var writeIframeContent = function (htmlContent, canvasHeight) {
    newIframe.contentWindow.document.write(htmlContent)
    if (canvasHeight) {
      newIframe.style.height = canvasHeight + 'px'
    }
    newIframe.contentWindow.document.close()
  }

  // Remove spinners/loading indicators when the document has finished loading
  window.addEventListener('message', function (event) {
    if (window.location.origin.localeCompare(event.origin) === 0 && 'clear children'.localeCompare(event.data) === 0) {
      while (embedDiv.firstChild && embedDiv.firstChild !== newIframe) {
        embedDiv.removeChild(embedDiv.firstChild)
      }
    }
  }, false)

  // Start loading
  getHtmlFileUrl(function (htmlFile) {
    httpGetAsync()(htmlFile, writeIframeContent)
  })
}

var loadWeldEmbed = function () {
  var projectOne = ''

  if (projectOne === '' || projectOne === null || projectOne.length === 0) {
    // New: multiple weld-embeds with class/data-weld-project/data-weld-screen attributes
    var embedDivs = document.getElementsByClassName('weld-embed')
    for (var i = 0; i < embedDivs.length; i++) {
      var rendererVersion = embedDivs[i].getAttribute('data-weld-version')
      var apiServer = embedDivs[i].getAttribute('data-weld-server')
      var project = embedDivs[i].getAttribute('data-weld-project')
      var screenRef = embedDivs[i].getAttribute('data-weld-screen')
      createWeldEmbed(embedDivs[i], rendererVersion, apiServer, project, screenRef)
    }
  } else {
    // Old: single weld-embed with project/screen in script URL
    var embedOneDiv = document.getElementById('weld-embed')
    var screenOne = ''
    createWeldEmbed(embedOneDiv, 'v1', undefined, projectOne, screenOne)
  };
}

doWhen(
  loadWeldEmbed,
  function () {
    return document.getElementsByClassName('weld-embed').length || document.getElementById('weld-embed')
  }
)
