/**
* Created by Lynn on 2016/3/9.
*/
;
(function ($, window, document, undefined) {
"use strict";
$.fn.imageGroup = function (options) {
return this.each(function () {
new ImageGroup(this, $.extend({}, $.fn.imageGroup.defaults, options));
});
};
// Defaults
$.fn.imageGroup.defaults = {
multi: !1, // 是否多图
editable: !0, // 图片名称是否可编辑
moveable: !0, //图片是否能移动
deletable: !0, //图片是否可删除
upload: !0, // 是否允许上传图片
uploadText: '',
uploadAction: UPLOAD_IMG, //图片上传接口
server: !0, //是否允许从服务器端选择图片
serverText: '',
thumb_width: 160,
thumb_height: 120,
defaultName: '上传图片',
compress: false,
maxPhoto: 100
};
function ImageGroup(element, options) {
if (!arguments.length) {
return;
}
var img_uploaded_num = 0,
cls_item = 'vc-img-item',
cls_uploaded = 'upload-state-done',
cls_success = 'upload-state-success',
btns,
uploadItem,
uploader;
element = $(element).addClass('vc-img-edit');
$.extend(options, element.data());
render();
function render() {
var items = element.find('.' + cls_item),
i = 0;
img_uploaded_num = items.length;
for (; i < img_uploaded_num; i++) {
var item = items.eq(i),
img = item.find('img');
if (img.length) {
renderImg(item, img);
} else if (!options.multi && 0 == i) {
renderBtns(item);
}
if (options.itemWidth > 0)ct.css({width: options.itemWidth, 'max-width': 'none'});
}
if (options.multi || 0 == img_uploaded_num) renderItem();
if (options.fixedHeight > 0) {
element.addClass('vc-img-fixed-height');
}
element.on('click', function (e) {
var el = $(e.target), func = el.data('func'), item;
if (!func && el.is('.fa')) {
el = el.parent();
func = el.data('func');
}
if (func) {
item = el.parent().parent().parent()
switch (func) {
case 'edit':
edit(item);
break;
case 'del':
del(item);
break;
case 'leftMove':
move(item, 'left');
break;
case 'rightMove':
move(item, 'right');
break;
case 'server':
server(el.parent().parent());
break;
}
}
});
element.on('dblclick', function (e) {
var el = $(e.target);
if (el.is('img')) {
if ($.isFunction(options.dblclick)) {
options.dblclick(element, el);
} else {
top.lightBox(el, {src: SOSO.getImageUrl(el.attr('src'), !1)});
}
} else if (el.is('h6')) {
if (options.editable) {
edit(element);
}
}
});
}
function renderBtns(item) {
if (btns) {
btns.show();
return;
}
uploadItem = item;
var cls = options.upload && options.server ? 'vc-img-btns' : 'vc-img-btn';
btns = $('
').prependTo(item.addClass('vc-img-upload'));
if (options.upload) {
var btn = $('
' + options.uploadText + '
').appendTo(btns);
if (options.fixedHeight > 0) {
btn.height(options.fixedHeight).addClass('btn-fixed-height');
}
renderUploader(item, btn);
}
if (options.server) btns.append($('' + options.serverText + ''));
//window.setTimeout(function(){btns.show()}, 100);
}
function renderImg(item, img) {
var ct = $('').prependTo(item);
item.addClass(cls_uploaded);
if (typeof img == 'string') {
img = $('');
item.addClass(cls_success);
} else if (typeof img == 'object' && img.source) {
img = $('
等待上传
');
}
if (options.fixedHeight > 0 && img.is('img')) {
img.height(options.fixedHeight);
}
ct.append(img);
var span = $('').appendTo(ct);
if (options.editable) {
span.append('');
}
if (options.deletable) {
span.append('');
}
if (options.multi && options.moveable) {
span.append('');
span.append('');
}
return img;
}
function renderItem(file, item) {
var l = element.find('.' + cls_item).length,
ct = $('');
if (item) {
item.before(ct);
} else {
element.append(ct);
}
if (options.itemWidth > 0) ct.css({width: options.itemWidth, 'max-width': 'none'});
if (!file) {
renderBtns(ct);
setText(ct, options.defaultName);
return ct;
} else if (typeof file == 'string') {
renderImg(ct, file);
} else {
ct.attr('id', file.id);
var title = file.title || file.name;
if (file.ext) {
title = title.substring(0, title.length - file.ext.length - 1);
}
setText(ct, title);
}
img_uploaded_num++;
if (uploadItem && options.multi && img_uploaded_num >= options.maxPhoto) {
uploadItem.hide();
}
return ct;
}
function setText(item, title, desc) {
var h6 = item.find('h6');
if (!h6.length) {
h6 = $('').appendTo(item);
}
h6.text(title);
}
function setValues(item, values) {
values = values || {};
if (options.editable) setText(item, values.title || values.name || '', values.desc || '');
values.update = 1;
$.each(values, function () {
var k = arguments[0],
v = arguments[1],
n = 'field' + k.substring(0, 1).toUpperCase() + k.substring(1),
ipt;
if (options[n]) {
ipt = item.find("input[name='" + options[n] + "']");
if (!ipt.length) {
ipt = $('').appendTo(item);
}
ipt.val(v);
}
});
item.data('soso.images', values);
if (typeof options.setValues == 'function') {
options.setValues(options, item, values);
}
}
var fields = null;
function getFields() {
if ($.isArray(fields)) return fields;
fields = [];
$.each(options, function (k, v) {
if (k.indexOf('field') == 0 && k.length > 5) {
fields.push(k.substring(5).toLowerCase());
}
});
return fields;
}
function getValue(item, fields) {
if (fields) {
if (!$.isArray(fields)) fields = [fields];
} else {
fields = getFields();
}
var values = {};
$.each(fields, function (v, k) {
var n = 'field' + k.substring(0, 1).toUpperCase() + k.substring(1), ipt;
if (options[n]) {
ipt = item.find("input[name='" + options[n] + "']");
if (ipt.length) {
values[k] = ipt.val();
}
}
});
return values;
}
function edit(item) {
if (!item.hasClass(cls_uploaded)) return;
if (options.editor) {
options.editor.call(null, item, getValue(item), function (values) {
setValues(item, values);
});
return;
}
var form = $(''),
dialog = top.bootbox.dialog({
title: '图片属性',
width: 560,
draggable: true,
message: form,
buttons: {
success: {
label: "确定", className: "btn-primary", callback: function () {
var F = form.get(0), n = F.name.value.trim();
if (!n) return false;
setValues(item, {name: n, desc: F.desc.value.trim()})
}
},
cancel: {label: "取消", className: "btn-default"}
}
});
form.find('input').val(item.find('h6').text());
if (options.enabledesc !== false) {
form.find('textarea').val(getValue(item, 'desc').desc || '');
} else {
form.find('textarea').parent().parent().hide();
}
}
function del(item) {
if (options.deletable !== false) {
if (item.hasClass(cls_success) && $.isFunction(options.onBeforeDelete) && options.onBeforeDelete.call(null, item, function () {
doDel(item);
}) !== true) {
return;
}
doDel(item);
}
if (options.delete) {
options.delete.call(null, item);
}
}
function doDel(item) {
if (!options.multi) {
item.removeClass(cls_uploaded).removeClass(cls_success).find('.vc-img-img').remove();
item.find('>input').remove();
renderBtns(item);
} else {
updateDelIds(item);
img_uploaded_num--;
uploadItem.show();
item.remove();
}
if ($.isFunction(options.onDelete)) {
options.onDelete.call(null, item);
}
}
var deleteIdsInput;
function updateDelIds(item) {
var id = options['fieldId'],
ids = options['deleteids'];
if (id && ids) {
if (!deleteIdsInput) {
deleteIdsInput = element.find("input[name='" + ids + "']");
if (!deleteIdsInput.length) {
deleteIdsInput = $('').appendTo(element);
}
}
ids = deleteIdsInput.val();
id = item.find("input[name='" + id + "']").val();
ids = ids ? ids + ',' + id : id;
deleteIdsInput.val(ids);
}
}
function move(item, direction) {
var cls = '.' + cls_item;
if ('left' == direction) {
item.after(item.prev(cls));
} else if ('right' == direction) {
item.insertAfter(item.next(cls));
}
}
var _server;
function server(item) {
if (_server) return;
_server = true;
SOSO.Dialog.image({
singleSelect: !options.multi,
max: options.maxPhoto,
clasification: options.clasification,
callback: function (rs) {
if (options.multi && $.isArray(rs)) {
$.each(rs, function () {
setValues(renderItem(SOSO.getImageUrl(this, false), item), this);
});
} else {
btns.hide();
renderImg(item, SOSO.getImageUrl(rs, false));
setValues(item, rs);
}
return true;
}
});
_server = false;
}
function renderUploader(item, btn) {
var uploader = WebUploader.create({
// 选完文件后,是否自动上传。
auto: true,
// swf文件路径
swf: WU_SWF,
// 文件接收服务端。
server: options.uploadAction,
duplicate: true,
// 选择文件的按钮。可选。
pick: {
id: btn,
multiple: options.multi
},
formData: {
brand: options.clasification ? options.clasification.brand : null,
series: options.clasification ? options.clasification.series : null
},
compress: false,
// 只允许选择图片文件。
accept: {
title: 'Images',
extensions: 'gif,jpg,jpeg,bmp,png',
mimeTypes: 'image/gif,image/jpg,image/jpeg,image/png,image/bmp'
}
});
if (btn.hasClass('btn-fixed-height')) {
btn.find('.webuploader-pick').css('line-height', btn.height() + 'px');
}
// 当有文件加入队列的时候
uploader.on('fileQueued', function (file) {
var img;
if (options.multi) {
if (img_uploaded_num >= options.maxPhoto) {
alert('图片不能超过' + options.maxPhoto + '张');
return;
}
img = renderImg(renderItem(file, item), file);
if (img_uploaded_num >= options.maxPhoto) {
item.hide();
}
} else {
btns.hide();
item.attr('id', file.id);
img = renderImg(item, file);
}
// 创建缩略图
this.makeThumb(file, function (error, src) {
if (error) {
img.replaceWith('
显示图片错误
');
return;
}
$('').prependTo(img.parent());
}, options.thumb_width, options.thumb_height);
});
uploader.on('uploadProgress', function (file, percentage) {
var item = element.find('#' + file.id), el = item.find('.vc-img-loading');
// 避免重复创建
if (!el.length) {
el = $('
').appendTo(item.find('.vc-img-img'));
}
el.find('p').text('上传中');
});
// 文件上传失败,显示上传出错。
uploader.on('uploadError', function (file) {
var item = $('#' + file.id),
el = item.find('.vc-img-error');
if (!el.length) {
el = $('
').appendTo(item.find('.vc-img-img'));
}
el.find('p').text('上传失败');
});
// 完成上传完了,成功或者失败,先删除进度条。
uploader.on('uploadComplete', function (file) {
element.find('#' + file.id).find('.vc-img-loading').remove();
});
// 文件上传成功
uploader.on('uploadSuccess', function (file, rs) {
var item = element.find('#' + file.id);
if (1 != rs.state) {
$('