/* uploadifive 1.2.2 copyright (c) 2012 reactive apps, ronnie garcia released under the uploadifive standard license */ ; (function(b) { var a = { init : function(c) { return this .each(function() { var g = b(this); g.data("fileupload", { inputs : {}, inputcount : 0, fileid : 0, queue : { count : 0, selected : 0, replaced : 0, errors : 0, queued : 0, cancelled : 0 }, uploads : { current : 0, attempts : 0, successful : 0, errors : 0, count : 0 } }); var d = g.data("fileupload"); var f = d.settings = b.extend({ auto : true, buttonclass : false, buttontext : "添加附件", checkscript : false, dnd : true, droptarget : false, fileobjname : "filedata", filessizelimit : 0, filetypeexts : "*.*", formdata : {}, height : 30, itemtemplate : false, method : "post", multi : true, overrideevents : [], queueid : false, queuesizelimit : 0, removecompleted : false, simuploadlimit : 0, truncatelength : 0, uploadlimit : 0, uploadscript : "uploadifive.php", width : 100 }, c); if (isnan(f.filessizelimit)) { var e = parseint(f.filessizelimit) * 1.024; if (f.filessizelimit.indexof("kb") > -1) { f.filessizelimit = e * 1000; } else { if (f.filessizelimit.indexof("mb") > -1) { f.filessizelimit = e * 1000000; } else { if (f.filessizelimit.indexof("gb") > -1) { f.filessizelimit = e * 1000000000; } } } } else { f.filessizelimit = f.filessizelimit * 1024; } d.inputtemplate = b('').css({ "font-size" : f.height + "px", opacity : 0, position : "absolute", right : "-3px", top : "-3px", "z-index" : 999 }); d.createinput = function() { var j = d.inputtemplate.clone(); var k = j.name = "input" + d.inputcount++; if (f.multi) { j.attr("multiple", true); } if (f.filetypeexts) { j.attr("accept", f.filetypeexts); } j .bind( "change", function() { d.queue.selected = 0; d.queue.replaced = 0; d.queue.errors = 0; d.queue.queued = 0; var l = this.files.length; d.queue.selected = l; if ((d.queue.count + l) > f.queuesizelimit && f.queuesizelimit !== 0) { if (b.inarray("onerror", f.overrideevents) < 0) { alert("the maximum number of queue items has been reached (" + f.queuesizelimit + "). please select fewer files."); } if (typeof f.onerror === "function") { f.onerror .call(g, "queue_limit_exceeded"); } } else { for (var m = 0; m < l; m++) { file = this.files[m]; d.addqueueitem(file); } d.inputs[k] = this; d.createinput(); } if (f.auto) { a.upload.call(g); } if (typeof f.onselect === "function") { f.onselect.call(g, d.queue); } }); if (d.currentinput) { d.currentinput.hide(); } d.button.append(j); d.currentinput = j; }; d.destroyinput = function(j) { b(d.inputs[j]).remove(); delete d.inputs[j]; d.inputcount--; }; d.drop = function(m) { d.queue.selected = 0; d.queue.replaced = 0; d.queue.errors = 0; d.queue.queued = 0; var l = m.datatransfer; var k = l.name = "input" + d.inputcount++; var j = l.files.length; d.queue.selected = j; if ((d.queue.count + j) > f.queuesizelimit && f.queuesizelimit !== 0) { if (b.inarray("onerror", f.overrideevents) < 0) { alert("the maximum number of queue items has been reached (" + f.queuesizelimit + "). please select fewer files."); } if (typeof f.onerror === "function") { f.onerror.call(g, "queue_limit_exceeded"); } } else { for (var o = 0; o < j; o++) { file = l.files[o]; d.addqueueitem(file); } d.inputs[k] = l; } if (f.auto) { a.upload.call(g); } if (typeof f.ondrop === "function") { f.ondrop.call(g, l.files, l.files.length); } m.preventdefault(); m.stoppropagation(); }; d.fileexistsinqueue = function(k) { for ( var j in d.inputs) { input = d.inputs[j]; limit = input.files.length; for (var l = 0; l < limit; l++) { existingfile = input.files[l]; if (existingfile.name == k.name && !existingfile.complete) { return true; } } } return false; }; d.removeexistingfile = function(k) { for ( var j in d.inputs) { input = d.inputs[j]; limit = input.files.length; for (var l = 0; l < limit; l++) { existingfile = input.files[l]; if (existingfile.name == k.name && !existingfile.complete) { d.queue.replaced++; a.cancel.call(g, existingfile, true); } } } }; if (f.itemtemplate == false) { d.queueitem = b('
x
'); } else { d.queueitem = b(f.itemtemplate); } d.addqueueitem = function(j) { if (b.inarray("onaddqueueitem", f.overrideevents) < 0) { d.removeexistingfile(j); j.queueitem = d.queueitem.clone(); j.queueitem.attr("id", f.id + "-file-" + d.fileid++); j.queueitem.find(".close").bind("click", function() { a.cancel.call(g, j); return false; }); var k = j.name; if (k.length > f.truncatelength && f.truncatelength != 0) { k = k.substring(0, f.truncatelength) + "..."; } j.queueitem.find(".filename").html(k); j.queueitem.data("file", j); d.queueel.append(j.queueitem); } if (typeof f.onaddqueueitem === "function") { f.onaddqueueitem.call(g, j); } if (j.size > f.filessizelimit && f.filessizelimit != 0) { d.error("file_size_limit_exceeded", j); } else { d.queue.queued++; d.queue.count++; } }; d.removequeueitem = function(m, l, k) { if (!k) { k = 0; } var j = l ? 0 : 500; if (m.queueitem) { if (m.queueitem.find(".fileinfo").html() != " - completed") { m.queueitem.find(".fileinfo").html( " - cancelled"); } m.queueitem.find(".progress-bar").width(0); m.queueitem.delay(k).fadeout(j, function() { b(this).remove(); }); delete m.queueitem; d.queue.count--; } }; d.filestoupload = function() { var k = 0; for ( var j in d.inputs) { input = d.inputs[j]; limit = input.files.length; for (var l = 0; l < limit; l++) { file = input.files[l]; if (!file.skip && !file.complete) { k++; } } } return k; }; d.checkexists = function(k) { if (b.inarray("oncheck", f.overrideevents) < 0) { b.ajaxsetup({ async : false }); var j = b.extend(f.formdata, { filename : k.name }); b.post(f.checkscript, j, function(l) { k.exists = parseint(l); }); if (k.exists) { if (!confirm("a file named " + k.name + " already exists in the upload folder.\nwould you like to replace it?")) { a.cancel.call(g, k); return true; } } } if (typeof f.oncheck === "function") { f.oncheck.call(g, k, k.exists); } return false; }; d.uploadfile = function(k, l) { if (!k.skip && !k.complete && !k.uploading) { k.uploading = true; d.uploads.current++; d.uploads.attempted++; xhr = k.xhr = new xmlhttprequest(); if (typeof formdata === "function" || typeof formdata === "object") { var m = new formdata(); m.append(f.fileobjname, k); for (i in f.formdata) { m.append(i, f.formdata[i]); } xhr.open(f.method, f.uploadscript, true); xhr.upload.addeventlistener("progress", function(n) { if (n.lengthcomputable) { d.progress(n, k); } }, false); xhr .addeventlistener( "load", function(n) { if (this.readystate == 4) { k.uploading = false; if (this.status == 200) { if (k.xhr.responsetext !== "invalid file type.") { d .uploadcomplete( n, k, l); } else { d .error( k.xhr.responsetext, k, l); } } else { if (this.status == 404) { d .error( "404_file_not_found", k, l); } else { if (this.status == 403) { d .error( "403_forbidden", k, l); } else { d .error( "unknown error", k, l); } } } } }); xhr.send(m); } else { var j = new filereader(); j.onload = function(q) { var t = "-------------------------" + (new date).gettime(), p = "--", o = "\r\n", s = ""; s += p + t + o; s += 'content-disposition: form-data; name="' + f.fileobjname + '"'; if (k.name) { s += '; filename="' + k.name + '"'; } s += o; s += "content-type: application/octet-stream" + o + o; s += q.target.result + o; for (key in f.formdata) { s += p + t + o; s += 'content-disposition: form-data; name="' + key + '"' + o + o; s += f.formdata[key] + o; } s += p + t + p + o; xhr.upload.addeventlistener("progress", function(u) { d.progress(u, k); }, false); xhr .addeventlistener( "load", function(v) { k.uploading = false; var u = this.status; if (u == 404) { d .error( "404_file_not_found", k, l); } else { if (k.xhr.responsetext != "invalid file type.") { d .uploadcomplete( v, k, l); } else { d .error( k.xhr.responsetext, k, l); } } }, false); var n = f.uploadscript; if (f.method == "get") { var r = b(f.formdata).param(); n += r; } xhr .open(f.method, f.uploadscript, true); xhr.setrequestheader("content-type", "multipart/form-data; boundary=" + t); if (typeof f.onuploadfile === "function") { f.onuploadfile.call(g, k); } xhr.sendasbinary(s); }; j.readasbinarystring(k); } } }; d.progress = function(l, j) { if (b.inarray("onprogress", f.overrideevents) < 0) { if (l.lengthcomputable) { var k = math .round((l.loaded / l.total) * 100); } j.queueitem.find(".fileinfo").html( " - " + k + "%"); j.queueitem.find(".progress-bar").css("width", k + "%"); } if (typeof f.onprogress === "function") { f.onprogress.call(g, j, l); } }; d.error = function(l, j, k) { if (b.inarray("onerror", f.overrideevents) < 0) { switch (l) { case "404_file_not_found": errormsg = "404 error"; break; case "403_forbidden": errormsg = "403 forbidden"; break; case "forbidden_file_type": errormsg = "forbidden file type"; break; case "file_size_limit_exceeded": errormsg = "file too large"; break; default: errormsg = "unknown error"; break; } j.queueitem.addclass("error").find(".fileinfo") .html(" - " + errormsg); j.queueitem.find(".progress").remove(); } if (typeof f.onerror === "function") { f.onerror.call(g, l, j); } j.skip = true; if (l == "404_file_not_found") { d.uploads.errors++; } else { d.queue.errors++; } if (k) { a.upload.call(g, null, true); } }; d.uploadcomplete = function(l, j, k) { if (b.inarray("onuploadcomplete", f.overrideevents) < 0) { j.queueitem.find(".progress-bar").css("width", "100%"); j.queueitem.find(".fileinfo").html( " - completed"); j.queueitem.find(".progress").slideup(250); j.queueitem.addclass("complete"); } if (typeof f.onuploadcomplete === "function") { f.onuploadcomplete.call(g, j, j.xhr.responsetext); } if (f.removecompleted) { settimeout(function() { a.cancel.call(g, j); }, 3000); } j.complete = true; d.uploads.successful++; d.uploads.count++; d.uploads.current--; delete j.xhr; if (k) { a.upload.call(g, null, true); } }; d.queuecomplete = function() { if (typeof f.onqueuecomplete === "function") { f.onqueuecomplete.call(g, d.uploads); } }; // check if html5 is available if (window.file && window.filelist && window.blob && (window.filereader || window.formdata)) { f.id = "uploadifive-" + g.attr("id"); d.button = b('
' + f.buttontext + "
"); if (f.buttonclass) { d.button.addclass(f.buttonclass); } d.button.css({ height : f.height, "line-height" : f.height + "px", overflow : "hidden", position : "relative", "text-align" : "center", width : f.width }); g.before(d.button).appendto(d.button).hide(); d.createinput.call(g); if (!f.queueid) { f.queueid = f.id + "-queue"; d.queueel = b('
'); d.button.after(d.queueel); } else { d.queueel = b("#" + f.queueid); } if (f.dnd) { var h = f.droptarget ? b(f.droptarget) : d.queueel.get(0); h.addeventlistener("dragleave", function(j) { j.preventdefault(); j.stoppropagation(); }, false); h.addeventlistener("dragenter", function(j) { j.preventdefault(); j.stoppropagation(); }, false); h.addeventlistener("dragover", function(j) { j.preventdefault(); j.stoppropagation(); }, false); h.addeventlistener("drop", d.drop, false); } if (!xmlhttprequest.prototype.sendasbinary) { xmlhttprequest.prototype.sendasbinary = function( k) { function l(n) { return n.charcodeat(0) & 255; } var m = array.prototype.map.call(k, l); var j = new uint8array(m); this.send(j.buffer); }; } if (typeof f.oninit === "function") { f.oninit.call(g); } } else { if (typeof f.onfallback === "function") { f.onfallback.call(g); } return false; } }); }, debug : function() { return this.each(function() { console.log(b(this).data("fileupload")); }); }, clearqueue : function() { this.each(function() { var f = b(this), c = f.data("fileupload"), e = c.settings; for ( var d in c.inputs) { input = c.inputs[d]; limit = input.files.length; for (i = 0; i < limit; i++) { file = input.files[i]; a.cancel.call(f, file); } } if (typeof e.onclearqueue === "function") { e.onclearqueue.call(f, b("#" + c.settings.queueid)); } }); }, cancel : function(d, c) { this.each(function() { var g = b(this), e = g.data("fileupload"), f = e.settings; if (typeof d === "string") { if (!isnan(d)) { fileid = "uploadifive-" + b(this).attr("id") + "-file-" + d; } d = b("#" + fileid).data("file"); } d.skip = true; e.filescancelled++; if (d.uploading) { e.uploads.current--; d.uploading = false; d.xhr.abort(); delete d.xhr; a.upload.call(g); } if (b.inarray("oncancel", f.overrideevents) < 0) { e.removequeueitem(d, c); } if (typeof f.oncancel === "function") { f.oncancel.call(g, d); } }); }, upload : function(c, d) { this .each(function() { var h = b(this), e = h.data("fileupload"), f = e.settings; if (c) { e.uploadfile.call(h, c); } else { if ((e.uploads.count + e.uploads.current) < f.uploadlimit || f.uploadlimit == 0) { if (!d) { e.uploads.attempted = 0; e.uploads.successsful = 0; e.uploads.errors = 0; var g = e.filestoupload(); if (typeof f.onupload === "function") { f.onupload.call(h, g); } } b("#" + f.queueid) .find(".uploadifive-queue-item") .not(".error, .complete") .each( function() { _file = b(this) .data("file"); if ((e.uploads.current >= f.simuploadlimit && f.simuploadlimit !== 0) || (e.uploads.current >= f.uploadlimit && f.uploadlimit !== 0) || (e.uploads.count >= f.uploadlimit && f.uploadlimit !== 0)) { return false; } if (f.checkscript) { _file.checking = true; skipfile = e .checkexists(_file); _file.checking = false; if (!skipfile) { e.uploadfile(_file, true); } } else { e.uploadfile(_file, true); } }); if (b("#" + f.queueid).find( ".uploadifive-queue-item").not( ".error, .complete").size() == 0) { e.queuecomplete(); } } else { if (e.uploads.current == 0) { if (b.inarray("onerror", f.overrideevents) < 0) { if (e.filestoupload() > 0 && f.uploadlimit != 0) { alert("the maximum upload limit has been reached."); } } if (typeof f.onerror === "function") { f.onerror.call(h, "upload_limit_exceeded", e .filestoupload()); } } } } }); }, destroy : function() { this.each(function() { var e = b(this), c = e.data("fileupload"), d = c.settings; a.clearqueue.call(e); if (!d.queueid) { b("#" + d.queueid).remove(); } e.siblings("input").remove(); e.show().insertbefore(c.button); c.button.remove(); if (typeof d.ondestroy === "function") { d.ondestroy.call(e); } }); } }; b.fn.fileupload = function(c) { if (a[c]) { return a[c].apply(this, array.prototype.slice.call(arguments, 1)); } else { if (typeof c === "object" || !c) { return a.init.apply(this, arguments); } else { b.error("the method " + c + " does not exist in $.uploadify"); } } }; })(jquery);