{"version":3,"file":"jquery.orgchart.min.js","sources":["jquery.orgchart.js"],"sourcesContent":["/*\n * jQuery OrgChart Plugin\n * https://github.com/dabeng/OrgChart\n *\n * Copyright 2016, dabeng\n * https://github.com/dabeng\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n */\n'use strict';\n\n(function (factory) {\n  if (typeof module === 'object' && typeof module.exports === 'object') {\n    factory(require('jquery'), window, document);\n  } else {\n    factory(jQuery, window, document);\n  }\n}(function ($, window, document, undefined) {\n  var OrgChart = function (elem, opts) {\n    this.$chartContainer = $(elem);\n    this.opts = opts;\n    this.defaultOptions = {\n      'icons': {\n        'theme': 'oci',\n        'parentNode': 'oci-menu',\n        'expandToUp': 'oci-chevron-up',\n        'collapseToDown': 'oci-chevron-down',\n        'collapseToLeft': 'oci-chevron-left',\n        'expandToRight': 'oci-chevron-right',\n        'collapsed': 'oci-plus-square',\n        'expanded': 'oci-minus-square',\n        'spinner': 'oci-spinner'\n      },\n      'nodeTitle': 'name',\n      'nodeId': 'id',\n      'toggleSiblingsResp': false,\n      'visibleLevel': 999,\n      'chartClass': '',\n      'exportButton': false,\n      'exportButtonName': 'Export',\n      'exportFilename': 'OrgChart',\n      'exportFileextension': 'png',\n      'draggable': false,\n      'direction': 't2b',\n      'pan': false,\n      'zoom': false,\n      'zoominLimit': 7,\n      'zoomoutLimit': 0.5\n    };\n  };\n  //\n  OrgChart.prototype = {\n    //\n    init: function (opts) {\n      var that = this;\n      this.options = $.extend({}, this.defaultOptions, this.opts, opts);\n      // build the org-chart\n      var $chartContainer = this.$chartContainer;\n      if (this.$chart) {\n        this.$chart.remove();\n      }\n      var data = this.options.data;\n      var $chart = this.$chart = $('<div>', {\n        'data': { 'options': this.options },\n        'class': 'orgchart' + (this.options.chartClass !== '' ? ' ' + this.options.chartClass : '') + (this.options.direction !== 't2b' ? ' ' + this.options.direction : ''),\n        'click': function(event) {\n          if (!$(event.target).closest('.node').length) {\n            $chart.find('.node.focused').removeClass('focused');\n          }\n        }\n      });\n      if (typeof MutationObserver !== 'undefined') {\n        this.triggerInitEvent();\n      }\n      var $root = $chart.append($('<ul class=\"nodes\"><li class=\"hierarchy\"></li></ul>')).find('.hierarchy');\n      if ($.type(data) === 'object') {\n        if (data instanceof $) { // ul datasource\n          this.buildHierarchy($root, this.buildJsonDS(data.children()), 0, this.options);\n        } else { // local json datasource\n          this.buildHierarchy($root, this.options.ajaxURL ? data : this.attachRel(data, '00'));\n        }\n      } else {\n        $chart.append(`<i class=\"${this.options.icons.theme} ${this.options.icons.spinner} spinner\"></i>`);\n        $.ajax({\n          'url': data,\n          'dataType': 'json'\n        })\n        .done(function(data, textStatus, jqXHR) {\n          that.buildHierarchy($root, that.options.ajaxURL ? data : that.attachRel(data, '00'), 0, that.options);\n        })\n        .fail(function(jqXHR, textStatus, errorThrown) {\n          console.log(errorThrown);\n        })\n        .always(function() {\n          $chart.children('.spinner').remove();\n        });\n      }\n      $chartContainer.append($chart);\n\n      // append the export button\n      if (this.options.exportButton && !$('.oc-export-btn').length) {\n        this.attachExportButton();\n      }\n\n      if (this.options.pan) {\n        this.bindPan();\n      }\n\n      if (this.options.zoom) {\n        this.bindZoom();\n      }\n\n      return this;\n    },\n    //\n    triggerInitEvent: function () {\n      var that = this;\n      var mo = new MutationObserver(function (mutations) {\n        mo.disconnect();\n        initTime:\n        for (var i = 0; i < mutations.length; i++) {\n          for (var j = 0; j < mutations[i].addedNodes.length; j++) {\n            if (mutations[i].addedNodes[j].classList.contains('orgchart')) {\n              if (that.options.initCompleted && typeof that.options.initCompleted === 'function') {\n                that.options.initCompleted(that.$chart);\n              }\n              var initEvent = $.Event('init.orgchart');\n              that.$chart.trigger(initEvent);\n              break initTime;\n            }\n          }\n        }\n      });\n      mo.observe(this.$chartContainer[0], { childList: true });\n    },\n    triggerLoadEvent: function ($target, rel) {\n      var initEvent = $.Event('load-' + rel +'.orgchart');\n      $target.trigger(initEvent);\n    },\n    triggerShowEvent: function ($target, rel) {\n      var initEvent = $.Event('show-' + rel + '.orgchart');\n      $target.trigger(initEvent);\n    },\n    triggerHideEvent: function ($target, rel) {\n      var initEvent = $.Event('hide-' + rel + '.orgchart');\n      $target.trigger(initEvent);\n    },\n    // add export button for orgchart\n    attachExportButton: function () {\n      var that = this;\n      var $exportBtn = $('<button>', {\n        'class': 'oc-export-btn',\n        'text': this.options.exportButtonName,\n        'click': function(e) {\n          e.preventDefault();\n          that.export();\n        }\n      });\n      this.$chartContainer.after($exportBtn);\n    },\n    setOptions: function (opts, val) {\n      if (typeof opts === 'string') {\n        if (opts === 'pan') {\n          if (val) {\n            this.bindPan();\n          } else {\n            this.unbindPan();\n          }\n        }\n        if (opts === 'zoom') {\n          if (val) {\n            this.bindZoom();\n          } else {\n            this.unbindZoom();\n          }\n        }\n      }\n      if (typeof opts === 'object') {\n        if (opts.data) {\n          this.init(opts);\n        } else {\n          if (typeof opts.pan !== 'undefined') {\n            if (opts.pan) {\n              this.bindPan();\n            } else {\n              this.unbindPan();\n            }\n          }\n          if (typeof opts.zoom !== 'undefined') {\n            if (opts.zoom) {\n              this.bindZoom();\n            } else {\n              this.unbindZoom();\n            }\n          }\n        }\n      }\n\n      return this;\n    },\n    //\n    panStartHandler: function (e) {\n      var $chart = $(e.delegateTarget);\n      if ($(e.target).closest('.node').length || (e.touches && e.touches.length > 1)) {\n        $chart.data('panning', false);\n        return;\n      } else {\n        $chart.css('cursor', 'move').data('panning', true);\n      }\n      var lastX = 0;\n      var lastY = 0;\n      var lastTf = $chart.css('transform');\n      if (lastTf !== 'none') {\n        var temp = lastTf.split(',');\n        if (lastTf.indexOf('3d') === -1) {\n          lastX = parseInt(temp[4]);\n          lastY = parseInt(temp[5]);\n        } else {\n          lastX = parseInt(temp[12]);\n          lastY = parseInt(temp[13]);\n        }\n      }\n      var startX = 0;\n      var startY = 0;\n      if (!e.targetTouches) { // pand on desktop\n        startX = e.pageX - lastX;\n        startY = e.pageY - lastY;\n      } else if (e.targetTouches.length === 1) { // pan on mobile device\n        startX = e.targetTouches[0].pageX - lastX;\n        startY = e.targetTouches[0].pageY - lastY;\n      } else if (e.targetTouches.length > 1) {\n        return;\n      }\n      $chart.on('mousemove touchmove',function(e) {\n        if (!$chart.data('panning')) {\n          return;\n        }\n        var newX = 0;\n        var newY = 0;\n        if (!e.targetTouches) { // pand on desktop\n          newX = e.pageX - startX;\n          newY = e.pageY - startY;\n        } else if (e.targetTouches.length === 1) { // pan on mobile device\n          newX = e.targetTouches[0].pageX - startX;\n          newY = e.targetTouches[0].pageY - startY;\n        } else if (e.targetTouches.length > 1) {\n          return;\n        }\n        var lastTf = $chart.css('transform');\n        if (lastTf === 'none') {\n          if (lastTf.indexOf('3d') === -1) {\n            $chart.css('transform', 'matrix(1, 0, 0, 1, ' + newX + ', ' + newY + ')');\n          } else {\n            $chart.css('transform', 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ' + newX + ', ' + newY + ', 0, 1)');\n          }\n        } else {\n          var matrix = lastTf.split(',');\n          if (lastTf.indexOf('3d') === -1) {\n            matrix[4] = ' ' + newX;\n            matrix[5] = ' ' + newY + ')';\n          } else {\n            matrix[12] = ' ' + newX;\n            matrix[13] = ' ' + newY;\n          }\n          $chart.css('transform', matrix.join(','));\n        }\n      });\n    },\n    //\n    panEndHandler: function (e) {\n      if (e.data.chart.data('panning')) {\n        e.data.chart.data('panning', false).css('cursor', 'default').off('mousemove');\n      }\n    },\n    //\n    bindPan: function () {\n      this.$chartContainer.css('overflow', 'hidden');\n      this.$chart.on('mousedown touchstart', this.panStartHandler);\n      $(document).on('mouseup touchend', { 'chart': this.$chart }, this.panEndHandler);\n    },\n    //\n    unbindPan: function () {\n      this.$chartContainer.css('overflow', 'auto');\n      this.$chart.off('mousedown touchstart', this.panStartHandler);\n      $(document).off('mouseup touchend', this.panEndHandler);\n    },\n    //\n    zoomWheelHandler: function (e) {\n      var oc = e.data.oc;\n      e.preventDefault();\n      var newScale  = 1 + (e.originalEvent.deltaY > 0 ? -0.2 : 0.2);\n      oc.setChartScale(oc.$chart, newScale);\n    },\n    //\n    zoomStartHandler: function (e) {\n      if(e.touches && e.touches.length === 2) {\n        var oc = e.data.oc;\n        oc.$chart.data('pinching', true);\n        var dist = oc.getPinchDist(e);\n        oc.$chart.data('pinchDistStart', dist);\n      }\n    },\n    zoomingHandler: function (e) {\n      var oc = e.data.oc;\n      if(oc.$chart.data('pinching')) {\n        var dist = oc.getPinchDist(e);\n        oc.$chart.data('pinchDistEnd', dist);\n      }\n    },\n    zoomEndHandler: function (e) {\n      var oc = e.data.oc;\n      if(oc.$chart.data('pinching')) {\n        oc.$chart.data('pinching', false);\n        var diff = oc.$chart.data('pinchDistEnd') - oc.$chart.data('pinchDistStart');\n        if (diff > 0) {\n          oc.setChartScale(oc.$chart, 1.2);\n        } else if (diff < 0) {\n          oc.setChartScale(oc.$chart, 0.8);\n        }\n      }\n    },\n    //\n    bindZoom: function () {\n      this.$chartContainer.on('wheel', { 'oc': this }, this.zoomWheelHandler);\n      this.$chartContainer.on('touchstart', { 'oc': this }, this.zoomStartHandler);\n      $(document).on('touchmove', { 'oc': this }, this.zoomingHandler);\n      $(document).on('touchend', { 'oc': this }, this.zoomEndHandler);\n    },\n    unbindZoom: function () {\n      this.$chartContainer.off('wheel', this.zoomWheelHandler);\n      this.$chartContainer.off('touchstart', this.zoomStartHandler);\n      $(document).off('touchmove', this.zoomingHandler);\n      $(document).off('touchend', this.zoomEndHandler);\n    },\n    //\n    getPinchDist: function (e) {\n      return Math.sqrt((e.touches[0].clientX - e.touches[1].clientX) * (e.touches[0].clientX - e.touches[1].clientX) +\n      (e.touches[0].clientY - e.touches[1].clientY) * (e.touches[0].clientY - e.touches[1].clientY));\n    },\n    //\n    setChartScale: function ($chart, newScale) {\n      var opts = $chart.data('options');\n      var lastTf = $chart.css('transform');\n      var matrix = '';\n      var targetScale = 1;\n      if (lastTf === 'none') {\n        $chart.css('transform', 'scale(' + newScale + ',' + newScale + ')');\n      } else {\n        matrix = lastTf.split(',');\n        if (lastTf.indexOf('3d') === -1) {\n          targetScale = Math.abs(window.parseFloat(matrix[3]) * newScale);\n          if (targetScale > opts.zoomoutLimit && targetScale < opts.zoominLimit) {\n            $chart.css('transform', lastTf + ' scale(' + newScale + ',' + newScale + ')');\n          }\n        } else {\n          targetScale = Math.abs(window.parseFloat(matrix[1]) * newScale);\n          if (targetScale > opts.zoomoutLimit && targetScale < opts.zoominLimit) {\n            $chart.css('transform', lastTf + ' scale3d(' + newScale + ',' + newScale + ', 1)');\n          }\n        }\n      }\n    },\n    //\n    buildJsonDS: function ($li) {\n      var that = this;\n      var subObj = {\n        'name': $li.contents().eq(0).text().trim(),\n        'relationship': ($li.parent().parent().is('li') ? '1': '0') + ($li.siblings('li').length ? 1: 0) + ($li.children('ul').length ? 1 : 0)\n      };\n      $.each($li.data(), function(key, value) {\n         subObj[key] = value;\n      });\n      $li.children('ul').children().each(function() {\n        if (!subObj.children) { subObj.children = []; }\n        subObj.children.push(that.buildJsonDS($(this)));\n      });\n      return subObj;\n    },\n    //\n    attachRel: function (data, flags) {\n      var that = this;\n      data.relationship = flags + (data.children && data.children.length > 0 ? 1 : 0);\n      if (data.children) {\n        data.children.forEach(function(item) {\n          if (data.isHybrid || data.isVertical) {\n            item.isVertical = true;\n          }\n          that.attachRel(item, '1' + (data.children.length > 1 ? 1 : 0));\n        });\n      }\n      return data;\n    },\n    //\n    loopChart: function ($chart, includeNodeData) {\n      includeNodeData = (includeNodeData !== null && includeNodeData !== undefined) ? includeNodeData : false;\n      var that = this;\n      var $node = $chart.find('.node:first');\n      var subObj = { 'id': $node[0].id };\n      if (includeNodeData) {\n        $.each($node.data('nodeData'), function (key, value) {\n          subObj[key] = value;\n        });\n      }\n      $node.siblings('.nodes').children().each(function() {\n        if (!subObj.children) { subObj.children = []; }\n        subObj.children.push(that.loopChart($(this), includeNodeData));\n      });\n      return subObj;\n    },\n    //\n    getHierarchy: function (includeNodeData) {\n      includeNodeData = (includeNodeData !== null && includeNodeData !== undefined) ? includeNodeData : false;\n      if (typeof this.$chart === 'undefined') {\n        return 'Error: orgchart does not exist'\n      } else {\n        if (!this.$chart.find('.node').length) {\n          return 'Error: nodes do not exist'\n        } else {\n          var valid = true;\n          this.$chart.find('.node').each(function () {\n            if (!this.id) {\n              valid = false;\n              return false;\n            }\n          });\n          if (!valid) {\n            return 'Error: All nodes of orghcart to be exported must have data-id attribute!';\n          }\n        }\n      }\n      return this.loopChart(this.$chart, includeNodeData);\n    },\n    // detect the exist/display state of related node\n    getNodeState: function ($node, relation) {\n      var $target = {};\n      var isVerticalNode = !!$node.closest('vertical').length;\n      var relation = relation || 'self';\n      if (relation === 'parent') {\n        if (isVerticalNode) {\n          $target = $node.closest('ul').parents('ul');\n          if (!$target.length) {\n            $target = $node.closest('.nodes');\n            if (!$target.length) {\n              $target = $node.closest('.vertical').siblings(':first');\n            }\n          }\n        } else {\n          $target = $node.closest('.nodes').siblings('.node');\n        }\n        if ($target.length) {\n          if ($target.is('.hidden') || (!$target.is('.hidden') && $target.closest('.nodes').is('.hidden')) || (!$target.is('.hidden') && $target.closest('.vertical').is('.hidden'))) {\n            return { 'exist': true, 'visible': false };\n          }\n          return { 'exist': true, 'visible': true };\n        }\n      } else if (relation === 'children') {\n        $target = isVerticalNode ? $node.parent().children('ul') : $node.siblings('.nodes');\n        if ($target.length) {\n          if (!$target.is('.hidden')) {\n            return { 'exist': true, 'visible': true };\n          }\n          return { 'exist': true, 'visible': false };\n        }\n      } else if (relation === 'siblings') {\n        $target = isVerticalNode ? $node.closest('ul') : $node.parent().siblings();\n        if ($target.length && (!isVerticalNode || $target.children('li').length > 1)) {\n          if (!$target.is('.hidden') && !$target.parent().is('.hidden') && (!isVerticalNode || !$target.closest('.vertical').is('.hidden'))) {\n            return { 'exist': true, 'visible': true };\n          }\n          return { 'exist': true, 'visible': false };\n        }\n      } else {\n        $target = $node;\n        if ($target.length) {\n          if (!(($target.closest('.nodes').length && $target.closest('.nodes').is('.hidden')) ||\n            ($target.closest('.hierarchy').length && $target.closest('.hierarchy').is('.hidden')) ||\n            ($target.closest('.vertical').length && ($target.closest('.nodes').is('.hidden') || $target.closest('.vertical').is('.hidden')))\n          )) {\n            return { 'exist': true, 'visible': true };\n          }\n          return { 'exist': true, 'visible': false };\n        }\n      }\n      return { 'exist': false, 'visible': false };\n    },\n    getParent: function ($node) {\n      return this.getRelatedNodes($node, 'parent');\n    },\n    getChildren: function ($node) {\n      return this.getRelatedNodes($node, 'children');\n    },\n    getSiblings: function ($node) {\n      return this.getRelatedNodes($node, 'siblings');\n    },\n    // find the related nodes\n    getRelatedNodes: function ($node, relation) {\n      if (!$node || !($node instanceof $) || !$node.is('.node')) {\n        return $();\n      }\n      if (relation === 'parent') {\n        return $node.closest('.nodes').siblings('.node');\n      } else if (relation === 'children') {\n        return $node.siblings('.nodes').children('.hierarchy').find('.node:first');\n      } else if (relation === 'siblings') {\n        return $node.closest('.hierarchy').siblings().find('.node:first');\n      } else {\n        return $();\n      }\n    },\n    hideParentEnd: function (event) {\n      $(event.target).removeClass('sliding');\n      event.data.parent.addClass('hidden');\n    },\n    // recursively hide the ancestor node and sibling nodes of the specified node\n    hideParent: function ($node) {\n      var $parent = $node.closest('.nodes').siblings('.node');\n      if ($parent.find('.spinner').length) {\n        $node.closest('.orgchart').data('inAjax', false);\n      }\n      // hide the sibling nodes\n      if (this.getNodeState($node, 'siblings').visible) {\n        this.hideSiblings($node);\n      }\n      // hide the lines\n      $node.parent().addClass('isAncestorsCollapsed');\n      // hide the superior nodes with transition\n      if (this.getNodeState($parent).visible) {\n        $parent.addClass('sliding slide-down').one('transitionend', { 'parent': $parent }, this.hideParentEnd);\n      }\n      // if the current node has the parent node, hide it recursively\n      if (this.getNodeState($parent, 'parent').visible) {\n        this.hideParent($parent);\n      }\n    },\n    showParentEnd: function (event) {\n      var $node = event.data.node;\n      $(event.target).removeClass('sliding');\n      if (this.isInAction($node)) {\n        this.switchVerticalArrow($node.children('.topEdge'));\n      }\n    },\n    // show the parent node of the specified node\n    showParent: function ($node) {\n      // just show only one superior level\n      var $parent = $node.closest('.nodes').siblings('.node').removeClass('hidden');\n      // just show only one line\n      $node.closest('.hierarchy').removeClass('isAncestorsCollapsed');\n      // show parent node with animation\n      this.repaint($parent[0]);\n      $parent.addClass('sliding').removeClass('slide-down').one('transitionend', { 'node': $node }, this.showParentEnd.bind(this));\n    },\n    stopAjax: function ($nodeLevel) {\n      if ($nodeLevel.find('.spinner').length) {\n        $nodeLevel.closest('.orgchart').data('inAjax', false);\n      }\n    },\n    isVisibleNode: function (index, elem) {\n      return this.getNodeState($(elem)).visible;\n    },\n    // do some necessary cleanup tasks when hide animation is finished\n    hideChildrenEnd: function (event) {\n      var $node = event.data.node;\n      event.data.animatedNodes.removeClass('sliding');\n      event.data.animatedNodes.closest('.nodes').addClass('hidden');\n      if (this.isInAction($node)) {\n        this.switchVerticalArrow($node.children('.bottomEdge'));\n      }\n    },\n    // recursively hide the descendant nodes of the specified node\n    hideChildren: function ($node) {\n      $node.closest('.hierarchy').addClass('isChildrenCollapsed');\n      var $lowerLevel = $node.siblings('.nodes');\n      this.stopAjax($lowerLevel);\n      var $animatedNodes = $lowerLevel.find('.node').filter(this.isVisibleNode.bind(this));\n      var isVerticalDesc = $lowerLevel.is('.vertical');\n      if (!isVerticalDesc) {\n        $animatedNodes.closest('.hierarchy').addClass('isCollapsedDescendant');\n      }\n      if ($lowerLevel.is('.vertical') || $lowerLevel.find('.vertical').length) {\n        $animatedNodes.find(this.options.icons.expanded).removeClass(this.options.icons.expanded).addClass(this.options.icons.collapsed);\n      }\n      this.repaint($animatedNodes.get(0));\n      $animatedNodes.addClass('sliding slide-up').eq(0).one('transitionend', { 'animatedNodes': $animatedNodes, 'lowerLevel': $lowerLevel, 'node': $node }, this.hideChildrenEnd.bind(this));\n    },\n    //\n    showChildrenEnd: function (event) {\n      var $node = event.data.node;\n      event.data.animatedNodes.removeClass('sliding');\n      if (this.isInAction($node)) {\n        this.switchVerticalArrow($node.children('.bottomEdge'));\n      }\n    },\n    // show the children nodes of the specified node\n    showChildren: function ($node) {\n      var that = this;\n      $node.closest('.hierarchy').removeClass('isChildrenCollapsed');\n      var $levels = $node.siblings('.nodes');\n      var isVerticalDesc = $levels.is('.vertical');\n      var $animatedNodes = isVerticalDesc\n        ? $levels.removeClass('hidden').find('.node').filter(this.isVisibleNode.bind(this))\n        : $levels.removeClass('hidden').children('.hierarchy').find('.node:first').filter(this.isVisibleNode.bind(this));\n      if (!isVerticalDesc) {\n        $animatedNodes.filter(':not(:only-child)').closest('.hierarchy').addClass('isChildrenCollapsed');\n        $animatedNodes.closest('.hierarchy').removeClass('isCollapsedDescendant');\n      }\n      // the two following statements are used to enforce browser to repaint\n      this.repaint($animatedNodes.get(0));\n      $animatedNodes.addClass('sliding').removeClass('slide-up').eq(0).one('transitionend', { 'node': $node, 'animatedNodes': $animatedNodes }, this.showChildrenEnd.bind(this));\n    },\n    //\n    hideSiblingsEnd: function (event) {\n      var $node = event.data.node;\n      var $nodeContainer = event.data.nodeContainer;\n      var direction = event.data.direction;\n      var $siblings = direction ? (direction === 'left' ? $nodeContainer.prevAll(':not(.hidden)') : $nodeContainer.nextAll(':not(.hidden)')) : $nodeContainer.siblings();\n      event.data.animatedNodes.removeClass('sliding');\n      $siblings.find('.node:gt(0)').filter(this.isVisibleNode.bind(this))\n        .removeClass('slide-left slide-right').addClass('slide-up');\n      $siblings.find('.nodes, .vertical').addClass('hidden')\n        .end().addClass('hidden');\n\n      if (this.isInAction($node)) {\n        this.switchHorizontalArrow($node);\n      }\n    },\n    // hide the sibling nodes of the specified node\n    hideSiblings: function ($node, direction) {\n      var that = this;\n      var $nodeContainer = $node.closest('.hierarchy').addClass('isSiblingsCollapsed');\n      if ($nodeContainer.siblings().find('.spinner').length) {\n        $node.closest('.orgchart').data('inAjax', false);\n      }\n      if (direction) {\n        if (direction === 'left') {\n          $nodeContainer.addClass('left-sibs')\n            .prevAll('.isSiblingsCollapsed').removeClass('isSiblingsCollapsed left-sibs').end()\n            .prevAll().addClass('isCollapsedSibling isChildrenCollapsed')\n            .find('.node').filter(this.isVisibleNode.bind(this)).addClass('sliding slide-right');\n        } else {\n          $nodeContainer.addClass('right-sibs')\n            .nextAll('.isSiblingsCollapsed').removeClass('isSiblingsCollapsed right-sibs').end()\n            .nextAll().addClass('isCollapsedSibling isChildrenCollapsed')\n            .find('.node').filter(this.isVisibleNode.bind(this)).addClass('sliding slide-left');\n        }\n      } else {\n        $nodeContainer.prevAll().find('.node').filter(this.isVisibleNode.bind(this)).addClass('sliding slide-right');\n        $nodeContainer.nextAll().find('.node').filter(this.isVisibleNode.bind(this)).addClass('sliding slide-left');\n        $nodeContainer.siblings().addClass('isCollapsedSibling isChildrenCollapsed');\n      }\n      var $animatedNodes = $nodeContainer.siblings().find('.sliding');\n      $animatedNodes.eq(0).one('transitionend', { 'node': $node, 'nodeContainer': $nodeContainer, 'direction': direction, 'animatedNodes': $animatedNodes }, this.hideSiblingsEnd.bind(this));\n    },\n    //\n    showSiblingsEnd: function (event) {\n      var $node = event.data.node;\n      event.data.visibleNodes.removeClass('sliding');\n      if (this.isInAction($node)) {\n        this.switchHorizontalArrow($node);\n        $node.children('.topEdge').removeClass(this.options.icons.expandToUp).addClass(this.options.icons.collapseToDown);\n      }\n    },\n    //\n    showRelatedParentEnd: function(event) {\n      $(event.target).removeClass('sliding');\n    },\n    // show the sibling nodes of the specified node\n    showSiblings: function ($node, direction) {\n      var that = this;\n      // firstly, show the sibling nodes\n      var $siblings = $();\n      var $nodeContainer = $node.closest('.hierarchy');\n      if (direction) {\n        if (direction === 'left') {\n          $siblings = $nodeContainer.prevAll().removeClass('hidden');\n        } else {\n          $siblings = $nodeContainer.nextAll().removeClass('hidden');\n        }\n      } else {\n        $siblings = $node.closest('.hierarchy').siblings().removeClass('hidden');\n      }\n      // secondly, show the lines\n      var $upperLevel = $node.closest('.nodes').siblings('.node');\n      if (direction) {\n        $nodeContainer.removeClass(direction + '-sibs');\n        if (!$nodeContainer.is('[class*=-sibs]')) {\n          $nodeContainer.removeClass('isSiblingsCollapsed');\n        }\n        $siblings.removeClass('isCollapsedSibling ' + direction + '-sibs');\n      } else {\n        $node.closest('.hierarchy').removeClass('isSiblingsCollapsed');\n        $siblings.removeClass('isCollapsedSibling');\n      }\n      // thirdly, show parent node if it is collapsed\n      if (!this.getNodeState($node, 'parent').visible) {\n        $node.closest('.hierarchy').removeClass('isAncestorsCollapsed');\n        $upperLevel.removeClass('hidden');\n        this.repaint($upperLevel[0]);\n        $upperLevel.addClass('sliding').removeClass('slide-down').one('transitionend', this.showRelatedParentEnd);\n      }\n      // lastly, show the sibling nodes with animation\n      var $visibleNodes = $siblings.find('.node').filter(this.isVisibleNode.bind(this));\n      this.repaint($visibleNodes.get(0));\n      $visibleNodes.addClass('sliding').removeClass('slide-left slide-right');\n      $visibleNodes.eq(0).one('transitionend', { 'node': $node, 'visibleNodes': $visibleNodes }, this.showSiblingsEnd.bind(this));\n    },\n    // start up loading status for requesting new nodes\n    startLoading: function ($edge) {\n      var $chart = this.$chart;\n      if (typeof $chart.data('inAjax') !== 'undefined' && $chart.data('inAjax') === true) {\n        return false;\n      }\n\n      $edge.addClass('hidden');\n      $edge.parent().append(`<i class=\"${this.options.icons.theme} ${this.options.icons.spinner} spinner\"></i>`)\n        .children().not('.spinner').css('opacity', 0.2);\n      $chart.data('inAjax', true);\n      $('.oc-export-btn').prop('disabled', true);\n      return true;\n    },\n    // terminate loading status for requesting new nodes\n    endLoading: function ($edge) {\n      var $node = $edge.parent();\n      $edge.removeClass('hidden');\n      $node.find('.spinner').remove();\n      $node.children().removeAttr('style');\n      this.$chart.data('inAjax', false);\n      $('.oc-export-btn').prop('disabled', false);\n    },\n    // whether the cursor is hovering over the node\n    isInAction: function ($node) {\n      return [\n        this.options.icons.expandToUp,\n        this.options.icons.collapseToDown,\n        this.options.icons.collapseToLeft,\n        this.options.icons.expandToRight\n      ].some((icon) => $node.children('.edge').attr('class').indexOf(icon) > -1);\n    },\n    //\n    switchVerticalArrow: function ($arrow) {\n      $arrow.toggleClass(`${this.options.icons.expandToUp} ${this.options.icons.collapseToDown}`);\n    },\n    //\n    switchHorizontalArrow: function ($node) {\n      var opts = this.options;\n      if (opts.toggleSiblingsResp && (typeof opts.ajaxURL === 'undefined' || $node.closest('.nodes').data('siblingsLoaded'))) {\n        var $prevSib = $node.parent().prev();\n        if ($prevSib.length) {\n          if ($prevSib.is('.hidden')) {\n            $node.children('.leftEdge').addClass(opts.icons.collapseToLeft).removeClass(opts.icons.expandToRight);\n          } else {\n            $node.children('.leftEdge').addClass(opts.icons.expandToRight).removeClass(opts.icons.collapseToLeft);\n          }\n        }\n        var $nextSib = $node.parent().next();\n        if ($nextSib.length) {\n          if ($nextSib.is('.hidden')) {\n            $node.children('.rightEdge').addClass(opts.icons.expandToRight).removeClass(opts.icons.collapseToLeft);\n          } else {\n            $node.children('.rightEdge').addClass(opts.icons.collapseToLeft).removeClass(opts.icons.expandToRight);\n          }\n        }\n      } else {\n        var $sibs = $node.parent().siblings();\n        var sibsVisible = $sibs.length ? !$sibs.is('.hidden') : false;\n        $node.children('.leftEdge').toggleClass(opts.icons.expandToRight, sibsVisible).toggleClass(opts.icons.collapseToLeft, !sibsVisible);\n        $node.children('.rightEdge').toggleClass(opts.icons.collapseToLeft, sibsVisible).toggleClass(opts.icons.expandToRight, !sibsVisible);\n      }\n    },\n    //\n    repaint: function (node) {\n      if (node) {\n        node.style.offsetWidth = node.offsetWidth;\n      }\n    },\n    // determines how to show arrow buttons \n    nodeEnterLeaveHandler: function (event) {\n      var $node = $(event.delegateTarget);\n      var flag = false;\n      if ($node.closest('.nodes.vertical').length) {\n        var $toggleBtn = $node.children('.toggleBtn');\n        if (event.type === 'mouseenter') {\n          if ($node.children('.toggleBtn').length) {\n            flag = this.getNodeState($node, 'children').visible;\n            $toggleBtn.toggleClass(this.options.icons.collapsed, !flag).toggleClass(this.options.icons.expanded, flag);\n          }\n        } else {\n          $toggleBtn.removeClass(`${this.options.icons.collapsed} ${this.options.icons.expanded}`);\n        }\n      } else {\n        var $topEdge = $node.children('.topEdge');\n        var $rightEdge = $node.children('.rightEdge');\n        var $bottomEdge = $node.children('.bottomEdge');\n        var $leftEdge = $node.children('.leftEdge');\n        if (event.type === 'mouseenter') {\n          if ($topEdge.length) {\n            flag = this.getNodeState($node, 'parent').visible;\n            $topEdge.toggleClass(this.options.icons.expandToUp, !flag).toggleClass(this.options.icons.collapseToDown, flag);\n          }\n          if ($bottomEdge.length) {\n            flag = this.getNodeState($node, 'children').visible;\n            $bottomEdge.toggleClass(this.options.icons.collapseToDown, !flag).toggleClass(this.options.icons.expandToUp, flag);\n          }\n          if ($leftEdge.length) {\n            this.switchHorizontalArrow($node);\n          }\n        } else {\n          $node.children('.edge').removeClass(`${this.options.icons.expandToUp} ${this.options.icons.collapseToDown} ${this.options.icons.collapseToLeft} ${this.options.icons.expandToRight}`);\n        }\n      }\n    },\n    //\n    nodeClickHandler: function (event) {\n      this.$chart.find('.focused').removeClass('focused');\n      $(event.delegateTarget).addClass('focused');\n    },\n    // load new nodes by ajax\n    loadNodes: function (rel, url, $edge) {\n      var that = this;\n      var opts = this.options;\n      $.ajax({ 'url': url, 'dataType': 'json' })\n      .done(function (data) {\n        if (that.$chart.data('inAjax')) {\n          if (rel === 'parent') {\n            if (!$.isEmptyObject(data)) {\n              that.addParent($edge.parent(), data);\n            }\n          } else if (rel === 'children') {\n            if (data.children.length) {\n              that.addChildren($edge.parent(), data[rel]);\n            }\n          } else {\n            that.addSiblings($edge.parent(), data.siblings ? data.siblings : data);\n          }\n          that.triggerLoadEvent($edge.parent(), rel);\n        }\n      })\n      .fail(function () {\n        console.log('Failed to get ' + rel + ' data');\n      })\n      .always(function () {\n        that.endLoading($edge);\n      });\n    },\n    //\n    HideFirstParentEnd: function (event) {\n      var $topEdge = event.data.topEdge;\n      var $node = $topEdge.parent();\n      if (this.isInAction($node)) {\n        this.switchVerticalArrow($topEdge);\n        this.switchHorizontalArrow($node);\n      }\n    },\n    // actions on clinking top edge of a node\n    topEdgeClickHandler: function (event) {\n      event.stopPropagation();\n      var that = this;\n      var $topEdge = $(event.target);\n      var $node = $(event.delegateTarget);\n      var parentState = this.getNodeState($node, 'parent');\n      if (parentState.exist) {\n        var $parent = $node.closest('.nodes').siblings('.node');\n        if ($parent.is('.sliding')) { return; }\n        // hide the ancestor nodes and sibling nodes of the specified node\n        if (parentState.visible) {\n          this.hideParent($node);\n          $parent.one('transitionend', { 'topEdge': $topEdge }, this.HideFirstParentEnd.bind(this));\n          this.triggerHideEvent($node, 'parent');\n        } else { // show the ancestors and siblings\n          this.showParent($node);\n          this.triggerShowEvent($node, 'parent');\n        }\n      } else { // load the new parent node of the specified node by ajax request\n        // start up loading status\n        if (this.startLoading($topEdge)) {\n          var opts = this.options;\n          var url = $.isFunction(opts.ajaxURL.parent) ? opts.ajaxURL.parent($node.data('nodeData')) : opts.ajaxURL.parent + $node[0].id;\n          this.loadNodes('parent', url, $topEdge);\n        }\n      }\n    },\n    // actions on clinking bottom edge of a node\n    bottomEdgeClickHandler: function (event) {\n      event.stopPropagation();\n      var $bottomEdge = $(event.target);\n      var $node = $(event.delegateTarget);\n      var childrenState = this.getNodeState($node, 'children');\n      if (childrenState.exist) {\n        var $children = $node.siblings('.nodes').children().children('.node');\n        if ($children.is('.sliding')) { return; }\n        // hide the descendant nodes of the specified node\n        if (childrenState.visible) {\n          this.hideChildren($node);\n          this.triggerHideEvent($node, 'children');\n        } else { // show the descendants\n          this.showChildren($node);\n          this.triggerShowEvent($node, 'children');\n        }\n      } else { // load the new children nodes of the specified node by ajax request\n        if (this.startLoading($bottomEdge)) {\n          var opts = this.options;\n          var url = $.isFunction(opts.ajaxURL.children) ? opts.ajaxURL.children($node.data('nodeData')) : opts.ajaxURL.children + $node[0].id;\n          this.loadNodes('children', url, $bottomEdge);\n        }\n      }\n    },\n    // actions on clicking horizontal edges\n    hEdgeClickHandler: function (event) {\n      event.stopPropagation();\n      var $hEdge = $(event.target);\n      var $node = $(event.delegateTarget);\n      var opts = this.options;\n      var siblingsState = this.getNodeState($node, 'siblings');\n      if (siblingsState.exist) {\n        var $siblings = $node.closest('.hierarchy').siblings();\n        if ($siblings.find('.sliding').length) { return; }\n        if (opts.toggleSiblingsResp) {\n          var $prevSib = $node.closest('.hierarchy').prev();\n          var $nextSib = $node.closest('.hierarchy').next();\n          if ($hEdge.is('.leftEdge')) {\n            if ($prevSib.is('.hidden')) {\n              this.showSiblings($node, 'left');\n              this.triggerShowEvent($node,'siblings');\n            } else {\n              this.hideSiblings($node, 'left');\n              this.triggerHideEvent($node, 'siblings');\n            }\n          } else {\n            if ($nextSib.is('.hidden')) {\n              this.showSiblings($node, 'right');\n              this.triggerShowEvent($node,'siblings');\n            } else {\n              this.hideSiblings($node, 'right');\n              this.triggerHideEvent($node, 'siblings');\n            }\n          }\n        } else {\n          if (siblingsState.visible) {\n            this.hideSiblings($node);\n            this.triggerHideEvent($node, 'siblings');\n          } else {\n            this.showSiblings($node);\n            this.triggerShowEvent($node, 'siblings');\n          }\n        }\n      } else {\n        // load the new sibling nodes of the specified node by ajax request\n        if (this.startLoading($hEdge)) {\n          var nodeId = $node[0].id;\n          var url = (this.getNodeState($node, 'parent').exist) ?\n            ($.isFunction(opts.ajaxURL.siblings) ? opts.ajaxURL.siblings($node.data('nodeData')) : opts.ajaxURL.siblings + nodeId) :\n            ($.isFunction(opts.ajaxURL.families) ? opts.ajaxURL.families($node.data('nodeData')) : opts.ajaxURL.families + nodeId);\n          this.loadNodes('siblings', url, $hEdge);\n        }\n      }\n    },\n    //\n    expandVNodesEnd: function (event) {\n      event.data.vNodes.removeClass('sliding');\n    },\n    //\n    collapseVNodesEnd: function (event) {\n      event.data.vNodes.removeClass('sliding').closest('ul').addClass('hidden');\n    },\n    // event handler for toggle buttons in Hybrid(horizontal + vertical) OrgChart\n    toggleVNodes: function (event) {\n      var $toggleBtn = $(event.target);\n      var $descWrapper = $toggleBtn.parent().next();\n      var $descendants = $descWrapper.find('.node');\n      var $children = $descWrapper.children().children('.node');\n      if ($children.is('.sliding')) { return; }\n      $toggleBtn.toggleClass(`${this.options.icons.collapsed} ${this.options.icons.expanded}`);\n      if ($descendants.eq(0).is('.slide-up')) {\n        $descWrapper.removeClass('hidden');\n        this.repaint($children.get(0));\n        $children.addClass('sliding').removeClass('slide-up').eq(0).one('transitionend', { 'vNodes': $children }, this.expandVNodesEnd);\n      } else {\n        $descendants.addClass('sliding slide-up').eq(0).one('transitionend', { 'vNodes': $descendants }, this.collapseVNodesEnd);\n        $descendants.find('.toggleBtn').removeClass(`${this.options.icons.collapsed} ${this.options.icons.expanded}`);\n      }\n    },\n    //\n    createGhostNode: function (event) {\n      var $nodeDiv = $(event.target);\n      var opts = this.options;\n      var origEvent = event.originalEvent;\n      var isFirefox = /firefox/.test(window.navigator.userAgent.toLowerCase());\n      var ghostNode, nodeCover;\n      if (!document.querySelector('.ghost-node')) {\n        ghostNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n        if (!ghostNode.classList) return;\n        ghostNode.classList.add('ghost-node');\n        nodeCover = document.createElementNS('http://www.w3.org/2000/svg','rect');\n        ghostNode.appendChild(nodeCover);\n        $nodeDiv.closest('.orgchart').append(ghostNode);\n      } else {\n        ghostNode = $nodeDiv.closest('.orgchart').children('.ghost-node').get(0);\n        nodeCover = $(ghostNode).children().get(0);\n      }\n      var transValues = $nodeDiv.closest('.orgchart').css('transform').split(',');\n      var isHorizontal = opts.direction === 't2b' || opts.direction === 'b2t';\n      var scale = Math.abs(window.parseFloat(isHorizontal ? transValues[0].slice(transValues[0].indexOf('(') + 1) : transValues[1]));\n      ghostNode.setAttribute('width', isHorizontal ? $nodeDiv.outerWidth(false) : $nodeDiv.outerHeight(false));\n      ghostNode.setAttribute('height', isHorizontal ? $nodeDiv.outerHeight(false) : $nodeDiv.outerWidth(false));\n      nodeCover.setAttribute('x',5 * scale);\n      nodeCover.setAttribute('y',5 * scale);\n      nodeCover.setAttribute('width', 120 * scale);\n      nodeCover.setAttribute('height', 40 * scale);\n      nodeCover.setAttribute('rx', 4 * scale);\n      nodeCover.setAttribute('ry', 4 * scale);\n      nodeCover.setAttribute('stroke-width', 1 * scale);\n      var xOffset = origEvent.offsetX * scale;\n      var yOffset = origEvent.offsetY * scale;\n      if (opts.direction === 'l2r') {\n        xOffset = origEvent.offsetY * scale;\n        yOffset = origEvent.offsetX * scale;\n      } else if (opts.direction === 'r2l') {\n        xOffset = $nodeDiv.outerWidth(false) - origEvent.offsetY * scale;\n        yOffset = origEvent.offsetX * scale;\n      } else if (opts.direction === 'b2t') {\n        xOffset = $nodeDiv.outerWidth(false) - origEvent.offsetX * scale;\n        yOffset = $nodeDiv.outerHeight(false) - origEvent.offsetY * scale;\n      }\n      if (isFirefox) { // hack for old version of Firefox(< 48.0)\n        nodeCover.setAttribute('fill', 'rgb(255, 255, 255)');\n        nodeCover.setAttribute('stroke', 'rgb(191, 0, 0)');\n        var ghostNodeWrapper = document.createElement('img');\n        ghostNodeWrapper.src = 'data:image/svg+xml;utf8,' + (new XMLSerializer()).serializeToString(ghostNode);\n        origEvent.dataTransfer.setDragImage(ghostNodeWrapper, xOffset, yOffset);\n      } else {\n        // IE/Edge do not support this, so only use it if we can\n        if (origEvent.dataTransfer.setDragImage)\n          origEvent.dataTransfer.setDragImage(ghostNode, xOffset, yOffset);\n      }\n    },\n    // get the level amount of a hierachy\n    getUpperLevel: function ($node) {\n      if (!$node.is('.node')) {\n        return 0;\n      }\n      return $node.parents('.hierarchy').length;\n    },\n    // get the level amount of a hierachy\n    getLowerLevel: function ($node) {\n      if (!$node.is('.node')) {\n        return 0;\n      }\n      return $node.closest('.hierarchy').find('.nodes').length + 1;\n    },\n    // get nodes in level order traversal\n    getLevelOrderNodes: function ($root) {\n      if(!$root) return [];\n      var queue = [];\n      var output = [];\n      queue.push($root);\n      while(queue.length) {\n        var row = [];\n        for(var i = 0; i < queue.length; i++) {\n            var cur = queue.shift();\n            var children = this.getChildren(cur);\n            if(children.length) {\n              queue.push(children.toArray().flat());\n            }\n            row.push($(cur));\n        }\n        output.push(row);\n      }\n      return output;\n    },\n    //\n    filterAllowedDropNodes: function ($dragged) {\n      var opts = this.options;\n      // what is being dragged?  a node, or something within a node?\n      var draggingNode = $dragged.closest('[draggable]').hasClass('node');\n      var $dragZone = $dragged.closest('.nodes').siblings('.node'); // parent node\n      var $dragHier = $dragged.closest('.hierarchy').find('.node'); // this node, and its children\n      this.$chart.data('dragged', $dragged)\n        .find('.node').each(function (index, node) {\n          if (!draggingNode || $dragHier.index(node) === -1) {\n            if (opts.dropCriteria) {\n              if (opts.dropCriteria($dragged, $dragZone, $(node))) {\n                $(node).addClass('allowedDrop');\n              }\n            } else {\n              $(node).addClass('allowedDrop');\n            }\n          }\n        });\n    },\n    //\n    dragstartHandler: function (event) {\n      event.originalEvent.dataTransfer.setData('text/html', 'hack for firefox');\n      // if users enable zoom or direction options\n      if (this.$chart.css('transform') !== 'none') {\n        this.createGhostNode(event);\n      }\n      this.filterAllowedDropNodes($(event.target));\n    },\n    //\n    dragoverHandler: function (event) {\n      if (!$(event.delegateTarget).is('.allowedDrop')) {\n        event.originalEvent.dataTransfer.dropEffect = 'none';\n      } else {\n        // default action for drag-and-drop of div is not to drop, so preventing default action for nodes which have allowedDrop class\n        //to fix drag and drop on IE and Edge\n        event.preventDefault();\n      }\n    },\n    //\n    dragendHandler: function (event) {\n      this.$chart.find('.allowedDrop').removeClass('allowedDrop');\n    },\n    // when user drops the node, it will be removed from original parent node and be added to new parent node\n    dropHandler: async function (event) {\n      var that = this;\n      var $dropZone = $(event.delegateTarget);\n      var $dragged = this.$chart.data('dragged');\n\n      // Pass on drops which are not nodes (since they are not our doing)\n      if (!$dragged.hasClass('node')) {\n        this.$chart.triggerHandler({ 'type': 'otherdropped.orgchart', 'draggedItem': $dragged, 'dropZone': $dropZone });\n        return;\n      }\n\n      if (!$dropZone.hasClass('allowedDrop')) {\n          // We are trying to drop a node into a node which isn't allowed\n          // IE/Edge have a habit of allowing this, so we need our own double-check\n          return;\n      }\n\n      var $dragZone = $dragged.closest('.nodes').siblings('.node');\n      var dropEvent = $.Event('nodedrop.orgchart');\n      this.$chart.trigger(dropEvent, { 'draggedNode': $dragged, 'dragZone': $dragZone, 'dropZone': $dropZone });\n      if (dropEvent.isDefaultPrevented()) {\n        return;\n      }\n      // special process for hybrid chart\n      var datasource = this.$chart.data('options').data;\n      var digger = new JSONDigger(datasource, this.$chart.data('options').nodeId, 'children');\n      const hybridNode = digger.findOneNode({ 'isHybrid': true });\n      if (this.$chart.data('options').verticalLevel > 1 || hybridNode) {\n        var draggedNode = digger.findNodeById($dragged.data('nodeData').id);\n        var copy = Object.assign({}, draggedNode);\n        digger.removeNode(draggedNode.id);\n        var dropNode = digger.findNodeById($dropZone.data('nodeData').id);\n        if (dropNode.children) {\n          dropNode.children.push(copy);\n        } else {\n          dropNode.children = [copy];\n        }\n        that.init({ 'data': datasource });\n      } else {\n        // The folowing code snippets are used to process horizontal chart\n        // firstly, deal with the hierarchy of drop zone\n        if (!$dropZone.siblings('.nodes').length) { // if the drop zone is a leaf node\n          $dropZone.append(`<i class=\"edge verticalEdge bottomEdge ${this.options.icons.theme}\"></i>`)\n            .after('<ul class=\"nodes\"></ul>')\n            .siblings('.nodes').append($dragged.find('.horizontalEdge').remove().end().closest('.hierarchy'));\n          if ($dropZone.children('.title').length) {\n            $dropZone.children('.title').prepend(`<i class=\"${this.options.icons.theme} ${this.$chart.data('options').icons.parentNode} parentNodeSymbol\"></i>`);\n          }\n        } else {\n          var horizontalEdges = `<i class=\"edge horizontalEdge rightEdge ${this.options.icons.theme}\"></i><i class=\"edge horizontalEdge leftEdge ${this.options.icons.theme}\"></i>`;\n          if (!$dragged.find('.horizontalEdge').length) {\n            $dragged.append(horizontalEdges);\n          }\n          $dropZone.siblings('.nodes').append($dragged.closest('.hierarchy'));\n          var $dropSibs = $dragged.closest('.hierarchy').siblings().find('.node:first');\n          if ($dropSibs.length === 1) {\n            $dropSibs.append(horizontalEdges);\n          }\n        }\n        // secondly, deal with the hierarchy of dragged node\n        if ($dragZone.siblings('.nodes').children('.hierarchy').length === 1) { // if there is only one sibling node left\n          $dragZone.siblings('.nodes').children('.hierarchy').find('.node:first')\n            .find('.horizontalEdge').remove();\n        } else if ($dragZone.siblings('.nodes').children('.hierarchy').length === 0) {\n          $dragZone.find('.bottomEdge, .parentNodeSymbol').remove()\n            .end().siblings('.nodes').remove();\n        }\n      }\n    },\n    //\n    touchstartHandler: function (event) {\n      if (this.touchHandled)\n        return;\n\n      if (event.touches && event.touches.length > 1)\n        return;\n\n      this.touchHandled = true;\n      this.touchMoved = false; // this is so we can work out later if this was a 'press' or a 'drag' touch\n      event.preventDefault();\n    },\n    //\n    touchmoveHandler: function (event) {\n      if (!this.touchHandled)\n        return;\n\n      if (event.touches && event.touches.length > 1)\n        return;\n\n      event.preventDefault();\n\n      if (!this.touchMoved) {\n        // we do not bother with createGhostNode (dragstart does) since the touch event does not have a dataTransfer property\n        this.filterAllowedDropNodes($(event.currentTarget));  // will also set 'this.$chart.data('dragged')' for us\n        // create an image which can be used to illustrate the drag (our own createGhostNode)\n        this.touchDragImage = this.createDragImage(event, this.$chart.data('dragged')[0]);\n      }\n      this.touchMoved = true;\n\n      // move our dragimage so it follows our finger\n      this.moveDragImage(event, this.touchDragImage);\n\n      var $touching = $(document.elementFromPoint(event.touches[0].clientX, event.touches[0].clientY));\n      var $touchingNodes = $touching.closest('div.node');\n      if ($touchingNodes.length > 0) {\n        var touchingNodeElement = $touchingNodes[0];\n        if ($touchingNodes.is('.allowedDrop')) {\n          this.touchTargetNode = touchingNodeElement;\n        }\n        else {\n          this.touchTargetNode = null;\n        }\n      }\n      else {\n        this.touchTargetNode = null;\n      }\n    },\n    //\n    touchendHandler: function (event) {\n      if (!this.touchHandled) {\n          return;\n      }\n      this.destroyDragImage();\n      if (this.touchMoved) {\n          // we've had movement, so this was a 'drag' touch\n          if (this.touchTargetNode) {\n              var fakeEventForDropHandler = { delegateTarget: this.touchTargetNode };\n              this.dropHandler(fakeEventForDropHandler);\n              this.touchTargetNode = null;\n          }\n          this.dragendHandler(event);\n      }\n      else {\n          // we did not move, so this was a 'press' touch (fake a click)\n          var firstTouch = event.changedTouches[0];\n          var fakeMouseClickEvent = document.createEvent('MouseEvents');\n          fakeMouseClickEvent.initMouseEvent('click', true, true, window, 1, firstTouch.screenX, firstTouch.screenY, firstTouch.clientX, firstTouch.clientY, event.ctrlKey, event.altKey, event.shiftKey, event.metaKey, 0, null);\n          event.target.dispatchEvent(fakeMouseClickEvent);\n      }\n      this.touchHandled = false;\n    },\n    //\n    createDragImage: function (event, source) {\n      var dragImage = source.cloneNode(true);\n      this.copyStyle(source, dragImage);\n      dragImage.style.top = dragImage.style.left = '-9999px';\n      var sourceRectangle = source.getBoundingClientRect();\n      var sourcePoint = this.getTouchPoint(event);\n      this.touchDragImageOffset = { x: sourcePoint.x - sourceRectangle.left, y: sourcePoint.y - sourceRectangle.top };\n      dragImage.style.opacity = '0.5';\n      document.body.appendChild(dragImage);\n      return dragImage;\n    },\n    //\n    destroyDragImage: function () {\n      if (this.touchDragImage && this.touchDragImage.parentElement)\n        this.touchDragImage.parentElement.removeChild(this.touchDragImage);\n      this.touchDragImageOffset = null;\n      this.touchDragImage = null;\n    },\n    //\n    copyStyle: function (src, dst) {\n      // remove potentially troublesome attributes\n      var badAttributes = ['id', 'class', 'style', 'draggable'];\n      badAttributes.forEach(function (att) {\n          dst.removeAttribute(att);\n      });\n      // copy canvas content\n      if (src instanceof HTMLCanvasElement) {\n        var cSrc = src, cDst = dst;\n        cDst.width = cSrc.width;\n        cDst.height = cSrc.height;\n        cDst.getContext('2d').drawImage(cSrc, 0, 0);\n      }\n      // copy style (without transitions)\n      var cs = getComputedStyle(src);\n      for (var i = 0; i < cs.length; i++) {\n        var key = cs[i];\n        if (key.indexOf('transition') < 0) {\n          dst.style[key] = cs[key];\n        }\n      }\n      dst.style.pointerEvents = 'none';\n      // and repeat for all children\n      for (var i = 0; i < src.children.length; i++) {\n        this.copyStyle(src.children[i], dst.children[i]);\n      }\n    },\n    //\n    getTouchPoint: function (event) {\n      if (event && event.touches) {\n        event = event.touches[0];\n      }\n      return {\n        x: event.clientX,\n        y: event.clientY\n      };\n    },\n    //\n    moveDragImage: function (event, image) {\n      if (!event || !image)\n        return;\n      var orgChartMaster = this;\n      requestAnimationFrame(function () {\n        var pt = orgChartMaster.getTouchPoint(event);\n        var s = image.style;\n        s.position = 'absolute';\n        s.pointerEvents = 'none';\n        s.zIndex = '999999';\n        if (orgChartMaster.touchDragImageOffset) {\n            s.left = Math.round(pt.x - orgChartMaster.touchDragImageOffset.x) + 'px';\n            s.top = Math.round(pt.y - orgChartMaster.touchDragImageOffset.y) + 'px';\n        }\n      });\n    },\n    //\n    bindDragDrop: function ($node) {\n      $node.on('dragstart', this.dragstartHandler.bind(this))\n        .on('dragover', this.dragoverHandler.bind(this))\n        .on('dragend', this.dragendHandler.bind(this))\n        .on('drop', this.dropHandler.bind(this))\n        .on('touchstart', this.touchstartHandler.bind(this))\n        .on('touchmove', this.touchmoveHandler.bind(this))\n        .on('touchend', this.touchendHandler.bind(this));\n    },\n    // create node\n    createNode: function (data) {\n      var that = this;\n      var opts = this.options;\n      var level = data.level;\n      if (data.children && data[opts.nodeId]) {\n        $.each(data.children, function (index, child) {\n          child.parentId = data[opts.nodeId]\n        });\n      }\n      // construct the content of node\n      var $nodeDiv = $('<div' + (opts.draggable ? ' draggable=\"true\"' : '') + (data[opts.nodeId] ? ' id=\"' + data[opts.nodeId] + '\"' : '') + (data.parentId ? ' data-parent=\"' + data.parentId + '\"' : '') + '>')\n        .addClass('node ' + (data.className || '') +  (level > opts.visibleLevel ? ' slide-up' : ''));\n      if (opts.nodeTemplate) {\n        $nodeDiv.append(opts.nodeTemplate(data));\n      } else {\n        $nodeDiv.append('<div class=\"title\">' + data[opts.nodeTitle] + '</div>')\n          .append(typeof opts.nodeContent !== 'undefined' ? '<div class=\"content\">' + (data[opts.nodeContent] || '') + '</div>' : '');\n      }\n      //\n      var nodeData = $.extend({}, data);\n      delete nodeData.children;\n      $nodeDiv.data('nodeData', nodeData);\n      // append 4 direction arrows or expand/collapse buttons\n      var flags = data.relationship || '';\n      if ((opts.verticalLevel && level >= opts.verticalLevel) || data.isVertical) {\n        if (Number(flags.substr(2,1))) {\n          $nodeDiv.append(`<i class=\"toggleBtn ${opts.icons.theme}\"></i>`)\n            .children('.title').prepend(`<i class=\"${opts.icons.theme} ${opts.icons.parentNode} parentNodeSymbol\"></i>`);\n        }\n      } else if (data.isHybrid) {\n        if (Number(flags.substr(2,1))) {\n          $nodeDiv.append(`<i class=\"edge verticalEdge bottomEdge ${opts.icons.theme}\"></i>`)\n            .children('.title').prepend(`<i class=\"${opts.icons.theme} ${opts.icons.parentNode} parentNodeSymbol\"></i>`);\n        }\n      } else {\n        if (Number(flags.substr(0,1))) {\n          $nodeDiv.append(`<i class=\"edge verticalEdge topEdge ${opts.icons.theme}\"></i>`);\n        }\n        if(Number(flags.substr(1,1))) {\n          $nodeDiv.append(`<i class=\"edge horizontalEdge rightEdge ${opts.icons.theme}\"></i><i class=\"edge horizontalEdge leftEdge ${opts.icons.theme}\"></i>`);\n        }\n        if(Number(flags.substr(2,1))) {\n          $nodeDiv.append(`<i class=\"edge verticalEdge bottomEdge ${opts.icons.theme}\"></i>`)\n            .children('.title').prepend(`<i class=\"${opts.icons.theme} ${opts.icons.parentNode} parentNodeSymbol\"></i>`);\n        }\n      }\n\n      $nodeDiv.on('mouseenter mouseleave', this.nodeEnterLeaveHandler.bind(this));\n      $nodeDiv.on('click', this.nodeClickHandler.bind(this));\n      $nodeDiv.on('click', '.topEdge', this.topEdgeClickHandler.bind(this));\n      $nodeDiv.on('click', '.bottomEdge', this.bottomEdgeClickHandler.bind(this));\n      $nodeDiv.on('click', '.leftEdge, .rightEdge', this.hEdgeClickHandler.bind(this));\n      $nodeDiv.on('click', '.toggleBtn', this.toggleVNodes.bind(this));\n\n      if (opts.draggable) {\n        this.bindDragDrop($nodeDiv);\n        this.touchHandled = false;\n        this.touchMoved = false;\n        this.touchTargetNode = null;\n      }\n      // allow user to append dom modification after finishing node create of orgchart\n      if (opts.createNode) {\n        opts.createNode($nodeDiv, data);\n      }\n\n      return $nodeDiv;\n    },\n    // recursively build the tree\n    buildHierarchy: function ($appendTo, data) {\n      var that = this;\n      var opts = this.options;\n      var level = 0;\n      if (data.level) {\n        level = data.level;\n      } else {\n        level = data.level = $appendTo.parentsUntil('.orgchart', '.nodes').length;\n      }\n      // Construct the node\n      if (Object.keys(data).length > 2) {\n        $appendTo.append(this.createNode(data));\n      }\n      // Construct the \"inferior nodes\"\n      if (data.children && data.children.length) {\n        var isHidden = level + 1 > opts.visibleLevel || (data.collapsed !== undefined && data.collapsed);\n        var $nodesLayer;\n        if ((opts.verticalLevel && (level + 1) >= opts.verticalLevel) || data.isHybrid) {\n          $nodesLayer = $('<ul class=\"nodes\">');\n          if (isHidden && (opts.verticalLevel && (level + 1) >= opts.verticalLevel)) {\n            $nodesLayer.addClass('hidden');\n          }\n          if (((opts.verticalLevel && level + 1 === opts.verticalLevel) || data.isHybrid)\n            && !$appendTo.closest('.vertical').length) {\n              $appendTo.append($nodesLayer.addClass('vertical'));\n          } else {\n            $appendTo.append($nodesLayer);\n          }\n        } else {\n          $nodesLayer = $('<ul class=\"nodes' + (isHidden ? ' hidden' : '') + '\">');\n          if (Object.keys(data).length === 2) {\n            $appendTo.append($nodesLayer);\n          } else {\n            if (isHidden) {\n              $appendTo.addClass('isChildrenCollapsed');\n            }\n            $appendTo.append($nodesLayer);\n          }\n        }\n        // recurse through children nodes\n        $.each(data.children, function () {\n          var $nodeCell = $('<li class=\"hierarchy\">');\n          $nodesLayer.append($nodeCell);\n          this.level = level + 1;\n          that.buildHierarchy($nodeCell, this);\n        });\n      }\n    },\n    // build the child nodes of specific node\n    buildChildNode: function ($appendTo, data) {\n      this.buildHierarchy($appendTo, { 'children': data });\n    },\n    // exposed method\n    addChildren: function ($node, data) {\n      this.buildChildNode($node.closest('.hierarchy'), data);\n      if (!$node.find('.parentNodeSymbol').length) {\n        $node.children('.title').prepend(`<i class=\"${this.options.icons.theme} ${this.options.icons.parentNode} parentNodeSymbol\"></i>`);\n      }\n      if ($node.closest('.nodes.vertical').length) {\n        if (!$node.children('.toggleBtn').length) {\n          $node.append(`<i class=\"toggleBtn ${this.options.icons.theme}\"></i>`);\n        }\n      } else {\n        if (!$node.children('.bottomEdge').length) {\n          $node.append(`<i class=\"edge verticalEdge bottomEdge ${this.options.icons.theme}\"></i>`);\n        }\n      }\n      if (this.isInAction($node)) {\n        this.switchVerticalArrow($node.children('.bottomEdge'));\n      }\n    },\n    // build the parent node of specific node\n    buildParentNode: function ($currentRoot, data) {\n      data.relationship = data.relationship || '001';\n      var $newRootWrapper = $('<ul class=\"nodes\"><li class=\"hierarchy\"></li></ul>')\n        .find('.hierarchy').append(this.createNode(data)).end();\n      this.$chart.prepend($newRootWrapper)\n        .find('.hierarchy:first').append($currentRoot.closest('ul').addClass('nodes'));\n    },\n    // exposed method\n    addParent: function ($currentRoot, data) {\n      this.buildParentNode($currentRoot, data);\n      if (!$currentRoot.children('.topEdge').length) {\n        $currentRoot.children('.title').after(`<i class=\"edge verticalEdge topEdge ${this.options.icons.theme}\"></i>`);\n      }\n      if (this.isInAction($currentRoot)) {\n        this.switchVerticalArrow($currentRoot.children('.topEdge'));\n      }\n    },\n    // build the sibling nodes of specific node\n    buildSiblingNode: function ($nodeChart, data) {\n      var newSiblingCount = $.isArray(data) ? data.length : data.children.length;\n      var existingSibligCount = $nodeChart.parent().is('.nodes') ? $nodeChart.siblings().length + 1 : 1;\n      var siblingCount = existingSibligCount + newSiblingCount;\n      var insertPostion = (siblingCount > 1) ? Math.floor(siblingCount/2 - 1) : 0;\n      // just build the sibling nodes for the specific node\n      if ($nodeChart.closest('.nodes').parent().is('.hierarchy')) {\n        this.buildChildNode($nodeChart.parent().closest('.hierarchy'), data);\n        var $siblings = $nodeChart.parent().closest('.hierarchy').children('.nodes:last').children('.hierarchy');\n        if (existingSibligCount > 1) {\n          $siblings.eq(0).before($nodeChart.siblings().addBack().unwrap());\n        } else {\n          $siblings.eq(insertPostion).after($nodeChart.unwrap());\n        }\n      } else { // build the sibling nodes and parent node for the specific ndoe\n        this.buildHierarchy($nodeChart.parent().prepend($('<li class=\"hierarchy\">')).children('.hierarchy:first'), data);\n        $nodeChart.prevAll('.hierarchy').children('.nodes').children().eq(insertPostion).after($nodeChart);\n      }\n    },\n    //\n    addSiblings: function ($node, data) {\n      this.buildSiblingNode($node.closest('.hierarchy'), data);\n      $node.closest('.nodes').data('siblingsLoaded', true);\n      if (!$node.children('.leftEdge').length) {\n        $node.children('.topEdge').after(`<i class=\"edge horizontalEdge rightEdge ${this.options.icons.theme}\"></i><i class=\"edge horizontalEdge leftEdge ${this.options.icons.theme}\"></i>`);\n      }\n      if (this.isInAction($node)) {\n        this.switchHorizontalArrow($node);\n        $node.children('.topEdge').removeClass(this.options.icons.expandToUp).addClass(this.options.icons.collapseToDown);\n      }\n    },\n    // remove node and its descendent nodes\n    removeNodes: function ($node) {\n      var $wrapper = $node.closest('.hierarchy').parent();\n      if ($wrapper.parent().is('.hierarchy')) {\n        if (this.getNodeState($node, 'siblings').exist) {\n          $node.closest('.hierarchy').remove();\n          if ($wrapper.children().length === 1) {\n            $wrapper.find('.node:first .horizontalEdge').remove();\n          }\n        } else {\n          $wrapper.siblings('.node').find('.bottomEdge').remove()\n            .end().end().remove();\n        }\n      } else { // if $node is root node\n        $wrapper.closest('.orgchart').remove();\n      }\n    },\n    //\n    hideDropZones: function () {\n      // Remove all the 'this is a drop zone' indicators\n      var orgChartObj = this;\n      orgChartObj.$chart.find('.allowedDrop')\n        .removeClass('allowedDrop');\n    },\n    //\n    showDropZones: function (dragged) {\n      // Highlight all the 'drop zones', and set dragged, so that the drop/enter can work out what happens later\n      // TODO: This assumes all nodes are droppable: it doesn't run the custom isDroppable function - it should!\n      var orgChartObj = this;\n      orgChartObj.$chart.find('.node')\n        .each(function (index, node) {\n          $(node).addClass('allowedDrop');\n        });\n      orgChartObj.$chart.data('dragged', $(dragged));\n    },\n    //\n    processExternalDrop: function (dropZone, dragged) {\n      // Allow an external drop event to be handled by one of our nodes\n      if (dragged) {\n        this.$chart.data('dragged', $(dragged));\n      }\n      var droppedOnNode = dropZone.closest('.node');\n      // would like to just call 'dropZoneHandler', but I can't reach it from here\n      // instead raise a drop event on the node element\n      droppedOnNode.triggerHandler({ 'type': 'drop' });\n    },\n    //\n    exportPDF: function(canvas, exportFilename){\n      var doc = {};\n      var docWidth = Math.floor(canvas.width);\n      var docHeight = Math.floor(canvas.height);\n      if (!window.jsPDF) {\n        window.jsPDF = window.jspdf.jsPDF;\n      }\n\n      if (docWidth > docHeight) {\n        doc = new jsPDF({\n          orientation: 'landscape',\n          unit: 'px',\n          format: [docWidth, docHeight]\n        });\n      } else {\n        doc = new jsPDF({\n          orientation: 'portrait',\n          unit: 'px',\n          format: [docHeight, docWidth]\n        });\n      }\n      doc.addImage(canvas.toDataURL(), 'png', 0, 0);\n      doc.save(exportFilename + '.pdf');\n    },\n    //\n    exportPNG: function(canvas, exportFilename){\n      var that = this;\n      var isWebkit = 'WebkitAppearance' in document.documentElement.style;\n      var isFf = !!window.sidebar;\n      var isEdge = navigator.appName === 'Microsoft Internet Explorer' || (navigator.appName === \"Netscape\" && navigator.appVersion.indexOf('Edge') > -1);\n      var $chartContainer = this.$chartContainer;\n\n      if ((!isWebkit && !isFf) || isEdge) {\n        window.navigator.msSaveBlob(canvas.msToBlob(), exportFilename + '.png');\n      } else {\n        var selector = '.download-btn' + (that.options.chartClass !== '' ? '.' + that.options.chartClass : '');\n\n        if (!$chartContainer.find(selector).length) {\n          $chartContainer.append('<a class=\"download-btn' + (that.options.chartClass !== '' ? ' ' + that.options.chartClass : '') + '\"'\n                                 + ' download=\"' + exportFilename + '.png\"></a>');\n        }\n\n        $chartContainer.find(selector).attr('href', canvas.toDataURL())[0].click();\n      }\n    },\n    //\n    export: function (exportFilename, exportFileextension) {\n      var that = this;\n      exportFilename = (typeof exportFilename !== 'undefined') ?  exportFilename : this.options.exportFilename;\n      exportFileextension = (typeof exportFileextension !== 'undefined') ?  exportFileextension : this.options.exportFileextension;\n      if ($(this).children('.spinner').length) {\n        return false;\n      }\n      var $chartContainer = this.$chartContainer;\n      var $mask = $chartContainer.find('.mask');\n      if (!$mask.length) {\n        $chartContainer.append(`<div class=\"mask\"><i class=\"${this.options.icons.theme} ${this.options.icons.spinner} spinner\"></i></div>`);\n      } else {\n        $mask.removeClass('hidden');\n      }\n      var sourceChart = $chartContainer.addClass('canvasContainer').find('.orgchart:not(\".hidden\")').get(0);\n      var flag = that.options.direction === 'l2r' || that.options.direction === 'r2l';\n      html2canvas(sourceChart, {\n        'width': flag ? sourceChart.clientHeight : sourceChart.clientWidth,\n        'height': flag ? sourceChart.clientWidth : sourceChart.clientHeight,\n        'onclone': function (cloneDoc) {\n          $(cloneDoc).find('.canvasContainer').css('overflow', 'visible')\n            .find('.orgchart:not(\".hidden\"):first').css('transform', '');\n        }\n      })\n      .then(function (canvas) {\n        $chartContainer.find('.mask').addClass('hidden');\n\n        if (exportFileextension.toLowerCase() === 'pdf') {\n          that.exportPDF(canvas, exportFilename);\n        } else {\n          that.exportPNG(canvas, exportFilename);\n        }\n\n        $chartContainer.removeClass('canvasContainer');\n      }, function () {\n        $chartContainer.removeClass('canvasContainer');\n      });\n    }\n  };\n\n  $.fn.orgchart = function (opts) {\n    return new OrgChart(this, opts).init();\n  };\n\n}));\n"],"names":["factory","module","exports","require","window","document","jQuery","$","undefined","OrgChart","elem","opts","this","$chartContainer","defaultOptions","icons","theme","parentNode","expandToUp","collapseToDown","collapseToLeft","expandToRight","collapsed","expanded","spinner","nodeTitle","nodeId","toggleSiblingsResp","visibleLevel","chartClass","exportButton","exportButtonName","exportFilename","exportFileextension","draggable","direction","pan","zoom","zoominLimit","zoomoutLimit","prototype","init","that","options","extend","data","$chart","remove","class","click","event","target","closest","length","find","removeClass","$root","MutationObserver","triggerInitEvent","append","type","buildHierarchy","buildJsonDS","children","ajaxURL","attachRel","ajax","url","dataType","done","textStatus","jqXHR","fail","errorThrown","console","log","always","attachExportButton","bindPan","bindZoom","mo","mutations","disconnect","initTime","i","j","addedNodes","classList","contains","initCompleted","initEvent","Event","trigger","observe","childList","triggerLoadEvent","$target","rel","triggerShowEvent","triggerHideEvent","$exportBtn","text","e","preventDefault","export","after","setOptions","val","unbindPan","unbindZoom","panStartHandler","delegateTarget","touches","css","temp","lastX","lastY","lastTf","startX","split","indexOf","parseInt","startY","targetTouches","pageX","pageY","on","newX","newY","matrix","join","panEndHandler","chart","off","zoomWheelHandler","oc","newScale","originalEvent","deltaY","setChartScale","zoomStartHandler","dist","getPinchDist","zoomingHandler","zoomEndHandler","diff","Math","sqrt","clientX","clientY","targetScale","abs","parseFloat","$li","subObj","name","contents","eq","trim","relationship","parent","is","siblings","each","key","value","push","flags","forEach","item","isHybrid","isVertical","loopChart","includeNodeData","$node","id","getHierarchy","valid","getNodeState","relation","isVerticalNode","parents","exist","visible","getParent","getRelatedNodes","getChildren","getSiblings","hideParentEnd","addClass","hideParent","$parent","hideSiblings","one","showParentEnd","node","isInAction","switchVerticalArrow","showParent","repaint","bind","stopAjax","$nodeLevel","isVisibleNode","index","hideChildrenEnd","animatedNodes","hideChildren","$lowerLevel","$animatedNodes","filter","get","lowerLevel","showChildrenEnd","showChildren","$levels","isVerticalDesc","hideSiblingsEnd","$nodeContainer","nodeContainer","$siblings","prevAll","nextAll","end","switchHorizontalArrow","showSiblingsEnd","visibleNodes","showRelatedParentEnd","showSiblings","$upperLevel","$visibleNodes","startLoading","$edge","not","prop","endLoading","removeAttr","some","attr","icon","$arrow","toggleClass","sibsVisible","$prevSib","prev","$nextSib","next","$sibs","style","offsetWidth","nodeEnterLeaveHandler","$topEdge","$bottomEdge","$leftEdge","flag","$toggleBtn","nodeClickHandler","loadNodes","isEmptyObject","addParent","addChildren","addSiblings","HideFirstParentEnd","topEdge","topEdgeClickHandler","stopPropagation","parentState","isFunction","bottomEdgeClickHandler","childrenState","hEdgeClickHandler","$hEdge","siblingsState","families","expandVNodesEnd","vNodes","collapseVNodesEnd","toggleVNodes","$descWrapper","$descendants","$children","createGhostNode","ghostNode","nodeCover","$nodeDiv","origEvent","isFirefox","test","navigator","userAgent","toLowerCase","querySelector","createElementNS","add","appendChild","transValues","isHorizontal","scale","slice","xOffset","setAttribute","outerWidth","outerHeight","offsetX","yOffset","offsetY","ghostNodeWrapper","createElement","src","XMLSerializer","serializeToString","dataTransfer","setDragImage","getUpperLevel","getLowerLevel","getLevelOrderNodes","queue","output","row","cur","shift","toArray","flat","filterAllowedDropNodes","$dragged","draggingNode","hasClass","$dragZone","$dragHier","dropCriteria","dragstartHandler","setData","dragoverHandler","dropEffect","dragendHandler","dropHandler","async","datasource","copy","horizontalEdges","$dropSibs","$dropZone","dropEvent","draggedNode","dragZone","dropZone","isDefaultPrevented","hybridNode","digger","JSONDigger","findOneNode","verticalLevel","findNodeById","Object","assign","removeNode","dropNode","prepend","triggerHandler","draggedItem","touchstartHandler","touchHandled","touchMoved","touchmoveHandler","touchingNodeElement","currentTarget","touchDragImage","createDragImage","moveDragImage","$touchingNodes","elementFromPoint","touchTargetNode","touchendHandler","firstTouch","fakeMouseClickEvent","destroyDragImage","fakeEventForDropHandler","changedTouches","createEvent","initMouseEvent","screenX","screenY","ctrlKey","altKey","shiftKey","metaKey","dispatchEvent","source","dragImage","cloneNode","sourceRectangle","copyStyle","top","left","getBoundingClientRect","sourcePoint","getTouchPoint","touchDragImageOffset","x","y","opacity","body","parentElement","removeChild","dst","att","removeAttribute","HTMLCanvasElement","cDst","width","cSrc","height","getContext","drawImage","cs","getComputedStyle","pointerEvents","image","orgChartMaster","requestAnimationFrame","pt","s","position","zIndex","round","bindDragDrop","createNode","level","child","parentId","className","nodeData","nodeTemplate","nodeContent","Number","substr","$appendTo","isHidden","$nodesLayer","parentsUntil","keys","$nodeCell","buildChildNode","buildParentNode","$currentRoot","$newRootWrapper","buildSiblingNode","$nodeChart","newSiblingCount","isArray","existingSibligCount","siblingCount","insertPostion","floor","before","addBack","unwrap","removeNodes","$wrapper","hideDropZones","showDropZones","dragged","processExternalDrop","exportPDF","canvas","doc","docWidth","docHeight","jsPDF","jspdf","orientation","unit","format","addImage","toDataURL","save","exportPNG","isWebkit","documentElement","isFf","sidebar","isEdge","appName","appVersion","msSaveBlob","msToBlob","selector","$mask","sourceChart","html2canvas","clientHeight","clientWidth","onclone","cloneDoc","then","fn","orgchart"],"mappings":"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"}