[zeam.form.silva][Sylvain Viollon] Implement plan D.

[email protected]
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Sylvain Viollon
date:      Mon Jul 29 15:36:09 2013 +0200
revision:  416:3111f4b56137 in zeam.form.silva
branch:    2.4
details:   https://hg.infrae.com/zeam.form.silva?cmd=changeset;node=3111f4b56137
modified:  src/zeam/form/silva/widgets/static/upload.js src/zeam/form/silva/widgets/static/upload.min.js
added:     
removed:   
log:       Implement plan D.


diffstat:

 src/zeam/form/silva/widgets/static/upload.js     |  195 +++++++++++-----------
 src/zeam/form/silva/widgets/static/upload.min.js |    2 +-
 2 files changed, 98 insertions(+), 99 deletions(-)

diffs (294 lines):

diff -r 69da39ba67e7 -r 3111f4b56137 src/zeam/form/silva/widgets/static/upload.js
--- a/src/zeam/form/silva/widgets/static/upload.js	Mon Jul 29 14:29:42 2013 +0200
+++ b/src/zeam/form/silva/widgets/static/upload.js	Mon Jul 29 15:36:09 2013 +0200
@@ -15,8 +15,71 @@
         return supported;
     })();
 
+    /**
+     * Status checker report the status of the upload to the uploader.
+     */
 
