/******************************************************************************* * KindEditor - WYSIWYG HTML Editor for Internet * * @author Roddy * @site http://www.kindsoft.net/ * @licence LGPL(http://www.opensource.org/licenses/lgpl-license.php) * @version 3.2.1 *******************************************************************************/ var KE = {}; KE.version = '3.2.1'; KE.lang = { source : '切换模式', preview : '预览', undo : '后退(Ctrl+Z)', redo : '前进(Ctrl+Y)', cut : '剪切(Ctrl+X)', copy : '复制(Ctrl+C)', paste : '粘贴(Ctrl+V)', plainpaste : '粘贴为无格式文本', wordpaste : '从Word粘贴', selectall : '全选', justifyleft : '左对齐', justifycenter : '居中', justifyright : '右对齐', justifyfull : '两端对齐', insertorderedlist : '编号', insertunorderedlist : '项目符号', indent : '增加缩进', outdent : '减少缩进', subscript : '下标', superscript : '上标', date : '插入当前日期', time : '插入当前时间', title : '标题', fontname : '字体', fontsize : '文字大小', textcolor : '文字颜色', bgcolor : '文字背景', bold : '粗体', italic : '斜体', underline : '下划线', strikethrough : '删除线', removeformat : '删除格式', image : '插入图片', flash : '插入Flash', media : '插入多媒体', layer : '插入层', table : '插入表格', specialchar : '插入特殊字符', hr : '插入横线', emoticons : '插入笑脸', link : '超级连接', unlink : '取消超级连接', fullscreen : '全屏显示', about : '关于', print : '打印', yes : '确定', no : '取消', close : '关闭', invalidImg : "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。", invalidMedia : "请输入有效的URL地址。\n只允许mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。", invalidWidth : "宽度必须为数字。", invalidHeight : "高度必须为数字。", invalidBorder : "边框必须为数字。", invalidUrl : "URL不正确。", pleaseInput : "请输入内容" }; KE.scriptPath = (function() { var elements = document.getElementsByTagName('script'); for (var i = 0, len = elements.length; i < len; i++) { if (elements[i].src && elements[i].src.match(/kindeditor[\w\-\.]*\.js/)) { return elements[i].src.substring(0, elements[i].src.lastIndexOf('/') + 1); } } return ""; })(); KE.htmlPath = (function() { return location.href.substring(0, location.href.lastIndexOf('/') + 1); })(); KE.browser = (function() { var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf("msie") > -1) return 'IE'; else if (ua.indexOf("webkit") > -1) return 'WEBKIT'; else if (ua.indexOf("gecko") > -1) return 'GECKO'; else if (ua.indexOf("opera") > -1) return 'OPERA'; else return ""; })(); KE.setting = { wyswygMode : true, autoOnsubmitMode : true, resizeMode : 2, filterMode : true, tagLineMode : false, skinType : 'default', cssPath : '', skinsPath : KE.scriptPath + 'skins/', pluginsPath : KE.scriptPath + 'plugins/', minWidth : 200, minHeight : 100, minChangeSize : 5, siteDomains : [], items : [ 'source', 'preview', 'fullscreen', 'undo', 'redo', 'print', 'cut', 'copy', 'paste', 'plainpaste', 'wordpaste', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript', 'superscript', 'date', 'time', '-', 'title', 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold', 'italic', 'underline', 'strikethrough', 'removeformat', 'selectall', 'image', 'flash', 'media', 'layer', 'table', 'specialchar', 'hr', 'emoticons', 'link', 'unlink', 'about' ], colorTable : [ ["#FFFFFF","#E5E4E4","#D9D8D8","#C0BDBD","#A7A4A4","#8E8A8B","#827E7F","#767173","#5C585A","#000000"], ["#FEFCDF","#FEF4C4","#FEED9B","#FEE573","#FFED43","#F6CC0B","#E0B800","#C9A601","#AD8E00","#8C7301"], ["#FFDED3","#FFC4B0","#FF9D7D","#FF7A4E","#FF6600","#E95D00","#D15502","#BA4B01","#A44201","#8D3901"], ["#FFD2D0","#FFBAB7","#FE9A95","#FF7A73","#FF483F","#FE2419","#F10B00","#D40A00","#940000","#6D201B"], ["#FFDAED","#FFB7DC","#FFA1D1","#FF84C3","#FF57AC","#FD1289","#EC0078","#D6006D","#BB005F","#9B014F"], ["#FCD6FE","#FBBCFF","#F9A1FE","#F784FE","#F564FE","#F546FF","#F328FF","#D801E5","#C001CB","#8F0197"], ["#E2F0FE","#C7E2FE","#ADD5FE","#92C7FE","#6EB5FF","#48A2FF","#2690FE","#0162F4","#013ADD","#0021B0"], ["#D3FDFF","#ACFAFD","#7CFAFF","#4AF7FE","#1DE6FE","#01DEFF","#00CDEC","#01B6DE","#00A0C2","#0084A0"], ["#EDFFCF","#DFFEAA","#D1FD88","#BEFA5A","#A8F32A","#8FD80A","#79C101","#3FA701","#307F00","#156200"], ["#D4C89F","#DAAD88","#C49578","#C2877E","#AC8295","#C0A5C4","#969AC2","#92B7D7","#80ADAF","#9CA53B"] ], noEndTags : ['br', 'hr', 'img', 'area', 'col', 'embed', 'input', 'param'], inlineTags : ['b', 'del', 'em', 'font', 'i', 'span', 'strike', 'strong', 'sub', 'sup', 'u'], htmlTags : { font : ['color', 'size', 'face', '.background-color'], span : [ '.color', '.background-color', '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.vertical-align' ], div : [ 'class', 'align', '.border', '.margin', '.padding', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.vertical-align' ], table: [ 'class', 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', '.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration' ], 'td,th': [ 'class', 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.vertical-align' ], a : ['class', 'href', 'target', 'name'], embed : ['src', 'type', 'loop', 'autostart', 'quality', '.width', '.height', '/'], img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height', '/'], hr : ['class', '/'], br : ['/'], 'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [ 'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.vertical-align' ], 'tbody,tr,strong,b,sub,sup,em,i,u,strike' : [] } }; KE.g = {}; KE.plugin = {}; KE.$ = function(id, doc){ var doc = doc || document; return doc.getElementById(id); }; KE.$$ = function(name, doc){ var doc = doc || document; return doc.createElement(name); }; KE.event = { add : function(el, event, listener) { if (el.addEventListener){ el.addEventListener(event, listener, false); } else if (el.attachEvent){ el.attachEvent('on' + event, listener); } }, remove : function(el, event, listener) { if (el.removeEventListener){ el.removeEventListener(event, listener, false); } else if (el.detachEvent){ el.detachEvent('on' + event, listener); } }, input : function(el, func) { this.add(el, 'keyup', function(e) { if (!e.ctrlKey && !e.shiftKey && !e.altKey && (e.keyCode < 16 || e.keyCode > 18)) { func(e); return false; } }); }, ctrl : function(el, key, func) { this.add(el, 'keydown', function(e) { if (e.ctrlKey && e.keyCode == key.toUpperCase().charCodeAt(0) && !e.shiftKey && !e.altKey) { func(e); return false; } }); } }; KE.each = function(obj, func) { for (var key in obj) { if (obj.hasOwnProperty(key)) func(key, obj[key]); } }; KE.eachNode = function(node, func) { var walkNodes = function(parent) { if (KE.util.getNodeType(parent) != 1) return true; var n = parent.firstChild; while (n != null) { var next = n.nextSibling; if (!func(n)) return false; if (!walkNodes(n)) return false; n = next; } return true; }; walkNodes(node); }; KE.selection = function(win, doc) { this.sel = null; this.range = null; this.keRange = null; this.init = function() { var sel = win.getSelection ? win.getSelection() : doc.selection; var range; try { if (sel.rangeCount > 0) range = sel.getRangeAt(0); else range = sel.createRange(); } catch(e) {} if (!range) range = KE.util.createRange(doc); this.sel = sel; this.range = range; var startNode, startPos, endNode, endPos; if (KE.browser == 'IE') { if (range.item) { var el = range.item(0); startNode = endNode = el; startPos = endPos = 0; } else { var getStartEnd = function(isStart) { var pointRange = range.duplicate(); pointRange.collapse(isStart); var parentNode = pointRange.parentElement(); var nodes = parentNode.childNodes; if (nodes.length == 0) return {node: parentNode, pos: 0}; var startNode; var endElement; var startPos = 0; var isEnd = false; var testRange = range.duplicate(); testRange.moveToElementText(parentNode); for (var i = 0, len = nodes.length; i < len; i++) { var node = nodes[i]; var cmp = testRange.compareEndPoints('StartToStart', pointRange); if (cmp > 0) { isEnd = true; } else if (cmp == 0) { if (node.nodeType == 1) { var keRange = new KE.range(doc); keRange.selectTextNode(node); return {node: keRange.startNode, pos: 0}; } else { return {node: node, pos: 0}; } } if (node.nodeType == 1) { var nodeRange = range.duplicate(); nodeRange.moveToElementText(node); testRange.setEndPoint('StartToEnd', nodeRange); if (isEnd) startPos += nodeRange.text.length; else startPos = 0; } else if (node.nodeType == 3) { testRange.moveStart('character', node.nodeValue.length); startPos += node.nodeValue.length; } if (!isEnd) startNode = node; } if (!isEnd && startNode.nodeType == 1) { var startNode = parentNode.lastChild; return {node: startNode, pos: startNode.nodeType == 1 ? 1 : startNode.nodeValue.length}; } testRange = range.duplicate(); testRange.moveToElementText(parentNode); testRange.setEndPoint('StartToEnd', pointRange); startPos -= testRange.text.replace(/\r\n|\n|\r/g, '').length; return {node: startNode, pos: startPos}; }; var start = getStartEnd(true); var end = getStartEnd(false); startNode = start.node; startPos = start.pos; endNode = end.node; endPos = end.pos; } } else { startNode = range.startContainer; startPos = range.startOffset; endNode = range.endContainer; endPos = range.endOffset; if (startNode.nodeType == 1 && typeof startNode.childNodes[startPos] != "undefined") { startNode = startNode.childNodes[startPos]; startPos = startNode.nodeType == 1 ? 0 : startNode.nodeValue.length; } if (endNode.nodeType == 1 && typeof endNode.childNodes[endPos] != "undefined") { endNode = endNode.childNodes[endPos]; endPos = endNode.nodeType == 1 ? 0 : endNode.nodeValue.length; } } var keRange = new KE.range(doc); keRange.setTextStart(startNode, startPos); keRange.setTextEnd(endNode, endPos); this.keRange = keRange; }; this.init(); this.addRange = function(keRange) { this.keRange = keRange; if (KE.browser == 'IE') { var getEndRange = function(isStart) { var range = KE.util.createRange(doc); var node = isStart ? keRange.startNode : keRange.endNode; if (node.nodeType == 1) { range.moveToElementText(node); range.collapse(isStart); } else if (node.nodeType == 3) { range = KE.util.getNodeStartRange(doc, node); var pos = isStart ? keRange.startPos : keRange.endPos; range.moveStart('character', pos); } return range; } if (!this.range.item) { var node = keRange.startNode; if (node == keRange.endNode && KE.util.getNodeType(node) == 1 && KE.util.getNodeTextLength(node) == 0) { var temp = doc.createTextNode(" "); node.appendChild(temp); this.range.moveToElementText(node); this.range.collapse(false); this.range.select(); node.removeChild(temp); } else { this.range.setEndPoint('StartToStart', getEndRange(true)); this.range.setEndPoint('EndToStart', getEndRange(false)); this.range.select(); } } } else { var range = new KE.range(doc); range.setTextStart(keRange.startNode, keRange.startPos); range.setTextEnd(keRange.endNode, keRange.endPos); this.range.setStart(range.startNode, range.startPos); this.range.setEnd(range.endNode, range.endPos); this.sel.removeAllRanges(); this.sel.addRange(this.range); } }; this.focus = function() { if (KE.browser == 'IE' && this.range != null) this.range.select(); } }; KE.range = function(doc) { this.startNode = null; this.startPos = null; this.endNode = null; this.endPos = null; this.getParentElement = function() { var scanParent = function(node, func) { while (node != null && node.tagName != 'body') { node = node.parentNode; if (func(node)) return; } } var nodeList = []; scanParent(this.startNode, function(node) { nodeList.push(node); }); var parentNode; scanParent(this.endNode, function(node) { if (KE.util.inArray(node, nodeList)) { parentNode = node; return true; } }); return parentNode ? parentNode : doc.body; }; this.getNodeList = function() { var parentNode = this.getParentElement(); var nodeList = []; var keRange = this; var startNode = this.startNode; var isStarted = false; if (parentNode == startNode) isStarted = true; if (isStarted) nodeList.push(parentNode); KE.eachNode(parentNode, function(node) { if (node == startNode) isStarted = true; var range = new KE.range(doc); range.selectTextNode(node); if (range.comparePoints('START_TO_END', keRange) >= 0) return false; if (isStarted) nodeList.push(node); return true; }); return nodeList; }; this.comparePoints = function(how, range) { var compareNodes = function(nodeA, posA, nodeB, posB) { var cmp; if (KE.browser == 'IE') { var getStartRange = function(node, pos, isStart) { var range = KE.util.createRange(doc); var type = KE.util.getNodeType(node); if (type == 1) { range.moveToElementText(node); range.collapse(isStart); } else if (type == 3) { range = KE.util.getNodeStartRange(doc, node); range.moveStart('character', pos); range.collapse(true); } return range; } var rangeA, rangeB; if (how == 'START_TO_START' || how == 'START_TO_END') rangeA = getStartRange(nodeA, posA, true); else rangeA = getStartRange(nodeA, posA, false); if (how == 'START_TO_START' || how == 'END_TO_START') rangeB = getStartRange(nodeB, posB, true); else rangeB = getStartRange(nodeB, posB, false); return rangeA.compareEndPoints('StartToStart', rangeB); } else { var rangeA = KE.util.createRange(doc); rangeA.selectNode(nodeA); if (how == 'START_TO_START' || how == 'START_TO_END') rangeA.collapse(true); else rangeA.collapse(false); var rangeB = KE.util.createRange(doc); rangeB.selectNode(nodeB); if (how == 'START_TO_START' || how == 'END_TO_START') rangeB.collapse(true); else rangeB.collapse(false); if (rangeA.compareBoundaryPoints(Range.START_TO_START, rangeB) > 0) { cmp = 1; } else if (rangeA.compareBoundaryPoints(Range.START_TO_START, rangeB) == 0) { if (posA > posB) cmp = 1; else if (posA == posB) cmp = 0; else cmp = -1; } else { cmp = -1; } } return cmp; } if (how == 'START_TO_START') return compareNodes(this.startNode, this.startPos, range.startNode, range.startPos); if (how == 'START_TO_END') return compareNodes(this.startNode, this.startPos, range.endNode, range.endPos); if (how == 'END_TO_START') return compareNodes(this.endNode, this.endPos, range.startNode, range.startPos); if (how == 'END_TO_END') return compareNodes(this.endNode, this.endPos, range.endNode, range.endPos); }; this.setTextStart = function(node, pos) { var textNode = node; KE.eachNode(node, function(n) { if (KE.util.getNodeType(n) == 3 && n.nodeValue.length > 0) { textNode = n; pos = 0; return false; } return true; }); this.setStart(textNode, pos); }; this.setStart = function(node, pos) { this.startNode = node; this.startPos = pos; if (this.endNode === null) { this.endNode = node; this.endPos = pos; } }; this.setTextEnd = function(node, pos) { var textNode = node; KE.eachNode(node, function(n) { if (KE.util.getNodeType(n) == 3 && n.nodeValue.length > 0) { textNode = n; pos = n.nodeValue.length; } return true; }); this.setEnd(textNode, pos); }; this.setEnd = function(node, pos) { this.endNode = node; this.endPos = pos; if (this.startNode === null) { this.startNode = node; this.startPos = pos; } }; this.selectNode = function(node) { this.setStart(node, 0); this.setEnd(node, node.nodeType == 1 ? 0 : node.nodeValue.length); }; this.selectTextNode = function(node) { this.setTextStart(node, 0); this.setTextEnd(node, node.nodeType == 1 ? 0 : node.nodeValue.length); }; this.extractContents = function(isDelete) { isDelete = (isDelete === false) ? false : true; var thisRange = this; var startNode = this.startNode; var startPos = this.startPos; var endNode = this.endNode; var endPos = this.endPos; var extractTextNode = function(node, startPos, endPos) { var length = node.nodeValue.length; var cloneNode = node.cloneNode(true); var centerNode = cloneNode.splitText(startPos); centerNode.splitText(endPos - startPos); if (isDelete) { var center = node; if (startPos > 0) center = node.splitText(startPos); if (endPos < length) center.splitText(endPos - startPos); center.parentNode.removeChild(center); } return centerNode; }; var isStarted = false; var isEnd = false; var extractNodes = function(parent, frag) { if (KE.util.getNodeType(parent) != 1) return true; var node = parent.firstChild; while (node != null) { if (node == startNode) isStarted = true; if (node == endNode) isEnd = true; var nextNode = node.nextSibling; var type = KE.util.getNodeType(node); if (type == 1) { var range = new KE.range(doc); range.selectNode(node); if (isStarted && range.comparePoints('END_TO_END', thisRange) < 0) { var cloneNode = node.cloneNode(true); frag.appendChild(cloneNode); if (isDelete) { node.parentNode.removeChild(node); } } else { var childFlag = node.cloneNode(false); frag.appendChild(childFlag); if (!extractNodes(node, childFlag)) return false; } } else if (type == 3) { if (isStarted) { var textNode; if (node == startNode && node == endNode) { textNode = extractTextNode(node, startPos, endPos); frag.appendChild(textNode); return false; } else if (node == startNode) { textNode = extractTextNode(node, startPos, node.nodeValue.length); frag.appendChild(textNode); } else if (node == endNode) { textNode = extractTextNode(node, 0, endPos); frag.appendChild(textNode); return false; } else { textNode = extractTextNode(node, 0, node.nodeValue.length); frag.appendChild(textNode); } } } node = nextNode; if (isEnd) return false; } return true; } var parentNode = this.getParentElement(); var docFrag = parentNode.cloneNode(false); extractNodes(parentNode, docFrag); return docFrag; }; this.cloneContents = function() { return this.extractContents(false); }; this.getText = function() { var html = this.cloneContents().innerHTML; return html.replace(/<.*?>/g, ""); }; }; KE.cmd = function(id) { this.doc = KE.g[id].iframeDoc; this.keSel = KE.g[id].keSel; this.keRange = KE.g[id].keRange; this.mergeAttributes = function(el, attr) { for (var i = 0, len = attr.length; i < len; i++) { KE.each(attr[i], function(key, value) { if (key.charAt(0) == '.') { var jsKey = KE.util.getJsKey(key.substr(1)); eval('el.style.' + jsKey + ' = value;'); } else { el.setAttribute(key, value); } }); } return el; }; this.wrapTextNode = function(node, startPos, endPos, element, attributes) { var length = node.nodeValue.length; var isFull = (startPos == 0 && endPos == length); var range = new KE.range(this.doc); range.selectTextNode(node.parentNode); if (isFull && node.parentNode.tagName == element.tagName && range.comparePoints('END_TO_END', this.keRange) <= 0 && range.comparePoints('START_TO_START', this.keRange) >= 0) { this.mergeAttributes(node.parentNode, attributes); return node; } else { var el = element.cloneNode(true); if (isFull) { var cloneNode = node.cloneNode(true); el.appendChild(cloneNode); node.parentNode.replaceChild(el, node); return cloneNode; } else { var centerNode = node; if (startPos < endPos) { if (startPos > 0) centerNode = node.splitText(startPos); if (endPos < length) centerNode.splitText(endPos - startPos); var cloneNode = centerNode.cloneNode(true); el.appendChild(cloneNode); centerNode.parentNode.replaceChild(el, centerNode); return cloneNode; } else { if (startPos < length) { centerNode = node.splitText(startPos); centerNode.parentNode.insertBefore(el, centerNode); } else { if (centerNode.nextSibling) { centerNode.parentNode.insertBefore(el, centerNode.nextSibling); } else { centerNode.parentNode.appendChild(el); } } return el; } } } }; this.wrap = function(tagName, attributes) { var self = this; this.keSel.focus(); var element = KE.$$(tagName, this.doc); this.mergeAttributes(element, attributes); var keRange = this.keRange; var startNode = keRange.startNode; var startPos = keRange.startPos; var endNode = keRange.endNode; var endPos = keRange.endPos; var parentNode = keRange.getParentElement(); var isStarted = false; KE.eachNode(parentNode, function(node) { if (node == startNode) isStarted = true; if (node.nodeType == 1) { if (node == startNode && node == endNode) { if (KE.util.inArray(node.tagName.toLowerCase(), KE.setting.noEndTags)) { if (startPos > 0) node.parentNode.appendChild(element); else node.parentNode.insertBefore(element, node); } else { node.appendChild(element); } keRange.selectNode(element); return false; } else if (node == startNode) { keRange.setStart(node, 0); } else if (node == endNode) { keRange.setEnd(node, 0); return false; } } else if (node.nodeType == 3) { if (isStarted) { if (node == startNode && node == endNode) { var rangeNode = self.wrapTextNode(node, startPos, endPos, element, attributes); keRange.selectNode(rangeNode); return false; } else if (node == startNode) { var rangeNode = self.wrapTextNode(node, startPos, node.nodeValue.length, element, attributes); keRange.setStart(rangeNode, 0); } else if (node == endNode) { var rangeNode = self.wrapTextNode(node, 0, endPos, element, attributes); keRange.setEnd(rangeNode, rangeNode.nodeType == 1 ? 0 : rangeNode.nodeValue.length); return false; } else { self.wrapTextNode(node, 0, node.nodeValue.length, element, attributes); } } } return true; }); this.keSel.addRange(keRange); }; this.getTopParent = function(tagNames, node) { var parent = null; while (node != null) { node = node.parentNode; if (KE.util.inArray(node.tagName.toLowerCase(), tagNames)) { parent = node; } else { break; } } return parent; }; this.splitNodeParent = function(parent, node, pos) { var leftRange = new KE.range(this.doc); leftRange.selectNode(parent.firstChild); leftRange.setEnd(node, pos); var leftFrag = leftRange.extractContents(); parent.parentNode.insertBefore(leftFrag, parent); return {left : leftFrag, right : parent}; }; this.remove = function(tagNames, attributes) { var keRange = this.keRange; var startNode = keRange.startNode; var startPos = keRange.startPos; var endNode = keRange.endNode; var endPos = keRange.endPos; this.keSel.focus(); if (keRange.getText().replace(/\s+/g, '') === '') return; var startParent = this.getTopParent(tagNames, startNode); var endParent = this.getTopParent(tagNames, endNode); if (startParent) { var startFrags = this.splitNodeParent(startParent, startNode, startPos); keRange.setStart(startFrags.right, 0); if (startNode == endNode && KE.util.getNodeTextLength(startFrags.right) > 0) { keRange.selectNode(startFrags.right); var range = new KE.range(this.doc); range.selectTextNode(startFrags.left); if (startPos > 0) endPos -= range.endNode.nodeValue.length; range.selectTextNode(startFrags.right); endNode = range.startNode; } } if (endParent) { var endFrags = this.splitNodeParent(endParent, endNode, endPos); this.keRange.setEnd(endFrags.left, 0); if (startParent == endParent) { keRange.setStart(endFrags.left, 0); } } var nodeList = keRange.getNodeList(); keRange.setTextStart(keRange.startNode, keRange.startPos); keRange.setTextEnd(keRange.endNode, keRange.endPos); for (var i = 0; i < nodeList.length; i++) { var node = nodeList[i]; if (node.nodeType == 1) { if (KE.util.inArray(node.tagName.toLowerCase(), tagNames)) { KE.util.removeParent(node); } else { for (var j = 0; j < attributes.length; j++) { node.removeAttribute(attributes[j]); } } } } try { this.keSel.addRange(keRange); } catch(e) {} }; } KE.util = { getDocumentElement : function() { return (document.compatMode != "CSS1Compat") ? document.body : document.documentElement; }, getDocumentHeight : function() { var el = this.getDocumentElement(); return Math.max(el.scrollHeight, el.clientHeight); }, getDocumentWidth : function() { var el = this.getDocumentElement(); return Math.max(el.scrollWidth, el.clientWidth); }, createTable : function() { var table = KE.$$('table'); table.cellPadding = 0; table.cellSpacing = 0; table.border = 0; return {table: table, cell: table.insertRow(0).insertCell(0)}; }, loadStyle : function(path) { var link = KE.$$('link'); link.setAttribute('type', 'text/css'); link.setAttribute('rel', 'stylesheet'); link.setAttribute('href', path); document.getElementsByTagName("head")[0].appendChild(link); }, inArray : function(str, arr) { for (var i = 0; i < arr.length; i++) {if (str == arr[i]) return true;} return false; }, getJsKey : function(key) { var arr = key.split('-'); key = ''; for (var i = 0, len = arr.length; i < len; i++) { key += (i > 0) ? arr[i].charAt(0).toUpperCase() + arr[i].substr(1) : arr[i]; } return key; }, escape : function(html) { html = html.replace(/&/g, "&"); html = html.replace(//g, ">"); html = html.replace(/\xA0/g, " "); html = html.replace(/\x20/g, " "); return html; }, getElementPos : function(el) { var x = 0; var y = 0; if (KE.browser != "WEBKIT") { var box = el.getBoundingClientRect(); var el = this.getDocumentElement(); x = box.left + el.scrollLeft - el.clientLeft; y = box.top + el.scrollTop - el.clientTop; } else { x = el.offsetLeft; y = el.offsetTop; var parent = el.offsetParent; while (parent) { x += parent.offsetLeft; y += parent.offsetTop; parent = parent.offsetParent; } } return {'x' : x, 'y' : y}; }, getCoords : function(ev) { ev = ev || window.event; var el = this.getDocumentElement(); if (ev.pageX) return { x : ev.pageX, y : ev.pageY}; return { x : ev.clientX + el.scrollLeft - el.clientLeft, y : ev.clientY + el.scrollTop - el.clientTop }; }, setOpacity : function(el, opacity) { if (typeof el.style.opacity == "undefined") { el.style.filter = (opacity == 100) ? "" : "alpha(opacity=" + opacity + ")"; } else { el.style.opacity = (opacity == 100) ? "" : "0." + opacity.toString(); } }, getIframeDoc : function(iframe) { return iframe.contentDocument || iframe.contentWindow.document; }, rgbToHex : function(str) { function hex(s) { s = parseInt(s).toString(16); return s.length > 1 ? s : '0' + s; }; return str.replace(/rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)/ig, function($0, $1, $2, $3) { return '#' + hex($1) + hex($2) + hex($3); } ); }, getStyle : function(el, key) { var arr = key.split('-'); key = ""; for (var i = 0, len = arr.length; i < len; i++) { key += (i > 0) ? arr[i].charAt(0).toUpperCase() + arr[i].substr(1) : arr[i]; } var val = el.style[key]; if (!val) { var css = el.getAttribute("style"); if (css) { var re = new RegExp("(^|[^\w\-])" + key + "\s*:\s*([^;]+)", "ig"); var arr = re.exec(css); if (arr) val = arr[2]; } } return KE.util.rgbToHex(val); }, createRange : function(doc) { return doc.createRange ? doc.createRange() : doc.body.createTextRange(); }, getNodeType : function(node) { return (node.nodeType == 1 && KE.util.inArray(node.tagName.toLowerCase(), KE.setting.noEndTags)) ? 88 : node.nodeType; }, getNodeTextLength : function(node) { var type = KE.util.getNodeType(node); if (type == 1) { var html = node.innerHTML; return html.replace(/<.*?>/ig, "").length; } else if (type == 3) { return node.nodeValue.length; } }, getNodeStartRange : function(doc, node) { var range = KE.util.createRange(doc); var type = node.nodeType; if (type == 1) { range.moveToElementText(node); return range; } else if (type == 3) { var offset = 0; var sibling = node.previousSibling; while (sibling) { if (sibling.nodeType == 1) { var nodeRange = KE.util.createRange(doc); nodeRange.moveToElementText(sibling); range.setEndPoint('StartToEnd', nodeRange); range.moveStart('character', offset); return range; } else if (sibling.nodeType == 3) { offset += sibling.nodeValue.length; } sibling = sibling.previousSibling; } range.moveToElementText(node.parentNode); range.moveStart('character', offset); return range; } }, trimNodes : function(parent) { if (KE.util.getNodeType(parent) != 1) return; if (KE.util.inArray(parent.tagName.toLowerCase(), KE.setting.inlineTags) && KE.util.getNodeTextLength(parent) == 0) { parent.parentNode.removeChild(parent); return; } KE.eachNode(parent, function(node) { KE.util.trimNodes(node); return true; }); }, removeParent : function(parent) { if (parent.hasChildNodes) { var node = parent.firstChild; while (node != null) { var nextNode = node.nextSibling; parent.parentNode.insertBefore(node, parent); node = nextNode; } } parent.parentNode.removeChild(parent); }, drag : function(id, mousedownObj, moveObj, func, hideFlag) { var obj = KE.g[id]; mousedownObj.onmousedown = function(event) { if (hideFlag && obj.wyswygMode) obj.iframe.style.display = 'none'; if (KE.browser != 'IE') event.preventDefault(); var ev = event || window.event; var pos = KE.util.getCoords(ev); var objTop = parseInt(moveObj.style.top); var objLeft = parseInt(moveObj.style.left); var objWidth = parseInt(moveObj.style.width); var objHeight = parseInt(moveObj.style.height); var mouseTop = pos.y; var mouseLeft = pos.x; var dragFlag = true; var moveListener = function(event) { if (dragFlag) { var ev = event || window.event; var pos = KE.util.getCoords(ev); var top = pos.y - mouseTop; var left = pos.x - mouseLeft; func(objTop, objLeft, objWidth, objHeight, top, left); } return false; }; var upListener = function(event) { if (hideFlag && obj.wyswygMode) obj.iframe.style.display = ''; dragFlag = false; KE.event.remove(document, 'mousemove', moveListener); KE.event.remove(document, 'mouseup', upListener); }; KE.event.add(document, 'mousemove', moveListener); KE.event.add(document, 'mouseup', upListener); }; }, setDefaultPlugin : function(id) { var items = [ 'cut', 'copy', 'paste', 'selectall', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript','superscript', 'bold', 'italic', 'underline', 'strikethrough', 'unlink' ]; for (var i = 0; i < items.length; i++) { KE.plugin[items[i]] = { click : new Function('id', 'KE.util.execCommand(id, "' + items[i] + '", null);') }; } }, getFullHtml : function(id, tagLineMode) { var html = ''; html += ''; html += ''; html += 'KindEditor'; if (tagLineMode) { html += ''; } if (KE.g[id].cssPath) { html += ''; } html += ''; html += ''; html += ''; return html; }, resize : function(id, width, height, isCheck) { var obj = KE.g[id]; if (width.match(/%$/)) width = obj.container.offsetWidth + 'px'; if (height.match(/%$/)) height = obj.container.offsetHeight + 'px'; if (isCheck && (parseInt(width) <= obj.minWidth || parseInt(height) <= obj.minHeight)) return; obj.container.style.width = width; obj.container.style.height = height; var diff = parseInt(height) - obj.toolbarTable.offsetHeight - obj.bottom.offsetHeight; if (diff >= 0) { obj.textareaTable.style.height = diff + 'px'; obj.iframe.style.height = diff + 'px'; obj.newTextarea.style.height = diff + 'px'; } }, getData : function(id) { var data; if (KE.g[id].wyswygMode) { if (KE.g[id].filterMode) { data = KE.util.outputHtml(id, KE.g[id].iframeDoc.body); } else { data = KE.util.htmlToXhtml(id, KE.g[id].iframeDoc.body); } } else { data = KE.g[id].newTextarea.value; } return data; }, getSrcData : function(id) { var data; if (KE.g[id].wyswygMode) { data = KE.g[id].iframeDoc.body.innerHTML; } else { data = KE.g[id].newTextarea.value; } return data; }, getPureData : function(id) { var data = this.getSrcData(id); data = data.replace(//ig, "\r\n"); data = data.replace(/<.*?>/ig, ""); data = data.replace(/ /ig, ""); return data; }, setData : function(id) { var data = this.getData(id); KE.g[id].srcTextarea.value = data; }, setPureData : function(id) { var data = this.getPureData(id); KE.g[id].srcTextarea.value = data; }, focus : function(id) { if (KE.g[id].wyswygMode) { KE.g[id].iframeWin.focus(); } else { KE.g[id].newTextarea.focus(); } }, click : function(id, cmd) { KE.layout.hide(id); KE.util.focus(id); KE.plugin[cmd].click(id); }, selection : function(id) { var win = KE.g[id].iframeWin; var doc = KE.g[id].iframeDoc; KE.g[id].keSel = new KE.selection(win, doc); KE.g[id].keRange = KE.g[id].keSel.keRange; KE.g[id].sel = KE.g[id].keSel.sel; KE.g[id].range = KE.g[id].keSel.range; }, select : function(id) { if (KE.browser == 'IE') KE.g[id].range.select(); }, pToBr : function(id) { if(KE.browser == 'IE') { KE.event.add(KE.g[id].iframeDoc, 'keydown', function(e) { if (e.keyCode == 13) { KE.util.selection(id); if(KE.g[id].range.parentElement().tagName != 'LI') { KE.util.insertHtml(id, '
'); KE.util.select(id); return false; } } }); } }, execCommand : function(id, cmd, value) { try { KE.g[id].iframeDoc.execCommand(cmd, false, value); } catch(e) {} KE.toolbar.updateState(id); KE.history.add(id, false); }, insertHtml : function(id, html) { if (html == '') return; KE.util.select(id); if (KE.browser == 'IE') { if (KE.g[id].sel.type.toLowerCase() == 'control') { KE.g[id].range.item(0).outerHTML = html; } else { KE.g[id].range.pasteHTML(html); } KE.history.add(id, false); } else { this.execCommand(id, 'inserthtml', html); } }, removeDomain : function(id, tagName, key, url) { if ((tagName == 'a' && key == 'href') || (tagName == 'img' && key == 'src') || (tagName == 'embed' && key == 'src')) { var domains = KE.g[id].siteDomains; for (var i = 0, len = domains.length; i < len; i++) { var domain = "http://" + domains[i]; if (url.indexOf(domain) == 0) return url.substr(domain.length); } } return url; }, htmlToXhtml : function(id, element) { KE.util.trimNodes(element); var html = element.innerHTML; var tags = KE.setting.noEndTags; for (var i = 0, len = tags.length; i < len; i++) { html = html.replace(new RegExp("<(" + tags[i] + ")\\s+(.*?[^\\/])>", "gi"), "<$1 $2 />"); html = html.replace(new RegExp("<(" + tags[i] + ")>", "gi"), "<$1 />"); } html = html.replace(/<(\w+)(.*?)>/g, function($0, $1, $2) { var tagName = $1.toLowerCase(); var attr = $2; attr = attr.replace(/(\w+)=([^\s]+)/gi, function($0, $1, $2) { var key = $1.toLowerCase(); var val = $2; var first = $2.charAt(0); var last = $2.charAt($2.length - 1); if (first === '"' && last === '"') { val = '"' + KE.util.removeDomain(id, tagName, key, val.substr(1, val.length - 2)) + '"'; } else if (first !== '"' && last !== '"') { val = '"' + KE.util.removeDomain(id, tagName, key, val) + '"'; } return key + '=' + val; }); attr = attr.replace(/\s+style=".*?"/gi, function($0) { return KE.util.rgbToHex($0.toLowerCase()); }); return '<' + tagName + attr + '>'; }); html = html.replace(/(<\/\w+>)/g, function($0, $1) { return $1.toLowerCase(); }); return html; }, outputHtml : function(id, element) { var newHtmlTags = []; KE.each(KE.g[id].htmlTags, function(key, val) { var arr = key.split(','); for (var i = 0, len = arr.length; i < len; i++) { newHtmlTags[arr[i]] = val; } }); var htmlList = []; KE.util.trimNodes(element); var scanNodes = function(el) { var startTags = []; var setStartTag = function(tagName, attrStr, styleStr, isEnd) { var html = ''; html += '<' + tagName; if (attrStr) html += attrStr; if (styleStr) html += ' style="' + styleStr + '"'; html += isEnd ? ' />' : '>'; if (KE.browser == 'IE' && isEnd && KE.util.inArray(tagName, ['br', 'hr'])) html += "\n"; if (typeof newHtmlTags[tagName] == 'object') htmlList.push(html); if (!isEnd) startTags.push(tagName); }; var setEndTag = function() { if (startTags.length > 0) { var tagName = startTags.pop(); if (typeof newHtmlTags[tagName] != 'object') return; var html = ''; if (KE.browser == 'IE' && KE.util.inArray(tagName, ['p', 'div', 'table', 'ol', 'ul'])) html += "\n"; htmlList.push(html); } }; var nodes = el.childNodes; for (var i = 0, len = nodes.length; i < len; i++) { var node = nodes[i]; switch (node.nodeType) { case 1: var tagName = node.tagName.toLowerCase(); var attrStr = ''; var styleStr = ''; var isEnd = false; if (typeof newHtmlTags[tagName] == 'object') { var attrList = newHtmlTags[tagName]; for (var j = 0, l = attrList.length; j < l; j++) { var attr = attrList[j]; if (attr == '/') isEnd = true; else if (attr.charAt(0) == '.') { var key = attr.substr(1); var val = KE.util.getStyle(node, key); if (val) styleStr += key + ':' + val + ';'; } else { var val = node.getAttribute(attr); if (val !== null && val !== "") { val = KE.util.removeDomain(id, tagName, attr, val); attrStr += ' ' + attr + '="' + val + '"'; } } } } setStartTag(tagName, attrStr, styleStr, isEnd); if (node.hasChildNodes()) { scanNodes(node); } else { if (startTags.length > 0) { var prevHtml = htmlList[htmlList.length - 1]; if (typeof prevHtml != "undefined" && prevHtml.match(/^ 0) { var prevHtml = obj.undoStack[obj.undoStack.length - 1]; if (html == prevHtml) return; if (minChangeFlag && Math.abs(html.length - prevHtml.length) < obj.minChangeSize) return; } obj.undoStack.push(html); obj.redoStack = []; }, undo : function(id) { var obj = KE.g[id]; if (obj.undoStack.length == 0) return; var html = KE.util.getSrcData(id); obj.redoStack.push(html); var prevHtml = obj.undoStack.pop(); if (html == prevHtml && obj.undoStack.length > 0) { prevHtml = obj.undoStack.pop(); } obj.iframeDoc.body.innerHTML = prevHtml; obj.newTextarea.value = prevHtml; }, redo : function(id) { var obj = KE.g[id]; if (obj.redoStack.length == 0) return; var html = KE.util.getSrcData(id); obj.undoStack.push(html); var nextHtml = obj.redoStack.pop(); obj.iframeDoc.body.innerHTML = nextHtml; obj.newTextarea.value = nextHtml; } }; KE.remove = function(id, mode) { mode = (typeof mode == "undefined") ? 0 : mode; var container = KE.g[id].container; if (mode == 1) { document.body.removeChild(container); } else { var srcTextarea = KE.$(id); srcTextarea.parentNode.removeChild(container); } document.body.removeChild(KE.g[id].hideDiv); document.body.removeChild(KE.g[id].maskDiv); KE.g[id].containner = null; }; KE.create = function(id, mode) { if (KE.browser == 'IE') try { document.execCommand('BackgroundImageCache', false, true); }catch(e){} var srcTextarea = KE.$(id); mode = (typeof mode == "undefined") ? 0 : mode; if (mode == 0 && KE.g[id].container != null) return; var width = KE.g[id].width || srcTextarea.style.width; var height = KE.g[id].height || srcTextarea.style.height; var tableObj = KE.util.createTable(); var container = tableObj.table; container.className = 'ke-container'; container.style.width = width; container.style.height = height; var toolbarOuter = tableObj.cell; toolbarOuter.className = 'ke-toolbar-outer'; var textareaOuter = container.insertRow(1).insertCell(0); textareaOuter.className = 'ke-textarea-outer'; tableObj = KE.util.createTable(); var textareaTable = tableObj.table; textareaTable.className = 'ke-textarea-table'; var textareaCell = tableObj.cell; textareaOuter.appendChild(textareaTable); var bottomOuter = container.insertRow(2).insertCell(0); bottomOuter.className = 'ke-bottom-outer'; if (mode == 1) document.body.appendChild(container); else srcTextarea.parentNode.insertBefore(container, srcTextarea); var toolbarTable = KE.toolbar.create(id); toolbarOuter.appendChild(toolbarTable); var iframe = KE.$$('iframe'); iframe.className = 'ke-iframe'; iframe.setAttribute("frameBorder", "0"); var newTextarea = KE.$$('textarea'); newTextarea.className = 'ke-textarea'; newTextarea.style.display = 'none'; textareaCell.appendChild(iframe); textareaCell.appendChild(newTextarea); var bottom = KE.$$('table'); bottom.className = 'ke-bottom'; bottom.cellPadding = 0; bottom.cellSpacing = 0; bottom.border = 0; var row = bottom.insertRow(0); var bottomLeft = row.insertCell(0); bottomLeft.className = 'ke-bottom-left'; var bottomRight = row.insertCell(1); bottomRight.className = 'ke-bottom-right'; var span = KE.$$('span'); var url = KE.g[id].skinsPath + KE.g[id].skinType + '.gif'; span.style.backgroundImage = "url(" + url + ")"; span.className = 'ke-bottom-right-img'; bottomRight.appendChild(span); bottomOuter.appendChild(bottom); var hideDiv = KE.$$('div'); hideDiv.style.display = 'none'; var maskDiv = KE.$$('div'); maskDiv.className = 'ke-mask'; KE.util.setOpacity(maskDiv, 50); document.body.appendChild(hideDiv); document.body.appendChild(maskDiv); srcTextarea.style.display = "none"; KE.util.setDefaultPlugin(id); var iframeWin = iframe.contentWindow; var iframeDoc = KE.util.getIframeDoc(iframe); iframeDoc.designMode = "On"; var html = KE.util.getFullHtml(id, KE.g[id].tagLineMode); iframeDoc.open(); iframeDoc.write(html); iframeDoc.close(); if (!KE.g[id].wyswygMode) { newTextarea.value = srcTextarea.value; newTextarea.style.display = 'block'; iframe.style.display = 'none'; KE.toolbar.disable(id, ['source', 'preview', 'fullscreen']); KE.toolbar.select(id, 'source'); } if (KE.g[id].autoOnsubmitMode) { var form = srcTextarea.parentNode; while (form != null && form.tagName != 'FORM') { form = form.parentNode; } if (form != null && form.tagName == 'FORM') { KE.event.add(form, 'submit', new Function('KE.util.setData("' + id + '")')); } } KE.event.add(iframeDoc, 'click', new Function('KE.layout.hide("' + id + '")')); KE.event.add(iframeDoc, 'click', new Function('KE.toolbar.updateState("' + id + '")')); KE.event.input(iframeDoc, new Function('KE.history.add("' + id + '", true)')); KE.event.add(iframeDoc, 'keyup', new Function('KE.toolbar.updateState("' + id + '")')); KE.event.add(newTextarea, 'click', new Function('KE.layout.hide("' + id + '")')); KE.event.input(newTextarea, new Function('KE.history.add("' + id + '", true)')); KE.g[id].container = container; KE.g[id].toolbarTable = toolbarTable; KE.g[id].textareaTable = textareaTable; KE.g[id].iframe = iframe; KE.g[id].newTextarea = newTextarea; KE.g[id].srcTextarea = srcTextarea; KE.g[id].bottom = bottom; KE.g[id].hideDiv = hideDiv; KE.g[id].maskDiv = maskDiv; KE.g[id].iframeWin = iframeWin; KE.g[id].iframeDoc = iframeDoc; KE.g[id].width = width; KE.g[id].height = height; KE.util.resize(id, width, height); KE.util.drag(id, bottomRight, container, function(objTop, objLeft, objWidth, objHeight, top, left) { if (KE.g[id].resizeMode == 2) KE.util.resize(id, (objWidth + left) + 'px', (objHeight + top) + 'px', true); else if (KE.g[id].resizeMode == 1) KE.util.resize(id, objWidth + 'px', (objHeight + top) + 'px', true); }, true); KE.util.drag(id, bottomLeft, container, function(objTop, objLeft, objWidth, objHeight, top, left) { if (KE.g[id].resizeMode > 0) KE.util.resize(id, objWidth + 'px', (objHeight + top) + 'px', true); }, true); for (var i = 0, len = KE.g[id].items.length; i < len; i++) { var cmd = KE.g[id].items[i]; if (KE.plugin[cmd] && KE.plugin[cmd].init) KE.plugin[cmd].init(id); } setTimeout( function(){ if (srcTextarea.value !== "") iframeDoc.body.innerHTML = srcTextarea.value; KE.history.add(id, false); }, 1); }; KE.init = function(config) { config.wyswygMode = (typeof config.wyswygMode == "undefined") ? KE.setting.wyswygMode : config.wyswygMode; config.autoOnsubmitMode = (typeof config.autoOnsubmitMode == "undefined") ? KE.setting.autoOnsubmitMode : config.autoOnsubmitMode; config.resizeMode = (typeof config.resizeMode == "undefined") ? KE.setting.resizeMode : config.resizeMode; config.filterMode = (typeof config.filterMode == "undefined") ? KE.setting.filterMode : config.filterMode; config.tagLineMode = (typeof config.tagLineMode == "undefined") ? KE.setting.tagLineMode : config.tagLineMode; config.skinType = config.skinType || KE.setting.skinType; config.cssPath = config.cssPath || KE.setting.cssPath; config.skinsPath = config.skinsPath || KE.setting.skinsPath; config.pluginsPath = config.pluginsPath || KE.setting.pluginsPath; config.minWidth = config.minWidth || KE.setting.minWidth; config.minHeight = config.minHeight || KE.setting.minHeight; config.minChangeSize = config.minChangeSize || KE.setting.minChangeSize; config.siteDomains = config.siteDomains || KE.setting.siteDomains; config.defaultItems = KE.setting.items; config.items = config.items || KE.setting.items; config.htmlTags = config.htmlTags || KE.setting.htmlTags; KE.g[config.id] = config; KE.g[config.id].undoStack = []; KE.g[config.id].redoStack = []; KE.util.loadStyle(config.skinsPath + config.skinType + '.css'); } KE.show = function(config) { KE.init(config); KE.event.add(window, 'load', new Function('KE.create("' + config.id + '")')); }; KE.plugin['about'] = { click : function(id) { var dialog = new KE.dialog({ id : id, cmd : 'about', width : 300, height : 80, title : KE.lang['about'], noButton : KE.lang['close'] }); dialog.show(); } }; KE.plugin['undo'] = { init : function(id) { KE.event.ctrl(KE.g[id].iframeDoc, 'Z', function(e) { KE.plugin['undo'].click(id); KE.util.focus(id); }); }, click : function(id) { KE.history.undo(id); } }; KE.plugin['redo'] = { init : function(id) { KE.event.ctrl(KE.g[id].iframeDoc, 'Y', function(e) { KE.plugin['redo'].click(id); KE.util.focus(id); }); }, click : function(id) { KE.history.redo(id); } }; KE.plugin['plainpaste'] = { click : function(id) { KE.util.selection(id); var dialog = new KE.dialog({ id : id, cmd : 'plainpaste', width : 330, height : 300, title : KE.lang['plainpaste'], yesButton : KE.lang['yes'], noButton : KE.lang['no'] }); dialog.show(); }, exec : function(id) { KE.util.select(id); var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var html = KE.$('textArea', dialogDoc).value; html = KE.util.escape(html); var re = new RegExp("\r\n|\n|\r", "g"); html = html.replace(re, "
$&"); KE.util.insertHtml(id, html); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['wordpaste'] = { click : function(id) { KE.util.selection(id); var dialog = new KE.dialog({ id : id, cmd : 'wordpaste', width : 330, height : 300, title : KE.lang['wordpaste'], yesButton : KE.lang['yes'], noButton : KE.lang['no'] }); dialog.show(); }, exec : function(id) { KE.util.select(id); var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var wordIframe = KE.$('wordIframe', dialogDoc); var wordDoc = KE.util.getIframeDoc(wordIframe); KE.util.insertHtml(id, KE.util.outputHtml(id, wordDoc.body)); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['fullscreen'] = { resetFull : function(id) { var el = KE.util.getDocumentElement(); var width = el.clientWidth; var height = el.clientHeight; var left,top; if (KE.browser == 'IE' || KE.browser == 'OPERA') { left = document.body.parentNode.scrollLeft; top = document.body.parentNode.scrollTop; } else { left = window.scrollX; top = window.scrollY; } var div = KE.g[id].container; div.style.left = left + 'px'; div.style.top = top + 'px'; div.style.zIndex = 19811211; KE.util.resize(id, width + 'px', height + 'px'); }, click : function(id) { var obj = KE.g[id]; var self = this; var resizeListener = function(e) { if (self.isSelected) { KE.plugin["fullscreen"].resetFull(id); } } if (this.isSelected) { this.isSelected = false; KE.util.setData(id); KE.remove(id, 1); KE.create(id, 2); document.body.parentNode.style.overflow = 'auto'; KE.util.resize(id, this.width, this.height); KE.event.remove(window, 'resize', resizeListener); KE.toolbar.unselect(id, "fullscreen"); } else { this.isSelected = true; KE.util.setData(id); this.width = KE.g[id].container.style.width; this.height = KE.g[id].container.style.height; KE.remove(id, 2); KE.create(id, 1); document.body.parentNode.style.overflow = 'hidden'; var div = KE.g[id].container; div.style.position = 'absolute'; this.resetFull(id); KE.event.add(window, 'resize', resizeListener); KE.toolbar.select(id, "fullscreen"); } } }; KE.plugin['bgcolor'] = { click : function(id) { KE.util.selection(id); var menu = new KE.menu({ id : id, cmd : 'bgcolor' }); menu.picker(); }, exec : function(id, value) { var cmd = new KE.cmd(id); cmd.wrap('span', [{'.background-color': value}]); KE.history.add(id, false); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['date'] = { click : function(id) { var date = new Date(); var year = date.getFullYear().toString(10); var month = (date.getMonth() + 1).toString(10); month = month.length < 2 ? '0' + month : month; var day = date.getDate().toString(10); day = day.length < 2 ? '0' + day : day; var value = year + '-' + month + '-' + day; KE.util.selection(id); KE.util.insertHtml(id, value); } }; KE.plugin['fontname'] = { click : function(id) { var fontName = { 'SimSun' : '宋体', 'SimHei' : '黑体', 'FangSong_GB2312' : '仿宋体', 'KaiTi_GB2312' : '楷体', 'NSimSun' : '新宋体', 'Arial' : 'Arial', 'Arial Black' : 'Arial Black', 'Times New Roman' : 'Times New Roman', 'Courier New' : 'Courier New', 'Tahoma' : 'Tahoma', 'Verdana' : 'Verdana' }; var cmd = 'fontname'; KE.util.selection(id); var menu = new KE.menu({ id : id, cmd : cmd, width : '160px' }); KE.each(fontName, function(key, value) { var html = '' + value + ''; menu.add(html, new Function('KE.plugin["' + cmd + '"].exec("' + id + '", "' + key + '")')); }); menu.show(); }, exec : function(id, value) { var cmd = new KE.cmd(id); cmd.wrap('span', [{'.font-family': value}]); KE.history.add(id, false); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['fontsize'] = { click : function(id) { var fontSize = ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px']; var cmd = 'fontsize'; KE.util.selection(id); var menu = new KE.menu({ id : id, cmd : cmd, width : '100px' }); for (var i = 0, len = fontSize.length; i < len; i++) { var value = fontSize[i]; var html = '' + value + ''; menu.add(html, new Function('KE.plugin["' + cmd + '"].exec("' + id + '", "' + value + '")')); } menu.show(); }, exec : function(id, value) { var cmd = new KE.cmd(id); cmd.wrap('span', [{'.font-size': value}]); KE.history.add(id, false); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['hr'] = { click : function(id) { KE.util.selection(id); KE.util.insertHtml(id, '
'); KE.util.focus(id); } }; KE.plugin['preview'] = { click : function(id) { var dialog = new KE.dialog({ id : id, cmd : 'preview', html : KE.util.getData(id), width : 600, height : 400, useFrameCSS : true, title : KE.lang['preview'], noButton : KE.lang['close'] }); dialog.show(); } }; KE.plugin['print'] = { click : function(id) { KE.util.selection(id); KE.g[id].iframeWin.print(); } }; KE.plugin['removeformat'] = { click : function(id) { KE.util.selection(id); var cmd = new KE.cmd(id); cmd.remove(KE.setting.inlineTags, ['class', 'style']); KE.history.add(id, false); KE.toolbar.updateState(id); KE.util.focus(id); } }; KE.plugin['source'] = { click : function(id) { var obj = KE.g[id]; if (!obj.wyswygMode) { obj.iframeDoc.body.innerHTML = obj.newTextarea.value; obj.iframe.style.display = 'block'; obj.newTextarea.style.display = 'none'; KE.toolbar.able(id, ['source', 'preview', 'fullscreen']); obj.wyswygMode = true; this.isSelected = false; KE.toolbar.unselect(id, "source"); } else { KE.layout.hide(id); if (KE.g[id].filterMode) { obj.newTextarea.value = KE.util.outputHtml(id, obj.iframeDoc.body); } else { obj.newTextarea.value = KE.util.htmlToXhtml(id, obj.iframeDoc.body); } obj.iframe.style.display = 'none'; obj.newTextarea.style.display = 'block'; KE.toolbar.disable(id, ['source', 'preview', 'fullscreen']); obj.wyswygMode = false; this.isSelected = true; KE.toolbar.select(id, "source"); } KE.util.focus(id); } }; KE.plugin['textcolor'] = { click : function(id) { KE.util.selection(id); var menu = new KE.menu({ id : id, cmd : 'textcolor' }); menu.picker(); }, exec : function(id, value) { var cmd = new KE.cmd(id); cmd.wrap('span', [{'.color': value}]); KE.history.add(id, false); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['time'] = { click : function(id) { var date = new Date(); var hour = date.getHours().toString(10); hour = hour.length < 2 ? '0' + hour : hour; var minute = date.getMinutes().toString(10); minute = minute.length < 2 ? '0' + minute : minute; var second = date.getSeconds().toString(10); second = second.length < 2 ? '0' + second : second; var value = hour + ':' + minute + ':' + second; KE.util.selection(id); KE.util.insertHtml(id, value); } }; KE.plugin['title'] = { click : function(id) { var title = { 'H1' : '标题 1', 'H2' : '标题 2', 'H3' : '标题 3', 'H4' : '标题 4', 'H5' : '标题 5', 'H6' : '标题 6' }; var cmd = 'title'; KE.util.selection(id); var menu = new KE.menu({ id : id, cmd : cmd, width : '120px' }); KE.each(title, function(key, value) { var html = '<' + key + ' style="margin:0px;">' + value + ''; menu.add(html, new Function('KE.plugin["' + cmd + '"].exec("' + id + '", "<' + key + '>")')); }); menu.show(); }, exec : function(id, value) { KE.util.select(id); KE.util.execCommand(id, 'formatblock', value); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['emoticons'] = { icon : 'emoticons.gif', click : function(id) { var emoticonTable = [ ['etc_01.gif','etc_02.gif','etc_03.gif','etc_04.gif','etc_05.gif','etc_06.gif'], ['etc_07.gif','etc_08.gif','etc_09.gif','etc_10.gif','etc_11.gif','etc_12.gif'], ['etc_13.gif','etc_14.gif','etc_15.gif','etc_16.gif','etc_17.gif','etc_18.gif'], ['etc_19.gif','etc_20.gif','etc_21.gif','etc_22.gif','etc_23.gif','etc_24.gif'], ['etc_25.gif','etc_26.gif','etc_27.gif','etc_28.gif','etc_29.gif','etc_30.gif'], ['etc_31.gif','etc_32.gif','etc_33.gif','etc_34.gif','etc_35.gif','etc_36.gif'] ]; var cmd = 'emoticons'; KE.util.selection(id); var table = KE.$$('table'); table.cellPadding = 0; table.cellSpacing = 2; table.border = 0; table.style.margin = 0; table.style.padding = 0; table.style.borderCollapse = 'separate'; for (var i = 0; i < emoticonTable.length; i++) { var row = table.insertRow(i); for (var j = 0; j < emoticonTable[i].length; j++) { var cell = row.insertCell(j); cell.style.margin = 0; cell.style.padding = '1px'; cell.style.border = '1px solid #F0F0EE'; cell.style.cursor = 'pointer'; cell.onmouseover = function() {this.style.borderColor = '#000000'; } cell.onmouseout = function() {this.style.borderColor = '#F0F0EE'; } cell.onclick = new Function('KE.plugin["' + cmd + '"].exec("' + id + '", "' + emoticonTable[i][j] + '")'); var img = KE.$$('img'); img.src = KE.g[id].pluginsPath + 'emoticons/' + emoticonTable[i][j]; cell.appendChild(img); } } var menu = new KE.menu({ id : id, cmd : cmd }); menu.append(table); menu.show(); }, exec : function(id, value) { KE.util.select(id); var html = ''; KE.util.insertHtml(id, html); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['flash'] = { click : function(id) { KE.util.selection(id); var dialog = new KE.dialog({ id : id, cmd : 'flash', width : 280, height : 250, title : "Flash", previewButton : KE.lang['preview'], yesButton : KE.lang['yes'], noButton : KE.lang['no'] }); dialog.show(); }, check : function(id, url) { if (url.match(/\w+:\/\/.{3,}/) == null) { alert(KE.lang['invalidUrl']); window.focus(); KE.g[id].yesButton.focus(); return false; } return true; }, preview : function(id) { var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var url = KE.$('url', dialogDoc).value; if (!this.check(id, url)) return false; var embed = KE.$$('embed', dialogDoc); embed.src = url; embed.type = "application/x-shockwave-flash"; embed.quality = "high"; embed.width = 190; embed.height = 190; KE.$('previewDiv', dialogDoc).innerHTML = ""; KE.$('previewDiv', dialogDoc).appendChild(embed); }, exec : function(id) { KE.util.select(id); var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var url = KE.$('url', dialogDoc).value; if (!this.check(id, url)) return false; var html = ''; KE.util.insertHtml(id, html); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['image'] = { click : function(id) { KE.util.selection(id); var dialog = new KE.dialog({ id : id, cmd : 'image', width : 310, height : 90, title : KE.lang['image'], yesButton : KE.lang['yes'], noButton : KE.lang['no'] }); dialog.show(); }, check : function(id) { var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var type = KE.$('type', dialogDoc).value; var url = ''; if (type == 1) { url = KE.$('imgFile', dialogDoc).value; } else { url = KE.$('url', dialogDoc).value; } var width = KE.$('imgWidth', dialogDoc).value; var height = KE.$('imgHeight', dialogDoc).value; var border = KE.$('imgBorder', dialogDoc).value; if (!url.match(/\.(jpg|jpeg|gif|bmp|png)(\s|$)/i)) { alert(KE.lang['invalidImg']); window.focus(); KE.g[id].yesButton.focus(); return false; } if (width.match(/^\d+$/) == null) { alert(KE.lang['invalidWidth']); window.focus(); KE.g[id].yesButton.focus(); return false; } if (height.match(/^\d+$/) == null) { alert(KE.lang['invalidHeight']); window.focus(); KE.g[id].yesButton.focus(); return false; } if (border.match(/^\d+$/) == null) { alert(KE.lang['invalidBorder']); window.focus(); KE.g[id].yesButton.focus(); return false; } return true; }, exec : function(id) { KE.util.select(id); var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var type = KE.$('type', dialogDoc).value; if (!this.check(id)) return false; if (type == 1) { KE.$('editorId', dialogDoc).value = id; dialogDoc.uploadForm.submit(); return false; } else { var url = KE.$('url', dialogDoc).value; var title = KE.$('imgTitle', dialogDoc).value; var width = KE.$('imgWidth', dialogDoc).value; var height = KE.$('imgHeight', dialogDoc).value; var border = KE.$('imgBorder', dialogDoc).value; this.insert(id, url, title, width, height, border); } }, insert : function(id, url, title, width, height, border) { var html = ' 0) html += 'width="' + width + '" '; if (height > 0) html += 'height="' + height + '" '; if (title) html += 'title="' + title + '" '; html += 'alt="' + title + '" '; html += 'border="' + border + '" />'; KE.util.insertHtml(id, html); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['layer'] = { click : function(id) { var cmd = 'layer'; var styles = [ 'margin:5px;border:1px solid #000000;', 'margin:5px;border:2px solid #000000;', 'margin:5px;border:1px dashed #000000;', 'margin:5px;border:2px dashed #000000;', 'margin:5px;border:1px dotted #000000;', 'margin:5px;border:2px dotted #000000;' ]; KE.util.selection(id); var menu = new KE.menu({ id : id, cmd : cmd, width : '150px' }); for (var i = 0; i < styles.length; i++) { var html = '
'; menu.add(html, new Function('KE.plugin["' + cmd + '"].exec("' + id + '", "padding:5px;' + styles[i] + '")')); } menu.show(); }, exec : function(id, value) { KE.util.select(id); var html = '
' + KE.lang['pleaseInput'] + '
'; KE.util.insertHtml(id, html); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['link'] = { click : function(id) { KE.util.selection(id); var dialog = new KE.dialog({ id : id, cmd : 'link', width : 310, height : 70, title : KE.lang['link'], yesButton : KE.lang['yes'], noButton : KE.lang['no'] }); dialog.show(); }, exec : function(id) { KE.util.select(id); var iframeDoc = KE.g[id].iframeDoc; var range = KE.g[id].range; var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var url = KE.$('hyperLink', dialogDoc).value; var target = KE.$('linkType', dialogDoc).value; if (url.match(/\w+:\/\/.{3,}/) == null) { alert(KE.lang['invalidUrl']); window.focus(); KE.g[id].yesButton.focus(); return false; } var node; if (KE.browser == 'IE') { node = range.item ? range.item(0).parentNode : iframeDoc.body; } else { node = (range.startContainer == range.endContainer) ? range.startContainer.parentNode : iframeDoc.body; } if (node && node.tagName == 'A') node = node.parentNode; if (!node) node = iframeDoc.body; iframeDoc.execCommand("createlink", false, "__ke_temp_url__"); var arr = node.getElementsByTagName('a'); for (var i = 0, l = arr.length; i < l; i++) { if (arr[i].href.match(/\/?__ke_temp_url__$/) != null) { arr[i].href = url; if (target) arr[i].target = target; } } KE.history.add(id); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['media'] = { click : function(id) { KE.util.selection(id); var dialog = new KE.dialog({ id : id, cmd : 'media', width : 280, height : 250, title : KE.lang['media'], previewButton : KE.lang['preview'], yesButton : KE.lang['yes'], noButton : KE.lang['no'] }); dialog.show(); }, check : function(id, url) { if (!url.match(/^\w+:\/\/.{3,}\.(mp3|wav|wma|wmv|mid|avi|mpg|mpeg|asf|rm|rmvb)(\?|$)/i)) { alert(KE.lang['invalidMedia']); window.focus(); KE.g[id].yesButton.focus(); return false; } return true; }, preview : function(id) { var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var url = KE.$('url', dialogDoc).value; if (!this.check(id, url)) return false; var embed = KE.$$('embed', dialogDoc); embed.src = url; if (url.match(/\.(rm|rmvb)$/i) == null) { embed.type = "video/x-ms-asf-plugin"; } else { embed.type = "audio/x-pn-realaudio-plugin"; } embed.loop = "true"; embed.autostart = "true"; embed.width = 260; embed.height = 190; KE.$('previewDiv', dialogDoc).innerHTML = ""; KE.$('previewDiv', dialogDoc).appendChild(embed); }, exec : function(id) { KE.util.select(id); var dialogDoc = KE.util.getIframeDoc(KE.g[id].dialog); var url = KE.$('url', dialogDoc).value; if (!this.check(id, url)) return false; var html; if (url.match(/\.(rm|rmvb)$/i) == null) { html = ''; } else { html = ''; } KE.util.insertHtml(id, html); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['specialchar'] = { click : function(id) { var charTable = [ ['§','№','☆','★','○','●','◎','◇','◆','□'], ['℃','‰','■','△','▲','※','→','←','↑','↓'], ['〓','¤','°','#','&','@','\','︿','_',' ̄'], ['―','α','β','γ','δ','ε','ζ','η','θ','ι'], ['κ','λ','μ','ν','ξ','ο','π','ρ','σ','τ'], ['υ','φ','χ','ψ','ω','≈','≡','≠','=','≤'], ['≥','<','>','≮','≯','∷','±','+','-','×'], ['÷','/','∫','∮','∝','∞','∧','∨','∑','∏'], ['∪','∩','∈','∵','∴','⊥','∥','∠','⌒','⊙'], ['≌','∽','〖','〗','【','】','(',')','[',']'] ]; var cmd = 'specialchar'; KE.util.selection(id); var table = KE.$$('table'); table.cellPadding = 0; table.cellSpacing = 2; table.border = 0; table.style.margin = 0; table.style.padding = 0; table.style.borderCollapse = 'separate'; for (var i = 0; i < charTable.length; i++) { var row = table.insertRow(i); for (var j = 0; j < charTable[i].length; j++) { var cell = row.insertCell(j); cell.style.padding = '1px'; cell.style.margin = 0; cell.style.border = '1px solid #AAAAAA'; cell.style.fontSize = '12px'; cell.style.cursor = 'pointer'; cell.onmouseover = function() {this.style.borderColor = '#000000'; } cell.onmouseout = function() {this.style.borderColor = '#AAAAAA'; } cell.onclick = new Function('KE.plugin["' + cmd + '"].exec("' + id + '", "' + charTable[i][j] + '")'); cell.innerHTML = charTable[i][j]; } } var menu = new KE.menu({ id : id, cmd : cmd }); menu.append(table); menu.show(); }, exec : function(id, value) { KE.util.select(id); KE.util.insertHtml(id, value); KE.layout.hide(id); KE.util.focus(id); } }; KE.plugin['table'] = { selected : function(id, i, j) { var text = i.toString(10) + ' by ' + j.toString(10) + ' Table'; KE.$('tableLocation' + id).innerHTML = text; var num = 10; for (var m = 1; m <= num; m++) { for (var n = 1; n <= num; n++) { var td = KE.$('tableTd' + id + m.toString(10) + '_' + n.toString(10) + ''); if (m <= i && n <= j) { td.style.backgroundColor = '#CCCCCC'; } else { td.style.backgroundColor = '#FFFFFF'; } } } }, click : function(id) { var cmd = 'table'; KE.util.selection(id); var num = 10; var html = ''; for (var i = 1; i <= num; i++) { html += ''; for (var j = 1; j <= num; j++) { var value = i.toString(10) + ',' + j.toString(10); html += ''; } html += ''; } html += ''; html += '
 
'; var menu = new KE.menu({ id : id, cmd : cmd }); menu.insert(html); menu.show(); }, exec : function(id, value) { KE.util.select(id); var location = value.split(','); var html = ''; for (var i = 0; i < location[0]; i++) { html += ''; for (var j = 0; j < location[1]; j++) { html += ''; } html += ''; } html += '
 
'; KE.util.insertHtml(id, html); KE.layout.hide(id); KE.util.focus(id); } };