rabin há 7 anos atrás
pai
commit
4bfd7ae125
100 ficheiros alterados com 6654 adições e 2 exclusões
  1. 30 2
      assets/public/main.js
  2. 40 0
      assets/public/ueditor/dialogs/anchor/anchor.html
  3. 130 0
      assets/public/ueditor/dialogs/attachment/attachment.css
  4. 128 0
      assets/public/ueditor/dialogs/attachment/attachment.html
  5. 166 0
      assets/public/ueditor/dialogs/attachment/callbacks.js
  6. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif
  7. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_default.png
  8. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif
  9. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif
  10. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif
  11. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif
  12. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif
  13. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif
  14. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif
  15. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif
  16. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif
  17. BIN
      assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif
  18. 29 0
      assets/public/ueditor/dialogs/attachment/fileTypeMaps.js
  19. 24 0
      assets/public/ueditor/dialogs/background/background.css
  20. 55 0
      assets/public/ueditor/dialogs/background/background.html
  21. 348 0
      assets/public/ueditor/dialogs/background/background.js
  22. 43 0
      assets/public/ueditor/dialogs/emotion/emotion.css
  23. 54 0
      assets/public/ueditor/dialogs/emotion/emotion.html
  24. 186 0
      assets/public/ueditor/dialogs/emotion/emotion.js
  25. BIN
      assets/public/ueditor/dialogs/emotion/images/0.gif
  26. BIN
      assets/public/ueditor/dialogs/emotion/images/bface.gif
  27. BIN
      assets/public/ueditor/dialogs/emotion/images/cface.gif
  28. BIN
      assets/public/ueditor/dialogs/emotion/images/fface.gif
  29. BIN
      assets/public/ueditor/dialogs/emotion/images/jxface2.gif
  30. BIN
      assets/public/ueditor/dialogs/emotion/images/neweditor-tab-bg.png
  31. BIN
      assets/public/ueditor/dialogs/emotion/images/tface.gif
  32. BIN
      assets/public/ueditor/dialogs/emotion/images/wface.gif
  33. BIN
      assets/public/ueditor/dialogs/emotion/images/yface.gif
  34. 89 0
      assets/public/ueditor/dialogs/gmap/gmap.html
  35. 7 0
      assets/public/ueditor/dialogs/help/help.css
  36. 82 0
      assets/public/ueditor/dialogs/help/help.html
  37. 56 0
      assets/public/ueditor/dialogs/help/help.js
  38. 69 0
      assets/public/ueditor/dialogs/image/image.css
  39. 210 0
      assets/public/ueditor/dialogs/image/image.html
  40. 712 0
      assets/public/ueditor/dialogs/image/image.js
  41. BIN
      assets/public/ueditor/dialogs/image/imageUploader.swf
  42. BIN
      assets/public/ueditor/dialogs/image/images/center_focus.jpg
  43. BIN
      assets/public/ueditor/dialogs/image/images/left_focus.jpg
  44. BIN
      assets/public/ueditor/dialogs/image/images/none_focus.jpg
  45. BIN
      assets/public/ueditor/dialogs/image/images/right_focus.jpg
  46. 98 0
      assets/public/ueditor/dialogs/insertframe/insertframe.html
  47. 79 0
      assets/public/ueditor/dialogs/internal.js
  48. 126 0
      assets/public/ueditor/dialogs/link/link.html
  49. 105 0
      assets/public/ueditor/dialogs/map/map.html
  50. 30 0
      assets/public/ueditor/dialogs/music/music.css
  51. 32 0
      assets/public/ueditor/dialogs/music/music.html
  52. 192 0
      assets/public/ueditor/dialogs/music/music.js
  53. BIN
      assets/public/ueditor/dialogs/scrawl/images/addimg.png
  54. BIN
      assets/public/ueditor/dialogs/scrawl/images/brush.png
  55. BIN
      assets/public/ueditor/dialogs/scrawl/images/delimg.png
  56. BIN
      assets/public/ueditor/dialogs/scrawl/images/delimgH.png
  57. BIN
      assets/public/ueditor/dialogs/scrawl/images/empty.png
  58. BIN
      assets/public/ueditor/dialogs/scrawl/images/emptyH.png
  59. BIN
      assets/public/ueditor/dialogs/scrawl/images/eraser.png
  60. BIN
      assets/public/ueditor/dialogs/scrawl/images/redo.png
  61. BIN
      assets/public/ueditor/dialogs/scrawl/images/redoH.png
  62. BIN
      assets/public/ueditor/dialogs/scrawl/images/scale.png
  63. BIN
      assets/public/ueditor/dialogs/scrawl/images/scaleH.png
  64. BIN
      assets/public/ueditor/dialogs/scrawl/images/size.png
  65. BIN
      assets/public/ueditor/dialogs/scrawl/images/undo.png
  66. BIN
      assets/public/ueditor/dialogs/scrawl/images/undoH.png
  67. 72 0
      assets/public/ueditor/dialogs/scrawl/scrawl.css
  68. 95 0
      assets/public/ueditor/dialogs/scrawl/scrawl.html
  69. 655 0
      assets/public/ueditor/dialogs/scrawl/scrawl.js
  70. 82 0
      assets/public/ueditor/dialogs/searchreplace/searchreplace.html
  71. 157 0
      assets/public/ueditor/dialogs/searchreplace/searchreplace.js
  72. 58 0
      assets/public/ueditor/dialogs/snapscreen/snapscreen.html
  73. 21 0
      assets/public/ueditor/dialogs/spechars/spechars.html
  74. 56 0
      assets/public/ueditor/dialogs/spechars/spechars.js
  75. BIN
      assets/public/ueditor/dialogs/table/dragicon.png
  76. 75 0
      assets/public/ueditor/dialogs/table/edittable.css
  77. 57 0
      assets/public/ueditor/dialogs/table/edittable.html
  78. 198 0
      assets/public/ueditor/dialogs/table/edittable.js
  79. 61 0
      assets/public/ueditor/dialogs/table/edittd.html
  80. 33 0
      assets/public/ueditor/dialogs/table/edittip.html
  81. 1240 0
      assets/public/ueditor/dialogs/tangram.js
  82. 26 0
      assets/public/ueditor/dialogs/template/config.js
  83. BIN
      assets/public/ueditor/dialogs/template/images/bg.gif
  84. BIN
      assets/public/ueditor/dialogs/template/images/pre0.png
  85. BIN
      assets/public/ueditor/dialogs/template/images/pre1.png
  86. BIN
      assets/public/ueditor/dialogs/template/images/pre2.png
  87. BIN
      assets/public/ueditor/dialogs/template/images/pre3.png
  88. BIN
      assets/public/ueditor/dialogs/template/images/pre4.png
  89. 18 0
      assets/public/ueditor/dialogs/template/template.css
  90. 26 0
      assets/public/ueditor/dialogs/template/template.html
  91. 53 0
      assets/public/ueditor/dialogs/template/template.js
  92. BIN
      assets/public/ueditor/dialogs/video/images/center_focus.jpg
  93. BIN
      assets/public/ueditor/dialogs/video/images/left_focus.jpg
  94. BIN
      assets/public/ueditor/dialogs/video/images/none_focus.jpg
  95. BIN
      assets/public/ueditor/dialogs/video/images/right_focus.jpg
  96. 59 0
      assets/public/ueditor/dialogs/video/video.css
  97. 67 0
      assets/public/ueditor/dialogs/video/video.html
  98. 372 0
      assets/public/ueditor/dialogs/video/video.js
  99. 53 0
      assets/public/ueditor/dialogs/webapp/webapp.html
  100. BIN
      assets/public/ueditor/dialogs/wordimage/fClipboard_ueditor.swf

+ 30 - 2
assets/public/main.js

@@ -138,6 +138,29 @@ function initEditor()
 		})
 	}
 }
