| import { createElement } from '../../svg/core.js'; | 
| import * as zrUtil from '../../core/util.js'; | 
| var MARK_UNUSED = '0'; | 
| var MARK_USED = '1'; | 
| var Definable = (function () { | 
|     function Definable(zrId, svgRoot, tagNames, markLabel, domName) { | 
|         this.nextId = 0; | 
|         this._domName = '_dom'; | 
|         this._zrId = zrId; | 
|         this._svgRoot = svgRoot; | 
|         this._tagNames = typeof tagNames === 'string' ? [tagNames] : tagNames; | 
|         this._markLabel = markLabel; | 
|         if (domName) { | 
|             this._domName = domName; | 
|         } | 
|     } | 
|     Definable.prototype.getDefs = function (isForceCreating) { | 
|         var svgRoot = this._svgRoot; | 
|         var defs = this._svgRoot.getElementsByTagName('defs'); | 
|         if (defs.length === 0) { | 
|             if (isForceCreating) { | 
|                 var defs_1 = svgRoot.insertBefore(createElement('defs'), svgRoot.firstChild); | 
|                 if (!defs_1.contains) { | 
|                     defs_1.contains = function (el) { | 
|                         var children = defs_1.children; | 
|                         if (!children) { | 
|                             return false; | 
|                         } | 
|                         for (var i = children.length - 1; i >= 0; --i) { | 
|                             if (children[i] === el) { | 
|                                 return true; | 
|                             } | 
|                         } | 
|                         return false; | 
|                     }; | 
|                 } | 
|                 return defs_1; | 
|             } | 
|             else { | 
|                 return null; | 
|             } | 
|         } | 
|         else { | 
|             return defs[0]; | 
|         } | 
|     }; | 
|     Definable.prototype.doUpdate = function (target, onUpdate) { | 
|         if (!target) { | 
|             return; | 
|         } | 
|         var defs = this.getDefs(false); | 
|         if (target[this._domName] && defs.contains(target[this._domName])) { | 
|             if (typeof onUpdate === 'function') { | 
|                 onUpdate(target); | 
|             } | 
|         } | 
|         else { | 
|             var dom = this.add(target); | 
|             if (dom) { | 
|                 target[this._domName] = dom; | 
|             } | 
|         } | 
|     }; | 
|     Definable.prototype.add = function (target) { | 
|         return null; | 
|     }; | 
|     Definable.prototype.addDom = function (dom) { | 
|         var defs = this.getDefs(true); | 
|         if (dom.parentNode !== defs) { | 
|             defs.appendChild(dom); | 
|         } | 
|     }; | 
|     Definable.prototype.removeDom = function (target) { | 
|         var defs = this.getDefs(false); | 
|         if (defs && target[this._domName]) { | 
|             defs.removeChild(target[this._domName]); | 
|             target[this._domName] = null; | 
|         } | 
|     }; | 
|     Definable.prototype.getDoms = function () { | 
|         var defs = this.getDefs(false); | 
|         if (!defs) { | 
|             return []; | 
|         } | 
|         var doms = []; | 
|         zrUtil.each(this._tagNames, function (tagName) { | 
|             var tags = defs.getElementsByTagName(tagName); | 
|             for (var i = 0; i < tags.length; i++) { | 
|                 doms.push(tags[i]); | 
|             } | 
|         }); | 
|         return doms; | 
|     }; | 
|     Definable.prototype.markAllUnused = function () { | 
|         var doms = this.getDoms(); | 
|         var that = this; | 
|         zrUtil.each(doms, function (dom) { | 
|             dom[that._markLabel] = MARK_UNUSED; | 
|         }); | 
|     }; | 
|     Definable.prototype.markDomUsed = function (dom) { | 
|         dom && (dom[this._markLabel] = MARK_USED); | 
|     }; | 
|     ; | 
|     Definable.prototype.markDomUnused = function (dom) { | 
|         dom && (dom[this._markLabel] = MARK_UNUSED); | 
|     }; | 
|     ; | 
|     Definable.prototype.isDomUnused = function (dom) { | 
|         return dom && dom[this._markLabel] !== MARK_USED; | 
|     }; | 
|     Definable.prototype.removeUnused = function () { | 
|         var _this = this; | 
|         var defs = this.getDefs(false); | 
|         if (!defs) { | 
|             return; | 
|         } | 
|         var doms = this.getDoms(); | 
|         zrUtil.each(doms, function (dom) { | 
|             if (_this.isDomUnused(dom)) { | 
|                 defs.removeChild(dom); | 
|             } | 
|         }); | 
|     }; | 
|     Definable.prototype.getSvgElement = function (displayable) { | 
|         return displayable.__svgEl; | 
|     }; | 
|     return Definable; | 
| }()); | 
| export default Definable; |