-    var IFrameLoad = function($iframe, name)  {
+    var PollStatusChecker = function(url, identifier, result) {
+        var poll_retries = POLL_NETWORK_RETRIES,
+            poll_timeout = null,
+            missing_retries = POLL_MISSING_RETRIES,
+            deferred = $.Deferred(),
+            poll = function() {
+                // Poll status from the server.
+                $.ajax({
+                    type: 'GET',
+                    dataType: 'json',
+                    url: url + '?status&identifier=' + identifier
+                }).then(function(info){
+                    var error = null;
+
+                    result.notify(info);
+                    if (info['missing']) {
+                        missing_retries -= 1;
+                        if (!missing_retries) {
+                            error = info['upload-error'] || 'unknow error';
+                            deferred.reject({message: 'Upload failed ('+ error + ').'});
+                        };
+                    };
+                    if (info['upload-finished'] || info['upload-error']) {
+                        if (info['upload-finished'] && !info['upload-error']) {
+                            deferred.resolve(info);
+                        } else {
+                            error = info['upload-error'] || 'unknow error';
+                            deferred.reject({message: 'Upload failed ('+ error + ').'});
+                        };
+                    } else if (result.state() == "pending" && missing_retries) {
+                        // Unless the file is completely uploaded or
+                        // cancel request status again.
+                        poll_retries = POLL_NETWORK_RETRIES;
+                        poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
+                    };
+                }, function() {
+                    if (result.state() == "pending") {
+                        if (poll_retries) {
+                            poll_retries -= 1;
+                            poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
+                        } else {
+                            deferred.reject({message: 'Status check failed: cannot upload file.'});
+                        }
+                    }
+                });
+            };
+        return {
+            promise: deferred.promise,
+            start: function() {
+                poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
+            },
+            always: function() {
+                if (poll_timeout !== null) {
+                    clearTimeout(poll_timeout);
+                    poll_timeout = null;
+                };
+            }
+        };
+    };
+
+    var IFrameStatusChecker = function($iframe, name, result)  {
         // helper to bind an event on iframe load
         var iframe = $iframe.get(0),
             iframe_window = iframe.contentWindow,
@@ -24,7 +87,7 @@
             deferred = $.Deferred();
 
         var fail = function() {
-            deferred.reject();
+            deferred.reject({message: 'Upload failed (file too big or server error).'});
         };
 
         $(document).one(name, function(event, data) {
@@ -37,9 +100,15 @@
             iframe_window.attachEvent("onload", fail);
             iframe_window.attachEvent("onerror", fail);
         };
-        return deferred.promise();
+        return {
+            promise: deferred.promise
+        };
     };
 
+    /**
+     * UI compoments.
+     */
+
     var UploadStatusMessage = function($display) {
         // Manage the status message of the upload widget.
         var $empty = $display.children('.upload-display-empty'),
@@ -122,7 +191,7 @@
     };
 
     var UploadUI = function($field, set_objection, get_upload) {
-        // Manage the controls of the upload widget.
+        // Manage the controls of the upload widget (clear, cancel button).
         var $input = $field.children('.upload-input'),
             $cancel = $field.children('.upload-cancel'),
             $clear = $field.children('.upload-clear');
@@ -209,6 +278,10 @@
         return api;
     };
 
+    /**
+     * Implementations for the uploading (with and without popup).
+     */
+
     var UploadForm = function($field, identifier, url) {
         // Upload a file input using the given identifier at the given URL.
         // It will trigger callbacks uring various steps of the progress.
@@ -221,65 +294,21 @@
                         '" target="upload-' + identifier +
                         '-iframe" id="upload-' + identifier + '-form">' +
                         '<input type="reset" class="upload-reset" /></form></div>'),
-            poll_retries = POLL_NETWORK_RETRIES,
-            poll_timeout = null,
-            missing_retries = POLL_MISSING_RETRIES,
             result = $.Deferred().fail(function() {
                 $upload.find('.upload-reset').click();
                 $upload.find('.upload-iframe').attr('src', 'javascript:false;');
             }).always(function() {
-                if (poll_timeout !== null) {
-                    clearTimeout(poll_timeout);
-                    poll_timeout = null;
-                };
                 $upload.remove();
                 $field.removeAttr('form');
             }),
-            start = $.Deferred().done(function() {
-                poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
-            }),
-            poll = function() {
-                // Poll status from the server.
-                $.ajax({
-                    type: 'GET',
-                    dataType: 'json',
-                    url: url + '?status&identifier=' + identifier
-                }).then(function(info){
-                    result.notify(info);
-                    if(info['missing']) {
-                        missing_retries -= 1;
-                        if (!missing_retries) {
-                            result.reject({message: 'File does not upload. (is it too big ?)'});
-                        };
-                    };
-                    if (!info['upload-finished'] && result.state() == "pending" && missing_retries) {
-                        // Unless the file is completely uploaded or
-                        // cancel request status again.
-                        poll_retries = POLL_NETWORK_RETRIES;
-                        poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
-                    };
-                }, function() {
-                    if (result.state() == "pending") {
-                        if (poll_retries) {
-                            poll_retries -= 1;
-                            poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
-                        } else {
-                            result.reject({message: 'Status check failed: cannot upload file.'});
-                        }
-                    }
-                });
-            },
+            start = $.Deferred(),
             api = {
                 start: function() {
                     $('body').append($upload);
                     $field.attr('form', 'upload-' + identifier + '-form');
                     start.done(function() {
-                        IFrameLoad($upload.find('iframe'), 'upload-' + identifier + '-done').fail(
-                            function() {
-                                result.reject({message: 'Upload failed (file too big or server error).'});
-                            }).done(function (data) {
-                                result.resolve(data);
-                            });
+                        api.register(IFrameStatusChecker($upload.find('iframe'), 'upload-' + identifier + '-done'));
+                        api.register(PollStatusChecker(url, identifier, result));
                         $upload.find('form').submit();
                     }).resolve({
                         'uploaded-length': 0, 'content-type': 'n/a', 'request-length': 0, 'filename': ''});
@@ -291,6 +320,13 @@
                     if (plugin.start !== undefined) {
                         start.done(plugin.start);
                     };
+                    if (plugin.promise !== undefined) {
+                        plugin.promise().then(function(data) {
+                            result.resolve(data);
+                        }, function(data) {
+                            result.reject(data);
+                        });
+                    };
                     for (var event in {progress: 1, done: 1, fail: 1, always: 1}) {
                         if (plugin[event] !== undefined) {
                             result[event](plugin[event]);
@@ -314,63 +350,19 @@
                        '<iframe width="0" height="0" style="display:none"' +
                        'src="about:blank" class="upload-iframe" name="upload-' +
                        identifier + '-iframe"></iframe></div>'),
-            poll_retries = POLL_NETWORK_RETRIES,
-            poll_timeout = null,
-            missing_retries = POLL_MISSING_RETRIES,
             result = $.Deferred().fail(function() {
                 $popup.find('.upload-iframe').attr('src', 'javascript:false;');
             }).always(function() {
-                if (poll_timeout !== null) {
-                    clearTimeout(poll_timeout);
-                    poll_timeout = null;
-                };
                 $popup.remove();
             }),
-            start = $.Deferred().done(function() {
-                poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
-            }),
-            poll = function() {
-                // Poll status from the server.
-                $.ajax({
-                    type: 'GET',
-                    dataType: 'json',
-                    url: url + '?status&identifier=' + identifier
-                }).then(function(info){
-                    result.notify(info);
-                    if (info['missing']) {
-                        missing_retries -= 1;
-                        if (!missing_retries) {
-                            result.reject({message: 'File does not upload. (is it too big ?)'});
-                        };
-                    };
-                    if (!info['upload-finished'] && result.state() == "pending" && missing_retries) {
-                        // Unless the file is completely uploaded or
-                        // cancel request status again.
-                        poll_retries = POLL_NETWORK_RETRIES;
-                        poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
-                    };
-                }, function() {
-                    if (result.state() == "pending") {
-                        if (poll_retries) {
-                            poll_retries -= 1;
-                            poll_timeout = setTimeout(poll, POLL_NETWORK_DELAY);
-                        } else {
-                            result.reject({message: 'Status check failed: cannot upload file.'});
-                        }
-                    }
-                });
-            },
+            start = $.Deferred(),
             api = {
                 start: function() {
                     var send = function() {
                         start.done(function() {
                             $popup.dialog('close');
-                            IFrameLoad($popup.find('iframe'), 'upload-' + identifier + '-done').fail(
-                                function() {
-                                    result.reject({message: 'Upload failed (file too big or server error).'});
-                                }).done(function (data) {
-                                    result.resolve(data);
-                                });
+                            api.register(IFrameStatusChecker($popup.find('iframe'), 'upload-' + identifier + '-done'));
+                            api.register(PollStatusChecker(url, identifier, result));
                             $popup.find('form').submit();
                         }).resolve({
                             'uploaded-length': 0, 'content-type': 'n/a', 'request-length': 0, 'filename': ''});
@@ -393,6 +385,13 @@
                     if (plugin.start !== undefined) {
                         start.done(plugin.start);
                     };
+                    if (plugin.promise !== undefined) {
+                        plugin.promise().then(function(data) {
+                            result.resolve(data);
+                        }, function(data) {
+                            result.reject(data);
+                        });
+                    };
                     for (var event in {progress: 1, done: 1, fail: 1, always: 1}) {
                         if (plugin[event] !== undefined) {
                             result[event](plugin[event]);
diff -r 69da39ba67e7 -r 3111f4b56137 src/zeam/form/silva/widgets/static/upload.min.js
--- a/src/zeam/form/silva/widgets/static/upload.min.js	Mon Jul 29 14:29:42 2013 +0200
+++ b/src/zeam/form/silva/widgets/static/upload.min.js	Mon Jul 29 15:36:09 2013 +0200
@@ -1,1 +1,1 @@
-(function($,jsontemplate){var POLL_NETWORK_RETRIES=5,POLL_NETWORK_DELAY=500,POLL_MISSING_RETRIES=20,DONT_NEED_POPUP=function(){var $test=$('<div style="display:none;"><form id="testform1"><input type="file" form="testform2" /></form><form id="testform2"></form></div>'),supported=!1;return $("body").append($test),supported=0===$test.find("#testform1")[0].length&&1===$test.find("#testform2")[0].length,$test.remove(),supported}(),IFrameLoad=function($iframe,name){var iframe=$iframe.get(0),iframe_window=iframe.contentWindow,deferred=(iframe_window.document,$.Deferred()),fail=function(){deferred.reject()};return $(document).one(name,function(event,data){deferred.resolve(data)}),iframe_window.addEventListener?(iframe_window.addEventListener("load",fail,!1),iframe_window.addEventListener("error"
 ,fail,!1)):(iframe_window.attachEvent("onload",fail),iframe_window.attachEvent("onerror",fail)),deferred.promise()},UploadStatusMessage=function($display){var $empty=$display.children(".uplo
 ad-display-empty"),$uploading=$display.children(".upload-display-uploading"),$done=$display.children(".upload-display-complete"),empty=$empty.children("i").text(),uploading=jsontemplate.Template($uploading.children("i").text(),{}),done=jsontemplate.Template($done.children("i").text(),{}),state="empty",original=$display.data("upload-status"),api={start:function(data){"starting"!=state&&($uploading.children("i").text(uploading.expand(data)),$empty.hide(),$done.hide(),$uploading.show(),state="starting")},progress:function(data){"uploading"==state||data.missing||($uploading.children("i").text(uploading.expand(data)),state="uploading")},done:function(data){"done"!=state&&($done.children("i").text(done.expand(data)),$empty.hide(),$uploading.hide(),$done.show(),state="done")},fail:function(data)
 {("empty"!=state||data.message)&&($empty.children("i").text(data.message||empty),"empty"!=state&&($uploading.hide(),$done.hide(),$empty.show(),state="empty"))}};return original&&api.done(ori
 ginal),api},UploadProgress=function($progress){var progress=0;return{start:function(){$progress.progressbar({value:0}).show()},progress:function(data){var updated=0;data.missing||(updated=100*data["uploaded-length"]/data["request-length"]),updated!=progress&&($progress.progressbar({value:updated}),progress=updated)},always:function(){$progress.hide(),progress=0}}},UploadUI=function($field,set_objection,get_upload){var $input=$field.children(".upload-input"),$cancel=$field.children(".upload-cancel"),$clear=$field.children(".upload-clear"),upload=null,objection=null,progress=UploadProgress($field.children(".upload-progress")),status=UploadStatusMessage($field.children(".upload-display")),api={get:function(create){return null==upload&&create&&(upload=get_upload(),upload.register(status),uplo
 ad.register(progress),upload.register(ui)),upload}},ui={start:function(){void 0!==set_objection&&(objection=$.Deferred(),set_objection(function(){if("pending"==objection.state()){var $dialog
 =$('<div title="Uploading file"><p>Please wait until the upload is finished ...</p><p class="progress"></p></div>'),$progress=$dialog.find("p.progress"),progress=0;return $dialog.dialog({modal:!0,closeOnEscape:!1,resizable:!1,draggable:!1,beforeClose:function(){return!1}}),$progress.progressbar({value:0}),api.get().register({progress:function(data){var updated=0;data.missing||(updated=100*data["uploaded-length"]/data["request-length"]),updated!=progress&&($progress.progressbar({value:updated}),progress=updated)}}),objection.always(function(){$dialog.dialog("close").remove(),objection=null})}return null})),$cancel.show()},done:function(){$input.attr("value",$field.data("upload-identifier"))},always:function(){null!==objection&&objection.resolve(),$cancel.hide(),upload=null}};return $cancel
 .on("click",function(){var upload=api.get();null!==upload&&upload.cancel()}),$clear.on("click",function(){var upload=api.get(!0);upload.cancel(),$input.attr("value","")}),api},UploadForm=fun
 ction($field,identifier,url){var $upload=$('<div style="display:none"><iframe width="0" height="0" style="display:none"src="about:blank" class="upload-iframe" name="upload-'+identifier+'-iframe"></iframe>'+'<form class="upload-form" enctype="multipart/form-data"'+'method="POST" action="'+url+"?identifier="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="reset" class="upload-reset" /></form></div>'),poll_retries=POLL_NETWORK_RETRIES,poll_timeout=null,missing_retries=POLL_MISSING_RETRIES,result=$.Deferred().fail(function(){$upload.find(".upload-reset").click(),$upload.find(".upload-iframe").attr("src","javascript:false;")}).always(function(){null!==poll_timeout&&(clearTimeout(poll_timeout),poll_timeout=null),$upload.remove(),$field.removeA
 ttr("form")}),start=$.Deferred().done(function(){poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)}),poll=function(){$.ajax({type:"GET",dataType:"json",url:url+"?status&identifier="+identifie
 r}).then(function(info){result.notify(info),info.missing&&(missing_retries-=1,missing_retries||result.reject({message:"File does not upload. (is it too big ?)"})),!info["upload-finished"]&&"pending"==result.state()&&missing_retries&&(poll_retries=POLL_NETWORK_RETRIES,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY))},function(){"pending"==result.state()&&(poll_retries?(poll_retries-=1,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)):result.reject({message:"Status check failed: cannot upload file."}))})},api={start:function(){$("body").append($upload),$field.attr("form","upload-"+identifier+"-form"),start.done(function(){IFrameLoad($upload.find("iframe"),"upload-"+identifier+"-done").fail(function(){result.reject({message:"Upload failed (file too big or server error)."})}).done(function(d
 ata){result.resolve(data)}),$upload.find("form").submit()}).resolve({"uploaded-length":0,"content-type":"n/a","request-length":0,filename:""})},cancel:function(){result.reject({})},register:
 function(plugin){void 0!==plugin.start&&start.done(plugin.start);for(var event in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadPopup=function(identifier,url){var $popup=$('<div  title="Upload a file"><form class="upload-form" enctype="multipart/form-data"method="POST" action="'+url+"?identifier="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="file" name="file-we-are-uploading" class="upload-file" /></form>'+'<iframe width="0" height="0" style="display:none"'+'src="about:blank" class="upload-iframe" name="upload-'+identifier+'-iframe"></iframe></div>'),poll_retries=POLL_NETWORK_RETRIES,poll_timeout=null,missing_retries=POLL_MISSING_RETRIES,result=$.Deferred().fail(
 function(){$popup.find(".upload-iframe").attr("src","javascript:false;")}).always(function(){null!==poll_timeout&&(clearTimeout(poll_timeout),poll_timeout=null),$popup.remove()}),start=$.Def
 erred().done(function(){poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)}),poll=function(){$.ajax({type:"GET",dataType:"json",url:url+"?status&identifier="+identifier}).then(function(info){result.notify(info),info.missing&&(missing_retries-=1,missing_retries||result.reject({message:"File does not upload. (is it too big ?)"})),!info["upload-finished"]&&"pending"==result.state()&&missing_retries&&(poll_retries=POLL_NETWORK_RETRIES,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY))},function(){"pending"==result.state()&&(poll_retries?(poll_retries-=1,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)):result.reject({message:"Status check failed: cannot upload file."}))})},api={start:function(){var send=function(){start.done(function(){$popup.dialog("close"),IFrameLoad($popup.find("iframe"),"upl
 oad-"+identifier+"-done").fail(function(){result.reject({message:"Upload failed (file too big or server error)."})}).done(function(data){result.resolve(data)}),$popup.find("form").submit()})
 .resolve({"uploaded-length":0,"content-type":"n/a","request-length":0,filename:""})};$popup.find(".upload-file").on("change",function(){send()}),$popup.dialog({buttons:{Send:function(){send()}}})},cancel:function(){result.reject({})},register:function(plugin){void 0!==plugin.start&&start.done(plugin.start);for(var event in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadField=DONT_NEED_POPUP?function($field,set_objection){var $trigger=$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=UploadUI($field,set_objection,function(){return UploadForm($file,$field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$file.hide()},always:function(){$file.show()}})});$trig
 ger.remove(),$file.on("change",function(){ui.get(!0).start()})}:function($field,set_objection){var $trigger=$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=
 UploadUI($field,set_objection,function(){return UploadPopup($field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$trigger.hide()},always:function(){$trigger.show()}})});$file.detach(),$trigger.show(),$trigger.on("click",function(){ui.get(!0).start()})};$(document).on("loadwidget-smiform",".form-fields-container",function(event,data){$(this).find(".upload-file").each(function(){UploadField($(this),data.set_objection)}),event.stopPropagation()})})(jQuery,jsontemplate);
\ No newline at end of file
+(function($,jsontemplate){var POLL_NETWORK_RETRIES=5,POLL_NETWORK_DELAY=500,POLL_MISSING_RETRIES=20,DONT_NEED_POPUP=function(){var $test=$('<div style="display:none;"><form id="testform1"><input type="file" form="testform2" /></form><form id="testform2"></form></div>'),supported=!1;return $("body").append($test),supported=0===$test.find("#testform1")[0].length&&1===$test.find("#testform2")[0].length,$test.remove(),supported}(),PollStatusChecker=function(url,identifier,result){var poll_retries=POLL_NETWORK_RETRIES,poll_timeout=null,missing_retries=POLL_MISSING_RETRIES,deferred=$.Deferred(),poll=function(){$.ajax({type:"GET",dataType:"json",url:url+"?status&identifier="+identifier}).then(function(info){var error=null;result.notify(info),info.missing&&(missing_retries-=1,missing_retries||(er
 ror=info["upload-error"]||"unknow error",deferred.reject({message:"Upload failed ("+error+")."}))),info["upload-finished"]||info["upload-error"]?info["upload-finished"]&&!info["upload-error"
 ]?deferred.resolve(info):(error=info["upload-error"]||"unknow error",deferred.reject({message:"Upload failed ("+error+")."})):"pending"==result.state()&&missing_retries&&(poll_retries=POLL_NETWORK_RETRIES,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY))},function(){"pending"==result.state()&&(poll_retries?(poll_retries-=1,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)):deferred.reject({message:"Status check failed: cannot upload file."}))})};return{promise:deferred.promise,start:function(){poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)},always:function(){null!==poll_timeout&&(clearTimeout(poll_timeout),poll_timeout=null)}}},IFrameStatusChecker=function($iframe,name){var iframe=$iframe.get(0),iframe_window=iframe.contentWindow,deferred=(iframe_window.document,$.Deferred()),fail=functi
 on(){deferred.reject({message:"Upload failed (file too big or server error)."})};return $(document).one(name,function(event,data){deferred.resolve(data)}),iframe_window.addEventListener?(ifr
 ame_window.addEventListener("load",fail,!1),iframe_window.addEventListener("error",fail,!1)):(iframe_window.attachEvent("onload",fail),iframe_window.attachEvent("onerror",fail)),{promise:deferred.promise}},UploadStatusMessage=function($display){var $empty=$display.children(".upload-display-empty"),$uploading=$display.children(".upload-display-uploading"),$done=$display.children(".upload-display-complete"),empty=$empty.children("i").text(),uploading=jsontemplate.Template($uploading.children("i").text(),{}),done=jsontemplate.Template($done.children("i").text(),{}),state="empty",original=$display.data("upload-status"),api={start:function(data){"starting"!=state&&($uploading.children("i").text(uploading.expand(data)),$empty.hide(),$done.hide(),$uploading.show(),state="starting")},progress:fun
 ction(data){"uploading"==state||data.missing||($uploading.children("i").text(uploading.expand(data)),state="uploading")},done:function(data){"done"!=state&&($done.children("i").text(done.exp
 and(data)),$empty.hide(),$uploading.hide(),$done.show(),state="done")},fail:function(data){("empty"!=state||data.message)&&($empty.children("i").text(data.message||empty),"empty"!=state&&($uploading.hide(),$done.hide(),$empty.show(),state="empty"))}};return original&&api.done(original),api},UploadProgress=function($progress){var progress=0;return{start:function(){$progress.progressbar({value:0}).show()},progress:function(data){var updated=0;data.missing||(updated=100*data["uploaded-length"]/data["request-length"]),updated!=progress&&($progress.progressbar({value:updated}),progress=updated)},always:function(){$progress.hide(),progress=0}}},UploadUI=function($field,set_objection,get_upload){var $input=$field.children(".upload-input"),$cancel=$field.children(".upload-cancel"),$clear=$field.c
 hildren(".upload-clear"),upload=null,objection=null,progress=UploadProgress($field.children(".upload-progress")),status=UploadStatusMessage($field.children(".upload-display")),api={get:funct
 ion(create){return null==upload&&create&&(upload=get_upload(),upload.register(status),upload.register(progress),upload.register(ui)),upload}},ui={start:function(){void 0!==set_objection&&(objection=$.Deferred(),set_objection(function(){if("pending"==objection.state()){var $dialog=$('<div title="Uploading file"><p>Please wait until the upload is finished ...</p><p class="progress"></p></div>'),$progress=$dialog.find("p.progress"),progress=0;return $dialog.dialog({modal:!0,closeOnEscape:!1,resizable:!1,draggable:!1,beforeClose:function(){return!1}}),$progress.progressbar({value:0}),api.get().register({progress:function(data){var updated=0;data.missing||(updated=100*data["uploaded-length"]/data["request-length"]),updated!=progress&&($progress.progressbar({value:updated}),progress=updated)}})
 ,objection.always(function(){$dialog.dialog("close").remove(),objection=null})}return null})),$cancel.show()},done:function(){$input.attr("value",$field.data("upload-identifier"))},always:fu
 nction(){null!==objection&&objection.resolve(),$cancel.hide(),upload=null}};return $cancel.on("click",function(){var upload=api.get();null!==upload&&upload.cancel()}),$clear.on("click",function(){var upload=api.get(!0);upload.cancel(),$input.attr("value","")}),api},UploadForm=function($field,identifier,url){var $upload=$('<div style="display:none"><iframe width="0" height="0" style="display:none"src="about:blank" class="upload-iframe" name="upload-'+identifier+'-iframe"></iframe>'+'<form class="upload-form" enctype="multipart/form-data"'+'method="POST" action="'+url+"?identifier="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="reset" class="upload-reset" /></form></div>'),result=$.Deferred().fail(function(){$upload.find(".upload-reset")
 .click(),$upload.find(".upload-iframe").attr("src","javascript:false;")}).always(function(){$upload.remove(),$field.removeAttr("form")}),start=$.Deferred(),api={start:function(){$("body").ap
 pend($upload),$field.attr("form","upload-"+identifier+"-form"),start.done(function(){api.register(IFrameStatusChecker($upload.find("iframe"),"upload-"+identifier+"-done")),api.register(PollStatusChecker(url,identifier,result)),$upload.find("form").submit()}).resolve({"uploaded-length":0,"content-type":"n/a","request-length":0,filename:""})},cancel:function(){result.reject({})},register:function(plugin){void 0!==plugin.start&&start.done(plugin.start),void 0!==plugin.promise&&plugin.promise().then(function(data){result.resolve(data)},function(data){result.reject(data)});for(var event in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadPopup=function(identifier,url){var $popup=$('<div  title="Upload a file"><form class="up
 load-form" enctype="multipart/form-data"method="POST" action="'+url+"?identifier="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="file" n
 ame="file-we-are-uploading" class="upload-file" /></form>'+'<iframe width="0" height="0" style="display:none"'+'src="about:blank" class="upload-iframe" name="upload-'+identifier+'-iframe"></iframe></div>'),result=$.Deferred().fail(function(){$popup.find(".upload-iframe").attr("src","javascript:false;")}).always(function(){$popup.remove()}),start=$.Deferred(),api={start:function(){var send=function(){start.done(function(){$popup.dialog("close"),api.register(IFrameStatusChecker($popup.find("iframe"),"upload-"+identifier+"-done")),api.register(PollStatusChecker(url,identifier,result)),$popup.find("form").submit()}).resolve({"uploaded-length":0,"content-type":"n/a","request-length":0,filename:""})};$popup.find(".upload-file").on("change",function(){send()}),$popup.dialog({buttons:{Send:functi
 on(){send()}}})},cancel:function(){result.reject({})},register:function(plugin){void 0!==plugin.start&&start.done(plugin.start),void 0!==plugin.promise&&plugin.promise().then(function(data){
 result.resolve(data)},function(data){result.reject(data)});for(var event in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadField=DONT_NEED_POPUP?function($field,set_objection){var $trigger=$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=UploadUI($field,set_objection,function(){return UploadForm($file,$field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$file.hide()},always:function(){$file.show()}})});$trigger.remove(),$file.on("change",function(){ui.get(!0).start()})}:function($field,set_objection){var $trigger=$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=UploadUI($field,set_objection,function(){return UploadPopup
 ($field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$trigger.hide()},always:function(){$trigger.show()}})});$file.detach(),$trigger.show(),$trigger.on("cl
 ick",function(){ui.get(!0).start()})};$(document).on("loadwidget-smiform",".form-fields-container",function(event,data){$(this).find(".upload-file").each(function(){UploadField($(this),data.set_objection)}),event.stopPropagation()})})(jQuery,jsontemplate);
\ No newline at end of file
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.