+
+function loadUEditor(e)
+{
+	if(!e.length)
+	{
+		return;
+	}
+	var id = e.attr('id');
+	var key = e.attr('key');
+
+	if(typeof(editors[id]) == "object")
+	{
+		editors[id].destroy();
+		editors[id] = undefined;
+	}
+
+	if(typeof(editors[id]) == "undefined")
+	{
+		editors[id] = new UE.ui.Editor();
+		editors[id].render(id);
+	}
+}
+
 function loadEditor(e)
 {	
 	if(!e.length)
@@ -307,7 +330,12 @@ function inputShow(e,n)
 	var array = ['input', 'textarea'];
 	for(var a in array)
 	{
-		$(".show_" + n).find(array[a]).removeClass('validate[required]');
+		if ($(".show_" + n).find(array[a]).length) {
+			var c = $(".show_" + n).find(array[a]).attr('class');
+			if (c.indexOf('validate[required]') > -1) {
+				$(".show_" + n).find(array[a]).removeClass('validate[required]').addClass('validates');
+			}
+		}
 	}
 	
 	item.each(function()
@@ -334,7 +362,7 @@ function inputShowOne(e,n)
 			$(".show_" + n + '_' + value).find(array[a]).each(function()
 			{
 				var parent = $(this).parent();
-				if($(this).attr('class') != 'editor' && parent.find('label').length && parent.find('label').html().indexOf('选填') == -1)
+				if($(this).attr('class') != 'editor' && $(this).attr('class').indexOf('validates') > -1 && parent.find('label').length && parent.find('label').html().indexOf('选填') == -1)
 				{
 					$(this).addClass('validate[required]');
 				}

+ 40 - 0
assets/public/ueditor/dialogs/anchor/anchor.html

@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <title></title>
+        <style type="text/css">
+            *{color: #838383;margin: 0;padding: 0}
+            html,body {font-size: 12px;overflow: hidden; }
+            .content{padding:5px 0 0 15px;}
+            input{width:210px;height:21px;line-height:21px;margin-left: 4px;}
+        </style>
+    </head>
+    <body>
+        <div class="content">
+            <span><var id="lang_input_anchorName"></var></span><input id="anchorName"  value="" />
+        </div>
+        <script type="text/javascript" src="../internal.js"></script>
+        <script type="text/javascript">
+            var anchorInput = $G('anchorName'),
+                node = editor.selection.getRange().getClosedNode();
+            if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
+                anchorInput.value = node;
+            }
+            anchorInput.onkeydown = function(evt){
+                evt = evt || window.event;
+                if(evt.keyCode == 13){
+                    editor.execCommand('anchor', anchorInput.value);
+                    dialog.close();
+                    domUtils.preventDefault(evt)
+                }
+            };
+            dialog.onok = function (){
+                editor.execCommand('anchor', anchorInput.value);
+                dialog.close();
+            };
+            $focus(anchorInput);
+        </script>
+    </body>
+</html>

+ 130 - 0
assets/public/ueditor/dialogs/attachment/attachment.css

@@ -0,0 +1,130 @@
+
+
+* {margin: 0;padding: 0;}
+.wrapper { width: 460px;height: 340px; border: 1px solid #ddd;margin: 8px;overflow-y: hidden;}
+.controller {
+    height: 30px;
+    padding-top: 10px;
+    padding-left: 6px;
+}
+#divStatus {display:inline-block; width:336px;color: #aaa;font-size: 12px; }
+#startUpload{cursor: pointer;margin-right: 10px; float: right; display: inline-block; width: 100px;height: 30px}
+div.fieldset {
+	border:  1px solid #afe14c;
+	padding: 10px 10px;
+}
+div.fieldset span.legend{position: relative;top:-20px;}
+div.flash {
+	width: 420px;
+    height: 236px;
+	margin: 2px 5px 8px 9px;
+	border-color: #D9E4FF;
+    overflow-y: auto;
+	-moz-border-radius-topleft : 5px;
+	-webkit-border-top-left-radius : 5px;
+    -moz-border-radius-topright : 5px;
+    -webkit-border-top-right-radius : 5px;
+    -moz-border-radius-bottomleft : 5px;
+    -webkit-border-bottom-left-radius : 5px;
+    -moz-border-radius-bottomright : 5px;
+    -webkit-border-bottom-right-radius : 5px;
+
+}
+
+.progressWrapper {
+	width: 412px;
+	overflow: hidden;
+}
+
+.progressContainer {
+	margin: 0 0px 5px 0;
+	/*padding: 3px 0 3px 4px;*/
+	border: solid 1px #E8E8E8;
+	background-color: #F7F7F7;
+	overflow: hidden;
+}
+/* Message */
+.message {
+	margin: 1em 0;
+	padding: 10px 20px;
+	border: solid 1px #FFDD99;
+	background-color: #FFFFCC;
+	overflow: hidden;
+}
+/* Error */
+.red {
+	border: solid 1px #B50000;
+	background-color: #FFEBEB;
+}
+
+/* Current */
+.green {
+	border: solid 1px #DDF0DD;
+	background-color: #EBFFEB;
+}
+
+/* Complete */
+.blue {
+	border: solid 1px #CEE2F2;
+	background-color: #F0F5FF;
+}
+
+.progressName {
+	font-size: 10px;
+	color: #555;
+	width: 360px;
+	height: 14px;
+	text-align: left;
+	white-space: nowrap;
+	overflow: hidden;
+}
+
+.progressBarInProgress,
+.progressBarComplete,
+.progressBarError {
+	font-size: 0;
+	width: 0%;
+	height: 2px;
+	background-color: blue;
+	margin-top: 2px;
+}
+
+.progressBarComplete {
+	width: 100%;
+	background-color: green;
+	visibility: hidden;
+}
+
+.progressBarError {
+	width: 100%;
+	background-color: red;
+	visibility: hidden;
+}
+a.progressCancel {
+	font-size: 0;
+	display: block;
+	height: 14px;
+	width: 14px;
+	background: url(../../themes/default/images/cancelbutton.gif) -14px 0 no-repeat ;
+	float: right;
+}
+
+a.progressCancel:hover {
+	background-position: 0 0;
+}
+
+
+.progressBarStatus {
+	margin-top: 2px;
+	width: 337px;
+	font-size: 7pt;
+	text-align: left;
+	white-space: nowrap;
+}
+
+/* -- SWFUpload Object Styles ------------------------------- */
+.swfupload {
+	vertical-align: top;
+}
+
+

+ 128 - 0
assets/public/ueditor/dialogs/attachment/attachment.html

@@ -0,0 +1,128 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="attachment.css"/>
+</head>
+<body>
+<div class="wrapper">
+    <div class="controller">
+        <!--<span id="divStatus"></span>-->
+        <span id="spanButtonPlaceHolder"></span>
+    </div>
+    <div class="fieldset flash" id="fsUploadProgress"></div>
+    <span id="startUpload" style="display: none;"></span>
+
+</div>
+
+<script type="text/javascript" src="../../third-party/swfupload/swfupload.js"></script>
+<script type="text/javascript" src="../../third-party/swfupload/swfupload.queue.js"></script>
+<script type="text/javascript" src="../../third-party/swfupload/fileprogress.js"></script>
+<script type="text/javascript" src="callbacks.js"></script>
+<script type="text/javascript" src="fileTypeMaps.js"></script>
+<script type="text/javascript">
+    var swfupload,
+        filesList=[];
+    editor.setOpt({
+        fileFieldName:"upfile"
+    });
+    window.onload = function () {
+        var settings = {
+            upload_url:editor.options.fileUrl,           //附件上传服务器地址
+            file_post_name:editor.options.fileFieldName,      //向后台提交的表单名
+            flash_url:"../../third-party/swfupload/swfupload.swf",
+            flash9_url:"../../third-party/swfupload/swfupload_fp9.swf",
+            post_params:{"PHPSESSID":"<?php echo session_id(); ?>"}, //解决session丢失问题
+            file_size_limit:"100 MB",                                 //文件大小限制,此处仅是前端flash选择时候的限制,具体还需要和后端结合判断
+            file_types:"*.*",                                         //允许的扩展名,多个扩展名之间用分号隔开,支持*通配符
+            file_types_description:"All Files",                      //扩展名描述
+            file_upload_limit:100,                                   //单次可同时上传的文件数目
+            file_queue_limit:10,                                      //队列中可同时上传的文件数目
+            custom_settings:{                                         //自定义设置,用户可在此向服务器传递自定义变量
+                progressTarget:"fsUploadProgress",
+                startUploadId:"startUpload"
+            },
+            debug:false,
+
+            // 按钮设置
+            button_image_url:"../../themes/default/images/filescan.png",
+            button_width:"100",
+            button_height:"25",
+            button_placeholder_id:"spanButtonPlaceHolder",
+            button_text:'<span class="theFont">'+lang.browseFiles+'</span>',
+            button_text_style:".theFont { font-size:14px;}",
+            button_text_left_padding:10,
+            button_text_top_padding:4,
+
+            // 所有回调函数 in handlers.js
+            swfupload_preload_handler:preLoad,
+            swfupload_load_failed_handler:loadFailed,
+            file_queued_handler:fileQueued,
+            file_queue_error_handler:fileQueueError,
+            //选择文件完成回调
+            file_dialog_complete_handler:function(numFilesSelected, numFilesQueued) {
+                var me = this;        //此处的this是swfupload对象
+                if (numFilesQueued > 0) {
+                    dialog.buttons[0].setDisabled(true);
+                    var start = $G(this.customSettings.startUploadId);
+                    start.style.display = "";
+                    start.onclick = function(){
+                        me.startUpload();
+                        start.style.display = "none";
+                    }
+                }
+            },
+            upload_start_handler:uploadStart,
+            upload_progress_handler:uploadProgress,
+            upload_error_handler:uploadError,
+            upload_success_handler:function (file, serverData) {
+                try{
+                    var info = eval("("+serverData+")");
+                }catch(e){}
+                var progress = new FileProgress(file, this.customSettings.progressTarget);
+                if(info.state=="SUCCESS"){
+                    progress.setComplete();
+                    progress.setStatus("<span style='color: #0b0;font-weight: bold'>"+lang.uploadSuccess+"</span>");
+                    filesList.push({url:info.url,type:info.fileType,original:info.original});
+                    progress.toggleCancel(true,this,lang.delSuccessFile);
+                }else{
+                    progress.setError();
+                    progress.setStatus(info.state);
+                    progress.toggleCancel(true,this,lang.delFailSaveFile);
+                }
+
+            },
+            //上传完成回调
+            upload_complete_handler:uploadComplete,
+            //队列完成回调
+            queue_complete_handler:function(numFilesUploaded){
+                dialog.buttons[0].setDisabled(false);
+//                var status = $G("divStatus");
+//                var num = status.innerHTML.match(/\d+/g);
+//                status.innerHTML = ((num && num[0] ?parseInt(num[0]):0) + numFilesUploaded) +lang.statusPrompt;
+            }
+        };
+        swfupload = new SWFUpload( settings );
+        //点击OK按钮
+        dialog.onok = function(){
+            var map = fileTypeMaps,
+                str="";
+            for(var i=0,ci;ci=filesList[i++];){
+                var src = editor.options.UEDITOR_HOME_URL + "dialogs/attachment/fileTypeImages/"+(map[ci.type]||"icon_default.png");
+                str += "<p style='line-height: 16px;'><img src='"+ src + "' _src='"+src+"' />" +
+                       "<a href='"+editor.options.filePath + ci.url+"'>" + ci.original + "</a></p>";
+            }
+            editor.execCommand("insertHTML",str);
+            swfupload.destroy();
+        };
+        dialog.oncancel = function(){
+            swfupload.destroy();
+        }
+    };
+</script>
+
+</body>
+</html>

+ 166 - 0
assets/public/ueditor/dialogs/attachment/callbacks.js

@@ -0,0 +1,166 @@
+/* Demo Note:  This demo uses a FileProgress class that handles the UI for displaying the file name and percent complete.
+The FileProgress class is not part of SWFUpload.
+*/
+
+
+/* **********************
+   Event Handlers
+   These are my custom event handlers to make my
+   web application behave the way I went when SWFUpload
+   completes different tasks.  These aren't part of the SWFUpload
+   package.  They are part of my application.  Without these none
+   of the actions SWFUpload makes will show up in my application.
+   ********************** */
+function preLoad() {
+	if (!this.support.loading) {
+		alert(lang.flashVersionError);
+		return false;
+	}
+    return true;
+}
+function loadFailed() {
+	alert(lang.flashLoadingError);
+}
+
+function fileQueued(file) {
+	try {
+		var progress = new FileProgress(file, this.customSettings.progressTarget);
+		progress.setStatus(lang.fileUploadReady);
+		progress.toggleCancel(true, this,lang.delUploadQueue);
+	} catch (ex) {
+		this.debug(ex);
+	}
+
+}
+
+function fileQueueError(file, errorCode, message) {
+	try {
+		if (errorCode === SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
+			alert(lang.limitPrompt1+ message +  lang.limitPrompt2);
+			return;
+		}
+
+		var progress = new FileProgress(file, this.customSettings.progressTarget);
+		progress.setError();
+        progress.toggleCancel(true, this,lang.delFailFile);
+
+		switch (errorCode) {
+		case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
+			progress.setStatus(lang.fileSizeLimit);
+			this.debug("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
+			progress.setStatus(lang.emptyFile);
+			this.debug("Error Code: Zero byte file, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
+			progress.setStatus(lang.fileTypeError);
+			this.debug("Error Code: Invalid File Type, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		default:
+			if (file !== null) {
+				progress.setStatus(lang.unknownError);
+			}
+			this.debug("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		}
+	} catch (ex) {
+        this.debug(ex);
+    }
+}
+
+
+
+function uploadStart(file) {
+	try {
+		/* I don't want to do any file validation or anything,  I'll just update the UI and
+		return true to indicate that the upload should start.
+		It's important to update the UI here because in Linux no uploadProgress events are called. The best
+		we can do is say we are uploading.
+		 */
+		var progress = new FileProgress(file, this.customSettings.progressTarget);
+		progress.setStatus(lang.fileUploading);
+		progress.toggleCancel(true, this,lang.cancelUpload);
+	}catch (ex) {}
+
+	return true;
+}
+
+function uploadProgress(file, bytesLoaded, bytesTotal) {
+	try {
+		var percent = Math.ceil((bytesLoaded / bytesTotal) * 100);
+
+		var progress = new FileProgress(file, this.customSettings.progressTarget);
+		progress.setProgress(percent);
+		progress.setStatus(lang.fileUploading);
+	} catch (ex) {
+		this.debug(ex);
+	}
+}
+
+
+function uploadError(file, errorCode, message) {
+	try {
+		var progress = new FileProgress(file, this.customSettings.progressTarget);
+		progress.setError();
+		//progress.toggleCancel(false);
+
+		switch (errorCode) {
+		case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
+			progress.setStatus(lang.netError + message);
+			this.debug("Error Code: HTTP Error, File name: " + file.name + ", Message: " + message);
+			break;
+		case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
+			progress.setStatus(lang.failUpload);
+			this.debug("Error Code: Upload Failed, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.UPLOAD_ERROR.IO_ERROR:
+			progress.setStatus(lang.serverIOError);
+			this.debug("Error Code: IO Error, File name: " + file.name + ", Message: " + message);
+			break;
+		case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
+			progress.setStatus(lang.noAuthority);
+			this.debug("Error Code: Security Error, File name: " + file.name + ", Message: " + message);
+			break;
+		case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
+			progress.setStatus(lang.fileNumLimit);
+			this.debug("Error Code: Upload Limit Exceeded, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
+			progress.setStatus(lang.failCheck);
+			this.debug("Error Code: File Validation Failed, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
+			// If there aren't any files left (they were all cancelled) disable the cancel button
+//			if (this.getStats().files_queued === 0) {
+//				document.getElementById(this.customSettings.cancelButtonId).disabled = true;
+//			}
+			progress.setStatus(lang.fileCanceling);
+			progress.setCancelled();
+			break;
+		case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
+			progress.setStatus(lang.stopUploading);
+			break;
+		default:
+			progress.setStatus(lang.unknownError + errorCode);
+			this.debug("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		}
+	} catch (ex) {
+        this.debug(ex);
+    }
+}
+
+function uploadComplete(file) {
+    //alert(file);
+    //	if (this.getStats().files_queued === 0) {
+    //		document.getElementById(this.customSettings.cancelButtonId).disabled = true;
+    //	}
+}
+
+// This event comes from the Queue Plugin
+function queueComplete(numFilesUploaded) {
+	var status = document.getElementById("divStatus");
+    var num = status.innerHTML.match(/\d+/g);
+	status.innerHTML = ((num && num[0] ?parseInt(num[0]):0) + numFilesUploaded) +lang.statusPrompt;
+}

BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_default.png


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif


BIN
assets/public/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif


+ 29 - 0
assets/public/ueditor/dialogs/attachment/fileTypeMaps.js

@@ -0,0 +1,29 @@
+/**
+ * Created by JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-2-10
+ * Time: 下午3:50
+ * To change this template use File | Settings | File Templates.
+ */
+//文件类型图标索引
+var fileTypeMaps = {
+    ".rar":"icon_rar.gif",
+    ".zip":"icon_rar.gif",
+    ".doc":"icon_doc.gif",
+    ".docx":"icon_doc.gif",
+    ".pdf":"icon_pdf.gif",
+    ".mp3":"icon_mp3.gif",
+    ".xls":"icon_xls.gif",
+    ".chm":"icon_chm.gif",
+    ".ppt":"icon_ppt.gif",
+    ".pptx":"icon_ppt.gif",
+    ".avi":"icon_mv.gif",
+    ".rmvb":"icon_mv.gif",
+    ".wmv":"icon_mv.gif",
+    ".flv":"icon_mv.gif",
+    ".swf":"icon_mv.gif",
+    ".rm":"icon_mv.gif",
+    ".exe":"icon_exe.gif",
+    ".psd":"icon_psd.gif",
+    ".txt":"icon_txt.gif"
+};

+ 24 - 0
assets/public/ueditor/dialogs/background/background.css

@@ -0,0 +1,24 @@
+.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}
+.tabbody{height:225px;}
+.panel { position: absolute;width:100%; height:100%;background: #fff;}
+
+body{font-size: 12px;color: #888;overflow: hidden;}
+input,label{vertical-align:middle}
+.clear{clear: both;}
+.pl{padding-left: 23px;padding-left: 28px\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-right: 10px;}
+.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: 30px;margin-left: 35px\9;}
+#custom input{height: 15px;min-height: 15px;width:20px;}
+#repeatType{width:100px;}

+ 55 - 0
assets/public/ueditor/dialogs/background/background.html

@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="background.css">
+</head>
+<body>
+    <div id="bg_container" class="wrapper">
+        <div id="tabHeads" class="tabhead">
+            <span class="focus" tabsrc="normal"><var id="lang_background_normal"></var></span>
+            <span class="" tabsrc="imgManager"><var id="lang_background_local"></var></span>
+        </div>
+        <div id="tabBodys" class="tabbody">
+            <div id="normal" class="panel">
+                <fieldset  class="bgarea">
+                    <legend><var id="lang_background_set"></var></legend>
+                    <div class="content">
+                        <div>
+                            <input class="iptradio" type="radio" name="t" value="none" checked="checked" onclick="net(this)"><label><var id="lang_background_none"></var></label>
+                        </div>
+                        <div class="wrapcolor">
+                            <div class="color">
+                                <input class="iptradio" type="radio" name="t" value="color" onclick="net(this)"><label><var id="lang_background_color"></var>:</label>
+                            </div>
+                            <div id="colorPicker"></div>
+                            <div class="clear"></div>
+                        </div>
+                        <div class="wrapcolor pl">
+                            <label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
+                        </div>
+                        <div id="alignment" class="alignment">
+                            <var id="lang_background_align"></var>:<select id="repeatType" onchange="selectAlign(this)">
+                                <option value="center"></option>
+                                <option value="repeat-x"></option>
+                                <option value="repeat-y"></option>
+                                <option value="repeat"></option>
+                                <option value="self"></option>
+                            </select>
+                        </div>
+                        <div id="custom" >
+                            <var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
+                        </div>
+                    </div>
+                </fieldset>
+
+            </div>
+            <div id="imgManager" class="panel">
+                <div id="imageList" style=""></div>
+            </div>
+        </div>
+    </div>
+    <script type="text/javascript" src="background.js"></script>
+</body>
+</html>

+ 348 - 0
assets/public/ueditor/dialogs/background/background.js

@@ -0,0 +1,348 @@
+var me = editor,
+    doc = me.document,
+    bodyStyle,
+    cp = $G("colorPicker"),
+    bkbodyStyle = "",
+    bkcolor = "";
+var popup = new UE.ui.Popup({
+    content:new UE.ui.ColorPicker({
+        noColorText:me.getLang("clearColor"),
+        editor:me,
+        onpickcolor:function (t, color) {
+            domUtils.setStyle(cp, "background-color", color);
+            bkcolor = color;
+            UE.ui.Popup.postHide();
+        },
+        onpicknocolor:function (t, color) {
+            domUtils.setStyle(cp, "background-color", "transparent");
+            bkcolor = "";
+            UE.ui.Popup.postHide();
+        }
+    }),
+    editor:me,
+    onhide:function () {
+        setBody();
+    }
+});
+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();
+});
+//获得head
+var getHead = function () {
+    return domUtils.getElementsByTagName($G("tabHeads"), "span");
+};
+//给head绑定事件
+var bindClick = function () {
+    var heads = getHead();
+    for (var i = 0, head; head = heads[i++];) {
+        head.onclick = function () {
+            var bodyid = this.getAttribute("tabsrc");
+            toggleHead(this);
+            toggleBody(bodyid);
+            if (bodyid == "imgManager") {
+                ajax.request(editor.options.imageManagerUrl, {
+                    timeout:100000,
+                    action:"get",
+                    onsuccess:function (xhr) {
+                        var tmp = utils.trim(xhr.responseText),
+                            imageUrls = !tmp ? [] : tmp.split("ue_separate_ue"),
+                            length = imageUrls.length,
+                            imgList = $G("imageList");
+                        imgList.innerHTML = !length ? "&nbsp;&nbsp;" + lang.noUploadImage : "";
+                        for (var k = 0, ci; ci = imageUrls[k++];) {
+                            var img = document.createElement("img");
+                            var div = document.createElement("div");
+                            div.appendChild(img);
+                            div.style.display = "none";
+                            imgList.appendChild(div);
+                            img.onclick = function () {
+                                var nodes = imgList.childNodes;
+                                for (var i = 0, node; node = nodes[i++];) {
+                                    node.firstChild.removeAttribute("selected");
+                                    node.firstChild.style.cssText = "filter:alpha(Opacity=100);-moz-opacity:1;opacity: 1;border: 2px solid #fff";
+                                }
+                                changeSelected(this);
+                            };
+                            img.onload = function () {
+                                this.parentNode.style.display = "";
+                                var w = this.width, h = this.height;
+                                scale(this, 95, 120, 80);
+                                this.title = lang.toggleSelect + w + "X" + h;
+                            };
+                            img.setAttribute(k < 35 ? "src" : "lazy_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig, ""));
+                            img.setAttribute("_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig, ""));
+
+                        }
+                    },
+                    onerror:function () {
+                        $G("imageList").innerHTML = lang.imageLoadError;
+                    }
+                });
+            } else {
+                var radios = document.getElementsByName("t");
+                for (var i = 0, r; r = radios[i++];) {
+                    if (r.checked && r.value != "none") {
+                        $G("repeatType").style.display = "";
+                        net(r);
+                    }
+                }
+            }
+        }
+    }
+};
+/**
+ * 改变o的选中状态
+ * @param o
+ */
+function changeSelected(o) {
+    if (o.getAttribute("selected")) {
+        o.removeAttribute("selected");
+        o.style.cssText = "filter:alpha(Opacity=100);-moz-opacity:1;opacity: 1;border: 2px solid #fff";
+    } else {
+        o.setAttribute("selected", "true");
+        o.style.cssText = "filter:alpha(Opacity=50);-moz-opacity:0.5;opacity: 0.5;border:2px solid blue;";
+    }
+    $G("url").value = o.getAttribute("src")
+}
+/**
+ * 图片缩放
+ * @param img
+ * @param max
+ */
+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;
+            }
+        }
+    }
+}
+//切换body
+var toggleBody = function (id) {
+    var bodys = ["normal", "imgManager"];
+    for (var i = 0, body; body = bodys[i++];) {
+        $G(body).style.zIndex = body == id ? 200 : 1;
+    }
+};
+//切换head
+var toggleHead = function (obj) {
+    var heads = getHead();
+    for (var i = 0, head; head = heads[i++];) {
+        domUtils.removeClasses(head, ["focus"]);
+        $G("repeatType").style.display = "none";
+    }
+    domUtils.addClass(obj, "focus");
+};
+//获得当前选中的tab
+var getCheckedTab = function () {
+    var heads = getHead();
+    for (var i = 0, head; head = heads[i++];) {
+        if (domUtils.hasClass(head, "focus")) {
+            return head;
+        }
+    }
+};
+
+
+var init = function () {
+    bindClick();
+    var el = getHead()[0],
+            bodyid = el.getAttribute("tabsrc");
+    toggleHead(el);
+    toggleBody(bodyid);
+    $G("alignment").style.display = "none";
+    $G("custom").style.display = "none";
+    //初始化颜色
+    domUtils.setStyle(cp, "background-color", domUtils.getComputedStyle(doc.body, "background-color"));
+    var color = domUtils.getComputedStyle(doc.body, "background-color");
+    if ((color && color != "#ffffff" && color != "transparent") || domUtils.getComputedStyle(doc.body, "background-image") != "none") {
+        setTimeout(function () {
+            document.getElementsByName("t")[1].click();
+        }, 200);
+    }
+    initImgUrl();
+    initSelfPos();
+    initAlign();
+};
+//初始化自定义位置
+function initSelfPos() {
+    var x, y;
+    if (browser.ie) {
+        x = domUtils.getComputedStyle(doc.body, "background-position-x").replace(/50%|%|px|center/ig, "");
+        y = domUtils.getComputedStyle(doc.body, "background-position-y").replace(/50%|%|px|center/ig, "");
+    } else {
+        var arr = domUtils.getComputedStyle(doc.body, "background-position").match(/\s?(\d*)px/ig);
+        if (arr && arr.length) {
+            x = arr[0].replace("px", "");
+            y = arr[1].replace("px", "");
+        }
+    }
+    $G("x").value = x || 0;
+    $G("y").value = y || 0;
+}
+//初始化图片地址
+function initImgUrl() {
+    var su = domUtils.getComputedStyle(doc.body, "background-image"),
+        url = "";
+    if (su.indexOf(me.options.imagePath) > 0) {
+        url = su.match(/url\("?(.*[^\)"])"?/i);
+        if (url && url.length) {
+            url = url[1].substring(url[1].indexOf(me.options.imagePath), url[1].length);
+        }
+    } else {
+        url = su != "none" ? su.replace(/url\("?|"?\)/ig, "") : "";
+    }
+    $G("url").value = url;
+}
+//初始化定位
+function initAlign() {
+    var align = domUtils.getComputedStyle(doc.body, "background-repeat"),
+        alignType = $G("repeatType");
+    if (align == "no-repeat") {
+        var pos = domUtils.getComputedStyle(doc.body, browser.ie ? "background-position-x" : "background-position");
+        alignType.value = pos && pos.match(/\s?(\d*)px/ig) ? "self" : "center";
+        if (pos == "center") {
+            alignType.value = "center";
+        }
+        $G("custom").style.display = alignType.value == "self" ? "" : "none";
+    } else {
+        alignType.value = align;
+    }
+}
+    init();
+
+
+
+//获得选中的类型
+function getCheckIpt() {
+    var ipts = document.getElementsByName("t");
+    for (var i = 0, ipt; ipt = ipts[i++];) {
+        if (ipt.checked) {
+            return ipt.value;
+        }
+    }
+}
+var net = function (obj) {
+    var align = $G("alignment"),
+        url = $G("url"),
+        custom = $G("custom");
+    if (obj.value == "none") {
+        align.style.display = "none";
+        custom.style.display = "none";
+        if (browser.ie) {
+            url.onpropertychange = null;
+        } else {
+            url.removeEventListener("input", setBody);
+        }
+    } else {
+        bindSelfPos();
+        $G("repeatType").style.display = "";
+        align.style.display = "";
+        if (browser.ie) {
+            url.onpropertychange = setBody;
+        } else {
+            url.addEventListener("input", setBody, false);
+        }
+    }
+    setBody();
+};
+//给自定义位置绑定事件
+var bindSelfPos = function () {
+    var x = $G("x"),
+        y = $G("y");
+    domUtils.on(x, ["propertychange", "input", "keydown"], function (evt) {
+        bindkeydown(evt, this);
+    });
+    domUtils.on(y, ["propertychange", "input", "keydown"], function (evt) {
+        bindkeydown(evt, this);
+    });
+    function bindkeydown(evt, obj) {
+        evt = evt || event;
+        if (evt.keyCode == 38 || evt.keyCode == 40) {
+            obj.value = evt.keyCode == 38 ? parseInt(obj.value) + 1 : parseInt(obj.value) - 1;
+            if (obj.value < 0) {
+                obj.value = 0;
+            }
+        } else {
+            if (evt.keyCode < 48 && evt.keyCode > 57) {
+                domUtils.preventDefault(evt);
+            }
+        }
+        setBody();
+    }
+};
+var showAlign = function () {
+    $G("alignment").style.display = "";
+};
+var selectAlign = function (obj) {
+    $G("custom").style.display = obj.value == "self" ? "" : "none";
+    setBody();
+};
+//给body增加样式和背景图片
+var setBody = function () {
+    var color = domUtils.getStyle(cp, "background-color"),
+        bgimg = $G("url").value,
+        align = $G("repeatType").value,
+        alignObj = {
+            "background-repeat":"no-repeat",
+            "background-position":"center center"
+        },
+        outstr = [];
+    if (color)
+        alignObj["background-color"] = color;
+    if (bgimg)
+        alignObj["background-image"] = 'url("' + bgimg + '")';
+    switch (align) {
+        case "repeat-x":
+            alignObj["background-repeat"] = "repeat-x;";
+            break;
+        case "repeat-y":
+            alignObj["background-repeat"] = "repeat-y;";
+            break;
+        case "repeat":
+            alignObj["background-repeat"] = "repeat;";
+            break;
+        case "self":
+            alignObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
+            break;
+    }
+    for (var name in alignObj) {
+        if (alignObj.hasOwnProperty(name)) {
+            outstr.push(name + ":" + alignObj[name]);
+        }
+    }
+    if (getCheckIpt() != "none") {
+        utils.cssRule('body','body{' + outstr.join(";") + '}',doc);
+
+    } else {
+
+        utils.cssRule('body','',doc)
+    }
+};
+
+
+
+dialog.onok = function () {
+    setBody();
+};
+dialog.oncancel = function () {
+    utils.cssRule('body',bkbodyStyle,doc)
+};
+bkbodyStyle = utils.cssRule('body',undefined,doc);

+ 43 - 0
assets/public/ueditor/dialogs/emotion/emotion.css

@@ -0,0 +1,43 @@
+.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;}

+ 54 - 0
assets/public/ueditor/dialogs/emotion/emotion.html

@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="emotion.css">
+</head>
+<body>
+<div id="tabPanel" class="wrapper">
+    <div id="tabHeads" class="tabhead">
+        <span><var id="lang_input_choice"></var></span>
+        <span><var id="lang_input_Tuzki"></var></span>
+        <span><var id="lang_input_lvdouwa"></var></span>
+        <span><var id="lang_input_BOBO"></var></span>
+        <span><var id="lang_input_babyCat"></var></span>
+        <span><var id="lang_input_bubble"></var></span>
+        <span><var id="lang_input_youa"></var></span>
+    </div>
+    <div id="tabBodys" class="tabbody">
+        <div id="tab0"></div>
+        <div id="tab1"></div>
+        <div id="tab2"></div>
+        <div id="tab3"></div>
+        <div id="tab4"></div>
+        <div id="tab5"></div>
+        <div id="tab6"></div>
+    </div>
+</div>
+<div id="tabIconReview">
+    <img id='faceReview' class='review'/>
+</div>
+<script type="text/javascript" src="emotion.js"></script>
+<script type="text/javascript">
+    var emotion = {
+        tabNum:7, //切换面板数量
+        SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
+        imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
+        imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
+        imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
+        SmileyInfor:{
+            tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
+            tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
+            tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
+            tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
+            tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
+            tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
+            tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
+        }
+    };
+</script>
+</body>
+</html>

+ 186 - 0
assets/public/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 = ['<table class="smileytable">'],
+            i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
+            sUrl, realUrl, posflag, offset, infor;
+
+    for ( ; i < imgNum; ) {
+        textHTML.push( '<tr>' );
+        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( '<td  class="' + tableCss + '"   border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center"  bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' );
+                textHTML.push( '<span>' );
+                textHTML.push( '<img  style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
+                textHTML.push( '</span>' );
+            } else {
+                textHTML.push( '<td width="' + iColWidth + '%"   bgcolor="#FFFFFF">' );
+            }
+            textHTML.push( '</td>' );
+        }
+        textHTML.push( '</tr>' );
+    }
+    textHTML.push( '</table>' );
+    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;
+}
+

BIN
assets/public/ueditor/dialogs/emotion/images/0.gif


BIN
assets/public/ueditor/dialogs/emotion/images/bface.gif


BIN
assets/public/ueditor/dialogs/emotion/images/cface.gif


BIN
assets/public/ueditor/dialogs/emotion/images/fface.gif


BIN
assets/public/ueditor/dialogs/emotion/images/jxface2.gif


BIN
assets/public/ueditor/dialogs/emotion/images/neweditor-tab-bg.png


BIN
assets/public/ueditor/dialogs/emotion/images/tface.gif


BIN
assets/public/ueditor/dialogs/emotion/images/wface.gif


BIN
assets/public/ueditor/dialogs/emotion/images/yface.gif


+ 89 - 0
assets/public/ueditor/dialogs/gmap/gmap.html

@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .content{width:530px; height: 350px;margin: 10px auto;}
+        .content table{width: 100%}
+        .content table td{vertical-align: middle;}
+        #address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
+    </style>
+    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
+</head>
+<body>
+<div class="content">
+    <table>
+        <tr>
+            <td><label for="address"><var id="lang_input_address"></var></label></td>
+            <td><input id="address" type="text" /></td>
+            <td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td>
+        </tr>
+    </table>
+    <div id="container" style="width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;"></div>
+</div>
+<script type="text/javascript">
+    domUtils.on(window,"load",function(){
+        var map = new google.maps.Map(document.getElementById('container'), {
+                zoom: 3,
+                streetViewControl: false,
+                scaleControl: true,
+                mapTypeId: google.maps.MapTypeId.ROADMAP
+            });
+            var imgcss;
+            var marker = new google.maps.Marker({
+                map: map,
+                draggable: true
+            });
+            function doSearch(){
+                var address = document.getElementById('address').value;
+                var geocoder = new google.maps.Geocoder();
+                geocoder.geocode( { 'address': address}, function (results, status) {
+                    if (status == google.maps.GeocoderStatus.OK) {
+                        var bounds = results[0].geometry.viewport;
+                        map.fitBounds(bounds);
+                        marker.setPosition(results[0].geometry.location);
+                        marker.setTitle(address);
+                    } else alert(lang.searchError);
+                });
+            }
+            $G('address').onkeydown = function (evt){
+                evt = evt || event;
+                if (evt.keyCode == 13) {
+                    doSearch();
+                }
+            };
+            $G("doSearch").onclick = doSearch;
+            dialog.onok = function (){
+                var center = map.getCenter();
+                var point = marker.getPosition();
+                var url = "http://maps.google.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
+                editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
+            };
+
+            function getPars(str,par){
+                var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+                return reg.exec(str)[1];
+            }
+            var img = editor.selection.getRange().getClosedNode();
+            if(img && img.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1){
+                var url = img.getAttribute("src");
+                var centers = getPars(url,"center").split(",");
+                point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
+                map.setCenter(point);
+                map.setZoom(Number(getPars(url,"zoom")));
+                centers = getPars(url,"markers").split(",");
+                marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
+                imgcss = img.style.cssText;
+            }else{
+                setTimeout(function(){
+                    doSearch();
+                },30)
+            }
+    });
+
+</script>
+</body>
+</html>

+ 7 - 0
assets/public/ueditor/dialogs/help/help.css

@@ -0,0 +1,7 @@
+.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;}

+ 82 - 0
assets/public/ueditor/dialogs/help/help.html

@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title>帮助</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="help.css">
+</head>
+<body>
+<div class="wrapper" id="helptab">
+    <div id="tabHeads" class="tabhead">
+        <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
+        <span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
+    </div>
+    <div id="tabBodys" class="tabbody">
+        <div id="about" class="panel">
+            <h1>UEditor</h1>
+            <p id="version"></p>
+            <p><var id="lang_input_introduction"></var></p>
+        </div>
+        <div id="shortcuts" class="panel">
+            <table>
+                <thead>
+                <tr>
+                    <td><var id="lang_Txt_shortcuts"></var></td>
+                    <td><var id="lang_Txt_func"></var></td>
+                </tr>
+                </thead>
+                <tbody>
+                <tr>
+                    <td>ctrl+b</td>
+                    <td><var id="lang_Txt_bold"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+c</td>
+                    <td><var id="lang_Txt_copy"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+x</td>
+                    <td><var id="lang_Txt_cut"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+v</td>
+                    <td><var id="lang_Txt_Paste"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+y</td>
+                    <td><var id="lang_Txt_undo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+z</td>
+                    <td><var id="lang_Txt_redo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+i</td>
+                    <td><var id="lang_Txt_italic"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+u</td>
+                    <td><var id="lang_Txt_underline"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+a</td>
+                    <td><var id="lang_Txt_selectAll"></var></td>
+                </tr>
+                <tr>
+                    <td>shift+enter</td>
+                    <td><var id="lang_Txt_visualEnter"></var></td>
+                </tr>
+                <tr>
+                    <td>alt+z</td>
+                    <td><var id="lang_Txt_fullscreen"></var></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="help.js"></script>
+</body>
+</html>

+ 56 - 0
assets/public/ueditor/dialogs/help/help.js

@@ -0,0 +1,56 @@
+/**
+ * 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

+ 69 - 0
assets/public/ueditor/dialogs/image/image.css

@@ -0,0 +1,69 @@
+@charset "utf-8";
+.wrapper{ width: 623px;margin: 10px auto;zoom:1;position: relative;}
+.tabbody{ height:325px;_height:330px;}/*tab样式框大小*/
+.panel { position: absolute;width:100%; height:100%;background: #fff;}
+
+#remote{ z-index: 200;}
+#remote table{border-collapse: collapse;width: 620px; height: 300px; margin-top: 5px;}
+#remote td.label{text-align: center;width: 80px; }
+#remote td{height: 40px;}
+td input {
+    width: 150px;
+    height: 21px;
+    line-height: 21px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+#url {width: 520px;margin-bottom: 2px;}
+#preview{width: 260px; height: 260px; position: absolute;top:50px; left: 341px; z-index: 9999;background-color: #eee}
+.lock{
+    position: absolute;
+    width: 45px;
+    height: 40px;
+    top: 68px;
+    left: 260px;
+    background: url("../../themes/default/images/lock.gif") 3px -4px no-repeat;
+    line-height: 40px;
+    padding-top:10px;
+}
+.saveDir{
+    /*width: 132px;*/
+    /*text-align: right;*/
+    height: 40px;
+    line-height: 40px;
+    margin-left: 30px;
+    float: left;
+}
+.saveDir select{
+    height: 30px;
+}
+#duiqi{ width: 62px; height: 38px;float: left}
+#remoteFloat div,#localFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin-left:1px;width:38px;height:36px;float:left;}
+#remoteFloat .focus,#localFloat .focus{opacity: 1;filter: alpha(opacity = 100)}
+#maskIframe{ width: 620px; height: 325px; position: absolute;z-index: 100; }
+#flashContainer { margin: 6px;position: relative;}
+#upload{width: 100px;height: 30px;float: right; margin:3px 6px 0 0;cursor: pointer;}
+#imageList{width: 620px;height: 315px; margin-top: 10px;overflow:hidden;overflow-y: auto;}
+#imageList img{cursor: pointer ;border: 2px solid #fff}
+#imgManager #imageList div{float: left;width: 100px;height: 100px;margin: 5px 10px;}
+#imgSearchTxt{padding-left:2px;margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;}
+#searchList{width: 620px;overflow: auto;zoom:1;height: 270px;}
+#searchList div{float: left;width: 116px;height: 135px;margin: 5px 15px;_margin:5px 10px;}
+#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/
+#searchList p{margin-left: 10px;_margin-left:8px;}
+#imgType{
+    width: 65px;
+    height: 23px;
+    line-height: 22px;
+    border: 1px solid #d7d7d7;
+}
+#imgSearchBtn,#imgSearchReset{
+    width: 100%;
+    height: 25px;
+    margin: 0 3px;
+    line-height: 25px;
+    background: #eee;
+    border: 1px solid #d7d7d7;
+    cursor: pointer
+}
+.msg{margin-left: 5px;}

+ 210 - 0
assets/public/ueditor/dialogs/image/image.html

@@ -0,0 +1,210 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" href="image.css" type="text/css" />
+</head>
+<body>
+    <div class="wrapper">
+        <div id="imageTab">
+            <div id="tabHeads" class="tabhead">
+                <span tabSrc="remote"   style="display: none" ><var id="lang_tab_remote"></var></span>
+                <span tabSrc="local" class="focus" style="display: none" ><var id="lang_tab_local"></var></span>
+                <span tabSrc="imgManager" style="display: none" ><var id="lang_tab_imgManager"></var></span>
+                <span tabSrc="imgSearch" style="display: none" ><var id="lang_tab_imgSearch"></var></span>
+            </div>
+            <div id="tabBodys" class="tabbody">
+                <div id="remote" class="panel" style="display: none" >
+                    <table cellpadding="0" cellspacing="0">
+                        <tr>
+                            <td class="label"><label for="url"><var id="lang_input_url"></var></label></td>
+                            <td><input id="url" type="text"/></td>
+                        </tr>
+                        <tr>
+                            <td class="label"><label for="width"><var id="lang_input_width"></var></label></td>
+                            <td><input type="text" id="width"/> px</td>
+                        </tr>
+                        <tr>
+                            <td class="label"><label for="height"><var id="lang_input_height"></var></label></td>
+                            <td><input type="text" id="height"/> px</td>
+                        </tr>
+                        <tr>
+                            <td class="label"><label for="border"><var id="lang_input_border"></var></label></td>
+                            <td><input type="text" id="border"/> px</td>
+                        </tr>
+                        <tr>
+                            <td class="label"><label for="vhSpace"><var id="lang_input_vhspace"></var></label></td>
+                            <td><input type="text" id="vhSpace"/> px</td>
+                        </tr>
+                        <tr>
+                            <td class="label"><label for="title"><var id="lang_input_title"></var></label></td>
+                            <td><input type="text" id="title"/></td>
+                        </tr>
+                        <tr>
+                            <td class="label"><var id="lang_input_remoteAlign"></var></td>
+                            <td id="remoteFloat"></td>
+                        </tr>
+                    </table>
+
+                    <div id="preview"></div>
+                    <div class="lock"><input id="lock" type="checkbox" checked="checked"></div>
+                </div>
+                <div id="local" class="panel">
+                    <div id="flashContainer"></div>
+                    <div><div id="upload"></div><div id="duiqi"></div><div id="localFloat"></div></div>
+
+                    <div class="saveDir" style="display: none">
+                        <var id="lang_savePath" ></var>:<select id="savePath">
+                            <option value="1">upload</option>
+                            <option value="2">upload1</option>
+                        </select>
+                    </div>
+                </div>
+                <div id="imgManager" class="panel">
+                    <div id="imageList"><var id="lang_imgLoading"></var></div>
+                </div>
+                <div id="imgSearch" class="panel">
+                    <table style="margin-top: 5px;">
+                        <tr>
+                            <td width="200"><input id="imgSearchTxt" type="text" /></td>
+                            <td width="65">
+                                <select id="imgType">
+                                    <!--具体内容值将由国际化组件动态填充-->
+                                    <option value="&s=4&z=0"></option>
+                                    <option value="&s=1&z=19"></option>
+                                    <option value="&s=2&z=0"></option>
+                                    <option value="&s=3&z=0"></option>
+                                </select>
+                            </td>
+                            <td width="80"><input id="imgSearchBtn" type="button"  /></td>
+                            <td width="80"><input id="imgSearchReset" type="button" /></td>
+                        </tr>
+                    </table>
+                    <div id="searchList"></div>
+                </div>
+                <iframe id="maskIframe" src="about:blank" scrolling="no" frameborder="no"></iframe>
+            </div>
+        </div>
+    </div>
+    <script type="text/javascript" src="../tangram.js"></script>
+    <script type="text/javascript" src="image.js"></script>
+
+    <script type="text/javascript">
+        //全局变量
+        var imageUrls = [],          //用于保存从服务器返回的图片信息数组
+            selectedImageCount = 0;  //当前已选择的但未上传的图片数量
+
+        editor.setOpt({
+            imageFieldName:"upfile",
+            compressSide:0,
+            maxImageSideLength:900
+        });
+        utils.domReady(function(){
+            var flashOptions = {
+                container:"flashContainer",                                                    //flash容器id
+                url:editor.options.imageUrl,                                           // 上传处理页面的url地址
+                ext:'{"param1":"value1", "param2":"value2"}',                                 //可向服务器提交的自定义参数列表
+                fileType:'{"description":"'+lang.fileType+'", "extension":"*.gif;*.jpeg;*.png;*.jpg"}',     //上传文件格式限制
+                flashUrl:'imageUploader.swf',                                                  //上传用的flash组件地址
+                width:608,          //flash的宽度
+                height:272,         //flash的高度
+                gridWidth:121,     // 每一个预览图片所占的宽度
+                gridHeight:120,    // 每一个预览图片所占的高度
+                picWidth:100,      // 单张预览图片的宽度
+                picHeight:100,     // 单张预览图片的高度
+                uploadDataFieldName:editor.options.imageFieldName,    // POST请求中图片数据的key
+                picDescFieldName:'pictitle',      // POST请求中图片描述的key
+                maxSize:4,                         // 文件的最大体积,单位M
+                compressSize:2,                   // 上传前如果图片体积超过该值,会先压缩,单位M
+                maxNum:32,                         // 单次最大可上传多少个文件
+                compressSide:editor.options.compressSide,                 //等比压缩的基准,0为按照最长边,1为按照宽度,2为按照高度
+                compressLength:editor.options.maxImageSideLength        //能接受的最大边长,超过该值Flash会自动等比压缩
+            };
+			
+			var imageSrcTitle=[];  //获取上传图片的图片原名
+			
+            //回调函数集合,支持传递函数名的字符串、函数句柄以及函数本身三种类型
+            var callbacks = {
+                // 选择文件的回调
+                selectFileCallback: function(selectFiles){
+                    utils.each(selectFiles,function(file){
+                        var tmp = {};
+                        tmp.id = file.index;
+                        tmp.data = {};
+						imageSrcTitle.push(file.name);
+                        postConfig.push(tmp);
+                    });
+                    selectedImageCount += selectFiles.length;
+                    if(selectedImageCount) baidu.g("upload").style.display = "";
+                    dialog.buttons[0].setDisabled(true); //初始化时置灰确定按钮
+                },
+                // 删除文件的回调
+                deleteFileCallback: function(delFiles){
+                    for(var i = 0,len = delFiles.length;i<len;i++){
+                        var index = delFiles[i].index;
+                        postConfig.splice(index,1);
+                    }
+                    selectedImageCount -= delFiles.length;
+                    if (!selectedImageCount) {
+                        baidu.g("upload").style.display = "none";
+                        dialog.buttons[0].setDisabled(false);         //没有选择图片时重新点亮按钮
+                    }
+                },
+
+                // 单个文件上传完成的回调
+                uploadCompleteCallback: function(data){
+                    try{
+                        var info = eval("(" + data.info + ")");
+						info.imageSrcTitle = imageSrcTitle[0];  //将图片原名赋值给回调函数返回的图片参数
+						imageSrcTitle.splice(0,1);
+                        info && imageUrls.push(info);
+                        selectedImageCount--;
+                    }catch(e){}
+
+                },
+                // 单个文件上传失败的回调,
+                uploadErrorCallback: function (data){
+                    if(!data.info){
+                        alert(lang.netError);
+                    }
+                    //console && console.log(data);
+                },
+                // 全部上传完成时的回调
+                allCompleteCallback: function(){
+                    dialog.buttons[0].setDisabled(false);    //上传完毕后点亮按钮
+                },
+                // 文件超出限制的最大体积时的回调
+                //exceedFileCallback: 'exceedFileCallback',
+                // 开始上传某个文件时的回调
+                startUploadCallback: function(){
+                    var config = postConfig.shift();
+                    //也可以在这里更改
+                    //if(config.id==2){ //设置第三张图片的对应参数
+                    //     config.data={"myParam":"value"}
+                    // }
+                    flashObj.addCustomizedParams(config.id,config.data);
+                }
+            };
+            imageUploader.init(flashOptions,callbacks);
+            $G("upload").onclick = function () {
+                /**
+                 * 接口imageUploader.setPostParams()可以在提交时设置本次上传提交的参数(包括所有图片)
+                 * 参数为json对象{"key1":"value1","key2":"value2"},其中key即为向后台post提交的name,value即为值。
+                 * 其中有一个特殊的保留key值为action,若设置,可以更改本次提交的处理地址
+                 */
+                var postParams = {
+                    "dir":baidu.g("savePath").value
+                };
+                imageUploader.setPostParams(postParams);
+                flashObj.upload();
+                this.style.display = "none";
+                $G("savePath").parentNode.style.display = "none";
+            };
+
+        });
+    </script>
+</body>
+</html>

Diff do ficheiro suprimidas por serem muito extensas
+ 712 - 0
assets/public/ueditor/dialogs/image/image.js


BIN
assets/public/ueditor/dialogs/image/imageUploader.swf


BIN
assets/public/ueditor/dialogs/image/images/center_focus.jpg


BIN
assets/public/ueditor/dialogs/image/images/left_focus.jpg


BIN
assets/public/ueditor/dialogs/image/images/none_focus.jpg


BIN
assets/public/ueditor/dialogs/image/images/right_focus.jpg


+ 98 - 0
assets/public/ueditor/dialogs/insertframe/insertframe.html

@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .warp {width: 320px;height: 153px;margin-left:5px;padding: 20px 0 0 15px;position: relative;}
+        #url {width: 290px; margin-bottom: 2px; margin-left: -6px; margin-left: -2px\9;*margin-left:0;_margin-left:0; }
+        .format span{display: inline-block; width: 58px;text-align: center; zoom:1;}
+        table td{padding:5px 0;}
+        #align{width: 65px;height: 23px;line-height: 22px;}
+    </style>
+</head>
+<body>
+<div class="warp">
+        <table width="300" cellpadding="0" cellspacing="0">
+            <tr>
+                <td colspan="2" class="format">
+                    <span><var id="lang_input_address"></var></span>
+                    <input style="width:200px" id="url" type="text" value=""/>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_width"></var></span><input style="width:200px" type="text" id="width"/> px</td>
+
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_height"></var></span><input style="width:200px" type="text" id="height"/> px</td>
+            </tr>
+            <tr>
+                <td><span><var id="lang_input_isScroll"></var></span><input type="checkbox" id="scroll"/> </td>
+                <td><span><var id="lang_input_frameborder"></var></span><input type="checkbox" id="frameborder"/> </td>
+            </tr>
+
+            <tr>
+                <td colspan="2"><span><var id="lang_input_alignMode"></var></span>
+                    <select id="align">
+                        <option value=""></option>
+                        <option value="left"></option>
+                        <option value="right"></option>
+                    </select>
+                </td>
+            </tr>
+        </table>
+</div>
+<script type="text/javascript">
+    var iframe = editor._iframe;
+    if(iframe){
+        $G("url").value = iframe.getAttribute("src")||"";
+        $G("width").value = iframe.getAttribute("width")||iframe.style.width.replace("px","")||"";
+        $G("height").value = iframe.getAttribute("height") || iframe.style.height.replace("px","") ||"";
+        $G("scroll").checked = (iframe.getAttribute("scrolling") == "yes") ? true : false;
+        $G("frameborder").checked = (iframe.getAttribute("frameborder") == "1") ? true : false;
+        $G("align").value = iframe.align ? iframe.align : "";
+    }
+    function queding(){
+        var  url = $G("url").value.replace(/^\s*|\s*$/ig,""),
+                width = $G("width").value,
+                height = $G("height").value,
+                scroll = $G("scroll"),
+                frameborder = $G("frameborder"),
+                float = $G("align").value,
+                newIframe = editor.document.createElement("iframe"),
+                div;
+        if(!url){
+            alert(lang.enterAddress);
+            return false;
+        }
+        newIframe.setAttribute("src",/http:\/\/|https:\/\//ig.test(url) ? url : "http://"+url);
+        /^[1-9]+[.]?\d*$/g.test( width ) ? newIframe.setAttribute("width",width) : "";
+        /^[1-9]+[.]?\d*$/g.test( height ) ? newIframe.setAttribute("height",height) : "";
+        scroll.checked ?  newIframe.setAttribute("scrolling","yes") : newIframe.setAttribute("scrolling","no");
+        frameborder.checked ?  newIframe.setAttribute("frameborder","1",0) : newIframe.setAttribute("frameborder","0",0);
+        float ? newIframe.setAttribute("align",float) :  newIframe.setAttribute("align","");
+        if(iframe){
+            iframe.parentNode.insertBefore(newIframe,iframe);
+            domUtils.remove(iframe);
+        }else{
+            div = editor.document.createElement("div");
+            div.appendChild(newIframe);
+            editor.execCommand("inserthtml",div.innerHTML);
+        }
+        editor._iframe = null;
+        dialog.close();
+    }
+    dialog.onok = queding;
+    $G("url").onkeydown = function(evt){
+        evt = evt || event;
+        if(evt.keyCode == 13){
+            queding();
+        }
+    };
+    $focus($G( "url" ));
+
+</script>
+</body>
+</html>

+ 79 - 0
assets/public/ueditor/dialogs/internal.js

@@ -0,0 +1,79 @@
+(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]);
+
+    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);
+            }
+        }
+    } );
+
+})();
+

