redditor 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,548 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
5
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6
-
7
- <title>FileAPI :: TEST</title>
8
-
9
- <meta name="viewport" content="user-scalable=no, width=400, initial-scale=0.8, maximum-scale=0.8" />
10
- <meta name="apple-mobile-web-app-capable" content="yes" />
11
- <meta name="apple-mobile-web-app-status-bar-style" content="yes" />
12
- <meta name="format-detection" content="email=no" />
13
- <meta name="HandheldFriendly" content="true" />
14
-
15
- <script src="//yandex.st/jquery/1.8.2/jquery.min.js"></script>
16
- <script>if( !window.jQuery )document.write('<script src="/js/jquery.dev.js"><'+'/script>');</script>
17
-
18
- <script>var FileAPI = { debug: false, pingUrl: false }</script>
19
- <script src="./FileAPI.min.js"></script>
20
- <script src="./FileAPI.id3.js"></script>
21
- <script src="./FileAPI.exif.js"></script>
22
-
23
- <script>
24
- // Simple JavaScript Templating
25
- // John Resig - http://ejohn.org/ - MIT Licensed
26
- (function (){
27
- var cache = {};
28
-
29
- this.tmpl = function tmpl(str, data){
30
- // Figure out if we're getting a template, or if we need to
31
- // load the template - and be sure to cache the result.
32
- var fn = !/\W/.test(str) ?
33
- cache[str] = cache[str] ||
34
- tmpl(document.getElementById(str).innerHTML) :
35
-
36
- // Generate a reusable function that will serve as a template
37
- // generator (and which will be cached).
38
- new Function("obj",
39
- "var p=[],print=function(){p.push.apply(p,arguments);};" +
40
-
41
- // Introduce the data as local variables using with(){}
42
- "with(obj){p.push('" +
43
-
44
- // Convert the template into pure JavaScript
45
- str
46
- .replace(/[\r\t\n]/g, " ")
47
- .split("<%").join("\t")
48
- .replace(/((^|%>)[^\t]*)'/g, "$1\r")
49
- .replace(/\t=(.*?)%>/g, "',$1,'")
50
- .split("\t").join("');")
51
- .split("%>").join("p.push('")
52
- .split("\r").join("\\'")
53
- + "');}return p.join('');");
54
-
55
- // Provide some basic currying to the user
56
- return data ? fn(data) : fn;
57
- };
58
- })();
59
- </script>
60
-
61
- <style>
62
- body {
63
- font-size: 15px;
64
- font-family: "Helvetica Neue";
65
- }
66
-
67
- .b-button {
68
- display: inline-block;
69
- *display: inline;
70
- *zoom: 1;
71
- position: relative;
72
- overflow: hidden;
73
- cursor: pointer;
74
- padding: 4px 15px;
75
- vertical-align: middle;
76
- border: 1px solid #ccc;
77
- border-radius: 3px;
78
- background-color: #f5f5f5;
79
- background: -moz-linear-gradient(top, #fff 0%, #f5f5f5 49%, #ececec 50%, #eee 100%);
80
- background: -webkit-linear-gradient(top, #fff 0%,#f5f5f5 49%,#ececec 50%,#eee 100%);
81
- background: -o-linear-gradient(top, #fff 0%,#f5f5f5 49%,#ececec 50%,#eee 100%);
82
- background: linear-gradient(to bottom, #fff 0%,#f5f5f5 49%,#ececec 50%,#eee 100%);
83
- -webkit-user-select: none;
84
- -moz-user-select: none;
85
- user-select: none;
86
- }
87
- .b-button_hover {
88
- border-color: #fa0;
89
- box-shadow: 0 0 2px #fa0;
90
- }
91
-
92
- .b-button__text {
93
- }
94
-
95
- .b-button__input {
96
- cursor: pointer;
97
- opacity: 0;
98
- filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);
99
- top: -10px;
100
- right: -40px;
101
- font-size: 50px;
102
- position: absolute;
103
- }
104
-
105
-
106
- #preview {
107
- max-width: 600px;
108
- box-shadow: 0 1px 3px rgba(0,0,0,.4);
109
- border-radius: 3px;
110
- }
111
- .b-file {
112
- height: 40px;
113
- padding: 5px;
114
- position: relative;
115
- overflow: hidden;
116
- border-radius: 3px;
117
- background-color: #fcfcfc;
118
- background: -webkit-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
119
- background: -moz-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
120
- background: -o-linear-gradient(top, #fcfcfc 0%, #f6f6f6 100%);
121
- background: linear-gradient(to bottom, #fcfcfc 0%, #f6f6f6 100%);
122
- clear: both;
123
- }
124
- .b-file__left {
125
- float: left;
126
- margin: 1px 0 0 2px;
127
- line-height: 0;
128
- }
129
- .b-file__left_border {
130
- border: 2px solid #fff;
131
- border-radius: 4px;
132
- }
133
-
134
- .b-file__right {
135
- margin-left: 45px;
136
- }
137
-
138
- .b-file__name {
139
- color: #36c;
140
- cursor: pointer;
141
- border-bottom: 1px dotted #36c;
142
- text-decoration: none;
143
- }
144
- .b-file__name:hover {
145
- color: #f00;
146
- border-bottom-color: #f00;
147
- }
148
-
149
- .b-file__info {
150
- color: #666;
151
- position: absolute;
152
- font-size: 12px;
153
- margin-top: 3px;
154
- }
155
-
156
- .b-file__bar {
157
- padding-top: 4px;
158
- }
159
-
160
- .b-file__error {
161
- color: #c00;
162
- }
163
- .b-file__done {
164
- color: #458383;
165
- }
166
- .b-file__abort {
167
- top: 10px;
168
- right: 20px;
169
- width: 15px;
170
- height: 15px;
171
- position: absolute;
172
- color: #c00;
173
- cursor: pointer;
174
- font-size: 20px;
175
- display: none;
176
- }
177
- .b-file_upload .b-file__abort { display: block; }
178
-
179
- .b-progress {
180
- width: 200px;
181
- height: 10px;
182
- border: 2px solid #E2E4E2;
183
- border-radius: 10px;
184
- box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
185
- background-color: #d3d3d3;
186
- position: relative;
187
- }
188
- .b-progress__bar {
189
- width: 0;
190
- height: 10px;
191
- border-radius: 10px;
192
- background-color: #2D9DD7;
193
- background: -webkit-linear-gradient(top, #2D9DD7 0%, #1C81C7 100%); /* FF3.6+ */
194
- background: -moz-linear-gradient(top, #2D9DD7 0%, #1C81C7 100%); /* FF3.6+ */
195
- background: linear-gradient(to bottom, #2D9DD7 0%, #1C81C7 100%); /* FF3.6+ */
196
- -webkit-transition: width .5s ease-out;
197
- -moz-transition: width .5s ease-out;
198
- -ms-transition: width .5s ease-out;
199
- transition: width .5s ease-out;
200
- }
201
-
202
- .b-dropzone,
203
- .b-dropzone__bg {
204
- top: 0;
205
- left: 0;
206
- right: 0;
207
- bottom: 0;
208
- z-index: 30000;
209
- position: absolute;
210
- }
211
- .b-dropzone__bg {
212
- opacity: .2;
213
- background-color: #2D9DD7
214
- }
215
- .b-dropzone__txt {
216
- color: #1C81C7;
217
- text-shadow: 0 2px 1px #113C53;
218
- font-size: 400%;
219
- font-weight: bold;
220
- text-align: center;
221
- width: 500px;
222
- top: 50%;
223
- left: 50%;
224
- margin: -100px 0 0 -250px;
225
- z-index: 30001;
226
- position: absolute;
227
- }
228
-
229
- .b-layer {
230
- border: 3px solid #fff;
231
- border-radius: 5px;
232
- box-shadow: 0 1px 30px #000;
233
- background-color: #f3f3f3;
234
- top: 50px;
235
- left: 50%;
236
- z-index: 30002;
237
- position: absolute;
238
- margin-left: -150px;
239
- margin-bottom: 100px;
240
- }
241
- .b-layer__h1 {
242
- color: #fff;
243
- padding: 10px 10px;
244
- width: 300px;
245
- overflow: hidden;
246
- background-color: #2D9DD7;
247
- }
248
- .b-layer__img {
249
- padding: 5px 10px;
250
- text-align: center;
251
- border-top: 2px solid #fff;
252
- }
253
- .b-layer__info {
254
- padding: 2px 15px;
255
- border-top: 2px solid #fff;
256
- }
257
- .b-layer__info div {
258
- width: 280px;
259
- overflow: hidden;
260
- white-space: nowrap;
261
- }
262
-
263
-
264
- .examples {
265
- left: 0;
266
- right: 0;
267
- bottom: 0;
268
- position: fixed;
269
- box-shadow: 0 0 5px rgba(0,0,0,.65);
270
- background-color: #fff;
271
- }
272
- .examples__inner {
273
- padding: 5px 10px;
274
- }
275
- </style>
276
-
277
- </head>
278
- <body>
279
- <div class="examples">
280
- <div class="examples__inner">
281
- <a href="./example.userpic.html">user pic</a>
282
- </div>
283
- </div>
284
-
285
- <div id="drop-zone" class="b-dropzone" style="display: none">
286
- <div class="b-dropzone__bg"></div>
287
- <div class="b-dropzone__txt">Drop files there</div>
288
- </div>
289
-
290
- <div id="oooops" style="display: none; margin: 10px; padding: 10px; border: 2px solid #f60; border-radius: 4px;">
291
- Увы, ваш браузер не поддерживает html5 и flash,
292
- поэтому смотреть тут нечего, а iframe не даёт всей красоты :]
293
- </div>
294
-
295
- <div id="buttons-panel">
296
- <div class="b-button js-fileapi-wrapper">
297
- <div class="b-button__text">Upload one file</div>
298
- <input name="files" class="b-button__input" type="file" />
299
- </div>
300
-
301
- <div class="b-button js-fileapi-wrapper">
302
- <div class="b-button__text">Multiple</div>
303
- <input name="files" class="b-button__input" type="file" multiple />
304
- </div>
305
-
306
- <div class="b-button js-fileapi-wrapper">
307
- <div class="b-button__text">jpg, jpeg & gif</div>
308
- <input name="files" class="b-button__input" type="file" accept=".jpg,.jpeg,.gif" multiple />
309
- </div>
310
-
311
- <span id="drag-n-drop" style="display: none; padding: 0 30px">
312
- or &nbsp; &nbsp; drag'n'drop
313
- </span>
314
- </div>
315
-
316
- <div id="preview" style="margin-top: 30px"></div>
317
-
318
- <script id="b-file-ejs" type="text/ejs">
319
- <div id="file-<%=FileAPI.uid(file)%>" class="js-file b-file b-file_<%=file.type.split('/')[0]%>">
320
- <div class="js-left b-file__left">
321
- <img src="<%=icon[file.type.split('/')[0]]||icon.def%>" width="32" height="32" style="margin: 2px 0 0 3px"/>
322
- </div>
323
- <div class="b-file__right">
324
- <div><a class="js-name b-file__name"><%=file.name%></a></div>
325
- <div class="js-info b-file__info">size: <%=(file.size/FileAPI.KB).toFixed(2)%> KB</div>
326
- <div class="js-progress b-file__bar" style="display: none">
327
- <div class="b-progress"><div class="js-bar b-progress__bar"></div></div>
328
- </div>
329
- </div>
330
- <i class="js-abort b-file__abort" title="abort">&times;</i>
331
- </div>
332
- </script>
333
-
334
- <script id="b-layer-ejs" type="text/ejs">
335
- <div class="b-layer">
336
- <div class="b-layer__h1"><%=file.name%></div>
337
- <div class="js-img b-layer__img"></div>
338
- <div class="b-layer__info">
339
- <%
340
- FileAPI.each(info, function(val, key){
341
- if( Object.prototype.toString.call(val) == '[object Object]' ){
342
- var sub = '';
343
- FileAPI.each(val, function (val, key){ sub += '<div>'+key+': '+val+'</div>'; });
344
- if( sub ){
345
- %><%=key%><div style="margin: 0 0 5px 20px;"><%=sub%></div><%
346
- }
347
- } else {
348
- %>
349
- <div><%=key%>: <%=val%></div>
350
- <%
351
- }
352
- });
353
- %>
354
- </div>
355
- </div>
356
- </script>
357
-
358
-
359
- <script type="text/javascript">
360
- jQuery(function ($){
361
- if( !(FileAPI.support.cors || FileAPI.support.flash) ){
362
- $('#oooops').show();
363
- $('#buttons-panel').hide();
364
- }
365
-
366
- $(document).on('mouseenter mouseleave', '.b-button', function (evt){
367
- $(evt.currentTarget).toggleClass('b-button_hover', evt.type == 'mouseenter');
368
- });
369
-
370
-
371
- if( FileAPI.support.dnd ){
372
- $('#drag-n-drop').show();
373
- $(document).dnd(function (over){
374
- $('#drop-zone').toggle(over);
375
- }, function (files){
376
- onFiles(files);
377
- });
378
- }
379
-
380
-
381
- $('input[type="file"]').on('change', function (evt){
382
- var files = FileAPI.getFiles(evt);
383
- onFiles(files);
384
- FileAPI.reset(evt.currentTarget);
385
- });
386
-
387
-
388
- var FU = {
389
- icon: {
390
- def: '//cdn1.iconfinder.com/data/icons/CrystalClear/32x32/mimetypes/unknown.png'
391
- , image: '//cdn1.iconfinder.com/data/icons/humano2/32x32/apps/synfig_icon.png'
392
- , audio: '//cdn1.iconfinder.com/data/icons/august/PNG/Music.png'
393
- , video: '//cdn1.iconfinder.com/data/icons/df_On_Stage_Icon_Set/128/Video.png'
394
- },
395
-
396
- files: [],
397
- index: 0,
398
- active: false,
399
-
400
- add: function (file){
401
- FU.files.push(file);
402
-
403
- if( /^image/.test(file.type) ){
404
- FileAPI.Image(file).preview(35).rotate('auto').get(function (err, img){
405
- if( !err ){
406
- FU._getEl(file, '.js-left')
407
- .addClass('b-file__left_border')
408
- .html(img)
409
- ;
410
- }
411
- });
412
- }
413
- },
414
-
415
- getFileById: function (id){
416
- var i = FU.files.length;
417
- while( i-- ){
418
- if( FileAPI.uid(FU.files[i]) == id ){
419
- return FU.files[i];
420
- }
421
- }
422
- },
423
-
424
- showLayer: function (id){
425
- var $Layer = $('#layer-'+id), file = this.getFileById(id);
426
-
427
- if( !$Layer[0] ){
428
- $Layer = $('<div/>').appendTo('body').attr('id', 'layer-'+id);
429
- }
430
-
431
- $Layer.css('top', $(window).scrollTop() + 30);
432
-
433
- FileAPI.getInfo(file, function (err, info){
434
- $Layer
435
- .click(function (){ $(document).click(); })
436
- .html(tmpl($('#b-layer-ejs').html(), {
437
- file: file
438
- , info: $.extend(err ? {} : info, { size: (file.size/1024).toFixed(3) + ' KB' })
439
- }))
440
- ;
441
-
442
- if( /image/i.test(file.type) ){
443
- if( err ){
444
- $Layer.find('.js-img').html('Ooops.');
445
- }
446
- else {
447
- FileAPI.Image(file).preview(300).get(function (err, img){
448
- $Layer.find('.js-img').append(img);
449
- });
450
- }
451
- } else {
452
- $Layer.find('.js-img').remove();
453
- }
454
-
455
- $(document).off('click.layer keyup.layer').one('click.layer keyup.layer', function (evt){
456
- $Layer.remove();
457
- });
458
- });
459
- },
460
-
461
- start: function (){
462
- if( !FU.active && (FU.active = FU.files.length > FU.index) ){
463
- FU._upload(FU.files[FU.index]);
464
- }
465
- },
466
-
467
- abort: function (id){
468
- var file = this.getFileById(id);
469
- if( file.xhr ){
470
- file.xhr.abort();
471
- }
472
- },
473
-
474
- _getEl: function (file, sel){
475
- var $el = $('#file-'+FileAPI.uid(file));
476
- return sel ? $el.find(sel) : $el;
477
- },
478
-
479
- _upload: function (file){
480
- if( file ){
481
- file.xhr = FileAPI.upload({
482
- url: 'http://www.rubaxa.org/index.php',
483
- files: { file: file },
484
- upload: function (){
485
- FU._getEl(file).addClass('b-file_upload');
486
- FU._getEl(file, '.js-progress')
487
- .css({ opacity: 0 }).show()
488
- .animate({ opacity: 1 }, 100)
489
- ;
490
- },
491
- progress: function (evt){
492
- FU._getEl(file, '.js-bar').css('width', evt.loaded/evt.total*100+'%');
493
- },
494
- complete: function (err, xhr){
495
- var state = err ? 'error' : 'done';
496
-
497
- FU._getEl(file).removeClass('b-file_upload');
498
- FU._getEl(file, '.js-progress').animate({ opacity: 0 }, 200, function (){ $(this).hide() });
499
- FU._getEl(file, '.js-info').append(', <b class="b-file__'+state+'">'+(err ? (xhr.statusText || err) : state)+'</b>');
500
-
501
- FU.index++;
502
- FU.active = false;
503
-
504
- FU.start();
505
- }
506
- });
507
- }
508
- }
509
- };
510
-
511
- function onFiles(files){
512
- var $Queue = $('<div/>').prependTo('#preview');
513
-
514
- FileAPI.each(files, function (file){
515
- if( file.size >= 25*FileAPI.MB ){
516
- alert('Sorrow.\nMax size 25MB')
517
- }
518
- else if( file.size === void 0 ){
519
- $('#oooops').show();
520
- $('#buttons-panel').hide();
521
- }
522
- else {
523
- $Queue.append(tmpl($('#b-file-ejs').html(), { file: file, icon: FU.icon }));
524
-
525
- FU.add(file);
526
- FU.start();
527
- }
528
- });
529
- }
530
-
531
-
532
- $(document)
533
- .on('click', '.js-file', function (evt){
534
- if( !evt.isDefaultPrevented() ){
535
- FU.showLayer(evt.currentTarget.id.split('-')[1]);
536
- evt.preventDefault();
537
- }
538
- })
539
- .on('click', '.js-abort', function (evt){
540
- FU.abort($(evt.target).closest('.js-file').attr('id').split('-')[1]);
541
- evt.preventDefault();
542
- })
543
- ;
544
- }); // ready
545
- </script>
546
-
547
- </body>
548
- </html>
@@ -1,6 +0,0 @@
1
- //= require redditor/fileapi/config
2
- //= require redditor/fileapi/FileAPI.min
3
- //= require redditor/fileapi/FileAPI.id3.js
4
- //= require redditor/fileapi/FileAPI.exif.js
5
- //= require redditor/fileapi/tmpl
6
- //= require redditor/fileapi/uploader
@@ -1,143 +0,0 @@
1
- //= require fileapi/config
2
- //= require fileapi/FileAPI.min
3
- //= require fileapi/FileAPI.id3.js
4
- //= require fileapi/FileAPI.exif.js
5
- //= require fileapi/tmpl
6
-
7
- window.FU =
8
- config:
9
- uploadUrl: '/photos'
10
- maxFileSizeMB: 10
11
- messages:
12
- error: "Ошибка"
13
- done: "Загружено"
14
- data: ->
15
- icon:
16
- image: "//cdn1.iconfinder.com/data/icons/humano2/32x32/apps/synfig_icon.png"
17
-
18
- files: []
19
- index: 0
20
- active: false
21
-
22
- add: (file) ->
23
- FU.files.push file
24
- if /^image/.test(file.type)
25
- FileAPI.Image(file).preview(35).rotate("auto").get (err, img) ->
26
- FU._getEl(file, ".js-left").addClass("b-file__left_border").html img unless err
27
-
28
- getFileById: (id) ->
29
- i = FU.files.length
30
- return FU.files[i] if FileAPI.uid(FU.files[i]) is id while i--
31
-
32
- start: ->
33
- FU._upload FU.files[FU.index] if not FU.active and (FU.active = FU.files.length > FU.index)
34
-
35
- abort: (id) ->
36
- file = @getFileById(id)
37
- file.xhr.abort() if file.xhr
38
-
39
- _getEl: (file, sel) ->
40
- $el = $("#file-" + FileAPI.uid(file))
41
- (if sel then $el.find(sel) else $el)
42
-
43
- _upload: (file) ->
44
- if file
45
- FileAPI.upload(
46
- url: FU.config.uploadUrl+"?authenticity_token=#{encodeURIComponent($("meta[name=\"csrf-token\"]").attr("content"))}"
47
- data: FU.config.data()
48
- dataType: "script"
49
-
50
- files:
51
- file: file
52
-
53
- upload: ->
54
- FU._getEl(file).addClass "b-file_upload"
55
- FU._getEl(file, ".js-progress").css(opacity: 0).show().animate
56
- opacity: 1
57
- , 100
58
-
59
- progress: (evt) ->
60
- FU._getEl(file, ".js-bar").css "width", evt.loaded / evt.total * 100 + "%"
61
-
62
- complete: (err, xhr) ->
63
- console.log(xhr.responseText)
64
- setTimeout(xhr.responseText, 10)
65
-
66
- state = (if err then "error" else "done")
67
- FU._getEl(file).find("i.b-file__abort").replaceWith("<input type='hidden' name='property[photo_ids][]' value='#{xhr.responseText}'><a id='photo_#{xhr.responseText}' data-remote='true' data-method='delete' class='b-file__abort' href='/photos/#{xhr.responseText}'>&times;</a>")
68
- # FU._getEl(file, ".js-progress").animate
69
- # opacity: 0
70
- # , 200, ->
71
- # $(@).hide().closest("div.js-file").delay(1000).fadeOut 200, ->
72
- # $(@).remove()
73
-
74
- FU._getEl(file, ".js-info").append ", <b class=\"b-file__" + state + "\">" + ((if err then (xhr.statusText or err) else FU.config.messages[state])) + "</b>"
75
- FU.index++
76
- FU.active = false
77
- FU.start()
78
- )
79
-
80
- template: '<div id="file-<%=FileAPI.uid(file)%>" class="js-file b-file b-file_<%=file.type.split("/")[0]%>">
81
- <div class="js-left b-file__left">
82
- <img src="<%=icon[file.type.split("/")[0]]||icon.def%>" width="32" height="32" style="margin: 2px 0 0 3px"/>
83
- </div>
84
- <div class="b-file__right">
85
- <div class="js-name b-file__name"><%=file.name%></div>
86
- <div class="js-info b-file__info">Размер: <%=(file.size/FileAPI.KB).toFixed(2)%> KB</div>
87
- <div class="js-progress b-file__bar" style="display: none">
88
- <div class="b-progress"><div class="js-bar b-progress__bar"></div></div>
89
- </div>
90
- </div>
91
- <i class="js-abort b-file__abort" title="abort">&times;</i>
92
- </div>'
93
-
94
-
95
- window.onFiles = (files, context) ->
96
- $context = $(context)
97
- if uploadUrl = $context.data("upload-url")
98
- FU.config.uploadUrl = uploadUrl
99
-
100
- if contentBlockId = $context.data("content-block-id")
101
- FU.config.data = ->
102
- REDDE.redditor.parameterizationForm $context.closest("dd")
103
- else
104
- FU.config.data = ->
105
-
106
- FileAPI.each files, (file) ->
107
- if file.size >= FU.config.maxFileSizeMB * FileAPI.MB
108
- alert "Sorrow.\nMax size #{FU.config.maxFileSizeMB}MB"
109
- else if file.size is undefined
110
- $("#oooops").show()
111
- $("#buttons-panel").hide()
112
- else
113
- $("#preview").append tmpl(window.FU.template,
114
- file: file
115
- icon: FU.icon
116
- )
117
- FU.add file
118
- FU.start()
119
-
120
- window.initDnd = ->
121
- if FileAPI.support.dnd
122
- $('#drag-n-drop').show() #выводим текст с сообщение что работает dnd
123
- $('#drop-zone').dnd (over) ->
124
- return
125
- , (files) ->
126
- onFiles files, this
127
- return
128
-
129
- $ ->
130
- initDnd()
131
-
132
- $(document).dnd (over) ->
133
- $('#drop-zone').toggleClass "active", over #Если кто-то перетащил файлы в браузер подсвечиваем область в которую их можно бросить
134
- return
135
- , ->
136
-
137
- $(document).on 'change', 'input[type="file"][name="files"]', (evt) ->
138
- files = FileAPI.getFiles(evt)
139
- onFiles(files, this)
140
- FileAPI.reset(evt.currentTarget)
141
- return
142
-
143
- return