(function () { UEDITOR_CONFIG = window.UEDITOR_CONFIG || {}; var baidu = window.baidu || {}; window.baidu = baidu; window.UE = baidu.editor = { plugins: {}, commands: {}, instants: {}, I18N: {}, _customizeUI: {}, version: "4.2.0", plus: { fileExt: function (filename) { if (!filename) { return "" } var pcs = filename.split("."); if (pcs.length > 1) { return pcs.pop().toLowerCase() } return "" } }, constants: {STATEFUL: {DISABLED: -1, OFF: 0, ON: 1}} }; var dom = UE.dom = {}; var browser = UE.browser = function () { var agent = navigator.userAgent.toLowerCase(), opera = window.opera, browser = { ie: /(msie\s|trident.*rv:)([\w.]+)/i.test(agent), opera: !!opera && opera.version, webkit: agent.indexOf(" applewebkit/") > -1, mac: agent.indexOf("macintosh") > -1, quirks: document.compatMode == "BackCompat" }; browser.gecko = navigator.product == "Gecko" && !browser.webkit && !browser.opera && !browser.ie; var version = 0; if (browser.ie) { var v1 = agent.match(/(?:msie\s([\w.]+))/); var v2 = agent.match(/(?:trident.*rv:([\w.]+))/); if (v1 && v2 && v1[1] && v2[1]) { version = Math.max(v1[1] * 1, v2[1] * 1) } else if (v1 && v1[1]) { version = v1[1] * 1 } else if (v2 && v2[1]) { version = v2[1] * 1 } else { version = 0 } browser.ie11Compat = document.documentMode == 11; browser.ie9Compat = document.documentMode == 9; browser.ie8 = !!document.documentMode; browser.ie8Compat = document.documentMode == 8; browser.ie7Compat = version == 7 && !document.documentMode || document.documentMode == 7; browser.ie6Compat = version < 7 || browser.quirks; browser.ie9above = version > 8; browser.ie9below = version < 9; browser.ie11above = version > 10; browser.ie11below = version < 11 } if (browser.gecko) { var geckoRelease = agent.match(/rv:([\d\.]+)/); if (geckoRelease) { geckoRelease = geckoRelease[1].split("."); version = geckoRelease[0] * 1e4 + (geckoRelease[1] || 0) * 100 + (geckoRelease[2] || 0) * 1 } } if (/chrome\/(\d+\.\d)/i.test(agent)) { browser.chrome = +RegExp["$1"] } if (/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && !/chrome/i.test(agent)) { browser.safari = +(RegExp["$1"] || RegExp["$2"]) } if (browser.opera) version = parseFloat(opera.version()); if (browser.webkit) version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); browser.version = version; browser.isCompatible = !browser.mobile && (browser.ie && version >= 6 || browser.gecko && version >= 10801 || browser.opera && version >= 9.5 || browser.air && version >= 1 || browser.webkit && version >= 522 || false); return browser }(); var ie = browser.ie, webkit = browser.webkit, gecko = browser.gecko, opera = browser.opera; var utils = UE.utils = { each: function (obj, iterator, context) { if (obj == null) return; if (obj.length === +obj.length) { for (var i = 0, l = obj.length; i < l; i++) { if (iterator.call(context, obj[i], i, obj) === false) return false } } else { for (var key in obj) { if (obj.hasOwnProperty(key)) { if (iterator.call(context, obj[key], key, obj) === false) return false } } } }, makeInstance: function (obj) { var noop = new Function; noop.prototype = obj; obj = new noop; noop.prototype = null; return obj }, isObject: function (item) { return item && typeof item === "object" && !Array.isArray(item) }, merge: function (target, source) { var output = Object.assign({}, target); if (this.isObject(target) && this.isObject(source)) { Object.keys(source).forEach(key => { if (this.isObject(source[key])) { if (!(key in target)) { Object.assign(output, {[key]: source[key]}) } else { output[key] = this.merge(target[key], source[key]) } } else { Object.assign(output, {[key]: source[key]}) } }) } return output }, extend: function (t, s, b) { if (s) { for (var k in s) { if (!b || !t.hasOwnProperty(k)) { t[k] = s[k] } } } return t }, extend2: function (t) { var a = arguments; for (var i = 1; i < a.length; i++) { var x = a[i]; for (var k in x) { if (!t.hasOwnProperty(k)) { t[k] = x[k] } } } return t }, inherits: function (subClass, superClass) { var oldP = subClass.prototype, newP = utils.makeInstance(superClass.prototype); utils.extend(newP, oldP, true); subClass.prototype = newP; return newP.constructor = subClass }, bind: function (fn, context) { return function () { return fn.apply(context, arguments) } }, defer: function (fn, delay, exclusion) { var timerID; return function () { if (exclusion) { clearTimeout(timerID) } timerID = setTimeout(fn, delay) } }, indexOf: function (array, item, start) { var index = -1; start = this.isNumber(start) ? start : 0; this.each(array, function (v, i) { if (i >= start && v === item) { index = i; return false } }); return index }, removeItem: function (array, item) { for (var i = 0, l = array.length; i < l; i++) { if (array[i] === item) { array.splice(i, 1); i-- } } }, trim: function (str) { return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, "") }, listToMap: function (list) { if (!list) return {}; list = utils.isArray(list) ? list : list.split(","); for (var i = 0, ci, obj = {}; ci = list[i++];) { obj[ci.toUpperCase()] = obj[ci] = 1 } return obj }, unhtml: function (str, reg) { return str ? str.replace(reg || /[&<">'](?:(amp|lt|ldquo|rdquo|quot|gt|#39|nbsp|#\d+);)?/g, function (a, b) { if (b) { return a } else { return { "<": "<", "&": "&", '"': """, "“": "“", "”": "”", ">": ">", "'": "'" }[a] } }) : "" }, html: function (str) { return str ? str.replace(/&((g|l|quo|ldquo|rdquo)t|amp|#39|nbsp);/g, function (m) { return { "<": "<", "&": "&", """: '"', "“": "“", "”": "”", ">": ">", "'": "'", " ": " " }[m] }) : "" }, cssStyleToDomStyle: function () { var test = document.createElement("div").style, cache = {float: test.cssFloat !== undefined ? "cssFloat" : test.styleFloat !== undefined ? "styleFloat" : "float"}; return function (cssName) { return cache[cssName] || (cache[cssName] = cssName.toLowerCase().replace(/-./g, function (match) { return match.charAt(1).toUpperCase() })) } }(), loadFile: function () { var tmpList = []; function getItem(doc, obj) { try { for (var i = 0, ci; ci = tmpList[i++];) { if (ci.doc === doc && ci.url == (obj.src || obj.href)) { return ci } } } catch (e) { return null } } return function (doc, obj, fn) { var item = getItem(doc, obj); if (item) { if (item.ready) { fn && fn() } else { item.funs.push(fn) } return } tmpList.push({doc: doc, url: obj.src || obj.href, funs: [fn]}); if (!doc.body) { var html = []; for (var p in obj) { if (p == "tag") continue; html.push(p + '="' + obj[p] + '"') } doc.write("<" + obj.tag + " " + html.join(" ") + " >"); return } if (obj.id && doc.getElementById(obj.id)) { return } var element = doc.createElement(obj.tag); delete obj.tag; for (var p in obj) { element.setAttribute(p, obj[p]) } element.onload = element.onreadystatechange = function () { if (!this.readyState || /loaded|complete/.test(this.readyState)) { item = getItem(doc, obj); if (item.funs.length > 0) { item.ready = 1; for (var fi; fi = item.funs.pop();) { fi() } } element.onload = element.onreadystatechange = null } }; element.onerror = function () { throw Error("The load " + (obj.href || obj.src) + " fails,check the url settings of file ueditor.config.js ") }; doc.getElementsByTagName("head")[0].appendChild(element) } }(), isEmptyObject: function (obj) { if (obj == null) return true; if (this.isArray(obj) || this.isString(obj)) return obj.length === 0; for (var key in obj) if (obj.hasOwnProperty(key)) return false; return true }, fixColor: function (name, value) { if (/color/i.test(name) && /rgba?/.test(value)) { var array = value.split(","); if (array.length > 3) return ""; value = "#"; for (var i = 0, color; color = array[i++];) { color = parseInt(color.replace(/[^\d]/gi, ""), 10).toString(16); value += color.length == 1 ? "0" + color : color } value = value.toUpperCase() } return value }, optCss: function (val) { var padding, margin, border; val = val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, function (str, key, name, val) { if (val.split(" ").length == 1) { switch (key) { case"padding": !padding && (padding = {}); padding[name] = val; return ""; case"margin": !margin && (margin = {}); margin[name] = val; return ""; case"border": return val == "initial" ? "" : str } } return str }); function opt(obj, name) { if (!obj) { return "" } var t = obj.top, b = obj.bottom, l = obj.left, r = obj.right, val = ""; if (!t || !l || !b || !r) { for (var p in obj) { val += ";" + name + "-" + p + ":" + obj[p] + ";" } } else { val += ";" + name + ":" + (t == b && b == l && l == r ? t : t == b && l == r ? t + " " + l : l == r ? t + " " + l + " " + b : t + " " + r + " " + b + " " + l) + ";" } return val } val += opt(padding, "padding") + opt(margin, "margin"); return val.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/, "").replace(/;([ \n\r\t]+)|\1;/g, ";").replace(/(&((l|g)t|quot|#39))?;{2,}/g, function (a, b) { return b ? b + ";;" : ";" }) }, clone: function (source, target) { var tmp; target = target || {}; for (var i in source) { if (source.hasOwnProperty(i)) { tmp = source[i]; if (typeof tmp == "object") { target[i] = utils.isArray(tmp) ? [] : {}; utils.clone(source[i], target[i]) } else { target[i] = tmp } } } return target }, transUnitToPx: function (val) { if (!/(pt|cm)/.test(val)) { return val } var unit; val.replace(/([\d.]+)(\w+)/, function (str, v, u) { val = v; unit = u }); switch (unit) { case"cm": val = parseFloat(val) * 25; break; case"pt": val = Math.round(parseFloat(val) * 96 / 72) } return val + (val ? "px" : "") }, domReady: function () { var fnArr = []; function doReady(doc) { doc.isReady = true; for (var ci; ci = fnArr.pop(); ci()) { } } return function (onready, win) { win = win || window; var doc = win.document; onready && fnArr.push(onready); if (doc.readyState === "complete") { doReady(doc) } else { doc.isReady && doReady(doc); if (browser.ie && browser.version != 11) { (function () { if (doc.isReady) return; try { doc.documentElement.doScroll("left") } catch (error) { setTimeout(arguments.callee, 0); return } doReady(doc) })(); win.attachEvent("onload", function () { doReady(doc) }) } else { doc.addEventListener("DOMContentLoaded", function () { doc.removeEventListener("DOMContentLoaded", arguments.callee, false); doReady(doc) }, false); win.addEventListener("load", function () { doReady(doc) }, false) } } } }(), cssRule: browser.ie && browser.version != 11 ? function (key, style, doc) { var indexList, index; if (style === undefined || style && style.nodeType && style.nodeType == 9) { doc = style && style.nodeType && style.nodeType == 9 ? style : doc || document; indexList = doc.indexList || (doc.indexList = {}); index = indexList[key]; if (index !== undefined) { return doc.styleSheets[index].cssText } return undefined } doc = doc || document; indexList = doc.indexList || (doc.indexList = {}); index = indexList[key]; if (style === "") { if (index !== undefined) { doc.styleSheets[index].cssText = ""; delete indexList[key]; return true } return false } if (index !== undefined) { sheetStyle = doc.styleSheets[index] } else { sheetStyle = doc.createStyleSheet("", index = doc.styleSheets.length); indexList[key] = index } sheetStyle.cssText = style } : function (key, style, doc) { var head, node; if (style === undefined || style && style.nodeType && style.nodeType == 9) { doc = style && style.nodeType && style.nodeType == 9 ? style : doc || document; node = doc.getElementById(key); return node ? node.innerHTML : undefined } doc = doc || document; node = doc.getElementById(key); if (style === "") { if (node) { node.parentNode.removeChild(node); return true } return false } if (node) { node.innerHTML = style } else { node = doc.createElement("style"); node.id = key; node.innerHTML = style; doc.getElementsByTagName("head")[0].appendChild(node) } }, sort: function (array, compareFn) { compareFn = compareFn || function (item1, item2) { return item1.localeCompare(item2) }; for (var i = 0, len = array.length; i < len; i++) { for (var j = i, length = array.length; j < length; j++) { if (compareFn(array[i], array[j]) > 0) { var t = array[i]; array[i] = array[j]; array[j] = t } } } return array }, serializeParam: function (json) { var strArr = []; for (var i in json) { if (i == "method" || i == "timeout" || i == "async") continue; if (!((typeof json[i]).toLowerCase() == "function" || (typeof json[i]).toLowerCase() == "object")) { strArr.push(encodeURIComponent(i) + "=" + encodeURIComponent(json[i])) } else if (utils.isArray(json[i])) { for (var j = 0; j < json[i].length; j++) { strArr.push(encodeURIComponent(i) + "[]=" + encodeURIComponent(json[i][j])) } } } return strArr.join("&") }, formatUrl: function (url) { var u = url.replace(/&&/g, "&"); u = u.replace(/\?&/g, "?"); u = u.replace(/&$/g, ""); u = u.replace(/&#/g, "#"); u = u.replace(/&+/g, "&"); return u }, addStyleContent: function (cssContent) { var style = document.createElement("style"); style.innerHTML = cssContent; document.head.appendChild(style) }, isCrossDomainUrl: function (url) { var a = document.createElement("a"); a.href = url; if (browser.ie) { a.href = a.href } return !(a.protocol == location.protocol && a.hostname == location.hostname && (a.port == location.port || a.port == "80" && location.port == "" || a.port == "" && location.port == "80")) }, clearEmptyAttrs: function (obj) { for (var p in obj) { if (obj[p] === "") { delete obj[p] } } return obj }, str2json: function (s) { if (!utils.isString(s)) return null; if (window.JSON) { return JSON.parse(s) } else { return new Function("return " + utils.trim(s || ""))() } }, base64toBlob: function (base64Data, contentType) { contentType = contentType || ""; var sliceSize = 1024; var byteCharacters = atob(base64Data); var bytesLength = byteCharacters.length; var slicesCount = Math.ceil(bytesLength / sliceSize); var byteArrays = new Array(slicesCount); for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { var begin = sliceIndex * sliceSize; var end = Math.min(begin + sliceSize, bytesLength); var bytes = new Array(end - begin); for (var offset = begin, i = 0; offset < end; ++i, ++offset) { bytes[i] = byteCharacters[offset].charCodeAt(0) } byteArrays[sliceIndex] = new Uint8Array(bytes) } return new Blob(byteArrays, {type: contentType}) }, json2str: function () { if (window.JSON) { return JSON.stringify } else { var escapeMap = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }; function encodeString(source) { if (/["\\\x00-\x1f]/.test(source)) { source = source.replace(/["\\\x00-\x1f]/g, function (match) { var c = escapeMap[match]; if (c) { return c } c = match.charCodeAt(); return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16) }) } return '"' + source + '"' } function encodeArray(source) { var result = ["["], l = source.length, preComma, i, item; for (i = 0; i < l; i++) { item = source[i]; switch (typeof item) { case"undefined": case"function": case"unknown": break; default: if (preComma) { result.push(",") } result.push(utils.json2str(item)); preComma = 1 } } result.push("]"); return result.join("") } function pad(source) { return source < 10 ? "0" + source : source } function encodeDate(source) { return '"' + source.getFullYear() + "-" + pad(source.getMonth() + 1) + "-" + pad(source.getDate()) + "T" + pad(source.getHours()) + ":" + pad(source.getMinutes()) + ":" + pad(source.getSeconds()) + '"' } return function (value) { switch (typeof value) { case"undefined": return "undefined"; case"number": return isFinite(value) ? String(value) : "null"; case"string": return encodeString(value); case"boolean": return String(value); default: if (value === null) { return "null" } else if (utils.isArray(value)) { return encodeArray(value) } else if (utils.isDate(value)) { return encodeDate(value) } else { var result = ["{"], encode = utils.json2str, preComma, item; for (var key in value) { if (Object.prototype.hasOwnProperty.call(value, key)) { item = value[key]; switch (typeof item) { case"undefined": case"unknown": case"function": break; default: if (preComma) { result.push(",") } preComma = 1; result.push(encode(key) + ":" + encode(item)) } } } result.push("}"); return result.join("") } } } } }(), getSectionEndAddress: function (sectionSection) { if (sectionSection.children.length >= 1) { let lastChild = sectionSection.children[sectionSection.children.length - 1]; if(lastChild.children.length >= 1) { return utils.getSectionEndAddress(lastChild) } return lastChild.endAddress; } return sectionSection.endAddress; } }; utils.each(["String", "Function", "Array", "Number", "RegExp", "Object", "Date"], function (v) { UE.utils["is" + v] = function (obj) { return Object.prototype.toString.apply(obj) == "[object " + v + "]" } }); var EventBase = UE.EventBase = function () { }; EventBase.prototype = { addListener: function (types, listener) { types = utils.trim(types).split(/\s+/); for (var i = 0, ti; ti = types[i++];) { getListener(this, ti, true).push(listener) } }, on: function (types, listener) { return this.addListener(types, listener) }, off: function (types, listener) { return this.removeListener(types, listener) }, trigger: function () { return this.fireEvent.apply(this, arguments) }, removeListener: function (types, listener) { types = utils.trim(types).split(/\s+/); for (var i = 0, ti; ti = types[i++];) { utils.removeItem(getListener(this, ti) || [], listener) } }, fireEvent: function () { var types = arguments[0]; types = utils.trim(types).split(" "); for (var i = 0, ti; ti = types[i++];) { var listeners = getListener(this, ti), r, t, k; if (listeners) { k = listeners.length; while (k--) { if (!listeners[k]) continue; t = listeners[k].apply(this, arguments); if (t === true) { return t } if (t !== undefined) { r = t } } } if (t = this["on" + ti.toLowerCase()]) { r = t.apply(this, arguments) } } return r } }; function getListener(obj, type, force) { var allListeners; type = type.toLowerCase(); return (allListeners = obj.__allListeners || force && (obj.__allListeners = {})) && (allListeners[type] || force && (allListeners[type] = [])) } var dtd = dom.dtd = function () { function _(s) { for (var k in s) { s[k.toUpperCase()] = s[k] } return s } var X = utils.extend2; var A = _({isindex: 1, fieldset: 1}), B = _({input: 1, button: 1, select: 1, textarea: 1, label: 1}), C = X(_({a: 1}), B), D = X({iframe: 1}, C), E = _({ hr: 1, ul: 1, menu: 1, div: 1, blockquote: 1, noscript: 1, table: 1, center: 1, address: 1, dir: 1, pre: 1, h5: 1, dl: 1, h4: 1, noframes: 1, h6: 1, ol: 1, h1: 1, h3: 1, h2: 1 }), F = _({ins: 1, del: 1, script: 1, style: 1}), G = X(_({ mark: 1, b: 1, acronym: 1, bdo: 1, var: 1, "#": 1, abbr: 1, code: 1, br: 1, i: 1, cite: 1, kbd: 1, u: 1, strike: 1, s: 1, tt: 1, strong: 1, q: 1, samp: 1, em: 1, dfn: 1, span: 1 }), F), H = X(_({ sub: 1, img: 1, embed: 1, object: 1, sup: 1, basefont: 1, map: 1, applet: 1, font: 1, big: 1, small: 1 }), G), I = X(_({p: 1}), H), J = X(_({iframe: 1}), H, B), K = _({ img: 1, embed: 1, noscript: 1, br: 1, kbd: 1, center: 1, button: 1, basefont: 1, h5: 1, h4: 1, samp: 1, h6: 1, ol: 1, h1: 1, h3: 1, h2: 1, form: 1, font: 1, "#": 1, select: 1, menu: 1, ins: 1, abbr: 1, label: 1, code: 1, table: 1, script: 1, cite: 1, input: 1, iframe: 1, strong: 1, textarea: 1, noframes: 1, big: 1, small: 1, span: 1, hr: 1, sub: 1, bdo: 1, var: 1, div: 1, object: 1, sup: 1, strike: 1, dir: 1, map: 1, dl: 1, applet: 1, del: 1, isindex: 1, fieldset: 1, ul: 1, b: 1, acronym: 1, a: 1, blockquote: 1, i: 1, u: 1, s: 1, tt: 1, address: 1, q: 1, pre: 1, p: 1, em: 1, dfn: 1 }), L = X(_({a: 0}), J), M = _({tr: 1}), N = _({"#": 1}), O = X(_({param: 1}), K), P = X(_({form: 1}), A, D, E, I), Q = _({li: 1, ol: 1, ul: 1}), R = _({style: 1, script: 1}), S = _({base: 1, link: 1, meta: 1, title: 1}), T = X(S, R), U = _({head: 1, body: 1}), V = _({html: 1}); var block = _({ address: 1, blockquote: 1, center: 1, dir: 1, div: 1, dl: 1, fieldset: 1, form: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, hr: 1, isindex: 1, menu: 1, noframes: 1, ol: 1, p: 1, pre: 1, table: 1, ul: 1 }), empty = _({ area: 1, base: 1, basefont: 1, br: 1, col: 1, command: 1, dialog: 1, embed: 1, hr: 1, img: 1, input: 1, isindex: 1, keygen: 1, link: 1, meta: 1, param: 1, source: 1, track: 1, wbr: 1 }); return _({ $nonBodyContent: X(V, U, S), $block: block, $inline: L, $inlineWithA: X(_({a: 1}), L), $body: X(_({script: 1, style: 1}), block), $cdata: _({script: 1, style: 1}), $empty: empty, $nonChild: _({iframe: 1, textarea: 1}), $listItem: _({dd: 1, dt: 1, li: 1}), $list: _({ul: 1, ol: 1, dl: 1}), $isNotEmpty: _({ table: 1, ul: 1, ol: 1, dl: 1, iframe: 1, area: 1, base: 1, col: 1, hr: 1, img: 1, embed: 1, input: 1, textarea: 1, link: 1, meta: 1, param: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1 }), $removeEmpty: _({ a: 1, abbr: 1, acronym: 1, address: 1, b: 1, bdo: 1, big: 1, cite: 1, code: 1, del: 1, dfn: 1, em: 1, font: 1, i: 1, ins: 1, label: 1, kbd: 1, q: 1, s: 1, samp: 1, small: 1, span: 1, strike: 1, strong: 1, sub: 1, sup: 1, tt: 1, u: 1, var: 1 }), $removeEmptyBlock: _({p: 1, div: 1}), $tableContent: _({ caption: 1, col: 1, colgroup: 1, tbody: 1, td: 1, tfoot: 1, th: 1, thead: 1, tr: 1, table: 1 }), $notTransContent: _({pre: 1, script: 1, style: 1, textarea: 1}), html: U, head: T, style: N, script: N, body: P, base: {}, link: {}, meta: {}, title: N, col: {}, tr: _({td: 1, th: 1}), img: {}, embed: {}, colgroup: _({thead: 1, col: 1, tbody: 1, tr: 1, tfoot: 1}), noscript: P, td: P, br: {}, th: P, center: P, kbd: L, button: X(I, E), basefont: {}, h5: L, h4: L, samp: L, h6: L, ol: Q, h1: L, h3: L, option: N, h2: L, form: X(A, D, E, I), select: _({optgroup: 1, option: 1}), font: L, ins: L, menu: Q, abbr: L, label: L, table: _({thead: 1, col: 1, tbody: 1, tr: 1, colgroup: 1, caption: 1, tfoot: 1}), code: L, tfoot: M, cite: L, li: P, input: {}, iframe: P, strong: L, textarea: N, noframes: P, big: L, small: L, span: _({"#": 1, br: 1, b: 1, strong: 1, u: 1, i: 1, em: 1, sub: 1, sup: 1, strike: 1, span: 1}), hr: L, dt: L, sub: L, optgroup: _({option: 1}), param: {}, bdo: L, var: L, div: P, object: O, sup: L, dd: P, strike: L, area: {}, dir: Q, map: X(_({area: 1, form: 1, p: 1}), A, F, E), applet: O, dl: _({dt: 1, dd: 1}), del: L, isindex: {}, fieldset: X(_({legend: 1}), K), thead: M, ul: Q, acronym: L, b: L, a: X(_({a: 1}), J), blockquote: X(_({td: 1, tr: 1, tbody: 1, li: 1}), P), caption: L, i: L, u: L, tbody: M, s: L, address: X(D, I), tt: L, legend: L, q: L, pre: X(G, C), p: X(_({a: 1}), L), em: L, dfn: L, mark: L }) }(); function getDomNode(node, start, ltr, startFromChild, fn, guard) { var tmpNode = startFromChild && node[start], parent; !tmpNode && (tmpNode = node[ltr]); while (!tmpNode && (parent = (parent || node).parentNode)) { if (parent.tagName == "BODY" || guard && !guard(parent)) { return null } tmpNode = parent[ltr] } if (tmpNode && fn && !fn(tmpNode)) { return getDomNode(tmpNode, start, ltr, false, fn) } return tmpNode } var attrFix = ie && browser.version < 9 ? { tabindex: "tabIndex", readonly: "readOnly", for: "htmlFor", class: "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder" } : {tabindex: "tabIndex", readonly: "readOnly"}, styleBlock = utils.listToMap(["-webkit-box", "-moz-box", "block", "list-item", "table", "table-row-group", "table-header-group", "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption"]); var domUtils = dom.domUtils = { NODE_ELEMENT: 1, NODE_DOCUMENT: 9, NODE_TEXT: 3, NODE_COMMENT: 8, NODE_DOCUMENT_FRAGMENT: 11, POSITION_IDENTICAL: 0, POSITION_DISCONNECTED: 1, POSITION_FOLLOWING: 2, POSITION_PRECEDING: 4, POSITION_IS_CONTAINED: 8, POSITION_CONTAINS: 16, fillChar: ie && browser.version === "6" ? "\ufeff" : "​", keys: {8: 1, 46: 1, 16: 1, 17: 1, 18: 1, 37: 1, 38: 1, 39: 1, 40: 1, 13: 1}, getPosition: function (nodeA, nodeB) { if (nodeA === nodeB) { return 0 } var node, parentsA = [nodeA], parentsB = [nodeB]; node = nodeA; while (node = node.parentNode) { if (node === nodeB) { return 10 } parentsA.push(node) } node = nodeB; while (node = node.parentNode) { if (node === nodeA) { return 20 } parentsB.push(node) } parentsA.reverse(); parentsB.reverse(); if (parentsA[0] !== parentsB[0]) { return 1 } var i = -1; while (i++, parentsA[i] === parentsB[i]) { } nodeA = parentsA[i]; nodeB = parentsB[i]; while (nodeA = nodeA.nextSibling) { if (nodeA === nodeB) { return 4 } } return 2 }, getNodeIndex: function (node, ignoreTextNode) { var preNode = node, i = 0; while (preNode = preNode.previousSibling) { if (ignoreTextNode && preNode.nodeType == 3) { if (preNode.nodeType != preNode.nextSibling.nodeType) { i++ } continue } i++ } return i }, inDoc: function (node, doc) { return domUtils.getPosition(node, doc) === 10 }, findParent: function (node, filterFn, includeSelf) { if (node && !domUtils.isBody(node)) { node = includeSelf ? node : node.parentNode; while (node) { if (!filterFn || filterFn(node) || domUtils.isBody(node)) { return filterFn && !filterFn(node) && domUtils.isBody(node) ? null : node } node = node.parentNode } } return null }, findParentByTagName: function (node, tagNames, includeSelf, excludeFn) { tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); return domUtils.findParent(node, function (node) { return tagNames[node.tagName] && !(excludeFn && excludeFn(node)) }, includeSelf) }, findParents: function (node, includeSelf, filterFn, closerFirst) { var parents = includeSelf && (filterFn && filterFn(node) || !filterFn) ? [node] : []; while (node = domUtils.findParent(node, filterFn)) { parents.push(node) } return closerFirst ? parents : parents.reverse() }, insertAfter: function (node, newNode) { return node.nextSibling ? node.parentNode.insertBefore(newNode, node.nextSibling) : node.parentNode.appendChild(newNode) }, remove: function (node, keepChildren) { var parent = node.parentNode, child; if (parent) { if (keepChildren && node.hasChildNodes()) { while (child = node.firstChild) { parent.insertBefore(child, node) } } parent.removeChild(node) } return node }, getNextDomNode: function (node, startFromChild, filterFn, guard) { return getDomNode(node, "firstChild", "nextSibling", startFromChild, filterFn, guard) }, getPreDomNode: function (node, startFromChild, filterFn, guard) { return getDomNode(node, "lastChild", "previousSibling", startFromChild, filterFn, guard) }, isBookmarkNode: function (node) { return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id) }, getWindow: function (node) { var doc = node.ownerDocument || node; return doc.defaultView || doc.parentWindow }, getCommonAncestor: function (nodeA, nodeB) { if (nodeA === nodeB) return nodeA; var parentsA = [nodeA], parentsB = [nodeB], parent = nodeA, i = -1; while (parent = parent.parentNode) { if (parent === nodeB) { return parent } parentsA.push(parent) } parent = nodeB; while (parent = parent.parentNode) { if (parent === nodeA) return parent; parentsB.push(parent) } parentsA.reverse(); parentsB.reverse(); while (i++, parentsA[i] === parentsB[i]) { } return i == 0 ? null : parentsA[i - 1] }, clearEmptySibling: function (node, ignoreNext, ignorePre) { function clear(next, dir) { var tmpNode; while (next && !domUtils.isBookmarkNode(next) && (domUtils.isEmptyInlineElement(next) || !new RegExp("[^\t\n\r" + domUtils.fillChar + "]").test(next.nodeValue))) { tmpNode = next[dir]; domUtils.remove(next); next = tmpNode } } !ignoreNext && clear(node.nextSibling, "nextSibling"); !ignorePre && clear(node.previousSibling, "previousSibling") }, split: function (node, offset) { var doc = node.ownerDocument; if (browser.ie && offset == node.nodeValue.length) { var next = doc.createTextNode(""); return domUtils.insertAfter(node, next) } var retval = node.splitText(offset); if (browser.ie8) { var tmpNode = doc.createTextNode(""); domUtils.insertAfter(retval, tmpNode); domUtils.remove(tmpNode) } return retval }, isWhitespace: function (node) { return !new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test(node.nodeValue) }, getXY: function (element) { var x = 0, y = 0; while (element.offsetParent) { y += element.offsetTop; x += element.offsetLeft; element = element.offsetParent } return {x: x, y: y} }, on: function (element, type, handler) { var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), k = types.length; if (k) while (k--) { type = types[k]; if (element.addEventListener) { element.addEventListener(type, handler, false) } else { if (!handler._d) { handler._d = {els: []} } var key = type + handler.toString(), index = utils.indexOf(handler._d.els, element); if (!handler._d[key] || index == -1) { if (index == -1) { handler._d.els.push(element) } if (!handler._d[key]) { handler._d[key] = function (evt) { return handler.call(evt.srcElement, evt || window.event) } } element.attachEvent("on" + type, handler._d[key]) } } } element = null }, un: function (element, type, handler) { var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), k = types.length; if (k) while (k--) { type = types[k]; if (element.removeEventListener) { element.removeEventListener(type, handler, false) } else { var key = type + handler.toString(); try { element.detachEvent("on" + type, handler._d ? handler._d[key] : handler) } catch (e) { } if (handler._d && handler._d[key]) { var index = utils.indexOf(handler._d.els, element); if (index != -1) { handler._d.els.splice(index, 1) } handler._d.els.length == 0 && delete handler._d[key] } } } }, isSameElement: function (nodeA, nodeB) { if (nodeA.tagName != nodeB.tagName) { return false } var thisAttrs = nodeA.attributes, otherAttrs = nodeB.attributes; if (!ie && thisAttrs.length != otherAttrs.length) { return false } var attrA, attrB, al = 0, bl = 0; for (var i = 0; attrA = thisAttrs[i++];) { if (attrA.nodeName == "style") { if (attrA.specified) { al++ } if (domUtils.isSameStyle(nodeA, nodeB)) { continue } else { return false } } if (ie) { if (attrA.specified) { al++; attrB = otherAttrs.getNamedItem(attrA.nodeName) } else { continue } } else { attrB = nodeB.attributes[attrA.nodeName] } if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { return false } } if (ie) { for (i = 0; attrB = otherAttrs[i++];) { if (attrB.specified) { bl++ } } if (al != bl) { return false } } return true }, isSameStyle: function (nodeA, nodeB) { var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":"), styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":"); if (browser.opera) { styleA = nodeA.style; styleB = nodeB.style; if (styleA.length != styleB.length) return false; for (var p in styleA) { if (/^(\d+|csstext)$/i.test(p)) { continue } if (styleA[p] != styleB[p]) { return false } } return true } if (!styleA || !styleB) { return styleA == styleB } styleA = styleA.split(";"); styleB = styleB.split(";"); if (styleA.length != styleB.length) { return false } for (var i = 0, ci; ci = styleA[i++];) { if (utils.indexOf(styleB, ci) == -1) { return false } } return true }, isBlockElm: function (node) { return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, "display")]) && !dtd.$nonChild[node.tagName] }, isBody: function (node) { return node && node.nodeType == 1 && node.tagName.toLowerCase() == "body" }, breakParent: function (node, parent) { var tmpNode, parentClone = node, clone = node, leftNodes, rightNodes; do { parentClone = parentClone.parentNode; if (leftNodes) { tmpNode = parentClone.cloneNode(false); tmpNode.appendChild(leftNodes); leftNodes = tmpNode; tmpNode = parentClone.cloneNode(false); tmpNode.appendChild(rightNodes); rightNodes = tmpNode } else { leftNodes = parentClone.cloneNode(false); rightNodes = leftNodes.cloneNode(false) } while (tmpNode = clone.previousSibling) { leftNodes.insertBefore(tmpNode, leftNodes.firstChild) } while (tmpNode = clone.nextSibling) { rightNodes.appendChild(tmpNode) } clone = parentClone } while (parent !== parentClone); tmpNode = parent.parentNode; tmpNode.insertBefore(leftNodes, parent); tmpNode.insertBefore(rightNodes, parent); tmpNode.insertBefore(node, rightNodes); domUtils.remove(parent); return node }, isEmptyInlineElement: function (node) { if (node.nodeType != 1 || !dtd.$removeEmpty[node.tagName]) { return 0 } node = node.firstChild; while (node) { if (domUtils.isBookmarkNode(node)) { return 0 } if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) || node.nodeType == 3 && !domUtils.isWhitespace(node)) { return 0 } node = node.nextSibling } return 1 }, trimWhiteTextNode: function (node) { function remove(dir) { var child; while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) { node.removeChild(child) } } remove("firstChild"); remove("lastChild") }, mergeChild: function (node, tagName, attrs) { var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); for (var i = 0, ci; ci = list[i++];) { if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { continue } if (ci.tagName.toLowerCase() == "span") { if (node === ci.parentNode) { domUtils.trimWhiteTextNode(node); if (node.childNodes.length == 1) { node.style.cssText = ci.style.cssText + ";" + node.style.cssText; domUtils.remove(ci, true); continue } } ci.style.cssText = node.style.cssText + ";" + ci.style.cssText; if (attrs) { var style = attrs.style; if (style) { style = style.split(";"); for (var j = 0, s; s = style[j++];) { ci.style[utils.cssStyleToDomStyle(s.split(":")[0])] = s.split(":")[1] } } } if (domUtils.isSameStyle(ci, node)) { domUtils.remove(ci, true) } continue } if (domUtils.isSameElement(node, ci)) { domUtils.remove(ci, true) } } }, getElementsByTagName: function (node, tagName, filter) { if (filter && utils.isString(filter)) { var className = filter; filter = function (node) { return domUtils.hasClass(node, className) } } tagName = utils.trim(tagName).replace(/[ ]{2,}/g, " ").split(" "); var arr = []; for (var n = 0, ni; ni = tagName[n++];) { var list = node.getElementsByTagName(ni); for (var i = 0, ci; ci = list[i++];) { if (!filter || filter(ci)) arr.push(ci) } } return arr }, mergeToParent: function (node) { var parent = node.parentNode; while (parent && dtd.$removeEmpty[parent.tagName]) { if (parent.tagName == node.tagName || parent.tagName == "A") { domUtils.trimWhiteTextNode(parent); if (parent.tagName == "SPAN" && !domUtils.isSameStyle(parent, node) || parent.tagName == "A" && node.tagName == "SPAN") { if (parent.childNodes.length > 1 || parent !== node.parentNode) { node.style.cssText = parent.style.cssText + ";" + node.style.cssText; parent = parent.parentNode; continue } else { parent.style.cssText += ";" + node.style.cssText; if (parent.tagName == "A") { parent.style.textDecoration = "underline" } } } if (parent.tagName != "A") { parent === node.parentNode && domUtils.remove(node, true); break } } parent = parent.parentNode } }, mergeSibling: function (node, ignorePre, ignoreNext) { function merge(rtl, start, node) { var next; if ((next = node[rtl]) && !domUtils.isBookmarkNode(next) && next.nodeType == 1 && domUtils.isSameElement(node, next)) { while (next.firstChild) { if (start == "firstChild") { node.insertBefore(next.lastChild, node.firstChild) } else { node.appendChild(next.firstChild) } } domUtils.remove(next) } } !ignorePre && merge("previousSibling", "firstChild", node); !ignoreNext && merge("nextSibling", "lastChild", node) }, unSelectable: ie && browser.ie9below || browser.opera ? function (node) { node.onselectstart = function () { return false }; node.onclick = node.onkeyup = node.onkeydown = function () { return false }; node.unselectable = "on"; node.setAttribute("unselectable", "on"); for (var i = 0, ci; ci = node.all[i++];) { switch (ci.tagName.toLowerCase()) { case"iframe": case"textarea": case"input": case"select": break; default: ci.unselectable = "on"; node.setAttribute("unselectable", "on") } } } : function (node) { node.style.MozUserSelect = node.style.webkitUserSelect = node.style.msUserSelect = node.style.KhtmlUserSelect = "none" }, removeAttributes: function (node, attrNames) { attrNames = utils.isArray(attrNames) ? attrNames : utils.trim(attrNames).replace(/[ ]{2,}/g, " ").split(" "); for (var i = 0, ci; ci = attrNames[i++];) { ci = attrFix[ci] || ci; switch (ci) { case"className": node[ci] = ""; break; case"style": node.style.cssText = ""; var val = node.getAttributeNode("style"); !browser.ie && val && node.removeAttributeNode(val) } node.removeAttribute(ci) } }, createElement: function (doc, tag, attrs) { return domUtils.setAttributes(doc.createElement(tag), attrs) }, setAttributes: function (node, attrs) { for (var attr in attrs) { if ("_propertyDelete" === attr) { for (var j = 0; j < attrs[attr].length; j++) { if (node.hasAttribute(attrs[attr][j])) { node.removeAttribute(attrs[attr][j]) } } continue } if (attrs.hasOwnProperty(attr)) { var value = attrs[attr]; switch (attr) { case"class": node.className = value; break; case"style": node.style.cssText = node.style.cssText + ";" + value; break; case"innerHTML": node[attr] = value; break; case"value": node.value = value; break; default: node.setAttribute(attrFix[attr] || attr, value) } } } return node }, getComputedStyle: function (element, styleName) { var pros = "width height top left"; if (pros.indexOf(styleName) > -1) { return element["offset" + styleName.replace(/^\w/, function (s) { return s.toUpperCase() })] + "px" } if (element.nodeType === 3) { element = element.parentNode } if (browser.ie && browser.version < 9 && styleName === "font-size" && !element.style.fontSize && !dtd.$empty[element.tagName] && !dtd.$nonChild[element.tagName]) { var span = element.ownerDocument.createElement("span"); span.style.cssText = "padding:0;border:0;font-family:simsun;"; span.innerHTML = "."; element.appendChild(span); var result = span.offsetHeight; element.removeChild(span); span = null; return result + "px" } try { var value = domUtils.getStyle(element, styleName) || (window.getComputedStyle ? domUtils.getWindow(element).getComputedStyle(element, "").getPropertyValue(styleName) : (element.currentStyle || element.style)[utils.cssStyleToDomStyle(styleName)]) } catch (e) { return "" } return utils.transUnitToPx(utils.fixColor(styleName, value)) }, removeClasses: function (elm, classNames) { classNames = utils.isArray(classNames) ? classNames : utils.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); for (var i = 0, ci, cls = elm.className; ci = classNames[i++];) { cls = cls.replace(new RegExp("\\b" + ci + "\\b"), "") } cls = utils.trim(cls).replace(/[ ]{2,}/g, " "); if (cls) { elm.className = cls } else { domUtils.removeAttributes(elm, ["class"]) } }, addClass: function (elm, classNames) { if (!elm) return; classNames = utils.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); for (var i = 0, ci, cls = elm.className; ci = classNames[i++];) { if (!new RegExp("\\b" + ci + "\\b").test(cls)) { cls += " " + ci } } elm.className = utils.trim(cls) }, hasClass: function (element, className) { if (utils.isRegExp(className)) { return className.test(element.className) } className = utils.trim(className).replace(/[ ]{2,}/g, " ").split(" "); for (var i = 0, ci, cls = element.className; ci = className[i++];) { if (!new RegExp("\\b" + ci + "\\b", "i").test(cls)) { return false } } return i - 1 == className.length }, preventDefault: function (evt) { evt.preventDefault ? evt.preventDefault() : evt.returnValue = false }, removeStyle: function (element, name) { if (browser.ie) { if (name == "color") { name = "(^|;)" + name } element.style.cssText = element.style.cssText.replace(new RegExp(name + "[^:]*:[^;]+;?", "ig"), "") } else { if (element.style.removeProperty) { element.style.removeProperty(name) } else { element.style.removeAttribute(utils.cssStyleToDomStyle(name)) } } if (!element.style.cssText) { domUtils.removeAttributes(element, ["style"]) } }, getStyle: function (element, name) { var value = element.style[utils.cssStyleToDomStyle(name)]; return utils.fixColor(name, value) }, setStyle: function (element, name, value) { element.style[utils.cssStyleToDomStyle(name)] = value; if (!utils.trim(element.style.cssText)) { this.removeAttributes(element, "style") } }, setStyles: function (element, styles) { for (var name in styles) { if (styles.hasOwnProperty(name)) { domUtils.setStyle(element, name, styles[name]) } } }, removeDirtyAttr: function (node) { for (var i = 0, ci, nodes = node.getElementsByTagName("*"); ci = nodes[i++];) { ci.removeAttribute("_moz_dirty") } node.removeAttribute("_moz_dirty") }, getChildCount: function (node, fn) { var count = 0, first = node.firstChild; fn = fn || function () { return 1 }; while (first) { if (fn(first)) { count++ } first = first.nextSibling } return count }, isEmptyNode: function (node) { return !node.firstChild || domUtils.getChildCount(node, function (node) { return !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node) }) == 0 }, clearSelectedArr: function (nodes) { var node; while (node = nodes.pop()) { domUtils.removeAttributes(node, ["class"]) } }, scrollToView: function (node, win, offsetTop) { offsetTop = offsetTop || 0; var getViewPaneSize = function () { var doc = win.document, mode = doc.compatMode == "CSS1Compat"; return { width: (mode ? doc.documentElement.clientWidth : doc.body.clientWidth) || 0, height: (mode ? doc.documentElement.clientHeight : doc.body.clientHeight) || 0 } }, getScrollPosition = function (win) { if ("pageXOffset" in win) { return {x: win.pageXOffset || 0, y: win.pageYOffset || 0} } else { var doc = win.document; return { x: doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, y: doc.documentElement.scrollTop || doc.body.scrollTop || 0 } } }; var winHeight = getViewPaneSize().height, offset = winHeight * -1 + offsetTop; offset += node.offsetHeight || 0; var elementPosition = domUtils.getXY(node); offset += elementPosition.y; var currentScroll = getScrollPosition(win).y; if (offset > currentScroll || offset < currentScroll - winHeight) { win.scrollTo({top: offset + (offset < 0 ? -20 : 20), behavior: "smooth"}) } }, isBr: function (node) { return node.nodeType == 1 && node.tagName == "BR" }, isFillChar: function (node, isInStart) { if (node.nodeType != 3) return false; var text = node.nodeValue; if (isInStart) { return new RegExp("^" + domUtils.fillChar).test(text) } return !text.replace(new RegExp(domUtils.fillChar, "g"), "").length }, isStartInblock: function (range) { var tmpRange = range.cloneRange(), flag = 0, start = tmpRange.startContainer, tmp; if (start.nodeType == 1 && start.childNodes[tmpRange.startOffset]) { start = start.childNodes[tmpRange.startOffset]; var pre = start.previousSibling; while (pre && domUtils.isFillChar(pre)) { start = pre; pre = pre.previousSibling } } if (this.isFillChar(start, true) && tmpRange.startOffset == 1) { tmpRange.setStartBefore(start); start = tmpRange.startContainer } while (start && domUtils.isFillChar(start)) { tmp = start; start = start.previousSibling } if (tmp) { tmpRange.setStartBefore(tmp); start = tmpRange.startContainer } if (start.nodeType == 1 && domUtils.isEmptyNode(start) && tmpRange.startOffset == 1) { tmpRange.setStart(start, 0).collapse(true) } while (!tmpRange.startOffset) { start = tmpRange.startContainer; if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { flag = 1; break } var pre = tmpRange.startContainer.previousSibling, tmpNode; if (!pre) { tmpRange.setStartBefore(tmpRange.startContainer) } else { while (pre && domUtils.isFillChar(pre)) { tmpNode = pre; pre = pre.previousSibling } if (tmpNode) { tmpRange.setStartBefore(tmpNode) } else { tmpRange.setStartBefore(tmpRange.startContainer) } } } return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0 }, isEmptyBlock: function (node, reg) { if (node.nodeType != 1) return 0; reg = reg || new RegExp("[  \t\r\n" + domUtils.fillChar + "]", "g"); if (node[browser.ie ? "innerText" : "textContent"].replace(reg, "").length > 0) { return 0 } for (var n in dtd.$isNotEmpty) { if (node.getElementsByTagName(n).length) { return 0 } } return 1 }, setViewportOffset: function (element, offset) { var left = parseInt(element.style.left) | 0; var top = parseInt(element.style.top) | 0; var rect = element.getBoundingClientRect(); var offsetLeft = offset.left - rect.left; var offsetTop = offset.top - rect.top; if (offsetLeft) { element.style.left = left + offsetLeft + "px" } if (offsetTop) { element.style.top = top + offsetTop + "px" } }, fillNode: function (doc, node) { var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement("br"); node.innerHTML = ""; node.appendChild(tmpNode) }, moveChild: function (src, tag, dir) { while (src.firstChild) { if (dir && tag.firstChild) { tag.insertBefore(src.lastChild, tag.firstChild) } else { tag.appendChild(src.firstChild) } } }, hasNoAttributes: function (node) { return browser.ie ? /^<\w+\s*?>/.test(node.outerHTML) : node.attributes.length == 0 }, isCustomeNode: function (node) { return node.nodeType == 1 && node.getAttribute("_ue_custom_node_") }, isTagNode: function (node, tagNames) { return node.nodeType == 1 && new RegExp("\\b" + node.tagName + "\\b", "i").test(tagNames) }, filterNodeList: function (nodelist, filter, forAll) { var results = []; if (!utils.isFunction(filter)) { var str = filter; filter = function (n) { return utils.indexOf(utils.isArray(str) ? str : str.split(" "), n.tagName.toLowerCase()) != -1 } } utils.each(nodelist, function (n) { filter(n) && results.push(n) }); return results.length == 0 ? null : results.length == 1 || !forAll ? results[0] : results }, isInNodeEndBoundary: function (rng, node) { var start = rng.startContainer; if (start.nodeType == 3 && rng.startOffset != start.nodeValue.length) { return 0 } if (start.nodeType == 1 && rng.startOffset != start.childNodes.length) { return 0 } while (start !== node) { if (start.nextSibling) { return 0 } start = start.parentNode } return 1 }, isBoundaryNode: function (node, dir) { var tmp; while (!domUtils.isBody(node)) { tmp = node; node = node.parentNode; if (tmp !== node[dir]) { return false } } return true }, fillHtml: browser.ie11below ? " " : "
", loadScript: function (url, cb) { var script; script = document.createElement("script"); script.src = url; script.onload = function () { cb && cb({isNew: true}) }; document.getElementsByTagName("head")[0].appendChild(script) } }; var fillCharReg = new RegExp(domUtils.fillChar, "g"); (function () { var guid = 0, fillChar = domUtils.fillChar, fillData; function updateCollapse(range) { range.collapsed = range.startContainer && range.endContainer && range.startContainer === range.endContainer && range.startOffset === range.endOffset } function selectOneNode(rng) { return !rng.collapsed && rng.startContainer.nodeType === 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset === 1 } function setEndPoint(toStart, node, offset, range) { if (node.nodeType === 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) { offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); node = node.parentNode } if (toStart) { range.startContainer = node; range.startOffset = offset; if (!range.endContainer) { range.collapse(true) } } else { range.endContainer = node; range.endOffset = offset; if (!range.startContainer) { range.collapse(false) } } updateCollapse(range); return range } function execContentsAction(range, action) { var start = range.startContainer, end = range.endContainer, startOffset = range.startOffset, endOffset = range.endOffset, doc = range.document, frag = doc.createDocumentFragment(), tmpStart, tmpEnd; if (start.nodeType == 1) { start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode(""))) } if (end.nodeType == 1) { end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode(""))) } if (start === end && start.nodeType == 3) { frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset))); if (action) { start.deleteData(startOffset, endOffset - startOffset); range.collapse(true) } return frag } var current, currentLevel, clone = frag, startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true); for (var i = 0; startParents[i] == endParents[i];) { i++ } for (var j = i, si; si = startParents[j]; j++) { current = si.nextSibling; if (si == start) { if (!tmpStart) { if (range.startContainer.nodeType == 3) { clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset))); if (action) { start.deleteData(startOffset, start.nodeValue.length - startOffset) } } else { clone.appendChild(!action ? start.cloneNode(true) : start) } } } else { currentLevel = si.cloneNode(false); clone.appendChild(currentLevel) } while (current) { if (current === end || current === endParents[j]) { break } si = current.nextSibling; clone.appendChild(!action ? current.cloneNode(true) : current); current = si } clone = currentLevel } clone = frag; if (!startParents[i]) { clone.appendChild(startParents[i - 1].cloneNode(false)); clone = clone.firstChild } for (var j = i, ei; ei = endParents[j]; j++) { current = ei.previousSibling; if (ei == end) { if (!tmpEnd && range.endContainer.nodeType == 3) { clone.appendChild(doc.createTextNode(end.substringData(0, endOffset))); if (action) { end.deleteData(0, endOffset) } } } else { currentLevel = ei.cloneNode(false); clone.appendChild(currentLevel) } if (j != i || !startParents[i]) { while (current) { if (current === start) { break } ei = current.previousSibling; clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild); current = ei } } clone = currentLevel } if (action) { range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true) } tmpStart && domUtils.remove(tmpStart); tmpEnd && domUtils.remove(tmpEnd); return frag } var Range = dom.Range = function (document) { var me = this; me.startContainer = me.startOffset = me.endContainer = me.endOffset = null; me.document = document; me.collapsed = true }; function removeFillData(doc, excludeNode) { try { if (fillData && domUtils.inDoc(fillData, doc)) { if (!fillData.nodeValue.replace(fillCharReg, "").length) { var tmpNode = fillData.parentNode; domUtils.remove(fillData); while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) && (browser.safari ? !(domUtils.getPosition(tmpNode, excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode))) { fillData = tmpNode.parentNode; domUtils.remove(tmpNode); tmpNode = fillData } } else { fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, "") } } } catch (e) { } } function mergeSibling(node, dir) { var tmpNode; node = node[dir]; while (node && domUtils.isFillChar(node)) { tmpNode = node[dir]; domUtils.remove(node); node = tmpNode } } Range.prototype = { cloneContents: function () { return this.collapsed ? null : execContentsAction(this, 0) }, deleteContents: function () { var txt; if (!this.collapsed) { execContentsAction(this, 1) } if (browser.webkit) { txt = this.startContainer; if (txt.nodeType == 3 && !txt.nodeValue.length) { this.setStartBefore(txt).collapse(true); domUtils.remove(txt) } } return this }, extractContents: function () { return this.collapsed ? null : execContentsAction(this, 2) }, setStart: function (node, offset) { return setEndPoint(true, node, offset, this) }, setEnd: function (node, offset) { return setEndPoint(false, node, offset, this) }, setStartAfter: function (node) { return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1) }, setStartBefore: function (node) { return this.setStart(node.parentNode, domUtils.getNodeIndex(node)) }, setEndAfter: function (node) { return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1) }, setEndBefore: function (node) { return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)) }, setStartAtFirst: function (node) { return this.setStart(node, 0) }, setStartAtLast: function (node) { return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length) }, setEndAtFirst: function (node) { return this.setEnd(node, 0) }, setEndAtLast: function (node) { return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length) }, selectNode: function (node) { return this.setStartBefore(node).setEndAfter(node) }, selectNodeContents: function (node) { return this.setStart(node, 0).setEndAtLast(node) }, cloneRange: function () { var me = this; return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset) }, collapse: function (toStart) { var me = this; if (toStart) { me.endContainer = me.startContainer; me.endOffset = me.startOffset } else { me.startContainer = me.endContainer; me.startOffset = me.endOffset } me.collapsed = true; return me }, shrinkBoundary: function (ignoreEnd) { var me = this, child, collapsed = me.collapsed; function check(node) { return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName] } while (me.startContainer.nodeType == 1 && (child = me.startContainer.childNodes[me.startOffset]) && check(child)) { me.setStart(child, 0) } if (collapsed) { return me.collapse(true) } if (!ignoreEnd) { while (me.endContainer.nodeType == 1 && me.endOffset > 0 && (child = me.endContainer.childNodes[me.endOffset - 1]) && check(child)) { me.setEnd(child, child.childNodes.length) } } return me }, getCommonAncestor: function (includeSelf, ignoreTextNode) { var me = this, start = me.startContainer, end = me.endContainer; if (start === end) { if (includeSelf && selectOneNode(this)) { start = start.childNodes[me.startOffset]; if (start.nodeType == 1) return start } return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start } return domUtils.getCommonAncestor(start, end) }, trimBoundary: function (ignoreEnd) { this.txtToElmBoundary(); var start = this.startContainer, offset = this.startOffset, collapsed = this.collapsed, end = this.endContainer; if (start.nodeType == 3) { if (offset == 0) { this.setStartBefore(start) } else { if (offset >= start.nodeValue.length) { this.setStartAfter(start) } else { var textNode = domUtils.split(start, offset); if (start === end) { this.setEnd(textNode, this.endOffset - offset) } else if (start.parentNode === end) { this.endOffset += 1 } this.setStartBefore(textNode) } } if (collapsed) { return this.collapse(true) } } if (!ignoreEnd) { offset = this.endOffset; end = this.endContainer; if (end.nodeType == 3) { if (offset == 0) { this.setEndBefore(end) } else { offset < end.nodeValue.length && domUtils.split(end, offset); this.setEndAfter(end) } } } return this }, txtToElmBoundary: function (ignoreCollapsed) { function adjust(r, c) { var container = r[c + "Container"], offset = r[c + "Offset"]; if (container.nodeType == 3) { if (!offset) { r["set" + c.replace(/(\w)/, function (a) { return a.toUpperCase() }) + "Before"](container) } else if (offset >= container.nodeValue.length) { r["set" + c.replace(/(\w)/, function (a) { return a.toUpperCase() }) + "After"](container) } } } if (ignoreCollapsed || !this.collapsed) { adjust(this, "start"); adjust(this, "end") } return this }, insertNode: function (node) { var first = node, length = 1; if (node.nodeType == 11) { first = node.firstChild; length = node.childNodes.length } this.trimBoundary(true); var start = this.startContainer, offset = this.startOffset; var nextNode = start.childNodes[offset]; if (nextNode) { start.insertBefore(node, nextNode) } else { start.appendChild(node) } if (first.parentNode === this.endContainer) { this.endOffset = this.endOffset + length } return this.setStartBefore(first) }, setCursor: function (toEnd, noFillData) { return this.collapse(!toEnd).select(noFillData) }, createBookmark: function (serialize, same) { var endNode, startNode = this.document.createElement("span"); startNode.style.cssText = "display:none;line-height:0px;"; startNode.appendChild(this.document.createTextNode("‍")); startNode.id = "_baidu_bookmark_start_" + (same ? "" : guid++); if (!this.collapsed) { endNode = startNode.cloneNode(true); endNode.id = "_baidu_bookmark_end_" + (same ? "" : guid++) } this.insertNode(startNode); if (endNode) { this.collapse().insertNode(endNode).setEndBefore(endNode) } this.setStartAfter(startNode); return { start: serialize ? startNode.id : startNode, end: endNode ? serialize ? endNode.id : endNode : null, id: serialize } }, moveToBookmark: function (bookmark) { var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start, end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end; this.setStartBefore(start); domUtils.remove(start); if (end) { this.setEndBefore(end); domUtils.remove(end) } else { this.collapse(true) } return this }, enlarge: function (toBlock, stopFn) { var isBody = domUtils.isBody, pre, node, tmp = this.document.createTextNode(""); if (toBlock) { node = this.startContainer; if (node.nodeType == 1) { if (node.childNodes[this.startOffset]) { pre = node = node.childNodes[this.startOffset] } else { node.appendChild(tmp); pre = node = tmp } } else { pre = node } while (1) { if (domUtils.isBlockElm(node)) { node = pre; while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { node = pre } this.setStartBefore(node); break } pre = node; node = node.parentNode } node = this.endContainer; if (node.nodeType == 1) { if (pre = node.childNodes[this.endOffset]) { node.insertBefore(tmp, pre) } else { node.appendChild(tmp) } pre = node = tmp } else { pre = node } while (1) { if (domUtils.isBlockElm(node)) { node = pre; while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { node = pre } this.setEndAfter(node); break } pre = node; node = node.parentNode } if (tmp.parentNode === this.endContainer) { this.endOffset-- } domUtils.remove(tmp) } if (!this.collapsed) { while (this.startOffset == 0) { if (stopFn && stopFn(this.startContainer)) { break } if (isBody(this.startContainer)) { break } this.setStartBefore(this.startContainer) } while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) { if (stopFn && stopFn(this.endContainer)) { break } if (isBody(this.endContainer)) { break } this.setEndAfter(this.endContainer) } } return this }, enlargeToBlockElm: function (ignoreEnd) { while (!domUtils.isBlockElm(this.startContainer)) { this.setStartBefore(this.startContainer) } if (!ignoreEnd) { while (!domUtils.isBlockElm(this.endContainer)) { this.setEndAfter(this.endContainer) } } return this }, adjustmentBoundary: function () { if (!this.collapsed) { while (!domUtils.isBody(this.startContainer) && this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? "nodeValue" : "childNodes"].length && this.startContainer[this.startContainer.nodeType == 3 ? "nodeValue" : "childNodes"].length) { this.setStartAfter(this.startContainer) } while (!domUtils.isBody(this.endContainer) && !this.endOffset && this.endContainer[this.endContainer.nodeType == 3 ? "nodeValue" : "childNodes"].length) { this.setEndBefore(this.endContainer) } } return this }, applyInlineStyle: function (tagName, attrs, list) { if (this.collapsed) return this; this.trimBoundary().enlarge(false, function (node) { return node.nodeType == 1 && domUtils.isBlockElm(node) }).adjustmentBoundary(); var bookmark = this.createBookmark(), end = bookmark.end, filterFn = function (node) { return node.nodeType == 1 ? node.tagName.toLowerCase() != "br" : !domUtils.isWhitespace(node) }, current = domUtils.getNextDomNode(bookmark.start, false, filterFn), node, pre, range = this.cloneRange(); while (current && domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING) { if (current.nodeType == 3 || dtd[tagName][current.tagName]) { range.setStartBefore(current); node = current; while (node && (node.nodeType == 3 || dtd[tagName][node.tagName]) && node !== end) { pre = node; node = domUtils.getNextDomNode(node, node.nodeType == 1, null, function (parent) { return dtd[tagName][parent.tagName] }) } var frag = range.setEndAfter(pre).extractContents(), elm; if (list && list.length > 0) { var level, top; top = level = list[0].cloneNode(false); for (var i = 1, ci; ci = list[i++];) { level.appendChild(ci.cloneNode(false)); level = level.firstChild } elm = level } else { elm = range.document.createElement(tagName) } if (attrs) { domUtils.setAttributes(elm, attrs) } elm.appendChild(frag); if (elm.tagName == "SPAN" && attrs && attrs.style) { utils.each(elm.getElementsByTagName("span"), function (s) { s.style.cssText = s.style.cssText + ";" + attrs.style }) } range.insertNode(list ? top : elm); var aNode; if (tagName == "span" && attrs.style && /text\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, "a", true))) { domUtils.setAttributes(aNode, attrs); domUtils.remove(elm, true); elm = aNode } else { domUtils.mergeSibling(elm); domUtils.clearEmptySibling(elm) } domUtils.mergeChild(elm, attrs); current = domUtils.getNextDomNode(elm, false, filterFn); domUtils.mergeToParent(elm); if (node === end) { break } } else { current = domUtils.getNextDomNode(current, true, filterFn) } } return this.moveToBookmark(bookmark) }, removeInlineStyle: function (tagNames) { if (this.collapsed) return this; tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; this.shrinkBoundary().adjustmentBoundary(); var start = this.startContainer, end = this.endContainer; while (1) { if (start.nodeType == 1) { if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { break } if (start.tagName.toLowerCase() == "body") { start = null; break } } start = start.parentNode } while (1) { if (end.nodeType == 1) { if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { break } if (end.tagName.toLowerCase() == "body") { end = null; break } } end = end.parentNode } var bookmark = this.createBookmark(), frag, tmpRange; if (start) { tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start); frag = tmpRange.extractContents(); tmpRange.insertNode(frag); domUtils.clearEmptySibling(start, true); start.parentNode.insertBefore(bookmark.start, start) } if (end) { tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end); frag = tmpRange.extractContents(); tmpRange.insertNode(frag); domUtils.clearEmptySibling(end, false, true); end.parentNode.insertBefore(bookmark.end, end.nextSibling) } var current = domUtils.getNextDomNode(bookmark.start, false, function (node) { return node.nodeType == 1 }), next; while (current && current !== bookmark.end) { next = domUtils.getNextDomNode(current, true, function (node) { return node.nodeType == 1 }); if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { domUtils.remove(current, true) } current = next } return this.moveToBookmark(bookmark) }, getClosedNode: function () { var node; if (!this.collapsed) { var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); if (selectOneNode(range)) { var child = range.startContainer.childNodes[range.startOffset]; if (child && child.nodeType === 1 && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])) { node = child } } } return node }, select: browser.ie ? function (noFillData, textRange) { var nativeRange; if (!this.collapsed) this.shrinkBoundary(); var node = this.getClosedNode(); if (node && !textRange) { try { nativeRange = this.document.body.createControlRange(); nativeRange.addElement(node); nativeRange.select() } catch (e) { } return this } var bookmark = this.createBookmark(), start = bookmark.start, end; nativeRange = this.document.body.createTextRange(); nativeRange.moveToElementText(start); nativeRange.moveStart("character", 1); if (!this.collapsed) { var nativeRangeEnd = this.document.body.createTextRange(); end = bookmark.end; nativeRangeEnd.moveToElementText(end); nativeRange.setEndPoint("EndToEnd", nativeRangeEnd) } else { if (!noFillData && this.startContainer.nodeType != 3) { var tmpText = this.document.createTextNode(fillChar), tmp = this.document.createElement("span"); tmp.appendChild(this.document.createTextNode(fillChar)); start.parentNode.insertBefore(tmp, start); start.parentNode.insertBefore(tmpText, start); removeFillData(this.document, tmpText); fillData = tmpText; mergeSibling(tmp, "previousSibling"); mergeSibling(start, "nextSibling"); nativeRange.moveStart("character", -1); nativeRange.collapse(true) } } this.moveToBookmark(bookmark); tmp && domUtils.remove(tmp); try { nativeRange.select() } catch (e) { } return this } : function (notInsertFillData) { function checkOffset(rng) { function check(node, offset, dir) { if (node.nodeType == 3 && node.nodeValue.length < offset) { rng[dir + "Offset"] = node.nodeValue.length } } check(rng.startContainer, rng.startOffset, "start"); check(rng.endContainer, rng.endOffset, "end") } var win = domUtils.getWindow(this.document), sel = win.getSelection(), txtNode; browser.gecko ? this.document.body.focus() : win.focus(); if (sel) { sel.removeAllRanges(); if (this.collapsed && !notInsertFillData) { var start = this.startContainer, child = start; if (start.nodeType == 1) { child = start.childNodes[this.startOffset] } if (!(start.nodeType == 3 && this.startOffset) && (child ? !child.previousSibling || child.previousSibling.nodeType != 3 : !start.lastChild || start.lastChild.nodeType != 3)) { txtNode = this.document.createTextNode(fillChar); this.insertNode(txtNode); removeFillData(this.document, txtNode); mergeSibling(txtNode, "previousSibling"); mergeSibling(txtNode, "nextSibling"); fillData = txtNode; this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true) } } var nativeRange = this.document.createRange(); if (this.collapsed && browser.opera && this.startContainer.nodeType == 1) { var child = this.startContainer.childNodes[this.startOffset]; if (!child) { child = this.startContainer.lastChild; if (child && domUtils.isBr(child)) { this.setStartBefore(child).collapse(true) } } else { while (child && domUtils.isBlockElm(child)) { if (child.nodeType == 1 && child.childNodes[0]) { child = child.childNodes[0] } else { break } } child && this.setStartBefore(child).collapse(true) } } checkOffset(this); nativeRange.setStart(this.startContainer, this.startOffset); nativeRange.setEnd(this.endContainer, this.endOffset); sel.addRange(nativeRange) } return this }, scrollToView: function (win, offset) { win = win ? window : domUtils.getWindow(this.document); offset = offset || win.innerHeight - 100; var me = this, span = me.document.createElement("span"); span.innerHTML = " "; me.cloneRange().insertNode(span); domUtils.scrollToView(span, win, offset); domUtils.remove(span); return me }, inFillChar: function () { var start = this.startContainer; if (this.collapsed && start.nodeType == 3 && start.nodeValue.replace(new RegExp("^" + domUtils.fillChar), "").length + 1 == start.nodeValue.length) { return true } return false }, createAddress: function (ignoreEnd, ignoreTxt) { var addr = {}, me = this; function getAddress(isStart) { var node = isStart ? me.startContainer : me.endContainer; var parents = domUtils.findParents(node, true, function (node) { return !domUtils.isBody(node) }), addrs = []; for (var i = 0, ci; ci = parents[i++];) { addrs.push(domUtils.getNodeIndex(ci, ignoreTxt)) } var firstIndex = 0; if (ignoreTxt) { if (node.nodeType == 3) { var tmpNode = node.previousSibling; while (tmpNode && tmpNode.nodeType == 3) { firstIndex += tmpNode.nodeValue.replace(fillCharReg, "").length; tmpNode = tmpNode.previousSibling } firstIndex += isStart ? me.startOffset : me.endOffset } else { node = node.childNodes[isStart ? me.startOffset : me.endOffset]; if (node) { firstIndex = domUtils.getNodeIndex(node, ignoreTxt) } else { node = isStart ? me.startContainer : me.endContainer; var first = node.firstChild; while (first) { if (domUtils.isFillChar(first)) { first = first.nextSibling; continue } firstIndex++; if (first.nodeType == 3) { while (first && first.nodeType == 3) { first = first.nextSibling } } else { first = first.nextSibling } } } } } else { firstIndex = isStart ? domUtils.isFillChar(node) ? 0 : me.startOffset : me.endOffset } if (firstIndex < 0) { firstIndex = 0 } addrs.push(firstIndex); return addrs } addr.startAddress = getAddress(true); if (!ignoreEnd) { addr.endAddress = me.collapsed ? [].concat(addr.startAddress) : getAddress() } return addr }, moveToAddress: function (addr, ignoreEnd) { var me = this; function getNode(address, isStart) { var tmpNode = me.document.body, parentNode, offset; for (var i = 0, ci, l = address.length; i < l; i++) { ci = address[i]; parentNode = tmpNode; tmpNode = tmpNode.childNodes[ci]; if (!tmpNode) { offset = ci; break } } if (isStart) { if (tmpNode) { me.setStartBefore(tmpNode) } else { me.setStart(parentNode, offset) } } else { if (tmpNode) { me.setEndBefore(tmpNode) } else { me.setEnd(parentNode, offset) } } } getNode(addr.startAddress, true); !ignoreEnd && addr.endAddress && getNode(addr.endAddress); return me }, equals: function (rng) { for (var p in this) { if (this.hasOwnProperty(p)) { if (this[p] !== rng[p]) return false } } return true }, traversal: function (doFn, filterFn) { if (this.collapsed) return this; var bookmark = this.createBookmark(), end = bookmark.end, current = domUtils.getNextDomNode(bookmark.start, false, filterFn); while (current && current !== end && domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING) { var tmpNode = domUtils.getNextDomNode(current, false, filterFn); doFn(current); current = tmpNode } return this.moveToBookmark(bookmark) } } })(); (function () { function getBoundaryInformation(range, start) { var getIndex = domUtils.getNodeIndex; range = range.duplicate(); range.collapse(start); var parent = range.parentElement(); if (!parent.hasChildNodes()) { return {container: parent, offset: 0} } var siblings = parent.children, child, testRange = range.duplicate(), startIndex = 0, endIndex = siblings.length - 1, index = -1, distance; while (startIndex <= endIndex) { index = Math.floor((startIndex + endIndex) / 2); child = siblings[index]; testRange.moveToElementText(child); var position = testRange.compareEndPoints("StartToStart", range); if (position > 0) { endIndex = index - 1 } else if (position < 0) { startIndex = index + 1 } else { return {container: parent, offset: getIndex(child)} } } if (index == -1) { testRange.moveToElementText(parent); testRange.setEndPoint("StartToStart", range); distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; siblings = parent.childNodes; if (!distance) { child = siblings[siblings.length - 1]; return {container: child, offset: child.nodeValue.length} } var i = siblings.length; while (distance > 0) { distance -= siblings[--i].nodeValue.length } return {container: siblings[i], offset: -distance} } testRange.collapse(position > 0); testRange.setEndPoint(position > 0 ? "StartToStart" : "EndToStart", range); distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; if (!distance) { return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ? { container: parent, offset: getIndex(child) + (position > 0 ? 0 : 1) } : {container: child, offset: position > 0 ? 0 : child.childNodes.length} } while (distance > 0) { try { var pre = child; child = child[position > 0 ? "previousSibling" : "nextSibling"]; distance -= child.nodeValue.length } catch (e) { return {container: parent, offset: getIndex(pre)} } } return {container: child, offset: position > 0 ? -distance : child.nodeValue.length + distance} } function transformIERangeToRange(ieRange, range) { if (ieRange.item) { range.selectNode(ieRange.item(0)) } else { var bi = getBoundaryInformation(ieRange, true); range.setStart(bi.container, bi.offset); if (ieRange.compareEndPoints("StartToEnd", ieRange) != 0) { bi = getBoundaryInformation(ieRange, false); range.setEnd(bi.container, bi.offset) } } return range } function _getIERange(sel) { var ieRange; try { ieRange = sel.getNative().createRange() } catch (e) { return null } var el = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); if ((el.ownerDocument || el) === sel.document) { return ieRange } return null } var Selection = dom.Selection = function (doc) { var me = this, iframe; me.document = doc; if (browser.ie9below) { iframe = domUtils.getWindow(doc).frameElement; domUtils.on(iframe, "beforedeactivate", function () { me._bakIERange = me.getIERange() }); domUtils.on(iframe, "activate", function () { try { if (!_getIERange(me) && me._bakIERange) { me._bakIERange.select() } } catch (ex) { } me._bakIERange = null }) } iframe = doc = null }; Selection.prototype = { rangeInBody: function (rng, txtRange) { var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer; return node === this.document.body || domUtils.inDoc(node, this.document) }, getNative: function () { var doc = this.document; try { return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow(doc).getSelection() } catch (e) { return null } }, getIERange: function () { var ieRange = _getIERange(this); if (!ieRange) { if (this._bakIERange) { return this._bakIERange } } return ieRange }, cache: function () { this.clear(); this._cachedRange = this.getRange(); this._cachedStartElement = this.getStart(); this._cachedStartElementPath = this.getStartElementPath() }, getStartElementPath: function () { if (this._cachedStartElementPath) { return this._cachedStartElementPath } var start = this.getStart(); if (start) { return domUtils.findParents(start, true, null, true) } return [] }, clear: function () { this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null }, isFocus: function () { try { if (browser.ie9below) { var nativeRange = _getIERange(this); return !!(nativeRange && this.rangeInBody(nativeRange)) } else { return !!this.getNative().rangeCount } } catch (e) { return false } }, getRange: function () { var me = this; function optimze(range) { var child = me.document.body.firstChild, collapsed = range.collapsed; while (child && child.firstChild) { range.setStart(child, 0); child = child.firstChild } if (!range.startContainer) { range.setStart(me.document.body, 0) } if (collapsed) { range.collapse(true) } } if (me._cachedRange != null) { return this._cachedRange } var range = new baidu.editor.dom.Range(me.document); if (browser.ie9below) { var nativeRange = me.getIERange(); if (nativeRange) { try { transformIERangeToRange(nativeRange, range) } catch (e) { optimze(range) } } else { optimze(range) } } else { var sel = me.getNative(); if (sel && sel.rangeCount) { var firstRange = sel.getRangeAt(0); var lastRange = sel.getRangeAt(sel.rangeCount - 1); range.setStart(firstRange.startContainer, firstRange.startOffset).setEnd(lastRange.endContainer, lastRange.endOffset); if (range.collapsed && domUtils.isBody(range.startContainer) && !range.startOffset) { optimze(range) } } else { if (this._bakRange && domUtils.inDoc(this._bakRange.startContainer, this.document)) { return this._bakRange } optimze(range) } } return this._bakRange = range }, getStart: function () { if (this._cachedStartElement) { return this._cachedStartElement } var range = browser.ie9below ? this.getIERange() : this.getRange(), tmpRange, start, tmp, parent; if (browser.ie9below) { if (!range) { return this.document.body.firstChild } if (range.item) { return range.item(0) } tmpRange = range.duplicate(); tmpRange.text.length > 0 && tmpRange.moveStart("character", 1); tmpRange.collapse(1); start = tmpRange.parentElement(); parent = tmp = range.parentElement(); while (tmp = tmp.parentNode) { if (tmp == start) { start = parent; break } } } else { range.shrinkBoundary(); start = range.startContainer; if (start.nodeType == 1 && start.hasChildNodes()) { start = start.childNodes[Math.min(start.childNodes.length - 1, range.startOffset)] } if (start.nodeType == 3) { return start.parentNode } } return start }, getText: function () { var nativeSel, nativeRange; if (this.isFocus() && (nativeSel = this.getNative())) { nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt(0); return browser.ie9below ? nativeRange.text : nativeRange.toString() } return "" }, clearRange: function () { this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"]() } } })(); (function () { var uid = 0, _selectionChangeTimer; function setValue(form, editor) { if (!editor.options.textarea) { return } var textarea; textarea = editor.textarea; if (!textarea) { textarea = domUtils.getElementsByTagName(form, "textarea", function (node) { return node.id === "ueditor_textarea_" + editor.options.textarea })[0] } if (!textarea) { textarea = domUtils.getElementsByTagName(form, "textarea", function (node) { return node.name === editor.options.textarea })[0] } if (!textarea) { form.appendChild(textarea = domUtils.createElement(document, "textarea", { name: editor.options.textarea, id: "ueditor_textarea_" + editor.options.textarea, style: "display:none" })) } if (textarea && !editor.textarea) { editor.textarea = textarea } !textarea.getAttribute("name") && textarea.setAttribute("name", editor.options.textarea); textarea.value = editor.hasContents() ? editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true) : "" } function loadPlugins(me) { for (var pi in UE.plugins) { UE.plugins[pi].call(me) } } function checkCurLang(I18N) { for (var lang in I18N) { return lang } } function langReadied(me) { me.langIsReady = true; me.fireEvent("langReady") } var Editor = UE.Editor = function (options) { var me = this; me.uid = uid++; EventBase.call(me); me.commands = {}; me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); me.shortcutkeys = {}; me.inputRules = []; me.outputRules = []; me.setOpt(Editor.defaultOptions(me)); me.loadServerConfig(); if (!utils.isEmptyObject(UE.I18N)) { me.options.lang = checkCurLang(UE.I18N); UE.plugin.load(me); langReadied(me) } else { utils.loadFile(document, { src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js?7a537435", tag: "script", type: "text/javascript", defer: "defer" }, function () { UE.plugin.load(me); langReadied(me) }) } UE.instants["ueditorInstant" + me.uid] = me }; Editor.prototype = { registerCommand: function (name, obj) { this.commands[name] = obj }, ready: function (fn) { var me = this; if (fn) { me.isReady ? fn.apply(me) : me.addListener("ready", fn) } }, setOpt: function (key, val) { var obj = {}; if (utils.isString(key)) { obj[key] = val } else { obj = key } utils.extend(this.options, obj, true) }, getOpt: function (key) { return this.options[key] }, destroy: function () { var me = this; me.fireEvent("destroy"); var container = me.container.parentNode; var textarea = me.textarea; if (!textarea) { textarea = document.createElement("textarea"); container.parentNode.insertBefore(textarea, container) } else { textarea.style.display = "" } textarea.style.width = me.iframe.offsetWidth + "px"; textarea.style.height = me.iframe.offsetHeight + "px"; textarea.value = me.getContent(); textarea.id = me.key; container.innerHTML = ""; domUtils.remove(container); var key = me.key; for (var p in me) { if (me.hasOwnProperty(p)) { delete this[p] } } UE.delEditor(key) }, render: function (container) { var me = this, options = me.options, getStyleValue = function (attr) { return parseInt(domUtils.getComputedStyle(container, attr)) }; if (utils.isString(container)) { container = document.getElementById(container) } if (container) { if (options.initialFrameWidth) { options.minFrameWidth = options.initialFrameWidth } else { options.minFrameWidth = options.initialFrameWidth = container.offsetWidth } if (options.initialFrameHeight) { options.minFrameHeight = options.initialFrameHeight } else { options.initialFrameHeight = options.minFrameHeight = container.offsetHeight } container.style.width = /%$/.test(options.initialFrameWidth) ? "100%" : options.initialFrameWidth - getStyleValue("padding-left") - getStyleValue("padding-right") + "px"; container.style.height = /%$/.test(options.initialFrameHeight) ? "100%" : options.initialFrameHeight - getStyleValue("padding-top") - getStyleValue("padding-bottom") + "px"; container.style.zIndex = options.zIndex; var additionCssHtml = []; for (var i in options.iframeCssUrlsAddition) { additionCssHtml.push("") } var html = (ie && browser.version < 9 ? "" : "") + "" + "" + "" + (options.iframeCssUrl ? "" : "") + (options.initialStyle ? "" : "") + additionCssHtml.join("") + "" + "" + "