+ 126 - 0
assets/public/ueditor/dialogs/link/link.html

@@ -0,0 +1,126 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        *{margin:0;padding:0;color: #838383;}
+        table{font-size: 12px;margin: 10px;line-height: 30px}
+        .txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}
+    </style>
+</head>
+<body>
+    <table>
+        <tr>
+            <td><label for="text"> <var id="lang_input_text"></var></label></td>
+            <td><input class="txt" id="text" type="text" disabled="true"/></td>
+        </tr>
+        <tr>
+            <td><label for="href"> <var id="lang_input_url"></var></label></td>
+            <td><input class="txt" id="href" type="text" /></td>
+        </tr>
+        <tr>
+            <td><label for="title"> <var id="lang_input_title"></var></label></td>
+            <td><input class="txt" id="title" type="text"/></td>
+        </tr>
+        <tr>
+             <td colspan="2">
+                 <label for="target"><var id="lang_input_target"></var></label>
+                 <input id="target" type="checkbox"/>
+             </td>
+        </tr>
+        <tr>
+            <td colspan="2" id="msg"></td>
+        </tr>
+    </table>
+<script type="text/javascript">
+    var range = editor.selection.getRange(),
+        link = range.collapsed ? editor.queryCommandValue( "link" ) : editor.selection.getStart(),
+        url,
+        text = $G('text'),
+        rangeLink = domUtils.findParentByTagName(range.getCommonAncestor(),'a',true),
+        orgText;
+    link = domUtils.findParentByTagName( link, "a", true );
+    if(link){
+        url = utils.html(link.getAttribute( '_href' ) || link.getAttribute( 'href', 2 ));
+
+        if(rangeLink === link && !link.getElementsByTagName('img').length){
+            text.removeAttribute('disabled');
+            orgText = text.value = link[browser.ie ? 'innerText':'textContent'];
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }else{
+        if(range.collapsed){
+            text.removeAttribute('disabled');
+            text.value = '';
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }
+    $G("title").value = url ? link.title : "";
+    $G("href").value = url ? url: '';
+    $G("target").checked = url && link.target == "_blank" ? true :  false;
+    $focus($G("href"));
+
+    function handleDialogOk(){
+        var href =$G('href').value.replace(/^\s+|\s+$/g, '');
+        if(href){
+            if(!hrefStartWith(href,["http","/","ftp://"])) {
+                href  = "http://" + href;
+            }
+            var obj = {
+                'href' : href,
+                'target' : $G("target").checked ? "_blank" : '_self',
+                'title' : $G("title").value.replace(/^\s+|\s+$/g, ''),
+                '_href':href
+            };
+            //修改链接内容的情况太特殊了,所以先做到这里了
+            //todo:情况多的时候,做到command里
+            if(orgText && text.value != orgText){
+                link[browser.ie ? 'innerText' : 'textContent'] =  obj.textValue = text.value;
+                range.selectNode(link).select()
+            }
+            if(range.collapsed){
+                obj.textValue = text.value;
+            }
+            editor.execCommand('link',obj );
+            dialog.close();
+        }
+    }
+    dialog.onok = handleDialogOk;
+    $G('href').onkeydown = $G('title').onkeydown = function(evt){
+        evt = evt || window.event;
+        if (evt.keyCode == 13) {
+            handleDialogOk();
+            return false;
+        }
+    };
+    $G('href').onblur = function(){
+        if(!hrefStartWith(this.value,["http","/","ftp://"])){
+            $G("msg").innerHTML = "<span style='color: red'>"+lang.httpPrompt+"</span>";
+        }else{
+            $G("msg").innerHTML = "";
+        }
+    };
+
+    function hrefStartWith(href,arr){
+        href = href.replace(/^\s+|\s+$/g, '');
+        for(var i=0,ai;ai=arr[i++];){
+            if(href.indexOf(ai)==0){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+</script>
+</body>
+</html>

+ 105 - 0
assets/public/ueditor/dialogs/map/map.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.1&services=true"></script>
+    <style type="text/css">
+        .content{width:530px; height: 350px;margin: 10px auto;}
+        .content table{width: 100%}
+        .content table td{vertical-align: middle;}
+        #city,#address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
+        #city{width:90px}
+        #address{width:220px}
+    </style>
+</head>
+<body>
+<div class="content">
+    <table>
+        <tr>
+            <td><var id="lang_city"></var>:</td>
+            <td><input id="city" type="text" /></td>
+            <td><var id="lang_address"></var>:</td>
+            <td><input id="address" type="text" value="" /></td>
+            <td><a href="javascript:doSearch()" class="button"><var id="lang_search"></var></a></td>
+        </tr>
+    </table>
+    <div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" id="container"></div>
+
+</div>
+<script type="text/javascript">
+    var map = new BMap.Map("container"),marker,point,imgcss;
+    map.enableScrollWheelZoom();
+    map.enableContinuousZoom();
+    function doSearch(){
+        if (!document.getElementById('city').value) {
+            alert(lang.cityMsg);
+            return;
+        }
+        var search = new BMap.LocalSearch(document.getElementById('city').value, {
+            onSearchComplete: function (results){
+                if (results && results.getNumPois()) {
+                    var points = [];
+                    for (var i=0; i<results.getCurrentNumPois(); i++) {
+                        points.push(results.getPoi(i).point);
+                    }
+                    if (points.length > 1) {
+                        map.setViewport(points);
+                    } else {
+                        map.centerAndZoom(points[0], 13);
+                    }
+                    point = map.getCenter();
+                    marker.setPoint(point);
+                } else {
+                    alert(lang.errorMsg);
+                }
+            }
+        });
+        search.search(document.getElementById('address').value || document.getElementById('city').value);
+    }
+    //获得参数
+    function getPars(str,par){
+        var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+        return reg.exec(str)[1];
+    }
+    function init(){
+        var img = editor.selection.getRange().getClosedNode();
+        if(img && /api[.]map[.]baidu[.]com/ig.test(img.getAttribute("src"))){
+            var url = img.getAttribute("src"),centers;
+            centers = getPars(url,"center").split(",");
+            point = new BMap.Point(Number(centers[0]),Number(centers[1]));
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, Number(getPars(url,"zoom")));
+            imgcss = img.style.cssText;
+        }else{
+            point = new BMap.Point(116.404, 39.915);    // 创建点坐标
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, 10);                     // 初始化地图,设置中心点坐标和地图级别。
+        }
+        marker = new BMap.Marker(point);
+        marker.enableDragging();
+        map.addOverlay(marker);
+    }
+    init();
+    document.getElementById('address').onkeydown = function (evt){
+        evt = evt || event;
+        if (evt.keyCode == 13) {
+            doSearch();
+        }
+    };
+    dialog.onok = function (){
+        var center = map.getCenter();
+        var zoom = map.zoomLevel;
+        var size = map.getSize();
+        var point = marker.getPoint();
+        var url = "http://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat +
+            "&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat;
+        editor.execCommand('inserthtml', '<img width="'+ size.width +'"height="'+ size.height +'" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
+    };
+    document.getElementById("address").focus();
+</script>
+
+
+</body>
+</html>

+ 30 - 0
assets/public/ueditor/dialogs/music/music.css

@@ -0,0 +1,30 @@
+.wrapper{margin: 5px 10px;}
+
+.searchBar{height:30px;padding:7px 0 3px;text-align:center;}
+.searchBtn{font-size:13px;height:24px;}
+
+.resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;}
+
+.listPanel{overflow: hidden;}
+.panelon{display:block;}
+.paneloff{display:none}
+
+.page{width:220px;margin:20px auto;overflow: hidden;}
+.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center}
+.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff;
+   border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;}
+
+.m-box{width:460px;}
+.m-m{float: left;line-height: 20px;height: 20px;}
+.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;}
+.m-l{float:left;width:40px; }
+.m-t{float:left;width:140px;}
+.m-s{float:left;width:110px;}
+.m-z{float:left;width:100px;}
+.m-try-t{float: left;width: 60px;;}
+
+.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;}
+.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;}
+
+.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat}
+.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;}

