').html(lang.errorNotSupport)).hide();
+ return;
+ } else if (!editor.getOpt('fileActionName')) {
+ $('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
+ return;
+ }
+
+ uploader = _this.uploader = WebUploader.create({
+ pick: {
+ id: '#filePickerReady',
+ label: lang.uploadSelectFile
+ },
+ swf: '../../third-party/webuploader/Uploader.swf',
+ server: actionUrl,
+ fileVal: editor.getOpt('fileFieldName'),
+ duplicate: true,
+ fileSingleSizeLimit: fileMaxSize,
+ headers: editor.getOpt('serverHeaders') || {},
+ compress: false
+ });
+ uploader.addButton({
+ id: '#filePickerBlock'
+ });
+ uploader.addButton({
+ id: '#filePickerBtn',
+ label: lang.uploadAddFile
+ });
+
+ setState('pedding');
+
+ // 当有文件添加进来时执行,负责view的创建
+ function addFile(file) {
+ var $li = $('
' +
+ '' + file.name + '
' +
+ '' +
+ '
' +
+ ''),
+
+ $btns = $('
' +
+ '' + lang.uploadDelete + '' +
+ '' + lang.uploadTurnRight + '' +
+ '' + lang.uploadTurnLeft + '
').appendTo($li),
+ $prgress = $li.find('p.progress span'),
+ $wrap = $li.find('p.imgWrap'),
+ $info = $('
').hide().appendTo($li),
+
+ showError = function (code) {
+ switch (code) {
+ case 'exceed_size':
+ text = lang.errorExceedSize;
+ break;
+ case 'interrupt':
+ text = lang.errorInterrupt;
+ break;
+ case 'http':
+ text = lang.errorHttp;
+ break;
+ case 'not_allow_type':
+ text = lang.errorFileType;
+ break;
+ default:
+ text = lang.errorUploadRetry;
+ break;
+ }
+ $info.text(text).show();
+ };
+
+ if (file.getStatus() === 'invalid') {
+ showError(file.statusText);
+ } else {
+ $wrap.text(lang.uploadPreview);
+ if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) {
+ $wrap.empty().addClass('notimage').append('
' +
+ '
' + file.name + '');
+ } else {
+ if (browser.ie && browser.version <= 7) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ uploader.makeThumb(file, function (error, src) {
+ if (error || !src) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ var $img = $('

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

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