Fix name-typo in NEWS
[coquelicot.git] / public / javascripts / jquery.uploadProgress.js
1 /*
2 * jquery.uploadProgress
3 *
4 * Copyright (c) 2008 Piotr Sarnacki (drogomir.com)
5 *
6 * Licensed under the MIT license:
7 * http://www.opensource.org/licenses/mit-license.php
8 *
9 */
10 (function($) {
11   $.fn.uploadProgress = function(options) {
12   options = $.extend({
13     dataType: "json",
14     interval: 2000,
15     progressBar: "#progressbar",
16     progressUrl: "/progress",
17     start: function() {},
18     uploading: function() {},
19     complete: function() {},
20     success: function() {},
21     error: function() {},
22     preloadImages: [],
23     uploadProgressPath: '/javascripts/jquery.uploadProgress.js',
24     jqueryPath: '/javascripts/jquery.js',
25     timer: ""
26   }, options);
27   
28   $(function() {
29     //preload images
30     for(var i = 0; i<options.preloadImages.length; i++)
31     {
32      options.preloadImages[i] = $("<img>").attr("src", options.preloadImages[i]);
33     }
34   });
35   
36   return this.each(function(){
37     $(this).bind('submit', function() {
38       var uuid = "";
39       for (i = 0; i < 32; i++) { uuid += Math.floor(Math.random() * 16).toString(16); }
40       
41       /* update uuid */
42       options.uuid = uuid;
43       /* start callback */
44       options.start();
45  
46       /* patch the form-action tag to include the progress-id if X-Progress-ID has been already added just replace it */
47       if(old_id = /X-Progress-ID=([^&]+)/.exec($(this).attr("action"))) {
48         var action = $(this).attr("action").replace(old_id[1], uuid);
49         $(this).attr("action", action);
50       } else {
51        $(this).attr("action", jQuery(this).attr("action") + "?X-Progress-ID=" + uuid);
52       }
53       var uploadProgress = jQuery.uploadProgress;
54       options.timer = window.setInterval(function() { uploadProgress(this, options) }, options.interval);
55     });
56   });
57   };
58  
59 jQuery.uploadProgress = function(e, options) {
60   jQuery.ajax({
61     type: "GET",
62     url: options.progressUrl + "?X-Progress-ID=" + options.uuid,
63     dataType: options.dataType,
64     success: function(upload) {
65       var bar = $(options.progressBar);
66       if (upload.state == 'uploading') {
67         upload.percents = Math.floor((upload.received / upload.size)*1000)/10;
68         
69         bar.css({width: upload.percents+'%'});
70         options.uploading(upload);
71       }
72       
73       if (upload.state == 'done' || upload.state == 'error') {
74         window.clearTimeout(options.timer);
75         options.complete(upload);
76       }
77       
78       if (upload.state == 'done') {
79         bar.css({width: '100%'});
80         options.success(upload);
81       }
82       
83       if (upload.state == 'error') {
84         options.error(upload);
85       }
86     }
87   });
88 };
89  
90 })(jQuery);