+ 32 - 0
assets/public/ueditor/dialogs/music/music.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <title>插入音乐</title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="music.css">
+</head>
+<body>
+<div class="wrapper">
+    <div class="searchBar">
+        <input id="J_searchName" type="text"/>
+        <input type="button" class="searchBtn" id="J_searchBtn">
+    </div>
+    <div class="resultBar" id="J_resultBar">
+        <div class="loading" style="display:none"></div>
+        <div class="empty"><var id="lang_input_tips"></var></div>
+    </div>
+    <div id="J_preview"></div>
+</div>
+<script type="text/javascript" src="music.js"></script>
+<script type="text/javascript">
+    var music = new Music;
+    dialog.onok = function () {
+        music.exec();
+    };
+    dialog.oncancel = function () {
+        $G('J_preview').innerHTML = "";
+    };
+</script>
+</body>
+</html>

+ 192 - 0
assets/public/ueditor/dialogs/music/music.js

@@ -0,0 +1,192 @@
+function Music() {
+    this.init();
+}
+(function () {
+    var pages = [],
+        panels = [],
+        selectedItem = null;
+    Music.prototype = {
+        total:70,
+        pageSize:10,
+        dataUrl:"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common",
+        playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf",
+
+        init:function () {
+            var me = this;
+            domUtils.on($G("J_searchName"), "keyup", function (event) {
+                var e = window.event || event;
+                if (e.keyCode == 13) {
+                    me.dosearch();
+                }
+            });
+            domUtils.on($G("J_searchBtn"), "click", function () {
+                me.dosearch();
+            });
+        },
+        callback:function (data) {
+            var me = this;
+            me.data = data.song_list;
+            setTimeout(function () {
+                $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list);
+            }, 300);
+        },
+        dosearch:function () {
+            var me = this;
+            selectedItem = null;
+            var key = $G('J_searchName').value;
+            if (utils.trim(key) == "")return false;
+            key = encodeURIComponent(key);
+            me._sent(key);
+        },
+        doselect:function (i) {
+            var me = this;
+            if (typeof i == 'object') {
+                selectedItem = i;
+            } else if (typeof i == 'number') {
+                selectedItem = me.data[i];
+            }
+        },
+        onpageclick:function (id) {
+            var me = this;
+            for (var i = 0; i < pages.length; i++) {
+                $G(pages[i]).className = 'pageoff';
+                $G(panels[i]).className = 'paneloff';
+            }
+            $G('page' + id).className = 'pageon';
+            $G('panel' + id).className = 'panelon';
+        },
+        listenTest:function (elem) {
+            var me = this,
+                view = $G('J_preview'),
+                is_play_action = (elem.className == 'm-try'),
+                old_trying = me._getTryingElem();
+
+            if (old_trying) {
+                old_trying.className = 'm-try';
+                view.innerHTML = '';
+            }
+            if (is_play_action) {
+                elem.className = 'm-trying';
+                view.innerHTML = me._buildMusicHtml(me._getUrl(true));
+            }
+        },
+        _sent:function (param) {
+            var me = this;
+            $G('J_resultBar').innerHTML = '<div class="loading"></div>';
+
+            utils.loadFile(document, {
+                src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback()&.r=' + Math.random(),
+                tag:"script",
+                type:"text/javascript",
+                defer:"defer"
+            });
+        },
+        _removeHtml:function (str) {
+            var reg = /<\s*\/?\s*[^>]*\s*>/gi;
+            return str.replace(reg, "");
+        },
+        _getUrl:function (isTryListen) {
+            var me = this;
+            var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist='
+                + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra='
+                + encodeURIComponent(me._removeHtml(selectedItem.album_title))
+                + '&autoPlay='+isTryListen+'' + '&loop=true';
+            return  me.playerUrl + "?" + param;
+        },
+        _getTryingElem:function () {
+            var s = $G('J_listPanel').getElementsByTagName('span');
+
+            for (var i = 0; i < s.length; i++) {
+                if (s[i].className == 'm-trying')
+                    return s[i];
+            }
+            return null;
+        },
+        _buildMusicHtml:function (playerUrl) {
+            var html = '<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"';
+            html += ' src="' + playerUrl + '"';
+            html += ' width="1" height="1" style="position:absolute;left:-2000px;"';
+            html += ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"';
+            html += ' menu="false" allowscriptaccess="never" scale="noborder">';
+            return html;
+        },
+        _byteLength:function (str) {
+            return str.replace(/[^\u0000-\u007f]/g, "\u0061\u0061").length;
+        },
+        _getMaxText:function (s) {
+            var me = this;
+            s = me._removeHtml(s);
+            if (me._byteLength(s) > 12)
+                return s.substring(0, 5) + '...';
+            if (!s) s = "&nbsp;";
+            return s;
+        },
+        _rebuildData:function (data) {
+            var me = this,
+                newData = [],
+                d = me.pageSize,
+                itembox;
+            for (var i = 0; i < data.length; i++) {
+                if ((i + d) % d == 0) {
+                    itembox = [];
+                    newData.push(itembox)
+                }
+                itembox.push(data[i]);
+            }
+            return newData;
+        },
+        _renderTemplate:function (data) {
+            var me = this;
+            if (data.length == 0)return '<div class="empty">' + lang.emptyTxt + '</div>';
+            data = me._rebuildData(data);
+            var s = [], p = [], t = [];
+            s.push('<div id="J_listPanel" class="listPanel">');
+            p.push('<div class="page">');
+            for (var i = 0, tmpList; tmpList = data[i++];) {
+                panels.push('panel' + i);
+                pages.push('page' + i);
+                if (i == 1) {
+                    s.push('<div id="panel' + i + '" class="panelon">');
+                    if (data.length != 1) {
+                        t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageon">' + (i ) + '</div>');
+                    }
+                } else {
+                    s.push('<div id="panel' + i + '" class="paneloff">');
+                    t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageoff">' + (i ) + '</div>');
+                }
+                s.push('<div class="m-box">');
+                s.push('<div class="m-h"><span class="m-t">' + lang.chapter + '</span><span class="m-s">' + lang.singer
+                    + '</span><span class="m-z">' + lang.special + '</span><span class="m-try-t">' + lang.listenTest + '</span></div>');
+                for (var j = 0, tmpObj; tmpObj = tmpList[j++];) {
+                    s.push('<label for="radio-' + i + '-' + j + '" class="m-m">');
+                    s.push('<input type="radio" id="radio-' + i + '-' + j + '" name="musicId" class="m-l" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ')"/>');
+                    s.push('<span class="m-t">' + me._getMaxText(tmpObj.title) + '</span>');
+                    s.push('<span class="m-s">' + me._getMaxText(tmpObj.author) + '</span>');
+                    s.push('<span class="m-z">' + me._getMaxText(tmpObj.album_title) + '</span>');
+                    s.push('<span class="m-try" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ');music.listenTest(this)"></span>');
+                    s.push('</label>');
+                }
+                s.push('</div>');
+                s.push('</div>');
+            }
+            t.reverse();
+            p.push(t.join(''));
+            s.push('</div>');
+            p.push('</div>');
+            return s.join('') + p.join('');
+        },
+        exec:function () {
+            var me = this;
+            if (selectedItem == null)   return;
+            $G('J_preview').innerHTML = "";
+            editor.execCommand('music', {
+                url:me._getUrl(false),
+                width:400,
+                height:95
+            });
+        }
+    };
+})();
+
+
+

