/**
* 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 + '
' + '' + '' + '