text: "use strict";
  var isWeb;
  var teXView;
  var iFrameWeb;
  
  function initTeXView(jsonData) {
      isWeb = false;
      teXView.innerHTML = '';
      teXView.appendChild(createTeXView(jsonData));
      renderTeXView(renderCompleted);
  }
  
  
  
  function initWebTeXView(viewId, rawData) {
      isWeb = true
      var initiated = false;
      iFrameWeb = document.getElementById(viewId);
      if (iFrameWeb != null) {
          var iFrame = iFrameWeb.contentWindow;
          if (iFrame != null) {
              teXView = iFrame.document.getElementById('TeXView');
              if (teXView != null) {
                  teXView.innerHTML = "";
                  initiated = true;
                  var jsonData = JSON.parse(rawData);
                  teXView.appendChild(createTeXView(jsonData));
                  iFrame.renderTeXView(renderCompleted);
              }
          }
  
      }
  
  
      if (!initiated) setTimeout(function () {
          initWebTeXView(viewId, rawData)
      }, 250);
  }
  
  
  function createTeXView(rootData) {
      var meta = rootData['meta'];
      var data = rootData['data'];
      var id = meta['id']
      var classList = meta['classList'];
      var element = document.createElement(meta['tag']);
      element.classList.add(classList);
      element.setAttribute('style', rootData['style']);
      element.setAttribute('id', id)
      switch (meta['node']) {
          case 'leaf': {
              if (meta['tag'] === 'img') {
                  if (classList === 'tex-view-asset-image') {
                      element.setAttribute('src', getAssetsUri() + data);
                  } else {
                      element.setAttribute('src', data);
                      element.addEventListener("load", renderCompleted);
                  }
              } else {
                  element.innerHTML = data;
              }
          }
              break;
          case 'internal_child': {
              element.appendChild(createTeXView(data))
              if (classList === 'tex-view-ink-well') clickManager(element, id, rootData['rippleEffect']);
          }
              break;
          case 'root':
              rootData['fonts'].forEach(function (font) {
                  registerFont(font['font_family'], font['src'])
              })
              element.appendChild(createTeXView(data));
              break;
          default: {
              if (classList === 'tex-view-group') {
                  createTeXViewGroup(element, rootData);
              } else {
                  data.forEach(function (childViewData) {
                      element.appendChild(createTeXView(childViewData))
                  });
              }
          }
      }
      return element;
  }
  
  function createTeXViewGroup(element, rootData) {
  
      var normalStyle = rootData['normalItemStyle'];
      var selectedStyle = rootData['selectedItemStyle'];
      var single = rootData['single'];
      var lastSelected;
      var selectedIds = [];
  
  
      rootData['data'].forEach(function (data) {
          data['style'] = normalStyle;
          var item = createTeXView(data);
          var id = data['meta']['id'];
          item.setAttribute('id', id);
  
          clickManager(item, id, rootData['rippleEffect'], function (clickedId) {
              if (clickedId === id) {
                  if (single) {
                      if (lastSelected != null) lastSelected.setAttribute('style', normalStyle);
                      item.setAttribute('style', selectedStyle);
                      lastSelected = item;
                      onTapCallback(clickedId);
                  } else {
                      if (arrayContains(selectedIds, clickedId)) {
                          document.getElementById(clickedId).setAttribute('style', normalStyle);
                          selectedIds.splice(selectedIds.indexOf(clickedId), 1)
                      } else {
                          document.getElementById(clickedId).setAttribute('style', selectedStyle);
                          selectedIds.push(clickedId);
                      }
                      onTapCallback(JSON.stringify(selectedIds));
                  }
              }
              renderCompleted();
          })
          element.appendChild(item);
      });
  }
  
  function arrayContains(array, obj) {
      var i = array.length;
      while (i--) {
          if (array[i] === obj) {
              return true;
          }
      }
      return false;
  }
  
  function renderCompleted() {
      if (isWeb) {
          iFrameWeb.height = getTeXViewHeight(teXView);
          TeXViewRenderedCallback(getTeXViewHeight(teXView));
      } else {
          TeXViewRenderedCallback.postMessage(getTeXViewHeight(teXView));
      }
  }
  
  function clickManager(element, id, rippleEffect, callback) {
      element.addEventListener('click', function (e) {
          if (callback != null) {
              callback(id);
          } else {
              onTapCallback(id);
          }
  
          if (rippleEffect) {
              var ripple = document.createElement('div');
              this.appendChild(ripple);
              var d = Math.max(this.clientWidth, this.clientHeight);
              ripple.style.width = ripple.style.height = d + 'px';
              var rect = this.getBoundingClientRect();
              ripple.style.left = e.clientX - rect.left - d / 2 + 'px';
              ripple.style.top = e.clientY - rect.top - d / 2 + 'px';
              ripple.classList.add('ripple');
          }
      });
  }
  
  
  function onTapCallback(message) {
      if (isWeb) {
          OnTapCallback(message);
      } else {
          OnTapCallback.postMessage(message);
      }
  }
  
  
  function getTeXViewHeight(view) {
      var element = view;
      var height = element.offsetHeight,
          style = window.getComputedStyle(element)
      return ['top', 'bottom']
          .map(function (side) {
              return parseInt(style["margin-" + side]);
          })
          .reduce(function (total, side) {
              return total + side;
          }, height)
  }
  
  function registerFont(fontFamily, src) {
      var registerFont =
          ' @font-face {                               \n' +
          '   font-family: ' + fontFamily + ';         \n' +
          '   src: url(' + getAssetsUri() + src + ');  \n' +
          ' }';
      appendStyle(registerFont);
  }
  
  function getAssetsUri() {
      var currentUrl = location.protocol + '//' + location.host;
      var uri;
      if (isWeb) {
          uri = currentUrl + '/assets/';
      } else {
          uri = currentUrl + '/';
      }
      return uri
  }
  
  function appendStyle(content) {
      var style = document.createElement('STYLE');
      style.type = 'text/css';
      style.appendChild(document.createTextNode(content));
      document.head.appendChild(style);
  }