(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(" ") + " >" + obj.tag + ">");
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 ? "" : "") + "" + "