/*
Real-time file upload utility and upload progress monitor.
*/
var SmartUpload_Config = {
iconFolder: '/eService/images/smartupload/', //icon file naming as: doc.jpg, xls.jpg, ppt.jpg... 16x16 is best.
fileUploadServer: '/eService/smartupload.action',
uploadStatusServer: '/eService/smartuploadstatus.action',
fileDownloadServer: '/eService/smartdownload.action',
downloadStatusServer: '/eService/smartdownloadstatus.action',
maxFileSize: '50MB',
allowFilext: '*',
files: 1
};
var Known_File = $w('csv doc exe gif jpg pdf ppt rar txt xls zip docx pptx xlsx');
var SmartUpload = Class.create();
var otherFileStatus;
SmartUpload.prototype = {
initialize : function(form, fileField, options, files){
this.form = $(form);
iframeName = fileField + "_iframe";
options = Object.extend({
maxFileSize : SmartUpload_Config.maxFileSize,
allowFilext : SmartUpload_Config.allowFilext,
files : SmartUpload_Config.files,
onUploadStart : "",
onUploadComplete : ""
}, options || {});
document.write("");
document.write("
");
$(fileField+"_file")["onchange"] = function() {
var id = (new Date()).getTime();
var parameter = {id: 0, form: '', fileField: '', maxFileSize: -1, allowFilext: '', files: 1 };
parameter.id = id;
parameter.form = form;
parameter.fileField = fileField;
parameter.maxFileSize = options.maxFileSize;
parameter.allowFilext = options.allowFilext;
parameter.files = options.files;
//Check file field empty.
if ($F(fileField+"_file") == '') {
return;
}
//Check file extension
var filext = "";
if ($F(fileField+"_file").lastIndexOf(".")>0) {
filext = $F(fileField+"_file").substring($F(fileField+"_file").lastIndexOf(".") + 1);
filext = filext.toLowerCase();
}
//alert(filext);
var filextMatch = true;
//alert("filextMatch:"+filextMatch);
if (options.allowFilext != '' && options.allowFilext != '*') {
filextMatch = false;
var allowFilextList = options.allowFilext.split(",");
for (var i = 0; i < allowFilextList.length; i ++) {
//alert(i+":"+allowFilextList[i].toLowerCase());
if (filext == allowFilextList[i].toLowerCase()) {
filextMatch = true;
break;
}
}
}
//alert("filextMatch:"+filextMatch);
if (!filextMatch) {
//File extention error
$(fileField+"_file").hide();
SmartUpload_error(Object.toJSON(parameter), id);
return;
}
var formOldAction = this.form.action;
var formOldMethod = this.form.method;
var formOldEnctype = this.form.enctype;
var formOldTarget = this.form.target;
var allFileFields = this.form.getElementsByTagName("input");
otherFileStatus = new Array();
for (var i = 0; i < allFileFields.length; i++) {
var oneFileField = allFileFields[i];
if("file" == oneFileField.type && oneFileField.id != fileField + "_file") {
if (oneFileField.disabled != null && oneFileField.disabled == true) {
otherFileStatus.push(0);
} else {
otherFileStatus.push(1);
}
oneFileField.disabled = true;
}
}
this.form.action = SmartUpload_Config.fileUploadServer + "?smartid="+id+"&fileField=" + fileField + "_file&maxFileSize=" + options.maxFileSize+"&allowFilext="+options.allowFilext;
//alert(this.form.action);
this.form.method = "post";
this.form.enctype = "multipart/form-data";
this.form.target = iframeName;
try{
this.form.submit();
} catch (E) {
if (otherFileStatus != null && otherFileStatus.length > 0) {
var allFileFields = this.form.getElementsByTagName("input");
var j = 0;
for (var i = 0; i < allFileFields.length; i++) {
var oneFileField = allFileFields[i];
if("file" == oneFileField.type.toLowerCase() && oneFileField.id != fileField+"_file") {
if (otherFileStatus[j] == 0) {
oneFileField.disabled = true;
} else {
oneFileField.disabled = false;
}
j++;
}
}
}
return;
}
this.form.action = formOldAction;
this.form.method = formOldMethod;
this.form.enctype = formOldEnctype;
this.form.target = formOldTarget;
eval(options.onUploadStart);
SmartUpload_start(Object.toJSON(parameter));
};
if (files != null && files != 'null' && files != '' && !isNaN(files) && files !='0') {
$(fileField).value = files;
var fileList = files.split(",");
for(var i=0; i= options.files) {
$(fileField+"_file").hide();
}
}
}
}
function SmartUpload_start(parameter) {
var p = parameter.evalJSON();
$(p.fileField+"_file").hide();
var bar1 = $(p.fileField+"_bar1");
bar1.show();
setTimeout("SmartUpload_updater('"+parameter+"')", 100);
}
function SmartUpload_updater(parameter) {
var url = SmartUpload_Config.uploadStatusServer;
//alert("url:"+url);
var p = parameter.evalJSON();
new Ajax.Request(url, {
method: 'get',
parameters: '?smartid=' + p.id + "&r=" + (new Date()).getTime(),
onComplete: function(transport) {
var jsonObj = transport.responseText.evalJSON(true);
SmartUpload_updatebar(parameter, jsonObj);
//alert(jsonObj['status']);
if (jsonObj['status'] == 3) {
SmartUpload_complete(parameter, jsonObj);
} else if (jsonObj['status'] == 1 || jsonObj['status'] == 2) {
setTimeout("SmartUpload_updater('"+parameter+"')", 100);
} else {
SmartUpload_error(parameter, jsonObj['id']);
}
}
});
}
function SmartUpload_updatebar(parameter, jsonObj) {
var p = parameter.evalJSON();
var bar1 = $(p.fileField+"_bar1");
var bar2 = $(p.fileField+"_bar2");
var bar3 = $(p.fileField+"_bar3");
var bar4 = $(p.fileField+"_bar4");
bar1.show();
var pBytesRead = jsonObj['pBytesRead'];
var pContentLength = jsonObj['pContentLength'];
//alert("pBytesRead:"+pBytesRead);
//alert("pContentLength:"+pContentLength);
if (pBytesRead == 0 && pContentLength == 0) {
return;
}
var percent = parseInt((pBytesRead*100)/pContentLength);
//alert("percent:"+percent);
if (pBytesRead == 0) {
percent = 0;
}
bar2.style.width = parseInt(percent * 1.5) + "px";
//if (percent > 20) {
bar3.innerHTML = percent + "%";
//}
bar4.innerHTML = byte2HumanRead(pBytesRead, 2) + "/" + byte2HumanRead(pContentLength, 2);
}
function SmartUpload_complete(parameter, jsonObj) {
var p = parameter.evalJSON();
//reset progress bar
var bar1 = $(p.fileField+"_bar1");
var bar2 = $(p.fileField+"_bar2");
var bar3 = $(p.fileField+"_bar3");
var bar4 = $(p.fileField+"_bar4");
bar2.style.width = "0px";
bar3.innerHTML = "";
bar4.innerHTML = "Waiting";
bar1.hide();
var rootElement = bar1.parentElement;
var fileSize = byte2HumanRead(jsonObj['pContentLength'], 2);
var filext = "unknown";
if (jsonObj['fileName'].lastIndexOf(".")>0) {
filext = jsonObj['fileName'].substring(jsonObj['fileName'].lastIndexOf(".") + 1);
filext = filext.toLowerCase();
}
if (Known_File.indexOf(filext) == -1) {
//Unknown file type.
filext = "unknown";
}
var newFileElement = "";
new Insertion.Bottom(rootElement, newFileElement);
var uploadedFiles = $F(p.fileField).split(",");
if ($F(p.fileField)=='' || uploadedFiles == null) {
uploadedFiles = new Array();
}
uploadedFiles.push(jsonObj['id']);
var uploadedFilesStr = "";
for (var i = 0; i < uploadedFiles.length; i++) {
if ( i != 0 ) {
uploadedFilesStr += ",";
}
uploadedFilesStr += uploadedFiles[i];
}
$(p.fileField).value = uploadedFilesStr;
if (uploadedFiles.length < p.files) {
$(p.fileField+"_file").show();
}
if (otherFileStatus != null && otherFileStatus.length > 0) {
var allFileFields = $(p.form).getElementsByTagName("input");
var j = 0;
for (var i = 0; i < allFileFields.length; i++) {
var oneFileField = allFileFields[i];
if("file" == oneFileField.type && oneFileField.id != p.fileField+"_file") {
if (otherFileStatus[j] == 0) {
oneFileField.disabled = true;
} else {
oneFileField.disabled = false;
}
j++;
}
}
}
window.open("/eService/js/session.jsp?p1="+jsonObj['fileName']+"&p2="+jsonObj['id'], target="upload");//���ɦW��id�����ê�iframe
}
function SmartUpload_delete(id, fileField) {
//remove
if ($('file_info_' + id)) {
$('file_info_' + id).remove();
}
var uploadedFiles = $F(fileField).split(",");
var uploadedFilesStr = "";
for (var i = 0; i < uploadedFiles.length; i++) {
if (uploadedFiles[i] == id) {
continue;
}
uploadedFilesStr += "," + uploadedFiles[i];
}
if (uploadedFilesStr.substring(0, 1) == ",") {
uploadedFilesStr = uploadedFilesStr.substring(1);
}
$(fileField).value = uploadedFilesStr;
$(fileField+"_file").show();
}
function SmartUpload_error(parameter, id) {
var p = parameter.evalJSON();
var bar1 = $(p.fileField+"_bar1");
bar1.hide();
var rootElement = bar1.parentElement;
new Insertion.Bottom(rootElement, "File format incorrect or size exceed,
ok.
");
if (otherFileStatus != null && otherFileStatus.length > 0) {
var allFileFields = $(p.form).getElementsByTagName("input");
var j = 0;
for (var i = 0; i < allFileFields.length; i++) {
var oneFileField = allFileFields[i];
if("file" == oneFileField.type.toLowerCase() && oneFileField.id != p.fileField+"_file") {
//alert(oneFileField.id);
if (otherFileStatus[j] == 0) {
oneFileField.disabled = true;
} else {
oneFileField.disabled = false;
}
j++;
}
//oneFileField.value="";
}
}
}
function SmartUpload_confirm_error(id, fileField) {
if ($('file_error_' + id)) {
$('file_error_' + id).remove();
}
//alert(fileField);
//$(fileField+"_file").value="123";
//alert($(fileField+"_file").value);
$(fileField+"_file").show();
}
function SmartUpload_download(files, style) {
//alert(files);
if (files == null || files == '' || files == 'null' || isNaN(files) || files==0) {
return;
}
if (style == null || style <=0) {
style = 1;
}
var fileList = files.split(",");
//alert("fileList.length: "+fileList.length);
for (var i=0; iloading...";
document.write(newFileElement);
new Ajax.Request(SmartUpload_Config.downloadStatusServer, {
method: 'get',
parameters: '?smartid=' + id + "&r=" + (new Date()).getTime(),
onComplete: function(transport) {
jsonObj = transport.responseText.evalJSON(true);
var filext = "unknown";
if (jsonObj['fileName'].lastIndexOf(".")>0) {
filext = jsonObj['fileName'].substring(jsonObj['fileName'].lastIndexOf(".") + 1);
filext = filext.toLowerCase();
}
if (Known_File.indexOf(filext) == -1) {
//Unknown file type.
filext = "unknown";
}
var fileDetail = "";
if (filext != "") {
fileDetail += "";
}
fileDetail += jsonObj['fileName']+"("+byte2HumanRead(jsonObj['fileSize'], 2)+")"
fileDetail += "";
if (canDelete) {
fileDetail += ", delete";
}
if (document.getElementsByName("file_info_" + id).length > 1) {
for (var i=0; i < document.getElementsByName("file_info_" + id).length; i++) {
document.getElementsByName("file_info_" + id)[i].innerHTML = fileDetail;
}
}
else {
$("file_info_" + id).innerHTML = fileDetail;
}
}
});
}
function SmartUpload_getfile_style2(id) {
var newFileElement = "loading...
";
document.write(newFileElement);
new Ajax.Request(SmartUpload_Config.downloadStatusServer, {
method: 'get',
parameters: '?smartid=' + id + "&r=" + (new Date()).getTime(),
onComplete: function(transport) {
jsonObj = transport.responseText.evalJSON(true);
var filext = "unknown";
if (jsonObj['fileName'].lastIndexOf(".")>0) {
filext = jsonObj['fileName'].substring(jsonObj['fileName'].lastIndexOf(".") + 1);
filext = filext.toLowerCase();
}
if (Known_File.indexOf(filext) == -1) {
//Unknown file type.
filext = "unknown";
}
var tooltip = jsonObj['fileName']+"("+byte2HumanRead(jsonObj['fileSize'], 2)+")";
var fileDetail = "";
if (filext != "") {
fileDetail += "";
}
fileDetail += "";
//alert(fileDetail);
if (document.getElementsByName("file_info_" + id).length > 1) {
for (var i=0; i < document.getElementsByName("file_info_" + id).length; i++) {
document.getElementsByName("file_info_" + id)[i].innerHTML = fileDetail;
}
}
else {
$("file_info_" + id).innerHTML = fileDetail;
}
}
});
}
function byte2HumanRead(bytes, n) {
var K = 1024;
var M = 1024 * 1024;
var G = 1024 * 1024 * 1024;
if (bytes > G) {
return Math.round(Number(bytes/G)*Math.pow(10,n))/Math.pow(10,n) + "GB";
} else if (bytes > M) {
return Math.round(Number(bytes/M)*Math.pow(10,n))/Math.pow(10,n) + "MB";
} else if (bytes > K) {
return Math.round(Number(bytes/K)*Math.pow(10,n))/Math.pow(10,n) + "KB";
} else {
return bytes + "B";
}
}