BIN
assets/public/ueditor/dialogs/scrawl/images/addimg.png


BIN
assets/public/ueditor/dialogs/scrawl/images/brush.png


BIN
assets/public/ueditor/dialogs/scrawl/images/delimg.png


BIN
assets/public/ueditor/dialogs/scrawl/images/delimgH.png


BIN
assets/public/ueditor/dialogs/scrawl/images/empty.png


BIN
assets/public/ueditor/dialogs/scrawl/images/emptyH.png


BIN
assets/public/ueditor/dialogs/scrawl/images/eraser.png


BIN
assets/public/ueditor/dialogs/scrawl/images/redo.png


BIN
assets/public/ueditor/dialogs/scrawl/images/redoH.png


BIN
assets/public/ueditor/dialogs/scrawl/images/scale.png


BIN
assets/public/ueditor/dialogs/scrawl/images/scaleH.png


BIN
assets/public/ueditor/dialogs/scrawl/images/size.png


BIN
assets/public/ueditor/dialogs/scrawl/images/undo.png


BIN
assets/public/ueditor/dialogs/scrawl/images/undoH.png


+ 72 - 0
assets/public/ueditor/dialogs/scrawl/scrawl.css

@@ -0,0 +1,72 @@
+/*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')}
+
+

+ 95 - 0
assets/public/ueditor/dialogs/scrawl/scrawl.html

@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="scrawl.css">
+</head>
+<body>
+<div class="main" id="J_wrap">
+    <div class="hot">
+        <div class="drawBoard border_style1">
+            <canvas id="J_brushBoard" class="brushBorad" width="360" height="300"></canvas>
+            <div id="J_picBoard" class="picBoard" style="width: 360px;height: 300px"></div>
+        </div>
+        <div id="J_operateBar" class="operateBar">
+            <span id="J_previousStep" class="previousStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_previousStep"></var></em>
+            </span>
+            <span id="J_nextStep" class="nextStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_nextsStep"></var></em>
+            </span>
+            <span id="J_clearBoard" class="clearBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_clear"></var></em>
+            </span>
+            <span id="J_sacleBoard" class="scaleBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_ScalePic"></var></em>
+            </span>
+        </div>
+    </div>
+    <div class="drawToolbar border_style1">
+        <div id="J_colorBar" class="colorBar"></div>
+        <div id="J_brushBar" class="sectionBar">
+            <em class="brushIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div id="J_eraserBar" class="sectionBar">
+            <em class="eraserIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div class="sectionBar">
+            <div class="addImgH">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_addPic"></var></em>
+                <form method="post" id="fileForm" enctype="multipart/form-data" class="addImgH_form" target="up">
+                    <input type="file" name="upfile" id="J_imgTxt"
+                           accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>
+                </form>
+                <iframe name="up" style="display: none"></iframe>
+            </div>
+        </div>
+        <div class="sectionBar">
+            <span id="J_removeImg" class="removeImg">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_removePic"></var></em>
+            </span>
+        </div>
+    </div>
+</div>
+<div id="J_maskLayer" class="maskLayerNull"></div>
+
+<script type="text/javascript" src="scrawl.js"></script>
+<script type="text/javascript">
+    var settings = {
+        drawBrushSize:3, //画笔初始大小
+        drawBrushColor:"#4bacc6", //画笔初始颜色
+        colorList:['c00000', 'ff0000', 'ffc000', 'ffff00', '92d050', '00b050', '00b0f0', '0070c0', '002060', '7030a0', 'ffffff',
+            '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646'], //画笔选择颜色
+        saveNum:10  //撤销次数
+    };
+
+    var scrawlObj = new scrawl( settings );
+    scrawlObj.isCancelScrawl = false;
+
+    dialog.onok = function () {
+        exec( scrawlObj );
+        return false;
+    };
+    dialog.oncancel = function () {
+        scrawlObj.isCancelScrawl = true;
+    };
+</script>
+</body>
+</html>

+ 655 - 0
assets/public/ueditor/dialogs/scrawl/scrawl.js

@@ -0,0 +1,655 @@
+/**
+ * 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,
+                url = editor.options.scrawlUrl;
+
+            me.brushWidth = options.drawBrushSize;//同步画笔粗细
+            me.brushColor = options.drawBrushColor;//同步画笔颜色
+
+            $G("fileForm").action = url + (url.indexOf("?") == -1 ? "?" : "&") + "action=tmpImg";//初始form提交地址
+            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("<table id='J_colorList'>");
+            for (var i = 0, color; color = colorList[i++];) {
+                if ((i - 1) % 5 == 0) {
+                    if (i != 1) {
+                        arr.push("</tr>");
+                    }
+                    arr.push("<tr>");
+                }
+                tmp = '#' + color;
+                arr.push("<td><a title='" + tmp + "' href='javascript:void(0)' style='background-color:" + tmp + "'></a></td>");
+            }
+            arr.push("</tr></table>");
+            $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 doc = document,
+                file = $G("J_imgTxt");
+            domUtils.on(file, "change", function () {
+                var frm = file.parentNode;
+                addMaskLayer(lang.backgroundUploading);
+                frm.submit();
+                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)
+                    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("<span class='hand" + i + "'></span>");
+        }
+        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 = editor.options.scrawlPath + 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) {
+            ajax.request(editor.options.scrawlUrl, {
+                timeout:100000,
+                content:base64,
+                onsuccess:function (xhr) {
+                    if (!scrawlObj.isCancelScrawl) {
+                        var responseObj;
+                        responseObj = eval("(" + xhr.responseText + ")");
+                        if (responseObj.state == "SUCCESS") {
+                            var imgObj = {},
+                                url = editor.options.scrawlPath + responseObj.url;
+                            imgObj.src = url;
+                            imgObj._src = url;
+                            editor.execCommand("insertImage", imgObj);
+                            dialog.close();
+                        } else {
+                            alert(responseObj.state);
+                        }
+
+                    }
+                },
+                onerror:function () {
+                    alert(lang.imageError);
+                    dialog.close();
+                }
+            });
+        }
+    } else {
+        addMaskLayer(lang.noScarwl + "&nbsp;&nbsp;&nbsp;<input type='button' value='" + lang.continueBtn + "'  onclick='removeMaskLayer()'/>");
+    }
+}
+

+ 82 - 0
assets/public/ueditor/dialogs/searchreplace/searchreplace.html

@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .warpper{ position:relative;width: 380px; height: 100%; margin: 10px auto;}
+        .tabbody{height: 160px;}
+        .tabbody table{width:100%;border-collapse: separate;border-spacing: 3px;}
+        .tabbody .panel{width:373px;height:100%;padding-left: 5px;position: absolute;background-color: #fff;}
+        .tabbody input.int{ width:190px;height:21px;border:1px solid #d7d7d7;line-height:21px;}
+        .tabbody input.btn{padding: 0 5px; text-align:center;line-height:24px; text-decoration: none;height:24px;background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;border:1px solid #ccc; }
+    </style>
+</head>
+<body>
+<div class="warpper" id="searchtab">
+    <div id="head" class="tabhead">
+        <span  tabsrc="find" class="focus"><var id="lang_tab_search"></var></span>
+        <span  tabsrc="replace" ><var id="lang_tab_replace"></var></span>
+    </div>
+    <div class="tabbody">
+        <div class="panel" id="find">
+            <table>
+                <tr>
+                    <td width="80"><var id="lang_search1"></var>: </td>
+                    <td><input id="findtxt" type="text" class="int" /></td>
+                </tr>
+                <tr>
+
+                    <td colspan="2"><span style="color:red"><var id="lang_searchReg"></var></span></td>
+                </tr>
+                <tr>
+                    <td><var id="lang_case_sensitive1"></var></td>
+                    <td>
+                        <input id="matchCase" type="checkbox" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <input id="nextFindBtn" type="button" class="btn" />
+                        <input id="preFindBtn" type="button" class="btn" />
+                    </td>
+                </tr>
+            </table>
+        </div>
+        <div class="panel" id="replace">
+            <table>
+                <tr>
+                    <td width="80"><var id="lang_search2"></var>: </td>
+                    <td><input id="findtxt1" type="text" class="int"  /></td>
+                </tr>
+                <tr>
+
+                    <td colspan="2"><span style="color:red"><var id="lang_searchReg1"></var></span></td>
+                </tr>
+                <tr>
+                    <td><var id="lang_replace"></var>: </td>
+                    <td><input id="replacetxt" type="text" class="int" /></td>
+                </tr>
+                <tr>
+                    <td><var id="lang_case_sensitive2"></var></td>
+                    <td>
+                        <input id="matchCase1" type="checkbox" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <input id="nextReplaceBtn" type="button" class="btn" />
+                        <input id="preReplaceBtn" type="button" class="btn" />
+                        <input id="repalceBtn" type="button" class="btn" />
+                        <input id="repalceAllBtn" type="button" class="btn" />
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="searchreplace.js"></script>
+</body>
+</html>

+ 157 - 0
assets/public/ueditor/dialogs/searchreplace/searchreplace.js

@@ -0,0 +1,157 @@
+/**
+ * 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);
+        }
+    }
+}
+
+//是否区分大小写
+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)) {
+        alert(lang.getEnd);
+    }
+};
+$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)) {
+        alert(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 () {
+    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) {
+        alert(lang.countMsg.replace("{#count}", num));
+    }
+};
+//执行
+var frCommond = function (obj) {
+    return editor.execCommand("searchreplace", obj);
+};
+switchTab("searchtab");

+ 58 - 0
assets/public/ueditor/dialogs/snapscreen/snapscreen.html

@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <title></title>
+        <script type="text/javascript" src="../internal.js"></script>
+        <style type="text/css">
+            *{color: #838383}
+            html,body {
+                font-size: 12px;
+                width:100%;
+                height:100%;
+                overflow: hidden;
+                margin:0px;
+                padding:0px;
+            }
+            h2 { font-size: 16px; margin: 20px auto;}
+            .content{
+                padding:5px 15px 0 15px;
+                height:100%;
+            }
+            dt,dd { margin-left: 0; padding-left: 0;}
+            dt a { display: block;
+                    height: 30px;
+                    line-height: 30px;
+                    width: 55px;
+                    background: #EFEFEF;
+                    border: 1px solid #CCC;
+                    padding: 0 10px;
+                    text-decoration: none;
+            }
+            dt a:hover{
+                background: #e0e0e0;
+                border-color: #999
+            }
+            dt a:active{
+                background: #ccc;
+                border-color: #999;
+                color: #666;
+            }
+            dd { line-height:20px;margin-top: 10px;}
+            span{ padding-right:4px;}
+            input{width:210px;height:21px;background: #FFF;border:1px solid #d7d7d7;padding: 0px; margin: 0px; }
+
+
+        </style>
+    </head>
+    <body>
+        <div class="content">
+            <h2><var id="lang_showMsg"></var></h2>
+            <dl>
+                <dt><a href="../../third-party/snapscreen/UEditorSnapscreen.exe" target="_blank" id="downlink"><var id="lang_download"></var></a></dt>
+                <dd><var id="lang_step1"></var></dd>
+                <dd><var id="lang_step2"></var></dd>
+            </dl>
+        </div>
+    </body>
+</html>

+ 21 - 0
assets/public/ueditor/dialogs/spechars/spechars.html

@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        html,body{overflow:hidden;}
+        #specharsTab{width: 97%;margin: 10px auto; zoom:1;position: relative}
+        .tabbody {height:447px;}
+        .tabbody span{ margin: 5px 3px;text-align: center;display:inline-block;width: 40px;height:16px;line-height: 16px;cursor: pointer; }
+    </style>
+</head>
+<body>
+    <div id="specharsTab">
+        <div id="tabHeads" class="tabhead"></div><div id="tabBodys" class="tabbody"></div>
+    </div>
+<script type="text/javascript" src="spechars.js"></script>
+</body>
+</html>

+ 56 - 0
assets/public/ueditor/dialogs/spechars/spechars.js

@@ -0,0 +1,56 @@
+/**
+ * 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:"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(",");
+}

BIN
assets/public/ueditor/dialogs/table/dragicon.png


+ 75 - 0
assets/public/ueditor/dialogs/table/edittable.css

@@ -0,0 +1,75 @@
+.wrapper {
+    margin: 10px auto 0;
+    font-size: 12px;
+    overflow: hidden;
+}
+
+.clear {
+    clear: both;
+}
+
+.wrapper .left {
+    float: left;
+    margin-left: 10px;;
+}
+
+.wrapper .right {
+    float: right;
+    margin-right: 10px;
+    border-left: 2px dotted #EDEDED;
+    padding-left: 15px;
+}
+
+.section {
+    margin-bottom: 20px;
+    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;
+}
+
+.section li {
+    float: left;
+}
+
+.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;
+}

+ 57 - 0
assets/public/ueditor/dialogs/table/edittable.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="edittable.css">
+</head>
+<body>
+<div class="wrapper">
+    <div class="left">
+        <div class="section">
+            <h3><var id="lang_tableStyle"></var></h3>
+            <ul>
+                <li>
+                    <label><input type="checkbox" id="J_title" name="style"/><var id="lang_insertCaption"></var></label>
+                </li>
+                <li>
+                    <label><input type="checkbox" id="J_caption" name="style"/><var id="lang_insertTitle"></var></label>
+                </li>
+            </ul>
+            <label><input type="checkbox" id="J_sorttable" name="style"/><var id="lang_orderbycontent"></var></label>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_tableSize"></var></h3>
+            <ul>
+                <li>
+                    <label><input type="radio" id="J_autoSizeContent" name="size"/><var id="lang_autoSizeContent"></var></label>
+                </li>
+                <li>
+                    <label><input type="radio" id="J_autoSizePage" name="size"/><var id="lang_autoSizePage"></var></label>
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_borderStyle"></var></h3>
+            <ul>
+                <li>
+                    <span><var id="lang_color"></var></span>
+                    <input type="text" class="tone" id="J_tone" readonly='readonly' />
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+    </div>
+    <div class="right">
+        <div class="section">
+            <h3><var id="lang_example"></var></h3>
+            <div class="preview" id="J_preview">
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="edittable.js"></script>
+</body>
+</html>

+ 198 - 0
assets/public/ueditor/dialogs/table/edittable.js

@@ -0,0 +1,198 @@
+/**
+ * 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"),
+        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;
+            caption.checked = editor.queryCommandState("insertcaption") == -1;
+
+            me.createTable(title.checked, caption.checked);
+            me.setAutoSize();
+            me.setColor(me.getColor());
+
+            domUtils.on(title, "click", me.titleHanler);
+            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, hasCaption) {
+            var arr = [];
+            arr.push("<table id='J_example'>");
+            if (hasCaption) {
+                arr.push("<caption>" + lang.captionName + "</caption>")
+            }
+            if (hasTitle) {
+                arr.push("<tr>");
+                for (var j = 0; j < 5; j++) {
+                    arr.push("<th>" + lang.titleName + "</th>")
+                }
+                arr.push("</tr>");
+            }
+            for (var i = 0; i < 6; i++) {
+                arr.push("<tr>");
+                for (var k = 0; k < 5; k++) {
+                    arr.push("<td>" + lang.cellsName + "</td>")
+                }
+                arr.push("</tr>");
+            }
+            arr.push("</table>");
+            preview.innerHTML = arr.join("");
+        },
+
+        titleHanler:function () {
+            var example = $G("J_example"),
+                 frg=document.createDocumentFragment(),
+                color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color");
+
+            if (title.checked) {
+                example.insertRow(0);
+                for (var i = 0, node; i < 5; 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);
+        },
+        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(){
+            var example = $G("J_example"),
+                row = example.rows[0];
+            if (sorttable.checked) {
+                for(var i = 0,cell;cell = row.cells[i++];){
+                    var span = document.createElement("span");
+                    span.innerHTML = "^";
+                    cell.appendChild(span);
+                }
+            } else {
+                var spans = domUtils.getElementsByTagName(example,"span");
+                utils.each(spans,function(span){
+                    span.parentNode.removeChild(span);
+                })
+            }
+        },
+        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%');
+        },
+
+        getColor:function () {
+            var start = editor.selection.getStart(), color,
+                cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true);
+            color = 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",
+            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;
+    };
+})();

+ 61 - 0
assets/public/ueditor/dialogs/table/edittd.html

@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .section {
+            text-align: center;
+            margin-top: 10px;
+        }
+        .section input {
+            margin-left: 5px;
+            width: 70px;
+        }
+    </style>
+</head>
+<body>
+<div class="section">
+    <span><var id="lang_tdBkColor"></var></span>
+    <input type="text" id="J_tone"/>
+</div>
+<script type="text/javascript">
+    var tone = $G("J_tone"),
+            colorPiker = new UE.ui.ColorPicker({
+                editor:editor
+            }),
+            colorPop = new UE.ui.Popup({
+                editor:editor,
+                content:colorPiker
+            });
+    domUtils.on(tone, "click", function () {
+        colorPop.showAnchor(tone);
+    });
+    domUtils.on(document, 'mousedown', function () {
+        colorPop.hide();
+    });
+    colorPiker.addListener("pickcolor", function () {
+        tone.value = arguments[1];
+        colorPop.hide();
+    });
+    colorPiker.addListener("picknocolor", function () {
+        tone.value="";
+        colorPop.hide();
+    });
+    dialog.onok=function(){
+        editor.execCommand("edittd",tone.value);
+    };
+
+    var start = editor.selection.getStart(),
+        cell = start && domUtils.findParentByTagName(start, ["td", "th"], true);
+    if(cell){
+        var color = domUtils.getComputedStyle(cell,'background-color');
+        if(/^#/.test(color)){
+            tone.value = color
+        }
+
+    }
+
+</script>
+</body>
+</html>

+ 33 - 0
assets/public/ueditor/dialogs/table/edittip.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>表格删除提示</title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .section {
+            width: 200px;
+            margin: 10px auto 0;
+            font-size: 14px;
+        }
+
+        .item {
+            text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="section">
+    <div class="item">
+        <label><input type="radio" id="J_delRow" name="cmd" checked/><var id="lang_delRow"></var></label>
+    </div>
+    <div class="item">
+        <label><input type="radio" id="J_delCol" name="cmd"/><var id="lang_delCol"></var></label>
+    </div>
+</div>
+<script type="text/javascript">
+    dialog.onok = function () {
+        $G("J_delRow").checked ? editor.execCommand("deleterow") : editor.execCommand("deletecol");
+    };
+</script>
+</body>
+</html>

+ 1240 - 0
assets/public/ueditor/dialogs/tangram.js

@@ -0,0 +1,1240 @@
+// Copyright (c) 2009, Baidu Inc. All rights reserved.
+// 
+// Licensed under the BSD License
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//      http:// tangram.baidu.com/license.html
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+ /**
+ * @namespace T Tangram七巧板
+ * @name T
+ * @version 1.6.0
+*/
+
+/**
+ * 声明baidu包
+ * @author: allstar, erik, meizz, berg
+ */
+var T,
+    baidu = T = baidu || {version: "1.5.0"};
+baidu.guid = "$BAIDU$";
+baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}};
+
+/**
+ * 使用flash资源封装的一些功能
+ * @namespace baidu.flash
+ */
+baidu.flash = baidu.flash || {};
+
+/**
+ * 操作dom的方法
+ * @namespace baidu.dom 
+ */
+baidu.dom = baidu.dom || {};
+
+
+/**
+ * 从文档中获取指定的DOM元素
+ * @name baidu.dom.g
+ * @function
+ * @grammar baidu.dom.g(id)
+ * @param {string|HTMLElement} id 元素的id或DOM元素.
+ * @shortcut g,T.G
+ * @meta standard
+ * @see baidu.dom.q
+ *
+ * @return {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数.
+ */
+baidu.dom.g = function(id) {
+    if (!id) return null;
+    if ('string' == typeof id || id instanceof String) {
+        return document.getElementById(id);
+    } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {
+        return id;
+    }
+    return null;
+};
+baidu.g = baidu.G = baidu.dom.g;
+
+
+/**
+ * 操作数组的方法
+ * @namespace baidu.array
+ */
+
+baidu.array = baidu.array || {};
+
+
+/**
+ * 遍历数组中所有元素
+ * @name baidu.array.each
+ * @function
+ * @grammar baidu.array.each(source, iterator[, thisObject])
+ * @param {Array} source 需要遍历的数组
+ * @param {Function} iterator 对每个数组元素进行调用的函数,该函数有两个参数,第一个为数组元素,第二个为数组索引值,function (item, index)。
+ * @param {Object} [thisObject] 函数调用时的this指针,如果没有此参数,默认是当前遍历的数组
+ * @remark
+ * each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。
+ * @shortcut each
+ * @meta standard
+ *             
+ * @returns {Array} 遍历的数组
+ */
+ 
+baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) {
+    var returnValue, item, i, len = source.length;
+    
+    if ('function' == typeof iterator) {
+        for (i = 0; i < len; i++) {
+            item = source[i];
+            returnValue = iterator.call(thisObject || source, item, i);
+    
+            if (returnValue === false) {
+                break;
+            }
+        }
+    }
+    return source;
+};
+
+/**
+ * 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。
+ * @namespace baidu.lang
+ */
+baidu.lang = baidu.lang || {};
+
+
+/**
+ * 判断目标参数是否为function或Function实例
+ * @name baidu.lang.isFunction
+ * @function
+ * @grammar baidu.lang.isFunction(source)
+ * @param {Any} source 目标参数
+ * @version 1.2
+ * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
+ * @meta standard
+ * @returns {boolean} 类型判断结果
+ */
+baidu.lang.isFunction = function (source) {
+    return '[object Function]' == Object.prototype.toString.call(source);
+};
+
+/**
+ * 判断目标参数是否string类型或String对象
+ * @name baidu.lang.isString
+ * @function
+ * @grammar baidu.lang.isString(source)
+ * @param {Any} source 目标参数
+ * @shortcut isString
+ * @meta standard
+ * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
+ *             
+ * @returns {boolean} 类型判断结果
+ */
+baidu.lang.isString = function (source) {
+    return '[object String]' == Object.prototype.toString.call(source);
+};
+baidu.isString = baidu.lang.isString;
+
+
+/**
+ * 判断浏览器类型和特性的属性
+ * @namespace baidu.browser
+ */
+baidu.browser = baidu.browser || {};
+
+
+/**
+ * 判断是否为opera浏览器
+ * @property opera opera版本号
+ * @grammar baidu.browser.opera
+ * @meta standard
+ * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome
+ * @returns {Number} opera版本号
+ */
+
+/**
+ * opera 从10开始不是用opera后面的字符串进行版本的判断
+ * 在Browser identification最后添加Version + 数字进行版本标识
+ * opera后面的数字保持在9.80不变
+ */
+baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ?  + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined;
+
+
+/**
+ * 在目标元素的指定位置插入HTML代码
+ * @name baidu.dom.insertHTML
+ * @function
+ * @grammar baidu.dom.insertHTML(element, position, html)
+ * @param {HTMLElement|string} element 目标元素或目标元素的id
+ * @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd
+ * @param {string} html 要插入的html
+ * @remark
+ * 
+ * 对于position参数,大小写不敏感<br>
+ * 参数的意思:beforeBegin&lt;span&gt;afterBegin   this is span! beforeEnd&lt;/span&gt; afterEnd <br />
+ * 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。
+ * 
+ * @shortcut insertHTML
+ * @meta standard
+ *             
+ * @returns {HTMLElement} 目标元素
+ */
+baidu.dom.insertHTML = function (element, position, html) {
+    element = baidu.dom.g(element);
+    var range,begin;
+    if (element.insertAdjacentHTML && !baidu.browser.opera) {
+        element.insertAdjacentHTML(position, html);
+    } else {
+        range = element.ownerDocument.createRange();
+        position = position.toUpperCase();
+        if (position == 'AFTERBEGIN' || position == 'BEFOREEND') {
+            range.selectNodeContents(element);
+            range.collapse(position == 'AFTERBEGIN');
+        } else {
+            begin = position == 'BEFOREBEGIN';
+            range[begin ? 'setStartBefore' : 'setEndAfter'](element);
+            range.collapse(begin);
+        }
+        range.insertNode(range.createContextualFragment(html));
+    }
+    return element;
+};
+
+baidu.insertHTML = baidu.dom.insertHTML;
+
+/**
+ * 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号
+ * @namespace baidu.swf
+ */
+baidu.swf = baidu.swf || {};
+
+
+/**
+ * 浏览器支持的flash插件版本
+ * @property version 浏览器支持的flash插件版本
+ * @grammar baidu.swf.version
+ * @return {String} 版本号
+ * @meta standard
+ */
+baidu.swf.version = (function () {
+    var n = navigator;
+    if (n.plugins && n.mimeTypes.length) {
+        var plugin = n.plugins["Shockwave Flash"];
+        if (plugin && plugin.description) {
+            return plugin.description
+                    .replace(/([a-zA-Z]|\s)+/, "")
+                    .replace(/(\s)+r/, ".") + ".0";
+        }
+    } else if (window.ActiveXObject && !window.opera) {
+        for (var i = 12; i >= 2; i--) {
+            try {
+                var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i);
+                if (c) {
+                    var version = c.GetVariable("$version");
+                    return version.replace(/WIN/g,'').replace(/,/g,'.');
+                }
+            } catch(e) {}
+        }
+    }
+})();
+
+/**
+ * 操作字符串的方法
+ * @namespace baidu.string
+ */
+baidu.string = baidu.string || {};
+
+
+/**
+ * 对目标字符串进行html编码
+ * @name baidu.string.encodeHTML
+ * @function
+ * @grammar baidu.string.encodeHTML(source)
+ * @param {string} source 目标字符串
+ * @remark
+ * 编码字符有5个:&<>"'
+ * @shortcut encodeHTML
+ * @meta standard
+ * @see baidu.string.decodeHTML
+ *             
+ * @returns {string} html编码后的字符串
+ */
+baidu.string.encodeHTML = function (source) {
+    return String(source)
+                .replace(/&/g,'&amp;')
+                .replace(/</g,'&lt;')
+                .replace(/>/g,'&gt;')
+                .replace(/"/g, "&quot;")
+                .replace(/'/g, "&#39;");
+};
+
+baidu.encodeHTML = baidu.string.encodeHTML;
+
+/**
+ * 创建flash对象的html字符串
+ * @name baidu.swf.createHTML
+ * @function
+ * @grammar baidu.swf.createHTML(options)
+ * 
+ * @param {Object} 	options 					创建flash的选项参数
+ * @param {string} 	options.id 					要创建的flash的标识
+ * @param {string} 	options.url 				flash文件的url
+ * @param {String} 	options.errorMessage 		未安装flash player或flash player版本号过低时的提示
+ * @param {string} 	options.ver 				最低需要的flash player版本号
+ * @param {string} 	options.width 				flash的宽度
+ * @param {string} 	options.height 				flash的高度
+ * @param {string} 	options.align 				flash的对齐方式,允许值:middle/left/right/top/bottom
+ * @param {string} 	options.base 				设置用于解析swf文件中的所有相对路径语句的基本目录或URL
+ * @param {string} 	options.bgcolor 			swf文件的背景色
+ * @param {string} 	options.salign 				设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br
+ * @param {boolean} options.menu 				是否显示右键菜单,允许值:true/false
+ * @param {boolean} options.loop 				播放到最后一帧时是否重新播放,允许值: true/false
+ * @param {boolean} options.play 				flash是否在浏览器加载时就开始播放。允许值:true/false
+ * @param {string} 	options.quality 			设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best
+ * @param {string} 	options.scale 				设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit
+ * @param {string} 	options.wmode 				设置flash的显示模式。允许值:window/opaque/transparent
+ * @param {string} 	options.allowscriptaccess 	设置flash与页面的通信权限。允许值:always/never/sameDomain
+ * @param {string} 	options.allownetworking 	设置swf文件中允许使用的网络API。允许值:all/internal/none
+ * @param {boolean} options.allowfullscreen 	是否允许flash全屏。允许值:true/false
+ * @param {boolean} options.seamlesstabbing 	允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false
+ * @param {boolean} options.devicefont 			设置静态文本对象是否以设备字体呈现。允许值:true/false
+ * @param {boolean} options.swliveconnect 		第一次加载flash时浏览器是否应启动Java。允许值:true/false
+ * @param {Object} 	options.vars 				要传递给flash的参数,支持JSON或string类型。
+ * 
+ * @see baidu.swf.create
+ * @meta standard
+ * @returns {string} flash对象的html字符串
+ */
+baidu.swf.createHTML = function (options) {
+    options = options || {};
+    var version = baidu.swf.version, 
+        needVersion = options['ver'] || '6.0.0', 
+        vUnit1, vUnit2, i, k, len, item, tmpOpt = {},
+        encodeHTML = baidu.string.encodeHTML;
+    for (k in options) {
+        tmpOpt[k] = options[k];
+    }
+    options = tmpOpt;
+    /*
+    if (version) {
+        version = version.split('.');
+        needVersion = needVersion.split('.');
+        for (i = 0; i < 3; i++) {
+            vUnit1 = parseInt(version[i], 10);
+            vUnit2 = parseInt(needVersion[i], 10);
+            if (vUnit2 < vUnit1) {
+                break;
+            } else if (vUnit2 > vUnit1) {
+                return '';
+            }
+        }
+    } else {
+        return '';
+    }
+    */
+    
+    var vars = options['vars'],
+        objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align'];
+    options['align'] = options['align'] || 'middle';
+    options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000';
+    options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0';
+    options['movie'] = options['url'] || '';
+    delete options['vars'];
+    delete options['url'];
+    if ('string' == typeof vars) {
+        options['flashvars'] = vars;
+    } else {
+        var fvars = [];
+        for (k in vars) {
+            item = vars[k];
+            fvars.push(k + "=" + encodeURIComponent(item));
+        }
+        options['flashvars'] = fvars.join('&');
+    }
+    var str = ['<object '];
+    for (i = 0, len = objProperties.length; i < len; i++) {
+        item = objProperties[i];
+        str.push(' ', item, '="', encodeHTML(options[item]), '"');
+    }
+    str.push('>');
+    var params = {
+        'wmode'             : 1,
+        'scale'             : 1,
+        'quality'           : 1,
+        'play'              : 1,
+        'loop'              : 1,
+        'menu'              : 1,
+        'salign'            : 1,
+        'bgcolor'           : 1,
+        'base'              : 1,
+        'allowscriptaccess' : 1,
+        'allownetworking'   : 1,
+        'allowfullscreen'   : 1,
+        'seamlesstabbing'   : 1,
+        'devicefont'        : 1,
+        'swliveconnect'     : 1,
+        'flashvars'         : 1,
+        'movie'             : 1
+    };
+    
+    for (k in options) {
+        item = options[k];
+        k = k.toLowerCase();
+        if (params[k] && (item || item === false || item === 0)) {
+            str.push('<param name="' + k + '" value="' + encodeHTML(item) + '" />');
+        }
+    }
+    options['src']  = options['movie'];
+    options['name'] = options['id'];
+    delete options['id'];
+    delete options['movie'];
+    delete options['classid'];
+    delete options['codebase'];
+    options['type'] = 'application/x-shockwave-flash';
+    options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer';
+    str.push('<embed');
+    var salign;
+    for (k in options) {
+        item = options[k];
+        if (item || item === false || item === 0) {
+            if ((new RegExp("^salign\x24", "i")).test(k)) {
+                salign = item;
+                continue;
+            }
+            
+            str.push(' ', k, '="', encodeHTML(item), '"');
+        }
+    }
+    
+    if (salign) {
+        str.push(' salign="', encodeHTML(salign), '"');
+    }
+    str.push('></embed></object>');
+    
+    return str.join('');
+};
+
+
+/**
+ * 在页面中创建一个flash对象
+ * @name baidu.swf.create
+ * @function
+ * @grammar baidu.swf.create(options[, container])
+ * 
+ * @param {Object} 	options 					创建flash的选项参数
+ * @param {string} 	options.id 					要创建的flash的标识
+ * @param {string} 	options.url 				flash文件的url
+ * @param {String} 	options.errorMessage 		未安装flash player或flash player版本号过低时的提示
+ * @param {string} 	options.ver 				最低需要的flash player版本号
+ * @param {string} 	options.width 				flash的宽度
+ * @param {string} 	options.height 				flash的高度
+ * @param {string} 	options.align 				flash的对齐方式,允许值:middle/left/right/top/bottom
+ * @param {string} 	options.base 				设置用于解析swf文件中的所有相对路径语句的基本目录或URL
+ * @param {string} 	options.bgcolor 			swf文件的背景色
+ * @param {string} 	options.salign 				设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br
+ * @param {boolean} options.menu 				是否显示右键菜单,允许值:true/false
+ * @param {boolean} options.loop 				播放到最后一帧时是否重新播放,允许值: true/false
+ * @param {boolean} options.play 				flash是否在浏览器加载时就开始播放。允许值:true/false
+ * @param {string} 	options.quality 			设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best
+ * @param {string} 	options.scale 				设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit
+ * @param {string} 	options.wmode 				设置flash的显示模式。允许值:window/opaque/transparent
+ * @param {string} 	options.allowscriptaccess 	设置flash与页面的通信权限。允许值:always/never/sameDomain
+ * @param {string} 	options.allownetworking 	设置swf文件中允许使用的网络API。允许值:all/internal/none
+ * @param {boolean} options.allowfullscreen 	是否允许flash全屏。允许值:true/false
+ * @param {boolean} options.seamlesstabbing 	允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false
+ * @param {boolean} options.devicefont 			设置静态文本对象是否以设备字体呈现。允许值:true/false
+ * @param {boolean} options.swliveconnect 		第一次加载flash时浏览器是否应启动Java。允许值:true/false
+ * @param {Object} 	options.vars 				要传递给flash的参数,支持JSON或string类型。
+ * 
+ * @param {HTMLElement|string} [container] 		flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。
+ * @meta standard
+ * @see baidu.swf.createHTML,baidu.swf.getMovie
+ */
+baidu.swf.create = function (options, target) {
+    options = options || {};
+    var html = baidu.swf.createHTML(options) 
+               || options['errorMessage'] 
+               || '';
+                
+    if (target && 'string' == typeof target) {
+        target = document.getElementById(target);
+    }
+    baidu.dom.insertHTML( target || document.body ,'beforeEnd',html );
+};
+/**
+ * 判断是否为ie浏览器
+ * @name baidu.browser.ie
+ * @field
+ * @grammar baidu.browser.ie
+ * @returns {Number} IE版本号
+ */
+baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined;
+
+/**
+ * 移除数组中的项
+ * @name baidu.array.remove
+ * @function
+ * @grammar baidu.array.remove(source, match)
+ * @param {Array} source 需要移除项的数组
+ * @param {Any} match 要移除的项
+ * @meta standard
+ * @see baidu.array.removeAt
+ *             
+ * @returns {Array} 移除后的数组
+ */
+baidu.array.remove = function (source, match) {
+    var len = source.length;
+        
+    while (len--) {
+        if (len in source && source[len] === match) {
+            source.splice(len, 1);
+        }
+    }
+    return source;
+};
+
+/**
+ * 判断目标参数是否Array对象
+ * @name baidu.lang.isArray
+ * @function
+ * @grammar baidu.lang.isArray(source)
+ * @param {Any} source 目标参数
+ * @meta standard
+ * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
+ *             
+ * @returns {boolean} 类型判断结果
+ */
+baidu.lang.isArray = function (source) {
+    return '[object Array]' == Object.prototype.toString.call(source);
+};
+
+
+
+/**
+ * 将一个变量转换成array
+ * @name baidu.lang.toArray
+ * @function
+ * @grammar baidu.lang.toArray(source)
+ * @param {mix} source 需要转换成array的变量
+ * @version 1.3
+ * @meta standard
+ * @returns {array} 转换后的array
+ */
+baidu.lang.toArray = function (source) {
+    if (source === null || source === undefined)
+        return [];
+    if (baidu.lang.isArray(source))
+        return source;
+    if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) {
+        return [source];
+    }
+    if (source.item) {
+        var l = source.length, array = new Array(l);
+        while (l--)
+            array[l] = source[l];
+        return array;
+    }
+
+    return [].slice.call(source);
+};
+
+/**
+ * 获得flash对象的实例
+ * @name baidu.swf.getMovie
+ * @function
+ * @grammar baidu.swf.getMovie(name)
+ * @param {string} name flash对象的名称
+ * @see baidu.swf.create
+ * @meta standard
+ * @returns {HTMLElement} flash对象的实例
+ */
+baidu.swf.getMovie = function (name) {
+	var movie = document[name], ret;
+    return baidu.browser.ie == 9 ?
+    	movie && movie.length ? 
+    		(ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){
+    			return item.tagName.toLowerCase() != "embed";
+    		})).length == 1 ? ret[0] : ret
+    		: movie
+    	: movie || window[name];
+};
+
+
+baidu.flash._Base = (function(){
+   
+    var prefix = 'bd__flash__';
+
+    /**
+     * 创建一个随机的字符串
+     * @private
+     * @return {String}
+     */
+    function _createString(){
+        return  prefix + Math.floor(Math.random() * 2147483648).toString(36);
+    };
+   
+    /**
+     * 检查flash状态
+     * @private
+     * @param {Object} target flash对象
+     * @return {Boolean}
+     */
+    function _checkReady(target){
+        if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){
+            return true;
+        }else{
+            return false;
+        }
+    };
+
+    /**
+     * 调用之前进行压栈的函数
+     * @private
+     * @param {Array} callQueue 调用队列
+     * @param {Object} target flash对象
+     * @return {Null}
+     */
+    function _callFn(callQueue, target){
+        var result = null;
+        
+        callQueue = callQueue.reverse();
+        baidu.each(callQueue, function(item){
+            result = target.call(item.fnName, item.params);
+            item.callBack(result);
+        });
+    };
+
+    /**
+     * 为传入的匿名函数创建函数名
+     * @private
+     * @param {String|Function} fun 传入的匿名函数或者函数名
+     * @return {String}
+     */
+    function _createFunName(fun){
+        var name = '';
+
+        if(baidu.lang.isFunction(fun)){
+            name = _createString();
+            window[name] = function(){
+                fun.apply(window, arguments);
+            };
+
+            return name;
+        }else if(baidu.lang.isString){
+            return fun;
+        }
+    };
+
+    /**
+     * 绘制flash
+     * @private
+     * @param {Object} options 创建参数
+     * @return {Object} 
+     */
+    function _render(options){
+        if(!options.id){
+            options.id = _createString();
+        }
+        
+        var container = options.container || '';
+        delete(options.container);
+        
+        baidu.swf.create(options, container);
+        
+        return baidu.swf.getMovie(options.id);
+    };
+
+    return function(options, callBack){
+        var me = this,
+            autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true),
+            createOptions = options.createOptions || {},
+            target = null,
+            isReady = false,
+            callQueue = [],
+            timeHandle = null,
+            callBack = callBack || [];
+
+        /**
+         * 将flash文件绘制到页面上
+         * @public
+         * @return {Null}
+         */
+        me.render = function(){
+            target = _render(createOptions);
+            
+            if(callBack.length > 0){
+                baidu.each(callBack, function(funName, index){
+                    callBack[index] = _createFunName(options[funName] || new Function());
+                });    
+            }
+            me.call('setJSFuncName', [callBack]);
+        };
+
+        /**
+         * 返回flash状态
+         * @return {Boolean}
+         */
+        me.isReady = function(){
+            return isReady;
+        };
+
+        /**
+         * 调用flash接口的统一入口
+         * @param {String} fnName 调用的函数名
+         * @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组
+         * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数
+         * @return {Null}
+        */
+        me.call = function(fnName, params, callBack){
+            if(!fnName) return null;
+            callBack = callBack || new Function();
+
+            var result = null;
+    
+            if(isReady){
+                result = target.call(fnName, params);
+                callBack(result);
+            }else{
+                callQueue.push({
+                    fnName: fnName,
+                    params: params,
+                    callBack: callBack
+                });
+    
+                (!timeHandle) && (timeHandle = setInterval(_check, 200));
+            }
+        };
+    
+        /**
+         * 为传入的匿名函数创建函数名
+         * @public
+         * @param {String|Function} fun 传入的匿名函数或者函数名
+         * @return {String}
+         */
+        me.createFunName = function(fun){
+            return _createFunName(fun);    
+        };
+
+        /**
+         * 检查flash是否ready, 并进行调用
+         * @private
+         * @return {Null}
+         */
+        function _check(){
+            if(_checkReady(target)){
+                clearInterval(timeHandle);
+                timeHandle = null;
+                _call();
+
+                isReady = true;
+            }               
+        };
+
+        /**
+         * 调用之前进行压栈的函数
+         * @private
+         * @return {Null}
+         */
+        function _call(){
+            _callFn(callQueue, target);
+            callQueue = [];
+        }
+
+        autoRender && me.render(); 
+    };
+})();
+
+
+
+/**
+ * 创建flash based imageUploader
+ * @class
+ * @grammar baidu.flash.imageUploader(options)
+ * @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档
+ * @config {Object} vars 创建imageUploader时所需要的参数
+ * @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除
+ * @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除
+ * @config {Number} vars.picWidth 单张预览图片的宽度
+ * @config {Number} vars.picHeight 单张预览图片的高度
+ * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata'
+ * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc'
+ * @config {Number} vars.maxSize 文件的最大体积,单位'MB'
+ * @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩
+ * @config {Number} vars.maxNum:32 最大上传多少个文件
+ * @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩
+ * @config {String} vars.url 上传的url地址
+ * @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0
+ * @see baidu.swf.createHTML
+ * @param {String} backgroundUrl 背景图片路径
+ * @param {String} listBacgroundkUrl 布局控件背景
+ * @param {String} buttonUrl 按钮图片不背景
+ * @param {String|Function} selectFileCallback 选择文件的回调
+ * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调
+ * @param {String|Function} deleteFileCallback 删除文件的回调
+ * @param {String|Function} startUploadCallback 开始上传某个文件时的回调
+ * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调
+ * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调
+ * @param {String|Function} allCompleteCallback 全部上传完成时的回调
+ * @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用
+ */ 
+baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){
+   
+    var me = this,
+        options = options || {},
+        _flash = new baidu.flash._Base(options, [
+            'selectFileCallback', 
+            'exceedFileCallback', 
+            'deleteFileCallback', 
+            'startUploadCallback',
+            'uploadCompleteCallback',
+            'uploadErrorCallback',
+            'allCompleteCallback',
+            'changeFlashHeight'
+        ]);
+    /**
+     * 开始或回复上传图片
+     * @public
+     * @return {Null}
+     */
+    me.upload = function(){
+        _flash.call('upload');
+    };
+
+    /**
+     * 暂停上传图片
+     * @public
+     * @return {Null}
+     */
+    me.pause = function(){
+        _flash.call('pause');
+    };
+    me.addCustomizedParams = function(index,obj){
+        _flash.call('addCustomizedParams',[index,obj]);
+    }
+};
+
+/**
+ * 操作原生对象的方法
+ * @namespace baidu.object
+ */
+baidu.object = baidu.object || {};
+
+
+/**
+ * 将源对象的所有属性拷贝到目标对象中
+ * @author erik
+ * @name baidu.object.extend
+ * @function
+ * @grammar baidu.object.extend(target, source)
+ * @param {Object} target 目标对象
+ * @param {Object} source 源对象
+ * @see baidu.array.merge
+ * @remark
+ * 
+1.目标对象中,与源对象key相同的成员将会被覆盖。<br>
+2.源对象的prototype成员不会拷贝。
+		
+ * @shortcut extend
+ * @meta standard
+ *             
+ * @returns {Object} 目标对象
+ */
+baidu.extend =
+baidu.object.extend = function (target, source) {
+    for (var p in source) {
+        if (source.hasOwnProperty(p)) {
+            target[p] = source[p];
+        }
+    }
+    
+    return target;
+};
+
+
+
+
+
+/**
+ * 创建flash based fileUploader
+ * @class
+ * @grammar baidu.flash.fileUploader(options)
+ * @param {Object} options
+ * @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档
+ * @config {String} createOptions.width
+ * @config {String} createOptions.height
+ * @config {Number} maxNum 最大可选文件数
+ * @config {Function|String} selectFile
+ * @config {Function|String} exceedMaxSize
+ * @config {Function|String} deleteFile
+ * @config {Function|String} uploadStart
+ * @config {Function|String} uploadComplete
+ * @config {Function|String} uploadError
+ * @config {Function|String} uploadProgress
+ */
+baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){
+    var me = this,
+        options = options || {};
+    
+    options.createOptions = baidu.extend({
+        wmod: 'transparent'
+    },options.createOptions || {});
+    
+    var _flash = new baidu.flash._Base(options, [
+        'selectFile',
+        'exceedMaxSize',
+        'deleteFile',
+        'uploadStart',
+        'uploadComplete',
+        'uploadError', 
+        'uploadProgress'
+    ]);
+
+    _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]);
+
+    /**
+     * 设置当鼠标移动到flash上时,是否变成手型
+     * @public
+     * @param {Boolean} isCursor
+     * @return {Null}
+     */
+    me.setHandCursor = function(isCursor){
+        _flash.call('setHandCursor', [isCursor || false]);
+    };
+
+    /**
+     * 设置鼠标相应函数名
+     * @param {String|Function} fun
+     */
+    me.setMSFunName = function(fun){
+        _flash.call('setMSFunName',[_flash.createFunName(fun)]);
+    }; 
+
+    /**
+     * 执行上传操作
+     * @param {String} url 上传的url
+     * @param {String} fieldName 上传的表单字段名
+     * @param {Object} postData 键值对,上传的POST数据
+     * @param {Number|Array|null|-1} [index]上传的文件序列
+     *                            Int值上传该文件
+     *                            Array一次串行上传该序列文件
+     *                            -1/null上传所有文件
+     * @return {Null}
+     */
+    me.upload = function(url, fieldName, postData, index){
+
+        if(typeof url !== 'string' || typeof fieldName !== 'string') return null;
+        if(typeof index === 'undefined') index = -1;
+
+        _flash.call('upload', [url, fieldName, postData, index]);
+    };
+
+    /**
+     * 取消上传操作
+     * @public
+     * @param {Number|-1} index
+     */
+    me.cancel = function(index){
+        if(typeof index === 'undefined') index = -1;
+        _flash.call('cancel', [index]);
+    };
+
+    /**
+     * 删除文件
+     * @public
+     * @param {Number|Array} [index] 要删除的index,不传则全部删除
+     * @param {Function} callBack
+     * @param 
+     * */
+    me.deleteFile = function(index, callBack){
+
+        var callBackAll = function(list){
+                callBack && callBack(list);
+            };
+
+        if(typeof index === 'undefined'){
+            _flash.call('deleteFilesAll', [], callBackAll);
+            return;
+        };
+        
+        if(typeof index === 'Number') index = [index];
+        index.sort(function(a,b){
+            return b-a;
+        });
+        baidu.each(index, function(item){
+            _flash.call('deleteFileBy', item, callBackAll);
+        });
+    };
+
+    /**
+     * 添加文件类型,支持macType
+     * @public
+     * @param {Object|Array[Object]} type {description:String, extention:String}
+     * @return {Null};
+     */
+    me.addFileType = function(type){
+        var type = type || [[]];
+        
+        if(type instanceof Array) type = [type];
+        else type = [[type]];
+        _flash.call('addFileTypes', type);
+    };
+    
+    /**
+     * 设置文件类型,支持macType
+     * @public
+     * @param {Object|Array[Object]} type {description:String, extention:String}
+     * @return {Null};
+     */
+    me.setFileType = function(type){
+        var type = type || [[]];
+        
+        if(type instanceof Array) type = [type];
+        else type = [[type]];
+        _flash.call('setFileTypes', type);
+    };
+
+    /**
+     * 设置可选文件的数量限制
+     * @public
+     * @param {Number} num
+     * @return {Null}
+     */
+    me.setMaxNum = function(num){
+        _flash.call('setMaxNum', [num]);
+    };
+
+    /**
+     * 设置可选文件大小限制,以兆M为单位
+     * @public
+     * @param {Number} num,0为无限制
+     * @return {Null}
+     */
+    me.setMaxSize = function(num){
+        _flash.call('setMaxSize', [num]);
+    };
+
+    /**
+     * @public
+     */
+    me.getFileAll = function(callBack){
+        _flash.call('getFileAll', [], callBack);
+    };
+
+    /**
+     * @public
+     * @param {Number} index
+     * @param {Function} [callBack]
+     */
+    me.getFileByIndex = function(index, callBack){
+        _flash.call('getFileByIndex', [], callBack);
+    };
+
+    /**
+     * @public
+     * @param {Number} index
+     * @param {function} [callBack]
+     */
+    me.getStatusByIndex = function(index, callBack){
+        _flash.call('getStatusByIndex', [], callBack);
+    };
+};
+
+/**
+ * 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调
+ * @namespace baidu.sio
+ */
+baidu.sio = baidu.sio || {};
+
+/**
+ * 
+ * @param {HTMLElement} src script节点
+ * @param {String} url script节点的地址
+ * @param {String} [charset] 编码
+ */
+baidu.sio._createScriptTag = function(scr, url, charset){
+    scr.setAttribute('type', 'text/javascript');
+    charset && scr.setAttribute('charset', charset);
+    scr.setAttribute('src', url);
+    document.getElementsByTagName('head')[0].appendChild(scr);
+};
+
+/**
+ * 删除script的属性,再删除script标签,以解决修复内存泄漏的问题
+ * 
+ * @param {HTMLElement} src script节点
+ */
+baidu.sio._removeScriptTag = function(scr){
+    if (scr.clearAttributes) {
+        scr.clearAttributes();
+    } else {
+        for (var attr in scr) {
+            if (scr.hasOwnProperty(attr)) {
+                delete scr[attr];
+            }
+        }
+    }
+    if(scr && scr.parentNode){
+        scr.parentNode.removeChild(scr);
+    }
+    scr = null;
+};
+
+
+/**
+ * 通过script标签加载数据,加载完成由浏览器端触发回调
+ * @name baidu.sio.callByBrowser
+ * @function
+ * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options)
+ * @param {string} url 加载数据的url
+ * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名
+ * @param {Object} opt_options 其他可选项
+ * @config {String} [charset] script的字符集
+ * @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数
+ * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数
+ * @remark
+ * 1、与callByServer不同,callback参数只支持Function类型,不支持string。
+ * 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。
+ * @meta standard
+ * @see baidu.sio.callByServer
+ */
+baidu.sio.callByBrowser = function (url, opt_callback, opt_options) {
+    var scr = document.createElement("SCRIPT"),
+        scriptLoaded = 0,
+        options = opt_options || {},
+        charset = options['charset'],
+        callback = opt_callback || function(){},
+        timeOut = options['timeOut'] || 0,
+        timer;
+    scr.onload = scr.onreadystatechange = function () {
+        if (scriptLoaded) {
+            return;
+        }
+        
+        var readyState = scr.readyState;
+        if ('undefined' == typeof readyState
+            || readyState == "loaded"
+            || readyState == "complete") {
+            scriptLoaded = 1;
+            try {
+                callback();
+                clearTimeout(timer);
+            } finally {
+                scr.onload = scr.onreadystatechange = null;
+                baidu.sio._removeScriptTag(scr);
+            }
+        }
+    };
+
+    if( timeOut ){
+        timer = setTimeout(function(){
+            scr.onload = scr.onreadystatechange = null;
+            baidu.sio._removeScriptTag(scr);
+            options.onfailure && options.onfailure();
+        }, timeOut);
+    }
+    
+    baidu.sio._createScriptTag(scr, url, charset);
+};
+
+/**
+ * 通过script标签加载数据,加载完成由服务器端触发回调
+ * @name baidu.sio.callByServer
+ * @function
+ * @grammar baidu.sio.callByServer(url, callback[, opt_options])
+ * @param {string} url 加载数据的url.
+ * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名.
+ * @param {Object} opt_options 加载数据时的选项.
+ * @config {string} [charset] script的字符集
+ * @config {string} [queryField] 服务器端callback请求字段名,默认为callback
+ * @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数
+ * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数
+ * @remark
+ * 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。
+ * @meta standard
+ * @see baidu.sio.callByBrowser
+ */
+baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) {
+    var scr = document.createElement('SCRIPT'),
+        prefix = 'bd__cbs__',
+        callbackName,
+        callbackImpl,
+        options = opt_options || {},
+        charset = options['charset'],
+        queryField = options['queryField'] || 'callback',
+        timeOut = options['timeOut'] || 0,
+        timer,
+        reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'),
+        matches;
+
+    if (baidu.lang.isFunction(callback)) {
+        callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36);
+        window[callbackName] = getCallBack(0);
+    } else if(baidu.lang.isString(callback)){
+        callbackName = callback;
+    } else {
+        if (matches = reg.exec(url)) {
+            callbackName = matches[2];
+        }
+    }
+
+    if( timeOut ){
+        timer = setTimeout(getCallBack(1), timeOut);
+    }
+    url = url.replace(reg, '\x241' + queryField + '=' + callbackName);
+    
+    if (url.search(reg) < 0) {
+        url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName;
+    }
+    baidu.sio._createScriptTag(scr, url, charset);
+
+    /*
+     * 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行
+     */
+    function getCallBack(onTimeOut){
+        /*global callbackName, callback, scr, options;*/
+        return function(){
+            try {
+                if( onTimeOut ){
+                    options.onfailure && options.onfailure();
+                }else{
+                    callback.apply(window, arguments);
+                    clearTimeout(timer);
+                }
+                window[callbackName] = null;
+                delete window[callbackName];
+            } catch (exception) {
+            } finally {
+                baidu.sio._removeScriptTag(scr);
+            }
+        }
+    }
+};
+
+/**
+ * 通过请求一个图片的方式令服务器存储一条日志
+ * @function
+ * @grammar baidu.sio.log(url)
+ * @param {string} url 要发送的地址.
+ * @author: int08h,leeight
+ */
+baidu.sio.log = function(url) {
+  var img = new Image(),
+      key = 'tangram_sio_log_' + Math.floor(Math.random() *
+            2147483648).toString(36);
+  window[key] = img;
+
+  img.onload = img.onerror = img.onabort = function() {
+    img.onload = img.onerror = img.onabort = null;
+
+    window[key] = null;
+    img = null;
+  };
+  img.src = url;
+};

