"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); }