/**
* jQuery EasyUI 1.3.6
* Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved.
*
* Licensed under the GPL or commercial licenses
* To use it on other terms please contact author: info@jeasyui.com
* http://www.gnu.org/licenses/gpl.txt
* http://www.jeasyui.com/license_commercial.php
*
* jQuery EasyUI uploadify Plugin Extensions 1.0 beta
* jQuery EasyUI uploadify 插件扩展
* jquery.euploadify.js
* 二次开发 流云
* 最近更新:2014-05-23
*
* 依赖项:
* 1、jquery.jdirk.js v1.0 beta late
* 2、jeasyui.extensions.js v1.0 beta late
* 3、jeasyui.extensions.menu.js v1.0 beta late
* 4、jeasyui.extensions.panel.js v1.0 beta late 和 jeasyui.extensions.window.js v1.0 beta late(可选)
* 5、jeasyui.extensions.progressbar.js v1.0 beta late
* 6、uploadify/jquery.uploadify.js
* 7、uploadify/uploadify.css
* 8、uploadify/uploadify.swf
* 9、uploadify/uploadify.php|uploadify.ashx|uploadify.jsp
*
* Copyright (c) 2013-2014 ChenJianwei personal All rights reserved.
* http://www.chenjianwei.org
*/
(function ($, undefined) {
function create(target) {
var t = $(target).addClass("euploadify-f").hide(),
state = $.data(target, "euploadify"), opts = state.options,
name = state.name = t.attr("name");
state.uploadifyID = "euploadify_" + $.util.guid("N");
state.queueID = "euploadify_queue_" + $.util.guid("N");
state.lastFileID = null;
state.panel = $("
").insertAfter(t).append(t).panel($.extend({}, opts, {
onResize: function (width, height) {
$.fn.panel.defaults.onResize.apply(this, arguments);
$.extend(opts, { width: width, height: height });
setSize(target);
if ($.isFunction(opts.onResize)) { opts.onResize.apply(target, arguments); }
}
}));
state.wrapper = state.panel.panel("body").addClass("euploadify-wrapper");
state.queueDOM = $("").appendTo(state.wrapper);
state.queues = [];
t.removeAttr(name).attr("euploadifyName", name);
opts.originalValue = opts.value;
opts.originalFormData = $.extend({}, opts.formData);
initializeUploadify(target);
setValues(target, opts.value);
setSize(target);
if (opts.disabled) { disable(target, opts.disabled); }
setValidation(target)
};
function refreshQueueStatus(queues, file, value) {
var q = $.array.first(queues, function (f) { return f.id == file.id; })
if (q) {
q.filestatus = file.filestatus;
if (value != null) { q.value = value; }
}
};
function initializeUploadify(target) {
var t = $(target), state = $.data(target, "euploadify"), opts = state.options,
template = String(opts.multiTemplate).toLowerCase();
if (!$.array.contains(["uploadify", "simple", "bootstrap", "grid"], template)) {
template = $.fn.euploadify.defaults.multiTemplate;
}
var uopts = {
auto: opts.auto, method: opts.method, multi: opts.multi,
buttonClass: opts.buttonClass, buttonCursor: opts.buttonCursor, buttonImage: opts.buttonImage, buttonText: opts.buttonText,
checkExisting: opts.checkExisting, debug: opts.debug,
fileObjName: opts.fileObjName, fileSizeLimit: opts.fileSizeLimit, fileTypeDesc: opts.fileTypeDesc, fileTypeExts: opts.fileTypeExts,
formData: opts.formData, progressData: opts.progressData,
width: opts.buttonWidth, height: opts.buttonHeight, queueID: state.queueID,
itemTemplate: opts.multi && template != "custome" ? opts.multiTemplateData[template] : opts.itemTemplate,
overrideEvents: opts.overrideEvents, preventCaching: opts.preventCaching,
queueSizeLimit: opts.queueSizeLimit, uploadLimit: opts.uploadLimit,
removeCompleted: opts.removeCompleted, removeTimeout: opts.removeTimeout, requeueErrors: opts.requeueErrors,
swf: opts.swf, uploader: opts.uploader, successTimeout: opts.successTimeout,
onCancel: function (file) {
$.array.remove(state.queues, file, function (q) { return file.id == q.id; });
return opts.onCancel.apply(target, arguments);
},
onClearQueue: function () {
state.queues = [];
return opts.onClearQueue.apply(target, arguments);
},
onDestroy: function () {
state.queues = null;
return opts.onDestroy.apply(target, arguments);
},
onDialogClose: function () { return opts.onDialogClose.apply(target, arguments); },
onDialogOpen: function () { return opts.onDialogOpen.apply(target, arguments); },
onDisable: function () { return opts.onDisable.apply(target, arguments); },
onEnable: function () { return opts.onEnable.apply(target, arguments); },
onFallback: function () { return opts.onFallback.apply(target, arguments); },
onInit: function () { return opts.onInit.apply(target, arguments); },
onQueueComplete: function () { return opts.onQueueComplete.apply(target, arguments); },
onSelect: function (file) {
state.queues.push($.extend({}, file));
return opts.onSelect.apply(target, arguments);
},
onSelectError: function () { return opts.onSelectError.apply(target, arguments); },
onSWFReady: function () { return opts.onSWFReady.apply(target, arguments); },
onUploadComplete: function (file) {
refreshQueueStatus(state.queues, file);
return opts.onUploadComplete.apply(target, arguments);
},
onUploadError: function (file, errorCode, errorMsg, errorString) {
refreshQueueStatus(state.queues, file);
return opts.onUploadError.apply(target, arguments);
},
onUploadProgress: function (file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal) {
//refreshQueueStatus(state.queues, file);
return opts.onUploadProgress.apply(target, arguments);
},
onUploadStart: function (file) {
refreshQueueStatus(state.queues, file);
return opts.onUploadStart.apply(target, arguments);
},
onUploadSuccess: function (file, data, response) {
var obj = opts.responseFilter.call(target, data, file),
val = file.value = obj && obj.value != null && obj.value != undefined ? obj.value : null;
refreshQueueStatus(state.queues, file, val);
var values = opts.multi ? $.array.map(getQueuesByStatus(target, -4), function (f) { return f.value; }) : [val];
setValues(target, values);
return opts.onUploadSuccess.apply(target, arguments);
}
};
if (opts.multi) {
state.wrapper.addClass("euploadify-wrapper-multi euploadify-wrapper-multi-" + template);
state.buttonbar = $("").insertBefore(state.queueDOM);
if (template == "grid") {
buildGridPanel(target, uopts);
} else {
buildMultiPanel(target, uopts);
}
} else {
state.wrapper.addClass("euploadify-wrapper-single");
state.queueDOM.addClass("euploadify-hidden");
state.progressbar = $("").insertBefore(state.queueDOM).progressbar({
width: 400, height: 18, value: 0, text: opts.emptyText
});
state.buttonbar = $("").insertAfter(state.progressbar);
var onCancel = uopts.onCancel, onSelect = uopts.onSelect,
onUploadStart = uopts.onUploadStart, onUploadProgress = uopts.onUploadProgress,
onUploadError = uopts.onUploadError, onUploadSuccess = uopts.onUploadSuccess;
$.extend(uopts, {
onCancel: function (file) {
var ret = onCancel.apply(this, arguments), queues = getQueues(target);
if (!queues.length) {
state.progressbar.progressbar("setText", opts.emptyText).progressbar("setValue", 0);
return ret;
}
if (queues.length) {
state.progressbar.progressbar("setText", getFileName(target, queues[0]) + "(" + $.number.toFileSize(file.size) + ") - 0%").progressbar("setValue", 0);
} else {
state.progressbar.progressbar("setText", opts.emptyText).progressbar("setValue", 0);
}
return ret;
},
onSelect: function (file) {
var ret = onSelect.apply(this, arguments);
if (state.lastFileID && !opts.multi) {
state.uploadify.uploadify("cancel", state.lastFileID);
}
if (file) {
state.progressbar.progressbar("setText", getFileName(target, file) + "(" + $.number.toFileSize(file.size) + ") - 0%").progressbar("setValue", 0).
find(".progressbar-value .progressbar-text").removeClass("progressbar-text-success progressbar-text-error");
state.lastFileID = file.id;
} else {
state.progressbar.progressbar("setText", opts.emptyText).progressbar("setValue", 0).
find(".progressbar-value .progressbar-text").removeClass("progressbar-text-success progressbar-text-error");
}
return ret;
},
onUploadStart: function (file) {
var ret = onUploadStart.apply(this, arguments);
t.euploadify("resetFormData");
var data = $.extend({}, file, { customeName: file.name }),
formData = opts.requestFilter.call(target, data, file);
state.uploadify.uploadify("settings", "formData", formData);
return ret;
},
onUploadProgress: function (file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal) {
var ret = onUploadProgress.apply(this, arguments),
val = !bytesTotal ? 0 : (bytesUploaded / bytesTotal * 100).round(2);
state.progressbar.progressbar("setText", getFileName(target, file) + "(" + $.number.toFileSize(file.size) + ") - {value}%").progressbar("setValue", val).
find(".progressbar-value .progressbar-text").removeClass("progressbar-text-success progressbar-text-error");
return ret;
},
onUploadError: function (file, errorCode, errorMsg, errorString) {
var ret = onUploadError.apply(this, arguments);
if (!$.array.contains(["Cancelled", "Stopped"], errorString)) {
state.progressbar.progressbar("setText", getFileName(target, file) + "(" + opts.errorText + ":" + errorString + ")").
find(".progressbar-value .progressbar-text").removeClass("progressbar-text-success progressbar-text-error").addClass("progressbar-text-error");
}
return ret;
},
onUploadSuccess: function (file, data, response) {
var ret = onUploadSuccess.apply(this, arguments);
state.progressbar.progressbar("setText", getFileName(target, file) + "(" + opts.finishText + ")").progressbar("setValue", 100).
find(".progressbar-value .progressbar-text").removeClass("progressbar-text-success progressbar-text-error").addClass("progressbar-text-success");
return ret;
}
});
}
state.button = $(" ").appendTo(state.buttonbar);
state.uploadify = $("").insertBefore(state.button.find("span.l-btn-icon")).uploadify(uopts);
state.uploadify = $("#" + state.uploadifyID);
state.uploadButton = $("").appendTo(state.buttonbar).linkbutton({
plain: opts.buttonPlain, text: opts.uploadText, iconCls: opts.uploadIcon,
onClick: function () {
var queues = getQueues(target),
ff = $.array.first(queues, function (val) { return val.filestatus != -4; });
if (!queues || !queues.length || !ff) {
return $.easyui.messager.show(opts.message.queueEmpty);
}
state.uploadify.uploadify("upload", "*");
}
});
state.stopButton = $("").appendTo(state.buttonbar).linkbutton({
plain: opts.buttonPlain, text: opts.stopText, iconCls: opts.stopIcon,
onClick: function () {
state.uploadify.uploadify("stop");
return opts.onButtonStop.call(target, getQueues(target), this);
}
});
state.cancelButton = $("").appendTo(state.buttonbar).linkbutton({
plain: opts.buttonPlain, text: opts.cancelText, iconCls: opts.cancelIcon,
onClick: function () { state.uploadify.uploadify("cancel", "*"); }
});
if (opts.multi && template == "grid") {
$("-").insertAfter(state.button);
if (!opts.auto) {
$("-").insertAfter(state.uploadButton);
}
if (opts.showStop || opts.showCancel) {
$("-").appendTo(state.buttonbar);
}
state.removeButton = $("").appendTo(state.buttonbar).linkbutton({
plain: opts.buttonPlain, text: opts.removeText, iconCls: "icon-hamburg-busy",
onClick: function () {
var rows = state.grid.datagrid("getChecked"), array = $.array.clone(rows);
if (!rows || !rows.length) { return $.easyui.messager.show(opts.message.mustNotEmpty); }
$.each(array, function (i, row) {
var index = state.grid.datagrid("getRowIndex", row);
if (index > -1) { state.grid.datagrid("deleteRow", index); }
state.uploadify.uploadify("cancel", row.id);
$.array.remove(state.queues, row, function (q) { return row.id == q.id; });
});
var values = $.array.map(getQueuesByStatus(target, -4), function (f) { return f.value; });
setValues(target, values);
}
});
state.buttonbar.toolbar();
}
if (opts.tooltip) {
var tooltip = opts.tooltip === true ? $.fn.euploadify.defaults.tooltip : opts.tooltip;
if (state.button) { state.button.tooltip({ content: tooltip.button }); }
if (state.uploadButton) { state.uploadButton.tooltip({ content: tooltip.upload }); }
if (state.stopButton) { state.stopButton.tooltip({ content: tooltip.stop }); }
if (state.cancelButton) { state.cancelButton.tooltip({ content: tooltip.cancel }); }
if (state.removeButton) { state.removeButton.tooltip({ content: tooltip.remove }); }
}
};
function buildMultiPanel(target, uopts) {
var t = $(target), state = $.data(target, "euploadify"), opts = state.options,
onUploadStart = uopts.onUploadStart;
state.queueDOM.on("click", ".uploadify-queue-item .cancel a", function () {
var item = $(this).closest(".uploadify-queue-item"), id = item.attr("id");
$.array.remove(state.queues, id, function (q) { return q.id == id; });
var queues = getQueuesByStatus(target, -4),
values = $.array.map(queues, function (q) { return q.value; });
setValues(target, values.length ? values : [null])
});
$.extend(uopts, {
onUploadStart: function (file) {
var ret = onUploadStart.apply(this, arguments);
t.euploadify("resetFormData");
var data = $.extend({}, file, { customeName: file.name }),
formData = opts.requestFilter.call(target, data, file);
state.uploadify.uploadify("settings", "formData", formData);
return ret;
}
});
};
function buildGridPanel(target, uopts) {
var t = $(target), state = $.data(target, "euploadify"), opts = state.options,
layout = state.layout = $("").insertBefore(state.queueDOM),
north = state.north = $("").appendTo(layout).append(state.buttonbar),
center = state.center = $("").appendTo(layout),
grid = state.grid = $("").appendTo(center);
state.queueDOM.addClass("euploadify-hidden");
layout.layout({ fit: true });
grid.datagrid({
fit: true, border: false, idField: "id", rownumbers: true, refreshMenu: false, extEditing: true, singleEditing: true,
frozenColumns: [[
{ field: "ck", checkbox: true, filterable: false },
{ field: "name", title: "全文件名", width: 100, filterable: false }
]],
columns: [[
{ field: "customeName", title: opts.gridColumnNames.customeName, width: 120, editor: "text", filterable: false },
{ field: "type", title: opts.gridColumnNames.type, width: 60, filterable: false },
{
field: "size", title: opts.gridColumnNames.size, width: 80, filterable: false,
formatter: function (val) { return $.number.toFileSize(val); }
},
{
field: "progress", title: opts.gridColumnNames.progress, width: 80, align: "center", filterable: false,
formatter: function (val, row) {
return "";
}
},
{
field: "progressValue", title: opts.gridColumnNames.progressValue, width: 50, filterable: false,
formatter: function (val) { return String(val || 0) + "%"; }
},
{
field: "filestatus", title: opts.gridColumnNames.filestatus, width: 80, filterable: false,
formatter: function (val, row, index) {
var str = opts.FILE_STATUS[val], ret = val == -3 ?
("" + str + "") :
(val == -4 ? ("" + str + "") : str);
return ret;
}
},
{
field: "operate", title: opts.gridColumnNames.operate, width: 80, filterable: false,
formatter: function (val, row) {
return "\
\
\
\
\
";
}
}
]],
rowContextMenu: [
{
text: opts.gridRowContextNames.edit, iconCls: "icon-edit",
disabled: function () { return opts.disabled || state.wrapper.is(".euploadify-disabled"); },
handler: function (e, index, row) { grid.datagrid("beginEdit", index); }
},
{
text: opts.gridRowContextNames.cancel, iconCls: "icon-standard-delete",
disabled: function () { return opts.disabled || state.wrapper.is(".euploadify-disabled"); },
handler: function (e, index, row) {
if (row.filestatus == -4) {
$.easyui.messager.show(opts.message.fileUploadSuccessCanntCancel);
} else {
state.uploadify.uploadify("cancel", row.id);
}
}
},
{
text: opts.gridRowContextNames.upload, iconCls: "icon-standard-arrow-up",
disabled: function () { return opts.disabled || state.wrapper.is(".euploadify-disabled"); },
handler: function (e, index, row) {
if (row.filestatus == -4) {
$.easyui.messager.show(opts.message.fileUploadSuccess);
} else {
state.uploadify.uploadify("upload", row.id);
}
}
}
],
onBeginEdit: function (index, row) {
if ($.array.contains([-2, -4, -5], row.filestatus)) {
var msg = $.string.format(opts.message.fileCannotRename, opts.FILE_STATUS[row.filestatus]);
$.easyui.messager.show(msg);
grid.datagrid("cancelEdit", index);
}
return $.fn.datagrid.defaults.onBeginEdit.apply(this, arguments);
},
onAfterEdit: function (index, row, changes) {
if (!row.customeName) {
$.easyui.messager.show(opts.message.fileNameCannotEmpty);
var array = String(row.name).split("."), temp = $.array.removeAt(array, array.length - 1), name = temp.join("");
grid.datagrid("updateRow", { index: index, row: { customeName: name } });
}
return $.fn.datagrid.defaults.onAfterEdit.apply(this, arguments);
}
});
var onCancel = uopts.onCancel, onSelect = uopts.onSelect,
onUploadStart = uopts.onUploadStart, onUploadProgress = uopts.onUploadProgress,
onUploadError = uopts.onUploadError, onUploadComplete = uopts.onUploadComplete;
$.extend(uopts, {
onCancel: function (file) {
var ret = onCancel.apply(this, arguments),
id = file.id, index = grid.datagrid("getRowIndex", id);
if (index > -1) { grid.datagrid("deleteRow", index); }
return ret;
},
onSelect: function (file) {
var ret = onSelect.apply(this, arguments),
nameArray = String(file.name).split("."),
tempName = $.array.removeAt(nameArray, nameArray.length - 1), name = tempName.join(""),
row = $.extend({}, file, { customeName: name, progress: 0, progressValue: 0 });
grid.datagrid("appendRow", row);
return ret;
},
onUploadStart: function (file) {
var ret = onUploadStart.apply(this, arguments),
id = file.id, index = grid.datagrid("getRowIndex", id), row = index > -1 ? grid.datagrid("getRowData", index) : null;
if (row) {
t.euploadify("resetFormData");
var data = $.extend({}, row, { customeName: row.customeName + file.type }),
formData = opts.requestFilter.call(target, data, file);
state.uploadify.uploadify("settings", "formData", formData);
grid.datagrid("updateRow", { index: index, row: { filestatus: file.filestatus } });
}
return ret;
},
onUploadProgress: function (file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal) {
var ret = onUploadProgress.apply(this, arguments),
val = !bytesTotal ? 0 : (bytesUploaded / bytesTotal * 100).round(2), id = file.id, index = grid.datagrid("getRowIndex", id);
if (index > -1) {
grid.datagrid("updateRow", { index: index, row: { progress: val, progressValue: val, filestatus: file.filestatus } });
}
return ret;
},
onUploadError: function (file, errorCode, errorMsg, errorString) {
var ret = onUploadError.apply(this, arguments),
id = file.id, index = grid.datagrid("getRowIndex", id), row = index > -1 ? grid.datagrid("getRowData", index) : null;
if (row) {
state.uploadify.uploadify("settings", "formData", row);
grid.datagrid("updateRow", { index: index, row: { errorString: errorCode + "," + errorMsg + "," + errorString } });
}
return onUploadError.apply(this, arguments);
},
onUploadComplete: function (file) {
var ret = onUploadComplete.apply(this, arguments),
id = file.id, index = grid.datagrid("getRowIndex", id);
if (index > -1) {
grid.datagrid("updateRow", { index: index, row: { filestatus: file.filestatus } });
}
return ret;
}
});
};
function getOptions(target) {
var state = $.data(target, "euploadify"), opts = state.panel.panel("options");
return $.extend(state.options, {
title: opts.title, iconCls: opts.iconCls, width: opts.width, height: opts.height, left: opts.left, top: opts.top,
cls: opts.cls, headerCls: opts.headerCls, bodyCls: opts.bodyCls, style: opts.style, fit: opts.fit, border: opts.border,
doSize: opts.doSize, noheader: opts.noheader, collapsible: opts.collapsible, minimizable: opts.minimizable, maximizable: opts.maximizable,
closable: opts.closable, collapsed: opts.collapsed, minimized: opts.minimized, maximized: opts.maximized, closed: opts.closed
});
};
function getUploadify(target) {
return $.data(target, "euploadify").uploadify;
};
function getButtons(target) {
return $.data(target, "euploadify").buttonbar.find("a.euploadify-button");
};
function getFileName(target, file) {
if (!file || !file.name) { return $(target).euploadify("options").emptyText; }
return $.string.getByteLen(file.name) > 28 ? $.string.leftBytes(file.name, 25) + "..." : file.name;
};
function getQueueDOM(target) {
return $.data(target, "euploadify").queueDOM;
};
function getGrid(target) {
return $.data(target, "euploadify").grid;
};
function getQueues(target) {
return $.array.clone($.data(target, "euploadify").queues);
};
function getQueuesByStatus(target, status) {
return $.array.filter(getQueues(target), function (q) { return q.filestatus == status; });
};
function setSize(target) {
var t = $(target), state = $.data(target, "euploadify"), opts = state.options;
if (state.buttonbar && state.progressbar && !opts.multi) {
var fit = t._fit(false), width = fit.width - state.buttonbar.outerWidth() - 15;
state.progressbar.progressbar("resize", width);
}
};
function cancel(target, param) {
var state = $.data(target, "euploadify");
state.uploadify.uploadify("cancel", param);
};
function destroy(target) {
var t = $(target), state = $.data(target, "euploadify");
state.uploadify.uploadify("destroy");
state.panel.panel("destroy");
t.remove();
}
function disable(target, setDisabled) {
if (setDisabled == null || setDisabled == undefined) {
setDisabled = true;
}
var t = $(target), state = $.data(target, "euploadify"), opts = state.options;
opts.disabled = setDisabled;
var buttons = state.buttonbar.find(".euploadify-button:not(.euploadify-select)");
if (setDisabled) {
t.attr("disabled", true);
state.wrapper.addClass("euploadify-disabled");
state.button.addClass("l-btn-disabled");
if (opts.buttonPlain) { state.button.addClass("l-btn-plain-disabled"); }
$.util.tryExec(function () {
state.uploadify.uploadify("stop");
});
buttons.linkbutton("disable");
} else {
t.removeAttr("disabled");
state.wrapper.removeClass("euploadify-disabled");
state.button.removeClass("l-btn-disabled");
if (opts.buttonPlain) { state.button.removeClass("l-btn-plain-disabled"); }
buttons.linkbutton("enable");
}
$.util.tryExec(function () {
state.uploadify.uploadify("disable", setDisabled);
});
};
function enable(target) {
disable(target, false);
};
function stop(target) {
$.data(target, "euploadify").uploadify.uploadify("stop");
};
function upload(target, param) {
$.data(target, "euploadify").uploadify.uploadify("upload", param);
};
function resize(target, param) {
var state = $.data(target, "euploadify");
state.panel.panel("resize", param);
};
function settings(target, param) {
var t = $(target);
if (!param) { return t; }
var state = $.data(target, "euploadify"), opts = state.options;
if (typeof param == "string") {
return opts[param];
} else {
if (param.name) {
opts[param.name] = param.value;
state.uploadify.uploadify("settings", param.name, param.value);
}
return t;
}
};
function setFormData(target, param) {
param = param || {};
var state = $.data(target, "euploadify"), opts = state.options,
swfuploadify = state.uploadify.data("uploadify"),
settings = swfuploadify.settings;
settings.formData = {};
swfuploadify.setPostParams(opts.formData = $.extend(settings.formData, param));
};
function resetFormData(target) {
var state = $.data(target, "euploadify"), opts = state.options;
setFormData(target, opts.originalFormData);
};
function clearFormData(target) {
setFormData(target, {});
};
function hideTip(target) {
var state = $.data(target, "euploadify");
state.tip = false;
state.wrapper.tooltip("hide");
};
function showTip(target) {
var state = $.data(target, "euploadify"), opts = state.options;
state.wrapper.tooltip($.extend({}, opts.tipOptions, { content: opts.missingMessage, position: opts.tipPosition, deltaX: opts.deltaX })).tooltip("show");
state.tip = true;
};
function repositionTip(target) {
var state = $.data(target, "euploadify");
if (state && state.tip) {
state.wrapper.tooltip("reposition");
}
};
function initializeValidate(target) {
var t = $(target), state = $.data(target, "euploadify"), opts = state.options;
state.wrapper.unbind(".euploadify");
if (opts.novalidate) {
return;
}
state.wrapper.bind("focus.euploadify", function () {
state.validating = true;
state.values = undefined;
(function () {
if (state.validating) {
var values = t.euploadify("getValues").join(opts.separator);
if (state.values != values) {
state.values = values;
if (state.timer) {
clearTimeout(state.timer);
}
state.timer = setTimeout(function () { t.euploadify("validate"); }, opts.delay);
} else {
repositionTip(target);
}
setTimeout(arguments.callee, 200);
}
})();
}).bind("blur.euploadify", function () {
if (state.timer) {
clearTimeout(state.timer);
state.timer = undefined;
}
state.validating = false;
hideTip(target);
}).bind("mouseenter.euploadify", function () {
if (state.wrapper.hasClass("euploadify-invalid")) {
showTip(target);
}
}).bind("mouseleave.euploadify", function () {
if (!state.validating) {
hideTip(target);
}
});
};
function validate(target) {
var t = $(target), state = $.data(target, "euploadify"), opts = state.options,
values = t.euploadify("getValues"), str = values.join(opts.separator);
state.wrapper.removeClass("euploadify-invalid");
hideTip(target);
if (!opts.novalidate && opts.required && (!values.length || !str) && !t.is(":disabled") && !state.wrapper.hasClass("euploadify-disabled")) {
state.wrapper.addClass("euploadify-invalid");
if (state.validating) {
showTip(target);
}
return false;
}
return true;
};
function setValidation(target, novalidate) {
var state = $.data(target, "euploadify"), opts = state.options;
if (novalidate != undefined && novalidate != null) {
opts.novalidate = novalidate;
}
if (opts.novalidate) {
state.wrapper.removeClass("euploadify-invalid");
hideTip(target);
}
initializeValidate(target);
};
function getValues(target) {
var state = $.data(target, "euploadify"), opts = state.options,
fields = state.wrapper.find(".euploadify-value"),
values = $.array.map(fields, function (val) { return $(val).val(); });
state.values = values.join(opts.separator);
return opts.values = values;
};
function getValue(target) {
var values = getValues(target);
return values[0];
};
function setValues(target, values) {
var t = $(target), state = $.data(target, "euploadify"), opts = state.options,
original = t.euploadify("getValues"),
array = $.util.likeArrayNotString(values) ? values : [values];
state.wrapper.find(".euploadify-value").remove();
$.each(array, function (i, val) {
var field = $("").appendTo(state.wrapper).val(val);
if (state.name) {
field.attr("name", state.name);
}
});
var temps = $.array.filter(array, function (val) {
return $.array.contains(original, val) ? false : true;
});
if (temps.length != array.length || array.length != original.length) {
if (opts.multi) {
opts.onChange.call(target, array, original);
} else {
opts.onChange.call(target, array[0], original[0]);
}
}
state.values = array.join(opts.separator);
opts.values = array;
};
function setValue(target, value) {
setValues(target, [value]);
};
function clear(target) { setValues(target, []); };
function reset(target) {
var state = $.data(target, "euploadify"), opts = state.options;
setValues(target, opts.originalValue);
};
function show(target) {
var state = $.data(target, "euploadify");
state.panel.panel("open");
return getOptions(target);
};
function hide(target) {
var state = $.data(target, "euploadify");
state.panel.panel("close");
return getOptions(target);
};
$.fn.euploadify = function (options, param) {
if (typeof options == "string") {
var method = $.fn.euploadify.methods[options];
if (method) {
return method(this, param);
} else {
return this.euploadify("panel").panel(options, param);
}
}
options = options || {};
return this.each(function () {
var state = $.data(this, "euploadify");
if (state) {
$.extend(state.options, options);
} else {
$.data(this, "euploadify", { options: $.extend({}, $.fn.euploadify.defaults, $.fn.euploadify.parseOptions(this), options) });
create(this);
}
});
};
function operateQueue(mini, method) {
var btn = $(mini), t = btn.closest("div.euploadify-wrapper").find(".euploadify-f"),
state = $.data(t[0], "euploadify"), opts = state.options;
if (!opts.disabled && !state.wrapper.is(".euploadify-disabled")) {
var index = window.parseInt(btn.closest("tr.datagrid-row").attr("datagrid-row-index")),
row = state.grid.datagrid("getRowData", index);
if (row.filestatus == -4) {
var msg = {
cancel: opts.message.fileUploadSuccessCanntRemove,
upload: opts.message.fileUploadSuccess
};
$.easyui.messager.show(msg[method]);
} else {
state.uploadify.uploadify(method, row.id);
}
}
if (window.event && window.event.stopPropagation) {
window.event.stopPropagation();
}
return false;
};
$.fn.euploadify.cancelQueue = function (mini) {
return operateQueue(mini, "cancel");
};
$.fn.euploadify.uploadQueue = function (mini) {
return operateQueue(mini, "upload");
};
$.fn.euploadify.parseOptions = function (target) {
return $.extend({}, $.parser.parseOptions(target, [
"buttonClass", "buttonCursor", "buttonImage", "buttonText", "checkExisting", "fileObjName",
"fileTypeDesc", "fileTypeExts", "itemTemplate", "method", "progressData", "queueID", "swf", "uploader",
"uploadText", "stopText", "cancelText", "removeText", "emptyText", "finishText", "errorText",
"buttonIcon", "stopIcon", "cancelIcon", "uploadIcon", "multiTemplate",
"value", "width", "height", "missingMessage", "tipPosition", "separator",
{
auto: "boolean", debug: "boolean", multi: "boolean", preventCaching: "boolean", removeCompleted: "boolean", requeueErrors: "boolean",
disabled: "boolean", buttonPlain: "boolean", showStop: "boolean", showCancel: "boolean", required: "boolean", novalidate: "boolean"
},
{
fileSizeLimit: "number", height: "number", queueSizeLimit: "number", removeTimeout: "number", successTimeout: "number", uploadLimit: "number", width: "number",
buttonWidth: "number", buttonHeight: "number", deltaX: "number"
}
]));
};
// 提供外部调用公共方法 $.easyui.showEuploadifyDialog 用于快速创建 euploadify 文件上传对话框;
// 该方法的参数 options 参考继承于方法 $.easyui.showDialog 和插件 easyui-euploadify 的参数格式,在在此基础上增加了如下描述的属性:
// title : string
// value : string
// onEnter : function(val, euploadify, uploadify, btn)
// onCancel: function(val, euploadify, uploadify, btn)
// ...
// 返回值:返回创建的 easyui-dialog 对象;
$.easyui.showEuploadifyDialog = function (options) {
if (options && options.topMost && $ != $.util.$ && $.util.$.easyui.showEuploadifyDialog) {
return $.util.$.easyui.showEuploadifyDialog.apply(this, options);
}
var opts = $.extend({}, $.easyui.showEuploadifyDialog.defaults, options || {}),
euploadify, uploadify, value = opts.value,
dia = $.easyui.showDialog($.extend({}, opts, {
content: "",
enableApplyButton: false, topMost: false,
height: opts.height == "auto" ? (opts.multi ? 480 : 160) : opts.height,
onBeforeDestroy: function () { if (euploadify) { euploadify.euploadify("destroy"); } },
onSave: function () { return opts.onEnter.call(dia, getValue(), euploadify, uploadify, this); },
onClose: function () { return opts.onCancel.call(dia, getValue(), euploadify, uploadify, this); }
}));
$.util.exec(function () {
var container = dia.find(".euploadify-dialog-container").euploadify($.extend({}, opts, {
fit: true, border: false, noheader: true, value: value
}));
dia.euploadify = euploadify = container;
uploadify = container.euploadify("uploadify");
euploadify.euploadify("resize");
});
function getValue() {
if (!euploadify || !uploadify) { return value; }
var eopts = euploadify.euploadify("options");
return euploadify.euploadify(eopts.multi ? "getValues" : "getValue");
};
return dia;
};
$.easyui.showEuploadifyDialog.defaults = {
title: "文件上传对话框",
iconCls: "icon-hamburg-publish",
width: 750, height: "auto", minWidth: 400, minHeight: 160,
maximizable: true, collapsible: true,
multi: false, value: null,
onEnter: function (val, editor, btn) { },
onCancel: function (val, editor, btn) { }
};
$.fn.euploadify.methods = {
options: function (jq) { return getOptions(jq[0]); },
panel: function (jq) { return $.data(jq[0], "euploadify").panel; },
uploadify: function (jq) { return getUploadify(jq[0]); },
buttons: function (jq) { return getButtons(jq[0]); },
queueDOM: function (jq) { return getQueueDOM(jq[0]); },
grid: function (jq) { return getGrid(jq[0]); },
// 从当前上传队列中取消一个或多个文件的上传;该方法的参数 param 可以定义为如下数据类型:
// String : 表示要取消上传的文件的 id 值;如果不定义该参数,则取消队列中第一个文件的上传;如果该值定义为 "*",则取消队列中所有文件上传;
// Boolean : 默认为 false;如果定义为 true,则执行该方法时将不触发 onUploadCancel 事件;
// 返回值:返回表示当前 easyui-euploadify 控件的 jQuery 链式对象。
cancel: function (jq, param) { return jq.each(function () { cancel(this, param); }); },
// 从当前文档上下文中销毁该 easyui-euploadify 控件;该方法将触发 onDestroy 事件;
// 返回值:返回表示当前 easyui-euploadify 控件的 jQuery 链式对象。
destroy: function (jq) { return jq.each(function () { destroy(this); }); },
// 禁用该 easyui-euploadify 控件;该方法将触发 onDisable 事件;
// 该方法的参数 setDisabled 为 Boolean 类型值,为 true 时表示禁用上传按钮;为 false 表示启用上传按钮;
// 注意:该方法会导致当前的上传任务停止;
// 返回值:返回表示当前 easyui-euploadify 控件的 jQuery 链式对象。
disable: function (jq, setDisabled) { return jq.each(function () { disable(this, setDisabled); }); },
// 获取或设置 easyui-euploadify 控件中指定名称的属性值;该方法的参数 param 可以定义为如下数据类型:
// String : 该参数指定一个属性名称,该属性名所示的属性值将会被返回;
// Object : 格式如 { name: string, value: object };设定指定名称的属性为指定的值。
// 返回值:返回表示当前 easyui-euploadify 控件中指定名称的属性值;或者返回表示当前 easyui-euploadify 控件的 jQuery 链式对象。
settings: function (jq, param) { return settings(jq[0], param); },
// 停止当前上传队列中所有文件的上传。
// 返回值:返回表示当前 easyui-euploadify 控件的 jQuery 链式对象。
stop: function (jq) { return jq.each(function () { stop(this); }); },
// 获取当前上传队列中有多少文件数量;
// 返回值:返回一个 array 类型数组,数组中的每一项都是一个 file 对象;
queues: function (jq) { return getQueues(jq[0]); },
// 立即上传当前队列中的特定文件或所有文件。该方法的参数 param 可以定义为如下数据类型:
// String : 表示要立即上传的文件 id 值;如果不定义该参数,则上传队列中的第一个文件;如果该值定义为 "*",则上传队列中所有文件;
// 返回值:返回表示当前 easyui-euploadify 控件的 jQuery 链式对象。
upload: function (jq, param) { return jq.each(function () { upload(this, param); }); },
setFormData: function (jq, param) { return jq.each(function () { setFormData(this, param); }); },
resetFormData: function (jq) { return jq.each(function () { resetFormData(this); }); },
clearFormData: function (jq) { return jq.each(function () { clearFormData(this); }); },
resize: function (jq, param) { return jq.each(function () { resize(this, param); }); },
enable: function (jq) { return jq.each(function () { enable(this); }); },
validate: function (jq) { return jq.each(function () { validate(this); }); },
isValid: function (jq) { return validate(jq[0]); },
enableValidation: function (jq) { return jq.each(function () { setValidation(this, false) }); },
disableValidation: function (jq) { return jq.each(function () { setValidation(this, true) }); },
clear: function (jq) { return jq.each(function () { clear(this); }); },
reset: function (jq) { return jq.each(function () { reset(this); }); },
getValues: function (jq) { return getValues(jq[0]); },
setValues: function (jq, values) { return jq.each(function () { setValues(this, values); }); },
getValue: function (jq) { return getValue(jq[0]); },
setValue: function (jq, value) { return jq.each(function () { setValue(this, value); }); },
show: function (jq) { return jq.each(function () { show(this); }); },
hide: function (jq) { return jq.each(function () { hide(this); }); }
};
$.fn.euploadify.defaults = {
// 表示 "上传" 按钮的宽度(像素值);
width: 120,
// 表示 "上传" 按钮的高度(像素值);
height: 30,
// 表示当选择了待上传文件后,是否自动执行 upload 方法以上传文件;
auto: true,
// 表示 uploadify.swf SWFObject Flash 对象的相对路径;该参数必须设置正确,否则上传控件将无效;
swf: "uploadify.swf",
// 表示服务器端接收上传数据的 url 相对路径;该参数必须设置正确,否则上传控件将无效;
uploader: "uploadify.php",
// 表示能够上传文件的最大数量;当文件数超出此限制时,将会触发 onUploadError 事件;
uploadLimit: 999,
// 表示文件上传时进行 ajax 提交的方法;可选的值为 "post" 或 "get";
method: "post",
// 表示文件在上传过程中,每一个文件块的上传超时事件(秒);
successTimeout: 30,
// 表示被添加到 "上传" 按钮的 html-css 样式类名
buttonClass: "",
// 表示当鼠标移动至 "上传" 按钮时,鼠标显示的样式,可能的值为 "hand" 或 "arrow"
buttonCursor: "hand",
// 表示 "上传" 按钮附加的背景图片;如果需要设置一个 "上传" 按钮的鼠标悬停时显示的图标,可以用 buttonClass 属性并定义一个具有 hover 效果的 css;
buttonImage: null,
// 表示 "上传" 按钮显示的按钮文本;该值也可以定义为 html 标签包含的文本内容,例如 SELECT FILES;
buttonText: "SELECT FILES",
// 表示是否校验服务器目标文件夹中已经存在待上传的文件名;
// 该值如果定义为布尔值 false,则表示不进行校验;
// 如果定义为一个服务器 url 地址例如 "/uploadify/check-exists.php",则表示进行服务器校验;该地址如果返回 1 则表示服务器上存在指定的文件名;如果返回 0 则表示不存在。
checkExisting: false,
// 表示是否开启 SWFUpload 对象的调试模式
debug: false,
// 表示待上传文件对象提交至服务器时,采用的表单字段名;例如当该值定义为 "Filedata" 时,ASP.NET 服务器端可以用 HttpContext.Current.Request["Filedata"] 获取文件的二进制对象;
fileObjName: "Filedata",
// 表示文件上传大小上限;
// 该值可以定义为一个 Number 值,表示文件最大字节数(KB为单位);
// 也可以定义为一个以 "KB"、"MB" 或 "GB" 结尾的 String 值;
// 如果该属性值为 0,则表示不限制文件的上传大小;
fileSizeLimit: 0,
// 表示可选择的上传文件类型的描述;
fileTypeDesc: "All Files",
// 表示可选择的上传文件的扩展名列表,多个扩展名用半角分号隔开,例如 "*.jpg; *.png; *.gif"
// 注意:手动输入的文件名将会绕过此验证规则,因此在服务端还需要进行文件类型的校验;
fileTypeExts: "*.*",
// 表示随待上传文件被提交至服务器端时,被一并发送至服务器的表单参数;可以在 onUploadStart 事件中动态设置这些参数;
formData: {},
// 表示上传文件队列的 HTML 页面显示模板;该值定义为 false 表示按照默认格式显示;该模版中可以使用如下四个变量标签:
// instanceID:
// fileID:
// fileName:
// fileSize:
// 模板使用变量标签的格式如:${fileName}.
itemTemplate: false,
// 表示是否能够同时上传多个文件;
multi: true,
// 一个 array: 格式数组,数组中的每一项都是一个表示 uploadify 事件名称的字符串;
// 该属性表示哪些事件在 uploadify 的生命周期中将不会被触发执行;
overrideEvents: [],
// 表示浏览器是否缓存 SWFObject;如果该值设置为 false,则 SWF 文件的 url 中将会被添加一个随机值参数,以实现 SWFObject 不缓存效果;
preventCaching: true,
// 表示文件上传时的文件上传进度显示方式;
// percentage: 表示上传时显示上传进度百分比
// speed: 表示上传时显示上传速度
progressData: "percentage",
// 一个 HTML-DOM 元素的 ID 值,用于作为文件上传队列显示的容器;如果定义该值,则文件上传队列中每个上传的元素将会被附加到这个 DOM 对象中;
// 如果该值定义为 false,则文件上传队列显示容器将会动态生成;
queueID: false,
// 表示能够同时执行上传操作的文件最大数量;这并不限制该控件可上传文件的最大数量;要限制可上传文件最大数量请用 uploadLimit 参数;
// 如果添加到上传队列中的文件数量超过此限制,将会触发 onSelectError 事件;
queueSizeLimit: 999,
// 表示是否可以移除已经上传完成的文件;
removeCompleted: true,
// 表示文件上传完成后将会延迟多少秒后采用上传队列中被移除;
removeTimeout: 3,
// 表示文件在上传过程中如果出错是否自动重新上传;
requeueErrors: false,
// 当上传队列中的一个或多个文件被执行 cancel 方法而从队列中取消时,该事件将会被触发;
// file : object 类型值;表示被取消上传的文件对象;
onCancel: function (file) { },
// 当 cancel 方法被执行并且参数值为 "*",该事件将会被触发;
// queueItemCount: number 类型值;表示取消上传的文件总数量
onClearQueue: function () { },
// 当 destroy 方法被调用时,该事件将会被触发;
onDestroy: function () { },
// 当浏览文件对话框被关闭时,该事件将会被触发;如果该事件会添加至 overrideEvents 属性,则在将文件添加到上传队列中时如果出现错误,将不会弹出警告消息;
// queueData: object 类型值,格式如 { filesSelected: number, filesQueued: number, filesReplaced: number, filesCancelled: number, filesErrored: number }
onDialogClose: function (queueData) { },
// 当打开浏览文件对话框后,该事件将会被触发;注意,该事件函数不会在浏览文件对话框打开时被立即执行,而是在窗口关闭时执行。
onDialogOpen: function () { },
// 当 disable 方法被调用时,该事件将会被触发;
onDisable: function () { },
// 当 disable 方法被调用并且 setDisabled 值为 false 以启用按钮时,该事件将会被触发;
onEnable: function () { },
// 在上传控件初始化过程中,如果当前浏览器的 Flash 插件版本不兼容,该事件将会被触发;
onFallback: function () { },
// 在 easyui-euploadify 控件第一次被初始化完成后,该事件将会被触发;
// instance: 表示 uploadify 对象;
onInit: function (instance) { },
// 当上传队列中所有文件被处理完成后,该事件将会被触发;
// queueData: object 类型值,格式如 { uploadsSuccessful: number, uploadsErrored: number }
onQueueComplete: function (queueData) { },
// 当打开文件浏览器对话框并选择了要上传的文件之后,该事件将会被触发;
// file: 表示被选择的待上传文件;
onSelect: function (file) { },
// 当打开文件浏览器对话框并在选择文件出错后,该事件将会被触发;针对每个选择文件出错后,该事件都会被触发一次;
// file: 表示触发异常事件的文件对象;
// errorCode:表示错误代码,可能的值为如下几种:
// QUEUE_LIMIT_EXCEEDED: 选定的文件数量超过限制;
// FILE_EXCEEDS_SIZE_LIMIT:选定的文件大小超过限制;
// INVALID_FILETYPE: 选定的文件类型超过限制;
// errorMsg:表示触发该事件时的错误消息;
onSelectError: function (file, errorCode, errorMsg) { },
// 当该控件的 Flash 插件对象加载完成后,该事件将会被触发;
onSWFReady: function () { },
// 当文件上传完成(不管成功还是失败),该事件将会被触发;针对每个上传的文件,该事件都会触发一次;
// file: 表示触发该事件的文件对象;
onUploadComplete: function (file) { },
// 当文件上传失败后,该事件将会被触发;针对每个上传失败的文件,该事件都会触发一次;
// file: 表示触发该事件的文件对象;
// errorCode: 表示错误编号
// errorMsg: 表示错误消息
// errorString:表示错误消息字符串,可能包含所有的错误细节的可读内容;
onUploadError: function (file, errorCode, errorMsg, errorString) { },
// 当文件上传进度每次更新时,该事件将会被触发;针对每个上传文件的每次进度更新,该事件都会触发一次;
// file: 表示触发该事件的文件对象;
// bytesUploaded: 表示该文件自开始上传时至当前时刻已上传的字节总数;
// bytesTotal: 表示该文件的字节总数;
// totalBytesUploaded: 表示目前为止所有文件的上传字节总数;
// totalBytesTotal: 表示所有文件的字节总数
onUploadProgress: function (file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal) { },
// 当文件上传进度每次更新时,该事件将会被触发;
// file: 表示将要被上传的文件对象;
onUploadStart: function (file) { },
// 当文件上传成功完成时,该事件将会被触发;针对每个上传成功的文件,该事件都会触发一次;
// file: 表示上传完成的文件对象;
// data: 文件上传完成后,由服务器端返回的数据;
// response: 表示文件是否上传成功;boolean 类型值;如果为 true 则表示文件上传成功;
// 如果该值为 false,则表示当提交上传后并超过 successTimeout 属性设置的超时时间后,服务器任未有数据返回(文件上传失败);
onUploadSuccess: function (file, data, response) { }
};
$.extend($.fn.euploadify.defaults, {
successTimeout: 3600,
removeCompleted: false,
formData: { folder: "uploads" },
buttonText: "选择文件...",
multi: false,
auto: true,
uploadText: "上传",
stopText: "停止上传",
cancelText: "取消上传",
removeText: "移除选择",
emptyText: "未选择文件",
finishText: "上传完成!",
errorText: "上传失败",
// 设置按钮提示文字;
// 该属性可以为一个格式如 { button: string, upload: string, stop: string, cancel: string, remove: string } 的对象,表示每个按钮的提示文字内容;
// 也可以是一个 boolean 类型值,表示是否启用按钮文字提示;
tooltip: {
button: "打开文件浏览器窗口并选择需要上传的文件",
upload: "上传当前文件队列中所有未上传的文件",
stop: "停止当前文件上传队列中所有文件的上传动作",
cancel: "取消当前文件队列中所有未上传文件的上传任务",
remove: "取消选定行的上传任务并删除该行"
},
message: {
queueEmpty: "当前上传队列中没有待上传文件.",
mustNotEmpty: "请至少选择一行数据.",
fileUploadSuccessCanntCancel: "该文件已经上传完成,无法取消!",
fileUploadSuccess: "该文件已经上传完成!",
fileCannotRename: "该文件处于\"{0}\"状态,不能编辑\"自定义文件名\",编辑状态已撤销.",
fileNameCannotEmpty: "自定义文件名不能为空(已经恢复)",
fileUploadSuccessCanntRemove: "该文件已经上传完成,无法取消(如想移除该行请选中该行后点击上方按钮\"移除选择\")!"
},
gridColumnNames: {
name: "全文件名", customeName: "自定义文件名", type: "类型", size: "大小",
progress: "上传进度", progressValue: "进度值", filestatus: "状态", operate: "操作"
},
gridRowButtonNames: {
cancel: "取消", upload: "上传"
},
gridRowContextNames: {
edit: "编辑文件名", cancel: "取消该文件", upload: "上传该文件"
},
FILE_STATUS: { "-1": "等待上传", "-2": "正在上传...", "-3": "上传出错", "-4": "上传完成", "-5": "已取消" },
buttonIcon: "icon-search",
stopIcon: "icon-hamburg-stop",
cancelIcon: "icon-standard-cancel",
uploadIcon: "icon-hamburg-publish",
response: { "id": null, "status": false, "message": null, "value": null, "url": null },
requestFilter: function (data, file) { return data; },
responseFilter: function (data, file) {
return $.util.tryExec(function () { return $.util.parseJSON(data); });
},
// 在设置控件允许可以同时上传多个文件时(multi: true),多文件列表的显示方式;String 类型值,可选的值限定如下范围:
// uploadify:
// simple:
// list:
// grid:
multiTemplate: "grid",
multiTemplateData: {
uploadify: $.fn.euploadify.defaults.itemTemplate,
simple: "\
\
${fileName} (${fileSize})\
",
bootstrap: ""
},
value: null,
disabled: false,
buttonPlain: true,
width: "auto",
height: "auto",
buttonWidth: 90,
buttonHeight: 24,
showStop: false,
showCancel: false,
required: false,
missingMessage: "附件(文件/档)不能为空,请上传.",
// "left", "right", "top", "bottom"
tipPosition: "right",
deltaX: 0,
tipOptions: $.fn.validatebox.defaults.tipOptions,
separator: ",",
novalidate: false,
onChange: function (newValue, oldValue) { },
onButtonStop: function (queues, btnDOM) { }
});
$.parser.plugins.push("euploadify");
if ($.fn.form && $.isArray($.fn.form.otherList)) {
$.fn.form.otherList.push("euploadify");
//$.array.insert($.fn.form.otherList, 0, "euploadify");
}
})(jQuery);