Diff do ficheiro suprimidas por serem muito extensas
+ 26 - 0
assets/public/ueditor/dialogs/template/config.js


BIN
assets/public/ueditor/dialogs/template/images/bg.gif


BIN
assets/public/ueditor/dialogs/template/images/pre0.png


BIN
assets/public/ueditor/dialogs/template/images/pre1.png


BIN
assets/public/ueditor/dialogs/template/images/pre2.png


BIN
assets/public/ueditor/dialogs/template/images/pre3.png


BIN
assets/public/ueditor/dialogs/template/images/pre4.png


+ 18 - 0
assets/public/ueditor/dialogs/template/template.css

@@ -0,0 +1,18 @@
+.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; }

+ 26 - 0
assets/public/ueditor/dialogs/template/template.html

@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="template.css">
+</head>
+<body>
+    <div class="wrap">
+        <div class="left">
+            <div class="top">
+                <label><var id="lang_template_clear"></var>:<input id="issave" type="checkbox"></label>
+            </div>
+            <div class="bottom border_style1" id="preview"></div>
+        </div>
+        <fieldset  class="right border_style1">
+            <legend><var id="lang_template_select"></var></legend>
+            <div class="pre" id="preitem"></div>
+        </fieldset>
+        <div class="clear"></div>
+    </div>
+    <script type="text/javascript" src="config.js"></script>
+    <script type="text/javascript" src="template.js"></script>
+</body>
+</html>

