/** * User: Jinqn * Date: 14-04-08 * Time: 下午16:34 * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 */ (function () { var remoteImage, uploadImage, onlineImage; var editorOpt = {}; window.onload = function () { editorOpt = editor.getOpt('imageConfig'); initTabs(); initAlign(); initButtons(); }; /* 初始化tab标签 */ function initTabs() { var tabs = $G('tabhead').children; for (var i = 0; i < tabs.length; i++) { domUtils.on(tabs[i], "click", function (e) { var target = e.target || e.srcElement; setTabFocus(target.getAttribute('data-content-id')); }); } if (!editorOpt.disableUpload) { $G('tabhead').querySelector('[data-content-id="upload"]').style.display = 'inline-block'; } if (!editorOpt.disableOnline) { $G('tabhead').querySelector('[data-content-id="online"]').style.display = 'inline-block'; } if (!!editorOpt.selectCallback) { $G('imageSelect').style.display = 'inline-block'; domUtils.on($G('imageSelect'), "click", function (e) { editorOpt.selectCallback(editor, function (info) { if (info) { $G('url').value = info.path; $G('title').value = info.name; var img = new Image(); img.onload = function () { $G('width').value = img.width; $G('height').value = img.height; remoteImage.setPreview(); }; img.onerror = function () { remoteImage.setPreview(); }; img.src = info.path; } }); }); } var img = editor.selection.getRange().getClosedNode(); if (img && img.tagName && img.tagName.toLowerCase() == 'img') { setTabFocus('remote'); } else { setTabFocus('remote'); } } /* 初始化tabbody */ function setTabFocus(id) { if (!id) return; var i, bodyId, tabs = $G('tabhead').children; for (i = 0; i < tabs.length; i++) { bodyId = tabs[i].getAttribute('data-content-id'); if (bodyId == id) { domUtils.addClass(tabs[i], 'focus'); domUtils.addClass($G(bodyId), 'focus'); } else { domUtils.removeClasses(tabs[i], 'focus'); domUtils.removeClasses($G(bodyId), 'focus'); } } switch (id) { case 'remote': remoteImage = remoteImage || new RemoteImage(); break; case 'upload': setAlign(editor.getOpt('imageInsertAlign')); uploadImage = uploadImage || new UploadImage('queueList'); break; case 'online': setAlign(editor.getOpt('imageManagerInsertAlign')); onlineImage = onlineImage || new OnlineImage('imageList'); onlineImage.reset(); break; } } /* 初始化onok事件 */ function initButtons() { dialog.onok = function () { var remote = false, list = [], id, tabs = $G('tabhead').children; for (var i = 0; i < tabs.length; i++) { if (domUtils.hasClass(tabs[i], 'focus')) { id = tabs[i].getAttribute('data-content-id'); break; } } switch (id) { case 'remote': list = remoteImage.getInsertList(); break; case 'upload': list = uploadImage.getInsertList(); var count = uploadImage.getQueueCount(); if (count) { $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); return false; } break; case 'online': list = onlineImage.getInsertList(); break; } if (list) { editor.execCommand('insertimage', list); remote && editor.fireEvent("catchRemoteImage"); } }; } /* 初始化对其方式的点击事件 */ function initAlign() { /* 点击align图标 */ domUtils.on($G("alignIcon"), 'click', function (e) { var target = e.target || e.srcElement; if (target.className && target.className.indexOf('-align') != -1) { setAlign(target.getAttribute('data-align')); } }); } /* 设置对齐方式 */ function setAlign(align) { align = align || 'none'; var aligns = $G("alignIcon").children; for (i = 0; i < aligns.length; i++) { if (aligns[i].getAttribute('data-align') == align) { domUtils.addClass(aligns[i], 'focus'); $G("align").value = aligns[i].getAttribute('data-align'); } else { domUtils.removeClasses(aligns[i], 'focus'); } } } /* 获取对齐方式 */ function getAlign() { var align = $G("align").value || 'none'; return align == 'none' ? '' : align; } /* 在线图片 */ function RemoteImage(target) { this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } RemoteImage.prototype = { init: function () { this.initContainer(); this.initEvents(); }, initContainer: function () { this.dom = { 'url': $G('url'), 'width': $G('width'), 'height': $G('height'), 'border': $G('border'), 'vhSpace': $G('vhSpace'), 'title': $G('title'), 'align': $G('align') }; var img = editor.selection.getRange().getClosedNode(); if (img) { this.setImage(img); } }, initEvents: function () { var _this = this, locker = $G('lock'); /* 改变url */ domUtils.on($G("url"), 'keyup', updatePreview); domUtils.on($G("border"), 'keyup', updatePreview); domUtils.on($G("title"), 'keyup', updatePreview); domUtils.on($G("width"), 'keyup', function () { if (locker.checked) { var proportion = locker.getAttribute('data-proportion'); $G('height').value = Math.round(this.value / proportion); } else { _this.updateLocker(); } updatePreview(); }); domUtils.on($G("height"), 'keyup', function () { if (locker.checked) { var proportion = locker.getAttribute('data-proportion'); $G('width').value = Math.round(this.value * proportion); } else { _this.updateLocker(); } updatePreview(); }); domUtils.on($G("lock"), 'change', function () { var proportion = parseInt($G("width").value) / parseInt($G("height").value); locker.setAttribute('data-proportion', proportion); }); function updatePreview() { _this.setPreview(); } }, updateLocker: function () { var width = $G('width').value, height = $G('height').value, locker = $G('lock'); if (width && height && width == parseInt(width) && height == parseInt(height)) { locker.disabled = false; locker.title = ''; } else { locker.checked = false; locker.disabled = 'disabled'; locker.title = lang.remoteLockError; } }, setImage: function (img) { /* 不是正常的图片 */ if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; var wordImgFlag = img.getAttribute("data-word-image"), src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), align = editor.queryCommandValue("imageFloat"); /* 防止onchange事件循环调用 */ if (src !== $G("url").value) $G("url").value = src; if (src) { /* 设置表单内容 */ $G("width").value = img.width || ''; $G("height").value = img.height || ''; $G("border").value = img.getAttribute("border") || '0'; $G("vhSpace").value = img.getAttribute("vspace") || '0'; $G("title").value = img.title || img.alt || ''; setAlign(align); this.setPreview(); this.updateLocker(); } }, getData: function () { var data = {}; for (var k in this.dom) { data[k] = this.dom[k].value; } return data; }, setPreview: function () { var url = $G('url').value, ow = $G('width').value, oh = $G('height').value, border = $G('border').value, title = $G('title').value, preview = $G('preview'), width, height; width = ((!ow || !oh) ? preview.offsetWidth : Math.min(ow, preview.offsetWidth)); width = width + (border * 2) > preview.offsetWidth ? width : (preview.offsetWidth - (border * 2)); height = (!ow || !oh) ? '' : width * oh / ow; if (url) { preview.innerHTML = ''; } }, getInsertList: function () { var data = this.getData(); if (data['url']) { var img = { src: data['url'], _src: data['url'], } img._propertyDelete = [] img.style = [] if (data['width']) { img.width = data['width']; img.style.push('width:' + data['width'] + 'px'); } else { img._propertyDelete.push('width'); } if (data['height']) { img.height = data['height']; img.style.push('height:' + data['height'] + 'px'); } else { img._propertyDelete.push('height'); } if (data['border']) { img.border = data['border']; } else { img._propertyDelete.push('border'); } if (data['align']) { img.floatStyle = data['align']; } else { img._propertyDelete.push('floatStyle'); } if (data['vhSpace']) { img.vspace = data['vhSpace']; } else { img._propertyDelete.push('vspace'); } if (data['title']) { img.alt = data['title']; } else { img._propertyDelete.push('alt'); } if (img.style.length > 0) { img.style = img.style.join(';'); } else { img._propertyDelete.push('style'); } return [img]; } else { return []; } } }; /* 上传图片 */ function UploadImage(target) { this.$wrap = target.constructor == String ? $('#' + target) : $(target); this.init(); } UploadImage.prototype = { init: function () { this.imageList = []; this.initContainer(); this.initUploader(); }, initContainer: function () { this.$queue = this.$wrap.find('.filelist'); }, /* 初始化容器 */ initUploader: function () { var _this = this, $ = jQuery, // just in case. Make sure it's not an other libaray. $wrap = _this.$wrap, // 图片容器 $queue = $wrap.find('.filelist'), // 状态栏,包括进度和控制按钮 $statusBar = $wrap.find('.statusBar'), // 文件总体选择信息。 $info = $statusBar.find('.info'), // 上传按钮 $upload = $wrap.find('.uploadBtn'), // 上传按钮 $filePickerBtn = $wrap.find('.filePickerBtn'), // 上传按钮 $filePickerBlock = $wrap.find('.filePickerBlock'), // 没选择文件之前的内容。 $placeHolder = $wrap.find('.placeholder'), // 总体进度条 $progress = $statusBar.find('.progress').hide(), // 添加的文件数量 fileCount = 0, // 添加的文件总大小 fileSize = 0, // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWidth = 113 * ratio, thumbnailHeight = 113 * ratio, // 可能有pedding, ready, uploading, confirm, done. state = '', // 所有文件的进度信息,key为file id percentages = {}, supportTransition = (function () { var s = document.createElement('p').style, r = 'transition' in s || 'WebkitTransition' in s || 'MozTransition' in s || 'msTransition' in s || 'OTransition' in s; s = null; return r; })(), // WebUploader实例 uploader, actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')), acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), imageMaxSize = editor.getOpt('imageMaxSize'), imageCompressBorder = editor.getOpt('imageCompressBorder'); if (!WebUploader.Uploader.support()) { $('#filePickerReady').after($('
' + file.name + '
' + '' + '' + '