diff --git a/.idea/misc.xml b/.idea/misc.xml
index 67e1e61..d5cd614 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -8,5 +8,5 @@
-
+
\ No newline at end of file
diff --git a/blxc-admin/src/main/java/com/ruoyi/portal/back/controller/UeditorController.java b/blxc-admin/src/main/java/com/ruoyi/portal/back/controller/UeditorController.java
new file mode 100644
index 0000000..732e5cf
--- /dev/null
+++ b/blxc-admin/src/main/java/com/ruoyi/portal/back/controller/UeditorController.java
@@ -0,0 +1,100 @@
+package com.ruoyi.portal.back.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baidu.ueditor.ActionEnter;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.ResourceUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+public class UeditorController {
+
+ //配置ueditor后端上传接口的验证
+ @RequestMapping("/config")
+ public String config(HttpServletRequest request, HttpServletResponse response, String action, MultipartFile[] upfile) throws IOException {
+ if (action.equals("config")) {
+ request.setCharacterEncoding("utf-8");
+ response.setHeader("Content-Type", "text/html");
+
+ //InputStream ioFile = ClassLoader.getSystemResourceAsStream("/config/config.json");
+ ClassPathResource classPathResource = new ClassPathResource("config\\config.json");
+ InputStream ioFile = classPathResource.getInputStream();
+ //File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "config" + File.separator + "config.json");
+ //FileInputStream fileInputStream = new FileInputStream(file);
+ byte[] jsonByte = IOUtils.toByteArray(ioFile);
+ PrintWriter printWriter = response.getWriter();
+ String jsonStr = new String(jsonByte, StandardCharsets.UTF_8);
+ //Object o = JSON.parse(jsonStr);
+ //printWriter.
+ printWriter.write(jsonStr);
+
+
+
+
+// String path2 = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "config";
+//
+// String path = file.getPath();
+// System.out.println("path = " + path + "-" + path2);
+// PrintWriter printWriter = response.getWriter();
+// printWriter.write(new ActionEnter(request, path).exec());
+ //printWriter.flush();
+ //printWriter.close();
+ } else if (action.equals("uploadimage")) {
+ Map result = new HashMap();
+ for (MultipartFile multipartFile : upfile) {
+ String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile);
+ System.out.println("upload = " + upload);
+ System.out.println("upload.substring(upload.lastIndexOf(\"/\")) = " + upload.substring(upload.lastIndexOf("/")));
+ result.put("title", upload.substring(upload.lastIndexOf("/")+1));
+ result.put("original", multipartFile.getOriginalFilename());
+ result.put("state", "SUCCESS");
+ result.put("url", upload);
+ String jStr = JSON.toJSONString(result);
+ return jStr;
+ }
+ return null;
+ }else if(action.equals("uploadvideo")){
+ Map result = new HashMap();
+ for (MultipartFile multipartFile : upfile) {
+ String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile);
+ System.out.println("upload = " + upload);
+ System.out.println("upload.substring(upload.lastIndexOf(\"/\")) = " + upload.substring(upload.lastIndexOf("/")));
+ result.put("title", upload.substring(upload.lastIndexOf("/")+1));
+ result.put("original", multipartFile.getOriginalFilename());
+ result.put("state", "SUCCESS");
+ result.put("url", upload);
+ String jStr = JSON.toJSONString(result);
+ return jStr;
+ }
+ }else{
+ Map result = new HashMap();
+ for (MultipartFile multipartFile : upfile) {
+ String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile);
+ System.out.println("upload = " + upload);
+ System.out.println("upload.substring(upload.lastIndexOf(\"/\")) = " + upload.substring(upload.lastIndexOf("/")));
+ result.put("title", upload.substring(upload.lastIndexOf("/")+1));
+ result.put("original", multipartFile.getOriginalFilename());
+ result.put("state", "SUCCESS");
+ result.put("url", upload);
+ String jStr = JSON.toJSONString(result);
+ return jStr;
+ }
+ }
+ return null;
+ }
+}
diff --git a/blxc-admin/src/main/resources/config/config.json b/blxc-admin/src/main/resources/config/config.json
new file mode 100644
index 0000000..4c30b65
--- /dev/null
+++ b/blxc-admin/src/main/resources/config/config.json
@@ -0,0 +1,70 @@
+/* 前后端通信相关的配置,注释只允许使用多行方式 */
+{
+ /* 上传图片配置项 */
+ "imageActionName": "uploadimage", /* 执行上传图片的action名称 */
+ "imageFieldName": "upfile", /* 提交的图片表单名称 */
+ "imageMaxSize": 20480000, /* 上传大小限制,单位B */
+ "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
+ "imageCompressEnable": true, /* 是否压缩图片,默认是true */
+ "imageCompressBorder": 1600, /* 图片压缩最长边限制 */
+ "imageInsertAlign": "none", /* 插入的图片浮动方式 */
+ "imageUrlPrefix": "https://iceae.jlau.edu.cn/", /* 图片访问路径前缀 */
+ "imagePathFormat": "image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+ /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */
+ /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */
+ /* {time} 会替换成时间戳 */ /* {yyyy} 会替换成四位年份 */
+ /* {yy} 会替换成两位年份 */
+ /* {mm} 会替换成两位月份 */
+ /* {dd} 会替换成两位日期 */
+ /* {hh} 会替换成两位小时 */
+ /* {ii} 会替换成两位分钟 */
+ /* {ss} 会替换成两位秒 */
+ /* 非法字符 \ : * ? " < > | */
+ /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */
+ /* 涂鸦图片上传配置项 */
+ "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */
+ "scrawlFieldName": "upfile", /* 提交的图片表单名称 */
+ "scrawlPathFormat": "image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+ "scrawlMaxSize": 20480000, /* 上传大小限制,单位B */
+ "scrawlUrlPrefix": "", /* 图片访问路径前缀 */
+ "scrawlInsertAlign": "none", /* 截图工具上传 */
+ "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */
+ "snapscreenPathFormat": "image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+ "snapscreenUrlPrefix": "https://iceae.jlau.edu.cn/", /* 图片访问路径前缀 */
+ "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */
+ /* 抓取远程图片配置 */
+ "catcherLocalDomain": ["127.0.0.1", "192.168.2.19", "img.baidu.com"],
+ "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */
+ "catcherFieldName": "source", /* 提交的图片列表表单名称 */
+ "catcherPathFormat": "image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+ "catcherUrlPrefix": "https://iceae.jlau.edu.cn/", /* 图片访问路径前缀 */
+ "catcherMaxSize": 20480000, /* 上传大小限制,单位B */
+ "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
+ /* 上传视频配置 */
+ "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */
+ "videoFieldName": "upfile", /* 提交的视频表单名称 */
+ "videoPathFormat": "video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+ "videoUrlPrefix": "https://iceae.jlau.edu.cn/", /* 视频访问路径前缀 */
+ "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */
+ "videoAllowFiles": [ ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */
+ /* 上传文件配置 */
+ "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */
+ "fileFieldName": "upfile", /* 提交的文件表单名称 */
+ "filePathFormat": "file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+ "fileUrlPrefix": "https://iceae.jlau.edu.cn/", /* 文件访问路径前缀 */
+ "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */
+ "fileAllowFiles": [ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" ], /* 上传文件格式显示 */
+ /* 列出指定目录下的图片 */
+ "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */
+ "imageManagerListPath": "image/", /* 指定要列出图片的目录 */
+ "imageManagerListSize": 20, /* 每次列出文件数量 */
+ "imageManagerUrlPrefix": "https://iceae.jlau.edu.cn/", /* 图片访问路径前缀 */
+ "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */
+ "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
+ /* 列出指定目录下的文件 */
+ "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */
+ "fileManagerListPath": "file/", /* 指定要列出文件的目录 */
+ "fileManagerUrlPrefix": "https://iceae.jlau.edu.cn/", /* 文件访问路径前缀 */
+ "fileManagerListSize": 20, /* 每次列出文件数量 */
+ "fileManagerAllowFiles": [ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" ] /* 列出的文件类型 */
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/anchor/anchor.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/anchor/anchor.html
new file mode 100644
index 0000000..1e10567
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/anchor/anchor.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.css
new file mode 100644
index 0000000..cbfc872
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.css
@@ -0,0 +1,716 @@
+@charset "utf-8";
+/* dialog样式 */
+.wrapper {
+ zoom: 1;
+ width: 630px;
+ *width: 626px;
+ height: 380px;
+ margin: 0 auto;
+ padding: 10px;
+ position: relative;
+ font-family: sans-serif;
+}
+
+/*tab样式框大小*/
+.tabhead {
+ float: left;
+}
+
+.tabbody {
+ width: 100%;
+ height: 346px;
+ position: relative;
+ clear: both;
+}
+
+.tabbody .panel {
+ position: absolute;
+ width: 0;
+ height: 0;
+ background: #fff;
+ overflow: hidden;
+ display: none;
+}
+
+.tabbody .panel.focus {
+ width: 100%;
+ height: 346px;
+ display: block;
+}
+
+/* 上传附件 */
+.tabbody #upload.panel {
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+ background: #fff;
+ display: block;
+}
+
+.tabbody #upload.panel.focus {
+ width: 100%;
+ height: 346px;
+ display: block;
+ clip: auto;
+}
+
+#upload .queueList {
+ margin: 0;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ overflow: hidden;
+}
+
+#upload p {
+ margin: 0;
+}
+
+.element-invisible {
+ width: 0 !important;
+ height: 0 !important;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+}
+
+#upload .placeholder {
+ margin: 10px;
+ border: 2px dashed #e6e6e6;
+ *border: 0px dashed #e6e6e6;
+ height: 172px;
+ padding-top: 150px;
+ text-align: center;
+ background: url(./images/image.png) center 70px no-repeat;
+ color: #cccccc;
+ font-size: 18px;
+ position: relative;
+ top: 0;
+ *top: 10px;
+}
+
+#upload .placeholder .webuploader-pick {
+ font-size: 18px;
+ background: #00b7ee;
+ border-radius: 3px;
+ line-height: 44px;
+ padding: 0 30px;
+ *width: 120px;
+ color: #fff;
+ display: inline-block;
+ margin: 0 auto 20px auto;
+ cursor: pointer;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+
+#upload .placeholder .webuploader-pick-hover {
+ background: #00a2d4;
+}
+
+
+#filePickerContainer {
+ text-align: center;
+}
+
+#upload .placeholder .flashTip {
+ color: #666666;
+ font-size: 12px;
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ bottom: 20px;
+}
+
+#upload .placeholder .flashTip a {
+ color: #0785d1;
+ text-decoration: none;
+}
+
+#upload .placeholder .flashTip a:hover {
+ text-decoration: underline;
+}
+
+#upload .placeholder.webuploader-dnd-over {
+ border-color: #999999;
+}
+
+#upload .filelist {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ position: relative;
+ height: 300px;
+}
+
+#upload .filelist:after {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ clear: both;
+}
+
+#upload .filelist li {
+ width: 113px;
+ height: 113px;
+ background: url(./images/bg.png);
+ text-align: center;
+ margin: 9px 0 0 9px;
+ *margin: 6px 0 0 6px;
+ position: relative;
+ display: block;
+ float: left;
+ overflow: hidden;
+ font-size: 12px;
+}
+
+#upload .filelist li p.log {
+ position: relative;
+ top: -45px;
+}
+
+#upload .filelist li p.title {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ top: 5px;
+ text-indent: 5px;
+ text-align: left;
+}
+
+#upload .filelist li p.progress {
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+ height: 8px;
+ overflow: hidden;
+ z-index: 50;
+ margin: 0;
+ border-radius: 0;
+ background: none;
+ -webkit-box-shadow: 0 0 0;
+}
+
+#upload .filelist li p.progress span {
+ display: none;
+ overflow: hidden;
+ width: 0;
+ height: 100%;
+ background: #1483d8 url(./images/progress.png) repeat-x;
+
+ -webit-transition: width 200ms linear;
+ -moz-transition: width 200ms linear;
+ -o-transition: width 200ms linear;
+ -ms-transition: width 200ms linear;
+ transition: width 200ms linear;
+
+ -webkit-animation: progressmove 2s linear infinite;
+ -moz-animation: progressmove 2s linear infinite;
+ -o-animation: progressmove 2s linear infinite;
+ -ms-animation: progressmove 2s linear infinite;
+ animation: progressmove 2s linear infinite;
+
+ -webkit-transform: translateZ(0);
+}
+
+@-webkit-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@-moz-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+#upload .filelist li p.imgWrap {
+ position: relative;
+ z-index: 2;
+ line-height: 113px;
+ vertical-align: middle;
+ overflow: hidden;
+ width: 113px;
+ height: 113px;
+
+ -webkit-transform-origin: 50% 50%;
+ -moz-transform-origin: 50% 50%;
+ -o-transform-origin: 50% 50%;
+ -ms-transform-origin: 50% 50%;
+ transform-origin: 50% 50%;
+
+ -webit-transition: 200ms ease-out;
+ -moz-transition: 200ms ease-out;
+ -o-transition: 200ms ease-out;
+ -ms-transition: 200ms ease-out;
+ transition: 200ms ease-out;
+}
+
+#upload .filelist li p.imgWrap.notimage {
+ margin-top: 0;
+ width: 111px;
+ height: 111px;
+ border: 1px #eeeeee solid;
+}
+
+#upload .filelist li p.imgWrap.notimage i.file-preview {
+ margin-top: 15px;
+}
+
+#upload .filelist li img {
+ width: 100%;
+}
+
+#upload .filelist li p.error {
+ background: #f43838;
+ color: #fff;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 28px;
+ line-height: 28px;
+ width: 100%;
+ z-index: 100;
+ display: none;
+}
+
+#upload .filelist li .success {
+ display: block;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ height: 40px;
+ width: 100%;
+ z-index: 200;
+ background: url(./images/success.png) no-repeat right bottom;
+ background-image: url(./images/success.gif) \9;
+}
+
+#upload .filelist li.filePickerBlock {
+ width: 113px;
+ height: 113px;
+ background: url(./images/image.png) no-repeat center 12px;
+ border: 1px solid #eeeeee;
+ border-radius: 0;
+}
+
+#upload .filelist li.filePickerBlock div.webuploader-pick {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ opacity: 0;
+ background: none;
+ font-size: 0;
+}
+
+#upload .filelist div.file-panel {
+ position: absolute;
+ height: 0;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
+ background: rgba(0, 0, 0, 0.5);
+ width: 100%;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+ z-index: 300;
+}
+
+#upload .filelist div.file-panel span {
+ width: 24px;
+ height: 24px;
+ display: inline;
+ float: right;
+ text-indent: -9999px;
+ overflow: hidden;
+ background: url(./images/icons.png) no-repeat;
+ background: url(./images/icons.gif) no-repeat \9;
+ margin: 5px 1px 1px;
+ cursor: pointer;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .filelist div.file-panel span.rotateLeft {
+ display: none;
+ background-position: 0 -24px;
+}
+
+#upload .filelist div.file-panel span.rotateLeft:hover {
+ background-position: 0 0;
+}
+
+#upload .filelist div.file-panel span.rotateRight {
+ display: none;
+ background-position: -24px -24px;
+}
+
+#upload .filelist div.file-panel span.rotateRight:hover {
+ background-position: -24px 0;
+}
+
+#upload .filelist div.file-panel span.cancel {
+ background-position: -48px -24px;
+}
+
+#upload .filelist div.file-panel span.cancel:hover {
+ background-position: -48px 0;
+}
+
+#upload .statusBar {
+ height: 45px;
+ border-bottom: 1px solid #dadada;
+ margin: 0 10px;
+ padding: 0;
+ line-height: 45px;
+ vertical-align: middle;
+ position: relative;
+}
+
+#upload .statusBar .progress {
+ border: 1px solid #1483d8;
+ width: 198px;
+ background: #fff;
+ height: 18px;
+ position: absolute;
+ top: 12px;
+ display: none;
+ text-align: center;
+ line-height: 18px;
+ color: #6dbfff;
+ margin: 0 10px 0 0;
+}
+
+#upload .statusBar .progress span.percentage {
+ width: 0;
+ height: 100%;
+ left: 0;
+ top: 0;
+ background: #1483d8;
+ position: absolute;
+}
+
+#upload .statusBar .progress span.text {
+ position: relative;
+ z-index: 10;
+}
+
+#upload .statusBar .info {
+ display: inline-block;
+ font-size: 14px;
+ color: #666666;
+}
+
+#upload .statusBar .btns {
+ position: absolute;
+ top: 7px;
+ right: 0;
+ line-height: 30px;
+}
+
+#filePickerBtn {
+ display: inline-block;
+ float: left;
+}
+
+#upload .statusBar .btns .webuploader-pick,
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-uploading,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #ffffff;
+ border: 1px solid #cfcfcf;
+ color: #565656;
+ padding: 0 18px;
+ display: inline-block;
+ border-radius: 3px;
+ margin-left: 10px;
+ cursor: pointer;
+ font-size: 14px;
+ float: left;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .statusBar .btns .webuploader-pick-hover,
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #f0f0f0;
+}
+
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #00b7ee;
+ color: #fff;
+ border-color: transparent;
+}
+
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #00a2d4;
+}
+
+#upload .statusBar .btns .uploadBtn.disabled {
+ pointer-events: none;
+ filter: alpha(opacity=60);
+ -moz-opacity: 0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6;
+}
+
+
+/* 图片管理样式 */
+#online {
+ width: 100%;
+ height: 336px;
+ padding: 10px 0 0 0;
+}
+
+#online #fileList {
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ position: relative;
+}
+
+#online ul {
+ display: block;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#online li {
+ float: left;
+ display: block;
+ list-style: none;
+ padding: 0;
+ width: 113px;
+ height: 113px;
+ margin: 0 0 9px 9px;
+ *margin: 0 0 6px 6px;
+ background-color: #eee;
+ overflow: hidden;
+ cursor: pointer;
+ position: relative;
+}
+
+#online li.clearFloat {
+ float: none;
+ clear: both;
+ display: block;
+ width: 0;
+ height: 0;
+ margin: 0;
+ padding: 0;
+}
+
+#online li img {
+ cursor: pointer;
+}
+
+#online li div.file-wrapper {
+ cursor: pointer;
+ position: absolute;
+ display: block;
+ width: 111px;
+ height: 111px;
+ border: 1px solid #eee;
+ background: url("./images/bg.png") repeat;
+}
+
+#online li div span.file-title {
+ display: block;
+ padding: 0 3px;
+ margin: 3px 0 0 0;
+ font-size: 12px;
+ height: 15px;
+ color: #555555;
+ text-align: center;
+ width: 107px;
+ white-space: nowrap;
+ word-break: break-all;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#online li .icon {
+ cursor: pointer;
+ width: 113px;
+ height: 113px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ border: 0;
+ background-repeat: no-repeat;
+}
+
+#online li .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+}
+
+#online li.selected .icon {
+ background-image: url(images/success.png);
+ background-image: url(images/success.gif) \9;
+ background-position: 75px 75px;
+}
+
+#online li.selected .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+ background-position: 72px 72px;
+}
+
+
+/* 在线文件的文件预览图标 */
+i.file-preview {
+ display: block;
+ margin: 10px auto;
+ width: 70px;
+ height: 70px;
+ background-image: url("./images/file-icons.png");
+ background-image: url("./images/file-icons.gif") \9;
+ background-position: -140px center;
+ background-repeat: no-repeat;
+}
+
+i.file-preview.file-type-dir {
+ background-position: 0 center;
+}
+
+i.file-preview.file-type-file {
+ background-position: -140px center;
+}
+
+i.file-preview.file-type-filelist {
+ background-position: -210px center;
+}
+
+i.file-preview.file-type-zip,
+i.file-preview.file-type-rar,
+i.file-preview.file-type-7z,
+i.file-preview.file-type-tar,
+i.file-preview.file-type-gz,
+i.file-preview.file-type-bz2 {
+ background-position: -280px center;
+}
+
+i.file-preview.file-type-xls,
+i.file-preview.file-type-xlsx {
+ background-position: -350px center;
+}
+
+i.file-preview.file-type-doc,
+i.file-preview.file-type-docx {
+ background-position: -420px center;
+}
+
+i.file-preview.file-type-ppt,
+i.file-preview.file-type-pptx {
+ background-position: -490px center;
+}
+
+i.file-preview.file-type-vsd {
+ background-position: -560px center;
+}
+
+i.file-preview.file-type-pdf {
+ background-position: -630px center;
+}
+
+i.file-preview.file-type-txt,
+i.file-preview.file-type-md,
+i.file-preview.file-type-json,
+i.file-preview.file-type-htm,
+i.file-preview.file-type-xml,
+i.file-preview.file-type-html,
+i.file-preview.file-type-js,
+i.file-preview.file-type-css,
+i.file-preview.file-type-php,
+i.file-preview.file-type-jsp,
+i.file-preview.file-type-asp {
+ background-position: -700px center;
+}
+
+i.file-preview.file-type-apk {
+ background-position: -770px center;
+}
+
+i.file-preview.file-type-exe {
+ background-position: -840px center;
+}
+
+i.file-preview.file-type-ipa {
+ background-position: -910px center;
+}
+
+i.file-preview.file-type-mp4,
+i.file-preview.file-type-swf,
+i.file-preview.file-type-mkv,
+i.file-preview.file-type-avi,
+i.file-preview.file-type-flv,
+i.file-preview.file-type-mov,
+i.file-preview.file-type-mpg,
+i.file-preview.file-type-mpeg,
+i.file-preview.file-type-ogv,
+i.file-preview.file-type-webm,
+i.file-preview.file-type-rm,
+i.file-preview.file-type-rmvb {
+ background-position: -980px center;
+}
+
+i.file-preview.file-type-ogg,
+i.file-preview.file-type-wav,
+i.file-preview.file-type-wmv,
+i.file-preview.file-type-mid,
+i.file-preview.file-type-mp3 {
+ background-position: -1050px center;
+}
+
+i.file-preview.file-type-jpg,
+i.file-preview.file-type-jpeg,
+i.file-preview.file-type-gif,
+i.file-preview.file-type-bmp,
+i.file-preview.file-type-png,
+i.file-preview.file-type-psd {
+ background-position: -140px center;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.html
new file mode 100644
index 0000000..9146052
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.html
@@ -0,0 +1,61 @@
+
+
+
+
+ ueditor图片对话框
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.js
new file mode 100644
index 0000000..fad0de1
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/attachment.js
@@ -0,0 +1,773 @@
+/**
+ * User: Jinqn
+ * Date: 14-04-08
+ * Time: 下午16:34
+ * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
+ */
+
+(function () {
+
+ var uploadFile,
+ onlineFile;
+
+ window.onload = function () {
+ initTabs();
+ initButtons();
+ };
+
+ /* 初始化tab标签 */
+ function initTabs() {
+ var tabs = $G('tabhead').children;
+ for (var i = 0; i < tabs.length; i++) {
+ domUtils.on(tabs[i], "click", function (e) {
+ var target = e.target || e.srcElement;
+ setTabFocus(target.getAttribute('data-content-id'));
+ });
+ }
+
+ setTabFocus('upload');
+ }
+
+ /* 初始化tabbody */
+ function setTabFocus(id) {
+ if (!id) return;
+ var i, bodyId, tabs = $G('tabhead').children;
+ for (i = 0; i < tabs.length; i++) {
+ bodyId = tabs[i].getAttribute('data-content-id')
+ if (bodyId == id) {
+ domUtils.addClass(tabs[i], 'focus');
+ domUtils.addClass($G(bodyId), 'focus');
+ } else {
+ domUtils.removeClasses(tabs[i], 'focus');
+ domUtils.removeClasses($G(bodyId), 'focus');
+ }
+ }
+ switch (id) {
+ case 'upload':
+ uploadFile = uploadFile || new UploadFile('queueList');
+ break;
+ case 'online':
+ onlineFile = onlineFile || new OnlineFile('fileList');
+ break;
+ }
+ }
+
+ /* 初始化onok事件 */
+ function initButtons() {
+
+ dialog.onok = function () {
+ var list = [], id, tabs = $G('tabhead').children;
+ for (var i = 0; i < tabs.length; i++) {
+ if (domUtils.hasClass(tabs[i], 'focus')) {
+ id = tabs[i].getAttribute('data-content-id');
+ break;
+ }
+ }
+
+ switch (id) {
+ case 'upload':
+ list = uploadFile.getInsertList();
+ var count = uploadFile.getQueueCount();
+ if (count) {
+ $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + '');
+ return false;
+ }
+ break;
+ case 'online':
+ list = onlineFile.getInsertList();
+ break;
+ }
+
+ editor.execCommand('insertfile', list);
+ };
+ }
+
+
+ /* 上传附件 */
+ function UploadFile(target) {
+ this.$wrap = target.constructor == String ? $('#' + target) : $(target);
+ this.init();
+ }
+
+ UploadFile.prototype = {
+ init: function () {
+ this.fileList = [];
+ this.initContainer();
+ this.initUploader();
+ },
+ initContainer: function () {
+ this.$queue = this.$wrap.find('.filelist');
+ },
+ /* 初始化容器 */
+ initUploader: function () {
+ var _this = this,
+ $ = jQuery, // just in case. Make sure it's not an other libaray.
+ $wrap = _this.$wrap,
+ // 图片容器
+ $queue = $wrap.find('.filelist'),
+ // 状态栏,包括进度和控制按钮
+ $statusBar = $wrap.find('.statusBar'),
+ // 文件总体选择信息。
+ $info = $statusBar.find('.info'),
+ // 上传按钮
+ $upload = $wrap.find('.uploadBtn'),
+ // 上传按钮
+ $filePickerBtn = $wrap.find('.filePickerBtn'),
+ // 上传按钮
+ $filePickerBlock = $wrap.find('.filePickerBlock'),
+ // 没选择文件之前的内容。
+ $placeHolder = $wrap.find('.placeholder'),
+ // 总体进度条
+ $progress = $statusBar.find('.progress').hide(),
+ // 添加的文件数量
+ fileCount = 0,
+ // 添加的文件总大小
+ fileSize = 0,
+ // 优化retina, 在retina下这个值是2
+ ratio = window.devicePixelRatio || 1,
+ // 缩略图大小
+ thumbnailWidth = 113 * ratio,
+ thumbnailHeight = 113 * ratio,
+ // 可能有pedding, ready, uploading, confirm, done.
+ state = '',
+ // 所有文件的进度信息,key为file id
+ percentages = {},
+ supportTransition = (function () {
+ var s = document.createElement('p').style,
+ r = 'transition' in s ||
+ 'WebkitTransition' in s ||
+ 'MozTransition' in s ||
+ 'msTransition' in s ||
+ 'OTransition' in s;
+ s = null;
+ return r;
+ })(),
+ // WebUploader实例
+ uploader,
+ actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
+ fileMaxSize = editor.getOpt('fileMaxSize'),
+ acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');
+ ;
+
+ if (!WebUploader.Uploader.support()) {
+ $('#filePickerReady').after($('').html(lang.errorNotSupport)).hide();
+ return;
+ } else if (!editor.getOpt('fileActionName')) {
+ $('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
+ return;
+ }
+
+ uploader = _this.uploader = WebUploader.create({
+ pick: {
+ id: '#filePickerReady',
+ label: lang.uploadSelectFile
+ },
+ swf: '../../third-party/webuploader/Uploader.swf',
+ server: actionUrl,
+ fileVal: editor.getOpt('fileFieldName'),
+ duplicate: true,
+ fileSingleSizeLimit: fileMaxSize,
+ compress: false
+ });
+ uploader.addButton({
+ id: '#filePickerBlock'
+ });
+ uploader.addButton({
+ id: '#filePickerBtn',
+ label: lang.uploadAddFile
+ });
+
+ setState('pedding');
+
+ // 当有文件添加进来时执行,负责view的创建
+ function addFile(file) {
+ var $li = $('
' +
+ '' + file.name + '
' +
+ '' +
+ '
' +
+ ''),
+
+ $btns = $('
' +
+ '' + lang.uploadDelete + '' +
+ '' + lang.uploadTurnRight + '' +
+ '' + lang.uploadTurnLeft + '
').appendTo($li),
+ $prgress = $li.find('p.progress span'),
+ $wrap = $li.find('p.imgWrap'),
+ $info = $('
').hide().appendTo($li),
+
+ showError = function (code) {
+ switch (code) {
+ case 'exceed_size':
+ text = lang.errorExceedSize;
+ break;
+ case 'interrupt':
+ text = lang.errorInterrupt;
+ break;
+ case 'http':
+ text = lang.errorHttp;
+ break;
+ case 'not_allow_type':
+ text = lang.errorFileType;
+ break;
+ default:
+ text = lang.errorUploadRetry;
+ break;
+ }
+ $info.text(text).show();
+ };
+
+ if (file.getStatus() === 'invalid') {
+ showError(file.statusText);
+ } else {
+ $wrap.text(lang.uploadPreview);
+ if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) {
+ $wrap.empty().addClass('notimage').append('
' +
+ '
' + file.name + '');
+ } else {
+ if (browser.ie && browser.version <= 7) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ uploader.makeThumb(file, function (error, src) {
+ if (error || !src) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ var $img = $('

');
+ $wrap.empty().append($img);
+ $img.on('error', function () {
+ $wrap.text(lang.uploadNoPreview);
+ });
+ }
+ }, thumbnailWidth, thumbnailHeight);
+ }
+ }
+ percentages[file.id] = [file.size, 0];
+ file.rotation = 0;
+
+ /* 检查文件格式 */
+ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
+ showError('not_allow_type');
+ uploader.removeFile(file);
+ }
+ }
+
+ file.on('statuschange', function (cur, prev) {
+ if (prev === 'progress') {
+ $prgress.hide().width(0);
+ } else if (prev === 'queued') {
+ $li.off('mouseenter mouseleave');
+ $btns.remove();
+ }
+ // 成功
+ if (cur === 'error' || cur === 'invalid') {
+ showError(file.statusText);
+ percentages[file.id][1] = 1;
+ } else if (cur === 'interrupt') {
+ showError('interrupt');
+ } else if (cur === 'queued') {
+ percentages[file.id][1] = 0;
+ } else if (cur === 'progress') {
+ $info.hide();
+ $prgress.css('display', 'block');
+ } else if (cur === 'complete') {
+ }
+
+ $li.removeClass('state-' + prev).addClass('state-' + cur);
+ });
+
+ $li.on('mouseenter', function () {
+ $btns.stop().animate({height: 30});
+ });
+ $li.on('mouseleave', function () {
+ $btns.stop().animate({height: 0});
+ });
+
+ $btns.on('click', 'span', function () {
+ var index = $(this).index(),
+ deg;
+
+ switch (index) {
+ case 0:
+ uploader.removeFile(file);
+ return;
+ case 1:
+ file.rotation += 90;
+ break;
+ case 2:
+ file.rotation -= 90;
+ break;
+ }
+
+ if (supportTransition) {
+ deg = 'rotate(' + file.rotation + 'deg)';
+ $wrap.css({
+ '-webkit-transform': deg,
+ '-mos-transform': deg,
+ '-o-transform': deg,
+ 'transform': deg
+ });
+ } else {
+ $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
+ }
+
+ });
+
+ $li.insertBefore($filePickerBlock);
+ }
+
+ // 负责view的销毁
+ function removeFile(file) {
+ var $li = $('#' + file.id);
+ delete percentages[file.id];
+ updateTotalProgress();
+ $li.off().find('.file-panel').off().end().remove();
+ }
+
+ function updateTotalProgress() {
+ var loaded = 0,
+ total = 0,
+ spans = $progress.children(),
+ percent;
+
+ $.each(percentages, function (k, v) {
+ total += v[0];
+ loaded += v[0] * v[1];
+ });
+
+ percent = total ? loaded / total : 0;
+
+ spans.eq(0).text(Math.round(percent * 100) + '%');
+ spans.eq(1).css('width', Math.round(percent * 100) + '%');
+ updateStatus();
+ }
+
+ function setState(val, files) {
+
+ if (val != state) {
+
+ var stats = uploader.getStats();
+
+ $upload.removeClass('state-' + state);
+ $upload.addClass('state-' + val);
+
+ switch (val) {
+
+ /* 未选择文件 */
+ case 'pedding':
+ $queue.addClass('element-invisible');
+ $statusBar.addClass('element-invisible');
+ $placeHolder.removeClass('element-invisible');
+ $progress.hide();
+ $info.hide();
+ uploader.refresh();
+ break;
+
+ /* 可以开始上传 */
+ case 'ready':
+ $placeHolder.addClass('element-invisible');
+ $queue.removeClass('element-invisible');
+ $statusBar.removeClass('element-invisible');
+ $progress.hide();
+ $info.show();
+ $upload.text(lang.uploadStart);
+ uploader.refresh();
+ break;
+
+ /* 上传中 */
+ case 'uploading':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadPause);
+ break;
+
+ /* 暂停上传 */
+ case 'paused':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadContinue);
+ break;
+
+ case 'confirm':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadStart);
+
+ stats = uploader.getStats();
+ if (stats.successNum && !stats.uploadFailNum) {
+ setState('finish');
+ return;
+ }
+ break;
+
+ case 'finish':
+ $progress.hide();
+ $info.show();
+ if (stats.uploadFailNum) {
+ $upload.text(lang.uploadRetry);
+ } else {
+ $upload.text(lang.uploadStart);
+ }
+ break;
+ }
+
+ state = val;
+ updateStatus();
+
+ }
+
+ if (!_this.getQueueCount()) {
+ $upload.addClass('disabled')
+ } else {
+ $upload.removeClass('disabled')
+ }
+
+ }
+
+ function updateStatus() {
+ var text = '', stats;
+
+ if (state === 'ready') {
+ text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
+ } else if (state === 'confirm') {
+ stats = uploader.getStats();
+ if (stats.uploadFailNum) {
+ text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
+ }
+ } else {
+ stats = uploader.getStats();
+ text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum);
+
+ if (stats.uploadFailNum) {
+ text += lang.updateStatusError.replace('_', stats.uploadFailNum);
+ }
+ }
+
+ $info.html(text);
+ }
+
+ uploader.on('fileQueued', function (file) {
+ if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
+ fileCount++;
+ fileSize += file.size;
+ }
+
+ if (fileCount === 1) {
+ $placeHolder.addClass('element-invisible');
+ $statusBar.show();
+ }
+
+ addFile(file);
+ });
+
+ uploader.on('fileDequeued', function (file) {
+ if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
+ fileCount--;
+ fileSize -= file.size;
+ }
+
+ removeFile(file);
+ updateTotalProgress();
+ });
+
+ uploader.on('filesQueued', function (file) {
+ if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
+ setState('ready');
+ }
+ updateTotalProgress();
+ });
+
+ uploader.on('all', function (type, files) {
+ switch (type) {
+ case 'uploadFinished':
+ setState('confirm', files);
+ break;
+ case 'startUpload':
+ /* 添加额外的GET参数 */
+ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+ url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params);
+ uploader.option('server', url);
+ setState('uploading', files);
+ break;
+ case 'stopUpload':
+ setState('paused', files);
+ break;
+ }
+ });
+
+ uploader.on('uploadBeforeSend', function (file, data, header) {
+ //这里可以通过data对象添加POST参数
+ if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
+ header['X_Requested_With'] = 'XMLHttpRequest';
+ }
+ });
+
+ uploader.on('uploadProgress', function (file, percentage) {
+ var $li = $('#' + file.id),
+ $percent = $li.find('.progress span');
+
+ $percent.css('width', percentage * 100 + '%');
+ percentages[file.id][1] = percentage;
+ updateTotalProgress();
+ });
+
+ uploader.on('uploadSuccess', function (file, ret) {
+ var $file = $('#' + file.id);
+ try {
+ var responseText = (ret._raw || ret),
+ json = utils.str2json(responseText);
+ if (json.state == 'SUCCESS') {
+ _this.fileList.push(json);
+ $file.append('
');
+ // 触发上传附件事件
+ editor.fireEvent("uploadsuccess", {
+ res: json,
+ type: 'file'
+ });
+ } else {
+ $file.find('.error').text(json.state).show();
+ }
+ } catch (e) {
+ $file.find('.error').text(lang.errorServerUpload).show();
+ }
+ });
+
+ uploader.on('uploadError', function (file, code) {
+ });
+ uploader.on('error', function (code, file) {
+ if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
+ addFile(file);
+ }
+ });
+ uploader.on('uploadComplete', function (file, ret) {
+ });
+
+ $upload.on('click', function () {
+ if ($(this).hasClass('disabled')) {
+ return false;
+ }
+
+ if (state === 'ready') {
+ uploader.upload();
+ } else if (state === 'paused') {
+ uploader.upload();
+ } else if (state === 'uploading') {
+ uploader.stop();
+ }
+ });
+
+ $upload.addClass('state-' + state);
+ updateTotalProgress();
+ },
+ getQueueCount: function () {
+ var file, i, status, readyFile = 0, files = this.uploader.getFiles();
+ for (i = 0; file = files[i++];) {
+ status = file.getStatus();
+ if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
+ }
+ return readyFile;
+ },
+ getInsertList: function () {
+ var i, link, data, list = [],
+ prefix = editor.getOpt('fileUrlPrefix');
+ for (i = 0; i < this.fileList.length; i++) {
+ data = this.fileList[i];
+ link = data.url;
+ list.push({
+ title: data.original || link.substr(link.lastIndexOf('/') + 1),
+ url: prefix + link
+ });
+ }
+ return list;
+ }
+ };
+
+
+ /* 在线附件 */
+ function OnlineFile(target) {
+ this.container = utils.isString(target) ? document.getElementById(target) : target;
+ this.init();
+ }
+
+ OnlineFile.prototype = {
+ init: function () {
+ this.initContainer();
+ this.initEvents();
+ this.initData();
+ },
+ /* 初始化容器 */
+ initContainer: function () {
+ this.container.innerHTML = '';
+ this.list = document.createElement('ul');
+ this.clearFloat = document.createElement('li');
+
+ domUtils.addClass(this.list, 'list');
+ domUtils.addClass(this.clearFloat, 'clearFloat');
+
+ this.list.appendChild(this.clearFloat);
+ this.container.appendChild(this.list);
+ },
+ /* 初始化滚动事件,滚动到地步自动拉取数据 */
+ initEvents: function () {
+ var _this = this;
+
+ /* 滚动拉取图片 */
+ domUtils.on($G('fileList'), 'scroll', function (e) {
+ var panel = this;
+ if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
+ _this.getFileData();
+ }
+ });
+ /* 选中图片 */
+ domUtils.on(this.list, 'click', function (e) {
+ var target = e.target || e.srcElement,
+ li = target.parentNode;
+
+ if (li.tagName.toLowerCase() == 'li') {
+ if (domUtils.hasClass(li, 'selected')) {
+ domUtils.removeClasses(li, 'selected');
+ } else {
+ domUtils.addClass(li, 'selected');
+ }
+ }
+ });
+ },
+ /* 初始化第一次的数据 */
+ initData: function () {
+
+ /* 拉取数据需要使用的值 */
+ this.state = 0;
+ this.listSize = editor.getOpt('fileManagerListSize');
+ this.listIndex = 0;
+ this.listEnd = false;
+
+ /* 第一次拉取数据 */
+ this.getFileData();
+ },
+ /* 向后台拉取图片列表数据 */
+ getFileData: function () {
+ var _this = this;
+
+ if (!_this.listEnd && !this.isLoadingData) {
+ this.isLoadingData = true;
+ ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
+ timeout: 100000,
+ data: utils.extend({
+ start: this.listIndex,
+ size: this.listSize
+ }, editor.queryCommandValue('serverparam')),
+ headers: editor.options.serverHeaders || {},
+ method: 'get',
+ onsuccess: function (r) {
+ try {
+ var json = eval('(' + r.responseText + ')');
+ if (json.state == 'SUCCESS') {
+ _this.pushData(json.list);
+ _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
+ if (_this.listIndex >= json.total) {
+ _this.listEnd = true;
+ }
+ _this.isLoadingData = false;
+ }
+ } catch (e) {
+ if (r.responseText.indexOf('ue_separate_ue') != -1) {
+ var list = r.responseText.split(r.responseText);
+ _this.pushData(list);
+ _this.listIndex = parseInt(list.length);
+ _this.listEnd = true;
+ _this.isLoadingData = false;
+ }
+ }
+ },
+ onerror: function () {
+ _this.isLoadingData = false;
+ }
+ });
+ }
+ },
+ /* 添加图片到列表界面上 */
+ pushData: function (list) {
+ var i, item, img, filetype, preview, icon, _this = this,
+ urlPrefix = editor.getOpt('fileManagerUrlPrefix');
+ for (i = 0; i < list.length; i++) {
+ if (list[i] && list[i].url) {
+ item = document.createElement('li');
+ icon = document.createElement('span');
+ filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
+
+ if ("png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1) {
+ preview = document.createElement('img');
+ domUtils.on(preview, 'load', (function (image) {
+ return function () {
+ _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
+ };
+ })(preview));
+ preview.width = 113;
+ preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36));
+ } else {
+ var ic = document.createElement('i'),
+ textSpan = document.createElement('span');
+ textSpan.innerHTML = list[i].original || list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
+ preview = document.createElement('div');
+ preview.appendChild(ic);
+ preview.appendChild(textSpan);
+ domUtils.addClass(preview, 'file-wrapper');
+ domUtils.addClass(textSpan, 'file-title');
+ domUtils.addClass(ic, 'file-type-' + filetype);
+ domUtils.addClass(ic, 'file-preview');
+ }
+ domUtils.addClass(icon, 'icon');
+ item.setAttribute('data-url', urlPrefix + list[i].url);
+ if (list[i].original) {
+ item.setAttribute('data-title', list[i].original);
+ }
+
+ item.appendChild(preview);
+ item.appendChild(icon);
+ this.list.insertBefore(item, this.clearFloat);
+ }
+ }
+ },
+ /* 改变图片大小 */
+ scale: function (img, w, h, type) {
+ var ow = img.width,
+ oh = img.height;
+
+ if (type == 'justify') {
+ if (ow >= oh) {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ } else {
+ if (ow >= oh) {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ }
+ },
+ getInsertList: function () {
+ var i, lis = this.list.children, list = [];
+ for (i = 0; i < lis.length; i++) {
+ if (domUtils.hasClass(lis[i], 'selected')) {
+ var url = lis[i].getAttribute('data-url');
+ var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
+ list.push({
+ title: title,
+ url: url
+ });
+ }
+ }
+ return list;
+ }
+ };
+
+
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/alignicon.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/alignicon.gif
new file mode 100644
index 0000000..005a5ac
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/alignicon.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/alignicon.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/alignicon.png
new file mode 100644
index 0000000..4b6c444
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/alignicon.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/file-icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/file-icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/file-icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/file-icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/icons.gif
new file mode 100644
index 0000000..78459de
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/image.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/image.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/progress.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/progress.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/success.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/success.gif
new file mode 100644
index 0000000..8d4f311
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/success.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/success.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/attachment/images/success.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.css
new file mode 100644
index 0000000..fe64ce7
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.css
@@ -0,0 +1,818 @@
+@charset "utf-8";
+.wrapper {
+ width: 570px;
+ _width: 575px;
+ margin: 10px auto;
+ zoom: 1;
+ position: relative
+}
+
+.tabbody {
+ height: 355px;
+}
+
+.tabbody .panel {
+ position: absolute;
+ width: 0;
+ height: 0;
+ background: #fff;
+ overflow: hidden;
+ display: none;
+}
+
+.tabbody .panel.focus {
+ width: 100%;
+ height: 355px;
+ display: block;
+}
+
+.tabbody .panel table td {
+ vertical-align: middle;
+}
+
+#audioUrl {
+ width: 380px;
+ height: 26px;
+ line-height: 26px;
+ margin: 8px 5px;
+ background: #FFF;
+ border: 1px solid #d7d7d7;
+ outline: none;
+ border-radius: 3px;
+ padding: 0 5px;
+}
+
+#audioSelect {
+ width: 100px;
+ display: inline-block;
+ background: #FFF;
+ border: 1px solid #EEE;
+ line-height: 26px;
+ text-align: center;
+ color: #333;
+ text-decoration: none;
+ border-radius: 3px;
+ vertical-align: middle;
+}
+
+#audioSearchTxt {
+ margin-left: 15px;
+ background: #FFF;
+ width: 200px;
+ height: 21px;
+ line-height: 21px;
+ border: 1px solid #d7d7d7;
+}
+
+#searchList {
+ width: 570px;
+ overflow: auto;
+ zoom: 1;
+ height: 270px;
+}
+
+#searchList div {
+ float: left;
+ width: 120px;
+ height: 135px;
+ margin: 5px 15px;
+}
+
+#searchList img {
+ margin: 2px 8px;
+ cursor: pointer;
+ border: 2px solid #fff
+}
+
+/*不用缩略图*/
+#searchList p {
+ margin-left: 10px;
+}
+
+#audioType {
+ width: 65px;
+ height: 23px;
+ line-height: 22px;
+ border: 1px solid #d7d7d7;
+}
+
+#audioSearchBtn, #audioSearchReset {
+ /*width: 80px;*/
+ height: 25px;
+ line-height: 25px;
+ background: #eee;
+ border: 1px solid #d7d7d7;
+ cursor: pointer;
+ padding: 0 5px;
+}
+
+
+#preview {
+ position: relative;
+ width: 420px;
+ padding: 0;
+ overflow: hidden;
+ margin-left: 10px;
+ _margin-left: 5px;
+ height: 280px;
+ background-color: #ddd;
+ float: left
+}
+
+#preview .previewMsg {
+ position: absolute;
+ top: 0;
+ margin: 0;
+ padding: 0;
+ height: 280px;
+ width: 100%;
+ background-color: #666;
+}
+
+#preview .previewMsg span {
+ display: block;
+ margin: 125px auto 0 auto;
+ text-align: center;
+ font-size: 18px;
+ color: #fff;
+}
+
+#preview .previewaudio {
+ position: absolute;
+ top: 0;
+ margin: 0;
+ padding: 0;
+ height: 280px;
+ width: 100%;
+}
+
+.edui-audio-wrapper fieldset {
+ border: 1px solid #ddd;
+ padding-left: 5px;
+ margin-bottom: 20px;
+ padding-bottom: 5px;
+ width: 115px;
+}
+
+#audioInfo {
+ width: 120px;
+ float: left;
+ margin-left: 10px;
+ _margin-left: 7px;
+}
+
+fieldset {
+ border: 1px solid #ddd;
+ padding-left: 5px;
+ margin-bottom: 20px;
+ padding-bottom: 5px;
+ width: 115px;
+}
+
+fieldset legend {
+ font-weight: bold;
+}
+
+fieldset p {
+ line-height: 30px;
+}
+
+fieldset input.txt {
+ width: 65px;
+ height: 21px;
+ line-height: 21px;
+ margin: 8px 5px;
+ background: #FFF;
+ border: 1px solid #d7d7d7;
+}
+
+label.url {
+ font-weight: bold;
+ margin-left: 5px;
+}
+
+#audioFloat div {
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ margin: 9px;
+ _margin: 5px;
+ width: 38px;
+ height: 36px;
+ float: left;
+}
+
+#audioFloat .focus {
+ opacity: 1;
+ filter: alpha(opacity=100)
+}
+
+span.view {
+ display: inline-block;
+ width: 30px;
+ float: right;
+ cursor: pointer;
+ color: blue
+}
+
+
+/* upload audio */
+.tabbody #upload.panel {
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+ background: #fff;
+ display: block;
+}
+
+.tabbody #upload.panel.focus {
+ width: 100%;
+ height: 335px;
+ display: block;
+ clip: auto;
+}
+
+#upload_alignment div {
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ margin: 9px;
+ _margin: 5px;
+ width: 38px;
+ height: 36px;
+ float: left;
+}
+
+#upload_alignment .focus {
+ opacity: 1;
+ filter: alpha(opacity=100)
+}
+
+#upload_left {
+ width: 427px;
+ float: left;
+}
+
+#upload_left .controller {
+ height: 30px;
+ clear: both;
+}
+
+#uploadaudioInfo {
+ margin-top: 10px;
+ float: right;
+ padding-right: 8px;
+}
+
+#upload .queueList {
+ margin: 0;
+}
+
+#upload p {
+ margin: 0;
+}
+
+.element-invisible {
+ width: 0 !important;
+ height: 0 !important;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+}
+
+#upload .placeholder {
+ margin: 10px;
+ margin-right: 0;
+ border: 2px dashed #e6e6e6;
+ *border: 0px dashed #e6e6e6;
+ height: 161px;
+ padding-top: 150px;
+ text-align: center;
+ width: 97%;
+ float: left;
+ background: url(./images/image.png) center 70px no-repeat;
+ color: #cccccc;
+ font-size: 18px;
+ position: relative;
+ top: 0;
+ *margin-left: 0;
+ *left: 10px;
+}
+
+#upload .placeholder .webuploader-pick {
+ font-size: 18px;
+ background: #00b7ee;
+ border-radius: 3px;
+ line-height: 44px;
+ padding: 0 30px;
+ *width: 120px;
+ color: #fff;
+ display: inline-block;
+ margin: 0 auto 20px auto;
+ cursor: pointer;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+
+#upload .placeholder .webuploader-pick-hover {
+ background: #00a2d4;
+}
+
+
+#filePickerContainer {
+ text-align: center;
+}
+
+#upload .placeholder .flashTip {
+ color: #666666;
+ font-size: 12px;
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ bottom: 20px;
+}
+
+#upload .placeholder .flashTip a {
+ color: #0785d1;
+ text-decoration: none;
+}
+
+#upload .placeholder .flashTip a:hover {
+ text-decoration: underline;
+}
+
+#upload .placeholder.webuploader-dnd-over {
+ border-color: #999999;
+}
+
+#upload .filelist {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ position: relative;
+ height: 285px;
+}
+
+#upload .filelist:after {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ clear: both;
+}
+
+#upload .filelist li {
+ width: 113px;
+ height: 113px;
+ background: url(./images/bg.png);
+ text-align: center;
+ margin: 15px 0 0 20px;
+ *margin: 15px 0 0 15px;
+ position: relative;
+ display: block;
+ float: left;
+ overflow: hidden;
+ font-size: 12px;
+}
+
+#upload .filelist li p.log {
+ position: relative;
+ top: -45px;
+}
+
+#upload .filelist li p.title {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ top: 5px;
+ text-indent: 5px;
+ text-align: left;
+}
+
+#upload .filelist li p.progress {
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+ height: 8px;
+ overflow: hidden;
+ z-index: 50;
+ margin: 0;
+ border-radius: 0;
+ background: none;
+ -webkit-box-shadow: 0 0 0;
+}
+
+#upload .filelist li p.progress span {
+ display: none;
+ overflow: hidden;
+ width: 0;
+ height: 100%;
+ background: #1483d8 url(./images/progress.png) repeat-x;
+
+ -webit-transition: width 200ms linear;
+ -moz-transition: width 200ms linear;
+ -o-transition: width 200ms linear;
+ -ms-transition: width 200ms linear;
+ transition: width 200ms linear;
+
+ -webkit-animation: progressmove 2s linear infinite;
+ -moz-animation: progressmove 2s linear infinite;
+ -o-animation: progressmove 2s linear infinite;
+ -ms-animation: progressmove 2s linear infinite;
+ animation: progressmove 2s linear infinite;
+
+ -webkit-transform: translateZ(0);
+}
+
+@-webkit-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@-moz-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+#upload .filelist li p.imgWrap {
+ position: relative;
+ z-index: 2;
+ line-height: 113px;
+ vertical-align: middle;
+ overflow: hidden;
+ width: 113px;
+ height: 113px;
+
+ -webkit-transform-origin: 50% 50%;
+ -moz-transform-origin: 50% 50%;
+ -o-transform-origin: 50% 50%;
+ -ms-transform-origin: 50% 50%;
+ transform-origin: 50% 50%;
+
+ -webit-transition: 200ms ease-out;
+ -moz-transition: 200ms ease-out;
+ -o-transition: 200ms ease-out;
+ -ms-transition: 200ms ease-out;
+ transition: 200ms ease-out;
+}
+
+#upload .filelist li p.imgWrap.notimage {
+ margin-top: 0;
+ width: 111px;
+ height: 111px;
+ border: 1px #eeeeee solid;
+}
+
+#upload .filelist li p.imgWrap.notimage i.file-preview {
+ margin-top: 15px;
+}
+
+#upload .filelist li img {
+ width: 100%;
+}
+
+#upload .filelist li p.error {
+ background: #f43838;
+ color: #fff;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 28px;
+ line-height: 28px;
+ width: 100%;
+ z-index: 100;
+ display: none;
+}
+
+#upload .filelist li .success {
+ display: block;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ height: 40px;
+ width: 100%;
+ z-index: 200;
+ background: url(./images/success.png) no-repeat right bottom;
+ background-image: url(./images/success.gif) \9;
+}
+
+#upload .filelist li.filePickerBlock {
+ width: 113px;
+ height: 113px;
+ background: url(./images/image.png) no-repeat center 12px;
+ border: 1px solid #eeeeee;
+ border-radius: 0;
+}
+
+#upload .filelist li.filePickerBlock div.webuploader-pick {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ opacity: 0;
+ background: none;
+ font-size: 0;
+}
+
+#upload .filelist div.file-panel {
+ position: absolute;
+ height: 0;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
+ background: rgba(0, 0, 0, 0.5);
+ width: 100%;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+ z-index: 300;
+}
+
+#upload .filelist div.file-panel span {
+ width: 24px;
+ height: 24px;
+ display: inline;
+ float: right;
+ text-indent: -9999px;
+ overflow: hidden;
+ background: url(./images/icons.png) no-repeat;
+ background: url(./images/icons.gif) no-repeat \9;
+ margin: 5px 1px 1px;
+ cursor: pointer;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .filelist div.file-panel span.rotateLeft {
+ display: none;
+ background-position: 0 -24px;
+}
+
+#upload .filelist div.file-panel span.rotateLeft:hover {
+ background-position: 0 0;
+}
+
+#upload .filelist div.file-panel span.rotateRight {
+ display: none;
+ background-position: -24px -24px;
+}
+
+#upload .filelist div.file-panel span.rotateRight:hover {
+ background-position: -24px 0;
+}
+
+#upload .filelist div.file-panel span.cancel {
+ background-position: -48px -24px;
+}
+
+#upload .filelist div.file-panel span.cancel:hover {
+ background-position: -48px 0;
+}
+
+#upload .statusBar {
+ height: 45px;
+ border-bottom: 1px solid #dadada;
+ margin: 0 10px;
+ padding: 0;
+ line-height: 45px;
+ vertical-align: middle;
+ position: relative;
+}
+
+#upload .statusBar .progress {
+ border: 1px solid #1483d8;
+ width: 198px;
+ background: #fff;
+ height: 18px;
+ position: absolute;
+ top: 12px;
+ display: none;
+ text-align: center;
+ line-height: 18px;
+ color: #6dbfff;
+ margin: 0 10px 0 0;
+}
+
+#upload .statusBar .progress span.percentage {
+ width: 0;
+ height: 100%;
+ left: 0;
+ top: 0;
+ background: #1483d8;
+ position: absolute;
+}
+
+#upload .statusBar .progress span.text {
+ position: relative;
+ z-index: 10;
+}
+
+#upload .statusBar .info {
+ display: inline-block;
+ font-size: 14px;
+ color: #666666;
+}
+
+#upload .statusBar .btns {
+ position: absolute;
+ top: 7px;
+ right: 0;
+ line-height: 30px;
+}
+
+#filePickerBtn {
+ display: inline-block;
+ float: left;
+}
+
+#upload .statusBar .btns .webuploader-pick,
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-uploading,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #ffffff;
+ border: 1px solid #cfcfcf;
+ color: #565656;
+ padding: 0 18px;
+ display: inline-block;
+ border-radius: 3px;
+ margin-left: 10px;
+ cursor: pointer;
+ font-size: 14px;
+ float: left;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .statusBar .btns .webuploader-pick-hover,
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #f0f0f0;
+}
+
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #00b7ee;
+ color: #fff;
+ border-color: transparent;
+}
+
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #00a2d4;
+}
+
+#upload .statusBar .btns .uploadBtn.disabled {
+ pointer-events: none;
+ filter: alpha(opacity=60);
+ -moz-opacity: 0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6;
+}
+
+
+/* 在线文件的文件预览图标 */
+i.file-preview {
+ display: block;
+ margin: 10px auto;
+ width: 70px;
+ height: 70px;
+ background-image: url("./images/file-icons.png");
+ background-image: url("./images/file-icons.gif") \9;
+ background-position: -140px center;
+ background-repeat: no-repeat;
+}
+
+i.file-preview.file-type-dir {
+ background-position: 0 center;
+}
+
+i.file-preview.file-type-file {
+ background-position: -140px center;
+}
+
+i.file-preview.file-type-filelist {
+ background-position: -210px center;
+}
+
+i.file-preview.file-type-zip,
+i.file-preview.file-type-rar,
+i.file-preview.file-type-7z,
+i.file-preview.file-type-tar,
+i.file-preview.file-type-gz,
+i.file-preview.file-type-bz2 {
+ background-position: -280px center;
+}
+
+i.file-preview.file-type-xls,
+i.file-preview.file-type-xlsx {
+ background-position: -350px center;
+}
+
+i.file-preview.file-type-doc,
+i.file-preview.file-type-docx {
+ background-position: -420px center;
+}
+
+i.file-preview.file-type-ppt,
+i.file-preview.file-type-pptx {
+ background-position: -490px center;
+}
+
+i.file-preview.file-type-vsd {
+ background-position: -560px center;
+}
+
+i.file-preview.file-type-pdf {
+ background-position: -630px center;
+}
+
+i.file-preview.file-type-txt,
+i.file-preview.file-type-md,
+i.file-preview.file-type-json,
+i.file-preview.file-type-htm,
+i.file-preview.file-type-xml,
+i.file-preview.file-type-html,
+i.file-preview.file-type-js,
+i.file-preview.file-type-css,
+i.file-preview.file-type-php,
+i.file-preview.file-type-jsp,
+i.file-preview.file-type-asp {
+ background-position: -700px center;
+}
+
+i.file-preview.file-type-apk {
+ background-position: -770px center;
+}
+
+i.file-preview.file-type-exe {
+ background-position: -840px center;
+}
+
+i.file-preview.file-type-ipa {
+ background-position: -910px center;
+}
+
+i.file-preview.file-type-mp4,
+i.file-preview.file-type-swf,
+i.file-preview.file-type-mkv,
+i.file-preview.file-type-avi,
+i.file-preview.file-type-flv,
+i.file-preview.file-type-mov,
+i.file-preview.file-type-mpg,
+i.file-preview.file-type-mpeg,
+i.file-preview.file-type-ogv,
+i.file-preview.file-type-webm,
+i.file-preview.file-type-rm,
+i.file-preview.file-type-rmvb {
+ background-position: -980px center;
+}
+
+i.file-preview.file-type-ogg,
+i.file-preview.file-type-wav,
+i.file-preview.file-type-wmv,
+i.file-preview.file-type-mid,
+i.file-preview.file-type-mp3 {
+ background-position: -1050px center;
+}
+
+i.file-preview.file-type-jpg,
+i.file-preview.file-type-jpeg,
+i.file-preview.file-type-gif,
+i.file-preview.file-type-bmp,
+i.file-preview.file-type-png,
+i.file-preview.file-type-psd {
+ background-position: -140px center;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.html
new file mode 100644
index 0000000..88beee6
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 外链音频支持MP3格式
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.js
new file mode 100644
index 0000000..372b9eb
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/audio.js
@@ -0,0 +1,781 @@
+/**
+ * Created by JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-2-20
+ * Time: 上午11:19
+ * To change this template use File | Settings | File Templates.
+ */
+
+(function () {
+
+ var audio = {},
+ uploadaudioList = [],
+ isModifyUploadaudio = false,
+ uploadFile;
+ var editorOpt = {};
+
+ window.onload = function () {
+ editorOpt = editor.getOpt('audioConfig');
+ $focus($G("audioUrl"));
+ initTabs();
+ initAudio();
+ initUpload();
+ };
+
+ /* 初始化tab标签 */
+ function initTabs() {
+ var tabs = $G('tabHeads').children;
+ for (var i = 0; i < tabs.length; i++) {
+ domUtils.on(tabs[i], "click", function (e) {
+ var j, bodyId, target = e.target || e.srcElement;
+ for (j = 0; j < tabs.length; j++) {
+ bodyId = tabs[j].getAttribute('data-content-id');
+ if (tabs[j] == target) {
+ domUtils.addClass(tabs[j], 'focus');
+ domUtils.addClass($G(bodyId), 'focus');
+ } else {
+ domUtils.removeClasses(tabs[j], 'focus');
+ domUtils.removeClasses($G(bodyId), 'focus');
+ }
+ }
+ });
+ }
+ if (!editorOpt.disableUpload) {
+ $G('tabHeads').querySelector('[data-content-id="upload"]').style.display = 'inline-block';
+ }
+ if (!!editorOpt.selectCallback) {
+ $G('audioSelect').style.display = 'inline-block';
+ domUtils.on($G('audioSelect'), "click", function (e) {
+ editorOpt.selectCallback(editor, function (info) {
+ if (info) {
+ $G('audioUrl').value = info.path;
+ createPreview(info.path);
+ }
+ });
+ });
+ }
+ }
+
+ function initAudio() {
+ createAlignButton(["audioFloat", "upload_alignment"]);
+ addUrlChangeListener($G("audioUrl"));
+ addOkListener();
+
+ //编辑视频时初始化相关信息
+ (function () {
+ var img = editor.selection.getRange().getClosedNode(), url;
+ if (img && img.className) {
+ var hasFakedClass = (img.className == "edui-faked-audio"),
+ hasUploadClass = img.className.indexOf("edui-upload-audio") != -1;
+ if (hasFakedClass || hasUploadClass) {
+ $G("audioUrl").value = url = img.getAttribute("_url");
+ var align = domUtils.getComputedStyle(img, "float"),
+ parentAlign = domUtils.getComputedStyle(img.parentNode, "text-align");
+ updateAlignButton(parentAlign === "center" ? "center" : align);
+ }
+ if (hasUploadClass) {
+ isModifyUploadaudio = true;
+ }
+ }
+ createPreview(url);
+ })();
+ }
+
+ /**
+ * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作
+ */
+ function addOkListener() {
+ dialog.onok = function () {
+ $G("preview").innerHTML = "";
+ var currentTab = findFocus("tabHeads", "tabSrc");
+ switch (currentTab) {
+ case "audio":
+ return insertSingle();
+ break;
+ // case "audioSearch":
+ // return insertSearch("searchList");
+ // break;
+ case "upload":
+ return insertUpload();
+ break;
+ }
+ };
+ dialog.oncancel = function () {
+ $G("preview").innerHTML = "";
+ };
+ }
+
+ /**
+ * 依据传入的align值更新按钮信息
+ * @param align
+ */
+ function updateAlignButton(align) {
+ var aligns = $G("audioFloat").children;
+ for (var i = 0, ci; ci = aligns[i++];) {
+ if (ci.getAttribute("name") == align) {
+ if (ci.className != "focus") {
+ ci.className = "focus";
+ }
+ } else {
+ if (ci.className == "focus") {
+ ci.className = "";
+ }
+ }
+ }
+ }
+
+ /**
+ * 将单个视频信息插入编辑器中
+ */
+ function insertSingle() {
+ var url = $G('audioUrl').value,
+ align = findFocus("audioFloat", "name");
+ if (!url) return false;
+ editor.execCommand('insertaudio', {
+ url: url,
+ }, isModifyUploadaudio ? 'upload' : null);
+ }
+
+ /**
+ * 将元素id下的所有代表视频的图片插入编辑器中
+ * @param id
+ */
+ function insertSearch(id) {
+ var imgs = domUtils.getElementsByTagName($G(id), "img"),
+ audioObjs = [];
+ for (var i = 0, img; img = imgs[i++];) {
+ if (img.getAttribute("selected")) {
+ audioObjs.push({
+ url: img.getAttribute("ue_audio_url"),
+ width: 420,
+ height: 280,
+ align: "none"
+ });
+ }
+ }
+ editor.execCommand('insertaudio', audioObjs);
+ }
+
+ /**
+ * 找到id下具有focus类的节点并返回该节点下的某个属性
+ * @param id
+ * @param returnProperty
+ */
+ function findFocus(id, returnProperty) {
+ var tabs = $G(id).children,
+ property;
+ for (var i = 0, ci; ci = tabs[i++];) {
+ if (ci.className == "focus") {
+ property = ci.getAttribute(returnProperty);
+ break;
+ }
+ }
+ return property;
+ }
+
+ /**
+ * 数字判断
+ * @param value
+ */
+ function isNumber(value) {
+ return /(0|^[1-9]\d*$)/.test(value);
+ }
+
+ /**
+ * 创建图片浮动选择按钮
+ * @param ids
+ */
+ function createAlignButton(ids) {
+ for (var i = 0, ci; ci = ids[i++];) {
+ var floatContainer = $G(ci),
+ nameMaps = {
+ "none": lang['default'],
+ "left": lang.floatLeft,
+ "right": lang.floatRight,
+ "center": lang.block
+ };
+ for (var j in nameMaps) {
+ var div = document.createElement("div");
+ div.setAttribute("name", j);
+ if (j == "none") div.className = "focus";
+ div.style.cssText = "background:url(images/" + j + "_focus.jpg);";
+ div.setAttribute("title", nameMaps[j]);
+ floatContainer.appendChild(div);
+ }
+ switchSelect(ci);
+ }
+ }
+
+ /**
+ * 选择切换
+ * @param selectParentId
+ */
+ function switchSelect(selectParentId) {
+ var selects = $G(selectParentId).children;
+ for (var i = 0, ci; ci = selects[i++];) {
+ domUtils.on(ci, "click", function () {
+ for (var j = 0, cj; cj = selects[j++];) {
+ cj.className = "";
+ cj.removeAttribute && cj.removeAttribute("class");
+ }
+ this.className = "focus";
+ })
+ }
+ }
+
+ /**
+ * 监听url改变事件
+ * @param url
+ */
+ function addUrlChangeListener(url) {
+ if (browser.ie) {
+ url.onpropertychange = function () {
+ createPreview(this.value);
+ }
+ } else {
+ url.addEventListener("input", function () {
+ createPreview(this.value);
+ }, false);
+ }
+ }
+
+ function createAudioHtml(url, param) {
+ param = param || {};
+ var str = [
+ "
',
+ ];
+ return str.join('');
+ }
+
+ /**
+ * 根据url生成视频预览
+ * @param url
+ */
+ function createPreview(url) {
+ if (!url) {
+ return;
+ }
+
+ $G("preview").innerHTML = '
' + lang.urlError + '
' +
+ '
' +
+ '
' + createAudioHtml(url) + '
'
+ + '
';
+ }
+
+
+ /* 插入上传视频 */
+ function insertUpload() {
+ var audioObjs = [],
+ uploadDir = editor.getOpt('audioUrlPrefix'),
+ align = findFocus("upload_alignment", "name") || 'none';
+ for (var key in uploadaudioList) {
+ var file = uploadaudioList[key];
+ audioObjs.push({
+ url: uploadDir + file.url,
+ align: align
+ });
+ }
+
+ var count = uploadFile.getQueueCount();
+ if (count) {
+ $('.info', '#queueList').html('
' + '还有2个未上传文件'.replace(/[\d]/, count) + '');
+ return false;
+ } else {
+ editor.execCommand('insertaudio', audioObjs, 'upload');
+ }
+ }
+
+ /*初始化上传标签*/
+ function initUpload() {
+ uploadFile = new UploadFile('queueList');
+ }
+
+
+ /* 上传附件 */
+ function UploadFile(target) {
+ this.$wrap = target.constructor == String ? $('#' + target) : $(target);
+ this.init();
+ }
+
+ UploadFile.prototype = {
+ init: function () {
+ this.fileList = [];
+ this.initContainer();
+ this.initUploader();
+ },
+ initContainer: function () {
+ this.$queue = this.$wrap.find('.filelist');
+ },
+ /* 初始化容器 */
+ initUploader: function () {
+ var _this = this,
+ $ = jQuery, // just in case. Make sure it's not an other libaray.
+ $wrap = _this.$wrap,
+ // 图片容器
+ $queue = $wrap.find('.filelist'),
+ // 状态栏,包括进度和控制按钮
+ $statusBar = $wrap.find('.statusBar'),
+ // 文件总体选择信息。
+ $info = $statusBar.find('.info'),
+ // 上传按钮
+ $upload = $wrap.find('.uploadBtn'),
+ // 上传按钮
+ $filePickerBtn = $wrap.find('.filePickerBtn'),
+ // 上传按钮
+ $filePickerBlock = $wrap.find('.filePickerBlock'),
+ // 没选择文件之前的内容。
+ $placeHolder = $wrap.find('.placeholder'),
+ // 总体进度条
+ $progress = $statusBar.find('.progress').hide(),
+ // 添加的文件数量
+ fileCount = 0,
+ // 添加的文件总大小
+ fileSize = 0,
+ // 优化retina, 在retina下这个值是2
+ ratio = window.devicePixelRatio || 1,
+ // 缩略图大小
+ thumbnailWidth = 113 * ratio,
+ thumbnailHeight = 113 * ratio,
+ // 可能有pedding, ready, uploading, confirm, done.
+ state = '',
+ // 所有文件的进度信息,key为file id
+ percentages = {},
+ supportTransition = (function () {
+ var s = document.createElement('p').style,
+ r = 'transition' in s ||
+ 'WebkitTransition' in s ||
+ 'MozTransition' in s ||
+ 'msTransition' in s ||
+ 'OTransition' in s;
+ s = null;
+ return r;
+ })(),
+ // WebUploader实例
+ uploader,
+ actionUrl = editor.getActionUrl(editor.getOpt('audioActionName')),
+ fileMaxSize = editor.getOpt('audioMaxSize'),
+ acceptExtensions = (editor.getOpt('audioAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');
+ ;
+
+ if (!WebUploader.Uploader.support()) {
+ $('#filePickerReady').after($('
').html(lang.errorNotSupport)).hide();
+ return;
+ } else if (!editor.getOpt('audioActionName')) {
+ $('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
+ return;
+ }
+
+ uploader = _this.uploader = WebUploader.create({
+ pick: {
+ id: '#filePickerReady',
+ label: lang.uploadSelectFile
+ },
+ swf: '../../third-party/webuploader/Uploader.swf',
+ server: actionUrl,
+ fileVal: editor.getOpt('audioFieldName'),
+ duplicate: true,
+ fileSingleSizeLimit: fileMaxSize,
+ compress: false
+ });
+ uploader.addButton({
+ id: '#filePickerBlock'
+ });
+ uploader.addButton({
+ id: '#filePickerBtn',
+ label: lang.uploadAddFile
+ });
+
+ setState('pedding');
+
+ // 当有文件添加进来时执行,负责view的创建
+ function addFile(file) {
+ var $li = $('
' +
+ '' + file.name + '
' +
+ '' +
+ '
' +
+ ''),
+
+ $btns = $('
' +
+ '' + lang.uploadDelete + '' +
+ '' + lang.uploadTurnRight + '' +
+ '' + lang.uploadTurnLeft + '
').appendTo($li),
+ $prgress = $li.find('p.progress span'),
+ $wrap = $li.find('p.imgWrap'),
+ $info = $('
').hide().appendTo($li),
+
+ showError = function (code) {
+ switch (code) {
+ case 'exceed_size':
+ text = lang.errorExceedSize;
+ break;
+ case 'interrupt':
+ text = lang.errorInterrupt;
+ break;
+ case 'http':
+ text = lang.errorHttp;
+ break;
+ case 'not_allow_type':
+ text = lang.errorFileType;
+ break;
+ default:
+ text = lang.errorUploadRetry;
+ break;
+ }
+ $info.text(text).show();
+ };
+
+ if (file.getStatus() === 'invalid') {
+ showError(file.statusText);
+ } else {
+ $wrap.text(lang.uploadPreview);
+ if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) {
+ $wrap.empty().addClass('notimage').append('
' +
+ '
' + file.name + '');
+ } else {
+ if (browser.ie && browser.version <= 7) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ uploader.makeThumb(file, function (error, src) {
+ if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ var $img = $('

');
+ $wrap.empty().append($img);
+ $img.on('error', function () {
+ $wrap.text(lang.uploadNoPreview);
+ });
+ }
+ }, thumbnailWidth, thumbnailHeight);
+ }
+ }
+ percentages[file.id] = [file.size, 0];
+ file.rotation = 0;
+
+ /* 检查文件格式 */
+ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
+ showError('not_allow_type');
+ uploader.removeFile(file);
+ }
+ }
+
+ file.on('statuschange', function (cur, prev) {
+ if (prev === 'progress') {
+ $prgress.hide().width(0);
+ } else if (prev === 'queued') {
+ $li.off('mouseenter mouseleave');
+ $btns.remove();
+ }
+ // 成功
+ if (cur === 'error' || cur === 'invalid') {
+ showError(file.statusText);
+ percentages[file.id][1] = 1;
+ } else if (cur === 'interrupt') {
+ showError('interrupt');
+ } else if (cur === 'queued') {
+ percentages[file.id][1] = 0;
+ } else if (cur === 'progress') {
+ $info.hide();
+ $prgress.css('display', 'block');
+ } else if (cur === 'complete') {
+ }
+
+ $li.removeClass('state-' + prev).addClass('state-' + cur);
+ });
+
+ $li.on('mouseenter', function () {
+ $btns.stop().animate({height: 30});
+ });
+ $li.on('mouseleave', function () {
+ $btns.stop().animate({height: 0});
+ });
+
+ $btns.on('click', 'span', function () {
+ var index = $(this).index(),
+ deg;
+
+ switch (index) {
+ case 0:
+ uploader.removeFile(file);
+ return;
+ case 1:
+ file.rotation += 90;
+ break;
+ case 2:
+ file.rotation -= 90;
+ break;
+ }
+
+ if (supportTransition) {
+ deg = 'rotate(' + file.rotation + 'deg)';
+ $wrap.css({
+ '-webkit-transform': deg,
+ '-mos-transform': deg,
+ '-o-transform': deg,
+ 'transform': deg
+ });
+ } else {
+ $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
+ }
+
+ });
+
+ $li.insertBefore($filePickerBlock);
+ }
+
+ // 负责view的销毁
+ function removeFile(file) {
+ var $li = $('#' + file.id);
+ delete percentages[file.id];
+ updateTotalProgress();
+ $li.off().find('.file-panel').off().end().remove();
+ }
+
+ function updateTotalProgress() {
+ var loaded = 0,
+ total = 0,
+ spans = $progress.children(),
+ percent;
+
+ $.each(percentages, function (k, v) {
+ total += v[0];
+ loaded += v[0] * v[1];
+ });
+
+ percent = total ? loaded / total : 0;
+
+ spans.eq(0).text(Math.round(percent * 100) + '%');
+ spans.eq(1).css('width', Math.round(percent * 100) + '%');
+ updateStatus();
+ }
+
+ function setState(val, files) {
+
+ if (val != state) {
+
+ var stats = uploader.getStats();
+
+ $upload.removeClass('state-' + state);
+ $upload.addClass('state-' + val);
+
+ switch (val) {
+
+ /* 未选择文件 */
+ case 'pedding':
+ $queue.addClass('element-invisible');
+ $statusBar.addClass('element-invisible');
+ $placeHolder.removeClass('element-invisible');
+ $progress.hide();
+ $info.hide();
+ uploader.refresh();
+ break;
+
+ /* 可以开始上传 */
+ case 'ready':
+ $placeHolder.addClass('element-invisible');
+ $queue.removeClass('element-invisible');
+ $statusBar.removeClass('element-invisible');
+ $progress.hide();
+ $info.show();
+ $upload.text(lang.uploadStart);
+ uploader.refresh();
+ break;
+
+ /* 上传中 */
+ case 'uploading':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadPause);
+ break;
+
+ /* 暂停上传 */
+ case 'paused':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadContinue);
+ break;
+
+ case 'confirm':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadStart);
+
+ stats = uploader.getStats();
+ if (stats.successNum && !stats.uploadFailNum) {
+ setState('finish');
+ return;
+ }
+ break;
+
+ case 'finish':
+ $progress.hide();
+ $info.show();
+ if (stats.uploadFailNum) {
+ $upload.text(lang.uploadRetry);
+ } else {
+ $upload.text(lang.uploadStart);
+ }
+ break;
+ }
+
+ state = val;
+ updateStatus();
+
+ }
+
+ if (!_this.getQueueCount()) {
+ $upload.addClass('disabled')
+ } else {
+ $upload.removeClass('disabled')
+ }
+
+ }
+
+ function updateStatus() {
+ var text = '', stats;
+
+ if (state === 'ready') {
+ text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
+ } else if (state === 'confirm') {
+ stats = uploader.getStats();
+ if (stats.uploadFailNum) {
+ text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
+ }
+ } else {
+ stats = uploader.getStats();
+ text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum);
+
+ if (stats.uploadFailNum) {
+ text += lang.updateStatusError.replace('_', stats.uploadFailNum);
+ }
+ }
+
+ $info.html(text);
+ }
+
+ uploader.on('fileQueued', function (file) {
+ fileCount++;
+ fileSize += file.size;
+
+ if (fileCount === 1) {
+ $placeHolder.addClass('element-invisible');
+ $statusBar.show();
+ }
+
+ addFile(file);
+ });
+
+ uploader.on('fileDequeued', function (file) {
+ fileCount--;
+ fileSize -= file.size;
+
+ removeFile(file);
+ updateTotalProgress();
+ });
+
+ uploader.on('filesQueued', function (file) {
+ if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
+ setState('ready');
+ }
+ updateTotalProgress();
+ });
+
+ uploader.on('all', function (type, files) {
+ switch (type) {
+ case 'uploadFinished':
+ setState('confirm', files);
+ break;
+ case 'startUpload':
+ /* 添加额外的GET参数 */
+ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+ url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params);
+ uploader.option('server', url);
+ setState('uploading', files);
+ break;
+ case 'stopUpload':
+ setState('paused', files);
+ break;
+ }
+ });
+
+ uploader.on('uploadBeforeSend', function (file, data, header) {
+ //这里可以通过data对象添加POST参数
+ if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
+ header['X_Requested_With'] = 'XMLHttpRequest';
+ }
+ });
+
+ uploader.on('uploadProgress', function (file, percentage) {
+ var $li = $('#' + file.id),
+ $percent = $li.find('.progress span');
+
+ $percent.css('width', percentage * 100 + '%');
+ percentages[file.id][1] = percentage;
+ updateTotalProgress();
+ });
+
+ uploader.on('uploadSuccess', function (file, ret) {
+ var $file = $('#' + file.id);
+ try {
+ var responseText = (ret._raw || ret),
+ json = utils.str2json(responseText);
+ if (json.state == 'SUCCESS') {
+ uploadaudioList.push({
+ 'url': json.url,
+ 'type': json.type,
+ 'original': json.original
+ });
+ $file.append('
');
+ } else {
+ $file.find('.error').text(json.state).show();
+ }
+ } catch (e) {
+ $file.find('.error').text(lang.errorServerUpload).show();
+ }
+ });
+
+ uploader.on('uploadError', function (file, code) {
+ });
+ uploader.on('error', function (code, file) {
+ if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
+ addFile(file);
+ }
+ });
+ uploader.on('uploadComplete', function (file, ret) {
+ });
+
+ $upload.on('click', function () {
+ if ($(this).hasClass('disabled')) {
+ return false;
+ }
+
+ if (state === 'ready') {
+ uploader.upload();
+ } else if (state === 'paused') {
+ uploader.upload();
+ } else if (state === 'uploading') {
+ uploader.stop();
+ }
+ });
+
+ $upload.addClass('state-' + state);
+ updateTotalProgress();
+ },
+ getQueueCount: function () {
+ var file, i, status, readyFile = 0, files = this.uploader.getFiles();
+ for (i = 0; file = files[i++];) {
+ status = file.getStatus();
+ if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
+ }
+ return readyFile;
+ },
+ refresh: function () {
+ this.uploader.refresh();
+ }
+ };
+
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/center_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/center_focus.jpg
new file mode 100644
index 0000000..262b029
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/center_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/file-icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/file-icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/file-icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/file-icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/icons.gif
new file mode 100644
index 0000000..78459de
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/image.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/image.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/left_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/left_focus.jpg
new file mode 100644
index 0000000..7886d27
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/left_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/none_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/none_focus.jpg
new file mode 100644
index 0000000..7c768dc
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/none_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/progress.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/progress.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/right_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/right_focus.jpg
new file mode 100644
index 0000000..173e10d
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/right_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/success.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/success.gif
new file mode 100644
index 0000000..8d4f311
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/success.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/success.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/audio/images/success.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.css
new file mode 100644
index 0000000..73e3f8b
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.css
@@ -0,0 +1,193 @@
+.wrapper {
+ width: 424px;
+ margin: 10px auto;
+ zoom: 1;
+ position: relative
+}
+
+.tabbody {
+ height: 225px;
+}
+
+.tabbody .panel {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background: #fff;
+ display: none;
+}
+
+.tabbody .focus {
+ display: block;
+}
+
+body {
+ font-size: 12px;
+ color: #888;
+ overflow: hidden;
+}
+
+input, label {
+ vertical-align: middle
+}
+
+.clear {
+ clear: both;
+}
+
+.pl {
+ padding-left: 18px;
+ padding-left: 23px \9;
+}
+
+#imageList {
+ width: 420px;
+ height: 215px;
+ margin-top: 10px;
+ overflow: hidden;
+ overflow-y: auto;
+}
+
+#imageList div {
+ float: left;
+ width: 100px;
+ height: 95px;
+ margin: 5px 10px;
+}
+
+#imageList img {
+ cursor: pointer;
+ border: 2px solid white;
+}
+
+.bgarea {
+ margin: 10px;
+ padding: 5px;
+ height: 84%;
+ border: 1px solid #A8A297;
+}
+
+.content div {
+ margin: 10px 0 10px 5px;
+}
+
+.content .iptradio {
+ margin: 0px 5px 5px 0px;
+}
+
+.txt {
+ width: 280px;
+}
+
+.wrapcolor {
+ height: 19px;
+}
+
+div.color {
+ float: left;
+ margin: 0;
+}
+
+#colorPicker {
+ width: 17px;
+ height: 17px;
+ border: 1px solid #CCC;
+ display: inline-block;
+ border-radius: 3px;
+ box-shadow: 2px 2px 5px #D3D6DA;
+ margin: 0;
+ float: left;
+}
+
+div.alignment, #custom {
+ margin-left: 23px;
+ margin-left: 28px \9;
+}
+
+#custom input {
+ height: 15px;
+ min-height: 15px;
+ width: 20px;
+}
+
+#repeatType {
+ width: 100px;
+}
+
+
+/* 图片管理样式 */
+#imgManager {
+ width: 100%;
+ height: 225px;
+}
+
+#imgManager #imageList {
+ width: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+#imgManager ul {
+ display: block;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#imgManager li {
+ float: left;
+ display: block;
+ list-style: none;
+ padding: 0;
+ width: 113px;
+ height: 113px;
+ margin: 9px 0 0 19px;
+ background-color: #eee;
+ overflow: hidden;
+ cursor: pointer;
+ position: relative;
+}
+
+#imgManager li.clearFloat {
+ float: none;
+ clear: both;
+ display: block;
+ width: 0;
+ height: 0;
+ margin: 0;
+ padding: 0;
+}
+
+#imgManager li img {
+ cursor: pointer;
+}
+
+#imgManager li .icon {
+ cursor: pointer;
+ width: 113px;
+ height: 113px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ border: 0;
+ background-repeat: no-repeat;
+}
+
+#imgManager li .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+}
+
+#imgManager li.selected .icon {
+ background-image: url(images/success.png);
+ background-position: 75px 75px;
+}
+
+#imgManager li.selected .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+ background-position: 72px 72px;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.html
new file mode 100644
index 0000000..b351bd2
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.js
new file mode 100644
index 0000000..d40a252
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/background.js
@@ -0,0 +1,370 @@
+(function () {
+
+ var onlineImage,
+ backupStyle = editor.queryCommandValue('background');
+
+ window.onload = function () {
+ initTabs();
+ initColorSelector();
+ };
+
+ /* 初始化tab标签 */
+ function initTabs() {
+ var tabs = $G('tabHeads').children;
+ for (var i = 0; i < tabs.length; i++) {
+ domUtils.on(tabs[i], "click", function (e) {
+ var target = e.target || e.srcElement;
+ for (var j = 0; j < tabs.length; j++) {
+ if (tabs[j] == target) {
+ tabs[j].className = "focus";
+ var contentId = tabs[j].getAttribute('data-content-id');
+ $G(contentId).style.display = "block";
+ } else {
+ tabs[j].className = "";
+ $G(tabs[j].getAttribute('data-content-id')).style.display = "none";
+ }
+ }
+ });
+ }
+ }
+
+ /* 初始化颜色设置 */
+ function initColorSelector() {
+ var obj = editor.queryCommandValue('background');
+ if (obj) {
+ var color = obj['background-color'],
+ repeat = obj['background-repeat'] || 'repeat',
+ image = obj['background-image'] || '',
+ position = obj['background-position'] || 'center center',
+ pos = position.split(' '),
+ x = parseInt(pos[0]) || 0,
+ y = parseInt(pos[1]) || 0;
+
+ if (repeat == 'no-repeat' && (x || y)) repeat = 'self';
+
+ image = image.match(/url[\s]*\(([^\)]*)\)/);
+ image = image ? image[1] : '';
+ updateFormState('colored', color, image, repeat, x, y);
+ } else {
+ updateFormState();
+ }
+
+ var updateHandler = function () {
+ updateFormState();
+ updateBackground();
+ }
+ domUtils.on($G('nocolorRadio'), 'click', updateBackground);
+ domUtils.on($G('coloredRadio'), 'click', updateHandler);
+ domUtils.on($G('url'), 'keyup', function () {
+ if ($G('url').value && $G('alignment').style.display == "none") {
+ utils.each($G('repeatType').children, function (item) {
+ item.selected = ('repeat' == item.getAttribute('value') ? 'selected' : false);
+ });
+ }
+ updateHandler();
+ });
+ domUtils.on($G('repeatType'), 'change', updateHandler);
+ domUtils.on($G('x'), 'keyup', updateBackground);
+ domUtils.on($G('y'), 'keyup', updateBackground);
+
+ initColorPicker();
+ }
+
+ /* 初始化颜色选择器 */
+ function initColorPicker() {
+ var me = editor,
+ cp = $G("colorPicker");
+
+ /* 生成颜色选择器ui对象 */
+ var popup = new UE.ui.Popup({
+ content: new UE.ui.ColorPicker({
+ noColorText: me.getLang("clearColor"),
+ editor: me,
+ onpickcolor: function (t, color) {
+ updateFormState('colored', color);
+ updateBackground();
+ UE.ui.Popup.postHide();
+ },
+ onpicknocolor: function (t, color) {
+ updateFormState('colored', 'transparent');
+ updateBackground();
+ UE.ui.Popup.postHide();
+ }
+ }),
+ editor: me,
+ onhide: function () {
+ }
+ });
+
+ /* 设置颜色选择器 */
+ domUtils.on(cp, "click", function () {
+ popup.showAnchor(this);
+ });
+ domUtils.on(document, 'mousedown', function (evt) {
+ var el = evt.target || evt.srcElement;
+ UE.ui.Popup.postHide(el);
+ });
+ domUtils.on(window, 'scroll', function () {
+ UE.ui.Popup.postHide();
+ });
+ }
+
+ /* 更新背景色设置面板 */
+ function updateFormState(radio, color, url, align, x, y) {
+ var nocolorRadio = $G('nocolorRadio'),
+ coloredRadio = $G('coloredRadio');
+
+ if (radio) {
+ nocolorRadio.checked = (radio == 'colored' ? false : 'checked');
+ coloredRadio.checked = (radio == 'colored' ? 'checked' : false);
+ }
+ if (color) {
+ domUtils.setStyle($G("colorPicker"), "background-color", color);
+ }
+
+ if (url && /^\//.test(url)) {
+ var a = document.createElement('a');
+ a.href = url;
+ browser.ie && (a.href = a.href);
+ url = browser.ie ? a.href : (a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
+ }
+
+ if (url || url === '') {
+ $G('url').value = url;
+ }
+ if (align) {
+ utils.each($G('repeatType').children, function (item) {
+ item.selected = (align == item.getAttribute('value') ? 'selected' : false);
+ });
+ }
+ if (x || y) {
+ $G('x').value = parseInt(x) || 0;
+ $G('y').value = parseInt(y) || 0;
+ }
+
+ $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '' : 'none';
+ $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '' : 'none';
+ }
+
+ /* 更新背景颜色 */
+ function updateBackground() {
+ if ($G('coloredRadio').checked) {
+ var color = domUtils.getStyle($G("colorPicker"), "background-color"),
+ bgimg = $G("url").value,
+ align = $G("repeatType").value,
+ backgroundObj = {
+ "background-repeat": "no-repeat",
+ "background-position": "center center"
+ };
+
+ if (color) backgroundObj["background-color"] = color;
+ if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
+ if (align == 'self') {
+ backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
+ } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
+ backgroundObj["background-repeat"] = align;
+ }
+
+ editor.execCommand('background', backgroundObj);
+ } else {
+ editor.execCommand('background', null);
+ }
+ }
+
+
+ /* 在线图片 */
+ function OnlineImage(target) {
+ this.container = utils.isString(target) ? document.getElementById(target) : target;
+ this.init();
+ }
+
+ OnlineImage.prototype = {
+ init: function () {
+ this.reset();
+ this.initEvents();
+ },
+ /* 初始化容器 */
+ initContainer: function () {
+ this.container.innerHTML = '';
+ this.list = document.createElement('ul');
+ this.clearFloat = document.createElement('li');
+
+ domUtils.addClass(this.list, 'list');
+ domUtils.addClass(this.clearFloat, 'clearFloat');
+
+ this.list.id = 'imageListUl';
+ this.list.appendChild(this.clearFloat);
+ this.container.appendChild(this.list);
+ },
+ /* 初始化滚动事件,滚动到地步自动拉取数据 */
+ initEvents: function () {
+ var _this = this;
+
+ /* 滚动拉取图片 */
+ domUtils.on($G('imageList'), 'scroll', function (e) {
+ var panel = this;
+ if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
+ _this.getImageData();
+ }
+ });
+ /* 选中图片 */
+ domUtils.on(this.container, 'click', function (e) {
+ var target = e.target || e.srcElement,
+ li = target.parentNode,
+ nodes = $G('imageListUl').childNodes;
+
+ if (li.tagName.toLowerCase() == 'li') {
+ updateFormState('nocolor', null, '');
+ for (var i = 0, node; node = nodes[i++];) {
+ if (node == li && !domUtils.hasClass(node, 'selected')) {
+ domUtils.addClass(node, 'selected');
+ updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
+ } else {
+ domUtils.removeClasses(node, 'selected');
+ }
+ }
+ updateBackground();
+ }
+ });
+ },
+ /* 初始化第一次的数据 */
+ initData: function () {
+
+ /* 拉取数据需要使用的值 */
+ this.state = 0;
+ this.listSize = editor.getOpt('imageManagerListSize');
+ this.listIndex = 0;
+ this.listEnd = false;
+
+ /* 第一次拉取数据 */
+ this.getImageData();
+ },
+ /* 重置界面 */
+ reset: function () {
+ this.initContainer();
+ this.initData();
+ },
+ /* 向后台拉取图片列表数据 */
+ getImageData: function () {
+ var _this = this;
+
+ if (!_this.listEnd && !this.isLoadingData) {
+ this.isLoadingData = true;
+ var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
+ isJsonp = utils.isCrossDomainUrl(url);
+ ajax.request(url, {
+ 'timeout': 100000,
+ 'dataType': isJsonp ? 'jsonp' : '',
+ 'data': utils.extend({
+ start: this.listIndex,
+ size: this.listSize
+ }, editor.queryCommandValue('serverparam')),
+ 'headers': editor.options.serverHeaders || {},
+ 'method': 'get',
+ 'onsuccess': function (r) {
+ try {
+ var json = isJsonp ? r : eval('(' + r.responseText + ')');
+ if (json.state == 'SUCCESS') {
+ _this.pushData(json.list);
+ _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
+ if (_this.listIndex >= json.total) {
+ _this.listEnd = true;
+ }
+ _this.isLoadingData = false;
+ }
+ } catch (e) {
+ if (r.responseText.indexOf('ue_separate_ue') != -1) {
+ var list = r.responseText.split(r.responseText);
+ _this.pushData(list);
+ _this.listIndex = parseInt(list.length);
+ _this.listEnd = true;
+ _this.isLoadingData = false;
+ }
+ }
+ },
+ 'onerror': function () {
+ _this.isLoadingData = false;
+ }
+ });
+ }
+ },
+ /* 添加图片到列表界面上 */
+ pushData: function (list) {
+ var i, item, img, icon, _this = this,
+ urlPrefix = editor.getOpt('imageManagerUrlPrefix');
+ for (i = 0; i < list.length; i++) {
+ if (list[i] && list[i].url) {
+ item = document.createElement('li');
+ img = document.createElement('img');
+ icon = document.createElement('span');
+
+ domUtils.on(img, 'load', (function (image) {
+ return function () {
+ _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
+ }
+ })(img));
+ img.width = 113;
+ img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36));
+ img.setAttribute('_src', urlPrefix + list[i].url);
+ domUtils.addClass(icon, 'icon');
+
+ item.appendChild(img);
+ item.appendChild(icon);
+ this.list.insertBefore(item, this.clearFloat);
+ }
+ }
+ },
+ /* 改变图片大小 */
+ scale: function (img, w, h, type) {
+ var ow = img.width,
+ oh = img.height;
+
+ if (type == 'justify') {
+ if (ow >= oh) {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ } else {
+ if (ow >= oh) {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ }
+ },
+ getInsertList: function () {
+ var i, lis = this.list.children, list = [], align = getAlign();
+ for (i = 0; i < lis.length; i++) {
+ if (domUtils.hasClass(lis[i], 'selected')) {
+ var img = lis[i].firstChild,
+ src = img.getAttribute('_src');
+ list.push({
+ src: src,
+ _src: src,
+ floatStyle: align
+ });
+ }
+
+ }
+ return list;
+ }
+ };
+
+ dialog.onok = function () {
+ updateBackground();
+ editor.fireEvent('saveScene');
+ };
+ dialog.oncancel = function () {
+ editor.execCommand('background', backupStyle);
+ };
+
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/images/bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/images/bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/images/success.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/background/images/success.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.css
new file mode 100644
index 0000000..6bfee85
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.css
@@ -0,0 +1,129 @@
+.jd img {
+ background: transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
+ cursor: pointer;
+ width: 35px;
+ height: 35px;
+ display: block;
+}
+
+.pp img {
+ background: transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
+ cursor: pointer;
+ width: 25px;
+ height: 25px;
+ display: block;
+}
+
+.ldw img {
+ background: transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
+ cursor: pointer;
+ width: 35px;
+ height: 35px;
+ display: block;
+}
+
+.tsj img {
+ background: transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
+ cursor: pointer;
+ width: 35px;
+ height: 35px;
+ display: block;
+}
+
+.cat img {
+ background: transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
+ cursor: pointer;
+ width: 35px;
+ height: 35px;
+ display: block;
+}
+
+.bb img {
+ background: transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
+ cursor: pointer;
+ width: 35px;
+ height: 35px;
+ display: block;
+}
+
+.youa img {
+ background: transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
+ cursor: pointer;
+ width: 35px;
+ height: 35px;
+ display: block;
+}
+
+.smileytable td {
+ height: 37px;
+}
+
+#tabPanel {
+ margin-left: 5px;
+ overflow: hidden;
+}
+
+#tabContent {
+ float: left;
+ background: #FFFFFF;
+}
+
+#tabContent div {
+ display: none;
+ width: 480px;
+ overflow: hidden;
+}
+
+#tabIconReview.show {
+ left: 17px;
+ display: block;
+}
+
+.menuFocus {
+ background: #ACCD3C;
+}
+
+.menuDefault {
+ background: #FFFFFF;
+}
+
+#tabIconReview {
+ position: absolute;
+ left: 406px;
+ left: 398px \9;
+ top: 41px;
+ z-index: 65533;
+ width: 90px;
+ height: 76px;
+}
+
+img.review {
+ width: 90px;
+ height: 76px;
+ border: 2px solid #9cb945;
+ background: #FFFFFF;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.wrapper .tabbody {
+ position: relative;
+ float: left;
+ clear: both;
+ padding: 10px;
+ width: 95%;
+}
+
+.tabbody table {
+ width: 100%;
+}
+
+.tabbody td {
+ border: 1px solid #BAC498;
+}
+
+.tabbody td span {
+ display: block;
+ zoom: 1;
+ padding: 0 4px;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.html
new file mode 100644
index 0000000..414da99
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.js
new file mode 100644
index 0000000..5e907f0
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/emotion.js
@@ -0,0 +1,186 @@
+window.onload = function () {
+ editor.setOpt({
+ emotionLocalization: false
+ });
+
+ emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/";
+ emotion.SmileyBox = createTabList(emotion.tabNum);
+ emotion.tabExist = createArr(emotion.tabNum);
+
+ initImgName();
+ initEvtHandler("tabHeads");
+};
+
+function initImgName() {
+ for (var pro in emotion.SmilmgName) {
+ var tempName = emotion.SmilmgName[pro],
+ tempBox = emotion.SmileyBox[pro],
+ tempStr = "";
+
+ if (tempBox.length) return;
+ for (var i = 1; i <= tempName[1]; i++) {
+ tempStr = tempName[0];
+ if (i < 10) tempStr = tempStr + '0';
+ tempStr = tempStr + i + '.gif';
+ tempBox.push(tempStr);
+ }
+ }
+}
+
+function initEvtHandler(conId) {
+ var tabHeads = $G(conId);
+ for (var i = 0, j = 0; i < tabHeads.childNodes.length; i++) {
+ var tabObj = tabHeads.childNodes[i];
+ if (tabObj.nodeType == 1) {
+ domUtils.on(tabObj, "click", (function (index) {
+ return function () {
+ switchTab(index);
+ };
+ })(j));
+ j++;
+ }
+ }
+ switchTab(0);
+ $G("tabIconReview").style.display = 'none';
+}
+
+function InsertSmiley(url, evt) {
+ var obj = {
+ src: editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
+ };
+ obj._src = obj.src;
+ editor.execCommand('insertimage', obj);
+ if (!evt.ctrlKey) {
+ dialog.popup.hide();
+ }
+}
+
+function switchTab(index) {
+
+ autoHeight(index);
+ if (emotion.tabExist[index] == 0) {
+ emotion.tabExist[index] = 1;
+ createTab('tab' + index);
+ }
+ //获取呈现元素句柄数组
+ var tabHeads = $G("tabHeads").getElementsByTagName("span"),
+ tabBodys = $G("tabBodys").getElementsByTagName("div"),
+ i = 0, L = tabHeads.length;
+ //隐藏所有呈现元素
+ for (; i < L; i++) {
+ tabHeads[i].className = "";
+ tabBodys[i].style.display = "none";
+ }
+ //显示对应呈现元素
+ tabHeads[index].className = "focus";
+ tabBodys[index].style.display = "block";
+}
+
+function autoHeight(index) {
+ var iframe = dialog.getDom("iframe"),
+ parent = iframe.parentNode.parentNode;
+ switch (index) {
+ case 0:
+ iframe.style.height = "380px";
+ parent.style.height = "392px";
+ break;
+ case 1:
+ iframe.style.height = "220px";
+ parent.style.height = "232px";
+ break;
+ case 2:
+ iframe.style.height = "260px";
+ parent.style.height = "272px";
+ break;
+ case 3:
+ iframe.style.height = "300px";
+ parent.style.height = "312px";
+ break;
+ case 4:
+ iframe.style.height = "140px";
+ parent.style.height = "152px";
+ break;
+ case 5:
+ iframe.style.height = "260px";
+ parent.style.height = "272px";
+ break;
+ case 6:
+ iframe.style.height = "230px";
+ parent.style.height = "242px";
+ break;
+ default:
+
+ }
+}
+
+
+function createTab(tabName) {
+ var faceVersion = "?v=1.1", //版本号
+ tab = $G(tabName), //获取将要生成的Div句柄
+ imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
+ positionLine = 11 / 2, //中间数
+ iWidth = iHeight = 35, //图片长宽
+ iColWidth = 3, //表格剩余空间的显示比例
+ tableCss = emotion.imageCss[tabName],
+ cssOffset = emotion.imageCssOffset[tabName],
+ textHTML = ['
'],
+ i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
+ sUrl, realUrl, posflag, offset, infor;
+
+ for (; i < imgNum;) {
+ textHTML.push('');
+ for (var j = 0; j < imgColNum; j++, i++) {
+ faceImage = emotion.SmileyBox[tabName][i];
+ if (faceImage) {
+ sUrl = imagePath + faceImage + faceVersion;
+ realUrl = imagePath + faceImage;
+ posflag = j < positionLine ? 0 : 1;
+ offset = cssOffset * i * (-1) - 1;
+ infor = emotion.SmileyInfor[tabName][i];
+
+ textHTML.push('');
+ textHTML.push('');
+ textHTML.push(' ');
+ textHTML.push('');
+ } else {
+ textHTML.push(' | ');
+ }
+ textHTML.push(' | ');
+ }
+ textHTML.push('
');
+ }
+ textHTML.push('
');
+ textHTML = textHTML.join("");
+ tab.innerHTML = textHTML;
+}
+
+function over(td, srcPath, posFlag) {
+ td.style.backgroundColor = "#ACCD3C";
+ $G('faceReview').style.backgroundImage = "url(" + srcPath + ")";
+ if (posFlag == 1) $G("tabIconReview").className = "show";
+ $G("tabIconReview").style.display = 'block';
+}
+
+function out(td) {
+ td.style.backgroundColor = "transparent";
+ var tabIconRevew = $G("tabIconReview");
+ tabIconRevew.className = "";
+ tabIconRevew.style.display = 'none';
+}
+
+function createTabList(tabNum) {
+ var obj = {};
+ for (var i = 0; i < tabNum; i++) {
+ obj["tab" + i] = [];
+ }
+ return obj;
+}
+
+function createArr(tabNum) {
+ var arr = [];
+ for (var i = 0; i < tabNum; i++) {
+ arr[i] = 0;
+ }
+ return arr;
+}
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/0.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/0.gif
new file mode 100644
index 0000000..6964168
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/0.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/bface.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/bface.gif
new file mode 100644
index 0000000..14fe618
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/bface.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/cface.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/cface.gif
new file mode 100644
index 0000000..bff947f
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/cface.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/fface.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/fface.gif
new file mode 100644
index 0000000..0d8a6af
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/fface.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/jxface2.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/jxface2.gif
new file mode 100644
index 0000000..a959c90
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/jxface2.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/neweditor-tab-bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/neweditor-tab-bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/tface.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/tface.gif
new file mode 100644
index 0000000..1354f54
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/tface.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/wface.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/wface.gif
new file mode 100644
index 0000000..5667160
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/wface.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/yface.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/yface.gif
new file mode 100644
index 0000000..51608be
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/emotion/images/yface.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/formula/formula.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/formula/formula.html
new file mode 100644
index 0000000..59aa232
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/formula/formula.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
预览
+
+
![]()
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/formula/formula.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/formula/formula.js
new file mode 100644
index 0000000..de47bfe
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/formula/formula.js
@@ -0,0 +1,147 @@
+function preg_quote(str, delimiter) {
+ // Quote regular expression characters plus an optional character
+ //
+ // version: 1107.2516
+ // discuss at: http://phpjs.org/functions/preg_quote
+ // + original by: booeyOH
+ // + improved by: Ates Goral (http://magnetiq.com)
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Onno Marsman
+ // + improved by: Brett Zamir (http://brett-zamir.me)
+ // * example 1: preg_quote("$40");
+ // * returns 1: '\$40'
+ // * example 2: preg_quote("*RRRING* Hello?");
+ // * returns 2: '\*RRRING\* Hello\?'
+ // * example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
+ // * returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'
+ return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
+}
+
+function loadScript(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 Formula = {
+ mode: 'plain',
+ latexeasy: null,
+ init: function () {
+ // console.log('Formula.init')
+ Formula.initMode();
+ Formula.initEvent();
+ Formula.initSubmit();
+ },
+ renderPlain: function () {
+ var $preview = $('#preview');
+ var value = $('#editor').val();
+ if (!value) {
+ $preview.hide();
+ return;
+ }
+ value = encodeURIComponent(value);
+ var formulaConfig = editor.getOpt('formulaConfig');
+ var src = formulaConfig.imageUrlTemplate.replace(/\{\}/, value);
+ $('#previewImage').attr('src', src);
+ $preview.show();
+ },
+ setValuePlain: function (value) {
+ $('#editor').val(value);
+ Formula.renderPlain();
+ },
+ setValueLive: function (value) {
+ if (!Formula.latexeasy) {
+ setTimeout(function () {
+ Formula.setValueLive(value);
+ }, 100);
+ return;
+ }
+ Formula.latexeasy.call('set.latex', {latex: value});
+ },
+ initMode: function () {
+ var formulaConfig = editor.getOpt('formulaConfig');
+ if ('live' === formulaConfig.editorMode) {
+ $('#liveEditor').attr('src', formulaConfig.editorLiveServer + '/editor');
+ $('#modeLive').show();
+ Formula.mode = 'live';
+ } else {
+ $('#modePlain').show();
+ Formula.mode = 'plain';
+ }
+ var img = editor.selection.getRange().getClosedNode();
+ if (img && img.getAttribute('data-formula-image') !== null) {
+ var value = img.getAttribute('data-formula-image');
+ if (value) {
+ Formula.setValue(decodeURIComponent(value));
+ }
+ }
+ },
+ setValue: function (value) {
+ switch (Formula.mode) {
+ case 'plain':
+ Formula.setValuePlain(value);
+ break;
+ case 'live':
+ Formula.setValueLive(value);
+ break;
+ }
+ },
+ getValue: function (cb) {
+ switch (Formula.mode) {
+ case 'plain':
+ cb($.trim($('#editor').val()));
+ break;
+ case 'live':
+ Formula.latexeasy.call('get.latex', {}, function (data) {
+ cb(data.latex);
+ });
+ break;
+ }
+ },
+ initEvent: function () {
+ var changeTimer = null, le;
+ switch (Formula.mode) {
+ case 'plain':
+ // console.log('Formula.initEvent');
+ $('#editor').on('change keypress', function () {
+ changeTimer && clearTimeout(changeTimer);
+ changeTimer = setTimeout(function () {
+ Formula.renderPlain();
+ }, 1000);
+ });
+ $('#inputDemo').on('click', function () {
+ $('#editor').val('f(a) = \\frac{1}{2\\pi i} \\oint\\frac{f(z)}{z-a}dz');
+ Formula.renderPlain();
+ });
+ break;
+ case 'live':
+ var formulaConfig = editor.getOpt('formulaConfig');
+ loadScript(formulaConfig.editorLiveServer + '/vendor/LatexEasyEditor/editor/sdk.js', function () {
+ le = new window.LatexEasy(document.getElementById('liveEditor'));
+ le.on('ready', function () {
+ Formula.latexeasy = le;
+ });
+ le.init();
+ });
+ break;
+ }
+ },
+ initSubmit: function () {
+ dialog.onclose = function (t, ok) {
+ if (!ok) {
+ return true;
+ }
+ // console.log('onclose', t, ok);
+ Formula.getValue(function (value) {
+ editor.execCommand('formula', value);
+ editor.fireEvent('saveScene');
+ dialog.close(false);
+ });
+ return false;
+ };
+ }
+};
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.css
new file mode 100644
index 0000000..3f48f9d
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.css
@@ -0,0 +1,37 @@
+.wrapper {
+ width: 370px;
+ margin: 10px auto;
+ zoom: 1;
+}
+
+.tabbody {
+ height: 360px;
+}
+
+.tabbody .panel {
+ width: 100%;
+ height: 360px;
+ position: absolute;
+ background: #fff;
+}
+
+.tabbody .panel h1 {
+ font-size: 26px;
+ margin: 5px 0 0 5px;
+}
+
+.tabbody .panel p {
+ font-size: 12px;
+ margin: 5px 0 0 5px;
+}
+
+.tabbody table {
+ width: 90%;
+ line-height: 20px;
+ margin: 5px 0 0 5px;;
+}
+
+.tabbody table thead {
+ font-weight: bold;
+ line-height: 25px;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.html
new file mode 100644
index 0000000..fe8625a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.html
@@ -0,0 +1,82 @@
+
+
+
+
帮助
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+ | ctrl+b |
+ |
+
+
+ | ctrl+c |
+ |
+
+
+ | ctrl+x |
+ |
+
+
+ | ctrl+v |
+ |
+
+
+ | ctrl+y |
+ |
+
+
+ | ctrl+z |
+ |
+
+
+ | ctrl+i |
+ |
+
+
+ | ctrl+u |
+ |
+
+
+ | ctrl+a |
+ |
+
+
+ | shift+enter |
+ |
+
+
+ | alt+z |
+ |
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.js
new file mode 100644
index 0000000..87e2c6a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/help/help.js
@@ -0,0 +1,57 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-9-26
+ * Time: 下午1:06
+ * To change this template use File | Settings | File Templates.
+ */
+/**
+ * tab点击处理事件
+ * @param tabHeads
+ * @param tabBodys
+ * @param obj
+ */
+function clickHandler(tabHeads, tabBodys, obj) {
+ //head样式更改
+ for (var k = 0, len = tabHeads.length; k < len; k++) {
+ tabHeads[k].className = "";
+ }
+ obj.className = "focus";
+ //body显隐
+ var tabSrc = obj.getAttribute("tabSrc");
+ for (var j = 0, length = tabBodys.length; j < length; j++) {
+ var body = tabBodys[j],
+ id = body.getAttribute("id");
+ body.onclick = function () {
+ this.style.zoom = 1;
+ };
+ if (id != tabSrc) {
+ body.style.zIndex = 1;
+ } else {
+ body.style.zIndex = 200;
+ }
+ }
+
+}
+
+/**
+ * TAB切换
+ * @param tabParentId tab的父节点ID或者对象本身
+ */
+function switchTab(tabParentId) {
+ var tabElements = $G(tabParentId).children,
+ tabHeads = tabElements[0].children,
+ tabBodys = tabElements[1].children;
+
+ for (var i = 0, length = tabHeads.length; i < length; i++) {
+ var head = tabHeads[i];
+ if (head.className === "focus") clickHandler(tabHeads, tabBodys, head);
+ head.onclick = function () {
+ clickHandler(tabHeads, tabBodys, this);
+ }
+ }
+}
+
+switchTab("helptab");
+
+document.getElementById('version').innerHTML = parent.UE.version;
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.css
new file mode 100644
index 0000000..bf35d20
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.css
@@ -0,0 +1,752 @@
+@charset "utf-8";
+/* dialog样式 */
+.wrapper {
+ zoom: 1;
+ width: 630px;
+ *width: 626px;
+ height: 380px;
+ margin: 0 auto;
+ padding: 10px;
+ position: relative;
+ font-family: sans-serif;
+}
+
+/*tab样式框大小*/
+.tabhead {
+ float: left;
+}
+
+.tabbody {
+ width: 100%;
+ height: 346px;
+ position: relative;
+ clear: both;
+}
+
+.tabbody .panel {
+ position: absolute;
+ width: 0;
+ height: 0;
+ background: #fff;
+ overflow: hidden;
+ display: none;
+}
+
+.tabbody .panel.focus {
+ width: 100%;
+ height: 346px;
+ display: block;
+}
+
+/* 图片对齐方式 */
+.alignBar {
+ float: right;
+ margin-top: 5px;
+ position: relative;
+}
+
+.alignBar .algnLabel {
+ float: left;
+ height: 20px;
+ line-height: 20px;
+}
+
+.alignBar #alignIcon {
+ zoom: 1;
+ _display: inline;
+ display: inline-block;
+ position: relative;
+}
+
+.alignBar #alignIcon span {
+ float: left;
+ cursor: pointer;
+ display: block;
+ width: 19px;
+ height: 17px;
+ margin-right: 3px;
+ margin-left: 3px;
+ background-image: url(./images/alignicon.jpg);
+}
+
+.alignBar #alignIcon .none-align {
+ background-position: 0 -18px;
+}
+
+.alignBar #alignIcon .left-align {
+ background-position: -20px -18px;
+}
+
+.alignBar #alignIcon .right-align {
+ background-position: -40px -18px;
+}
+
+.alignBar #alignIcon .center-align {
+ background-position: -60px -18px;
+}
+
+.alignBar #alignIcon .none-align.focus {
+ background-position: 0 0;
+}
+
+.alignBar #alignIcon .left-align.focus {
+ background-position: -20px 0;
+}
+
+.alignBar #alignIcon .right-align.focus {
+ background-position: -40px 0;
+}
+
+.alignBar #alignIcon .center-align.focus {
+ background-position: -60px 0;
+}
+
+
+/* 远程图片样式 */
+#remote {
+ z-index: 200;
+}
+
+#remote .top {
+ width: 100%;
+ margin-top: 25px;
+}
+
+#remote .left {
+ display: block;
+ float: left;
+ width: 300px;
+ height: 10px;
+}
+
+#remote .right {
+ display: block;
+ float: right;
+ width: 300px;
+ height: 10px;
+}
+
+#remote .row {
+ margin-left: 20px;
+ clear: both;
+ height: 40px;
+}
+
+#remote .row label {
+ text-align: center;
+ width: 50px;
+ zoom: 1;
+ _display: inline;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+#remote .row label.algnLabel {
+ float: left;
+
+}
+
+#remote input.text {
+ width: 150px;
+ padding: 3px 6px;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+
+#remote input.text:focus {
+ outline: 0;
+}
+
+#remote #url {
+ width: 400px;
+ margin-bottom: 2px;
+}
+
+#remote #imageSelect {
+ width: 100px;
+ display: inline-block;
+ background: #FFF;
+ border: 1px solid #EEE;
+ line-height: 26px;
+ text-align: center;
+ color: #333;
+ text-decoration: none;
+ border-radius: 3px;
+ vertical-align: top;
+}
+
+#remote #width,
+#remote #height {
+ width: 30px;
+ margin-left: 2px;
+ margin-right: 2px;
+ text-align: center;
+}
+
+#remote #border,
+#remote #vhSpace,
+#remote #title {
+ width: 180px;
+ margin-right: 5px;
+}
+
+#remote #lock {
+ display: inline-block;
+ vertical-align: middle;
+}
+
+#remote #lockicon {
+ zoom: 1;
+ _display: inline;
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat;
+ vertical-align: middle;
+}
+
+#remote #preview {
+ clear: both;
+ width: 260px;
+ height: 240px;
+ z-index: 9999;
+ margin-top: 10px;
+ background-color: #eee;
+ overflow: hidden;
+}
+
+/* 上传图片 */
+.tabbody #upload.panel {
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+ background: #fff;
+ display: block;
+}
+
+.tabbody #upload.panel.focus {
+ width: 100%;
+ height: 346px;
+ display: block;
+ clip: auto;
+}
+
+#upload .queueList {
+ margin: 0;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ overflow: hidden;
+}
+
+#upload p {
+ margin: 0;
+}
+
+.element-invisible {
+ width: 0 !important;
+ height: 0 !important;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+}
+
+#upload .placeholder {
+ margin: 10px;
+ border: 2px dashed #e6e6e6;
+ *border: 0px dashed #e6e6e6;
+ height: 172px;
+ padding-top: 150px;
+ text-align: center;
+ background: url(./images/image.png) center 70px no-repeat;
+ color: #cccccc;
+ font-size: 18px;
+ position: relative;
+ top: 0;
+ *top: 10px;
+}
+
+#upload .placeholder .webuploader-pick {
+ font-size: 18px;
+ background: #00b7ee;
+ border-radius: 3px;
+ line-height: 44px;
+ padding: 0 30px;
+ *width: 120px;
+ color: #fff;
+ display: inline-block;
+ margin: 0 auto 20px auto;
+ cursor: pointer;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+
+#upload .placeholder .webuploader-pick-hover {
+ background: #00a2d4;
+}
+
+
+#filePickerContainer {
+ text-align: center;
+}
+
+#upload .placeholder .flashTip {
+ color: #666666;
+ font-size: 12px;
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ bottom: 20px;
+}
+
+#upload .placeholder .flashTip a {
+ color: #0785d1;
+ text-decoration: none;
+}
+
+#upload .placeholder .flashTip a:hover {
+ text-decoration: underline;
+}
+
+#upload .placeholder.webuploader-dnd-over {
+ border-color: #999999;
+}
+
+#upload .filelist {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ position: relative;
+ height: 300px;
+}
+
+#upload .filelist:after {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ clear: both;
+ position: relative;
+}
+
+#upload .filelist li {
+ width: 113px;
+ height: 113px;
+ background: url(./images/bg.png);
+ text-align: center;
+ margin: 9px 0 0 9px;
+ *margin: 6px 0 0 6px;
+ position: relative;
+ display: block;
+ float: left;
+ overflow: hidden;
+ font-size: 12px;
+}
+
+#upload .filelist li p.log {
+ position: relative;
+ top: -45px;
+}
+
+#upload .filelist li p.title {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ top: 5px;
+ text-indent: 5px;
+ text-align: left;
+}
+
+#upload .filelist li p.progress {
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+ height: 8px;
+ overflow: hidden;
+ z-index: 50;
+ margin: 0;
+ border-radius: 0;
+ background: none;
+ -webkit-box-shadow: 0 0 0;
+}
+
+#upload .filelist li p.progress span {
+ display: none;
+ overflow: hidden;
+ width: 0;
+ height: 100%;
+ background: #1483d8 url(./images/progress.png) repeat-x;
+
+ -webit-transition: width 200ms linear;
+ -moz-transition: width 200ms linear;
+ -o-transition: width 200ms linear;
+ -ms-transition: width 200ms linear;
+ transition: width 200ms linear;
+
+ -webkit-animation: progressmove 2s linear infinite;
+ -moz-animation: progressmove 2s linear infinite;
+ -o-animation: progressmove 2s linear infinite;
+ -ms-animation: progressmove 2s linear infinite;
+ animation: progressmove 2s linear infinite;
+
+ -webkit-transform: translateZ(0);
+}
+
+@-webkit-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@-moz-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+#upload .filelist li p.imgWrap {
+ position: relative;
+ z-index: 2;
+ line-height: 113px;
+ vertical-align: middle;
+ overflow: hidden;
+ width: 113px;
+ height: 113px;
+
+ -webkit-transform-origin: 50% 50%;
+ -moz-transform-origin: 50% 50%;
+ -o-transform-origin: 50% 50%;
+ -ms-transform-origin: 50% 50%;
+ transform-origin: 50% 50%;
+
+ -webit-transition: 200ms ease-out;
+ -moz-transition: 200ms ease-out;
+ -o-transition: 200ms ease-out;
+ -ms-transition: 200ms ease-out;
+ transition: 200ms ease-out;
+}
+
+#upload .filelist li img {
+ width: 100%;
+}
+
+#upload .filelist li p.error {
+ background: #f43838;
+ color: #fff;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 28px;
+ line-height: 28px;
+ width: 100%;
+ z-index: 100;
+ display: none;
+}
+
+#upload .filelist li .success {
+ display: block;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ height: 40px;
+ width: 100%;
+ z-index: 200;
+ background: url(./images/success.png) no-repeat right bottom;
+ background: url(./images/success.gif) no-repeat right bottom \9;
+}
+
+#upload .filelist li.filePickerBlock {
+ width: 113px;
+ height: 113px;
+ background: url(./images/image.png) no-repeat center 12px;
+ border: 1px solid #eeeeee;
+ border-radius: 0;
+}
+
+#upload .filelist li.filePickerBlock div.webuploader-pick {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ opacity: 0;
+ background: none;
+ font-size: 0;
+}
+
+#upload .filelist div.file-panel {
+ position: absolute;
+ height: 0;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
+ background: rgba(0, 0, 0, 0.5);
+ width: 100%;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+ z-index: 300;
+}
+
+#upload .filelist div.file-panel span {
+ width: 24px;
+ height: 24px;
+ display: inline;
+ float: right;
+ text-indent: -9999px;
+ overflow: hidden;
+ background: url(./images/icons.png) no-repeat;
+ background: url(./images/icons.gif) no-repeat \9;
+ margin: 5px 1px 1px;
+ cursor: pointer;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .filelist div.file-panel span.rotateLeft {
+ display: none;
+ background-position: 0 -24px;
+}
+
+#upload .filelist div.file-panel span.rotateLeft:hover {
+ background-position: 0 0;
+}
+
+#upload .filelist div.file-panel span.rotateRight {
+ display: none;
+ background-position: -24px -24px;
+}
+
+#upload .filelist div.file-panel span.rotateRight:hover {
+ background-position: -24px 0;
+}
+
+#upload .filelist div.file-panel span.cancel {
+ background-position: -48px -24px;
+}
+
+#upload .filelist div.file-panel span.cancel:hover {
+ background-position: -48px 0;
+}
+
+#upload .statusBar {
+ height: 45px;
+ border-bottom: 1px solid #dadada;
+ margin: 0 10px;
+ padding: 0;
+ line-height: 45px;
+ vertical-align: middle;
+ position: relative;
+}
+
+#upload .statusBar .progress {
+ border: 1px solid #1483d8;
+ width: 198px;
+ background: #fff;
+ height: 18px;
+ position: absolute;
+ top: 12px;
+ display: none;
+ text-align: center;
+ line-height: 18px;
+ color: #6dbfff;
+ margin: 0 10px 0 0;
+}
+
+#upload .statusBar .progress span.percentage {
+ width: 0;
+ height: 100%;
+ left: 0;
+ top: 0;
+ background: #1483d8;
+ position: absolute;
+}
+
+#upload .statusBar .progress span.text {
+ position: relative;
+ z-index: 10;
+}
+
+#upload .statusBar .info {
+ display: inline-block;
+ font-size: 14px;
+ color: #666666;
+}
+
+#upload .statusBar .btns {
+ position: absolute;
+ top: 7px;
+ right: 0;
+ line-height: 30px;
+}
+
+#filePickerBtn {
+ display: inline-block;
+ float: left;
+}
+
+#upload .statusBar .btns .webuploader-pick,
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-uploading,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #ffffff;
+ border: 1px solid #cfcfcf;
+ color: #565656;
+ padding: 0 18px;
+ display: inline-block;
+ border-radius: 3px;
+ margin-left: 10px;
+ cursor: pointer;
+ font-size: 14px;
+ float: left;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .statusBar .btns .webuploader-pick-hover,
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #f0f0f0;
+}
+
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #00b7ee;
+ color: #fff;
+ border-color: transparent;
+}
+
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #00a2d4;
+}
+
+#upload .statusBar .btns .uploadBtn.disabled {
+ pointer-events: none;
+ filter: alpha(opacity=60);
+ -moz-opacity: 0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6;
+}
+
+
+/* 图片管理样式 */
+#online {
+ width: 100%;
+ height: 336px;
+ padding: 10px 0 0 0;
+}
+
+#online #imageList {
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ position: relative;
+}
+
+#online ul {
+ display: block;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#online li {
+ float: left;
+ display: block;
+ list-style: none;
+ padding: 0;
+ width: 113px;
+ height: 113px;
+ margin: 0 0 9px 9px;
+ *margin: 0 0 6px 6px;
+ background-color: #eee;
+ overflow: hidden;
+ cursor: pointer;
+ position: relative;
+}
+
+#online li.clearFloat {
+ float: none;
+ clear: both;
+ display: block;
+ width: 0;
+ height: 0;
+ margin: 0;
+ padding: 0;
+}
+
+#online li img {
+ cursor: pointer;
+}
+
+#online li .icon {
+ cursor: pointer;
+ width: 113px;
+ height: 113px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ border: 0;
+ background-repeat: no-repeat;
+}
+
+#online li .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+}
+
+#online li.selected .icon {
+ background-image: url(images/success.png);
+ background-image: url(images/success.gif) \9;
+ background-position: 75px 75px;
+}
+
+#online li.selected .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+ background-position: 72px 72px;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.html
new file mode 100644
index 0000000..d59ab68
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.html
@@ -0,0 +1,125 @@
+
+
+
+
+
ueditor图片对话框
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.js
new file mode 100644
index 0000000..82c7cc1
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/image.js
@@ -0,0 +1,1028 @@
+/**
+ * User: Jinqn
+ * Date: 14-04-08
+ * Time: 下午16:34
+ * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
+ */
+(function () {
+
+ var remoteImage,
+ uploadImage,
+ onlineImage;
+ var editorOpt = {};
+
+ window.onload = function () {
+ editorOpt = editor.getOpt('imageConfig');
+ initTabs();
+ initAlign();
+ initButtons();
+ };
+
+ /* 初始化tab标签 */
+ function initTabs() {
+ var tabs = $G('tabhead').children;
+ for (var i = 0; i < tabs.length; i++) {
+ domUtils.on(tabs[i], "click", function (e) {
+ var target = e.target || e.srcElement;
+ setTabFocus(target.getAttribute('data-content-id'));
+ });
+ }
+ if (!editorOpt.disableUpload) {
+ $G('tabhead').querySelector('[data-content-id="upload"]').style.display = 'inline-block';
+ }
+ if (!editorOpt.disableOnline) {
+ $G('tabhead').querySelector('[data-content-id="online"]').style.display = 'inline-block';
+ }
+ if (!!editorOpt.selectCallback) {
+ $G('imageSelect').style.display = 'inline-block';
+ domUtils.on($G('imageSelect'), "click", function (e) {
+ editorOpt.selectCallback(editor, function (info) {
+ if (info) {
+ $G('url').value = info.path;
+ $G('title').value = info.name;
+ var img = new Image();
+ img.onload = function () {
+ $G('width').value = img.width;
+ $G('height').value = img.height;
+ remoteImage.setPreview();
+ };
+ img.onerror = function () {
+ remoteImage.setPreview();
+ };
+ img.src = info.path;
+ }
+ });
+ });
+ }
+ var img = editor.selection.getRange().getClosedNode();
+ if (img && img.tagName && img.tagName.toLowerCase() == 'img') {
+ setTabFocus('remote');
+ } else {
+ setTabFocus('remote');
+ }
+ }
+
+ /* 初始化tabbody */
+ function setTabFocus(id) {
+ if (!id) return;
+ var i, bodyId, tabs = $G('tabhead').children;
+ for (i = 0; i < tabs.length; i++) {
+ bodyId = tabs[i].getAttribute('data-content-id');
+ if (bodyId == id) {
+ domUtils.addClass(tabs[i], 'focus');
+ domUtils.addClass($G(bodyId), 'focus');
+ } else {
+ domUtils.removeClasses(tabs[i], 'focus');
+ domUtils.removeClasses($G(bodyId), 'focus');
+ }
+ }
+ switch (id) {
+ case 'remote':
+ remoteImage = remoteImage || new RemoteImage();
+ break;
+ case 'upload':
+ setAlign(editor.getOpt('imageInsertAlign'));
+ uploadImage = uploadImage || new UploadImage('queueList');
+ break;
+ case 'online':
+ setAlign(editor.getOpt('imageManagerInsertAlign'));
+ onlineImage = onlineImage || new OnlineImage('imageList');
+ onlineImage.reset();
+ break;
+ }
+ }
+
+ /* 初始化onok事件 */
+ function initButtons() {
+
+ dialog.onok = function () {
+ var remote = false, list = [], id, tabs = $G('tabhead').children;
+ for (var i = 0; i < tabs.length; i++) {
+ if (domUtils.hasClass(tabs[i], 'focus')) {
+ id = tabs[i].getAttribute('data-content-id');
+ break;
+ }
+ }
+
+ switch (id) {
+ case 'remote':
+ list = remoteImage.getInsertList();
+ break;
+ case 'upload':
+ list = uploadImage.getInsertList();
+ var count = uploadImage.getQueueCount();
+ if (count) {
+ $('.info', '#queueList').html('
' + '还有2个未上传文件'.replace(/[\d]/, count) + '');
+ return false;
+ }
+ break;
+ case 'online':
+ list = onlineImage.getInsertList();
+ break;
+ }
+
+ if (list) {
+ editor.execCommand('insertimage', list);
+ remote && editor.fireEvent("catchRemoteImage");
+ }
+ };
+ }
+
+
+ /* 初始化对其方式的点击事件 */
+ function initAlign() {
+ /* 点击align图标 */
+ domUtils.on($G("alignIcon"), 'click', function (e) {
+ var target = e.target || e.srcElement;
+ if (target.className && target.className.indexOf('-align') != -1) {
+ setAlign(target.getAttribute('data-align'));
+ }
+ });
+ }
+
+ /* 设置对齐方式 */
+ function setAlign(align) {
+ align = align || 'none';
+ var aligns = $G("alignIcon").children;
+ for (i = 0; i < aligns.length; i++) {
+ if (aligns[i].getAttribute('data-align') == align) {
+ domUtils.addClass(aligns[i], 'focus');
+ $G("align").value = aligns[i].getAttribute('data-align');
+ } else {
+ domUtils.removeClasses(aligns[i], 'focus');
+ }
+ }
+ }
+
+ /* 获取对齐方式 */
+ function getAlign() {
+ var align = $G("align").value || 'none';
+ return align == 'none' ? '' : align;
+ }
+
+
+ /* 在线图片 */
+ function RemoteImage(target) {
+ this.container = utils.isString(target) ? document.getElementById(target) : target;
+ this.init();
+ }
+
+ RemoteImage.prototype = {
+ init: function () {
+ this.initContainer();
+ this.initEvents();
+ },
+ initContainer: function () {
+ this.dom = {
+ 'url': $G('url'),
+ 'width': $G('width'),
+ 'height': $G('height'),
+ 'border': $G('border'),
+ 'vhSpace': $G('vhSpace'),
+ 'title': $G('title'),
+ 'align': $G('align')
+ };
+ var img = editor.selection.getRange().getClosedNode();
+ if (img) {
+ this.setImage(img);
+ }
+ },
+ initEvents: function () {
+ var _this = this,
+ locker = $G('lock');
+
+ /* 改变url */
+ domUtils.on($G("url"), 'keyup', updatePreview);
+ domUtils.on($G("border"), 'keyup', updatePreview);
+ domUtils.on($G("title"), 'keyup', updatePreview);
+
+ domUtils.on($G("width"), 'keyup', function () {
+ if (locker.checked) {
+ var proportion = locker.getAttribute('data-proportion');
+ $G('height').value = Math.round(this.value / proportion);
+ } else {
+ _this.updateLocker();
+ }
+ updatePreview();
+ });
+ domUtils.on($G("height"), 'keyup', function () {
+ if (locker.checked) {
+ var proportion = locker.getAttribute('data-proportion');
+ $G('width').value = Math.round(this.value * proportion);
+ } else {
+ _this.updateLocker();
+ }
+ updatePreview();
+ });
+ domUtils.on($G("lock"), 'change', function () {
+ var proportion = parseInt($G("width").value) / parseInt($G("height").value);
+ locker.setAttribute('data-proportion', proportion);
+ });
+
+ function updatePreview() {
+ _this.setPreview();
+ }
+ },
+ updateLocker: function () {
+ var width = $G('width').value,
+ height = $G('height').value,
+ locker = $G('lock');
+ if (width && height && width == parseInt(width) && height == parseInt(height)) {
+ locker.disabled = false;
+ locker.title = '';
+ } else {
+ locker.checked = false;
+ locker.disabled = 'disabled';
+ locker.title = lang.remoteLockError;
+ }
+ },
+ setImage: function (img) {
+ /* 不是正常的图片 */
+ if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return;
+
+ var wordImgFlag = img.getAttribute("data-word-image"),
+ src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")),
+ align = editor.queryCommandValue("imageFloat");
+
+ /* 防止onchange事件循环调用 */
+ if (src !== $G("url").value) $G("url").value = src;
+ if (src) {
+ /* 设置表单内容 */
+ $G("width").value = img.width || '';
+ $G("height").value = img.height || '';
+ $G("border").value = img.getAttribute("border") || '0';
+ $G("vhSpace").value = img.getAttribute("vspace") || '0';
+ $G("title").value = img.title || img.alt || '';
+ setAlign(align);
+ this.setPreview();
+ this.updateLocker();
+ }
+ },
+ getData: function () {
+ var data = {};
+ for (var k in this.dom) {
+ data[k] = this.dom[k].value;
+ }
+ return data;
+ },
+ setPreview: function () {
+ var url = $G('url').value,
+ ow = $G('width').value,
+ oh = $G('height').value,
+ border = $G('border').value,
+ title = $G('title').value,
+ preview = $G('preview'),
+ width,
+ height;
+
+ width = ((!ow || !oh) ? preview.offsetWidth : Math.min(ow, preview.offsetWidth));
+ width = width + (border * 2) > preview.offsetWidth ? width : (preview.offsetWidth - (border * 2));
+ height = (!ow || !oh) ? '' : width * oh / ow;
+
+ if (url) {
+ preview.innerHTML = '

';
+ }
+ },
+ getInsertList: function () {
+ var data = this.getData();
+ if (data['url']) {
+ var img = {
+ src: data['url'],
+ _src: data['url'],
+ }
+ img._propertyDelete = []
+ img.style = []
+ if (data['width']) {
+ img.width = data['width'];
+ img.style.push('width:' + data['width'] + 'px');
+ } else {
+ img._propertyDelete.push('width');
+ }
+ if (data['height']) {
+ img.height = data['height'];
+ img.style.push('height:' + data['height'] + 'px');
+ } else {
+ img._propertyDelete.push('height');
+ }
+ if (data['border']) {
+ img.border = data['border'];
+ } else {
+ img._propertyDelete.push('border');
+ }
+ if (data['align']) {
+ img.floatStyle = data['align'];
+ } else {
+ img._propertyDelete.push('floatStyle');
+ }
+ if (data['vhSpace']) {
+ img.vspace = data['vhSpace'];
+ } else {
+ img._propertyDelete.push('vspace');
+ }
+ if (data['title']) {
+ img.alt = data['title'];
+ } else {
+ img._propertyDelete.push('alt');
+ }
+ if (img.style.length > 0) {
+ img.style = img.style.join(';');
+ } else {
+ img._propertyDelete.push('style');
+ }
+ return [img];
+ } else {
+ return [];
+ }
+ }
+ };
+
+
+ /* 上传图片 */
+ function UploadImage(target) {
+ this.$wrap = target.constructor == String ? $('#' + target) : $(target);
+ this.init();
+ }
+
+ UploadImage.prototype = {
+ init: function () {
+ this.imageList = [];
+ this.initContainer();
+ this.initUploader();
+ },
+ initContainer: function () {
+ this.$queue = this.$wrap.find('.filelist');
+ },
+ /* 初始化容器 */
+ initUploader: function () {
+ var _this = this,
+ $ = jQuery, // just in case. Make sure it's not an other libaray.
+ $wrap = _this.$wrap,
+ // 图片容器
+ $queue = $wrap.find('.filelist'),
+ // 状态栏,包括进度和控制按钮
+ $statusBar = $wrap.find('.statusBar'),
+ // 文件总体选择信息。
+ $info = $statusBar.find('.info'),
+ // 上传按钮
+ $upload = $wrap.find('.uploadBtn'),
+ // 上传按钮
+ $filePickerBtn = $wrap.find('.filePickerBtn'),
+ // 上传按钮
+ $filePickerBlock = $wrap.find('.filePickerBlock'),
+ // 没选择文件之前的内容。
+ $placeHolder = $wrap.find('.placeholder'),
+ // 总体进度条
+ $progress = $statusBar.find('.progress').hide(),
+ // 添加的文件数量
+ fileCount = 0,
+ // 添加的文件总大小
+ fileSize = 0,
+ // 优化retina, 在retina下这个值是2
+ ratio = window.devicePixelRatio || 1,
+ // 缩略图大小
+ thumbnailWidth = 113 * ratio,
+ thumbnailHeight = 113 * ratio,
+ // 可能有pedding, ready, uploading, confirm, done.
+ state = '',
+ // 所有文件的进度信息,key为file id
+ percentages = {},
+ supportTransition = (function () {
+ var s = document.createElement('p').style,
+ r = 'transition' in s ||
+ 'WebkitTransition' in s ||
+ 'MozTransition' in s ||
+ 'msTransition' in s ||
+ 'OTransition' in s;
+ s = null;
+ return r;
+ })(),
+ // WebUploader实例
+ uploader,
+ actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')),
+ acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''),
+ imageMaxSize = editor.getOpt('imageMaxSize'),
+ imageCompressBorder = editor.getOpt('imageCompressBorder');
+
+ if (!WebUploader.Uploader.support()) {
+ $('#filePickerReady').after($('
').html(lang.errorNotSupport)).hide();
+ return;
+ } else if (!editor.getOpt('imageActionName')) {
+ $('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
+ return;
+ }
+
+ uploader = _this.uploader = WebUploader.create({
+ pick: {
+ id: '#filePickerReady',
+ label: lang.uploadSelectFile
+ },
+ accept: {
+ title: 'Images',
+ extensions: acceptExtensions,
+ mimeTypes: 'image/*'
+ },
+ swf: '../../third-party/webuploader/Uploader.swf',
+ server: actionUrl,
+ fileVal: editor.getOpt('imageFieldName'),
+ duplicate: true,
+ fileSingleSizeLimit: imageMaxSize, // 默认 2 M
+ threads: 1,
+ headers: editor.getOpt('serverHeaders') || {},
+ compress: editor.getOpt('imageCompressEnable') ? {
+ enable: editor.getOpt('imageCompressEnable'),
+ maxWidthOrHeight: imageCompressBorder,
+ maxSize: imageMaxSize,
+ } : false
+ });
+ uploader.addButton({
+ id: '#filePickerBlock'
+ });
+ uploader.addButton({
+ id: '#filePickerBtn',
+ label: lang.uploadAddFile
+ });
+
+ setState('pedding');
+
+ // 当有文件添加进来时执行,负责view的创建
+ function addFile(file) {
+ var $li = $('
' +
+ '' + file.name + '
' +
+ '' +
+ '
' +
+ ''),
+
+ $btns = $('
' +
+ '' + lang.uploadDelete + '' +
+ '' + lang.uploadTurnRight + '' +
+ '' + lang.uploadTurnLeft + '
').appendTo($li),
+ $prgress = $li.find('p.progress span'),
+ $wrap = $li.find('p.imgWrap'),
+ $info = $('
').hide().appendTo($li),
+
+ showError = function (code) {
+ switch (code) {
+ case 'exceed_size':
+ text = lang.errorExceedSize;
+ break;
+ case 'interrupt':
+ text = lang.errorInterrupt;
+ break;
+ case 'http':
+ text = lang.errorHttp;
+ break;
+ case 'not_allow_type':
+ text = lang.errorFileType;
+ break;
+ default:
+ text = lang.errorUploadRetry;
+ break;
+ }
+ $info.text(text).show();
+ };
+
+ if (file.getStatus() === 'invalid') {
+ showError(file.statusText);
+ } else {
+ $wrap.text(lang.uploadPreview);
+ if (browser.ie && browser.version <= 7) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ uploader.makeThumb(file, function (error, src) {
+ if (error || !src) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ var $img = $('

');
+ $wrap.empty().append($img);
+ $img.on('error', function () {
+ $wrap.text(lang.uploadNoPreview);
+ });
+ }
+ }, thumbnailWidth, thumbnailHeight);
+ }
+ percentages[file.id] = [file.size, 0];
+ file.rotation = 0;
+
+ /* 检查文件格式 */
+ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
+ showError('not_allow_type');
+ uploader.removeFile(file);
+ }
+ }
+
+ file.on('statuschange', function (cur, prev) {
+ if (prev === 'progress') {
+ $prgress.hide().width(0);
+ } else if (prev === 'queued') {
+ $li.off('mouseenter mouseleave');
+ $btns.remove();
+ }
+ // 成功
+ if (cur === 'error' || cur === 'invalid') {
+ showError(file.statusText);
+ percentages[file.id][1] = 1;
+ } else if (cur === 'interrupt') {
+ showError('interrupt');
+ } else if (cur === 'queued') {
+ percentages[file.id][1] = 0;
+ } else if (cur === 'progress') {
+ $info.hide();
+ $prgress.css('display', 'block');
+ } else if (cur === 'complete') {
+ }
+
+ $li.removeClass('state-' + prev).addClass('state-' + cur);
+ });
+
+ $li.on('mouseenter', function () {
+ $btns.stop().animate({height: 30});
+ });
+ $li.on('mouseleave', function () {
+ $btns.stop().animate({height: 0});
+ });
+
+ $btns.on('click', 'span', function () {
+ var index = $(this).index(),
+ deg;
+
+ switch (index) {
+ case 0:
+ uploader.removeFile(file);
+ return;
+ case 1:
+ file.rotation += 90;
+ break;
+ case 2:
+ file.rotation -= 90;
+ break;
+ }
+
+ if (supportTransition) {
+ deg = 'rotate(' + file.rotation + 'deg)';
+ $wrap.css({
+ '-webkit-transform': deg,
+ '-mos-transform': deg,
+ '-o-transform': deg,
+ 'transform': deg
+ });
+ } else {
+ $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
+ }
+
+ });
+
+ $li.insertBefore($filePickerBlock);
+ }
+
+ // 负责view的销毁
+ function removeFile(file) {
+ var $li = $('#' + file.id);
+ delete percentages[file.id];
+ updateTotalProgress();
+ $li.off().find('.file-panel').off().end().remove();
+ }
+
+ function updateTotalProgress() {
+ var loaded = 0,
+ total = 0,
+ spans = $progress.children(),
+ percent;
+
+ $.each(percentages, function (k, v) {
+ total += v[0];
+ loaded += v[0] * v[1];
+ });
+
+ percent = total ? loaded / total : 0;
+
+ spans.eq(0).text(Math.round(percent * 100) + '%');
+ spans.eq(1).css('width', Math.round(percent * 100) + '%');
+ updateStatus();
+ }
+
+ function setState(val, files) {
+
+ if (val !== state) {
+
+ var stats = uploader.getStats();
+
+ $upload.removeClass('state-' + state);
+ $upload.addClass('state-' + val);
+
+ switch (val) {
+
+ /* 未选择文件 */
+ case 'pedding':
+ $queue.addClass('element-invisible');
+ $statusBar.addClass('element-invisible');
+ $placeHolder.removeClass('element-invisible');
+ $progress.hide();
+ $info.hide();
+ uploader.refresh();
+ break;
+
+ /* 可以开始上传 */
+ case 'ready':
+ $placeHolder.addClass('element-invisible');
+ $queue.removeClass('element-invisible');
+ $statusBar.removeClass('element-invisible');
+ $progress.hide();
+ $info.show();
+ $upload.text(lang.uploadStart);
+ uploader.refresh();
+ break;
+
+ /* 上传中 */
+ case 'uploading':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadPause);
+ break;
+
+ /* 暂停上传 */
+ case 'paused':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadContinue);
+ break;
+
+ case 'confirm':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadStart);
+
+ stats = uploader.getStats();
+ if (stats.successNum && !stats.uploadFailNum) {
+ setState('finish');
+ return;
+ }
+ break;
+
+ case 'finish':
+ $progress.hide();
+ $info.show();
+ if (stats.uploadFailNum) {
+ $upload.text(lang.uploadRetry);
+ } else {
+ $upload.text(lang.uploadStart);
+ }
+ break;
+ }
+
+ state = val;
+ updateStatus();
+
+ }
+
+ if (!_this.getQueueCount()) {
+ $upload.addClass('disabled')
+ } else {
+ $upload.removeClass('disabled')
+ }
+
+ }
+
+ function updateStatus() {
+ var text = '', stats;
+
+ if (state === 'ready') {
+ text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
+ } else if (state === 'confirm') {
+ stats = uploader.getStats();
+ if (stats.uploadFailNum) {
+ text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
+ }
+ } else {
+ stats = uploader.getStats();
+ text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum);
+
+ if (stats.uploadFailNum) {
+ text += lang.updateStatusError.replace('_', stats.uploadFailNum);
+ }
+ }
+
+ $info.html(text);
+ }
+
+ uploader.on('fileQueued', function (file) {
+ fileCount++;
+ fileSize += file.size;
+
+ if (fileCount === 1) {
+ $placeHolder.addClass('element-invisible');
+ $statusBar.show();
+ }
+
+ addFile(file);
+ });
+
+ uploader.on('fileDequeued', function (file) {
+ if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= imageMaxSize) {
+ fileCount--;
+ fileSize -= file.size;
+ }
+
+ removeFile(file);
+ updateTotalProgress();
+ });
+
+ uploader.on('filesQueued', function (file) {
+ if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
+ setState('ready');
+ }
+ updateTotalProgress();
+ });
+
+ uploader.on('all', function (type, files) {
+ switch (type) {
+ case 'uploadFinished':
+ setState('confirm', files);
+ break;
+ case 'startUpload':
+ /* 添加额外的GET参数 */
+ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+ url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params);
+ uploader.option('server', url);
+ setState('uploading', files);
+ break;
+ case 'stopUpload':
+ setState('paused', files);
+ break;
+ }
+ });
+
+ uploader.on('uploadBeforeSend', function (file, data, header) {
+ //这里可以通过data对象添加POST参数
+ if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
+ header['X-Requested-With'] = 'XMLHttpRequest';
+ }
+ });
+
+ uploader.on('uploadProgress', function (file, percentage) {
+ var $li = $('#' + file.id),
+ $percent = $li.find('.progress span');
+
+ $percent.css('width', percentage * 100 + '%');
+ percentages[file.id][1] = percentage;
+ updateTotalProgress();
+ });
+
+ uploader.on('uploadSuccess', function (file, ret) {
+ var $file = $('#' + file.id);
+ try {
+ var responseText = (ret._raw || ret),
+ json = utils.str2json(responseText);
+ if (json.state == 'SUCCESS') {
+ _this.imageList.push(json);
+ $file.append('
');
+ // 触发上传图片事件
+ editor.fireEvent("uploadsuccess", {
+ res: json,
+ type: 'image'
+ });
+ } else {
+ $file.find('.error').text(json.state).show();
+ }
+ } catch (e) {
+ $file.find('.error').text(lang.errorServerUpload).show();
+ }
+ });
+
+ uploader.on('uploadError', function (file, code) {
+ });
+ uploader.on('error', function (code, file) {
+ if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
+ addFile(file);
+ }
+ });
+ uploader.on('uploadComplete', function (file, ret) {
+ });
+
+ $upload.on('click', function () {
+ if ($(this).hasClass('disabled')) {
+ return false;
+ }
+
+ if (state === 'ready') {
+ uploader.upload();
+ } else if (state === 'paused') {
+ uploader.upload();
+ } else if (state === 'uploading') {
+ uploader.stop();
+ }
+ });
+
+ $upload.addClass('state-' + state);
+ updateTotalProgress();
+ },
+ getQueueCount: function () {
+ var file, i, status, readyFile = 0, files = this.uploader.getFiles();
+ for (i = 0; file = files[i++];) {
+ status = file.getStatus();
+ if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
+ }
+ return readyFile;
+ },
+ destroy: function () {
+ this.$wrap.remove();
+ },
+ getInsertList: function () {
+ var i, data, list = [],
+ align = getAlign(),
+ prefix = editor.getOpt('imageUrlPrefix');
+ for (i = 0; i < this.imageList.length; i++) {
+ data = this.imageList[i];
+ list.push({
+ src: prefix + data.url,
+ _src: prefix + data.url,
+ alt: data.original,
+ floatStyle: align
+ });
+ }
+ return list;
+ }
+ };
+
+
+ /* 在线图片 */
+ function OnlineImage(target) {
+ this.container = utils.isString(target) ? document.getElementById(target) : target;
+ this.init();
+ }
+
+ OnlineImage.prototype = {
+ init: function () {
+ this.reset();
+ this.initEvents();
+ },
+ /* 初始化容器 */
+ initContainer: function () {
+ this.container.innerHTML = '';
+ this.list = document.createElement('ul');
+ this.clearFloat = document.createElement('li');
+
+ domUtils.addClass(this.list, 'list');
+ domUtils.addClass(this.clearFloat, 'clearFloat');
+
+ this.list.appendChild(this.clearFloat);
+ this.container.appendChild(this.list);
+ },
+ /* 初始化滚动事件,滚动到地步自动拉取数据 */
+ initEvents: function () {
+ var _this = this;
+
+ /* 滚动拉取图片 */
+ domUtils.on($G('imageList'), 'scroll', function (e) {
+ var panel = this;
+ if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
+ _this.getImageData();
+ }
+ });
+ /* 选中图片 */
+ domUtils.on(this.container, 'click', function (e) {
+ var target = e.target || e.srcElement,
+ li = target.parentNode;
+
+ if (li.tagName.toLowerCase() == 'li') {
+ if (domUtils.hasClass(li, 'selected')) {
+ domUtils.removeClasses(li, 'selected');
+ } else {
+ domUtils.addClass(li, 'selected');
+ }
+ }
+ });
+ },
+ /* 初始化第一次的数据 */
+ initData: function () {
+
+ /* 拉取数据需要使用的值 */
+ this.state = 0;
+ this.listSize = editor.getOpt('imageManagerListSize');
+ this.listIndex = 0;
+ this.listEnd = false;
+
+ /* 第一次拉取数据 */
+ this.getImageData();
+ },
+ /* 重置界面 */
+ reset: function () {
+ this.initContainer();
+ this.initData();
+ },
+ /* 向后台拉取图片列表数据 */
+ getImageData: function () {
+ var _this = this;
+
+ if (!_this.listEnd && !this.isLoadingData) {
+ this.isLoadingData = true;
+ var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
+ isJsonp = utils.isCrossDomainUrl(url);
+ ajax.request(url, {
+ 'timeout': 100000,
+ 'dataType': isJsonp ? 'jsonp' : '',
+ 'headers': editor.options.serverHeaders || {},
+ 'data': utils.extend({
+ start: this.listIndex,
+ size: this.listSize
+ }, editor.queryCommandValue('serverparam')),
+ 'method': 'get',
+ 'onsuccess': function (r) {
+ try {
+ var json = isJsonp ? r : eval('(' + r.responseText + ')');
+ if (json.state === 'SUCCESS') {
+ _this.pushData(json.list);
+ _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
+ if (_this.listIndex >= json.total) {
+ _this.listEnd = true;
+ }
+ _this.isLoadingData = false;
+ }
+ } catch (e) {
+ if (r.responseText.indexOf('ue_separate_ue') != -1) {
+ var list = r.responseText.split(r.responseText);
+ _this.pushData(list);
+ _this.listIndex = parseInt(list.length);
+ _this.listEnd = true;
+ _this.isLoadingData = false;
+ }
+ }
+ },
+ 'onerror': function () {
+ _this.isLoadingData = false;
+ }
+ });
+ }
+ },
+ /* 添加图片到列表界面上 */
+ pushData: function (list) {
+ var i, item, img, icon, _this = this,
+ urlPrefix = editor.getOpt('imageManagerUrlPrefix');
+ for (i = 0; i < list.length; i++) {
+ if (list[i] && list[i].url) {
+ item = document.createElement('li');
+ img = document.createElement('img');
+ icon = document.createElement('span');
+
+ domUtils.on(img, 'load', (function (image) {
+ return function () {
+ _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
+ }
+ })(img));
+ img.width = 113;
+ img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36));
+ img.setAttribute('_src', urlPrefix + list[i].url);
+ domUtils.addClass(icon, 'icon');
+
+ item.appendChild(img);
+ item.appendChild(icon);
+ this.list.insertBefore(item, this.clearFloat);
+ }
+ }
+ },
+ /* 改变图片大小 */
+ scale: function (img, w, h, type) {
+ var ow = img.width,
+ oh = img.height;
+
+ if (type == 'justify') {
+ if (ow >= oh) {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ } else {
+ if (ow >= oh) {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ }
+ },
+ getInsertList: function () {
+ var i, lis = this.list.children, list = [], align = getAlign();
+ for (i = 0; i < lis.length; i++) {
+ if (domUtils.hasClass(lis[i], 'selected')) {
+ var img = lis[i].firstChild,
+ src = img.getAttribute('_src');
+ list.push({
+ src: src,
+ _src: src,
+ alt: src.substr(src.lastIndexOf('/') + 1),
+ floatStyle: align
+ });
+ }
+
+ }
+ return list;
+ }
+ };
+
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/alignicon.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/alignicon.jpg
new file mode 100644
index 0000000..754755b
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/alignicon.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/icons.gif
new file mode 100644
index 0000000..78459de
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/image.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/image.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/progress.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/progress.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/success.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/success.gif
new file mode 100644
index 0000000..8d4f311
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/success.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/success.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/image/images/success.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/insertframe/insertframe.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/insertframe/insertframe.html
new file mode 100644
index 0000000..347bc21
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/insertframe/insertframe.html
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/internal.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/internal.js
new file mode 100644
index 0000000..e1eec2c
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/internal.js
@@ -0,0 +1,81 @@
+(function () {
+ var parent = window.parent;
+ //dialog对象
+ dialog = parent.$EDITORUI[window.frameElement.id.replace(/_iframe$/, '')];
+ //当前打开dialog的编辑器实例
+ editor = dialog.editor;
+
+ UE = parent.UE;
+
+ domUtils = UE.dom.domUtils;
+
+ utils = UE.utils;
+
+ browser = UE.browser;
+
+ ajax = UE.ajax;
+
+ $G = function (id) {
+ return document.getElementById(id)
+ };
+ //focus元素
+ $focus = function (node) {
+ setTimeout(function () {
+ if (browser.ie) {
+ var r = node.createTextRange();
+ r.collapse(false);
+ r.select();
+ } else {
+ node.focus()
+ }
+ }, 0)
+ };
+ utils.loadFile(document, {
+ href: editor.options.themePath + editor.options.theme + "/dialogbase.css?cache=" + Math.random(),
+ tag: "link",
+ type: "text/css",
+ rel: "stylesheet"
+ });
+ lang = editor.getLang(dialog.className.split("-")[2]);
+ if (lang) {
+ domUtils.on(window, 'load', function () {
+
+ var langImgPath = editor.options.langPath + editor.options.lang + "/images/";
+ //针对静态资源
+ for (var i in lang["static"]) {
+ var dom = $G(i);
+ if (!dom) continue;
+ var tagName = dom.tagName,
+ content = lang["static"][i];
+ if (content.src) {
+ //clone
+ content = utils.extend({}, content, false);
+ content.src = langImgPath + content.src;
+ }
+ if (content.style) {
+ content = utils.extend({}, content, false);
+ content.style = content.style.replace(/url\s*\(/g, "url(" + langImgPath)
+ }
+ switch (tagName.toLowerCase()) {
+ case "var":
+ dom.parentNode.replaceChild(document.createTextNode(content), dom);
+ break;
+ case "select":
+ var ops = dom.options;
+ for (var j = 0, oj; oj = ops[j];) {
+ oj.innerHTML = content.options[j++];
+ }
+ for (var p in content) {
+ p != "options" && dom.setAttribute(p, content[p]);
+ }
+ break;
+ default :
+ domUtils.setAttributes(dom, content);
+ }
+ }
+ });
+ }
+
+
+})();
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/link/link.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/link/link.html
new file mode 100644
index 0000000..4656686
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/link/link.html
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/preview/preview.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/preview/preview.html
new file mode 100644
index 0000000..a1d268c
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/preview/preview.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/addimg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/addimg.png
new file mode 100644
index 0000000..03a8713
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/addimg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/brush.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/brush.png
new file mode 100644
index 0000000..efa6fdb
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/brush.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/delimg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/delimg.png
new file mode 100644
index 0000000..5a892e4
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/delimg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/delimgH.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/delimgH.png
new file mode 100644
index 0000000..2f0c5c9
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/delimgH.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/empty.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/empty.png
new file mode 100644
index 0000000..0375196
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/empty.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/emptyH.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/emptyH.png
new file mode 100644
index 0000000..838ca72
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/emptyH.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/eraser.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/eraser.png
new file mode 100644
index 0000000..63e87ce
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/eraser.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/redo.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/redo.png
new file mode 100644
index 0000000..12cd9bb
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/redo.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/redoH.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/redoH.png
new file mode 100644
index 0000000..d9f33d3
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/redoH.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/scale.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/scale.png
new file mode 100644
index 0000000..935a3f3
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/scale.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/scaleH.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/scaleH.png
new file mode 100644
index 0000000..72e64a9
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/scaleH.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/size.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/size.png
new file mode 100644
index 0000000..8366845
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/size.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/undo.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/undo.png
new file mode 100644
index 0000000..084c7cc
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/undo.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/undoH.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/undoH.png
new file mode 100644
index 0000000..fde7eb3
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/images/undoH.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.css
new file mode 100644
index 0000000..4a4c1b3
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.css
@@ -0,0 +1,324 @@
+/*common
+*/
+body {
+ margin: 0;
+}
+
+table {
+ width: 100%;
+}
+
+table td {
+ padding: 2px 4px;
+ vertical-align: middle;
+}
+
+a {
+ text-decoration: none;
+}
+
+em {
+ font-style: normal;
+}
+
+.border_style1 {
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ box-shadow: 2px 2px 5px #d3d6da;
+}
+
+/*module
+*/
+.main {
+ margin: 8px;
+ overflow: hidden;
+}
+
+.hot {
+ float: left;
+ height: 335px;
+}
+
+.drawBoard {
+ position: relative;
+ cursor: crosshair;
+}
+
+.brushBorad {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 998;
+}
+
+.picBoard {
+ border: none;
+ text-align: center;
+ line-height: 300px;
+ cursor: default;
+}
+
+.operateBar {
+ margin-top: 10px;
+ font-size: 12px;
+ text-align: center;
+}
+
+.operateBar span {
+ margin-left: 10px;
+}
+
+.drawToolbar {
+ float: right;
+ width: 110px;
+ height: 300px;
+ overflow: hidden;
+}
+
+.colorBar {
+ margin-top: 10px;
+ font-size: 12px;
+ text-align: center;
+}
+
+.colorBar a {
+ display: block;
+ width: 10px;
+ height: 10px;
+ border: 1px solid #1006F1;
+ border-radius: 3px;
+ box-shadow: 2px 2px 5px #d3d6da;
+ opacity: 0.3
+}
+
+.sectionBar {
+ margin-top: 15px;
+ font-size: 12px;
+ text-align: center;
+}
+
+.sectionBar a {
+ display: inline-block;
+ width: 10px;
+ height: 12px;
+ color: #888;
+ text-indent: -999px;
+ opacity: 0.3
+}
+
+.size1 {
+ background: url('images/size.png') 1px center no-repeat;
+}
+
+.size2 {
+ background: url('images/size.png') -10px center no-repeat;
+}
+
+.size3 {
+ background: url('images/size.png') -22px center no-repeat;
+}
+
+.size4 {
+ background: url('images/size.png') -35px center no-repeat;
+}
+
+.addImgH {
+ position: relative;
+}
+
+.addImgH_form {
+ position: absolute;
+ left: 18px;
+ top: -1px;
+ width: 75px;
+ height: 21px;
+ opacity: 0;
+ cursor: pointer;
+}
+
+.addImgH_form input {
+ width: 100%;
+}
+
+/*scrawl遮罩层
+*/
+.maskLayerNull {
+ display: none;
+}
+
+.maskLayer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0.7;
+ background-color: #fff;
+ text-align: center;
+ font-weight: bold;
+ line-height: 300px;
+ z-index: 1000;
+}
+
+/*btn state
+*/
+.previousStepH .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/undoH.png');
+ cursor: pointer;
+}
+
+.previousStepH .text {
+ color: #888;
+ cursor: pointer;
+}
+
+.previousStep .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/undo.png');
+ cursor: default;
+}
+
+.previousStep .text {
+ color: #ccc;
+ cursor: default;
+}
+
+.nextStepH .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/redoH.png');
+ cursor: pointer;
+}
+
+.nextStepH .text {
+ color: #888;
+ cursor: pointer;
+}
+
+.nextStep .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/redo.png');
+ cursor: default;
+}
+
+.nextStep .text {
+ color: #ccc;
+ cursor: default;
+}
+
+.clearBoardH .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/emptyH.png');
+ cursor: pointer;
+}
+
+.clearBoardH .text {
+ color: #888;
+ cursor: pointer;
+}
+
+.clearBoard .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/empty.png');
+ cursor: default;
+}
+
+.clearBoard .text {
+ color: #ccc;
+ cursor: default;
+}
+
+.scaleBoardH .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/scaleH.png');
+ cursor: pointer;
+}
+
+.scaleBoardH .text {
+ color: #888;
+ cursor: pointer;
+}
+
+.scaleBoard .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/scale.png');
+ cursor: default;
+}
+
+.scaleBoard .text {
+ color: #ccc;
+ cursor: default;
+}
+
+.removeImgH .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/delimgH.png');
+ cursor: pointer;
+}
+
+.removeImgH .text {
+ color: #888;
+ cursor: pointer;
+}
+
+.removeImg .icon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/delimg.png');
+ cursor: default;
+}
+
+.removeImg .text {
+ color: #ccc;
+ cursor: default;
+}
+
+.addImgH .icon {
+ vertical-align: top;
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/addimg.png')
+}
+
+.addImgH .text {
+ color: #888;
+ cursor: pointer;
+}
+
+/*icon
+*/
+.brushIcon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/brush.png')
+}
+
+.eraserIcon {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url('images/eraser.png')
+}
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.html
new file mode 100644
index 0000000..13028ef
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.js
new file mode 100644
index 0000000..6cb3bf2
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/scrawl/scrawl.js
@@ -0,0 +1,682 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-5-22
+ * Time: 上午11:38
+ * To change this template use File | Settings | File Templates.
+ */
+var scrawl = function (options) {
+ options && this.initOptions(options);
+};
+(function () {
+ var canvas = $G("J_brushBoard"),
+ context = canvas.getContext('2d'),
+ drawStep = [], //undo redo存储
+ drawStepIndex = 0; //undo redo指针
+
+ scrawl.prototype = {
+ isScrawl: false, //是否涂鸦
+ brushWidth: -1, //画笔粗细
+ brushColor: "", //画笔颜色
+
+ initOptions: function (options) {
+ var me = this;
+ me.originalState(options);//初始页面状态
+ me._buildToolbarColor(options.colorList);//动态生成颜色选择集合
+
+ me._addBoardListener(options.saveNum);//添加画板处理
+ me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理
+ me._addColorBarListener();//添加颜色选择处理
+ me._addBrushBarListener();//添加画笔大小处理
+ me._addEraserBarListener();//添加橡皮大小处理
+ me._addAddImgListener();//添加增添背景图片处理
+ me._addRemoveImgListenter();//删除背景图片处理
+ me._addScalePicListenter();//添加缩放处理
+ me._addClearSelectionListenter();//添加清楚选中状态处理
+
+ me._originalColorSelect(options.drawBrushColor);//初始化颜色选中
+ me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中
+ me._clearSelection();//清楚选中状态
+ },
+
+ originalState: function (options) {
+ var me = this;
+
+ me.brushWidth = options.drawBrushSize;//同步画笔粗细
+ me.brushColor = options.drawBrushColor;//同步画笔颜色
+
+ context.lineWidth = me.brushWidth;//初始画笔大小
+ context.strokeStyle = me.brushColor;//初始画笔颜色
+ context.fillStyle = "transparent";//初始画布背景颜色
+ context.lineCap = "round";//去除锯齿
+ context.fill();
+ },
+ _buildToolbarColor: function (colorList) {
+ var tmp = null, arr = [];
+ arr.push("
");
+ for (var i = 0, color; color = colorList[i++];) {
+ if ((i - 1) % 5 == 0) {
+ if (i != 1) {
+ arr.push("");
+ }
+ arr.push("");
+ }
+ tmp = '#' + color;
+ arr.push(" | ");
+ }
+ arr.push("
");
+ $G("J_colorBar").innerHTML = arr.join("");
+ },
+
+ _addBoardListener: function (saveNum) {
+ var me = this,
+ margin = 0,
+ startX = -1,
+ startY = -1,
+ isMouseDown = false,
+ isMouseMove = false,
+ isMouseUp = false,
+ buttonPress = 0, button, flag = '';
+
+ margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left"));
+ drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
+ drawStepIndex += 1;
+
+ domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) {
+ button = browser.webkit ? e.which : buttonPress;
+ switch (e.type) {
+ case 'mousedown':
+ buttonPress = 1;
+ flag = 1;
+ isMouseDown = true;
+ isMouseUp = false;
+ isMouseMove = false;
+ me.isScrawl = true;
+ startX = e.clientX - margin;//10为外边距总和
+ startY = e.clientY - margin;
+ context.beginPath();
+ break;
+ case 'mousemove' :
+ if (!flag && button == 0) {
+ return;
+ }
+ if (!flag && button) {
+ startX = e.clientX - margin;//10为外边距总和
+ startY = e.clientY - margin;
+ context.beginPath();
+ flag = 1;
+ }
+ if (isMouseUp || !isMouseDown) {
+ return;
+ }
+ var endX = e.clientX - margin,
+ endY = e.clientY - margin;
+
+ context.moveTo(startX, startY);
+ context.lineTo(endX, endY);
+ context.stroke();
+ startX = endX;
+ startY = endY;
+ isMouseMove = true;
+ break;
+ case 'mouseup':
+ buttonPress = 0;
+ if (!isMouseDown) return;
+ if (!isMouseMove) {
+ context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false);
+ context.fillStyle = context.strokeStyle;
+ context.fill();
+ }
+ context.closePath();
+ me._saveOPerate(saveNum);
+ isMouseDown = false;
+ isMouseMove = false;
+ isMouseUp = true;
+ startX = -1;
+ startY = -1;
+ break;
+ case 'mouseout':
+ flag = '';
+ buttonPress = 0;
+ if (button == 1) return;
+ context.closePath();
+ break;
+ }
+ });
+ },
+ _addOPerateListener: function (saveNum) {
+ var me = this;
+ domUtils.on($G("J_previousStep"), "click", function () {
+ if (drawStepIndex > 1) {
+ drawStepIndex -= 1;
+ context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+ context.putImageData(drawStep[drawStepIndex - 1], 0, 0);
+ me.btn2Highlight("J_nextStep");
+ drawStepIndex == 1 && me.btn2disable("J_previousStep");
+ }
+ });
+ domUtils.on($G("J_nextStep"), "click", function () {
+ if (drawStepIndex > 0 && drawStepIndex < drawStep.length) {
+ context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+ context.putImageData(drawStep[drawStepIndex], 0, 0);
+ drawStepIndex += 1;
+ me.btn2Highlight("J_previousStep");
+ drawStepIndex == drawStep.length && me.btn2disable("J_nextStep");
+ }
+ });
+ domUtils.on($G("J_clearBoard"), "click", function () {
+ context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+ drawStep = [];
+ me._saveOPerate(saveNum);
+ drawStepIndex = 1;
+ me.isScrawl = false;
+ me.btn2disable("J_previousStep");
+ me.btn2disable("J_nextStep");
+ me.btn2disable("J_clearBoard");
+ });
+ },
+ _addColorBarListener: function () {
+ var me = this;
+ domUtils.on($G("J_colorBar"), "click", function (e) {
+ var target = me.getTarget(e),
+ color = target.title;
+ if (!!color) {
+ me._addColorSelect(target);
+
+ me.brushColor = color;
+ context.globalCompositeOperation = "source-over";
+ context.lineWidth = me.brushWidth;
+ context.strokeStyle = color;
+ }
+ });
+ },
+ _addBrushBarListener: function () {
+ var me = this;
+ domUtils.on($G("J_brushBar"), "click", function (e) {
+ var target = me.getTarget(e),
+ size = browser.ie ? target.innerText : target.text;
+ if (!!size) {
+ me._addBESelect(target);
+
+ context.globalCompositeOperation = "source-over";
+ context.lineWidth = parseInt(size);
+ context.strokeStyle = me.brushColor;
+ me.brushWidth = context.lineWidth;
+ }
+ });
+ },
+ _addEraserBarListener: function () {
+ var me = this;
+ domUtils.on($G("J_eraserBar"), "click", function (e) {
+ var target = me.getTarget(e),
+ size = browser.ie ? target.innerText : target.text;
+ if (!!size) {
+ me._addBESelect(target);
+
+ context.lineWidth = parseInt(size);
+ context.globalCompositeOperation = "destination-out";
+ context.strokeStyle = "#FFF";
+ }
+ });
+ },
+ _addAddImgListener: function () {
+ var file = $G("J_imgTxt");
+ if (!window.FileReader) {
+ $G("J_addImg").style.display = 'none';
+ $G("J_removeImg").style.display = 'none';
+ $G("J_sacleBoard").style.display = 'none';
+ }
+ domUtils.on(file, "change", function (e) {
+ var frm = file.parentNode;
+ addMaskLayer(lang.backgroundUploading);
+
+ var target = e.target || e.srcElement,
+ reader = new FileReader();
+ reader.onload = function (evt) {
+ var target = evt.target || evt.srcElement;
+ ue_callback(target.result, 'SUCCESS');
+ };
+ reader.readAsDataURL(target.files[0]);
+ frm.reset();
+ });
+ },
+ _addRemoveImgListenter: function () {
+ var me = this;
+ domUtils.on($G("J_removeImg"), "click", function () {
+ $G("J_picBoard").innerHTML = "";
+ me.btn2disable("J_removeImg");
+ me.btn2disable("J_sacleBoard");
+ });
+ },
+ _addScalePicListenter: function () {
+ domUtils.on($G("J_sacleBoard"), "click", function () {
+ var picBoard = $G("J_picBoard"),
+ scaleCon = $G("J_scaleCon"),
+ img = picBoard.children[0];
+
+ if (img) {
+ if (!scaleCon) {
+ picBoard.style.cssText = "position:relative;z-index:999;" + picBoard.style.cssText;
+ img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;";
+ var scale = new ScaleBoy();
+ picBoard.appendChild(scale.init());
+ scale.startScale(img);
+ } else {
+ if (scaleCon.style.visibility == "visible") {
+ scaleCon.style.visibility = "hidden";
+ picBoard.style.position = "";
+ picBoard.style.zIndex = "";
+ } else {
+ scaleCon.style.visibility = "visible";
+ picBoard.style.cssText += "position:relative;z-index:999";
+ }
+ }
+ }
+ });
+ },
+ _addClearSelectionListenter: function () {
+ var doc = document;
+ domUtils.on(doc, 'mousemove', function (e) {
+ if (browser.ie && browser.version < 11)
+ doc.selection.clear();
+ else
+ window.getSelection().removeAllRanges();
+ });
+ },
+ _clearSelection: function () {
+ var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"];
+ for (var i = 0, group; group = list[i++];) {
+ domUtils.unSelectable($G(group));
+ }
+ },
+
+ _saveOPerate: function (saveNum) {
+ var me = this;
+ if (drawStep.length <= saveNum) {
+ if (drawStepIndex < drawStep.length) {
+ me.btn2disable("J_nextStep");
+ drawStep.splice(drawStepIndex);
+ }
+ drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
+ drawStepIndex = drawStep.length;
+ } else {
+ drawStep.shift();
+ drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
+ drawStepIndex = drawStep.length;
+ }
+ me.btn2Highlight("J_previousStep");
+ me.btn2Highlight("J_clearBoard");
+ },
+
+ _originalColorSelect: function (title) {
+ var colorList = $G("J_colorList").getElementsByTagName("td");
+ for (var j = 0, cell; cell = colorList[j++];) {
+ if (cell.children[0].title.toLowerCase() == title) {
+ cell.children[0].style.opacity = 1;
+ }
+ }
+ },
+ _originalBrushSelect: function (text) {
+ var brushList = $G("J_brushBar").children;
+ for (var i = 0, ele; ele = brushList[i++];) {
+ if (ele.tagName.toLowerCase() == "a") {
+ var size = browser.ie ? ele.innerText : ele.text;
+ if (size.toLowerCase() == text) {
+ ele.style.opacity = 1;
+ }
+ }
+ }
+ },
+ _addColorSelect: function (target) {
+ var me = this,
+ colorList = $G("J_colorList").getElementsByTagName("td"),
+ eraserList = $G("J_eraserBar").children,
+ brushList = $G("J_brushBar").children;
+
+ for (var i = 0, cell; cell = colorList[i++];) {
+ cell.children[0].style.opacity = 0.3;
+ }
+ for (var k = 0, ele; ele = brushList[k++];) {
+ if (ele.tagName.toLowerCase() == "a") {
+ ele.style.opacity = 0.3;
+ var size = browser.ie ? ele.innerText : ele.text;
+ if (size.toLowerCase() == this.brushWidth) {
+ ele.style.opacity = 1;
+ }
+ }
+ }
+ for (var j = 0, node; node = eraserList[j++];) {
+ if (node.tagName.toLowerCase() == "a") {
+ node.style.opacity = 0.3;
+ }
+ }
+
+ target.style.opacity = 1;
+ target.blur();
+ },
+ _addBESelect: function (target) {
+ var brushList = $G("J_brushBar").children;
+ var eraserList = $G("J_eraserBar").children;
+
+ for (var i = 0, ele; ele = brushList[i++];) {
+ if (ele.tagName.toLowerCase() == "a") {
+ ele.style.opacity = 0.3;
+ }
+ }
+ for (var j = 0, node; node = eraserList[j++];) {
+ if (node.tagName.toLowerCase() == "a") {
+ node.style.opacity = 0.3;
+ }
+ }
+
+ target.style.opacity = 1;
+ target.blur();
+ },
+ getCanvasData: function () {
+ var picContainer = $G("J_picBoard"),
+ img = picContainer.children[0];
+ if (img) {
+ var x, y;
+ if (img.style.position == "absolute") {
+ x = parseInt(img.style.left);
+ y = parseInt(img.style.top);
+ } else {
+ x = (picContainer.offsetWidth - img.width) / 2;
+ y = (picContainer.offsetHeight - img.height) / 2;
+ }
+ context.globalCompositeOperation = "destination-over";
+ context.drawImage(img, x, y, img.width, img.height);
+ } else {
+ context.globalCompositeOperation = "destination-atop";
+ context.fillStyle = "#fff";//重置画布背景白色
+ context.fillRect(0, 0, canvas.width, canvas.height);
+ }
+ try {
+ return canvas.toDataURL("image/png").substring(22);
+ } catch (e) {
+ return "";
+ }
+ },
+ btn2Highlight: function (id) {
+ var cur = $G(id);
+ cur.className.indexOf("H") == -1 && (cur.className += "H");
+ },
+ btn2disable: function (id) {
+ var cur = $G(id);
+ cur.className.indexOf("H") != -1 && (cur.className = cur.className.replace("H", ""));
+ },
+ getTarget: function (evt) {
+ return evt.target || evt.srcElement;
+ }
+ };
+})();
+
+var ScaleBoy = function () {
+ this.dom = null;
+ this.scalingElement = null;
+};
+(function () {
+ function _appendStyle() {
+ var doc = document,
+ head = doc.getElementsByTagName('head')[0],
+ style = doc.createElement('style'),
+ cssText = '.scale{visibility:hidden;cursor:move;position:absolute;left:0;top:0;width:100px;height:50px;background-color:#fff;font-size:0;line-height:0;opacity:.4;filter:Alpha(opacity=40);}'
+ + '.scale span{position:absolute;left:0;top:0;width:6px;height:6px;background-color:#006DAE;}'
+ + '.scale .hand0, .scale .hand7{cursor:nw-resize;}'
+ + '.scale .hand1, .scale .hand6{left:50%;margin-left:-3px;cursor:n-resize;}'
+ + '.scale .hand2, .scale .hand4, .scale .hand7{left:100%;margin-left:-6px;}'
+ + '.scale .hand3, .scale .hand4{top:50%;margin-top:-3px;cursor:w-resize;}'
+ + '.scale .hand5, .scale .hand6, .scale .hand7{margin-top:-6px;top:100%;}'
+ + '.scale .hand2, .scale .hand5{cursor:ne-resize;}';
+ style.type = 'text/css';
+
+ try {
+ style.appendChild(doc.createTextNode(cssText));
+ } catch (e) {
+ style.styleSheet.cssText = cssText;
+ }
+ head.appendChild(style);
+ }
+
+ function _getDom() {
+ var doc = document,
+ hand,
+ arr = [],
+ scale = doc.createElement('div');
+
+ scale.id = 'J_scaleCon';
+ scale.className = 'scale';
+ for (var i = 0; i < 8; i++) {
+ arr.push("
");
+ }
+ scale.innerHTML = arr.join("");
+ return scale;
+ }
+
+ var rect = [
+ //[left, top, width, height]
+ [1, 1, -1, -1],
+ [0, 1, 0, -1],
+ [0, 1, 1, -1],
+ [1, 0, -1, 0],
+ [0, 0, 1, 0],
+ [1, 0, -1, 1],
+ [0, 0, 0, 1],
+ [0, 0, 1, 1]
+ ];
+ ScaleBoy.prototype = {
+ init: function () {
+ _appendStyle();
+ var me = this,
+ scale = me.dom = _getDom();
+
+ me.scaleMousemove.fp = me;
+ domUtils.on(scale, 'mousedown', function (e) {
+ var target = e.target || e.srcElement;
+ me.start = {x: e.clientX, y: e.clientY};
+ if (target.className.indexOf('hand') != -1) {
+ me.dir = target.className.replace('hand', '');
+ }
+ domUtils.on(document.body, 'mousemove', me.scaleMousemove);
+ e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
+ });
+ domUtils.on(document.body, 'mouseup', function (e) {
+ if (me.start) {
+ domUtils.un(document.body, 'mousemove', me.scaleMousemove);
+ if (me.moved) {
+ me.updateScaledElement({
+ position: {x: scale.style.left, y: scale.style.top},
+ size: {w: scale.style.width, h: scale.style.height}
+ });
+ }
+ delete me.start;
+ delete me.moved;
+ delete me.dir;
+ }
+ });
+ return scale;
+ },
+ startScale: function (objElement) {
+ var me = this, Idom = me.dom;
+
+ Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;';
+ me.scalingElement = objElement;
+ },
+ updateScaledElement: function (objStyle) {
+ var cur = this.scalingElement,
+ pos = objStyle.position,
+ size = objStyle.size;
+ if (pos) {
+ typeof pos.x != 'undefined' && (cur.style.left = pos.x);
+ typeof pos.y != 'undefined' && (cur.style.top = pos.y);
+ }
+ if (size) {
+ size.w && (cur.style.width = size.w);
+ size.h && (cur.style.height = size.h);
+ }
+ },
+ updateStyleByDir: function (dir, offset) {
+ var me = this,
+ dom = me.dom, tmp;
+
+ rect['def'] = [1, 1, 0, 0];
+ if (rect[dir][0] != 0) {
+ tmp = parseInt(dom.style.left) + offset.x;
+ dom.style.left = me._validScaledProp('left', tmp) + 'px';
+ }
+ if (rect[dir][1] != 0) {
+ tmp = parseInt(dom.style.top) + offset.y;
+ dom.style.top = me._validScaledProp('top', tmp) + 'px';
+ }
+ if (rect[dir][2] != 0) {
+ tmp = dom.clientWidth + rect[dir][2] * offset.x;
+ dom.style.width = me._validScaledProp('width', tmp) + 'px';
+ }
+ if (rect[dir][3] != 0) {
+ tmp = dom.clientHeight + rect[dir][3] * offset.y;
+ dom.style.height = me._validScaledProp('height', tmp) + 'px';
+ }
+ if (dir === 'def') {
+ me.updateScaledElement({position: {x: dom.style.left, y: dom.style.top}});
+ }
+ },
+ scaleMousemove: function (e) {
+ var me = arguments.callee.fp,
+ start = me.start,
+ dir = me.dir || 'def',
+ offset = {x: e.clientX - start.x, y: e.clientY - start.y};
+
+ me.updateStyleByDir(dir, offset);
+ arguments.callee.fp.start = {x: e.clientX, y: e.clientY};
+ arguments.callee.fp.moved = 1;
+ },
+ _validScaledProp: function (prop, value) {
+ var ele = this.dom,
+ wrap = $G("J_picBoard");
+
+ value = isNaN(value) ? 0 : value;
+ switch (prop) {
+ case 'left':
+ return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;
+ case 'top':
+ return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;
+ case 'width':
+ return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;
+ case 'height':
+ return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;
+ }
+ }
+ };
+})();
+
+//后台回调
+function ue_callback(url, state) {
+ var doc = document,
+ picBorard = $G("J_picBoard"),
+ img = doc.createElement("img");
+
+ //图片缩放
+ function scale(img, max, oWidth, oHeight) {
+ var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;
+ if (ow > max || oh > max) {
+ if (ow >= oh) {
+ if (width = ow - max) {
+ percent = (width / ow).toFixed(2);
+ img.height = oh - oh * percent;
+ img.width = max;
+ }
+ } else {
+ if (height = oh - max) {
+ percent = (height / oh).toFixed(2);
+ img.width = ow - ow * percent;
+ img.height = max;
+ }
+ }
+ }
+ }
+
+ //移除遮罩层
+ removeMaskLayer();
+ //状态响应
+ if (state == "SUCCESS") {
+ picBorard.innerHTML = "";
+ img.onload = function () {
+ scale(this, 300);
+ picBorard.appendChild(img);
+
+ var obj = new scrawl();
+ obj.btn2Highlight("J_removeImg");
+ //trace 2457
+ obj.btn2Highlight("J_sacleBoard");
+ };
+ img.src = url;
+ } else {
+ alert(state);
+ }
+}
+
+//去掉遮罩层
+function removeMaskLayer() {
+ var maskLayer = $G("J_maskLayer");
+ maskLayer.className = "maskLayerNull";
+ maskLayer.innerHTML = "";
+ dialog.buttons[0].setDisabled(false);
+}
+
+//添加遮罩层
+function addMaskLayer(html) {
+ var maskLayer = $G("J_maskLayer");
+ dialog.buttons[0].setDisabled(true);
+ maskLayer.className = "maskLayer";
+ maskLayer.innerHTML = html;
+}
+
+//执行确认按钮方法
+function exec(scrawlObj) {
+ if (scrawlObj.isScrawl) {
+ addMaskLayer(lang.scrawlUpLoading);
+ var base64 = scrawlObj.getCanvasData();
+ if (!!base64) {
+ var options = {
+ timeout: 100000,
+ headers: editor.options.serverHeaders || {},
+ onsuccess: function (xhr) {
+ if (!scrawlObj.isCancelScrawl) {
+ var responseObj;
+ responseObj = eval("(" + xhr.responseText + ")");
+ if (responseObj.state === "SUCCESS") {
+ var imgObj = {},
+ url = editor.options.scrawlUrlPrefix + responseObj.url;
+ imgObj.src = url;
+ imgObj._src = url;
+ imgObj.alt = responseObj.original || '';
+ editor.execCommand("insertImage", imgObj);
+ dialog.close();
+ // 触发上传涂鸦事件
+ editor.fireEvent("uploadsuccess", {
+ res: responseObj,
+ type: 'scrawl'
+ });
+ } else {
+ alert(responseObj.state);
+ }
+
+ }
+ },
+ onerror: function () {
+ alert(lang.imageError);
+ dialog.close();
+ }
+ };
+ options[editor.getOpt('scrawlFieldName')] = base64;
+
+ var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')),
+ params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+ url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + params);
+ ajax.request(url, options);
+ }
+ } else {
+ addMaskLayer(lang.noScarwl + "
");
+ }
+}
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/searchreplace/searchreplace.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/searchreplace/searchreplace.html
new file mode 100644
index 0000000..47fe568
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/searchreplace/searchreplace.html
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/searchreplace/searchreplace.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/searchreplace/searchreplace.js
new file mode 100644
index 0000000..c0ce80a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/searchreplace/searchreplace.js
@@ -0,0 +1,174 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-9-26
+ * Time: 下午12:29
+ * To change this template use File | Settings | File Templates.
+ */
+
+//清空上次查选的痕迹
+editor.firstForSR = 0;
+editor.currentRangeForSR = null;
+
+//给tab注册切换事件
+/**
+ * tab点击处理事件
+ * @param tabHeads
+ * @param tabBodys
+ * @param obj
+ */
+function clickHandler(tabHeads, tabBodys, obj) {
+ //head样式更改
+ for (var k = 0, len = tabHeads.length; k < len; k++) {
+ tabHeads[k].className = "";
+ }
+ obj.className = "focus";
+ //body显隐
+ var tabSrc = obj.getAttribute("tabSrc");
+ for (var j = 0, length = tabBodys.length; j < length; j++) {
+ var body = tabBodys[j],
+ id = body.getAttribute("id");
+ if (id != tabSrc) {
+ body.style.zIndex = 1;
+ } else {
+ body.style.zIndex = 200;
+ }
+ }
+
+}
+
+/**
+ * TAB切换
+ * @param tabParentId tab的父节点ID或者对象本身
+ */
+function switchTab(tabParentId) {
+ var tabElements = $G(tabParentId).children,
+ tabHeads = tabElements[0].children,
+ tabBodys = tabElements[1].children;
+
+ for (var i = 0, length = tabHeads.length; i < length; i++) {
+ var head = tabHeads[i];
+ if (head.className === "focus") clickHandler(tabHeads, tabBodys, head);
+ head.onclick = function () {
+ clickHandler(tabHeads, tabBodys, this);
+ }
+ }
+}
+
+$G('searchtab').onmousedown = function () {
+ $G('search-msg').innerHTML = '';
+ $G('replace-msg').innerHTML = ''
+}
+
+//是否区分大小写
+function getMatchCase(id) {
+ return $G(id).checked ? true : false;
+}
+
+//查找
+$G("nextFindBtn").onclick = function (txt, dir, mcase) {
+ var findtxt = $G("findtxt").value, obj;
+ if (!findtxt) {
+ return false;
+ }
+ obj = {
+ searchStr: findtxt,
+ dir: 1,
+ casesensitive: getMatchCase("matchCase")
+ };
+ if (!frCommond(obj)) {
+ var bk = editor.selection.getRange().createBookmark();
+ $G('search-msg').innerHTML = lang.getEnd;
+ editor.selection.getRange().moveToBookmark(bk).select();
+
+
+ }
+};
+$G("nextReplaceBtn").onclick = function (txt, dir, mcase) {
+ var findtxt = $G("findtxt1").value, obj;
+ if (!findtxt) {
+ return false;
+ }
+ obj = {
+ searchStr: findtxt,
+ dir: 1,
+ casesensitive: getMatchCase("matchCase1")
+ };
+ frCommond(obj);
+};
+$G("preFindBtn").onclick = function (txt, dir, mcase) {
+ var findtxt = $G("findtxt").value, obj;
+ if (!findtxt) {
+ return false;
+ }
+ obj = {
+ searchStr: findtxt,
+ dir: -1,
+ casesensitive: getMatchCase("matchCase")
+ };
+ if (!frCommond(obj)) {
+ $G('search-msg').innerHTML = lang.getStart;
+ }
+};
+$G("preReplaceBtn").onclick = function (txt, dir, mcase) {
+ var findtxt = $G("findtxt1").value, obj;
+ if (!findtxt) {
+ return false;
+ }
+ obj = {
+ searchStr: findtxt,
+ dir: -1,
+ casesensitive: getMatchCase("matchCase1")
+ };
+ frCommond(obj);
+};
+//替换
+$G("repalceBtn").onclick = function () {
+ editor.trigger('clearLastSearchResult');
+ var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj,
+ replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, "");
+ if (!findtxt) {
+ return false;
+ }
+ if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {
+ return false;
+ }
+ obj = {
+ searchStr: findtxt,
+ dir: 1,
+ casesensitive: getMatchCase("matchCase1"),
+ replaceStr: replacetxt
+ };
+ frCommond(obj);
+};
+//全部替换
+$G("repalceAllBtn").onclick = function () {
+ var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj,
+ replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, "");
+ if (!findtxt) {
+ return false;
+ }
+ if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {
+ return false;
+ }
+ obj = {
+ searchStr: findtxt,
+ casesensitive: getMatchCase("matchCase1"),
+ replaceStr: replacetxt,
+ all: true
+ };
+ var num = frCommond(obj);
+ if (num) {
+ $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num);
+ }
+};
+//执行
+var frCommond = function (obj) {
+ return editor.execCommand("searchreplace", obj);
+};
+switchTab("searchtab");
+
+
+dialog.onclose = function () {
+ editor.trigger('clearLastSearchResult')
+};
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/spechars/spechars.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/spechars/spechars.html
new file mode 100644
index 0000000..6cfcc83
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/spechars/spechars.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/spechars/spechars.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/spechars/spechars.js
new file mode 100644
index 0000000..be1902d
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/spechars/spechars.js
@@ -0,0 +1,86 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-9-26
+ * Time: 下午1:09
+ * To change this template use File | Settings | File Templates.
+ */
+var charsContent = [
+ {
+ name: "tsfh",
+ title: lang.tsfh,
+ content: toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")
+ },
+ {name: "lmsz", title: lang.lmsz, content: toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")},
+ {
+ name: "szfh",
+ title: lang.szfh,
+ content: toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")
+ },
+ {
+ name: "rwfh",
+ title: lang.rwfh,
+ content: toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")
+ },
+ {
+ name: "xlzm",
+ title: lang.xlzm,
+ content: toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")
+ },
+ {
+ name: "ewzm",
+ title: lang.ewzm,
+ content: toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")
+ },
+ {name: "pyzm", title: lang.pyzm, content: toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")},
+ {
+ name: "yyyb",
+ title: lang.yyyb,
+ content: toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,")
+ },
+ {
+ name: "zyzf",
+ title: lang.zyzf,
+ content: toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")
+ }
+];
+(function createTab(content) {
+ for (var i = 0, ci; ci = content[i++];) {
+ var span = document.createElement("span");
+ span.setAttribute("tabSrc", ci.name);
+ span.innerHTML = ci.title;
+ if (i == 1) span.className = "focus";
+ domUtils.on(span, "click", function () {
+ var tmps = $G("tabHeads").children;
+ for (var k = 0, sk; sk = tmps[k++];) {
+ sk.className = "";
+ }
+ tmps = $G("tabBodys").children;
+ for (var k = 0, sk; sk = tmps[k++];) {
+ sk.style.display = "none";
+ }
+ this.className = "focus";
+ $G(this.getAttribute("tabSrc")).style.display = "";
+ });
+ $G("tabHeads").appendChild(span);
+ domUtils.insertAfter(span, document.createTextNode("\n"));
+ var div = document.createElement("div");
+ div.id = ci.name;
+ div.style.display = (i == 1) ? "" : "none";
+ var cons = ci.content;
+ for (var j = 0, con; con = cons[j++];) {
+ var charSpan = document.createElement("span");
+ charSpan.innerHTML = con;
+ domUtils.on(charSpan, "click", function () {
+ editor.execCommand("insertHTML", this.innerHTML);
+ dialog.close();
+ });
+ div.appendChild(charSpan);
+ }
+ $G("tabBodys").appendChild(div);
+ }
+})(charsContent);
+
+function toArray(str) {
+ return str.split(",");
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/dragicon.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/dragicon.png
new file mode 100644
index 0000000..f26203b
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/dragicon.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.css
new file mode 100644
index 0000000..241849b
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.css
@@ -0,0 +1,85 @@
+body {
+ overflow: hidden;
+ width: 540px;
+}
+
+.wrapper {
+ margin: 10px auto 0;
+ font-size: 12px;
+ overflow: hidden;
+ width: 520px;
+ height: 315px;
+}
+
+.clear {
+ clear: both;
+}
+
+.wrapper .left {
+ float: left;
+ margin-left: 10px;;
+}
+
+.wrapper .right {
+ float: right;
+ border-left: 2px dotted #EDEDED;
+ padding-left: 15px;
+}
+
+.section {
+ margin-bottom: 15px;
+ width: 240px;
+ overflow: hidden;
+}
+
+.section h3 {
+ font-weight: bold;
+ padding: 5px 0;
+ margin-bottom: 10px;
+ border-bottom: 1px solid #EDEDED;
+ font-size: 12px;
+}
+
+.section ul {
+ list-style: none;
+ overflow: hidden;
+ clear: both;
+
+}
+
+.section li {
+ float: left;
+ width: 120px;;
+}
+
+.section .tone {
+ width: 80px;;
+}
+
+.section .preview {
+ width: 220px;
+}
+
+.section .preview table {
+ text-align: center;
+ vertical-align: middle;
+ color: #666;
+}
+
+.section .preview caption {
+ font-weight: bold;
+}
+
+.section .preview td {
+ border-width: 1px;
+ border-style: solid;
+ height: 22px;
+}
+
+.section .preview th {
+ border-style: solid;
+ border-color: #DDD;
+ border-width: 2px 1px 1px 1px;
+ height: 22px;
+ background-color: #F7F7F7;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.html
new file mode 100644
index 0000000..bb53d0a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.js
new file mode 100644
index 0000000..bb20953
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittable.js
@@ -0,0 +1,241 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-12-19
+ * Time: 下午4:55
+ * To change this template use File | Settings | File Templates.
+ */
+(function () {
+ var title = $G("J_title"),
+ titleCol = $G("J_titleCol"),
+ caption = $G("J_caption"),
+ sorttable = $G("J_sorttable"),
+ autoSizeContent = $G("J_autoSizeContent"),
+ autoSizePage = $G("J_autoSizePage"),
+ tone = $G("J_tone"),
+ me,
+ preview = $G("J_preview");
+
+ var editTable = function () {
+ me = this;
+ me.init();
+ };
+ editTable.prototype = {
+ init: function () {
+ var colorPiker = new UE.ui.ColorPicker({
+ editor: editor
+ }),
+ colorPop = new UE.ui.Popup({
+ editor: editor,
+ content: colorPiker
+ });
+
+ title.checked = editor.queryCommandState("inserttitle") == -1;
+ titleCol.checked = editor.queryCommandState("inserttitlecol") == -1;
+ caption.checked = editor.queryCommandState("insertcaption") == -1;
+ sorttable.checked = editor.queryCommandState("enablesort") == 1;
+
+ var enablesortState = editor.queryCommandState("enablesort"),
+ disablesortState = editor.queryCommandState("disablesort");
+
+ sorttable.checked = !!(enablesortState < 0 && disablesortState >= 0);
+ sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0);
+ sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg : '';
+
+ me.createTable(title.checked, titleCol.checked, caption.checked);
+ me.setAutoSize();
+ me.setColor(me.getColor());
+
+ domUtils.on(title, "click", me.titleHanler);
+ domUtils.on(titleCol, "click", me.titleColHanler);
+ domUtils.on(caption, "click", me.captionHanler);
+ domUtils.on(sorttable, "click", me.sorttableHanler);
+ domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler);
+ domUtils.on(autoSizePage, "click", me.autoSizePageHanler);
+
+ domUtils.on(tone, "click", function () {
+ colorPop.showAnchor(tone);
+ });
+ domUtils.on(document, 'mousedown', function () {
+ colorPop.hide();
+ });
+ colorPiker.addListener("pickcolor", function () {
+ me.setColor(arguments[1]);
+ colorPop.hide();
+ });
+ colorPiker.addListener("picknocolor", function () {
+ me.setColor("");
+ colorPop.hide();
+ });
+ },
+
+ createTable: function (hasTitle, hasTitleCol, hasCaption) {
+ var arr = [],
+ sortSpan = '
^';
+ arr.push("
");
+ if (hasCaption) {
+ arr.push("" + lang.captionName + "")
+ }
+ if (hasTitle) {
+ arr.push("");
+ if (hasTitleCol) {
+ arr.push("| " + lang.titleName + " | ");
+ }
+ for (var j = 0; j < 5; j++) {
+ arr.push("" + lang.titleName + " | ");
+ }
+ arr.push("
");
+ }
+ for (var i = 0; i < 6; i++) {
+ arr.push("");
+ if (hasTitleCol) {
+ arr.push("| " + lang.titleName + " | ")
+ }
+ for (var k = 0; k < 5; k++) {
+ arr.push("" + lang.cellsName + " | ")
+ }
+ arr.push("
");
+ }
+ arr.push("
");
+ preview.innerHTML = arr.join("");
+ this.updateSortSpan();
+ },
+ titleHanler: function () {
+ var example = $G("J_example"),
+ frg = document.createDocumentFragment(),
+ color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"),
+ colCount = example.rows[0].children.length;
+
+ if (title.checked) {
+ example.insertRow(0);
+ for (var i = 0, node; i < colCount; i++) {
+ node = document.createElement("th");
+ node.innerHTML = lang.titleName;
+ frg.appendChild(node);
+ }
+ example.rows[0].appendChild(frg);
+
+ } else {
+ domUtils.remove(example.rows[0]);
+ }
+ me.setColor(color);
+ me.updateSortSpan();
+ },
+ titleColHanler: function () {
+ var example = $G("J_example"),
+ color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"),
+ colArr = example.rows,
+ colCount = colArr.length;
+
+ if (titleCol.checked) {
+ for (var i = 0, node; i < colCount; i++) {
+ node = document.createElement("th");
+ node.innerHTML = lang.titleName;
+ colArr[i].insertBefore(node, colArr[i].children[0]);
+ }
+ } else {
+ for (var i = 0; i < colCount; i++) {
+ domUtils.remove(colArr[i].children[0]);
+ }
+ }
+ me.setColor(color);
+ me.updateSortSpan();
+ },
+ captionHanler: function () {
+ var example = $G("J_example");
+ if (caption.checked) {
+ var row = document.createElement('caption');
+ row.innerHTML = lang.captionName;
+ example.insertBefore(row, example.firstChild);
+ } else {
+ domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]);
+ }
+ },
+ sorttableHanler: function () {
+ me.updateSortSpan();
+ },
+ autoSizeContentHanler: function () {
+ var example = $G("J_example");
+ example.removeAttribute("width");
+ },
+ autoSizePageHanler: function () {
+ var example = $G("J_example");
+ var tds = example.getElementsByTagName(example, "td");
+ utils.each(tds, function (td) {
+ td.removeAttribute("width");
+ });
+ example.setAttribute('width', '100%');
+ },
+ updateSortSpan: function () {
+ var example = $G("J_example"),
+ row = example.rows[0];
+
+ var spans = domUtils.getElementsByTagName(example, "span");
+ utils.each(spans, function (span) {
+ span.parentNode.removeChild(span);
+ });
+ if (sorttable.checked) {
+ utils.each(row.cells, function (cell, i) {
+ var span = document.createElement("span");
+ span.innerHTML = "^";
+ cell.appendChild(span);
+ });
+ }
+ },
+ getColor: function () {
+ var start = editor.selection.getStart(), color,
+ cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true);
+ color = cell && domUtils.getComputedStyle(cell, "border-color");
+ if (!color) color = "#DDDDDD";
+ return color;
+ },
+ setColor: function (color) {
+ var example = $G("J_example"),
+ arr = domUtils.getElementsByTagName(example, "td").concat(
+ domUtils.getElementsByTagName(example, "th"),
+ domUtils.getElementsByTagName(example, "caption")
+ );
+
+ tone.value = color;
+ utils.each(arr, function (node) {
+ node.style.borderColor = color;
+ });
+
+ },
+ setAutoSize: function () {
+ var me = this;
+ autoSizePage.checked = true;
+ me.autoSizePageHanler();
+ }
+ };
+
+ new editTable;
+
+ dialog.onok = function () {
+ editor.__hasEnterExecCommand = true;
+
+ var checks = {
+ title: "inserttitle deletetitle",
+ titleCol: "inserttitlecol deletetitlecol",
+ caption: "insertcaption deletecaption",
+ sorttable: "enablesort disablesort"
+ };
+ editor.fireEvent('saveScene');
+ for (var i in checks) {
+ var cmds = checks[i].split(" "),
+ input = $G("J_" + i);
+ if (input["checked"]) {
+ editor.queryCommandState(cmds[0]) != -1 && editor.execCommand(cmds[0]);
+ } else {
+ editor.queryCommandState(cmds[1]) != -1 && editor.execCommand(cmds[1]);
+ }
+ }
+
+ editor.execCommand("edittable", tone.value);
+ autoSizeContent.checked ? editor.execCommand('adaptbytext') : "";
+ autoSizePage.checked ? editor.execCommand("adaptbywindow") : "";
+ editor.fireEvent('saveScene');
+
+ editor.__hasEnterExecCommand = false;
+ };
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittd.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittd.html
new file mode 100644
index 0000000..74ae5ba
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittd.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittip.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittip.html
new file mode 100644
index 0000000..ec58b5b
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/table/edittip.html
@@ -0,0 +1,33 @@
+
+
+
+
表格删除提示
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/config.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/config.js
new file mode 100644
index 0000000..b4cf379
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/config.js
@@ -0,0 +1,42 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-8-8
+ * Time: 下午2:00
+ * To change this template use File | Settings | File Templates.
+ */
+var templates = [
+ {
+ "pre": "pre0.png",
+ 'title': lang.blank,
+ 'preHtml': '
欢迎使用UEditor!
',
+ "html": '
欢迎使用UEditor!
'
+
+ },
+ {
+ "pre": "pre1.png",
+ 'title': lang.blog,
+ 'preHtml': '
深入理解Range
UEditor二次开发
什么是Range
对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。
Range能干什么
在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。
',
+ "html": '
[键入文档标题]
[键入文档副标题]
[标题 1]
对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。
[标题 2]
在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。
[标题 3]
对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。
'
+
+ },
+ {
+ "pre": "pre2.png",
+ 'title': lang.resume,
+ 'preHtml': '
WEB前端开发简历
插
入 照 片 | 联系电话:[键入您的电话]
电子邮件:[键入您的电子邮件地址]
家庭住址:[键入您的地址]
|
目标职位
WEB前端研发工程师
学历
[起止时间] [学校名称] [所学专业] [所获学位]
工作经验
',
+ "html": '
[此处键入简历标题]
| 【此处插入照片】 |
联系电话:[键入您的电话]
电子邮件:[键入您的电子邮件地址]
家庭住址:[键入您的地址]
|
目标职位
[此处键入您的期望职位]
学历
[键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]
[键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]
工作经验
[键入起止时间] [键入公司名称] [键入职位名称]
[键入负责项目] [键入项目简介]
[键入负责项目] [键入项目简介]
[键入起止时间] [键入公司名称] [键入职位名称]
[键入负责项目] [键入项目简介]
掌握技能
[这里可以键入您所掌握的技能]
'
+
+ },
+ {
+ "pre": "pre3.png",
+ 'title': lang.richText,
+ 'preHtml': '
[此处键入文章标题]
图文混排方法
图片居左,文字围绕图片排版
方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文

还有没有什么其他的环绕方式呢?这里是居右环绕
欢迎大家多多尝试,为UEditor提供更多高质量模板!
',
+ "html": '
[此处键入文章标题]
图文混排方法
1. 图片居左,文字围绕图片排版
方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本
2. 图片居右,文字围绕图片排版
方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本
3. 图片居中环绕排版
方法:亲,这个真心没有办法。。。

还有没有什么其他的环绕方式呢?这里是居右环绕
欢迎大家多多尝试,为UEditor提供更多高质量模板!
占位
占位
占位
占位
占位
'
+ },
+ {
+ "pre": "pre4.png",
+ 'title': lang.sciPapers,
+ 'preHtml': '
[键入文章标题]
摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要
标题 1
这里可以输入很多内容,可以图文混排,可以有列表等。
标题 2
列表 1
列表 2
多级列表 1
多级列表 2
列表 3
标题 3
来个文字图文混排的
',
+ 'html': '
[键入文章标题]
摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要
标题 1
这里可以输入很多内容,可以图文混排,可以有列表等。
标题 2
来个列表瞅瞅:
列表 1
列表 2
多级列表 1
多级列表 2
列表 3
标题 3
来个文字图文混排的
这里可以多行
右边是图片
绝对没有问题的,不信你也可以试试看
'
+ }
+];
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/bg.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/bg.gif
new file mode 100644
index 0000000..8c1d10a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/bg.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre0.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre0.png
new file mode 100644
index 0000000..8f3c16a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre0.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre1.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre1.png
new file mode 100644
index 0000000..5a03f96
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre1.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre2.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre2.png
new file mode 100644
index 0000000..5a55672
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre2.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre3.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre3.png
new file mode 100644
index 0000000..d852d29
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre3.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre4.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre4.png
new file mode 100644
index 0000000..0d7bc72
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/images/pre4.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.css
new file mode 100644
index 0000000..f02dd7a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.css
@@ -0,0 +1,99 @@
+.wrap {
+ padding: 5px;
+ font-size: 14px;
+}
+
+.left {
+ width: 425px;
+ float: left;
+}
+
+.right {
+ width: 160px;
+ border: 1px solid #ccc;
+ float: right;
+ padding: 5px;
+ margin-right: 5px;
+}
+
+.right .pre {
+ height: 332px;
+ overflow-y: auto;
+}
+
+.right .preitem {
+ border: white 1px solid;
+ margin: 5px 0;
+ padding: 2px 0;
+}
+
+.right .preitem:hover {
+ background-color: lemonChiffon;
+ cursor: pointer;
+ border: #ccc 1px solid;
+}
+
+.right .preitem img {
+ display: block;
+ margin: 0 auto;
+ width: 100px;
+}
+
+.clear {
+ clear: both;
+}
+
+.top {
+ height: 26px;
+ line-height: 26px;
+ padding: 5px;
+}
+
+.bottom {
+ height: 320px;
+ width: 100%;
+ margin: 0 auto;
+}
+
+.transparent {
+ background: url("images/bg.gif") repeat;
+}
+
+.bottom table tr td {
+ border: 1px dashed #ccc;
+}
+
+#colorPicker {
+ width: 17px;
+ height: 17px;
+ border: 1px solid #CCC;
+ display: inline-block;
+ border-radius: 3px;
+ box-shadow: 2px 2px 5px #D3D6DA;
+}
+
+.border_style1 {
+ padding: 2px;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ box-shadow: 2px 2px 5px #d3d6da;
+}
+
+p {
+ margin: 5px 0
+}
+
+table {
+ clear: both;
+ margin-bottom: 10px;
+ border-collapse: collapse;
+ word-break: break-all;
+}
+
+li {
+ clear: both
+}
+
+ol {
+ padding-left: 40px;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.html
new file mode 100644
index 0000000..21a68b2
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.js
new file mode 100644
index 0000000..937228a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/template/template.js
@@ -0,0 +1,53 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-8-8
+ * Time: 下午2:09
+ * To change this template use File | Settings | File Templates.
+ */
+(function () {
+ var me = editor,
+ preview = $G("preview"),
+ preitem = $G("preitem"),
+ tmps = templates,
+ currentTmp;
+ var initPre = function () {
+ var str = "";
+ for (var i = 0, tmp; tmp = tmps[i++];) {
+ str += '

';
+ }
+ preitem.innerHTML = str;
+ };
+ var pre = function (n) {
+ var tmp = tmps[n - 1];
+ currentTmp = tmp;
+ clearItem();
+ domUtils.setStyles(preitem.childNodes[n - 1], {
+ "background-color": "lemonChiffon",
+ "border": "#ccc 1px solid"
+ });
+ preview.innerHTML = tmp.preHtml ? tmp.preHtml : "";
+ };
+ var clearItem = function () {
+ var items = preitem.children;
+ for (var i = 0, item; item = items[i++];) {
+ domUtils.setStyles(item, {
+ "background-color": "",
+ "border": "white 1px solid"
+ });
+ }
+ };
+ dialog.onok = function () {
+ if (!$G("issave").checked) {
+ me.execCommand("cleardoc");
+ }
+ var obj = {
+ html: currentTmp && currentTmp.html
+ };
+ me.execCommand("template", obj);
+ };
+ initPre();
+ window.pre = pre;
+ pre(2)
+
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/center_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/center_focus.jpg
new file mode 100644
index 0000000..262b029
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/center_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/file-icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/file-icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/file-icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/file-icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/icons.gif
new file mode 100644
index 0000000..78459de
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/image.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/image.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/left_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/left_focus.jpg
new file mode 100644
index 0000000..7886d27
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/left_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/none_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/none_focus.jpg
new file mode 100644
index 0000000..7c768dc
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/none_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/progress.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/progress.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/right_focus.jpg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/right_focus.jpg
new file mode 100644
index 0000000..173e10d
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/right_focus.jpg differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/success.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/success.gif
new file mode 100644
index 0000000..8d4f311
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/success.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/success.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/images/success.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.css
new file mode 100644
index 0000000..8bcd7f3
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.css
@@ -0,0 +1,818 @@
+@charset "utf-8";
+.wrapper {
+ width: 570px;
+ _width: 575px;
+ margin: 10px auto;
+ zoom: 1;
+ position: relative
+}
+
+.tabbody {
+ height: 355px;
+}
+
+.tabbody .panel {
+ position: absolute;
+ width: 0;
+ height: 0;
+ background: #fff;
+ overflow: hidden;
+ display: none;
+}
+
+.tabbody .panel.focus {
+ width: 100%;
+ height: 355px;
+ display: block;
+}
+
+.tabbody .panel table td {
+ vertical-align: middle;
+}
+
+#videoUrl {
+ width: 380px;
+ height: 26px;
+ line-height: 26px;
+ margin: 8px 5px;
+ background: #FFF;
+ border: 1px solid #d7d7d7;
+ outline: none;
+ border-radius: 3px;
+ padding: 0 5px;
+}
+
+#videoSelect {
+ width: 100px;
+ display: inline-block;
+ background: #FFF;
+ border: 1px solid #EEE;
+ line-height: 26px;
+ text-align: center;
+ color: #333;
+ text-decoration: none;
+ border-radius: 3px;
+ vertical-align: middle;
+}
+
+#videoSearchTxt {
+ margin-left: 15px;
+ background: #FFF;
+ width: 200px;
+ height: 21px;
+ line-height: 21px;
+ border: 1px solid #d7d7d7;
+}
+
+#searchList {
+ width: 570px;
+ overflow: auto;
+ zoom: 1;
+ height: 270px;
+}
+
+#searchList div {
+ float: left;
+ width: 120px;
+ height: 135px;
+ margin: 5px 15px;
+}
+
+#searchList img {
+ margin: 2px 8px;
+ cursor: pointer;
+ border: 2px solid #fff
+}
+
+/*不用缩略图*/
+#searchList p {
+ margin-left: 10px;
+}
+
+#videoType {
+ width: 65px;
+ height: 23px;
+ line-height: 22px;
+ border: 1px solid #d7d7d7;
+}
+
+#videoSearchBtn, #videoSearchReset {
+ /*width: 80px;*/
+ height: 25px;
+ line-height: 25px;
+ background: #eee;
+ border: 1px solid #d7d7d7;
+ cursor: pointer;
+ padding: 0 5px;
+}
+
+
+#preview {
+ position: relative;
+ width: 420px;
+ padding: 0;
+ overflow: hidden;
+ margin-left: 10px;
+ _margin-left: 5px;
+ height: 280px;
+ background-color: #ddd;
+ float: left
+}
+
+#preview .previewMsg {
+ position: absolute;
+ top: 0;
+ margin: 0;
+ padding: 0;
+ height: 280px;
+ width: 100%;
+ background-color: #666;
+}
+
+#preview .previewMsg span {
+ display: block;
+ margin: 125px auto 0 auto;
+ text-align: center;
+ font-size: 18px;
+ color: #fff;
+}
+
+#preview .previewVideo {
+ position: absolute;
+ top: 0;
+ margin: 0;
+ padding: 0;
+ height: 280px;
+ width: 100%;
+}
+
+.edui-video-wrapper fieldset {
+ border: 1px solid #ddd;
+ padding-left: 5px;
+ margin-bottom: 20px;
+ padding-bottom: 5px;
+ width: 115px;
+}
+
+#videoInfo {
+ width: 120px;
+ float: left;
+ margin-left: 10px;
+ _margin-left: 7px;
+}
+
+fieldset {
+ border: 1px solid #ddd;
+ padding-left: 5px;
+ margin-bottom: 20px;
+ padding-bottom: 5px;
+ width: 115px;
+}
+
+fieldset legend {
+ font-weight: bold;
+}
+
+fieldset p {
+ line-height: 30px;
+}
+
+fieldset input.txt {
+ width: 65px;
+ height: 21px;
+ line-height: 21px;
+ margin: 8px 5px;
+ background: #FFF;
+ border: 1px solid #d7d7d7;
+}
+
+label.url {
+ font-weight: bold;
+ margin-left: 5px;
+}
+
+#videoFloat div {
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ margin: 9px;
+ _margin: 5px;
+ width: 38px;
+ height: 36px;
+ float: left;
+}
+
+#videoFloat .focus {
+ opacity: 1;
+ filter: alpha(opacity=100)
+}
+
+span.view {
+ display: inline-block;
+ width: 30px;
+ float: right;
+ cursor: pointer;
+ color: blue
+}
+
+
+/* upload video */
+.tabbody #upload.panel {
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+ background: #fff;
+ display: block;
+}
+
+.tabbody #upload.panel.focus {
+ width: 100%;
+ height: 335px;
+ display: block;
+ clip: auto;
+}
+
+#upload_alignment div {
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ margin: 9px;
+ _margin: 5px;
+ width: 38px;
+ height: 36px;
+ float: left;
+}
+
+#upload_alignment .focus {
+ opacity: 1;
+ filter: alpha(opacity=100)
+}
+
+#upload_left {
+ width: 427px;
+ float: left;
+}
+
+#upload_left .controller {
+ height: 30px;
+ clear: both;
+}
+
+#uploadVideoInfo {
+ margin-top: 10px;
+ float: right;
+ padding-right: 8px;
+}
+
+#upload .queueList {
+ margin: 0;
+}
+
+#upload p {
+ margin: 0;
+}
+
+.element-invisible {
+ width: 0 !important;
+ height: 0 !important;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ position: absolute !important;
+ clip: rect(1px, 1px, 1px, 1px);
+}
+
+#upload .placeholder {
+ margin: 10px;
+ margin-right: 0;
+ border: 2px dashed #e6e6e6;
+ *border: 0px dashed #e6e6e6;
+ height: 161px;
+ padding-top: 150px;
+ text-align: center;
+ width: 97%;
+ float: left;
+ background: url(./images/image.png) center 70px no-repeat;
+ color: #cccccc;
+ font-size: 18px;
+ position: relative;
+ top: 0;
+ *margin-left: 0;
+ *left: 10px;
+}
+
+#upload .placeholder .webuploader-pick {
+ font-size: 18px;
+ background: #00b7ee;
+ border-radius: 3px;
+ line-height: 44px;
+ padding: 0 30px;
+ *width: 120px;
+ color: #fff;
+ display: inline-block;
+ margin: 0 auto 20px auto;
+ cursor: pointer;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+
+#upload .placeholder .webuploader-pick-hover {
+ background: #00a2d4;
+}
+
+
+#filePickerContainer {
+ text-align: center;
+}
+
+#upload .placeholder .flashTip {
+ color: #666666;
+ font-size: 12px;
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ bottom: 20px;
+}
+
+#upload .placeholder .flashTip a {
+ color: #0785d1;
+ text-decoration: none;
+}
+
+#upload .placeholder .flashTip a:hover {
+ text-decoration: underline;
+}
+
+#upload .placeholder.webuploader-dnd-over {
+ border-color: #999999;
+}
+
+#upload .filelist {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ position: relative;
+ height: 285px;
+}
+
+#upload .filelist:after {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ clear: both;
+}
+
+#upload .filelist li {
+ width: 113px;
+ height: 113px;
+ background: url(./images/bg.png);
+ text-align: center;
+ margin: 15px 0 0 20px;
+ *margin: 15px 0 0 15px;
+ position: relative;
+ display: block;
+ float: left;
+ overflow: hidden;
+ font-size: 12px;
+}
+
+#upload .filelist li p.log {
+ position: relative;
+ top: -45px;
+}
+
+#upload .filelist li p.title {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ top: 5px;
+ text-indent: 5px;
+ text-align: left;
+}
+
+#upload .filelist li p.progress {
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+ height: 8px;
+ overflow: hidden;
+ z-index: 50;
+ margin: 0;
+ border-radius: 0;
+ background: none;
+ -webkit-box-shadow: 0 0 0;
+}
+
+#upload .filelist li p.progress span {
+ display: none;
+ overflow: hidden;
+ width: 0;
+ height: 100%;
+ background: #1483d8 url(./images/progress.png) repeat-x;
+
+ -webit-transition: width 200ms linear;
+ -moz-transition: width 200ms linear;
+ -o-transition: width 200ms linear;
+ -ms-transition: width 200ms linear;
+ transition: width 200ms linear;
+
+ -webkit-animation: progressmove 2s linear infinite;
+ -moz-animation: progressmove 2s linear infinite;
+ -o-animation: progressmove 2s linear infinite;
+ -ms-animation: progressmove 2s linear infinite;
+ animation: progressmove 2s linear infinite;
+
+ -webkit-transform: translateZ(0);
+}
+
+@-webkit-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@-moz-keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+@keyframes progressmove {
+ 0% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 17px 0;
+ }
+}
+
+#upload .filelist li p.imgWrap {
+ position: relative;
+ z-index: 2;
+ line-height: 113px;
+ vertical-align: middle;
+ overflow: hidden;
+ width: 113px;
+ height: 113px;
+
+ -webkit-transform-origin: 50% 50%;
+ -moz-transform-origin: 50% 50%;
+ -o-transform-origin: 50% 50%;
+ -ms-transform-origin: 50% 50%;
+ transform-origin: 50% 50%;
+
+ -webit-transition: 200ms ease-out;
+ -moz-transition: 200ms ease-out;
+ -o-transition: 200ms ease-out;
+ -ms-transition: 200ms ease-out;
+ transition: 200ms ease-out;
+}
+
+#upload .filelist li p.imgWrap.notimage {
+ margin-top: 0;
+ width: 111px;
+ height: 111px;
+ border: 1px #eeeeee solid;
+}
+
+#upload .filelist li p.imgWrap.notimage i.file-preview {
+ margin-top: 15px;
+}
+
+#upload .filelist li img {
+ width: 100%;
+}
+
+#upload .filelist li p.error {
+ background: #f43838;
+ color: #fff;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 28px;
+ line-height: 28px;
+ width: 100%;
+ z-index: 100;
+ display: none;
+}
+
+#upload .filelist li .success {
+ display: block;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ height: 40px;
+ width: 100%;
+ z-index: 200;
+ background: url(./images/success.png) no-repeat right bottom;
+ background-image: url(./images/success.gif) \9;
+}
+
+#upload .filelist li.filePickerBlock {
+ width: 113px;
+ height: 113px;
+ background: url(./images/image.png) no-repeat center 12px;
+ border: 1px solid #eeeeee;
+ border-radius: 0;
+}
+
+#upload .filelist li.filePickerBlock div.webuploader-pick {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ opacity: 0;
+ background: none;
+ font-size: 0;
+}
+
+#upload .filelist div.file-panel {
+ position: absolute;
+ height: 0;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
+ background: rgba(0, 0, 0, 0.5);
+ width: 100%;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+ z-index: 300;
+}
+
+#upload .filelist div.file-panel span {
+ width: 24px;
+ height: 24px;
+ display: inline;
+ float: right;
+ text-indent: -9999px;
+ overflow: hidden;
+ background: url(./images/icons.png) no-repeat;
+ background: url(./images/icons.gif) no-repeat \9;
+ margin: 5px 1px 1px;
+ cursor: pointer;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .filelist div.file-panel span.rotateLeft {
+ display: none;
+ background-position: 0 -24px;
+}
+
+#upload .filelist div.file-panel span.rotateLeft:hover {
+ background-position: 0 0;
+}
+
+#upload .filelist div.file-panel span.rotateRight {
+ display: none;
+ background-position: -24px -24px;
+}
+
+#upload .filelist div.file-panel span.rotateRight:hover {
+ background-position: -24px 0;
+}
+
+#upload .filelist div.file-panel span.cancel {
+ background-position: -48px -24px;
+}
+
+#upload .filelist div.file-panel span.cancel:hover {
+ background-position: -48px 0;
+}
+
+#upload .statusBar {
+ height: 45px;
+ border-bottom: 1px solid #dadada;
+ margin: 0 10px;
+ padding: 0;
+ line-height: 45px;
+ vertical-align: middle;
+ position: relative;
+}
+
+#upload .statusBar .progress {
+ border: 1px solid #1483d8;
+ width: 198px;
+ background: #fff;
+ height: 18px;
+ position: absolute;
+ top: 12px;
+ display: none;
+ text-align: center;
+ line-height: 18px;
+ color: #6dbfff;
+ margin: 0 10px 0 0;
+}
+
+#upload .statusBar .progress span.percentage {
+ width: 0;
+ height: 100%;
+ left: 0;
+ top: 0;
+ background: #1483d8;
+ position: absolute;
+}
+
+#upload .statusBar .progress span.text {
+ position: relative;
+ z-index: 10;
+}
+
+#upload .statusBar .info {
+ display: inline-block;
+ font-size: 14px;
+ color: #666666;
+}
+
+#upload .statusBar .btns {
+ position: absolute;
+ top: 7px;
+ right: 0;
+ line-height: 30px;
+}
+
+#filePickerBtn {
+ display: inline-block;
+ float: left;
+}
+
+#upload .statusBar .btns .webuploader-pick,
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-uploading,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #ffffff;
+ border: 1px solid #cfcfcf;
+ color: #565656;
+ padding: 0 18px;
+ display: inline-block;
+ border-radius: 3px;
+ margin-left: 10px;
+ cursor: pointer;
+ font-size: 14px;
+ float: left;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+#upload .statusBar .btns .webuploader-pick-hover,
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #f0f0f0;
+}
+
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-paused {
+ background: #00b7ee;
+ color: #fff;
+ border-color: transparent;
+}
+
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+ background: #00a2d4;
+}
+
+#upload .statusBar .btns .uploadBtn.disabled {
+ pointer-events: none;
+ filter: alpha(opacity=60);
+ -moz-opacity: 0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6;
+}
+
+
+/* 在线文件的文件预览图标 */
+i.file-preview {
+ display: block;
+ margin: 10px auto;
+ width: 70px;
+ height: 70px;
+ background-image: url("./images/file-icons.png");
+ background-image: url("./images/file-icons.gif") \9;
+ background-position: -140px center;
+ background-repeat: no-repeat;
+}
+
+i.file-preview.file-type-dir {
+ background-position: 0 center;
+}
+
+i.file-preview.file-type-file {
+ background-position: -140px center;
+}
+
+i.file-preview.file-type-filelist {
+ background-position: -210px center;
+}
+
+i.file-preview.file-type-zip,
+i.file-preview.file-type-rar,
+i.file-preview.file-type-7z,
+i.file-preview.file-type-tar,
+i.file-preview.file-type-gz,
+i.file-preview.file-type-bz2 {
+ background-position: -280px center;
+}
+
+i.file-preview.file-type-xls,
+i.file-preview.file-type-xlsx {
+ background-position: -350px center;
+}
+
+i.file-preview.file-type-doc,
+i.file-preview.file-type-docx {
+ background-position: -420px center;
+}
+
+i.file-preview.file-type-ppt,
+i.file-preview.file-type-pptx {
+ background-position: -490px center;
+}
+
+i.file-preview.file-type-vsd {
+ background-position: -560px center;
+}
+
+i.file-preview.file-type-pdf {
+ background-position: -630px center;
+}
+
+i.file-preview.file-type-txt,
+i.file-preview.file-type-md,
+i.file-preview.file-type-json,
+i.file-preview.file-type-htm,
+i.file-preview.file-type-xml,
+i.file-preview.file-type-html,
+i.file-preview.file-type-js,
+i.file-preview.file-type-css,
+i.file-preview.file-type-php,
+i.file-preview.file-type-jsp,
+i.file-preview.file-type-asp {
+ background-position: -700px center;
+}
+
+i.file-preview.file-type-apk {
+ background-position: -770px center;
+}
+
+i.file-preview.file-type-exe {
+ background-position: -840px center;
+}
+
+i.file-preview.file-type-ipa {
+ background-position: -910px center;
+}
+
+i.file-preview.file-type-mp4,
+i.file-preview.file-type-swf,
+i.file-preview.file-type-mkv,
+i.file-preview.file-type-avi,
+i.file-preview.file-type-flv,
+i.file-preview.file-type-mov,
+i.file-preview.file-type-mpg,
+i.file-preview.file-type-mpeg,
+i.file-preview.file-type-ogv,
+i.file-preview.file-type-webm,
+i.file-preview.file-type-rm,
+i.file-preview.file-type-rmvb {
+ background-position: -980px center;
+}
+
+i.file-preview.file-type-ogg,
+i.file-preview.file-type-wav,
+i.file-preview.file-type-wmv,
+i.file-preview.file-type-mid,
+i.file-preview.file-type-mp3 {
+ background-position: -1050px center;
+}
+
+i.file-preview.file-type-jpg,
+i.file-preview.file-type-jpeg,
+i.file-preview.file-type-gif,
+i.file-preview.file-type-bmp,
+i.file-preview.file-type-png,
+i.file-preview.file-type-psd {
+ background-position: -140px center;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.html
new file mode 100644
index 0000000..eb71461
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.html
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 外链视频支持:优酷、腾讯视频、哔哩哔哩
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.js
new file mode 100644
index 0000000..91254ab
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/video/video.js
@@ -0,0 +1,840 @@
+/**
+ * Created by JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-2-20
+ * Time: 上午11:19
+ * To change this template use File | Settings | File Templates.
+ */
+
+(function () {
+
+ var video = {},
+ uploadVideoList = [],
+ isModifyUploadVideo = false,
+ uploadFile;
+ var editorOpt = {};
+
+ window.onload = function () {
+ editorOpt = editor.getOpt('videoConfig');
+ $focus($G("videoUrl"));
+ initTabs();
+ initVideo();
+ initUpload();
+ };
+
+ /* 初始化tab标签 */
+ function initTabs() {
+ var tabs = $G('tabHeads').children;
+ for (var i = 0; i < tabs.length; i++) {
+ domUtils.on(tabs[i], "click", function (e) {
+ var j, bodyId, target = e.target || e.srcElement;
+ for (j = 0; j < tabs.length; j++) {
+ bodyId = tabs[j].getAttribute('data-content-id');
+ if (tabs[j] == target) {
+ domUtils.addClass(tabs[j], 'focus');
+ domUtils.addClass($G(bodyId), 'focus');
+ } else {
+ domUtils.removeClasses(tabs[j], 'focus');
+ domUtils.removeClasses($G(bodyId), 'focus');
+ }
+ }
+ });
+ }
+ if (!editorOpt.disableUpload) {
+ $G('tabHeads').querySelector('[data-content-id="upload"]').style.display = 'inline-block';
+ }
+ if (!!editorOpt.selectCallback) {
+ $G('videoSelect').style.display = 'inline-block';
+ domUtils.on($G('videoSelect'), "click", function (e) {
+ editorOpt.selectCallback(editor, function (info) {
+ if (info) {
+ $G('videoUrl').value = info.path;
+ createPreviewVideo(info.path);
+ }
+ });
+ });
+ }
+ }
+
+ function initVideo() {
+ createAlignButton(["videoFloat", "upload_alignment"]);
+ addUrlChangeListener($G("videoUrl"));
+ addOkListener();
+
+ //编辑视频时初始化相关信息
+ (function () {
+ var img = editor.selection.getRange().getClosedNode(), url;
+ if (img && img.className) {
+ var hasFakedClass = (img.className == "edui-faked-video"),
+ hasUploadClass = img.className.indexOf("edui-upload-video") != -1;
+ if (hasFakedClass || hasUploadClass) {
+ $G("videoUrl").value = url = img.getAttribute("_url");
+ $G("videoWidth").value = img.width;
+ $G("videoHeight").value = img.height;
+ var align = domUtils.getComputedStyle(img, "float"),
+ parentAlign = domUtils.getComputedStyle(img.parentNode, "text-align");
+ updateAlignButton(parentAlign === "center" ? "center" : align);
+ }
+ if (hasUploadClass) {
+ isModifyUploadVideo = true;
+ }
+ }
+ createPreviewVideo(url);
+ })();
+ }
+
+ /**
+ * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作
+ */
+ function addOkListener() {
+ dialog.onok = function () {
+ $G("preview").innerHTML = "";
+ var currentTab = findFocus("tabHeads", "tabSrc");
+ switch (currentTab) {
+ case "video":
+ return insertSingle();
+ break;
+ case "videoSearch":
+ return insertSearch("searchList");
+ break;
+ case "upload":
+ return insertUpload();
+ break;
+ }
+ };
+ dialog.oncancel = function () {
+ $G("preview").innerHTML = "";
+ };
+ }
+
+ /**
+ * 依据传入的align值更新按钮信息
+ * @param align
+ */
+ function updateAlignButton(align) {
+ var aligns = $G("videoFloat").children;
+ for (var i = 0, ci; ci = aligns[i++];) {
+ if (ci.getAttribute("name") == align) {
+ if (ci.className != "focus") {
+ ci.className = "focus";
+ }
+ } else {
+ if (ci.className == "focus") {
+ ci.className = "";
+ }
+ }
+ }
+ }
+
+ /**
+ * 将单个视频信息插入编辑器中
+ */
+ function insertSingle() {
+ var width = $G("videoWidth"),
+ height = $G("videoHeight"),
+ url = $G('videoUrl').value,
+ align = findFocus("videoFloat", "name");
+ if (!url) return false;
+ if (!checkNum([width, height])) return false;
+ editor.execCommand('insertvideo', {
+ url: convert_url(url),
+ width: width.value,
+ height: height.value,
+ align: align
+ }, isModifyUploadVideo ? 'upload' : null);
+ }
+
+ /**
+ * 将元素id下的所有代表视频的图片插入编辑器中
+ * @param id
+ */
+ function insertSearch(id) {
+ var imgs = domUtils.getElementsByTagName($G(id), "img"),
+ videoObjs = [];
+ for (var i = 0, img; img = imgs[i++];) {
+ if (img.getAttribute("selected")) {
+ videoObjs.push({
+ url: img.getAttribute("ue_video_url"),
+ width: 420,
+ height: 280,
+ align: "none"
+ });
+ }
+ }
+ editor.execCommand('insertvideo', videoObjs);
+ }
+
+ /**
+ * 找到id下具有focus类的节点并返回该节点下的某个属性
+ * @param id
+ * @param returnProperty
+ */
+ function findFocus(id, returnProperty) {
+ var tabs = $G(id).children,
+ property;
+ for (var i = 0, ci; ci = tabs[i++];) {
+ if (ci.className == "focus") {
+ property = ci.getAttribute(returnProperty);
+ break;
+ }
+ }
+ return property;
+ }
+
+ function convert_url(url) {
+ if (!url) return '';
+ url = utils.trim(url)
+ .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/embed/$1')
+ // .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2")
+ // .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1")
+ //.replace(/www\.iqiyi\.com\/v_(\w+)\.html/i, "www.youtube.com/v/$1")
+ // .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf")
+ // .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf")
+ // .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf")
+ // .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf")
+ // .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0")
+ // .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1")
+ // https://v.qq.com/x/cover/wagzbx91asjomnu/w05337nxfof.html
+ // https://v.qq.com/iframe/player.html?vid=w05337nxfof&tiny=0&auto=0
+ .replace(/v\.qq\.com\/x\/cover\/[\w]+\/([\w]+)\.html/i, "v.qq.com/iframe/player.html?vid=$1&tiny=0&auto=0")
+ .replace(/v\.qq\.com\/x\/page\/([\w]+)\.html/i, "v.qq.com/iframe/player.html?vid=$1&tiny=0&auto=0")
+ .replace(/www\.bilibili\.com\/video\/([a-zA-Z0-9]+)\/?.*$/i, "player.bilibili.com/player.html?bvid=$1")
+ // .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1")
+ // .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1")
+ // .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1")
+ ;
+ return url;
+ }
+
+ /**
+ * 检测传入的所有input框中输入的长宽是否是正数
+ * @param nodes input框集合,
+ */
+ function checkNum(nodes) {
+ for (var i = 0, ci; ci = nodes[i++];) {
+ var value = ci.value;
+ if (!isNumber(value) && value) {
+ alert(lang.numError);
+ ci.value = "";
+ ci.focus();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 数字判断
+ * @param value
+ */
+ function isNumber(value) {
+ return /(0|^[1-9]\d*$)/.test(value);
+ }
+
+ /**
+ * 创建图片浮动选择按钮
+ * @param ids
+ */
+ function createAlignButton(ids) {
+ for (var i = 0, ci; ci = ids[i++];) {
+ var floatContainer = $G(ci),
+ nameMaps = {
+ "none": lang['default'],
+ "left": lang.floatLeft,
+ "right": lang.floatRight,
+ "center": lang.block
+ };
+ for (var j in nameMaps) {
+ var div = document.createElement("div");
+ div.setAttribute("name", j);
+ if (j == "none") div.className = "focus";
+ div.style.cssText = "background:url(images/" + j + "_focus.jpg);";
+ div.setAttribute("title", nameMaps[j]);
+ floatContainer.appendChild(div);
+ }
+ switchSelect(ci);
+ }
+ }
+
+ /**
+ * 选择切换
+ * @param selectParentId
+ */
+ function switchSelect(selectParentId) {
+ var selects = $G(selectParentId).children;
+ for (var i = 0, ci; ci = selects[i++];) {
+ domUtils.on(ci, "click", function () {
+ for (var j = 0, cj; cj = selects[j++];) {
+ cj.className = "";
+ cj.removeAttribute && cj.removeAttribute("class");
+ }
+ this.className = "focus";
+ })
+ }
+ }
+
+ /**
+ * 监听url改变事件
+ * @param url
+ */
+ function addUrlChangeListener(url) {
+ if (browser.ie) {
+ url.onpropertychange = function () {
+ createPreviewVideo(this.value);
+ }
+ } else {
+ url.addEventListener("input", function () {
+ createPreviewVideo(this.value);
+ }, false);
+ }
+ }
+
+ /**
+ * 根据url生成视频预览
+ * @param url
+ */
+ function createPreviewVideo(url) {
+ if (!url) return;
+
+ var conUrl = convert_url(url);
+
+ conUrl = utils.unhtml(conUrl);
+
+ // $G("preview").innerHTML = '
'+lang.urlError+'
'+
+ // '
';
+
+ $G("preview").innerHTML = '
' + lang.urlError + '
' +
+ '
';
+ }
+
+
+ /* 插入上传视频 */
+ function insertUpload() {
+ var videoObjs = [],
+ uploadDir = editor.getOpt('videoUrlPrefix'),
+ width = $G('upload_width').value || 420,
+ height = $G('upload_height').value || 280,
+ align = findFocus("upload_alignment", "name") || 'none';
+ for (var key in uploadVideoList) {
+ var file = uploadVideoList[key];
+ videoObjs.push({
+ url: uploadDir + file.url,
+ width: width,
+ height: height,
+ align: align
+ });
+ }
+
+ var count = uploadFile.getQueueCount();
+ if (count) {
+ $('.info', '#queueList').html('
' + '还有2个未上传文件'.replace(/[\d]/, count) + '');
+ return false;
+ } else {
+ editor.execCommand('insertvideo', videoObjs, 'upload');
+ }
+ }
+
+ /*初始化上传标签*/
+ function initUpload() {
+ uploadFile = new UploadFile('queueList');
+ }
+
+
+ /* 上传附件 */
+ function UploadFile(target) {
+ this.$wrap = target.constructor == String ? $('#' + target) : $(target);
+ this.init();
+ }
+
+ UploadFile.prototype = {
+ init: function () {
+ this.fileList = [];
+ this.initContainer();
+ this.initUploader();
+ },
+ initContainer: function () {
+ this.$queue = this.$wrap.find('.filelist');
+ },
+ /* 初始化容器 */
+ initUploader: function () {
+ var _this = this,
+ $ = jQuery, // just in case. Make sure it's not an other libaray.
+ $wrap = _this.$wrap,
+ // 图片容器
+ $queue = $wrap.find('.filelist'),
+ // 状态栏,包括进度和控制按钮
+ $statusBar = $wrap.find('.statusBar'),
+ // 文件总体选择信息。
+ $info = $statusBar.find('.info'),
+ // 上传按钮
+ $upload = $wrap.find('.uploadBtn'),
+ // 上传按钮
+ $filePickerBtn = $wrap.find('.filePickerBtn'),
+ // 上传按钮
+ $filePickerBlock = $wrap.find('.filePickerBlock'),
+ // 没选择文件之前的内容。
+ $placeHolder = $wrap.find('.placeholder'),
+ // 总体进度条
+ $progress = $statusBar.find('.progress').hide(),
+ // 添加的文件数量
+ fileCount = 0,
+ // 添加的文件总大小
+ fileSize = 0,
+ // 优化retina, 在retina下这个值是2
+ ratio = window.devicePixelRatio || 1,
+ // 缩略图大小
+ thumbnailWidth = 113 * ratio,
+ thumbnailHeight = 113 * ratio,
+ // 可能有pedding, ready, uploading, confirm, done.
+ state = '',
+ // 所有文件的进度信息,key为file id
+ percentages = {},
+ supportTransition = (function () {
+ var s = document.createElement('p').style,
+ r = 'transition' in s ||
+ 'WebkitTransition' in s ||
+ 'MozTransition' in s ||
+ 'msTransition' in s ||
+ 'OTransition' in s;
+ s = null;
+ return r;
+ })(),
+ // WebUploader实例
+ uploader,
+ actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')),
+ fileMaxSize = editor.getOpt('videoMaxSize'),
+ acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');
+ ;
+
+ if (!WebUploader.Uploader.support()) {
+ $('#filePickerReady').after($('
').html(lang.errorNotSupport)).hide();
+ return;
+ } else if (!editor.getOpt('videoActionName')) {
+ $('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
+ return;
+ }
+
+ uploader = _this.uploader = WebUploader.create({
+ pick: {
+ id: '#filePickerReady',
+ label: lang.uploadSelectFile
+ },
+ swf: '../../third-party/webuploader/Uploader.swf',
+ server: actionUrl,
+ fileVal: editor.getOpt('videoFieldName'),
+ duplicate: true,
+ fileSingleSizeLimit: fileMaxSize,
+ compress: false
+ });
+ uploader.addButton({
+ id: '#filePickerBlock'
+ });
+ uploader.addButton({
+ id: '#filePickerBtn',
+ label: lang.uploadAddFile
+ });
+
+ setState('pedding');
+
+ // 当有文件添加进来时执行,负责view的创建
+ function addFile(file) {
+ var $li = $('
' +
+ '' + file.name + '
' +
+ '' +
+ '
' +
+ ''),
+
+ $btns = $('
' +
+ '' + lang.uploadDelete + '' +
+ '' + lang.uploadTurnRight + '' +
+ '' + lang.uploadTurnLeft + '
').appendTo($li),
+ $prgress = $li.find('p.progress span'),
+ $wrap = $li.find('p.imgWrap'),
+ $info = $('
').hide().appendTo($li),
+
+ showError = function (code) {
+ switch (code) {
+ case 'exceed_size':
+ text = lang.errorExceedSize;
+ break;
+ case 'interrupt':
+ text = lang.errorInterrupt;
+ break;
+ case 'http':
+ text = lang.errorHttp;
+ break;
+ case 'not_allow_type':
+ text = lang.errorFileType;
+ break;
+ default:
+ text = lang.errorUploadRetry;
+ break;
+ }
+ $info.text(text).show();
+ };
+
+ if (file.getStatus() === 'invalid') {
+ showError(file.statusText);
+ } else {
+ $wrap.text(lang.uploadPreview);
+ if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) {
+ $wrap.empty().addClass('notimage').append('
' +
+ '
' + file.name + '');
+ } else {
+ if (browser.ie && browser.version <= 7) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ uploader.makeThumb(file, function (error, src) {
+ if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ var $img = $('

');
+ $wrap.empty().append($img);
+ $img.on('error', function () {
+ $wrap.text(lang.uploadNoPreview);
+ });
+ }
+ }, thumbnailWidth, thumbnailHeight);
+ }
+ }
+ percentages[file.id] = [file.size, 0];
+ file.rotation = 0;
+
+ /* 检查文件格式 */
+ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
+ showError('not_allow_type');
+ uploader.removeFile(file);
+ }
+ }
+
+ file.on('statuschange', function (cur, prev) {
+ if (prev === 'progress') {
+ $prgress.hide().width(0);
+ } else if (prev === 'queued') {
+ $li.off('mouseenter mouseleave');
+ $btns.remove();
+ }
+ // 成功
+ if (cur === 'error' || cur === 'invalid') {
+ showError(file.statusText);
+ percentages[file.id][1] = 1;
+ } else if (cur === 'interrupt') {
+ showError('interrupt');
+ } else if (cur === 'queued') {
+ percentages[file.id][1] = 0;
+ } else if (cur === 'progress') {
+ $info.hide();
+ $prgress.css('display', 'block');
+ } else if (cur === 'complete') {
+ }
+
+ $li.removeClass('state-' + prev).addClass('state-' + cur);
+ });
+
+ $li.on('mouseenter', function () {
+ $btns.stop().animate({height: 30});
+ });
+ $li.on('mouseleave', function () {
+ $btns.stop().animate({height: 0});
+ });
+
+ $btns.on('click', 'span', function () {
+ var index = $(this).index(),
+ deg;
+
+ switch (index) {
+ case 0:
+ uploader.removeFile(file);
+ return;
+ case 1:
+ file.rotation += 90;
+ break;
+ case 2:
+ file.rotation -= 90;
+ break;
+ }
+
+ if (supportTransition) {
+ deg = 'rotate(' + file.rotation + 'deg)';
+ $wrap.css({
+ '-webkit-transform': deg,
+ '-mos-transform': deg,
+ '-o-transform': deg,
+ 'transform': deg
+ });
+ } else {
+ $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
+ }
+
+ });
+
+ $li.insertBefore($filePickerBlock);
+ }
+
+ // 负责view的销毁
+ function removeFile(file) {
+ var $li = $('#' + file.id);
+ delete percentages[file.id];
+ updateTotalProgress();
+ $li.off().find('.file-panel').off().end().remove();
+ }
+
+ function updateTotalProgress() {
+ var loaded = 0,
+ total = 0,
+ spans = $progress.children(),
+ percent;
+
+ $.each(percentages, function (k, v) {
+ total += v[0];
+ loaded += v[0] * v[1];
+ });
+
+ percent = total ? loaded / total : 0;
+
+ spans.eq(0).text(Math.round(percent * 100) + '%');
+ spans.eq(1).css('width', Math.round(percent * 100) + '%');
+ updateStatus();
+ }
+
+ function setState(val, files) {
+
+ if (val != state) {
+
+ var stats = uploader.getStats();
+
+ $upload.removeClass('state-' + state);
+ $upload.addClass('state-' + val);
+
+ switch (val) {
+
+ /* 未选择文件 */
+ case 'pedding':
+ $queue.addClass('element-invisible');
+ $statusBar.addClass('element-invisible');
+ $placeHolder.removeClass('element-invisible');
+ $progress.hide();
+ $info.hide();
+ uploader.refresh();
+ break;
+
+ /* 可以开始上传 */
+ case 'ready':
+ $placeHolder.addClass('element-invisible');
+ $queue.removeClass('element-invisible');
+ $statusBar.removeClass('element-invisible');
+ $progress.hide();
+ $info.show();
+ $upload.text(lang.uploadStart);
+ uploader.refresh();
+ break;
+
+ /* 上传中 */
+ case 'uploading':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadPause);
+ break;
+
+ /* 暂停上传 */
+ case 'paused':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadContinue);
+ break;
+
+ case 'confirm':
+ $progress.show();
+ $info.hide();
+ $upload.text(lang.uploadStart);
+
+ stats = uploader.getStats();
+ if (stats.successNum && !stats.uploadFailNum) {
+ setState('finish');
+ return;
+ }
+ break;
+
+ case 'finish':
+ $progress.hide();
+ $info.show();
+ if (stats.uploadFailNum) {
+ $upload.text(lang.uploadRetry);
+ } else {
+ $upload.text(lang.uploadStart);
+ }
+ break;
+ }
+
+ state = val;
+ updateStatus();
+
+ }
+
+ if (!_this.getQueueCount()) {
+ $upload.addClass('disabled')
+ } else {
+ $upload.removeClass('disabled')
+ }
+
+ }
+
+ function updateStatus() {
+ var text = '', stats;
+
+ if (state === 'ready') {
+ text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
+ } else if (state === 'confirm') {
+ stats = uploader.getStats();
+ if (stats.uploadFailNum) {
+ text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
+ }
+ } else {
+ stats = uploader.getStats();
+ text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum);
+
+ if (stats.uploadFailNum) {
+ text += lang.updateStatusError.replace('_', stats.uploadFailNum);
+ }
+ }
+
+ $info.html(text);
+ }
+
+ uploader.on('fileQueued', function (file) {
+ fileCount++;
+ fileSize += file.size;
+
+ if (fileCount === 1) {
+ $placeHolder.addClass('element-invisible');
+ $statusBar.show();
+ }
+
+ addFile(file);
+ });
+
+ uploader.on('fileDequeued', function (file) {
+ fileCount--;
+ fileSize -= file.size;
+
+ removeFile(file);
+ updateTotalProgress();
+ });
+
+ uploader.on('filesQueued', function (file) {
+ if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
+ setState('ready');
+ }
+ updateTotalProgress();
+ });
+
+ uploader.on('all', function (type, files) {
+ switch (type) {
+ case 'uploadFinished':
+ setState('confirm', files);
+ break;
+ case 'startUpload':
+ /* 添加额外的GET参数 */
+ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+ url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params);
+ uploader.option('server', url);
+ setState('uploading', files);
+ break;
+ case 'stopUpload':
+ setState('paused', files);
+ break;
+ }
+ });
+
+ uploader.on('uploadBeforeSend', function (file, data, header) {
+ //这里可以通过data对象添加POST参数
+ if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
+ header['X_Requested_With'] = 'XMLHttpRequest';
+ }
+ });
+
+ uploader.on('uploadProgress', function (file, percentage) {
+ var $li = $('#' + file.id),
+ $percent = $li.find('.progress span');
+
+ $percent.css('width', percentage * 100 + '%');
+ percentages[file.id][1] = percentage;
+ updateTotalProgress();
+ });
+
+ uploader.on('uploadSuccess', function (file, ret) {
+ var $file = $('#' + file.id);
+ try {
+ var responseText = (ret._raw || ret),
+ json = utils.str2json(responseText);
+ if (json.state == 'SUCCESS') {
+ uploadVideoList.push({
+ 'url': json.url,
+ 'type': json.type,
+ 'original': json.original
+ });
+ $file.append('
');
+ // 触发上传视频事件
+ editor.fireEvent("uploadsuccess", {
+ res: json,
+ type: 'video'
+ });
+ } else {
+ $file.find('.error').text(json.state).show();
+ }
+ } catch (e) {
+ $file.find('.error').text(lang.errorServerUpload).show();
+ }
+ });
+
+ uploader.on('uploadError', function (file, code) {
+ });
+ uploader.on('error', function (code, file) {
+ if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
+ addFile(file);
+ }
+ });
+ uploader.on('uploadComplete', function (file, ret) {
+ });
+
+ $upload.on('click', function () {
+ if ($(this).hasClass('disabled')) {
+ return false;
+ }
+
+ if (state === 'ready') {
+ uploader.upload();
+ } else if (state === 'paused') {
+ uploader.upload();
+ } else if (state === 'uploading') {
+ uploader.stop();
+ }
+ });
+
+ $upload.addClass('state-' + state);
+ updateTotalProgress();
+ },
+ getQueueCount: function () {
+ var file, i, status, readyFile = 0, files = this.uploader.getFiles();
+ for (i = 0; file = files[i++];) {
+ status = file.getStatus();
+ if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
+ }
+ return readyFile;
+ },
+ refresh: function () {
+ this.uploader.refresh();
+ }
+ };
+
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/wordimage/wordimage.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/wordimage/wordimage.html
new file mode 100644
index 0000000..3b90f46
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/wordimage/wordimage.html
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Windows使用教程
+
+
+
1、点击复制地址按钮
+
2、点击本地选择文件,粘贴剪切板的路径到文件选择路径
+
3、点击确定
+
+
+ Mac使用教程
+
+
+
1、点击复制地址按钮
+
2、点击本地选择文件,按快捷 Command+Shift+G ,粘贴剪切板的路径到文件选择路径
+
3、点击确定
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/wordimage/wordimage.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/wordimage/wordimage.js
new file mode 100644
index 0000000..39dacd2
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/dialogs/wordimage/wordimage.js
@@ -0,0 +1,93 @@
+/**
+ * Created by JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-1-30
+ * Time: 下午12:50
+ * To change this template use File | Settings | File Templates.
+ */
+var wordImage = {};
+var g = $G, flashObj, flashContainer;
+
+wordImage.init = function (opt, callbacks) {
+ showLocalPath("fileUrl");
+ createCopyButton("copyButton", "fileUrl");
+ addUploadButtonListener();
+ addOkListener();
+};
+
+function addUploadButtonListener() {
+ g('saveFile').addEventListener('change', function () {
+ $('.image-tip').html('正在转存,请稍后...');
+ uploader.addFile(this.files);
+ uploader.upload();
+ });
+}
+
+
+function addOkListener() {
+ dialog.onok = function () {
+ //console.log('imageUrls',imageUrls);
+ if (!imageUrls.length) return;
+ var urlPrefix = editor.getOpt('imageUrlPrefix'),
+ images = domUtils.getElementsByTagName(editor.document, "img");
+ editor.fireEvent('saveScene');
+ // console.log('images',images,imageUrls);
+ for (var i = 0, img; img = images[i++];) {
+ var src = img.getAttribute("data-word-image");
+ if (!src) continue;
+ for (var j = 0, url; url = imageUrls[j++];) {
+ // console.log('url',src, url);
+ if (src.indexOf(url.name.replace(" ", "")) != -1) {
+ img.src = urlPrefix + url.url;
+ img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性
+ img.setAttribute("title", url.title);
+ domUtils.removeAttributes(img, ["data-word-image", "style", "width", "height"]);
+ editor.fireEvent("selectionchange");
+ break;
+ }
+ }
+ }
+ editor.fireEvent('saveScene');
+ // hideFlash();
+ };
+ dialog.oncancel = function () {
+ //hideFlash();
+ };
+}
+
+function showLocalPath(id) {
+ //单张编辑
+ var img = editor.selection.getRange().getClosedNode();
+ var images = editor.execCommand('wordimage');
+ if (images.length == 1 || img && img.tagName == 'IMG') {
+ g(id).value = images[0];
+ return;
+ }
+ var path = images[0];
+ var leftSlashIndex = path.lastIndexOf("/") || 0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种
+ rightSlashIndex = path.lastIndexOf("\\") || 0,
+ separater = leftSlashIndex > rightSlashIndex ? "/" : "\\";
+
+ path = path.substring(0, path.lastIndexOf(separater) + 1);
+ g(id).value = path;
+ //增提醒用户选择哪些文件
+ var names = [];
+ for (var i = 0, len = images.length; i < len; i++) {
+ var img = images[i];
+ names.push(img.substring(img.lastIndexOf(separater) + 1, img.length));
+ }
+ $('.image-tip').html('
请选择:' + names.join("、") + "共" + images.length + '个文件');
+}
+
+function createCopyButton(id, dataFrom) {
+ var url = g(dataFrom).value;
+ if (url.startsWith("file:////")) {
+ url = url.substring(8);
+ }
+ url = decodeURI(url);
+ g(id).setAttribute("data-clipboard-text", url);
+ var clipboard = new Clipboard('[data-clipboard-text]')
+ clipboard.on('success', function (e) {
+ g('copyButton').innerHTML = '复制成功';
+ });
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/index.html b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/index.html
new file mode 100644
index 0000000..74d03df
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/index.html
@@ -0,0 +1,146 @@
+
+
+
+
UEditorPlus 完整演示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
完整示例
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/en.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/en.js
new file mode 100644
index 0000000..0348252
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/en.js
@@ -0,0 +1,685 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午6:57
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['en'] = {
+ 'labelMap': {
+ 'anchor': 'Anchor',
+ 'undo': 'Undo',
+ 'redo': 'Redo',
+ 'bold': 'Bold',
+ 'indent': 'Indent',
+ 'italic': 'Italic',
+ 'underline': 'Underline',
+ 'strikethrough': 'Strikethrough',
+ 'subscript': 'SubScript',
+ 'fontborder': 'text border',
+ 'superscript': 'SuperScript',
+ 'formatmatch': 'Format Match',
+ 'source': 'Source',
+ 'blockquote': 'BlockQuote',
+ 'pasteplain': 'PastePlain',
+ 'selectall': 'SelectAll',
+ 'print': 'Print',
+ 'preview': 'Preview',
+ 'horizontal': 'Horizontal',
+ 'removeformat': 'RemoveFormat',
+ 'time': 'Time',
+ 'date': 'Date',
+ 'unlink': 'Unlink',
+ 'insertrow': 'InsertRow',
+ 'insertcol': 'InsertCol',
+ 'mergeright': 'MergeRight',
+ 'mergedown': 'MergeDown',
+ 'deleterow': 'DeleteRow',
+ 'deletecol': 'DeleteCol',
+ 'splittorows': 'SplitToRows',
+ 'insertcode': 'insert code',
+ 'splittocols': 'SplitToCols',
+ 'splittocells': 'SplitToCells',
+ 'deletecaption': 'DeleteCaption',
+ 'inserttitle': 'InsertTitle',
+ 'mergecells': 'MergeCells',
+ 'deletetable': 'DeleteTable',
+ 'cleardoc': 'Clear',
+ 'insertparagraphbeforetable': "InsertParagraphBeforeTable",
+ 'fontfamily': 'FontFamily',
+ 'fontsize': 'FontSize',
+ 'paragraph': 'Paragraph',
+ 'simpleupload': 'Single Image',
+ 'insertimage': 'Multi Image',
+ 'edittable': 'Edit Table',
+ 'edittd': 'Edit Td',
+ 'link': 'Link',
+ 'emotion': 'Emotion',
+ 'spechars': 'Spechars',
+ 'searchreplace': 'SearchReplace',
+ 'insertvideo': 'Video',
+ 'help': 'Help',
+ 'justifyleft': 'JustifyLeft',
+ 'justifyright': 'JustifyRight',
+ 'justifycenter': 'JustifyCenter',
+ 'justifyjustify': 'Justify',
+ 'forecolor': 'FontColor',
+ 'backcolor': 'BackColor',
+ 'insertorderedlist': 'OL',
+ 'insertunorderedlist': 'UL',
+ 'fullscreen': 'FullScreen',
+ 'directionalityltr': 'EnterFromLeft',
+ 'directionalityrtl': 'EnterFromRight',
+ 'rowspacingtop': 'RowSpacingTop',
+ 'rowspacingbottom': 'RowSpacingBottom',
+ 'pagebreak': 'PageBreak',
+ 'insertframe': 'Iframe',
+ 'imagenone': 'Default',
+ 'imageleft': 'ImageLeft',
+ 'imageright': 'ImageRight',
+ 'attachment': 'Attachment',
+ 'imagecenter': 'ImageCenter',
+ 'wordimage': 'WordImage',
+ 'formula': 'Formula',
+ 'lineheight': 'LineHeight',
+ 'edittip': 'EditTip',
+ 'customstyle': 'CustomStyle',
+ 'scrawl': 'Scrawl',
+ 'autotypeset': 'AutoTypeset',
+ 'touppercase': 'UpperCase',
+ 'tolowercase': 'LowerCase',
+ 'template': 'Template',
+ 'background': 'Background',
+ 'inserttable': 'InsertTable',
+ },
+ 'autosave': {
+ 'autoRestoreTip': 'Has been recovered from draft'
+ },
+ 'insertorderedlist': {
+ 'num': '1,2,3...',
+ 'num1': '1),2),3)...',
+ 'num2': '(1),(2),(3)...',
+ 'cn': '一,二,三....',
+ 'cn1': '一),二),三)....',
+ 'cn2': '(一),(二),(三)....',
+ 'decimal': '1,2,3...',
+ 'lower-alpha': 'a,b,c...',
+ 'lower-roman': 'i,ii,iii...',
+ 'upper-alpha': 'A,B,C...',
+ 'upper-roman': 'I,II,III...'
+ },
+ 'insertunorderedlist': {
+ 'circle': '○ Circle',
+ 'disc': '● Circle dot',
+ 'square': '■ Rectangle ',
+ 'dash': '- Dash',
+ 'dot': '。dot'
+ },
+ 'paragraph': {
+ 'p': 'Paragraph',
+ 'h1': 'Title 1',
+ 'h2': 'Title 2',
+ 'h3': 'Title 3',
+ 'h4': 'Title 4',
+ 'h5': 'Title 5',
+ 'h6': 'Title 6'
+ },
+ 'fontfamily': {
+ 'default': 'Default',
+ 'songti': 'Sim Sun',
+ 'kaiti': 'Sim Kai',
+ 'heiti': 'Sim Hei',
+ 'lishu': 'Sim Li',
+ 'yahei': 'Microsoft YaHei',
+ // 'andaleMono':'Andale Mono',
+ 'arial': 'Arial',
+ // 'arialBlack':'Arial Black',
+ // 'comicSansMs':'Comic Sans MS',
+ // 'impact':'Impact',
+ 'timesNewRoman': 'Times New Roman'
+ },
+ 'customstyle': {
+ 'tc': 'Title center',
+ 'tl': 'Title left',
+ 'im': 'Important',
+ 'hi': 'Highlight'
+ },
+ 'autoupload': {
+ 'exceedSizeError': 'File Size Exceed',
+ 'exceedTypeError': 'File Type Not Allow',
+ 'jsonEncodeError': 'Server Return Format Error',
+ 'loading': "loading...",
+ 'loadError': "load error",
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ },
+ 'simpleupload': {
+ 'exceedSizeError': 'File Size Exceed',
+ 'exceedTypeError': 'File Type Not Allow',
+ 'jsonEncodeError': 'Server Return Format Error',
+ 'loading': "loading...",
+ 'loadError': "load error",
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ },
+ 'elementPathTip': "Path",
+ 'wordCountTip': "Word Count",
+ 'wordCountMsg': '{#count} characters entered,{#leave} left. ',
+ 'wordOverFlowMsg': '
The number of characters has exceeded allowable maximum values, the server may refuse to save!',
+ 'ok': "OK",
+ 'cancel': "Cancel",
+ 'closeDialog': "closeDialog",
+ 'tableDrag': "You must import the file uiUtils.js before drag! ",
+ 'autofloatMsg': "The plugin AutoFloat depends on EditorUI!",
+ 'loadconfigError': 'Get server config error.',
+ 'loadconfigFormatError': 'Server config format error.',
+ 'loadconfigHttpError': 'Get server config http error.',
+ 'insertcode': {
+ 'as3': 'ActionScript 3',
+ 'bash': 'Bash/Shell',
+ 'cpp': 'C/C++',
+ 'css': 'CSS',
+ 'cf': 'ColdFusion',
+ 'c#': 'C#',
+ 'delphi': 'Delphi',
+ 'diff': 'Diff',
+ 'erlang': 'Erlang',
+ 'groovy': 'Groovy',
+ 'html': 'HTML',
+ 'java': 'Java',
+ 'jfx': 'JavaFX',
+ 'js': 'JavaScript',
+ 'pl': 'Perl',
+ 'php': 'PHP',
+ 'plain': 'Plain Text',
+ 'ps': 'PowerShell',
+ 'python': 'Python',
+ 'ruby': 'Ruby',
+ 'scala': 'Scala',
+ 'sql': 'SQL',
+ 'vb': 'Visual Basic',
+ 'xml': 'XML'
+ },
+ 'confirmClear': "Do you confirm to clear the Document?",
+ 'contextMenu': {
+ 'delete': "Delete",
+ 'selectall': "Select all",
+ 'deletecode': "Delete Code",
+ 'cleardoc': "Clear Document",
+ 'confirmclear': "Do you confirm to clear the Document?",
+ 'unlink': "Unlink",
+ 'paragraph': "Paragraph",
+ 'edittable': "Table property",
+ 'aligncell': 'Align cell',
+ 'aligntable': 'Table alignment',
+ 'tableleft': 'Left float',
+ 'tablecenter': 'Center',
+ 'tableright': 'Right float',
+ 'aligntd': 'Cell alignment',
+ 'edittd': "Cell property",
+ 'setbordervisible': 'set table edge visible',
+ 'table': "Table",
+ 'justifyleft': 'Justify Left',
+ 'justifyright': 'Justify Right',
+ 'justifycenter': 'Justify Center',
+ 'justifyjustify': 'Default',
+ 'deletetable': "Delete table",
+ 'insertparagraphbefore': "InsertedBeforeLine",
+ 'insertparagraphafter': 'InsertedAfterLine',
+ 'inserttable': 'Insert table',
+ 'insertcaption': 'Insert caption',
+ 'deletecaption': 'Delete Caption',
+ 'inserttitle': 'Insert Title',
+ 'deletetitle': 'Delete Title',
+ 'inserttitlecol': 'Insert Title Col',
+ 'deletetitlecol': 'Delete Title Col',
+ 'averageDiseRow': 'AverageDise Row',
+ 'averageDisCol': 'AverageDis Col',
+ 'deleterow': "Delete row",
+ 'deletecol': "Delete col",
+ 'insertrow': "Insert row",
+ 'insertcol': "Insert col",
+ 'insertrownext': 'Insert Row Next',
+ 'insertcolnext': 'Insert Col Next',
+ 'mergeright': "Merge right",
+ 'mergeleft': "Merge left",
+ 'mergedown': "Merge down",
+ 'mergecells': "Merge cells",
+ 'splittocells': "Split to cells",
+ 'splittocols': "Split to Cols",
+ 'splittorows': "Split to Rows",
+ 'tablesort': 'Table sorting',
+ 'enablesort': 'Sorting Enable',
+ 'disablesort': 'Sorting Disable',
+ 'reversecurrent': 'Reverse current',
+ 'orderbyasc': 'Order By ASCII',
+ 'reversebyasc': 'Reverse By ASCII',
+ 'orderbynum': 'Order By Num',
+ 'reversebynum': 'Reverse By Num',
+ 'borderbk': 'Border shading',
+ 'setcolor': 'interlaced color',
+ 'unsetcolor': 'Cancel interlacedcolor',
+ 'setbackground': 'Background interlaced',
+ 'unsetbackground': 'Cancel Bk interlaced',
+ 'redandblue': 'Blue and red',
+ 'threecolorgradient': 'Three-color gradient',
+ 'copy': "Copy(Ctrl + c)",
+ 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!",
+ 'paste': "Paste(Ctrl + v)",
+ 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!"
+ },
+ 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!",
+ 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!",
+ 'anchorMsg': "Link",
+ 'clearColor': 'Clear',
+ 'standardColor': 'Standard color',
+ 'themeColor': 'Theme color',
+ 'property': 'Property',
+ 'default': 'Default',
+ 'modify': 'Modify',
+ 'save': 'Save',
+ 'justifyleft': 'Justify Left',
+ 'justifyright': 'Justify Right',
+ 'justifycenter': 'Justify Center',
+ 'justify': 'Default',
+ 'clear': 'Clear',
+ 'delete': 'Delete',
+ 'clickToUpload': "Click to upload",
+ 'unset': 'Language hasn\'t been set!',
+ 't_row': 'row',
+ 't_col': 'col',
+ 'pasteOpt': 'Paste Option',
+ 'pasteSourceFormat': "Keep Source Formatting",
+ 'tagFormat': 'Keep tag',
+ 'pasteTextFormat': 'Keep Text only',
+ 'more': 'More',
+ 'autoTypeSet': {
+ 'mergeLine': "Merge empty line",
+ 'delLine': "Del empty line",
+ 'removeFormat': "Remove format",
+ 'indent': "Indent",
+ 'alignment': "Alignment",
+ 'imageFloat': "Image float",
+ 'removeFontsize': "Remove font size",
+ 'removeFontFamily': "Remove fontFamily",
+ 'removeHtml': "Remove redundant HTML code",
+ 'pasteFilter': "Paste filter",
+ 'run': "Done",
+ 'symbol': 'Symbol Conversion',
+ 'bdc2sb': 'Full-width to Half-width',
+ 'tobdc': 'Half-width to Full-width'
+ },
+
+ 'background': {
+ 'static': {
+ 'lang_background_normal': 'Normal',
+ 'lang_background_local': 'Online',
+ 'lang_background_set': 'Background Set',
+ 'lang_background_none': 'No Background',
+ 'lang_background_colored': 'Colored Background',
+ 'lang_background_color': 'Color Set',
+ 'lang_background_netimg': 'Net-Image',
+ 'lang_background_align': 'Align Type',
+ 'lang_background_position': 'Position',
+ 'repeatType': {'options': ["Center", "Repeat-x", "Repeat-y", "Tile", "Custom"]}
+ },
+ 'noUploadImage': "No pictures has been uploaded!",
+ 'toggleSelect': 'Change the active state by click!\n Image Size: '
+ },
+ //===============dialog i18N=======================
+ 'insertimage': {
+ 'static': {
+ 'lang_tab_remote': "Insert",
+ 'lang_tab_upload': "Local",
+ 'lang_tab_online': "Manager",
+ 'lang_tab_search': "Search",
+ 'lang_input_url': "Address:",
+ 'lang_input_size': "Size:",
+ 'lang_input_width': "Width",
+ 'lang_input_height': "Height",
+ 'lang_input_border': "Border:",
+ 'lang_input_vhspace': "Margins:",
+ 'lang_input_title': "Title:",
+ 'lang_input_align': 'Image Float Style:',
+ 'lang_imgLoading': "Loading...",
+ 'lang_start_upload': "Start Upload",
+ 'lock': {'title': "Lock rate"},
+ 'searchType': {'title': "ImageType", 'options': ["News", "Wallpaper", "emotions", "photo"]},
+ 'searchTxt': {'value': "Enter the search keyword!"},
+ 'searchBtn': {'value': "Search"},
+ 'searchReset': {'value': "Clear"},
+ 'noneAlign': {'title': 'None Float'},
+ 'leftAlign': {'title': 'Left Float'},
+ 'rightAlign': {'title': 'Right Float'},
+ 'centerAlign': {'title': 'Center In A Line'}
+ },
+ 'uploadSelectFile': 'Select File',
+ 'uploadAddFile': 'Add File',
+ 'uploadStart': 'Start Upload',
+ 'uploadPause': 'Pause Upload',
+ 'uploadContinue': 'Continue Upload',
+ 'uploadRetry': 'Retry Upload',
+ 'uploadDelete': 'Delete',
+ 'uploadTurnLeft': 'Turn Left',
+ 'uploadTurnRight': 'Turn Right',
+ 'uploadPreview': 'Doing Preview',
+ 'uploadNoPreview': 'Can Not Preview',
+ 'updateStatusReady': 'Selected _ pictures, total _KB.',
+ 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
+ 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully',
+ 'updateStatusError': ' and _ upload failed',
+ 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ 'errorExceedSize': 'File Size Exceed',
+ 'errorFileType': 'File Type Not Allow',
+ 'errorInterrupt': 'File Upload Interrupted',
+ 'errorUploadRetry': 'Upload Error, Please Retry.',
+ 'errorHttp': 'Http Error',
+ 'errorServerUpload': 'Server Result Error.',
+ 'remoteLockError': "Cannot Lock the Proportion between width and height",
+ 'numError': "Please enter the correct Num. e.g 123,400",
+ 'imageUrlError': "The image format may be wrong!",
+ 'imageLoadError': "Error,please check the network or URL!",
+ 'searchRemind': "Enter the search keyword!",
+ 'searchLoading': "Image is loading,please wait...",
+ 'searchRetry': " Sorry,can't find the image,please try again!"
+ },
+ 'attachment': {
+ 'static': {
+ 'lang_tab_upload': 'Upload',
+ 'lang_tab_online': 'Online',
+ 'lang_start_upload': "Start upload",
+ 'lang_drop_remind': "You can drop files here, a single maximum of 300 files"
+ },
+ 'uploadSelectFile': 'Select File',
+ 'uploadAddFile': 'Add File',
+ 'uploadStart': 'Start Upload',
+ 'uploadPause': 'Pause Upload',
+ 'uploadContinue': 'Continue Upload',
+ 'uploadRetry': 'Retry Upload',
+ 'uploadDelete': 'Delete',
+ 'uploadTurnLeft': 'Turn Left',
+ 'uploadTurnRight': 'Turn Right',
+ 'uploadPreview': 'Doing Preview',
+ 'updateStatusReady': 'Selected _ files, total _KB.',
+ 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
+ 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
+ 'updateStatusError': ' and _ upload failed',
+ 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ 'errorExceedSize': 'File Size Exceed',
+ 'errorFileType': 'File Type Not Allow',
+ 'errorInterrupt': 'File Upload Interrupted',
+ 'errorUploadRetry': 'Upload Error, Please Retry.',
+ 'errorHttp': 'Http Error',
+ 'errorServerUpload': 'Server Result Error.'
+ },
+
+ 'insertvideo': {
+ 'static': {
+ 'lang_tab_insertV': "Video",
+ 'lang_tab_searchV': "Search",
+ 'lang_tab_uploadV': "Upload",
+ 'lang_video_url': " URL ",
+ 'lang_video_size': "Video Size",
+ 'lang_videoW': "Width",
+ 'lang_videoH': "Height",
+ 'lang_alignment': "Alignment",
+ 'videoSearchTxt': {'value': "Enter the search keyword!"},
+ 'videoType': {'options': ["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]},
+ 'videoSearchBtn': {'value': "Search in Baidu"},
+ 'videoSearchReset': {'value': "Clear result"},
+
+ 'lang_input_fileStatus': ' No file uploaded!',
+ 'startUpload': {'style': "background:url(upload.png) no-repeat;"},
+
+ 'lang_upload_size': "Video Size",
+ 'lang_upload_width': "Width",
+ 'lang_upload_height': "Height",
+ 'lang_upload_alignment': "Alignment",
+ 'lang_format_advice': "Recommends mp4 format."
+ },
+ 'numError': "Please enter the correct Num. e.g 123,400",
+ 'floatLeft': "Float left",
+ 'floatRight': "Float right",
+ 'default': "Default",
+ 'block': "Display in block",
+ 'urlError': "The video url format may be wrong!",
+ 'loading': " The video is loading, please wait…",
+ 'clickToSelect': "Click to select",
+ 'goToSource': 'Visit source video ',
+ 'noVideo': " Sorry,can't find the video,please try again!",
+
+ 'browseFiles': 'Open files',
+ 'uploadSuccess': 'Upload Successful!',
+ 'delSuccessFile': 'Remove from the success of the queue',
+ 'delFailSaveFile': 'Remove the save failed file',
+ 'statusPrompt': ' file(s) uploaded! ',
+ 'flashVersionError': 'The current Flash version is too low, please update FlashPlayer,then try again!',
+ 'flashLoadingError': 'The Flash failed loading! Please check the path or network state',
+ 'fileUploadReady': 'Wait for uploading...',
+ 'delUploadQueue': 'Remove from the uploading queue ',
+ 'limitPrompt1': 'Can not choose more than single',
+ 'limitPrompt2': 'file(s)!Please choose again!',
+ 'delFailFile': 'Remove failure file',
+ 'fileSizeLimit': 'File size exceeds the limit!',
+ 'emptyFile': 'Can not upload an empty file!',
+ 'fileTypeError': 'File type error!',
+ 'unknownError': 'Unknown error!',
+ 'fileUploading': 'Uploading,please wait...',
+ 'cancelUpload': 'Cancel upload',
+ 'netError': 'Network error',
+ 'failUpload': 'Upload failed',
+ 'serverIOError': 'Server IO error!',
+ 'noAuthority': 'No Permission!',
+ 'fileNumLimit': 'Upload limit to the number',
+ 'failCheck': 'Authentication fails, the upload is skipped!',
+ 'fileCanceling': 'Cancel, please wait...',
+ 'stopUploading': 'Upload has stopped...',
+
+ 'uploadSelectFile': 'Select File',
+ 'uploadAddFile': 'Add File',
+ 'uploadStart': 'Start Upload',
+ 'uploadPause': 'Pause Upload',
+ 'uploadContinue': 'Continue Upload',
+ 'uploadRetry': 'Retry Upload',
+ 'uploadDelete': 'Delete',
+ 'uploadTurnLeft': 'Turn Left',
+ 'uploadTurnRight': 'Turn Right',
+ 'uploadPreview': 'Doing Preview',
+ 'updateStatusReady': 'Selected _ files, total _KB.',
+ 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
+ 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
+ 'updateStatusError': ' and _ upload failed',
+ 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ 'errorExceedSize': 'File Size Exceed',
+ 'errorFileType': 'File Type Not Allow',
+ 'errorInterrupt': 'File Upload Interrupted',
+ 'errorUploadRetry': 'Upload Error, Please Retry.',
+ 'errorHttp': 'Http Error',
+ 'errorServerUpload': 'Server Result Error.'
+ },
+ 'template': {
+ 'static': {
+ 'lang_template_bkcolor': 'Background Color',
+ 'lang_template_clear': 'Keep Content',
+ 'lang_template_select': 'Select Template'
+ },
+ 'blank': "Blank",
+ 'blog': "Blog",
+ 'resume': "Resume",
+ 'richText': "Rich Text",
+ 'scrPapers': "Scientific Papers"
+ },
+ scrawl: {
+ 'static': {
+ 'lang_input_previousStep': "Previous",
+ 'lang_input_nextsStep': "Next",
+ 'lang_input_clear': 'Clear',
+ 'lang_input_addPic': 'AddImage',
+ 'lang_input_ScalePic': 'ScaleImage',
+ 'lang_input_removePic': 'RemoveImage',
+ 'J_imgTxt': {title: 'Add background image'}
+ },
+ 'noScarwl': "No paint, a white paper...",
+ 'scrawlUpLoading': "Image is uploading, please wait...",
+ 'continueBtn': "Try again",
+ 'imageError': "Image failed to load!",
+ 'backgroundUploading': 'Image is uploading,please wait...'
+ },
+ anchor: {
+ 'static': {
+ 'lang_input_anchorName': 'Anchor Name:'
+ }
+ },
+ emotion: {
+ 'static': {
+ 'lang_input_choice': 'Choice',
+ 'lang_input_Tuzki': 'Tuzki',
+ 'lang_input_lvdouwa': 'LvDouWa',
+ 'lang_input_BOBO': 'BOBO',
+ 'lang_input_babyCat': 'BabyCat',
+ 'lang_input_bubble': 'Bubble',
+ 'lang_input_youa': 'YouA'
+ }
+ },
+ help: {
+ 'static': {
+ 'lang_input_about': 'About UEditor Plus',
+ 'lang_input_shortcuts': 'Shortcuts',
+ 'lang_input_introduction': "UEditor Plus is based on UEditor.",
+ 'lang_Txt_shortcuts': 'Shortcuts',
+ 'lang_Txt_func': 'Function',
+ 'lang_Txt_bold': 'Bold',
+ 'lang_Txt_copy': 'Copy',
+ 'lang_Txt_cut': 'Cut',
+ 'lang_Txt_Paste': 'Paste',
+ 'lang_Txt_undo': 'Undo',
+ 'lang_Txt_redo': 'Redo',
+ 'lang_Txt_italic': 'Italic',
+ 'lang_Txt_underline': 'Underline',
+ 'lang_Txt_selectAll': 'Select All',
+ 'lang_Txt_visualEnter': 'Submit',
+ 'lang_Txt_fullscreen': 'Fullscreen'
+ }
+ },
+ insertframe: {
+ 'static': {
+ 'lang_input_address': 'Address:',
+ 'lang_input_width': 'Width:',
+ 'lang_input_height': 'height:',
+ 'lang_input_isScroll': 'Enable scrollbars:',
+ 'lang_input_frameborder': 'Show frame border:',
+ 'lang_input_alignMode': 'Alignment:',
+ 'align': {title: "Alignment", options: ["Default", "Left", "Right", "Center"]}
+ },
+ 'enterAddress': 'Please enter an address!'
+ },
+ link: {
+ 'static': {
+ 'lang_input_text': 'Text:',
+ 'lang_input_url': 'URL:',
+ 'lang_input_title': 'Title:',
+ 'lang_input_target': 'open in new window:'
+ },
+ 'validLink': 'Supports only effective when a link is selected',
+ 'httpPrompt': 'The hyperlink you enter should start with "http|https|ftp://"!'
+ },
+ searchreplace: {
+ 'static': {
+ lang_tab_search: "Search",
+ lang_tab_replace: "Replace",
+ lang_search1: "Search",
+ lang_search2: "Search",
+ lang_replace: "Replace",
+ lang_searchReg: 'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
+ lang_searchReg1: 'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
+ lang_case_sensitive1: "Case sense",
+ lang_case_sensitive2: "Case sense",
+ nextFindBtn: {value: "Next"},
+ preFindBtn: {value: "Preview"},
+ nextReplaceBtn: {value: "Next"},
+ preReplaceBtn: {value: "Preview"},
+ repalceBtn: {value: "Replace"},
+ repalceAllBtn: {value: "Replace all"}
+ },
+ getEnd: "Has the search to the bottom!",
+ getStart: "Has the search to the top!",
+ countMsg: "Altogether replaced {#count} character(s)!"
+ },
+ spechars: {
+ 'static': {},
+ tsfh: "Special",
+ lmsz: "Roman",
+ szfh: "Numeral",
+ rwfh: "Japanese",
+ xlzm: "The Greek",
+ ewzm: "Russian",
+ pyzm: "Phonetic",
+ yyyb: "English",
+ zyzf: "Others"
+ },
+ 'edittable': {
+ 'static': {
+ 'lang_tableStyle': 'Table style',
+ 'lang_insertCaption': 'Add table header row',
+ 'lang_insertTitle': 'Add table title row',
+ 'lang_insertTitleCol': 'Add table title col',
+ 'lang_tableSize': 'Automatically adjust table size',
+ 'lang_autoSizeContent': 'Adaptive by form text',
+ 'lang_orderbycontent': "Table of contents sortable",
+ 'lang_autoSizePage': 'Page width adaptive',
+ 'lang_example': 'Example',
+ 'lang_borderStyle': 'Table Border',
+ 'lang_color': 'Color:'
+ },
+ captionName: 'Caption',
+ titleName: 'Title',
+ cellsName: 'text',
+ errorMsg: 'There are merged cells, can not sort.'
+ },
+ 'edittip': {
+ 'static': {
+ lang_delRow: 'Delete entire row',
+ lang_delCol: 'Delete entire col'
+ }
+ },
+ 'edittd': {
+ 'static': {
+ lang_tdBkColor: 'Background Color:'
+ }
+ },
+ 'formula': {
+ 'static': {},
+ },
+ wordimage: {
+ 'static': {
+ lang_resave: "The re-save step",
+ uploadBtn: {src: "upload.png", alt: "Upload"},
+ clipboard: {style: "background: url(copy.png) -153px -1px no-repeat;"},
+ lang_step: " 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process."
+ },
+ fileType: "Image",
+ flashError: "Flash initialization failed!",
+ netError: "Network error! Please try again!",
+ copySuccess: "URL has been copied!",
+
+ 'flashI18n': {
+ lang: encodeURI('{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}'),
+ uploadingTF: encodeURI('{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}'),
+ imageTF: encodeURI('{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}'),
+ textEncoding: "utf-8",
+ addImageSkinURL: "addImage.png",
+ allDeleteBtnUpSkinURL: "allDeleteBtnUpSkin.png",
+ allDeleteBtnHoverSkinURL: "allDeleteBtnHoverSkin.png",
+ rotateLeftBtnEnableSkinURL: "rotateLeftEnable.png",
+ rotateLeftBtnDisableSkinURL: "rotateLeftDisable.png",
+ rotateRightBtnEnableSkinURL: "rotateRightEnable.png",
+ rotateRightBtnDisableSkinURL: "rotateRightDisable.png",
+ deleteBtnEnableSkinURL: "deleteEnable.png",
+ deleteBtnDisableSkinURL: "deleteDisable.png",
+ backgroundURL: '',
+ listBackgroundURL: '',
+ buttonURL: 'button.png'
+ }
+ },
+};
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/addimage.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/addimage.png
new file mode 100644
index 0000000..3a2fd17
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/addimage.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/alldeletebtnhoverskin.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/alldeletebtnhoverskin.png
new file mode 100644
index 0000000..355eeab
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/alldeletebtnhoverskin.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/alldeletebtnupskin.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/alldeletebtnupskin.png
new file mode 100644
index 0000000..61658ce
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/alldeletebtnupskin.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/background.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/background.png
new file mode 100644
index 0000000..d5bf5fd
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/background.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/button.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/button.png
new file mode 100644
index 0000000..098874c
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/button.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/copy.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/copy.png
new file mode 100644
index 0000000..f982e8b
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/copy.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/deletedisable.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/deletedisable.png
new file mode 100644
index 0000000..c8ee750
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/deletedisable.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/deleteenable.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/deleteenable.png
new file mode 100644
index 0000000..26acc88
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/deleteenable.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/listbackground.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/listbackground.png
new file mode 100644
index 0000000..4f82ccd
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/listbackground.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/localimage.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/localimage.png
new file mode 100644
index 0000000..dcecad4
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/localimage.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/music.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/music.png
new file mode 100644
index 0000000..2f495fe
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/music.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotateleftdisable.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotateleftdisable.png
new file mode 100644
index 0000000..741526e
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotateleftdisable.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotateleftenable.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotateleftenable.png
new file mode 100644
index 0000000..e164ddb
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotateleftenable.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotaterightdisable.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotaterightdisable.png
new file mode 100644
index 0000000..5a78c26
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotaterightdisable.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotaterightenable.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotaterightenable.png
new file mode 100644
index 0000000..d768531
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/rotaterightenable.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/upload.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/upload.png
new file mode 100644
index 0000000..7bb15b3
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/en/images/upload.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/copy.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/copy.png
new file mode 100644
index 0000000..b2536aa
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/copy.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/localimage.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/localimage.png
new file mode 100644
index 0000000..ba5f07a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/localimage.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/music.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/music.png
new file mode 100644
index 0000000..354edeb
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/music.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/upload.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/upload.png
new file mode 100644
index 0000000..08d4d92
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/images/upload.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/zh-cn.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/zh-cn.js
new file mode 100644
index 0000000..14079bc
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/lang/zh-cn/zh-cn.js
@@ -0,0 +1,747 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午5:02
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['zh-cn'] = {
+ 'labelMap': {
+ 'anchor': '锚点',
+ 'undo': '撤销',
+ 'redo': '重做',
+ 'bold': '加粗',
+ 'indent': '首行缩进',
+ 'italic': '斜体',
+ 'underline': '下划线',
+ 'strikethrough': '删除线',
+ 'subscript': '下标',
+ 'fontborder': '字符边框',
+ 'superscript': '上标',
+ 'formatmatch': '格式刷',
+ 'source': '源代码',
+ 'blockquote': '引用',
+ 'pasteplain': '纯文本粘贴模式',
+ 'selectall': '全选',
+ 'print': '打印',
+ 'preview': '预览',
+ 'horizontal': '分隔线',
+ 'removeformat': '清除格式',
+ 'time': '时间',
+ 'date': '日期',
+ 'unlink': '取消链接',
+ 'insertrow': '前插入行',
+ 'insertcol': '前插入列',
+ 'mergeright': '右合并单元格',
+ 'mergedown': '下合并单元格',
+ 'deleterow': '删除行',
+ 'deletecol': '删除列',
+ 'splittorows': '拆分成行',
+ 'splittocols': '拆分成列',
+ 'splittocells': '完全拆分单元格',
+ 'deletecaption': '删除表格标题',
+ 'inserttitle': '插入标题',
+ 'mergecells': '合并多个单元格',
+ 'deletetable': '删除表格',
+ 'cleardoc': '清空文档',
+ 'insertparagraphbeforetable': "表格前插入行",
+ 'insertcode': '代码语言',
+ 'fontfamily': '字体',
+ 'fontsize': '字号',
+ 'paragraph': '段落格式',
+ 'simpleupload': '单图上传',
+ 'insertimage': '插入图片',
+ 'edittable': '表格属性',
+ 'edittd': '单元格属性',
+ 'link': '超链接',
+ 'emotion': '表情',
+ 'spechars': '特殊字符',
+ 'searchreplace': '查询替换',
+ 'insertvideo': '视频',
+ 'insertaudio': '音频',
+ 'help': '帮助',
+ 'justifyleft': '居左对齐',
+ 'justifyright': '居右对齐',
+ 'justifycenter': '居中对齐',
+ 'justifyjustify': '两端对齐',
+ 'forecolor': '字体颜色',
+ 'backcolor': '背景色',
+ 'insertorderedlist': '有序列表',
+ 'insertunorderedlist': '无序列表',
+ 'fullscreen': '全屏',
+ 'directionalityltr': '从左向右输入',
+ 'directionalityrtl': '从右向左输入',
+ 'rowspacingtop': '段前距',
+ 'rowspacingbottom': '段后距',
+ 'pagebreak': '分页',
+ 'insertframe': '插入Iframe',
+ 'imagenone': '默认',
+ 'imageleft': '左浮动',
+ 'imageright': '右浮动',
+ 'attachment': '附件',
+ 'imagecenter': '居中',
+ 'wordimage': '图片转存',
+ 'formula': '公式',
+ 'lineheight': '行间距',
+ 'edittip': '编辑提示',
+ 'customstyle': '自定义标题',
+ 'autotypeset': '自动排版',
+ 'touppercase': '字母大写',
+ 'tolowercase': '字母小写',
+ 'background': '背景',
+ 'template': '模板',
+ 'scrawl': '涂鸦',
+ 'inserttable': '插入表格',
+ },
+ 'autosave': {
+ 'autoRestoreTip': '已自动从草稿箱恢复'
+ },
+ 'insertorderedlist': {
+ // 'num': '1,2,3...',
+ // 'num1': '1),2),3)...',
+ // 'num2': '(1),(2),(3)...',
+ // 'cn': '一,二,三....',
+ // 'cn1': '一),二),三)....',
+ // 'cn2': '(一),(二),(三)....',
+ 'decimal': '1,2,3...',
+ 'lower-alpha': 'a,b,c...',
+ 'lower-roman': 'i,ii,iii...',
+ 'upper-alpha': 'A,B,C...',
+ 'upper-roman': 'I,II,III...'
+ },
+ 'insertunorderedlist': {
+ 'circle': '○ 大圆圈',
+ 'disc': '● 小黑点',
+ 'square': '■ 小方块 ',
+ // 'dash': '— 破折号',
+ // 'dot': ' 。 小圆圈'
+ },
+ 'paragraph': {'p': '段落', 'h1': '标题 1', 'h2': '标题 2', 'h3': '标题 3', 'h4': '标题 4', 'h5': '标题 5', 'h6': '标题 6'},
+ 'fontfamily': {
+ 'default': '默认',
+ 'songti': '宋体',
+ 'kaiti': '楷体',
+ 'heiti': '黑体',
+ 'lishu': '隶书',
+ 'yahei': '微软雅黑',
+ // 'andaleMono':'andale mono',
+ 'arial': 'arial',
+ // 'arialBlack':'arial black',
+ // 'comicSansMs':'comic sans ms',
+ // 'impact':'impact',
+ 'timesNewRoman': 'times new roman'
+ },
+ 'customstyle': {
+ 'tc': '标题居中',
+ 'tl': '标题居左',
+ 'im': '强调',
+ 'hi': '明显强调'
+ },
+ 'autoupload': {
+ 'exceedSizeError': '文件大小超出限制',
+ 'exceedTypeError': '文件格式不允许',
+ 'jsonEncodeError': '服务器返回格式错误',
+ 'loading': "正在上传...",
+ 'loadError': "上传错误",
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+ },
+ 'simpleupload': {
+ 'exceedSizeError': '文件大小超出限制',
+ 'exceedTypeError': '文件格式不允许',
+ 'jsonEncodeError': '服务器返回格式错误',
+ 'loading': "正在上传...",
+ 'loadError': "上传错误",
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+ },
+ 'elementPathTip': "元素路径",
+ 'wordCountTip': "字数统计",
+ 'wordCountMsg': '{#count} / {#leave}',
+ 'wordOverFlowMsg': '
字数超出最大允许值,服务器可能拒绝保存!',
+ 'ok': "确认",
+ 'cancel': "取消",
+ 'closeDialog': "关闭对话框",
+ 'tableDrag': "表格拖动必须引入uiUtils.js文件!",
+ 'autofloatMsg': "工具栏浮动依赖编辑器UI,您首先需要引入UI文件!",
+ 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!',
+ 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!',
+ 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!',
+ 'insertcode': {
+ 'as3': 'ActionScript 3',
+ 'bash': 'Bash/Shell',
+ 'cpp': 'C/C++',
+ 'css': 'CSS',
+ 'cf': 'ColdFusion',
+ 'c#': 'C#',
+ 'delphi': 'Delphi',
+ 'diff': 'Diff',
+ 'erlang': 'Erlang',
+ 'groovy': 'Groovy',
+ 'html': 'HTML',
+ 'java': 'Java',
+ 'jfx': 'JavaFX',
+ 'js': 'JavaScript',
+ 'pl': 'Perl',
+ 'php': 'PHP',
+ 'plain': 'Plain Text',
+ 'ps': 'PowerShell',
+ 'python': 'Python',
+ 'ruby': 'Ruby',
+ 'scala': 'Scala',
+ 'sql': 'SQL',
+ 'vb': 'Visual Basic',
+ 'xml': 'XML'
+ },
+ 'confirmClear': "确定清空当前文档么?",
+ 'contextMenu': {
+ 'delete': "删除",
+ 'selectall': "全选",
+ 'deletecode': "删除代码",
+ 'cleardoc': "清空文档",
+ 'confirmclear': "确定清空当前文档么?",
+ 'unlink': "删除超链接",
+ 'paragraph': "段落格式",
+ 'edittable': "表格属性",
+ 'aligntd': "单元格对齐方式",
+ 'aligntable': '表格对齐方式',
+ 'tableleft': '左浮动',
+ 'tablecenter': '居中显示',
+ 'tableright': '右浮动',
+ 'edittd': "单元格属性",
+ 'setbordervisible': '设置表格边线可见',
+ 'justifyleft': '左对齐',
+ 'justifyright': '右对齐',
+ 'justifycenter': '居中对齐',
+ 'justifyjustify': '两端对齐',
+ 'table': "表格",
+ 'inserttable': '插入表格',
+ 'deletetable': "删除表格",
+ 'insertparagraphbefore': "前插入段落",
+ 'insertparagraphafter': '后插入段落',
+ 'deleterow': "删除当前行",
+ 'deletecol': "删除当前列",
+ 'insertrow': "前插入行",
+ 'insertcol': "左插入列",
+ 'insertrownext': '后插入行',
+ 'insertcolnext': '右插入列',
+ 'insertcaption': '插入表格名称',
+ 'deletecaption': '删除表格名称',
+ 'inserttitle': '插入表格标题行',
+ 'deletetitle': '删除表格标题行',
+ 'inserttitlecol': '插入表格标题列',
+ 'deletetitlecol': '删除表格标题列',
+ 'averageDiseRow': '平均分布各行',
+ 'averageDisCol': '平均分布各列',
+ 'mergeright': "向右合并",
+ 'mergeleft': "向左合并",
+ 'mergedown': "向下合并",
+ 'mergecells': "合并单元格",
+ 'splittocells': "完全拆分单元格",
+ 'splittocols': "拆分成列",
+ 'splittorows': "拆分成行",
+ 'tablesort': '表格排序',
+ 'enablesort': '设置表格可排序',
+ 'disablesort': '取消表格可排序',
+ 'reversecurrent': '逆序当前',
+ 'orderbyasc': '按ASCII字符升序',
+ 'reversebyasc': '按ASCII字符降序',
+ 'orderbynum': '按数值大小升序',
+ 'reversebynum': '按数值大小降序',
+ 'borderbk': '边框底纹',
+ 'setcolor': '表格隔行变色',
+ 'unsetcolor': '取消表格隔行变色',
+ 'setbackground': '选区背景隔行',
+ 'unsetbackground': '取消选区背景',
+ 'redandblue': '红蓝相间',
+ 'threecolorgradient': '三色渐变',
+ 'copy': "复制(Ctrl + c)",
+ 'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
+ 'paste': "粘贴(Ctrl + v)",
+ 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'"
+ },
+ 'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
+ 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'",
+ 'anchorMsg': "链接",
+ 'clearColor': '清空颜色',
+ 'standardColor': '标准颜色',
+ 'themeColor': '主题颜色',
+ 'property': '属性',
+ 'default': '默认',
+ 'modify': '修改',
+ 'save': '保存',
+ 'justifyleft': '左对齐',
+ 'justifyright': '右对齐',
+ 'justifycenter': '居中',
+ 'justify': '默认',
+ 'clear': '清除',
+ 'delete': '删除',
+ 'clickToUpload': "点击上传",
+ 'unset': '尚未设置语言文件',
+ 't_row': '行',
+ 't_col': '列',
+ 'more': '更多',
+ 'pasteOpt': '粘贴选项',
+ 'pasteSourceFormat': "保留源格式",
+ 'tagFormat': '只保留标签',
+ 'pasteTextFormat': '只保留文本',
+ 'autoTypeSet': {
+ 'mergeLine': "合并空行",
+ 'delLine': "清除空行",
+ 'removeFormat': "清除格式",
+ 'indent': "首行缩进",
+ 'alignment': "对齐方式",
+ 'imageFloat': "图片浮动",
+ 'removeFontsize': "清除字号",
+ 'removeFontFamily': "清除字体",
+ 'removeHtml': "清除冗余HTML代码",
+ 'pasteFilter': "粘贴过滤",
+ 'run': "执行",
+ 'symbol': '符号转换',
+ 'bdc2sb': '全角转半角',
+ 'tobdc': '半角转全角'
+ },
+
+ 'background': {
+ 'static': {
+ 'lang_background_normal': '背景设置',
+ 'lang_background_local': '在线图片',
+ 'lang_background_set': '选项',
+ 'lang_background_none': '无背景色',
+ 'lang_background_colored': '有背景色',
+ 'lang_background_color': '颜色设置',
+ 'lang_background_netimg': '网络图片',
+ 'lang_background_align': '对齐方式',
+ 'lang_background_position': '精确定位',
+ 'repeatType': {'options': ["居中", "横向重复", "纵向重复", "平铺", "自定义"]}
+
+ },
+ 'noUploadImage': "当前未上传过任何图片!",
+ 'toggleSelect': "单击可切换选中状态\n原图尺寸: "
+ },
+ //===============dialog i18N=======================
+ 'insertimage': {
+ 'static': {
+ 'lang_tab_remote': "插入图片", //节点
+ 'lang_tab_upload': "本地上传",
+ 'lang_tab_online': "在线管理",
+ 'lang_input_url': "地 址:",
+ 'lang_input_size': "大 小:",
+ 'lang_input_width': "宽度",
+ 'lang_input_height': "高度",
+ 'lang_input_border': "边 框:",
+ 'lang_input_vhspace': "边 距:",
+ 'lang_input_title': "描 述:",
+ 'lang_input_align': '图片浮动方式:',
+ 'lang_imgLoading': " 图片加载中……",
+ 'lang_start_upload': "开始上传",
+ 'lock': {'title': "锁定宽高比例"}, //属性
+ 'searchType': {'title': "图片类型", 'options': ["新闻", "壁纸", "表情", "头像"]}, //select的option
+ 'searchTxt': {'value': "请输入搜索关键词"},
+ 'searchBtn': {'value': "百度一下"},
+ 'searchReset': {'value': "清空搜索"},
+ 'noneAlign': {'title': '无浮动'},
+ 'leftAlign': {'title': '左浮动'},
+ 'rightAlign': {'title': '右浮动'},
+ 'centerAlign': {'title': '居中独占一行'}
+ },
+ 'uploadSelectFile': '点击选择图片',
+ 'uploadAddFile': '继续添加',
+ 'uploadStart': '开始上传',
+ 'uploadPause': '暂停上传',
+ 'uploadContinue': '继续上传',
+ 'uploadRetry': '重试上传',
+ 'uploadDelete': '删除',
+ 'uploadTurnLeft': '向左旋转',
+ 'uploadTurnRight': '向右旋转',
+ 'uploadPreview': '预览中',
+ 'uploadNoPreview': '不能预览',
+ 'updateStatusReady': '选中_张图片,共_KB。',
+ 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败',
+ 'updateStatusFinish': '共_张(_KB),_张上传成功',
+ 'updateStatusError': ',_张上传失败。',
+ 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+ 'errorExceedSize': '文件大小超出',
+ 'errorFileType': '文件格式不允许',
+ 'errorInterrupt': '文件传输中断',
+ 'errorUploadRetry': '上传失败,请重试',
+ 'errorHttp': 'http请求错误',
+ 'errorServerUpload': '服务器返回出错',
+ 'remoteLockError': "宽高不正确,不能所定比例",
+ 'numError': "请输入正确的长度或者宽度值!例如:123,400",
+ 'imageUrlError': "不允许的图片格式或者图片域!",
+ 'imageLoadError': "图片加载失败!请检查链接地址或网络状态!",
+ 'searchRemind': "请输入搜索关键词",
+ 'searchLoading': "图片加载中,请稍后……",
+ 'searchRetry': " :( ,抱歉,没有找到图片!请重试一次!"
+ },
+ 'attachment': {
+ 'static': {
+ 'lang_tab_upload': '上传附件',
+ 'lang_tab_online': '在线附件',
+ 'lang_start_upload': "开始上传",
+ 'lang_drop_remind': "可以将文件拖到这里,单次最多可选100个文件"
+ },
+ 'uploadSelectFile': '点击选择文件',
+ 'uploadAddFile': '继续添加',
+ 'uploadStart': '开始上传',
+ 'uploadPause': '暂停上传',
+ 'uploadContinue': '继续上传',
+ 'uploadRetry': '重试上传',
+ 'uploadDelete': '删除',
+ 'uploadTurnLeft': '向左旋转',
+ 'uploadTurnRight': '向右旋转',
+ 'uploadPreview': '预览中',
+ 'updateStatusReady': '选中_个文件,共_KB。',
+ 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败',
+ 'updateStatusFinish': '共_个(_KB),_个上传成功',
+ 'updateStatusError': ',_张上传失败。',
+ 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+ 'errorExceedSize': '文件大小超出',
+ 'errorFileType': '文件格式不允许',
+ 'errorInterrupt': '文件传输中断',
+ 'errorUploadRetry': '上传失败,请重试',
+ 'errorHttp': 'http请求错误',
+ 'errorServerUpload': '服务器返回出错'
+ },
+ 'insertvideo': {
+ 'static': {
+ 'lang_tab_insertV': "插入视频",
+ 'lang_tab_searchV': "搜索视频",
+ 'lang_tab_uploadV': "上传视频",
+ 'lang_video_url': "视频网址",
+ 'lang_video_size': "视频尺寸",
+ 'lang_videoW': "宽度",
+ 'lang_videoH': "高度",
+ 'lang_alignment': "对齐方式",
+ 'videoSearchTxt': {'value': "请输入搜索关键字!"},
+ 'videoType': {'options': ["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
+ 'videoSearchBtn': {'value': "百度一下"},
+ 'videoSearchReset': {'value': "清空结果"},
+
+ 'lang_input_fileStatus': ' 当前未上传文件',
+ 'startUpload': {'style': "background:url(upload.png) no-repeat;"},
+
+ 'lang_upload_size': "视频尺寸",
+ 'lang_upload_width': "宽度",
+ 'lang_upload_height': "高度",
+ 'lang_upload_alignment': "对齐方式",
+ 'lang_format_advice': "建议使用mp4格式."
+
+ },
+ 'numError': "请输入正确的数值,如123,400",
+ 'floatLeft': "左浮动",
+ 'floatRight': "右浮动",
+ 'default': "默认",
+ 'block': "独占一行",
+ 'urlError': "输入的视频地址有误,请检查后再试!",
+ 'loading': " 视频加载中,请等待……",
+ 'clickToSelect': "点击选中",
+ 'goToSource': '访问源视频',
+ 'noVideo': " 抱歉,找不到对应的视频,请重试!",
+
+ 'browseFiles': '浏览文件',
+ 'uploadSuccess': '上传成功!',
+ 'delSuccessFile': '从成功队列中移除',
+ 'delFailSaveFile': '移除保存失败文件',
+ 'statusPrompt': ' 个文件已上传! ',
+ 'flashVersionError': '当前Flash版本过低,请更新FlashPlayer后重试!',
+ 'flashLoadingError': 'Flash加载失败!请检查路径或网络状态',
+ 'fileUploadReady': '等待上传……',
+ 'delUploadQueue': '从上传队列中移除',
+ 'limitPrompt1': '单次不能选择超过',
+ 'limitPrompt2': '个文件!请重新选择!',
+ 'delFailFile': '移除失败文件',
+ 'fileSizeLimit': '文件大小超出限制!',
+ 'emptyFile': '空文件无法上传!',
+ 'fileTypeError': '文件类型不允许!',
+ 'unknownError': '未知错误!',
+ 'fileUploading': '上传中,请等待……',
+ 'cancelUpload': '取消上传',
+ 'netError': '网络错误',
+ 'failUpload': '上传失败!',
+ 'serverIOError': '服务器IO错误!',
+ 'noAuthority': '无权限!',
+ 'fileNumLimit': '上传个数限制',
+ 'failCheck': '验证失败,本次上传被跳过!',
+ 'fileCanceling': '取消中,请等待……',
+ 'stopUploading': '上传已停止……',
+
+ 'uploadSelectFile': '点击选择文件',
+ 'uploadAddFile': '继续添加',
+ 'uploadStart': '开始上传',
+ 'uploadPause': '暂停上传',
+ 'uploadContinue': '继续上传',
+ 'uploadRetry': '重试上传',
+ 'uploadDelete': '删除',
+ 'uploadTurnLeft': '向左旋转',
+ 'uploadTurnRight': '向右旋转',
+ 'uploadPreview': '预览中',
+ 'updateStatusReady': '选中_个文件,共_KB。',
+ 'updateStatusConfirm': '成功上传_个,_个失败',
+ 'updateStatusFinish': '共_个(_KB),_个成功上传',
+ 'updateStatusError': ',_张上传失败。',
+ 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+ 'errorExceedSize': '文件大小超出',
+ 'errorFileType': '文件格式不允许',
+ 'errorInterrupt': '文件传输中断',
+ 'errorUploadRetry': '上传失败,请重试',
+ 'errorHttp': 'http请求错误',
+ 'errorServerUpload': '服务器返回出错'
+ },
+ 'insertaudio': {
+ 'static': {
+ 'lang_tab_insertV': "插入音频",
+ 'lang_tab_searchV': "搜索音频",
+ 'lang_tab_uploadV': "上传音频",
+ 'lang_video_url': "音频网址",
+ 'lang_video_size': "音频尺寸",
+ 'lang_videoW': "宽度",
+ 'lang_videoH': "高度",
+ 'lang_alignment': "对齐方式",
+ 'videoSearchTxt': {'value': "请输入搜索关键字!"},
+ 'videoType': {'options': ["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
+ 'videoSearchBtn': {'value': "百度一下"},
+ 'videoSearchReset': {'value': "清空结果"},
+
+ 'lang_input_fileStatus': ' 当前未上传文件',
+ 'startUpload': {'style': "background:url(upload.png) no-repeat;"},
+
+ 'lang_upload_size': "音频尺寸",
+ 'lang_upload_width': "宽度",
+ 'lang_upload_height': "高度",
+ 'lang_upload_alignment': "对齐方式",
+ 'lang_format_advice': "建议使用mp4格式."
+
+ },
+ 'numError': "请输入正确的数值,如123,400",
+ 'floatLeft': "左浮动",
+ 'floatRight': "右浮动",
+ 'default': "默认",
+ 'block': "独占一行",
+ 'urlError': "输入的音频地址有误,请检查后再试!",
+ 'loading': " 音频加载中,请等待……",
+ 'clickToSelect': "点击选中",
+ 'goToSource': '访问源音频',
+ 'noVideo': " 抱歉,找不到对应的音频,请重试!",
+
+ 'browseFiles': '浏览文件',
+ 'uploadSuccess': '上传成功!',
+ 'delSuccessFile': '从成功队列中移除',
+ 'delFailSaveFile': '移除保存失败文件',
+ 'statusPrompt': ' 个文件已上传! ',
+ 'flashVersionError': '当前Flash版本过低,请更新FlashPlayer后重试!',
+ 'flashLoadingError': 'Flash加载失败!请检查路径或网络状态',
+ 'fileUploadReady': '等待上传……',
+ 'delUploadQueue': '从上传队列中移除',
+ 'limitPrompt1': '单次不能选择超过',
+ 'limitPrompt2': '个文件!请重新选择!',
+ 'delFailFile': '移除失败文件',
+ 'fileSizeLimit': '文件大小超出限制!',
+ 'emptyFile': '空文件无法上传!',
+ 'fileTypeError': '文件类型不允许!',
+ 'unknownError': '未知错误!',
+ 'fileUploading': '上传中,请等待……',
+ 'cancelUpload': '取消上传',
+ 'netError': '网络错误',
+ 'failUpload': '上传失败!',
+ 'serverIOError': '服务器IO错误!',
+ 'noAuthority': '无权限!',
+ 'fileNumLimit': '上传个数限制',
+ 'failCheck': '验证失败,本次上传被跳过!',
+ 'fileCanceling': '取消中,请等待……',
+ 'stopUploading': '上传已停止……',
+
+ 'uploadSelectFile': '点击选择文件',
+ 'uploadAddFile': '继续添加',
+ 'uploadStart': '开始上传',
+ 'uploadPause': '暂停上传',
+ 'uploadContinue': '继续上传',
+ 'uploadRetry': '重试上传',
+ 'uploadDelete': '删除',
+ 'uploadTurnLeft': '向左旋转',
+ 'uploadTurnRight': '向右旋转',
+ 'uploadPreview': '预览中',
+ 'updateStatusReady': '选中_个文件,共_KB。',
+ 'updateStatusConfirm': '成功上传_个,_个失败',
+ 'updateStatusFinish': '共_个(_KB),_个成功上传',
+ 'updateStatusError': ',_张上传失败。',
+ 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+ 'errorExceedSize': '文件大小超出',
+ 'errorFileType': '文件格式不允许',
+ 'errorInterrupt': '文件传输中断',
+ 'errorUploadRetry': '上传失败,请重试',
+ 'errorHttp': 'http请求错误',
+ 'errorServerUpload': '服务器返回出错'
+ },
+ 'template': {
+ 'static': {
+ 'lang_template_bkcolor': '背景颜色',
+ 'lang_template_clear': '保留原有内容',
+ 'lang_template_select': '选择模板'
+ },
+ 'blank': "空白文档",
+ 'blog': "博客文章",
+ 'resume': "个人简历",
+ 'richText': "图文混排",
+ 'sciPapers': "科技论文"
+
+
+ },
+ 'scrawl': {
+ 'static': {
+ 'lang_input_previousStep': "上一步",
+ 'lang_input_nextsStep': "下一步",
+ 'lang_input_clear': '清空',
+ 'lang_input_addPic': '添加背景',
+ 'lang_input_ScalePic': '缩放背景',
+ 'lang_input_removePic': '删除背景',
+ 'J_imgTxt': {title: '添加背景图片'}
+ },
+ 'noScarwl': "尚未作画,白纸一张~",
+ 'scrawlUpLoading': "涂鸦上传中,别急哦~",
+ 'continueBtn': "继续",
+ 'imageError': "糟糕,图片读取失败了!",
+ 'backgroundUploading': '背景图片上传中,别急哦~'
+ },
+ 'anchor': {
+ 'static': {
+ 'lang_input_anchorName': '锚点名字:'
+ }
+ },
+ 'emotion': {
+ 'static': {
+ 'lang_input_choice': '精选',
+ 'lang_input_Tuzki': '兔斯基',
+ 'lang_input_BOBO': 'BOBO',
+ 'lang_input_lvdouwa': '绿豆蛙',
+ 'lang_input_babyCat': 'baby猫',
+ 'lang_input_bubble': '泡泡',
+ 'lang_input_youa': '有啊'
+ }
+ },
+ 'help': {
+ 'static': {
+ 'lang_input_about': '关于 UEditor Plus',
+ 'lang_input_shortcuts': '快捷键',
+ 'lang_input_introduction': 'UEditor Plus 是基于百度UEditor二次开发的所见即所得富文本web编辑器,主要丰富也界面样式,注重用户体验等特点。基于Apache 2.0协议开源,允许自由使用和修改代码。',
+ 'lang_Txt_shortcuts': '快捷键',
+ 'lang_Txt_func': '功能',
+ 'lang_Txt_bold': '给选中字设置为加粗',
+ 'lang_Txt_copy': '复制选中内容',
+ 'lang_Txt_cut': '剪切选中内容',
+ 'lang_Txt_Paste': '粘贴',
+ 'lang_Txt_undo': '重新执行上次操作',
+ 'lang_Txt_redo': '撤销上一次操作',
+ 'lang_Txt_italic': '给选中字设置为斜体',
+ 'lang_Txt_underline': '给选中字加下划线',
+ 'lang_Txt_selectAll': '全部选中',
+ 'lang_Txt_visualEnter': '软回车',
+ 'lang_Txt_fullscreen': '全屏'
+ }
+ },
+ 'insertframe': {
+ 'static': {
+ 'lang_input_address': '地址:',
+ 'lang_input_width': '宽度:',
+ 'lang_input_height': '高度:',
+ 'lang_input_isScroll': '允许滚动条:',
+ 'lang_input_frameborder': '显示框架边框:',
+ 'lang_input_alignMode': '对齐方式:',
+ 'align': {title: "对齐方式", options: ["默认", "左对齐", "右对齐", "居中"]}
+ },
+ 'enterAddress': '请输入地址!'
+ },
+ 'link': {
+ 'static': {
+ 'lang_input_text': '文本内容:',
+ 'lang_input_url': '链接地址:',
+ 'lang_input_title': '标题:',
+ 'lang_input_target': '是否在新窗口打开:'
+ },
+ 'validLink': '只支持选中一个链接时生效',
+ 'httpPrompt': '您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀'
+ },
+ 'searchreplace': {
+ 'static': {
+ lang_tab_search: "查找",
+ lang_tab_replace: "替换",
+ lang_search1: "查找",
+ lang_search2: "查找",
+ lang_replace: "替换",
+ lang_searchReg: '支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
+ lang_searchReg1: '支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
+ lang_case_sensitive1: "区分大小写",
+ lang_case_sensitive2: "区分大小写",
+ nextFindBtn: {value: "下一个"},
+ preFindBtn: {value: "上一个"},
+ nextReplaceBtn: {value: "下一个"},
+ preReplaceBtn: {value: "上一个"},
+ repalceBtn: {value: "替换"},
+ repalceAllBtn: {value: "全部替换"}
+ },
+ getEnd: "已经搜索到文章末尾!",
+ getStart: "已经搜索到文章头部",
+ countMsg: "总共替换了{#count}处!"
+ },
+ 'spechars': {
+ 'static': {},
+ tsfh: "特殊字符",
+ lmsz: "罗马字符",
+ szfh: "数学字符",
+ rwfh: "日文字符",
+ xlzm: "希腊字母",
+ ewzm: "俄文字符",
+ pyzm: "拼音字母",
+ yyyb: "英语音标",
+ zyzf: "其他"
+ },
+ 'edittable': {
+ 'static': {
+ 'lang_tableStyle': '表格样式',
+ 'lang_insertCaption': '添加表格名称行',
+ 'lang_insertTitle': '添加表格标题行',
+ 'lang_insertTitleCol': '添加表格标题列',
+ 'lang_orderbycontent': "使表格内容可排序",
+ 'lang_tableSize': '自动调整表格尺寸',
+ 'lang_autoSizeContent': '按表格文字自适应',
+ 'lang_autoSizePage': '按页面宽度自适应',
+ 'lang_example': '示例',
+ 'lang_borderStyle': '表格边框',
+ 'lang_color': '颜色:'
+ },
+ captionName: '表格名称',
+ titleName: '标题',
+ cellsName: '内容',
+ errorMsg: '有合并单元格,不可排序'
+ },
+ 'edittip': {
+ 'static': {
+ lang_delRow: '删除整行',
+ lang_delCol: '删除整列'
+ }
+ },
+ 'edittd': {
+ 'static': {
+ lang_tdBkColor: '背景颜色:'
+ }
+ },
+ 'formula': {
+ 'static': {},
+ },
+ 'wordimage': {
+ 'static': {
+ lang_resave: "转存步骤",
+ uploadBtn: {src: "upload.png", alt: "上传"},
+ clipboard: {style: "background: url(copy.png) -153px -1px no-repeat;"},
+ lang_step: "1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。"
+ },
+ 'fileType': "图片",
+ 'flashError': "FLASH初始化失败,请检查FLASH插件是否正确安装!",
+ 'netError': "网络连接错误,请重试!",
+ 'copySuccess': "图片地址已经复制!",
+ 'flashI18n': {} //留空默认中文
+ },
+};
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/plugins/demo/demo.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/plugins/demo/demo.js
new file mode 100644
index 0000000..addd6e0
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/plugins/demo/demo.js
@@ -0,0 +1,3 @@
+(function () {
+
+})();
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/css/ueditor.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/css/ueditor.css
new file mode 100644
index 0000000..531cf89
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/css/ueditor.css
@@ -0,0 +1,2136 @@
+/*基础UI构建
+*/
+:root {
+ --edui-color-active-bg: rgba(200, 200, 200, 0.3);
+ --edui-color-border: #EEEEEE;
+ --edui-bg-toolbar: #FFFFFF;
+ --edui-color-muted: #CCCCCC;
+}
+@font-face {
+ font-family: "edui-iconfont";
+ /* Project id 2897874 */
+ src: url("data:application/octet-stream;base64,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") format('woff2'), url("data:application/octet-stream;base64,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") format('woff'), url("data:application/octet-stream;base64,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AGIAAOYAAADmAAAAADIAAOYBAADmAQAAADMAAOYCAADmAgAAADQAAOYDAADmAwAAADUAAOYEAADmBAAAADYAAOYFAADmBQAAAFwAAOYGAADmBgAAADcAAOYHAADmBwAAADgAAOYIAADmCAAAAFMAAOYJAADmCQAAADkAAOYKAADmCgAAADoAAOYLAADmCwAAADsAAOYMAADmDAAAADwAAOYNAADmDQAAAD0AAOYOAADmDgAAAEwAAOYPAADmDwAAAD4AAOYQAADmEAAAACIAAOYRAADmEQAAACMAAOYSAADmEgAAACQAAOYTAADmEwAAAB8AAOYUAADmFAAAACAAAOYVAADmFQAAACEAAOYWAADmFgAAAE4AAOYXAADmFwAAAB4AAOYYAADmGAAAABkAAOYZAADmGQAAABwAAOYaAADmGgAAAB0AAOYbAADmGwAAABsAAOYcAADmHAAAABkAAOYdAADmHQAAABoAAOYeAADmHgAAABgAAOYfAADmHwAAABQAAOYgAADmIAAAABUAAOYhAADmIQAAABYAAOYiAADmIgAAABcAAOYjAADmIwAAAAcAAOYkAADmJAAAAAYAAOYoAADmKAAAAGEAAOYqAADmKgAAAF0AAOYtAADmLQAAAEsAAOYvAADmLwAAAC4AAOY2AADmNgAAAFoAAOY3AADmNwAAAEEAAOY4AADmOAAAAEoAAOY+AADmPgAAAFsAAOZEAADmRAAAAAoAAOZIAADmSAAAAF4AAOZJAADmSQAAADAAAOZKAADmSgAAAF8AAOZMAADmTAAAAGAAAOZWAADmVgAAAA0AAOZiAADmYgAAAFEAAOZlAADmZQAAAAIAAOZpAADmaQAAABIAAOZ1AADmdQAAAEQAAOZ6AADmegAAABAAAOaAAADmgAAAABEAAOaXAADmlwAAAAsAAOanAADmpwAAAFAAAOatAADmrQAAAEYAAObAAADmwAAAAAUAAObYAADm2AAAAEIAAOb4AADm+AAAAEcAAOb5AADm+QAAAEgAAOb6AADm+gAAAEkAAOcEAADnBAAAACwAAOcLAADnCwAAAA8AAOcaAADnGgAAADEAAOc1AADnNQAAAEUAAOc3AADnNwAAACkAAOdSAADnUgAAAA4AAOd7AADnewAAAAEAAOeCAADnggAAAFIAAOetAADnrQAAAEAAAOe8AADnvAAA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MQAuADAAZQBkAHUAaQAtAGkAYwBvAG4AZgBvAG4AdABHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYgECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMABXNvdW5kBXJpZ2h0D2ljX2ltYWdlX3VwbG9hZAVjaGVjawZpZnJhbWUQQmFja2dyb3VuZEVmZmVjdANsdHIDcnRsC2ZpbmRyZXBsYWNlCWljcHJldmlldwVyaXFpMgtldXJvLXN5bWJvbAVtdXNpYwRoZWxwCWhhbmRfZHJhdwVwcmludAR0aW1lBWJhaWR1C0dvb2dsZS1NYXBzCmltYWdlLW5vbmUMaW1hZ2UtY2VudGVyCmltYWdlLWxlZnQLaW1hZ2UtcmlnaHQJY2xlYXItZG9jC3dvcmQtaW1hZ2UxCnBhZ2UtYnJlYWsGYXV0aG9yC3RvdXBwZXJjYXNlC3RvbG93ZXJjYXNlCmhvcml6b250YWwPbWVyZ2UtZG93bi1jZWxsC21lcmdlLWNlbGxzEG1lcmdlLXJpZ2h0LWNlbGwNc3BsaXQtdG8tcm93cw1zcGxpdC10by1jb2xzDnNwbGl0LXRvLWNlbGxzDmluc2VydHJvd2Fib3ZlGjI0Z2wtcGFyYWdyYXBoTWFyZ2luQm90dG9tFzI0Z2wtcGFyYWdyYXBoTWFyZ2luVG9wDXVub3JkZXJlZGxpc3QMbGlzdC1vcmRlcmVkFHNwbGl0LWNlbGxzLXZlcnRpY2FsFnNwbGl0LWNlbGxzLWhvcml6b250YWwKYXR0YWNobWVudAlzdWJzY3JpcHQJc2VsZWN0YWxsC3N1cGVyc2NyaXB0A21hcAliZy1jb2xvcnMNYWRkX2NvbF9hZnRlcg5hZGRfY29sX2JlZm9yZQ1hZGRfcm93X2FmdGVyDmFkZF9yb3dfYmVmb3JlCmRlbGV0ZV9jb2wNY29tYmluZV9jZWxscwJvbApkZWxldGVfcm93DGRlbGV0ZV90YWJsZQJ1bARyZWRvBXRhYmxlBHVuZG8FcGFzdGUGdXBsb2FkBWJydXNoCnRleHRfcXVvdGURaW5zZXJ0LXJvdy1ib3R0b20RZnVsbHNjcmVlbi1leHBhbmQOaW5zZXJ0LXJvdy10b3AIdGVtcGxhdGUSZm9ybWF0LWltYWdlLXJpZ2h0EWZvcm1hdC1pbWFnZS1sZWZ0E2Zvcm1hdC1pbWFnZS1jZW50ZXILbGluZS1oZWlnaHQXQWZ0ZXJjbGFzc1RleHQtT3V0bGluZWQFc21pbGUNYWxpZ24tanVzdGlmeQdmb3JtdWxhCmFuZ2xlLWRvd24FY2xvc2UKbWFnaWMtd2FuZAZlcmFzZXIEaHRtbAZ1bmxpbmsGaW5kZW50C2FsaWduLXJpZ2h0DGFsaWduLWNlbnRlcgphbGlnbi1sZWZ0C2ZvbnQtY29sb3JzBHBsYXkJdW5kZXJsaW5lBWltYWdlBml0YWxpYwRsaW5rBnN0cmlrZQRjb2RlBGJvbGQAAAAAAA==") format('truetype');
+}
+.edui-default {
+ accent-color: #333;
+}
+/* common layer */
+.edui-default .edui-box {
+ border: none;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+ line-height: 30px;
+}
+.edui-default a.edui-box {
+ display: block;
+ text-decoration: none;
+ color: black;
+}
+.edui-default a.edui-box:hover {
+ text-decoration: none;
+}
+.edui-default a.edui-box:active {
+ text-decoration: none;
+}
+.edui-default table.edui-box {
+ border-collapse: collapse;
+}
+.edui-default ul.edui-box {
+ list-style-type: none;
+}
+div.edui-box {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+.edui-default .edui-clearfix {
+ zoom: 1;
+}
+.edui-default .edui-clearfix:after {
+ content: '\20';
+ display: block;
+ clear: both;
+}
+* html div.edui-box {
+ display: inline !important;
+}
+*:first-child + html div.edui-box {
+ display: inline !important;
+}
+/* control layout */
+.edui-default .edui-button-body,
+.edui-splitbutton-body,
+.edui-menubutton-body,
+.edui-combox-body {
+ position: relative;
+}
+.edui-default .edui-popup {
+ position: absolute;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+}
+.edui-default .edui-popup .edui-shadow {
+ position: absolute;
+ z-index: -1;
+}
+.edui-default .edui-popup .edui-bordereraser {
+ position: absolute;
+ overflow: hidden;
+}
+.edui-default .edui-tablepicker .edui-canvas {
+ position: relative;
+}
+.edui-default .edui-tablepicker .edui-canvas .edui-overlay {
+ position: absolute;
+}
+.edui-default .edui-dialog-modalmask,
+.edui-dialog-dragmask {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+}
+.edui-default .edui-toolbar {
+ position: relative;
+}
+/*
+ * default theme
+ */
+.edui-default .edui-label {
+ cursor: pointer;
+}
+.edui-default span.edui-clickable {
+ color: #666;
+ cursor: pointer;
+ text-decoration: none;
+}
+.edui-default span.edui-clickable:hover {
+ color: #333;
+}
+.edui-default span.edui-unclickable {
+ color: gray;
+ cursor: default;
+}
+.edui-default span.edui-popup-action-item {
+ margin-right: 5px;
+}
+.edui-default span.edui-popup-action-item:last-child {
+ margin-right: 0;
+}
+
+/* 工具栏 */
+.edui-default .edui-toolbar {
+ cursor: default;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ padding: 1px;
+ overflow: hidden; /*全屏下单独一行不占位*/
+ zoom: 1;
+ width: auto;
+ height: auto;
+}
+
+.edui-default .edui-toolbar .edui-button,
+.edui-default .edui-toolbar .edui-splitbutton,
+.edui-default .edui-toolbar .edui-menubutton,
+.edui-default .edui-toolbar .edui-combox {
+ margin: 1px;
+}
+
+/*UI工具栏、编辑区域、底部*/
+.edui-default .edui-editor {
+ border: 1px solid var(--edui-color-border);
+ background-color: white;
+ position: relative;
+ overflow: visible;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.edui-editor div {
+ width: auto;
+ height: auto;
+}
+
+.edui-default .edui-editor-toolbarbox {
+ position: relative;
+ zoom: 1;
+ /*-webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);*/
+ /*-moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);*/
+ /*box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);*/
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+
+.edui-default .edui-editor-toolbarboxouter {
+ border-bottom: 1px solid var(--edui-color-border);
+ background-color: var(--edui-bg-toolbar);
+ /*background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);*/
+ /*background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));*/
+ /*background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);*/
+ /*background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);*/
+ /*background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);*/
+ /*background-repeat: repeat-x;*/
+ /*border: 1px solid #d4d4d4;*/
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+ /*filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*/
+ /**zoom: 1;*/
+ /*-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);*/
+ /*-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);*/
+ /*box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);*/
+}
+
+.edui-default .edui-editor-toolbarboxinner {
+ padding: 2px;
+}
+
+.edui-default .edui-editor-iframeholder {
+ position: relative;
+ /*for fix ie6 toolbarmsg under iframe bug. relative -> static */
+ /*_position: static !important;*
+}
+
+.edui-default .edui-editor-iframeholder textarea {
+ font-family: consolas, "Courier New", "lucida console", monospace;
+ font-size: 12px;
+ line-height: 18px;
+}
+
+.edui-default .edui-editor-bottombar {
+ /*border-top: 1px solid #ccc;*/
+ /*height: 20px;*/
+ /*width: 40%;*/
+ /*float: left;*/
+ /*overflow: hidden;*/
+}
+
+.edui-default .edui-editor-bottomContainer {
+ overflow: hidden;
+}
+
+.edui-default .edui-editor-bottomContainer table {
+ width: 100%;
+ height: 0;
+ overflow: hidden;
+ border-spacing: 0;
+}
+
+.edui-default .edui-editor-bottomContainer td {
+ white-space: nowrap;
+ border-top: 1px solid var(--edui-color-border);
+ line-height: 20px;
+ font-size: 12px;
+ font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif;
+ padding: 0 5px;
+ color: var(--edui-color-muted);
+}
+
+.edui-default .edui-editor-wordcount {
+ text-align: right;
+ margin-right: 5px;
+ color: #aaa;
+}
+
+.edui-default .edui-editor-scale {
+ width: 12px;
+}
+
+.edui-default .edui-editor-scale .edui-editor-icon {
+ float: right;
+ width: 100%;
+ height: 12px;
+ margin-top: 10px;
+ background: url(../images/scale.png) no-repeat;
+ cursor: se-resize;
+}
+
+.edui-default .edui-editor-breadcrumb {
+ margin: 2px 0 0 3px;
+ color: var(--edui-color-muted);
+}
+
+.edui-default .edui-editor-breadcrumb span {
+ cursor: pointer;
+ color: var(--edui-color-muted);
+ line-height: 16px;
+ display: inline-block;
+}
+
+.edui-default .edui-toolbar .edui-for-fullscreen {
+ float: right;
+}
+
+.edui-default .edui-bubble .edui-popup-content {
+ font-size: 13px;
+ box-shadow: 0 0 10px #0000001f;
+ transition: .25s;
+ color: #666;
+ background-color: #FFF;
+ padding: 10px;
+ border-radius: 5px;
+}
+
+.edui-default .edui-bubble .edui-shadow {
+ /*box-shadow: 1px 1px 3px #818181;*/
+ /*-webkit-box-shadow: 2px 2px 3px #818181;*/
+ /*-moz-box-shadow: 2px 2px 3px #818181;*/
+ /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/
+}
+
+.edui-default .edui-editor-toolbarmsg {
+ background-color: #FFF6D9;
+ border-bottom: 1px solid #ccc;
+ position: absolute;
+ bottom: -25px;
+ left: 0;
+ z-index: 1009;
+ width: 99.9%;
+}
+
+.edui-default .edui-editor-toolbarmsg-upload {
+ font-size: 14px;
+ color: blue;
+ width: 100px;
+ height: 16px;
+ line-height: 16px;
+ cursor: pointer;
+ position: absolute;
+ top: 5px;
+ left: 350px;
+}
+
+.edui-default .edui-editor-toolbarmsg-label {
+ font-size: 12px;
+ line-height: 16px;
+ padding: 4px;
+}
+
+.edui-default .edui-editor-toolbarmsg-close {
+ float: right;
+ width: 20px;
+ height: 16px;
+ line-height: 16px;
+ cursor: pointer;
+ color: red;
+}
+
+/*可选中菜单按钮*/
+.edui-default .edui-list .edui-bordereraser {
+ display: none;
+}
+
+.edui-default .edui-listitem {
+ padding: 1px;
+ white-space: nowrap;
+ cursor: pointer;
+}
+
+.edui-default .edui-list .edui-state-hover {
+ position: relative;
+ background-color: #EEE;
+ border: 1px solid #EEE;
+ padding: 0;
+ border-radius: 3px;
+}
+
+.edui-default .edui-for-fontfamily .edui-listitem-label {
+ min-width: 130px;
+ _width: 120px;
+ font-size: 12px;
+ height: 22px;
+ line-height: 22px;
+ padding-left: 5px;
+}
+
+.edui-default .edui-for-insertcode .edui-listitem-label {
+ min-width: 120px;
+ _width: 120px;
+ font-size: 12px;
+ height: 22px;
+ line-height: 22px;
+ padding-left: 5px;
+}
+
+.edui-default .edui-for-underline .edui-listitem-label {
+ min-width: 120px;
+ _width: 120px;
+ padding: 3px 5px;
+ font-size: 12px;
+}
+
+.edui-default .edui-for-fontsize .edui-listitem-label {
+ min-width: 120px;
+ _width: 120px;
+ padding: 3px 5px;
+ cursor: pointer;
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label {
+ min-width: 200px;
+ _width: 200px;
+ padding: 2px 5px;
+}
+
+.edui-default .edui-for-rowspacingtop .edui-listitem-label,
+.edui-default .edui-for-rowspacingbottom .edui-listitem-label {
+ min-width: 53px;
+ _width: 53px;
+ padding: 2px 5px;
+}
+
+.edui-default .edui-for-lineheight .edui-listitem-label {
+ min-width: 53px;
+ _width: 53px;
+ padding: 2px 5px;
+}
+
+.edui-default .edui-for-customstyle .edui-listitem-label {
+ min-width: 200px;
+ _width: 200px;
+ width: 200px !important;
+ padding: 2px 5px;
+}
+
+/* 可选中按钮弹出菜单*/
+.edui-default .edui-menu {
+ z-index: 3000;
+}
+
+.edui-default .edui-menu .edui-popup-content {
+ padding: 3px;
+}
+
+.edui-default .edui-menu-body {
+ _width: 150px;
+ min-width: 170px;
+ background: url("../images/sparator_v.png") repeat-y 25px;
+}
+
+.edui-default .edui-menuitem-body {
+}
+
+.edui-default .edui-menuitem {
+ height: 24px;
+ line-height: 22px;
+ cursor: default;
+ vertical-align: top;
+}
+
+.edui-default .edui-menuitem .edui-icon {
+ width: 20px !important;
+ height: 20px !important;
+ /*background: url(../images/icons.png) 0 -4000px;*/
+ /*background: url(../images/icons.gif) 0 -4000px\9;*/
+ font-family: 'edui-iconfont';
+ font-size: 12px;
+ line-height: 20px;
+ text-align: center;
+}
+
+.edui-default .edui-menuitem .edui-menuitem-body .edui-icon:before {
+ display: none;
+}
+
+.edui-default .edui-contextmenu .edui-popup-content .edui-menuitem-body .edui-icon:before {
+ display: inline-block;
+}
+
+.edui-default .edui-menuitem .edui-label {
+ font-size: 12px;
+ line-height: 20px;
+ height: 20px;
+ padding-left: 10px;
+}
+
+.edui-default .edui-state-checked .edui-menuitem-body .edui-icon {
+ line-height: 20px;
+ text-align: center;
+}
+
+.edui-default .edui-state-checked .edui-menuitem-body .edui-icon:before {
+ content: "\e7fc";
+ font-size: 10px;
+ display: inline-block;
+}
+
+.edui-default .edui-state-disabled .edui-menuitem-label {
+ color: gray;
+}
+
+
+/*不可选中菜单按钮 */
+.edui-default .edui-toolbar .edui-combox-body .edui-button-body {
+ width: 60px;
+ font-size: 12px;
+ height: 30px;
+ line-height: 30px;
+ padding-left: 5px;
+ white-space: nowrap;
+ margin: 0 3px 0 0;
+ cursor: pointer;
+}
+
+.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
+ height: 30px;
+ width: 13px;
+ cursor: pointer;
+}
+
+.edui-default .edui-toolbar .edui-combox-body .edui-arrow:before {
+ content: "\e9f0";
+ font-family: "edui-iconfont";
+ font-size: 8px;
+}
+
+.edui-default .edui-toolbar .edui-combox .edui-combox-body {
+ border: 1px solid var(--edui-color-border);
+ background-color: white;
+ border-radius: 2px;
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+}
+
+.edui-default .edui-toolbar .edui-combox .edui-combox-body > div {
+ vertical-align: top;
+}
+
+.edui-default .edui-toolbar .edui-combox-body .edui-splitborder {
+ display: none;
+}
+
+.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
+ border-left: 1px solid var(--edui-color-border);
+}
+
+.edui-default .edui-toolbar .edui-state-hover .edui-combox-body {
+ /*background-color: #fff5d4;*/
+ /*border: 1px solid #dcac6c;*/
+}
+
+.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow {
+ /*border-left: 1px solid #dcac6c;*/
+}
+
+.edui-default .edui-toolbar .edui-state-checked .edui-combox-body {
+ background-color: #FFE69F;
+ border: 1px solid #DCAC6C;
+}
+
+.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow {
+ border-left: 1px solid #DCAC6C;
+}
+
+.edui-toolbar .edui-state-disabled .edui-combox-body {
+ background-color: #F0F0EE;
+ opacity: 0.3;
+}
+
+.edui-toolbar .edui-state-opened .edui-combox-body {
+ background-color: white;
+ border: 1px solid gray;
+}
+
+/*普通按钮样式及状态*/
+.edui-default .edui-toolbar .edui-button .edui-icon,
+.edui-default .edui-toolbar .edui-menubutton .edui-icon,
+.edui-default .edui-toolbar .edui-splitbutton .edui-icon {
+ height: 30px !important;
+ width: 30px !important;
+ /*background-image: url(../images/icons.png);*/
+ /*background-image: url(../images/icons.gif) \9;*/
+ background-position: center;
+ background-repeat: no-repeat;
+ font-family: "edui-iconfont";
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ font-size: 16px;
+ text-align: center;
+ cursor: pointer;
+}
+
+.edui-default .edui-toolbar .edui-button .edui-button-wrap {
+ padding: 1px;
+ position: relative;
+ border-radius: 3px;
+}
+
+.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap {
+ background-color: #EEE;
+ border: 1px solid #EEE;
+ padding: 0;
+}
+
+.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap {
+ background-color: #F0F0EE;
+ padding: 0;
+ border: 1px solid #EEE;
+ border-radius: 2px;
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+}
+
+.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap {
+ background-color: #F0F0EE;
+ padding: 0;
+ border: 1px solid var(--edui-color-border);
+}
+
+.edui-default .edui-toolbar .edui-state-disabled .edui-label {
+ color: #ccc;
+}
+
+.edui-default .edui-toolbar .edui-state-disabled .edui-icon {
+ opacity: 0.3;
+ filter: alpha(opacity=30);
+}
+
+.edui-default .edui-toolbar-button-custom {
+ display: inline-block !important;
+ line-height: 30px;
+ vertical-align: middle;
+ padding: 0 10px;
+ border-radius: 3px;
+ margin: 0 5px;
+}
+
+.edui-default .edui-toolbar-button-custom:hover {
+ background: #EEE;
+}
+
+/* toolbar icons */
+.edui-default .edui-for-undo .edui-icon:before {
+ content: "\e60f";
+}
+
+.edui-default .edui-for-redo .edui-icon:before {
+ content: "\e60c";
+}
+
+.edui-default .edui-for-bold .edui-icon:before {
+ content: "\e628";
+}
+
+.edui-default .edui-for-italic .edui-icon:before {
+ content: "\e62a";
+}
+
+.edui-default .edui-for-fontborder .edui-icon:before {
+ content: '\e62d';
+}
+
+.edui-default .edui-for-underline .edui-icon:before {
+ content: "\e63e";
+}
+
+.edui-default .edui-for-strikethrough .edui-icon:before {
+ content: "\e64a";
+}
+
+.edui-default .edui-for-subscript .edui-icon:before {
+ content: "\ece9";
+}
+
+.edui-default .edui-for-superscript .edui-icon:before {
+ content: "\e83e";
+}
+
+.edui-default .edui-for-blockquote .edui-icon:before {
+ content: "\e6d8";
+}
+
+.edui-default .edui-for-forecolor .edui-icon:before {
+ content: "\e7f8";
+}
+
+.edui-default .edui-for-backcolor .edui-icon:before {
+ content: "\e71a";
+}
+
+.edui-default .edui-for-inserttable .edui-icon:before {
+ content: "\e60d";
+}
+
+.edui-default .edui-for-autotypeset .edui-icon:before {
+ content: "\e662";
+}
+
+.edui-default .edui-for-justifyleft .edui-icon:before {
+ content: "\e7f7";
+}
+
+.edui-default .edui-for-justifycenter .edui-icon:before {
+ content: "\e7f6";
+}
+
+.edui-default .edui-for-justifyright .edui-icon:before {
+ content: "\e7f5";
+}
+
+.edui-default .edui-for-justifyjustify .edui-icon:before {
+ content: "\e87c";
+}
+
+.edui-default .edui-for-insertorderedlist .edui-icon:before {
+ content: "\e737";
+}
+
+.edui-default .edui-for-insertunorderedlist .edui-icon:before {
+ content: "\e7f4";
+}
+
+.edui-default .edui-for-lineheight .edui-icon:before {
+ content: "\e638";
+}
+
+.edui-default .edui-for-rowspacingbottom .edui-icon:before {
+ content: '\eb09';
+}
+
+.edui-default .edui-for-rowspacingtop .edui-icon:before {
+ content: '\eb0a';
+}
+
+.edui-default .edui-for-horizontal .edui-icon:before {
+ content: "\e617";
+}
+
+.edui-default .edui-for-link .edui-icon:before {
+ content: "\e648";
+}
+
+.edui-default .edui-for-code .edui-icon:before {
+ background-position: -440px -40px;
+}
+
+.edui-default .edui-for-insertimage .edui-icon:before {
+ content: "\e605";
+}
+
+.edui-default .edui-for-insertframe .edui-icon:before {
+ content: "\e6c0";
+}
+
+.edui-default .edui-for-emoticon .edui-icon:before {
+ content: "\e60e";
+}
+
+.edui-default .edui-for-spechars .edui-icon:before {
+ content: "\e891";
+}
+
+.edui-default .edui-for-help .edui-icon:before {
+ content: "\e752";
+}
+
+.edui-default .edui-for-print .edui-icon:before {
+ content: "\e67a";
+}
+
+.edui-default .edui-for-preview .edui-icon:before {
+ content: "\e644";
+}
+
+.edui-default .edui-for-selectall .edui-icon:before {
+ content: '\e62f';
+}
+
+.edui-default .edui-for-searchreplace .edui-icon:before {
+ content: "\eb6c";
+}
+
+.edui-default .edui-for-map .edui-icon:before {
+ content: "\e649";
+}
+
+.edui-default .edui-for-insertvideo .edui-icon:before {
+ content: "\e636";
+}
+
+.edui-default .edui-for-insertaudio .edui-icon:before {
+ content: "\e77b";
+}
+
+.edui-default .edui-for-time .edui-icon:before {
+ content: "\e680";
+}
+
+.edui-default .edui-for-date .edui-icon:before {
+ content: "\e697";
+}
+
+.edui-default .edui-for-cut .edui-icon:before {
+ background-position: -680px 0;
+}
+
+.edui-default .edui-for-copy .edui-icon:before {
+ background-position: -700px 0;
+}
+
+.edui-default .edui-for-paste .edui-icon:before {
+ background-position: -560px 0;
+}
+
+.edui-default .edui-for-formatmatch .edui-icon:before {
+ content: "\e637";
+}
+
+.edui-default .edui-for-pasteplain .edui-icon:before {
+ content: '\edfb';
+}
+
+.edui-default .edui-for-directionalityltr .edui-icon:before {
+ content: "\e623";
+}
+
+.edui-default .edui-for-directionalityrtl .edui-icon:before {
+ content: "\e7bc";
+}
+
+.edui-default .edui-for-source .edui-icon:before {
+ content: "\e608";
+}
+
+.edui-default .edui-for-removeformat .edui-icon:before {
+ content: "\e782";
+}
+
+.edui-default .edui-for-unlink .edui-icon:before {
+ content: "\e92b";
+}
+
+.edui-default .edui-for-touppercase .edui-icon:before {
+ content: "\e619";
+}
+
+.edui-default .edui-for-tolowercase .edui-icon:before {
+ content: "\e61a";
+}
+
+.edui-default .edui-for-insertrow .edui-icon:before {
+ content: "\e603";
+}
+
+.edui-default .edui-for-insertrownext .edui-icon:before {
+ content: "\e602";
+}
+
+.edui-default .edui-for-insertcol .edui-icon:before {
+ content: "\e601";
+}
+
+.edui-default .edui-for-insertcolnext .edui-icon:before {
+ content: "\e600";
+}
+
+.edui-default .edui-for-mergeright .edui-icon:before {
+ content: "\e615";
+}
+
+.edui-default .edui-for-mergedown .edui-icon:before {
+ content: "\e613";
+}
+
+.edui-default .edui-for-splittorows .edui-icon:before {
+ content: "\e610";
+}
+
+.edui-default .edui-for-splittocols .edui-icon:before {
+ content: "\e611";
+}
+
+.edui-default .edui-for-insertparagraphbeforetable .edui-icon:before {
+ content: '\e901';
+}
+
+.edui-default .edui-for-deleterow .edui-icon:before {
+ content: "\e609";
+}
+
+.edui-default .edui-for-deletecol .edui-icon:before {
+ content: "\e604";
+}
+
+.edui-default .edui-for-splittocells .edui-icon:before {
+ content: "\e612";
+}
+
+.edui-default .edui-for-mergecells .edui-icon:before {
+ content: "\e606";
+}
+
+.edui-default .edui-for-deletetable .edui-icon:before {
+ content: "\e60a";
+}
+
+.edui-default .edui-for-cleardoc .edui-icon:before {
+ content: "\e61e";
+}
+
+.edui-default .edui-for-fullscreen .edui-icon:before {
+ content: "\e675";
+}
+
+.edui-default .edui-for-anchor .edui-icon:before {
+ content: "\e61b";
+}
+
+.edui-default .edui-for-pagebreak .edui-icon:before {
+ content: "\e61d";
+}
+
+.edui-default .edui-for-imagenone .edui-icon:before {
+ content: "\e61f";
+}
+
+.edui-default .edui-for-imageleft .edui-icon:before {
+ content: "\e621";
+}
+
+.edui-default .edui-for-wordimage .edui-icon:before {
+ content: "\e618";
+}
+
+.edui-default .edui-for-imageright .edui-icon:before {
+ content: "\e622";
+}
+
+.edui-default .edui-for-imagecenter .edui-icon:before {
+ content: "\e620";
+}
+
+.edui-default .edui-for-indent .edui-icon:before {
+ content: "\e7f3";
+}
+
+.edui-default .edui-for-outdent .edui-icon:before {
+ background-position: -540px 0;
+}
+
+.edui-default .edui-for-table .edui-icon:before {
+ background-position: -580px -20px;
+}
+
+.edui-default .edui-for-edittable .edui-icon:before {
+ background-position: -420px -40px;
+}
+
+.edui-default .edui-for-template .edui-icon:before {
+ content: "\e6ad";
+}
+
+.edui-default .edui-for-delete .edui-icon:before {
+ background-position: -360px -40px;
+}
+
+.edui-default .edui-for-attachment .edui-icon:before {
+ content: "\e704";
+}
+
+.edui-default .edui-for-edittd .edui-icon:before {
+ background-position: -700px -40px;
+}
+
+.edui-default .edui-for-scrawl .edui-icon:before {
+ content: "\e70b";
+}
+
+.edui-default .edui-for-background .edui-icon:before {
+ content: "\e624";
+}
+
+.edui-default .edui-for-formula .edui-icon:before {
+ content: "\e616";
+}
+
+.edui-default .edui-for-aligntd .edui-icon:before {
+ background-position: -236px -76px;
+}
+
+.edui-default .edui-for-insertparagraphtrue .edui-icon:before {
+ background-position: -625px -76px;
+}
+
+.edui-default .edui-for-insertparagraph .edui-icon:before {
+ background-position: -602px -76px;
+}
+
+.edui-default .edui-for-insertcaption .edui-icon:before {
+ background-position: -336px -76px;
+}
+
+.edui-default .edui-for-deletecaption .edui-icon:before {
+ background-position: -362px -76px;
+}
+
+.edui-default .edui-for-inserttitle .edui-icon:before {
+ background-position: -286px -76px;
+}
+
+.edui-default .edui-for-deletetitle .edui-icon:before {
+ background-position: -311px -76px;
+}
+
+.edui-default .edui-for-aligntable .edui-icon:before {
+ background-position: -440px 0;
+}
+
+.edui-default .edui-for-tablealignment-left .edui-icon:before {
+ background-position: -460px 0;
+}
+
+.edui-default .edui-for-tablealignment-center .edui-icon:before {
+ background-position: -420px 0;
+}
+
+.edui-default .edui-for-tablealignment-right .edui-icon:before {
+ background-position: -480px 0;
+}
+
+.edui-default .edui-for-inserttitlecol .edui-icon:before {
+ background-position: -673px -76px;
+}
+
+.edui-default .edui-for-deletetitlecol .edui-icon:before {
+ background-position: -698px -76px;
+}
+
+.edui-default .edui-for-simpleupload .edui-icon:before {
+ content: "\edfc";
+}
+
+/*splitbutton*/
+.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,
+.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow {
+ height: 30px;
+ width: 13px;
+ cursor: pointer;
+}
+
+.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow:before,
+.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow:before {
+ content: "\e9f0";
+ font-family: "edui-iconfont";
+ font-size: 8px;
+ vertical-align: middle;
+}
+
+.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,
+.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body {
+ padding: 1px;
+ border-radius: 3px;
+ display: flex;
+}
+
+.edui-default .edui-toolbar .edui-splitborder {
+ /*width: 1px;*/
+ width: 0px;
+ height: 30px;
+}
+
+.edui-default .edui-toolbar .edui-state-hover .edui-splitborder {
+ /*width: 1px;*/
+ border-left: 0px solid #dcac6c;
+}
+
+.edui-default .edui-toolbar .edui-state-active .edui-splitborder {
+ width: 0;
+ /*border-left: 1px solid #EEE;*/
+}
+
+.edui-default .edui-toolbar .edui-state-opened .edui-splitborder {
+ /*width: 1px;*/
+ border: 0;
+}
+
+.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,
+.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body {
+ background-color: #EEE;
+ border: 1px solid #EEE;
+ padding: 0;
+}
+
+.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,
+.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body {
+ background-color: #ffffff;
+ border: 1px solid #EEE;
+ padding: 0;
+}
+
+.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,
+.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body {
+ background-color: #ffffff;
+ border: 1px solid #EEE;
+ padding: 0;
+}
+
+.edui-default .edui-state-disabled .edui-arrow {
+ opacity: 0.3;
+ _filter: alpha(opacity=30);
+}
+
+.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,
+.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body {
+ background-color: white;
+ border: 1px solid #EEE;
+ padding: 0;
+}
+
+.edui-default .edui-for-insertorderedlist .edui-bordereraser,
+.edui-default .edui-for-lineheight .edui-bordereraser,
+.edui-default .edui-for-rowspacingtop .edui-bordereraser,
+.edui-default .edui-for-rowspacingbottom .edui-bordereraser,
+.edui-default .edui-for-insertunorderedlist .edui-bordereraser {
+ background-color: white;
+}
+
+/* 解决嵌套导致的图标问题 */
+.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,
+.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,
+.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,
+.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,
+.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon {
+ /*background-position: 0 -40px;*/
+ background-image: none;
+}
+
+/* 弹出菜单 */
+.edui-default .edui-popup {
+ z-index: 3000;
+ background-color: #ffffff;
+ width: auto;
+ height: auto;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ margin-top: 1px;
+}
+
+.edui-default .edui-popup .edui-shadow {
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.edui-default .edui-popup-content {
+ font-size: 13px;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+ transition: .25s;
+ color: #333;
+ background-color: #FFF;
+ padding: 10px;
+ border-radius: 5px;
+}
+
+.edui-default .edui-popup .edui-bordereraser {
+ background-color: transparent;
+ height: 3px;
+}
+
+.edui-default .edui-menu .edui-bordereraser {
+ height: 3px;
+}
+
+.edui-default .edui-anchor-topleft .edui-bordereraser {
+ left: 1px;
+ top: -2px;
+}
+
+.edui-default .edui-anchor-topright .edui-bordereraser {
+ right: 1px;
+ top: -2px;
+}
+
+.edui-default .edui-anchor-bottomleft .edui-bordereraser {
+ left: 0;
+ bottom: -6px;
+ height: 7px;
+ border-left: 1px solid gray;
+ border-right: 1px solid gray;
+}
+
+.edui-default .edui-anchor-bottomright .edui-bordereraser {
+ right: 0;
+ bottom: -6px;
+ height: 7px;
+ border-left: 1px solid gray;
+ border-right: 1px solid gray;
+}
+
+.edui-popup div {
+ width: auto;
+ height: auto;
+}
+
+.edui-default .edui-editor-messageholder {
+ display: block;
+ width: 150px;
+ height: auto;
+ border: 0;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ top: 28px;
+ right: 3px;
+}
+
+.edui-default .edui-message {
+ min-height: 10px;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+ padding: 0;
+ margin-bottom: 3px;
+ position: relative;
+}
+
+.edui-default .edui-message-body {
+ border-radius: 3px;
+ padding: 8px 15px 8px 8px;
+ color: #c09853;
+ background-color: #fcf8e3;
+ border: 1px solid #fbeed5;
+}
+
+.edui-default .edui-message-type-info {
+ color: #3a87ad;
+ background-color: #d9edf7;
+ border-color: #bce8f1
+}
+
+.edui-default .edui-message-type-success {
+ color: #468847;
+ background-color: #dff0d8;
+ border-color: #d6e9c6
+}
+
+.edui-default .edui-message-type-danger,
+.edui-default .edui-message-type-error {
+ color: #b94a48;
+ background-color: #f2dede;
+ border-color: #eed3d7
+}
+
+.edui-default .edui-message .edui-message-closer {
+ display: block;
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ float: right;
+ font-size: 20px;
+ font-weight: bold;
+ color: #999;
+ text-shadow: 0 1px 0 #fff;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.edui-default .edui-message .edui-message-content {
+ font-size: 10pt;
+ word-wrap: break-word;
+ word-break: normal;
+}
+
+/* 弹出对话框按钮和对话框大小 */
+.edui-default .edui-dialog {
+ z-index: 2000;
+ position: absolute;
+
+}
+
+.edui-dialog div {
+ width: auto;
+}
+
+.edui-default .edui-dialog-wrap {
+ margin-right: 6px;
+ margin-bottom: 6px;
+}
+
+.edui-default .edui-dialog-fullscreen-flag {
+ margin-right: 0;
+ margin-bottom: 0;
+}
+
+.edui-default .edui-dialog-body {
+ position: relative;
+ /*padding:2px 0 0 2px;*/
+ /*_zoom: 1;*/
+}
+
+.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body {
+ padding: 0;
+}
+
+.edui-default .edui-dialog-shadow {
+ position: absolute;
+ z-index: -1;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background-color: #ffffff;
+ *border-right-width: 2px;
+ *border-bottom-width: 2px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 3px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+}
+
+.edui-default .edui-dialog-foot {
+ background-color: white;
+ border-radius: 0 0 5px 5px;
+ height: 40px;
+}
+
+.edui-default .edui-dialog-titlebar {
+ height: 30px;
+ background: #FFF;
+ position: relative;
+ cursor: move;
+ border-radius: 5px 5px 0 0;
+}
+
+.edui-default .edui-dialog-caption {
+ font-weight: bold;
+ font-size: 14px;
+ line-height: 30px;
+ padding-left: 5px;
+}
+
+.edui-default .edui-dialog-draghandle {
+ height: 30px;
+ padding: 5px;
+}
+
+.edui-default .edui-dialog-closebutton {
+ position: absolute !important;
+ right: 10px;
+ top: 10px;
+}
+
+.edui-default .edui-dialog-closebutton .edui-button-body {
+ height: 20px;
+ width: 20px;
+ cursor: pointer;
+}
+
+.edui-default .edui-dialog-closebutton .edui-button-body .edui-icon {
+ width: 20px;
+ height: 20px;
+ font-family: 'edui-iconfont';
+ line-height: 20px;
+ font-size: 20px;
+ text-align: center;
+ color: #999;
+ vertical-align: top;
+}
+
+.edui-default .edui-dialog-closebutton .edui-button-body .edui-icon:before {
+ content: "\e6a7";
+}
+
+.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body .edui-icon {
+ color: #333;
+}
+
+.edui-default .edui-dialog-buttons {
+ position: absolute;
+ right: 0;
+}
+
+.edui-default .edui-dialog-buttons .edui-button {
+ margin-right: 10px;
+}
+
+.edui-default .edui-dialog-buttons .edui-button .edui-button-body .edui-icon {
+ display: none !important;
+}
+
+.edui-default .edui-dialog-buttons .edui-button .edui-button-body {
+ height: 30px;
+ font-size: 12px;
+ line-height: 28px;
+ cursor: pointer;
+ border-radius: 4px;
+ text-align: center;
+ background-color: #F8F8F8;
+ border: 1px solid #EEE;
+ padding: 0 15px;
+}
+
+.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body {
+
+}
+
+.edui-default .edui-dialog iframe {
+ border: 0;
+ padding: 0;
+ margin: 0;
+ vertical-align: top;
+}
+
+.edui-default .edui-dialog-modalmask {
+ opacity: 0.3;
+ filter: alpha(opacity=30);
+ background-color: #ccc;
+ position: absolute;
+ /*z-index: 1999;*/
+}
+
+.edui-default .edui-dialog-dragmask {
+ position: absolute;
+ /*z-index: 2001;*/
+ background-color: transparent;
+ cursor: move;
+}
+
+.edui-default .edui-dialog-content {
+ position: relative;
+}
+
+.edui-default .dialogcontmask {
+ cursor: move;
+ visibility: hidden;
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+/*link-dialog*/
+.edui-default .edui-for-link .edui-dialog-content {
+ width: 420px;
+ height: 200px;
+ overflow: hidden;
+}
+
+/*background-dialog*/
+.edui-default .edui-for-background .edui-dialog-content {
+ width: 440px;
+ height: 280px;
+ overflow: hidden;
+}
+
+/*template-dialog*/
+.edui-default .edui-for-template .edui-dialog-content {
+ width: 630px;
+ height: 390px;
+ overflow: hidden;
+}
+
+/*scrawl-dialog*/
+.edui-default .edui-for-scrawl .edui-dialog-content {
+ width: 515px;
+ *width: 506px;
+ height: 360px;
+}
+
+/*spechars-dialog*/
+.edui-default .edui-for-spechars .edui-dialog-content {
+ width: 620px;
+ height: 500px;
+ *width: 630px;
+ *height: 570px;
+}
+
+/*image-dialog*/
+.edui-default .edui-for-insertimage .edui-dialog-content {
+ width: 650px;
+ height: 400px;
+ overflow: hidden;
+}
+
+/*image-insertframe*/
+.edui-default .edui-for-insertframe .edui-dialog-content {
+ width: 350px;
+ height: 230px;
+ overflow: hidden;
+}
+
+/*wordImage-dialog*/
+.edui-default .edui-for-wordimage .edui-dialog-content {
+ width: 620px;
+ height: 380px;
+ overflow: hidden;
+}
+
+/*formula-dialog*/
+.edui-default .edui-for-formula .edui-dialog-content {
+ width: 800px;
+ height: 400px;
+ overflow: hidden;
+}
+
+/*attachment-dialog*/
+.edui-default .edui-for-attachment .edui-dialog-content {
+ width: 650px;
+ height: 400px;
+ overflow: hidden;
+}
+
+
+/*map-dialog*/
+.edui-default .edui-for-map .edui-dialog-content {
+ width: 550px;
+ height: 400px;
+}
+
+/*video-dialog*/
+.edui-default .edui-for-insertvideo .edui-dialog-content {
+ width: 590px;
+ height: 420px;
+}
+
+/*audio-dialog*/
+.edui-default .edui-for-insertaudio .edui-dialog-content {
+ width: 590px;
+ height: 420px;
+}
+
+/*anchor-dialog*/
+.edui-default .edui-for-anchor .edui-dialog-content {
+ width: 320px;
+ height: 60px;
+ overflow: hidden;
+}
+
+/*searchreplace-dialog*/
+.edui-default .edui-for-searchreplace .edui-dialog-content {
+ width: 400px;
+ height: 220px;
+}
+
+/*help-dialog*/
+.edui-default .edui-for-help .edui-dialog-content {
+ width: 400px;
+ height: 420px;
+}
+
+/*edittable-dialog*/
+.edui-default .edui-for-edittable .edui-dialog-content {
+ width: 540px;
+ _width: 590px;
+ height: 335px;
+}
+
+/*edittip-dialog*/
+.edui-default .edui-for-edittip .edui-dialog-content {
+ width: 225px;
+ height: 60px;
+}
+
+/*edittd-dialog*/
+.edui-default .edui-for-edittd .edui-dialog-content {
+ width: 240px;
+ height: 50px;
+}
+
+/*段落弹出菜单*/
+.edui-default .edui-for-paragraph .edui-listitem-label {
+ font-family: Tahoma, Verdana, Arial, Helvetica;
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p {
+ font-size: 22px;
+ line-height: 27px;
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 {
+ font-weight: bolder;
+ font-size: 32px;
+ line-height: 36px;
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 {
+ font-weight: bolder;
+ font-size: 27px;
+ line-height: 29px;
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 {
+ font-weight: bolder;
+ font-size: 19px;
+ line-height: 23px;
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 {
+ font-weight: bolder;
+ font-size: 16px;
+ line-height: 19px
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 {
+ font-weight: bolder;
+ font-size: 13px;
+ line-height: 16px;
+}
+
+.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 {
+ font-weight: bolder;
+ font-size: 12px;
+ line-height: 14px;
+}
+/* 表格弹出菜单 */
+.edui-default .edui-for-inserttable .edui-splitborder {
+ display: none
+}
+
+.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow {
+ width: 0
+}
+
+.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder {
+ border-left: 1px solid transparent;
+}
+
+.edui-default .edui-tablepicker .edui-infoarea {
+ height: 14px;
+ line-height: 14px;
+ font-size: 12px;
+ width: 220px;
+ margin-bottom: 3px;
+ clear: both;
+}
+
+.edui-default .edui-tablepicker .edui-infoarea .edui-label {
+ float: left;
+}
+
+.edui-default .edui-dialog-buttons .edui-label {
+ line-height: 30px;
+}
+
+.edui-default .edui-tablepicker .edui-infoarea .edui-clickable {
+ float: right;
+}
+
+.edui-default .edui-tablepicker .edui-pickarea {
+ background: url("../images/unhighlighted.gif") repeat;
+ height: 220px;
+ width: 220px;
+}
+
+.edui-default .edui-tablepicker .edui-pickarea .edui-overlay {
+ background: url("../images/highlighted.gif") repeat;
+}
+
+/* 颜色弹出菜单 */
+.edui-default .edui-colorpicker-topbar {
+ height: 27px;
+ width: 200px;
+ /*border-bottom: 1px gray dashed;*/
+}
+
+.edui-default .edui-colorpicker-preview {
+ height: 20px;
+ border: 1px inset black;
+ margin-left: 1px;
+ width: 128px;
+ float: left;
+ border-radius: 3px;
+ position: relative;
+}
+
+.edui-default .edui-colorpicker-preview input {
+ padding: 0;
+ left: 0;
+ border: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ border-radius: 3px;
+ opacity: 0;
+ cursor: pointer;
+}
+
+.edui-default .edui-colorpicker-nocolor {
+ float: right;
+ margin-right: 1px;
+ font-size: 12px;
+ line-height: 20px;
+ height: 20px;
+ border: 1px solid #333;
+ padding: 0 5px;
+ cursor: pointer;
+ border-radius: 3px;
+ box-sizing: content-box;
+}
+
+.edui-default .edui-colorpicker-tablefirstrow {
+ height: 30px;
+}
+
+.edui-default .edui-colorpicker-colorcell {
+ width: 14px;
+ height: 14px;
+ display: block;
+ margin: 0;
+ cursor: pointer;
+ border-radius: 2px;
+}
+
+.edui-default .edui-colorpicker-colorcell:hover {
+ width: 14px;
+ height: 14px;
+ margin: 0;
+}
+
+.edui-default .edui-colorpicker-advbtn {
+ display: block;
+ text-align: center;
+ cursor: pointer;
+ height: 20px;
+}
+
+.arrow_down {
+ background: white url('../images/arrow_down.png') no-repeat center;
+}
+
+.arrow_up {
+ background: white url('../images/arrow_up.png') no-repeat center;
+}
+
+/*高级的样式*/
+.edui-colorpicker-adv {
+ position: relative;
+ overflow: hidden;
+ height: 180px;
+ display: none;
+}
+
+.edui-colorpicker-plant, .edui-colorpicker-hue {
+ border: solid 1px #666;
+}
+
+.edui-colorpicker-pad {
+ width: 150px;
+ height: 150px;
+ left: 14px;
+ top: 13px;
+ position: absolute;
+ background: red;
+ overflow: hidden;
+ cursor: crosshair;
+}
+
+.edui-colorpicker-cover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 150px;
+ height: 150px;
+ background: url("../images/tangram-colorpicker.png") -160px -200px;
+}
+
+.edui-colorpicker-padDot {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 11px;
+ height: 11px;
+ overflow: hidden;
+ background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x;
+ z-index: 1000;
+
+}
+
+.edui-colorpicker-sliderMain {
+ position: absolute;
+ left: 171px;
+ top: 13px;
+ width: 19px;
+ height: 152px;
+ background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat;
+
+}
+
+.edui-colorpicker-slider {
+ width: 100%;
+ height: 100%;
+ cursor: pointer;
+}
+
+.edui-colorpicker-thumb {
+ position: absolute;
+ top: 0;
+ cursor: pointer;
+ height: 3px;
+ left: -1px;
+ right: -1px;
+ border: 1px solid black;
+ background: white;
+ opacity: .8;
+}
+
+/*自动排版弹出菜单*/
+.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body {
+ font-size: 12px;
+ margin-bottom: 3px;
+ clear: both;
+}
+
+.edui-default .edui-autotypesetpicker-body table {
+ border-collapse: separate;
+ border-spacing: 2px;
+}
+
+.edui-default .edui-autotypesetpicker-body td {
+ font-size: 12px;
+ word-wrap: break-word;
+}
+
+.edui-default .edui-autotypesetpicker-body td input {
+ margin: 3px 3px 3px 4px;
+ *margin: 1px 0 0 0;
+}
+
+.edui-default .edui-autotypesetpicker-body td button {
+ border: none;
+ padding: 5px 10px;
+ font-size: 13px;
+ line-height: 1.5;
+ border-radius: 4rem;
+ -webkit-appearance: none;
+ cursor: pointer;
+ margin-bottom: 5px;
+ background-color: #EEE;
+}
+
+/*自动排版弹出菜单*/
+.edui-default .edui-cellalignpicker .edui-cellalignpicker-body {
+ width: 70px;
+ font-size: 12px;
+ cursor: default;
+}
+
+.edui-default .edui-cellalignpicker-body table {
+ border-collapse: separate;
+ border-spacing: 0;
+}
+
+.edui-default .edui-cellalignpicker-body td {
+ padding: 1px;
+}
+
+.edui-default .edui-cellalignpicker-body .edui-icon {
+ height: 20px;
+ width: 20px;
+ padding: 1px;
+ background-image: url(../images/table-cell-align.png);
+}
+
+.edui-default .edui-cellalignpicker-body .edui-left {
+ background-position: 0 0;
+}
+
+.edui-default .edui-cellalignpicker-body .edui-center {
+ background-position: -25px 0;
+}
+
+.edui-default .edui-cellalignpicker-body .edui-right {
+ background-position: -51px 0;
+}
+
+.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left {
+ background-position: -73px 0;
+}
+
+.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center {
+ background-position: -98px 0;
+}
+
+.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right {
+ background-position: -124px 0;
+}
+
+.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left {
+ background-position: -146px 0;
+ background-color: #f1f4f5;
+}
+
+.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center {
+ background-position: -245px 0;
+}
+
+.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right {
+ background-position: -271px 0;
+}
+
+/*分隔线*/
+.edui-default .edui-toolbar .edui-separator {
+ width: 1px;
+ height: 20px;
+ margin: 5px 5px;
+ background: var(--edui-color-border);
+}
+
+/*颜色按钮 */
+.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump {
+ position: absolute;
+ overflow: hidden;
+ bottom: 1px;
+ left: 5px;
+ width: 20px;
+ height: 4px;
+}
+
+/*表情按钮及弹出菜单*/
+/*去除了表情的下拉箭头*/
+.edui-default .edui-for-emotion .edui-icon:before {
+ content: "\e60e";
+}
+
+.edui-default .edui-for-emotion .edui-popup-content iframe {
+ width: 514px;
+ height: 380px;
+ overflow: hidden;
+}
+
+.edui-default .edui-for-emotion .edui-popup-content {
+ position: relative;
+ z-index: 555
+}
+
+.edui-default .edui-for-emotion .edui-splitborder {
+ display: none
+}
+
+.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow {
+ width: 0
+}
+
+.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder {
+ border-left: 1px solid transparent;
+}
+
+/*contextmenu*/
+.edui-default .edui-hassubmenu .edui-arrow {
+ height: 20px;
+ width: 20px;
+ float: right;
+ /*background: url("../images/icons-all.gif") no-repeat 10px -233px;*/
+ font-family: 'edui-iconfont';
+ font-size: 12px;
+ line-height: 20px;
+ text-align: center;
+}
+
+.edui-default .edui-hassubmenu .edui-arrow:before {
+ content: "\e665";
+}
+
+.edui-default .edui-menu-body .edui-menuitem {
+ padding: 1px;
+}
+
+.edui-default .edui-menuseparator {
+ margin: 2px 0;
+ height: 1px;
+ overflow: hidden;
+}
+
+.edui-default .edui-menuseparator-inner {
+ border-bottom: 1px solid #e2e3e3;
+ margin-left: 29px;
+ margin-right: 1px;
+}
+
+.edui-default .edui-menu-body .edui-state-hover {
+ padding: 0 !important;
+ background-color: var(--edui-color-active-bg);
+ border-radius: 3px;
+ border: 1px solid var(--edui-color-active-bg);
+}
+
+/*弹出菜单*/
+.edui-default .edui-shortcutmenu {
+ padding: 2px;
+ /*width: 300px;*/
+ white-space: nowrap;
+ height: auto;
+ background-color: #fff;
+ /*border: 1px solid var(--edui-color-border);*/
+ border-radius: 5px;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+}
+
+/*粘贴弹出菜单*/
+.edui-default .edui-wordpastepop .edui-popup-content {
+ border: none;
+ padding: 0;
+ width: 54px;
+ height: 21px;
+}
+
+.edui-default .edui-pasteicon {
+ width: 100%;
+ height: 100%;
+ background-image: url('../images/wordpaste.png');
+ background-position: 0 0;
+}
+
+.edui-default .edui-pasteicon.edui-state-opened {
+ background-position: 0 -34px;
+}
+
+.edui-default .edui-pastecontainer {
+ position: relative;
+ visibility: hidden;
+ width: 97px;
+ background: #fff;
+ border: 1px solid #ccc;
+}
+
+.edui-default .edui-pastecontainer .edui-title {
+ font-weight: bold;
+ background: #F8F8FF;
+ height: 25px;
+ line-height: 25px;
+ font-size: 12px;
+ padding-left: 5px;
+}
+
+.edui-default .edui-pastecontainer .edui-button {
+ overflow: hidden;
+ margin: 3px 0;
+}
+
+.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,
+.edui-default .edui-pastecontainer .edui-button .edui-tagicon,
+.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon {
+ float: left;
+ cursor: pointer;
+ width: 29px;
+ height: 29px;
+ margin-left: 5px;
+ background-image: url('../images/wordpaste.png');
+ background-repeat: no-repeat;
+}
+
+.edui-default .edui-pastecontainer .edui-button .edui-richtxticon {
+ margin-left: 0;
+ background-position: -109px 0;
+}
+
+.edui-default .edui-pastecontainer .edui-button .edui-tagicon {
+ background-position: -148px 1px;
+}
+
+.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon {
+ background-position: -72px 0;
+}
+
+.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon {
+ background-position: -109px -34px;
+}
+
+.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon {
+ background-position: -148px -34px;
+}
+
+.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon {
+ background-position: -72px -34px;
+}
+
+.edui-quick-operate {
+ position: relative;
+ margin: -10px;
+ /*width: 40px;*/
+ height: 40px;
+ background: #FFF;
+ width: 50px !important;
+ border-radius: 4px;
+}
+
+.edui-quick-operate:hover .edui-quick-operate-menu {
+ display: block;
+}
+
+.edui-quick-operate-status {
+ display: flex;
+}
+
+.edui-quick-operate-icon {
+ display: inline-block;
+ line-height: 30px !important;
+ width: 30px !important;
+ text-align: center;
+ cursor: pointer;
+ color: #2A57FE;
+}
+
+.edui-quick-operate-icon:last-child {
+ width: 20px !important;
+ font-size: 0;
+ color: #999;
+}
+
+.edui-quick-operate-icon:last-child svg {
+ vertical-align: middle;
+}
+
+.edui-quick-operate-menu {
+ border: 1px solid #CCC;
+ border-radius: 5px;
+ box-shadow: 0 0 10px #CCC;
+ position: absolute;
+ left: 50px;
+ top: 0;
+ background: #FFF;
+ width: 100px !important;
+ display: none;
+}
+
+.edui-quick-operate-menu .item {
+ height: 30px;
+ line-height: 30px;
+ padding: 0 10px;
+ cursor: pointer;
+}
+
+.edui-quick-operate-menu .item:hover {
+ background: #F5F5F5;
+}
+
+.edui-quick-operate-menu .item i {
+ display: inline-block;
+ width: 2em;
+}
+
+.edui-quick-operate .icon {
+ font-family: "edui-iconfont";
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+}
+
+.edui-quick-operate .icon.icon-image:before {
+ content: "\e605";
+}
+
+.edui-quick-operate .icon.icon-list:before {
+ content: "\e87c";
+}
+
+.edui-quick-operate .icon.icon-trash:before {
+ content: "\e87c";
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/dialogbase.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/dialogbase.css
new file mode 100644
index 0000000..6b78254
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/dialogbase.css
@@ -0,0 +1,101 @@
+/*弹出对话框页面样式组件
+*/
+
+/*reset
+*/
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+ margin: 0;
+ padding: 0;
+ outline: 0;
+ font-size: 100%;
+}
+
+body {
+ line-height: 1;
+}
+
+ol, ul {
+ list-style: none;
+}
+
+blockquote, q {
+ quotes: none;
+}
+
+ins {
+ text-decoration: none;
+}
+
+del {
+ text-decoration: line-through;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+/*module
+*/
+body {
+ background-color: #fff;
+ font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA;
+ color: #646464;
+}
+
+/*tab*/
+.tabhead {
+ position: relative;
+ z-index: 10;
+}
+
+.tabhead span {
+ display: inline-block;
+ padding: 0 5px;
+ height: 30px;
+ border: 1px solid #ccc;
+ background: #EEE;
+ text-align: center;
+ line-height: 30px;
+ cursor: pointer;
+ *margin-right: 5px;
+ border-radius: 3px 3px 0 0;
+}
+
+.tabhead span.focus {
+ height: 31px;
+ border-bottom: none;
+ background: #fff;
+}
+
+.tabbody {
+ position: relative;
+ top: -1px;
+ margin: 0 auto;
+ border: 1px solid #ccc;
+}
+
+/*button*/
+a.button {
+ display: block;
+ text-align: center;
+ line-height: 24px;
+ text-decoration: none;
+ height: 24px;
+ width: 95px;
+ border: 0;
+ color: #838383;
+ background: url(../../themes/default/images/icons-all.gif) no-repeat;
+}
+
+a.button:hover {
+ background-position: 0 -30px;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/ai.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/ai.svg
new file mode 100644
index 0000000..80c5afe
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/ai.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/apk.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/apk.svg
new file mode 100644
index 0000000..96bef1a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/apk.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/chm.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/chm.svg
new file mode 100644
index 0000000..8432530
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/chm.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/css.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/css.svg
new file mode 100644
index 0000000..94361c7
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/css.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/doc.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/doc.svg
new file mode 100644
index 0000000..30dd860
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/doc.svg
@@ -0,0 +1,22 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/docx.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/docx.svg
new file mode 100644
index 0000000..30dd860
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/docx.svg
@@ -0,0 +1,22 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/dwg.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/dwg.svg
new file mode 100644
index 0000000..e7eff1a
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/dwg.svg
@@ -0,0 +1,16 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/folder.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/folder.svg
new file mode 100644
index 0000000..02e8edc
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/folder.svg
@@ -0,0 +1,3 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/gif.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/gif.svg
new file mode 100644
index 0000000..6b74924
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/gif.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/html.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/html.svg
new file mode 100644
index 0000000..2935849
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/html.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/jpeg.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/jpeg.svg
new file mode 100644
index 0000000..d951ef4
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/jpeg.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/jpg.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/jpg.svg
new file mode 100644
index 0000000..b3bcb68
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/jpg.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/log.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/log.svg
new file mode 100644
index 0000000..f1f9236
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/log.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/mp3.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/mp3.svg
new file mode 100644
index 0000000..6cc0e35
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/mp3.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/mp4.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/mp4.svg
new file mode 100644
index 0000000..20c579d
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/mp4.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/pdf.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/pdf.svg
new file mode 100644
index 0000000..335b9f7
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/pdf.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/png.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/png.svg
new file mode 100644
index 0000000..4f147d9
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/png.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/ppt.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/ppt.svg
new file mode 100644
index 0000000..4ea923e
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/ppt.svg
@@ -0,0 +1,24 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/pptx.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/pptx.svg
new file mode 100644
index 0000000..4ea923e
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/pptx.svg
@@ -0,0 +1,24 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/psd.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/psd.svg
new file mode 100644
index 0000000..52fa08c
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/psd.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/rar.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/rar.svg
new file mode 100644
index 0000000..2541fec
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/rar.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/svg.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/svg.svg
new file mode 100644
index 0000000..8f7f37c
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/svg.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/torrent.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/torrent.svg
new file mode 100644
index 0000000..6429687
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/torrent.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/txt.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/txt.svg
new file mode 100644
index 0000000..5b4c797
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/txt.svg
@@ -0,0 +1,14 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/unknown.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/unknown.svg
new file mode 100644
index 0000000..214a6f3
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/unknown.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/xls.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/xls.svg
new file mode 100644
index 0000000..e4bd05f
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/xls.svg
@@ -0,0 +1,25 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/xlsx.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/xlsx.svg
new file mode 100644
index 0000000..e4bd05f
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/xlsx.svg
@@ -0,0 +1,25 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/zip.svg b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/zip.svg
new file mode 100644
index 0000000..2541fec
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/exts/zip.svg
@@ -0,0 +1,12 @@
+
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/anchor.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/anchor.gif
new file mode 100644
index 0000000..5aa797b
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/anchor.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow.png
new file mode 100644
index 0000000..d900886
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow_down.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow_down.png
new file mode 100644
index 0000000..e9257e8
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow_down.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow_up.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow_up.png
new file mode 100644
index 0000000..74277af
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/arrow_up.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/button-bg.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/button-bg.gif
new file mode 100644
index 0000000..ec7fa2e
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/button-bg.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cancelbutton.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cancelbutton.gif
new file mode 100644
index 0000000..df4bc2c
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cancelbutton.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/charts.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/charts.png
new file mode 100644
index 0000000..713965c
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/charts.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_h.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_h.gif
new file mode 100644
index 0000000..d7c3e7e
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_h.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_h.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_h.png
new file mode 100644
index 0000000..2088fc2
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_h.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_v.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_v.gif
new file mode 100644
index 0000000..bb508db
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_v.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_v.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_v.png
new file mode 100644
index 0000000..6f39ca3
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/cursor_v.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/dialog-title-bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/dialog-title-bg.png
new file mode 100644
index 0000000..f744f26
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/dialog-title-bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/filescan.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/filescan.png
new file mode 100644
index 0000000..1d27158
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/filescan.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/highlighted.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/highlighted.gif
new file mode 100644
index 0000000..9272b49
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/highlighted.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons-all.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons-all.gif
new file mode 100644
index 0000000..21915e5
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons-all.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons.gif
new file mode 100644
index 0000000..7abd30a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons.png
new file mode 100644
index 0000000..c015e3a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/icons.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/img-cracked.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/img-cracked.png
new file mode 100644
index 0000000..3b1d389
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/img-cracked.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/loaderror.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/loaderror.png
new file mode 100644
index 0000000..35ff333
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/loaderror.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/loading.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/loading.gif
new file mode 100644
index 0000000..b713e27
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/loading.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/lock.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/lock.gif
new file mode 100644
index 0000000..b4e6d78
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/lock.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/neweditor-tab-bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/neweditor-tab-bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/pagebreak.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/pagebreak.gif
new file mode 100644
index 0000000..8d1cffd
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/pagebreak.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/scale.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/scale.png
new file mode 100644
index 0000000..f45adb5
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/scale.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/sortable.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/sortable.png
new file mode 100644
index 0000000..1bca649
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/sortable.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/spacer.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/spacer.gif
new file mode 100644
index 0000000..5bfd67a
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/spacer.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/sparator_v.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/sparator_v.png
new file mode 100644
index 0000000..8cf5662
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/sparator_v.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/table-cell-align.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/table-cell-align.png
new file mode 100644
index 0000000..ddf4285
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/table-cell-align.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/tangram-colorpicker.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/tangram-colorpicker.png
new file mode 100644
index 0000000..738e500
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/tangram-colorpicker.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/toolbar_bg.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/toolbar_bg.png
new file mode 100644
index 0000000..7ab685f
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/toolbar_bg.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/unhighlighted.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/unhighlighted.gif
new file mode 100644
index 0000000..7ad0b67
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/unhighlighted.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/upload.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/upload.png
new file mode 100644
index 0000000..08d4d92
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/upload.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/videologo.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/videologo.gif
new file mode 100644
index 0000000..555af74
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/videologo.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/word.gif b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/word.gif
new file mode 100644
index 0000000..9ef5d09
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/word.gif differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/wordpaste.png b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/wordpaste.png
new file mode 100644
index 0000000..9367758
Binary files /dev/null and b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/default/images/wordpaste.png differ
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/iframe.css b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/iframe.css
new file mode 100644
index 0000000..0131ced
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/themes/iframe.css
@@ -0,0 +1,63 @@
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+ font-size: 14px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+a {
+ color: #09f;
+ text-decoration: none;
+}
+
+a:hover,
+a:focus {
+ color: #09f;
+ text-decoration: none;
+}
+
+blockquote {
+ padding: 0 0 0 15px;
+ margin: 0 0 18px;
+ border-left: 5px solid #EEE;
+}
+
+img + br {
+ display: block;
+ padding: 4px 0;
+ content: ' ';
+}
+
+body p {
+ margin-bottom: 1em;
+}
+
+iframe {
+ border: none;
+}
+
+img {
+ max-width: 100%;
+}
+
+img[data-word-image] {
+ cursor: pointer;
+}
+
+pre {
+ margin: .5em 0;
+ padding: .4em .6em;
+ border-radius: 8px;
+ background: #f8f8f8;
+ line-height: 1.5;
+}
+
+/*交互操作*/
+img {
+ cursor: pointer;
+}
+
+.edui-quick-operate-active {
+ background: #E6ECFF;
+}
diff --git a/blxc-admin/src/main/resources/static/ajax/libs/ueditor/third-party/SyntaxHighlighter/shCore.js b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/third-party/SyntaxHighlighter/shCore.js
new file mode 100644
index 0000000..3249184
--- /dev/null
+++ b/blxc-admin/src/main/resources/static/ajax/libs/ueditor/third-party/SyntaxHighlighter/shCore.js
@@ -0,0 +1,3655 @@
+// XRegExp 1.5.1
+// (c) 2007-2012 Steven Levithan
+// MIT License
+//
+// Provides an augmented, extensible, cross-browser implementation of regular expressions,
+// including support for additional syntax, flags, and methods
+
+var XRegExp;
+
+if (XRegExp) {
+ // Avoid running twice, since that would break references to native globals
+ throw Error("can't load XRegExp twice in the same frame");
+}
+
+// Run within an anonymous function to protect variables and avoid new globals
+(function (undefined) {
+
+ //---------------------------------
+ // Constructor
+ //---------------------------------
+
+ // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native
+ // regular expression in that additional syntax and flags are supported and cross-browser
+ // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and
+ // converts to type XRegExp
+ XRegExp = function (pattern, flags) {
+ var output = [],
+ currScope = XRegExp.OUTSIDE_CLASS,
+ pos = 0,
+ context, tokenResult, match, chr, regex;
+
+ if (XRegExp.isRegExp(pattern)) {
+ if (flags !== undefined)
+ throw TypeError("can't supply flags when constructing one RegExp from another");
+ return clone(pattern);
+ }
+ // Tokens become part of the regex construction process, so protect against infinite
+ // recursion when an XRegExp is constructed within a token handler or trigger
+ if (isInsideConstructor)
+ throw Error("can't call the XRegExp constructor within token definition functions");
+
+ flags = flags || "";
+ context = { // `this` object for custom tokens
+ hasNamedCapture: false,
+ captureNames: [],
+ hasFlag: function (flag) {return flags.indexOf(flag) > -1;},
+ setFlag: function (flag) {flags += flag;}
+ };
+
+ while (pos < pattern.length) {
+ // Check for custom tokens at the current position
+ tokenResult = runTokens(pattern, pos, currScope, context);
+
+ if (tokenResult) {
+ output.push(tokenResult.output);
+ pos += (tokenResult.match[0].length || 1);
+ } else {
+ // Check for native multicharacter metasequences (excluding character classes) at
+ // the current position
+ if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) {
+ output.push(match[0]);
+ pos += match[0].length;
+ } else {
+ chr = pattern.charAt(pos);
+ if (chr === "[")
+ currScope = XRegExp.INSIDE_CLASS;
+ else if (chr === "]")
+ currScope = XRegExp.OUTSIDE_CLASS;
+ // Advance position one character
+ output.push(chr);
+ pos++;
+ }
+ }
+ }
+
+ regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, ""));
+ regex._xregexp = {
+ source: pattern,
+ captureNames: context.hasNamedCapture ? context.captureNames : null
+ };
+ return regex;
+ };
+
+
+ //---------------------------------
+ // Public properties
+ //---------------------------------
+
+ XRegExp.version = "1.5.1";
+
+ // Token scope bitflags
+ XRegExp.INSIDE_CLASS = 1;
+ XRegExp.OUTSIDE_CLASS = 2;
+
+
+ //---------------------------------
+ // Private variables
+ //---------------------------------
+
+ var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g,
+ flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags
+ quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/,
+ isInsideConstructor = false,
+ tokens = [],
+ // Copy native globals for reference ("native" is an ES3 reserved keyword)
+ nativ = {
+ exec: RegExp.prototype.exec,
+ test: RegExp.prototype.test,
+ match: String.prototype.match,
+ replace: String.prototype.replace,
+ split: String.prototype.split
+ },
+ compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups
+ compliantLastIndexIncrement = function () {
+ var x = /^/g;
+ nativ.test.call(x, "");
+ return !x.lastIndex;
+ }(),
+ hasNativeY = RegExp.prototype.sticky !== undefined,
+ nativeTokens = {};
+
+ // `nativeTokens` match native multicharacter metasequences only (including deprecated octals,
+ // excluding character classes)
+ nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/;
+ nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/;
+
+
+ //---------------------------------
+ // Public methods
+ //---------------------------------
+
+ // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by
+ // the XRegExp library and can be used to create XRegExp plugins. This function is intended for
+ // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can
+ // be disabled by `XRegExp.freezeTokens`
+ XRegExp.addToken = function (regex, handler, scope, trigger) {
+ tokens.push({
+ pattern: clone(regex, "g" + (hasNativeY ? "y" : "")),
+ handler: handler,
+ scope: scope || XRegExp.OUTSIDE_CLASS,
+ trigger: trigger || null
+ });
+ };
+
+ // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag
+ // combination has previously been cached, the cached copy is returned; otherwise the newly
+ // created regex is cached
+ XRegExp.cache = function (pattern, flags) {
+ var key = pattern + "/" + (flags || "");
+ return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags));
+ };
+
+ // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh
+ // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global`
+ // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve
+ // special properties required for named capture
+ XRegExp.copyAsGlobal = function (regex) {
+ return clone(regex, "g");
+ };
+
+ // Accepts a string; returns the string with regex metacharacters escaped. The returned string
+ // can safely be used at any point within a regex to match the provided literal string. Escaped
+ // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace
+ XRegExp.escape = function (str) {
+ return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+ };
+
+ // Accepts a string to search, regex to search with, position to start the search within the
+ // string (default: 0), and an optional Boolean indicating whether matches must start at-or-
+ // after the position or at the specified position only. This function ignores the `lastIndex`
+ // of the provided regex in its own handling, but updates the property for compatibility
+ XRegExp.execAt = function (str, regex, pos, anchored) {
+ var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")),
+ match;
+ r2.lastIndex = pos = pos || 0;
+ match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.)
+ if (anchored && match && match.index !== pos)
+ match = null;
+ if (regex.global)
+ regex.lastIndex = match ? r2.lastIndex : 0;
+ return match;
+ };
+
+ // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing
+ // syntax and flag changes. Should be run after XRegExp and any plugins are loaded
+ XRegExp.freezeTokens = function () {
+ XRegExp.addToken = function () {
+ throw Error("can't run addToken after freezeTokens");
+ };
+ };
+
+ // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object.
+ // Note that this is also `true` for regex literals and regexes created by the `XRegExp`
+ // constructor. This works correctly for variables created in another frame, when `instanceof`
+ // and `constructor` checks would fail to work as intended
+ XRegExp.isRegExp = function (o) {
+ return Object.prototype.toString.call(o) === "[object RegExp]";
+ };
+
+ // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to
+ // iterate over regex matches compared to the traditional approaches of subverting
+ // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop
+ XRegExp.iterate = function (str, regex, callback, context) {
+ var r2 = clone(regex, "g"),
+ i = -1, match;
+ while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)
+ if (regex.global)
+ regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback`
+ callback.call(context, match, ++i, str, regex);
+ if (r2.lastIndex === match.index)
+ r2.lastIndex++;
+ }
+ if (regex.global)
+ regex.lastIndex = 0;
+ };
+
+ // Accepts a string and an array of regexes; returns the result of using each successive regex
+ // to search within the matches of the previous regex. The array of regexes can also contain
+ // objects with `regex` and `backref` properties, in which case the named or numbered back-
+ // references specified are passed forward to the next regex or returned. E.g.:
+ // var xregexpImgFileNames = XRegExp.matchChain(html, [
+ // {regex: /
]+)>/i, backref: 1}, //
tag attributes
+ // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values
+ // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths
+ // /[^\/]+$/ // filenames (strip directory paths)
+ // ]);
+ XRegExp.matchChain = function (str, chain) {
+ return function recurseChain (values, level) {
+ var item = chain[level].regex ? chain[level] : {regex: chain[level]},
+ regex = clone(item.regex, "g"),
+ matches = [], i;
+ for (i = 0; i < values.length; i++) {
+ XRegExp.iterate(values[i], regex, function (match) {
+ matches.push(item.backref ? (match[item.backref] || "") : match[0]);
+ });
+ }
+ return ((level === chain.length - 1) || !matches.length) ?
+ matches : recurseChain(matches, level + 1);
+ }([str], 0);
+ };
+
+
+ //---------------------------------
+ // New RegExp prototype methods
+ //---------------------------------
+
+ // Accepts a context object and arguments array; returns the result of calling `exec` with the
+ // first value in the arguments array. the context is ignored but is accepted for congruity
+ // with `Function.prototype.apply`
+ RegExp.prototype.apply = function (context, args) {
+ return this.exec(args[0]);
+ };
+
+ // Accepts a context object and string; returns the result of calling `exec` with the provided
+ // string. the context is ignored but is accepted for congruity with `Function.prototype.call`
+ RegExp.prototype.call = function (context, str) {
+ return this.exec(str);
+ };
+
+
+ //---------------------------------
+ // Overriden native methods
+ //---------------------------------
+
+ // Adds named capture support (with backreferences returned as `result.name`), and fixes two
+ // cross-browser issues per ES3:
+ // - Captured values for nonparticipating capturing groups should be returned as `undefined`,
+ // rather than the empty string.
+ // - `lastIndex` should not be incremented after zero-length matches.
+ RegExp.prototype.exec = function (str) {
+ var match, name, r2, origLastIndex;
+ if (!this.global)
+ origLastIndex = this.lastIndex;
+ match = nativ.exec.apply(this, arguments);
+ if (match) {
+ // Fix browsers whose `exec` methods don't consistently return `undefined` for
+ // nonparticipating capturing groups
+ if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) {
+ r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", ""));
+ // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed
+ // matching due to characters outside the match
+ nativ.replace.call((str + "").slice(match.index), r2, function () {
+ for (var i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined)
+ match[i] = undefined;
+ }
+ });
+ }
+ // Attach named capture properties
+ if (this._xregexp && this._xregexp.captureNames) {
+ for (var i = 1; i < match.length; i++) {
+ name = this._xregexp.captureNames[i - 1];
+ if (name)
+ match[name] = match[i];
+ }
+ }
+ // Fix browsers that increment `lastIndex` after zero-length matches
+ if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
+ this.lastIndex--;
+ }
+ if (!this.global)
+ this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
+ return match;
+ };
+
+ // Fix browser bugs in native method
+ RegExp.prototype.test = function (str) {
+ // Use the native `exec` to skip some processing overhead, even though the altered
+ // `exec` would take care of the `lastIndex` fixes
+ var match, origLastIndex;
+ if (!this.global)
+ origLastIndex = this.lastIndex;
+ match = nativ.exec.call(this, str);
+ // Fix browsers that increment `lastIndex` after zero-length matches
+ if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
+ this.lastIndex--;
+ if (!this.global)
+ this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
+ return !!match;
+ };
+
+ // Adds named capture support and fixes browser bugs in native method
+ String.prototype.match = function (regex) {
+ if (!XRegExp.isRegExp(regex))
+ regex = RegExp(regex); // Native `RegExp`
+ if (regex.global) {
+ var result = nativ.match.apply(this, arguments);
+ regex.lastIndex = 0; // Fix IE bug
+ return result;
+ }
+ return regex.exec(this); // Run the altered `exec`
+ };
+
+ // Adds support for `${n}` tokens for named and numbered backreferences in replacement text,
+ // and provides named backreferences to replacement functions as `arguments[0].name`. Also
+ // fixes cross-browser differences in replacement text syntax when performing a replacement
+ // using a nonregex search value, and the value of replacement regexes' `lastIndex` property
+ // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary
+ // third (`flags`) parameter
+ String.prototype.replace = function (search, replacement) {
+ var isRegex = XRegExp.isRegExp(search),
+ captureNames, result, str, origLastIndex;
+
+ // There are too many combinations of search/replacement types/values and browser bugs that
+ // preclude passing to native `replace`, so don't try
+ //if (...)
+ // return nativ.replace.apply(this, arguments);
+
+ if (isRegex) {
+ if (search._xregexp)
+ captureNames = search._xregexp.captureNames; // Array or `null`
+ if (!search.global)
+ origLastIndex = search.lastIndex;
+ } else {
+ search = search + ""; // Type conversion
+ }
+
+ if (Object.prototype.toString.call(replacement) === "[object Function]") {
+ result = nativ.replace.call(this + "", search, function () {
+ if (captureNames) {
+ // Change the `arguments[0]` string primitive to a String object which can store properties
+ arguments[0] = new String(arguments[0]);
+ // Store named backreferences on `arguments[0]`
+ for (var i = 0; i < captureNames.length; i++) {
+ if (captureNames[i])
+ arguments[0][captureNames[i]] = arguments[i + 1];
+ }
+ }
+ // Update `lastIndex` before calling `replacement` (fix browsers)
+ if (isRegex && search.global)
+ search.lastIndex = arguments[arguments.length - 2] + arguments[0].length;
+ return replacement.apply(null, arguments);
+ });
+ } else {
+ str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`)
+ result = nativ.replace.call(str, search, function () {
+ var args = arguments; // Keep this function's `arguments` available through closure
+ return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) {
+ // Numbered backreference (without delimiters) or special variable
+ if ($1) {
+ switch ($1) {
+ case "$": return "$";
+ case "&": return args[0];
+ case "`": return args[args.length - 1].slice(0, args[args.length - 2]);
+ case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length);
+ // Numbered backreference
+ default:
+ // What does "$10" mean?
+ // - Backreference 10, if 10 or more capturing groups exist
+ // - Backreference 1 followed by "0", if 1-9 capturing groups exist
+ // - Otherwise, it's the string "$10"
+ // Also note:
+ // - Backreferences cannot be more than two digits (enforced by `replacementToken`)
+ // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01"
+ // - There is no "$0" token ("$&" is the entire match)
+ var literalNumbers = "";
+ $1 = +$1; // Type conversion; drop leading zero
+ if (!$1) // `$1` was "0" or "00"
+ return $0;
+ while ($1 > args.length - 3) {
+ literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers;
+ $1 = Math.floor($1 / 10); // Drop the last digit
+ }
+ return ($1 ? args[$1] || "" : "$") + literalNumbers;
+ }
+ // Named backreference or delimited numbered backreference
+ } else {
+ // What does "${n}" mean?
+ // - Backreference to numbered capture n. Two differences from "$n":
+ // - n can be more than two digits
+ // - Backreference 0 is allowed, and is the entire match
+ // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture
+ // - Otherwise, it's the string "${n}"
+ var n = +$2; // Type conversion; drop leading zeros
+ if (n <= args.length - 3)
+ return args[n];
+ n = captureNames ? indexOf(captureNames, $2) : -1;
+ return n > -1 ? args[n + 1] : $0;
+ }
+ });
+ });
+ }
+
+ if (isRegex) {
+ if (search.global)
+ search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows)
+ else
+ search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
+ }
+
+ return result;
+ };
+
+ // A consistent cross-browser, ES3 compliant `split`
+ String.prototype.split = function (s /* separator */, limit) {
+ // If separator `s` is not a regex, use the native `split`
+ if (!XRegExp.isRegExp(s))
+ return nativ.split.apply(this, arguments);
+
+ var str = this + "", // Type conversion
+ output = [],
+ lastLastIndex = 0,
+ match, lastLength;
+
+ // Behavior for `limit`: if it's...
+ // - `undefined`: No limit
+ // - `NaN` or zero: Return an empty array
+ // - A positive number: Use `Math.floor(limit)`
+ // - A negative number: No limit
+ // - Other: Type-convert, then use the above rules
+ if (limit === undefined || +limit < 0) {
+ limit = Infinity;
+ } else {
+ limit = Math.floor(+limit);
+ if (!limit)
+ return [];
+ }
+
+ // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero
+ // and restore it to its original value when we're done using the regex
+ s = XRegExp.copyAsGlobal(s);
+
+ while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)
+ if (s.lastIndex > lastLastIndex) {
+ output.push(str.slice(lastLastIndex, match.index));
+
+ if (match.length > 1 && match.index < str.length)
+ Array.prototype.push.apply(output, match.slice(1));
+
+ lastLength = match[0].length;
+ lastLastIndex = s.lastIndex;
+
+ if (output.length >= limit)
+ break;
+ }
+
+ if (s.lastIndex === match.index)
+ s.lastIndex++;
+ }
+
+ if (lastLastIndex === str.length) {
+ if (!nativ.test.call(s, "") || lastLength)
+ output.push("");
+ } else {
+ output.push(str.slice(lastLastIndex));
+ }
+
+ return output.length > limit ? output.slice(0, limit) : output;
+ };
+
+
+ //---------------------------------
+ // Private helper functions
+ //---------------------------------
+
+ // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp`
+ // instance with a fresh `lastIndex` (set to zero), preserving properties required for named
+ // capture. Also allows adding new flags in the process of copying the regex
+ function clone (regex, additionalFlags) {
+ if (!XRegExp.isRegExp(regex))
+ throw TypeError("type RegExp expected");
+ var x = regex._xregexp;
+ regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || ""));
+ if (x) {
+ regex._xregexp = {
+ source: x.source,
+ captureNames: x.captureNames ? x.captureNames.slice(0) : null
+ };
+ }
+ return regex;
+ }
+
+ function getNativeFlags (regex) {
+ return (regex.global ? "g" : "") +
+ (regex.ignoreCase ? "i" : "") +
+ (regex.multiline ? "m" : "") +
+ (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3
+ (regex.sticky ? "y" : "");
+ }
+
+ function runTokens (pattern, index, scope, context) {
+ var i = tokens.length,
+ result, match, t;
+ // Protect against constructing XRegExps within token handler and trigger functions
+ isInsideConstructor = true;
+ // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws
+ try {
+ while (i--) { // Run in reverse order
+ t = tokens[i];
+ if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) {
+ t.pattern.lastIndex = index;
+ match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc.
+ if (match && match.index === index) {
+ result = {
+ output: t.handler.call(context, match, scope),
+ match: match
+ };
+ break;
+ }
+ }
+ }
+ } catch (err) {
+ throw err;
+ } finally {
+ isInsideConstructor = false;
+ }
+ return result;
+ }
+
+ function indexOf (array, item, from) {
+ if (Array.prototype.indexOf) // Use the native array method if available
+ return array.indexOf(item, from);
+ for (var i = from || 0; i < array.length; i++) {
+ if (array[i] === item)
+ return i;
+ }
+ return -1;
+ }
+
+
+ //---------------------------------
+ // Built-in tokens
+ //---------------------------------
+
+ // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the
+ // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS`
+
+ // Comment pattern: (?# )
+ XRegExp.addToken(
+ /\(\?#[^)]*\)/,
+ function (match) {
+ // Keep tokens separated unless the following token is a quantifier
+ return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)";
+ }
+ );
+
+ // Capturing group (match the opening parenthesis only).
+ // Required for support of named capturing groups
+ XRegExp.addToken(
+ /\((?!\?)/,
+ function () {
+ this.captureNames.push(null);
+ return "(";
+ }
+ );
+
+ // Named capturing group (match the opening delimiter only): (?
+ XRegExp.addToken(
+ /\(\?<([$\w]+)>/,
+ function (match) {
+ this.captureNames.push(match[1]);
+ this.hasNamedCapture = true;
+ return "(";
+ }
+ );
+
+ // Named backreference: \k
+ XRegExp.addToken(
+ /\\k<([\w$]+)>/,
+ function (match) {
+ var index = indexOf(this.captureNames, match[1]);
+ // Keep backreferences separate from subsequent literal numbers. Preserve back-
+ // references to named groups that are undefined at this point as literal strings
+ return index > -1 ?
+ "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") :
+ match[0];
+ }
+ );
+
+ // Empty character class: [] or [^]
+ XRegExp.addToken(
+ /\[\^?]/,
+ function (match) {
+ // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S].
+ // (?!) should work like \b\B, but is unreliable in Firefox
+ return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]";
+ }
+ );
+
+ // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx)
+ // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc.
+ XRegExp.addToken(
+ /^\(\?([imsx]+)\)/,
+ function (match) {
+ this.setFlag(match[1]);
+ return "";
+ }
+ );
+
+ // Whitespace and comments, in free-spacing (aka extended) mode only
+ XRegExp.addToken(
+ /(?:\s+|#.*)+/,
+ function (match) {
+ // Keep tokens separated unless the following token is a quantifier
+ return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)";
+ },
+ XRegExp.OUTSIDE_CLASS,
+ function () {return this.hasFlag("x");}
+ );
+
+ // Dot, in dotall (aka singleline) mode only
+ XRegExp.addToken(
+ /\./,
+ function () {return "[\\s\\S]";},
+ XRegExp.OUTSIDE_CLASS,
+ function () {return this.hasFlag("s");}
+ );
+
+
+ //---------------------------------
+ // Backward compatibility
+ //---------------------------------
+
+ // Uncomment the following block for compatibility with XRegExp 1.0-1.2:
+ /*
+ XRegExp.matchWithinChain = XRegExp.matchChain;
+ RegExp.prototype.addFlags = function (s) {return clone(this, s);};
+ RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;};
+ RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);};
+ RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;};
+ */
+
+})();
+
+//
+// Begin anonymous function. This is used to contain local scope variables without polutting global scope.
+//
+if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() {
+
+// CommonJS
+ if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined')
+ {
+ XRegExp = require('XRegExp').XRegExp;
+ }
+
+// Shortcut object which will be assigned to the SyntaxHighlighter variable.
+// This is a shorthand for local reference in order to avoid long namespace
+// references to SyntaxHighlighter.whatever...
+ var sh = {
+ defaults : {
+ /** Additional CSS class names to be added to highlighter elements. */
+ 'class-name' : '',
+
+ /** First line number. */
+ 'first-line' : 1,
+
+ /**
+ * Pads line numbers. Possible values are:
+ *
+ * false - don't pad line numbers.
+ * true - automaticaly pad numbers with minimum required number of leading zeroes.
+ * [int] - length up to which pad line numbers.
+ */
+ 'pad-line-numbers' : false,
+
+ /** Lines to highlight. */
+ 'highlight' : false,
+
+ /** Title to be displayed above the code block. */
+ 'title' : null,
+
+ /** Enables or disables smart tabs. */
+ 'smart-tabs' : true,
+
+ /** Gets or sets tab size. */
+ 'tab-size' : 4,
+
+ /** Enables or disables gutter. */
+ 'gutter' : true,
+
+ /** Enables or disables toolbar. */
+ 'toolbar' : true,
+
+ /** Enables quick code copy and paste from double click. */
+ 'quick-code' : true,
+
+ /** Forces code view to be collapsed. */
+ 'collapse' : false,
+
+ /** Enables or disables automatic links. */
+ 'auto-links' : false,
+
+ /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */
+ 'light' : false,
+
+ 'unindent' : true,
+
+ 'html-script' : false
+ },
+
+ config : {
+ space : ' ',
+
+ /** Enables use of tags. */
+ useScriptTags : true,
+
+ /** Blogger mode flag. */
+ bloggerMode : false,
+
+ stripBrs : false,
+
+ /** Name of the tag that SyntaxHighlighter will automatically look for. */
+ tagName : 'pre',
+
+ strings : {
+ expandSource : 'expand source',
+ help : '?',
+ alert: 'SyntaxHighlighter\n\n',
+ noBrush : 'Can\'t find brush for: ',
+ brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+ // this is populated by the build script
+ aboutDialog : '@ABOUT@'
+ }
+ },
+
+ /** Internal 'global' variables. */
+ vars : {
+ discoveredBrushes : null,
+ highlighters : {}
+ },
+
+ /** This object is populated by user included external brush files. */
+ brushes : {},
+
+ /** Common regular expressions. */
+ regexLib : {
+ multiLineCComments : /\/\*[\s\S]*?\*\//gm,
+ singleLineCComments : /\/\/.*$/gm,
+ singleLinePerlComments : /#.*$/gm,
+ doubleQuotedString : /"([^\\"\n]|\\.)*"/g,
+ singleQuotedString : /'([^\\'\n]|\\.)*'/g,
+ multiLineDoubleQuotedString : new XRegExp('"([^\\\\"]|\\\\.)*"', 'gs'),
+ multiLineSingleQuotedString : new XRegExp("'([^\\\\']|\\\\.)*'", 'gs'),
+ xmlComments : /(<|<)!--[\s\S]*?--(>|>)/gm,
+ url : /\w+:\/\/[\w-.\/?%&=:@;#]*/g,
+
+ /** = ?> tags. */
+ phpScriptTags : { left: /(<|<)\?(?:=|php)?/g, right: /\?(>|>)/g, 'eof' : true },
+
+ /** <%= %> tags. */
+ aspScriptTags : { left: /(<|<)%=?/g, right: /%(>|>)/g },
+
+ /**
+ *
+ *
+ *
+ *
+ * xxx
+ *
+ *
+ *
+ * xxx
+ *
+ * xxx
+ *
+ *
+ *
+ *
+ *
+ * xxx
+ *
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ *
+ *
+ * xxxxxxxxx[xxx]xxxxxxxx
+ *
+ *
+ *
+ *
+ *
+ *
+ * xxxxxxxx[x]xxxxxxxxxxx
+ *
+ *
+ *
+ *