Project

General

Profile

1
/*! UIkit 2.27.5 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
(function(addon) {
3

    
4
    var component;
5

    
6
    if (window.UIkit2) {
7
        component = addon(UIkit2);
8
    }
9

    
10
    if (typeof define == 'function' && define.amd) {
11
        define('uikit-upload', ['uikit'], function(){
12
            return component || addon(UIkit2);
13
        });
14
    }
15

    
16
})(function(UI){
17

    
18
    "use strict";
19

    
20
    UI.component('uploadSelect', {
21

    
22
        init: function() {
23

    
24
            var $this = this;
25

    
26
            this.on('change', function() {
27
                xhrupload($this.element[0].files, $this.options);
28
                var twin = $this.element.clone(true).data('uploadSelect', $this);
29
                $this.element.replaceWith(twin);
30
                $this.element = twin;
31
            });
32
        }
33
    });
34

    
35
    UI.component('uploadDrop', {
36

    
37
        defaults: {
38
            'dragoverClass': 'uk-dragover'
39
        },
40

    
41
        init: function() {
42

    
43
            var $this = this, hasdragCls = false;
44

    
45
            this.on('drop', function(e){
46

    
47
                if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files) {
48

    
49
                    e.stopPropagation();
50
                    e.preventDefault();
51

    
52
                    $this.element.removeClass($this.options.dragoverClass);
53
                    $this.element.trigger('dropped.uk.upload', [e.originalEvent.dataTransfer.files]);
54

    
55
                    xhrupload(e.originalEvent.dataTransfer.files, $this.options);
56
                }
57

    
58
            }).on('dragenter', function(e){
59
                e.stopPropagation();
60
                e.preventDefault();
61
            }).on('dragover', function(e){
62
                e.stopPropagation();
63
                e.preventDefault();
64

    
65
                if (!hasdragCls) {
66
                    $this.element.addClass($this.options.dragoverClass);
67
                    hasdragCls = true;
68
                }
69
            }).on('dragleave', function(e){
70
                e.stopPropagation();
71
                e.preventDefault();
72
                $this.element.removeClass($this.options.dragoverClass);
73
                hasdragCls = false;
74
            });
75
        }
76
    });
77

    
78

    
79
    UI.support.ajaxupload = (function() {
80

    
81
        function supportFileAPI() {
82
            var fi = document.createElement('INPUT'); fi.type = 'file'; return 'files' in fi;
83
        }
84

    
85
        function supportAjaxUploadProgressEvents() {
86
            var xhr = new XMLHttpRequest(); return !! (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload));
87
        }
88

    
89
        function supportFormData() {
90
            return !! window.FormData;
91
        }
92

    
93
        return supportFileAPI() && supportAjaxUploadProgressEvents() && supportFormData();
94
    })();
95

    
96

    
97
    function xhrupload(files, settings) {
98

    
99
        if (!UI.support.ajaxupload){
100
            return this;
101
        }
102

    
103
        settings = UI.$.extend({}, xhrupload.defaults, settings);
104

    
105
        if (!files.length){
106
            return;
107
        }
108

    
109
        if (settings.allow !== '*.*') {
110

    
111
            for(var i=0,file;file=files[i];i++) {
112

    
113
                if(!matchName(settings.allow, file.name)) {
114

    
115
                    if(typeof(settings.notallowed) == 'string') {
116
                       alert(settings.notallowed);
117
                    } else {
118
                       settings.notallowed(file, settings);
119
                    }
120
                    return;
121
                }
122
            }
123
        }
124

    
125
        var complete = settings.complete;
126

    
127
        if (settings.single){
128

    
129
            var count    = files.length,
130
                uploaded = 0,
131
                allow    = true;
132

    
133
                settings.beforeAll(files);
134

    
135
                settings.complete = function(response, xhr){
136

    
137
                    uploaded = uploaded + 1;
138

    
139
                    complete(response, xhr);
140

    
141
                    if (settings.filelimit && uploaded >= settings.filelimit){
142
                        allow = false;
143
                    }
144

    
145
                    if (allow && uploaded<count){
146
                        upload([files[uploaded]], settings);
147
                    } else {
148
                        settings.allcomplete(response, xhr);
149
                    }
150
                };
151

    
152
                upload([files[0]], settings);
153

    
154
        } else {
155

    
156
            settings.complete = function(response, xhr){
157
                complete(response, xhr);
158
                settings.allcomplete(response, xhr);
159
            };
160

    
161
            upload(files, settings);
162
        }
163

    
164
        function upload(files, settings){
165

    
166
            // upload all at once
167
            var formData = new FormData(), xhr = new XMLHttpRequest();
168

    
169
            if (settings.before(settings, files)===false) return;
170

    
171
            for (var i = 0, f; f = files[i]; i++) { formData.append(settings.param, f); }
172
            for (var p in settings.params) { formData.append(p, settings.params[p]); }
173

    
174
            // Add any event handlers here...
175
            xhr.upload.addEventListener('progress', function(e){
176
                var percent = (e.loaded / e.total)*100;
177
                settings.progress(percent, e);
178
            }, false);
179

    
180
            xhr.addEventListener('loadstart', function(e){ settings.loadstart(e); }, false);
181
            xhr.addEventListener('load',      function(e){ settings.load(e);      }, false);
182
            xhr.addEventListener('loadend',   function(e){ settings.loadend(e);   }, false);
183
            xhr.addEventListener('error',     function(e){ settings.error(e);     }, false);
184
            xhr.addEventListener('abort',     function(e){ settings.abort(e);     }, false);
185

    
186
            xhr.open(settings.method, settings.action, true);
187

    
188
            if (settings.type=='json') {
189
                xhr.setRequestHeader('Accept', 'application/json');
190
            }
191

    
192
            for (var h in settings.headers) {
193
                xhr.setRequestHeader(h, settings.headers[h]);
194
            }
195

    
196
            xhr.onreadystatechange = function() {
197

    
198
                settings.readystatechange(xhr);
199

    
200
                if (xhr.readyState==4){
201

    
202
                    var response = xhr.responseText;
203

    
204
                    if (settings.type=='json') {
205
                        try {
206
                            response = UI.$.parseJSON(response);
207
                        } catch(e) {
208
                            response = false;
209
                        }
210
                    }
211

    
212
                    settings.complete(response, xhr);
213
                }
214
            };
215
            settings.beforeSend(xhr);
216
            xhr.send(formData);
217
        }
218
    }
219

    
220
    xhrupload.defaults = {
221
        action: '',
222
        single: true,
223
        method: 'POST',
224
        param : 'files[]',
225
        params: {},
226
        allow : '*.*',
227
        type  : 'text',
228
        filelimit: false,
229
        headers: {},
230

    
231
        // events
232
        before          : function(o){},
233
        beforeSend      : function(xhr){},
234
        beforeAll       : function(){},
235
        loadstart       : function(){},
236
        load            : function(){},
237
        loadend         : function(){},
238
        error           : function(){},
239
        abort           : function(){},
240
        progress        : function(){},
241
        complete        : function(){},
242
        allcomplete     : function(){},
243
        readystatechange: function(){},
244
        notallowed      : function(file, settings){ alert('Only the following file types are allowed: '+settings.allow); }
245
    };
246

    
247
    function matchName(pattern, path) {
248

    
249
        var parsedPattern = '^' + pattern.replace(/\//g, '\\/').
250
            replace(/\*\*/g, '(\\/[^\\/]+)*').
251
            replace(/\*/g, '[^\\/]+').
252
            replace(/((?!\\))\?/g, '$1.') + '$';
253

    
254
        parsedPattern = '^' + parsedPattern + '$';
255

    
256
        return (path.match(new RegExp(parsedPattern, 'i')) !== null);
257
    }
258

    
259
    UI.Utils.xhrupload = xhrupload;
260

    
261
    return xhrupload;
262
});
(45-45/46)