+ 53 - 0
assets/public/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 += '<div class="preitem" onclick="pre(' + i + ')"><img src="' + "images/" + tmp.pre + '" ' + (tmp.title ? "alt=" + tmp.title + " title=" + tmp.title + "" : "") + '></div>';
+        }
+        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)
+
+})();

BIN
assets/public/ueditor/dialogs/video/images/center_focus.jpg


BIN
assets/public/ueditor/dialogs/video/images/left_focus.jpg


BIN
assets/public/ueditor/dialogs/video/images/none_focus.jpg


BIN
assets/public/ueditor/dialogs/video/images/right_focus.jpg


+ 59 - 0
assets/public/ueditor/dialogs/video/video.css

@@ -0,0 +1,59 @@
+@charset "utf-8";
+.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative}
+.tabbody{height:335px;}
+.panel { position: absolute;width:100%; height:100%;background: #fff;}
+.panel table td{vertical-align: middle;}
+#videoUrl {
+    width: 490px;
+    height: 21px;
+    line-height: 21px;
+    margin: 8px 5px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+#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{width: 420px; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left}
+#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;color: #06c;}
+#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}

+ 67 - 0
assets/public/ueditor/dialogs/video/video.html

@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="video.css" />
+</head>
+<body>
+<div class="wrapper">
+    <div id="videoTab">
+        <div id="tabHeads" class="tabhead">
+            <span tabSrc="video" class="focus"><var id="lang_tab_insertV"></var></span>
+            
+        </div>
+        <div id="tabBodys" class="tabbody">
+            <div id="video" class="panel">
+               <table><tr><td><label for="videoUrl" class="url"><var id="lang_video_url"></var></label></td><td><input id="videoUrl" type="text"></td></tr></table>
+               <div id="preview"></div>
+               <div id="videoInfo">
+                   <fieldset>
+                       <legend><var id="lang_video_size"></var></legend>
+                       <table>
+                           <tr><td><label for="videoWidth"><var id="lang_videoW"></var></label></td><td><input class="txt" id="videoWidth" type="text"/></td></tr>
+                           <tr><td><label for="videoHeight"><var id="lang_videoH"></var></label></td><td><input class="txt" id="videoHeight" type="text"/></td></tr>
+                       </table>
+                   </fieldset>
+                   <fieldset>
+                      <legend><var id="lang_alignment"></var></legend>
+                      <div id="videoFloat"></div>
+                  </fieldset>
+               </div>
+            </div>
+            <!--<div id="videoSearch" class="panel" style="display: none">-->
+                <!--<table style="margin-top: 5px;">-->
+                    <!--<tr>-->
+                        <!--<td><input id="videoSearchTxt"  type="text" /></td>-->
+                        <!--<td>-->
+                            <!--<select id="videoType">-->
+                                <!--<option value="0"></option>-->
+                                <!--<option value="29"></option>-->
+                                <!--<option value="1"></option>-->
+                                <!--<option value="5"></option>-->
+                                <!--<option value="15"></option>-->
+                                <!--<option value="21"></option>-->
+                                <!--<option value="31"></option>-->
+                            <!--</select>-->
+                        <!--</td>-->
+                        <!--<td><input id="videoSearchBtn" type="button"/></td>-->
+                        <!--<td><input id="videoSearchReset" type="button" /></td>-->
+                    <!--</tr>-->
+                <!--</table>-->
+                <!--<div id="searchList"></div>-->
+            <!--</div>-->
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="video.js"></script>
+<script type="text/javascript">
+    window.onload = function(){
+        video.init();
+        $focus($G("videoUrl"));
+    };
+</script>
+</body>
+</html>

+ 372 - 0
assets/public/ueditor/dialogs/video/video.js

@@ -0,0 +1,372 @@
+/**
+ * Created by JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-2-20
+ * Time: 上午11:19
+ * To change this template use File | Settings | File Templates.
+ */
+var video = {};
+
+(function(){
+    video.init = function(){
+       // switchTab("videoTab");
+        createAlignButton( ["videoFloat"] );
+        addUrlChangeListener($G("videoUrl"));
+        addOkListener();
+
+
+        //编辑视频时初始化相关信息
+        (function(){
+            var img = editor.selection.getRange().getClosedNode(),url;
+            if(img && img.className == "edui-faked-video"){
+                $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);
+            }
+            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;
+            }
+        };
+        dialog.oncancel = function(){
+            $G("preview").innerHTML = "";
+        };
+    }
+
+    function selectTxt(node){
+        if(node.select){
+            node.select();
+        }else{
+            var r = node.createTextRange && node.createTextRange();
+            r.select();
+        }
+    }
+
+    /**
+     * 依据传入的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
+        });
+    }
+
+    /**
+     * 将元素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(s){
+        return s.replace(/http:\/\/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i,"http://www.tudou.com/v/$1")
+            .replace(/http:\/\/www\.youtube\.com\/watch\?v=([\w\-]+)/i,"http://www.youtube.com/v/$1")
+            .replace(/http:\/\/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i,"http://player.youku.com/player.php/sid/$1")
+            .replace(/http:\/\/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "http://player.56.com/v_$1.swf")
+            .replace(/http:\/\/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "http://player.56.com/v_$1.swf")
+            .replace(/http:\/\/v\.ku6\.com\/.+\/([^.]+)\.html/i, "http://player.ku6.com/refer/$1/v.swf");
+    }
+
+    /**
+      * 检测传入的所有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 );
+    }
+
+    /**
+     * tab切换
+     * @param tabParentId
+     * @param keepFocus   当此值为真时,切换按钮上会保留focus的样式
+     */
+    function switchTab( tabParentId,keepFocus ) {
+        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];
+            domUtils.on( head, "click", function () {
+                //head样式更改
+                for ( var k = 0, len = tabHeads.length; k < len; k++ ) {
+                    if(!keepFocus)tabHeads[k].className = "";
+                }
+                this.className = "focus";
+                //body显隐
+                var tabSrc = this.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.display = "";
+                        if(id=="videoSearch"){
+                            selectTxt($G("videoSearchTxt"));
+                        }
+                        if(id=="video"){
+                            selectTxt($G("videoUrl"));
+                        }
+
+                    } else {
+                        body.style.display = "none";
+                    }
+                }
+            } );
+        }
+    }
+    /**
+      * 创建图片浮动选择按钮
+      * @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 matches = url.match(/youtu.be\/(\w+)$/) || url.match(/youtube\.com\/watch\?v=(\w+)/) || url.match(/youtube.com\/v\/(\w+)/),
+            youku = url.match(/youku\.com\/v_show\/id_(\w+)/),
+            youkuPlay = /player\.youku\.com/ig.test(url);
+        if(!youkuPlay){
+            if (matches){
+                url = "https://www.youtube.com/v/" + matches[1] + "?version=3&feature=player_embedded";
+            }else if(youku){
+                url = "http://player.youku.com/player.php/sid/"+youku[1]+"/v.swf"
+            }else if(!endWith(url,[".swf",".flv",".wmv"])){
+                $G("preview").innerHTML = lang.urlError;
+                return;
+            }
+        }else{
+            url = url.replace(/\?f=.*/,"");
+        }
+        $G("preview").innerHTML = '<embed type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+        ' src="' + url + '"' +
+        ' width="' + 420  + '"' +
+        ' height="' + 280  + '"' +
+        ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" ></embed>';
+    }
+
+    /**
+     * 末尾字符检测
+     * @param str
+     * @param endStrArr
+     */
+    function endWith(str,endStrArr){
+        for(var i=0,len = endStrArr.length;i<len;i++){
+            var tmp = endStrArr[i];
+            if(str.length - tmp.length<0) return false;
+
+            if(str.substring(str.length-tmp.length)==tmp){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * ajax获取视频信息
+     */
+    function getMovie(){
+        var keywordInput =  $G("videoSearchTxt");
+        if(!keywordInput.getAttribute("hasClick") ||!keywordInput.value){
+            selectTxt(keywordInput);
+            return;
+        }
+        $G( "searchList" ).innerHTML = lang.loading;
+        var keyword = keywordInput.value,
+                type = $G("videoType").value,
+            str="";
+        ajax.request(editor.options.getMovieUrl,{
+            searchKey:keyword,
+            videoType:type,
+            onsuccess:function(xhr){
+                try{
+                    var info = eval("("+xhr.responseText+")");
+                }catch(e){
+                    return;
+                }
+
+                var videos = info.multiPageResult.results;
+                var html=["<table width='530'>"];
+                for(var i=0,ci;ci = videos[i++];){
+                    html.push(
+                        "<tr>" +
+                            "<td><img title='"+lang.clickToSelect+"' ue_video_url='"+ci.outerPlayerUrl+"' alt='"+ci.tags+"' width='106' height='80' src='"+ci.picUrl+"' /> </td>" +
+                            "<td>" +
+                                "<p><a target='_blank' title='"+lang.goToSource+"' href='"+ci.itemUrl+"'>"+ci.title.substr(0,30)+"</a></p>" +
+                                "<p style='height: 62px;line-height: 20px' title='"+ci.description+"'> "+ ci.description.substr(0,95) +" </p>" +
+                            "</td>" +
+                       "</tr>"
+                    );
+                }
+                html.push("</table>");
+                $G("searchList").innerHTML = str = html.length ==2 ?lang.noVideo : html.join("");
+                var imgs = domUtils.getElementsByTagName($G("searchList"),"img");
+                if(!imgs)return;
+                for(var i=0,img;img = imgs[i++];){
+                    domUtils.on(img,"click",function(){
+                        changeSelected(this);
+                    })
+                }
+            }
+        });
+    }
+
+    /**
+     * 改变对象o的选中状态
+     * @param o
+     */
+    function changeSelected(o){
+        if ( o.getAttribute( "selected" ) ) {
+            o.removeAttribute( "selected" );
+            o.style.cssText = "filter:alpha(Opacity=100);-moz-opacity:1;opacity: 1;border: 2px solid #fff";
+        } else {
+            o.setAttribute( "selected", "true" );
+            o.style.cssText = "filter:alpha(Opacity=50);-moz-opacity:0.5;opacity: 0.5;border:2px solid blue;";
+        }
+    }
+
+
+
+})();

+ 53 - 0
assets/public/ueditor/dialogs/webapp/webapp.html

@@ -0,0 +1,53 @@
+<!DOCTYPE>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .wrapper{width: 540px; margin: 10px auto;}
+        #appShow {border: 1px solid #ddd;}
+        .errorMsg{font-size: 13px;margin: 10px;color: #dd0000}
+    </style>
+</head>
+<body>
+    <div class="wrapper">
+        <div id="appShow"></div>
+    </div>
+    <script type="text/javascript">
+        //此处配置您在百度上申请到的appkey。
+        var apikey = editor.options.webAppKey;
+        if ( apikey && apikey.length == 24 ) {
+            var searchConfig = {
+                container:'appShow', //容器ID
+                tips:"", //该值用于自动清空
+                search:1, //是否显示搜索框
+                ps:12, //每页显示的条数
+                suggest:1, //是否开启搜索自动完成
+                limit:0, //搜索结果显示条数,0表示无限制
+                searchNow:0, //是否在初始化完成时立即搜索
+                apikey:apikey, //每人得
+                pager:1,
+                cid:7134562,
+                outputHTML:1
+            },baiduApp;
+
+            function clickCallback() {
+                baiduApp.addEventListener( 'getAppHTML', function ( e, data ) {
+                    var url = 'http://app.baidu.com/app/enter?appid='+data.data['app_id'] +'&tn=app_canvas&app_spce_id=1&apikey='+apikey+'&api_key=' + apikey;
+                    editor.execCommand( "webapp", {url:url,width:data.uniWidth,height:data.uniHeight+60,logo:data.data['app_logo'],title:data.data['app_name']});
+                    dialog.close();
+                } );
+            }
+
+            var script = document.createElement( "script" );
+            script.type = "text/javascript";
+            script.src = "http://app.baidu.com/appweb/api/search?auto=yes&container=container&apikey=" + apikey + "&instanceName=baiduApp&callback=clickCallback&config=searchConfig";
+            document.body.appendChild( script );
+        } else {
+            $G( "appShow" ).innerHTML = "<p class='errorMsg'>"+lang.tip1+"<a title='"+lang.anthorApi+"' href='http://app.baidu.com/static/cms/getapikey.html' target='_blank'>"+lang.applyFor+"</a></p><p class='errorMsg'>"+lang.tip2+"</p>" ;
+        }
+
+    </script>
+</body>
+</html>

BIN
assets/public/ueditor/dialogs/wordimage/fClipboard_ueditor.swf


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff