uploadcare-rails 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.md +24 -0
- data/Rakefile +27 -0
- data/lib/uploadcare-rails.rb +4 -134
- data/lib/uploadcare/rails/action_view.rb +27 -0
- data/lib/uploadcare/rails/active_record.rb +34 -0
- data/lib/uploadcare/rails/engine.rb +26 -0
- data/lib/uploadcare/rails/settings.rb +30 -0
- data/lib/uploadcare/rails/simple_form.rb +9 -0
- data/lib/{uploadcare-rails → uploadcare/rails}/version.rb +1 -1
- metadata +113 -25
- data/init.rb +0 -4
- data/lib/uploadcare-rails/engine.rb +0 -6
- data/lib/uploadcare-rails/exception.rb +0 -11
- data/lib/uploadcare-rails/inject.rb +0 -24
- data/lib/uploadcare-rails/install.rb +0 -59
- data/lib/uploadcare-rails/simple_form.rb +0 -22
- data/lib/uploadcare-rails/upload.rb +0 -106
- data/vendor/assets/javascripts/uploadcare.js +0 -1777
- data/vendor/assets/javascripts/uploadcare.min.js +0 -1
data/init.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
class Uploadcare::Rails::Error < RuntimeError
|
2
|
-
end
|
3
|
-
|
4
|
-
class Uploadcare::Rails::InstallationError < Uploadcare::Rails::Error
|
5
|
-
end
|
6
|
-
|
7
|
-
class Uploadcare::Rails::CommunicationError < Uploadcare::Rails::Error
|
8
|
-
end
|
9
|
-
|
10
|
-
class Uploadcare::Rails::DatabaseError < Uploadcare::Rails::Error
|
11
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'uploadcare-rails'
|
2
|
-
|
3
|
-
module Uploadcare::Rails::Inject
|
4
|
-
if defined? Rails::Railtie
|
5
|
-
require 'rails'
|
6
|
-
|
7
|
-
class Railtie < Rails::Railtie
|
8
|
-
initializer 'uploadcare.insert_into_active_record' do
|
9
|
-
ActiveSupport.on_load :active_record do
|
10
|
-
Uploadcare::Rails.install unless Uploadcare::Rails.installed?
|
11
|
-
Uploadcare::Rails::Inject.try_inject
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.try_inject
|
18
|
-
ActiveRecord::Base.send(:include, Uploadcare::Rails::ActiveRecord) if defined? ActiveRecord
|
19
|
-
ActionView::Helpers::FormBuilder.send(:include, Uploadcare::Rails::FormBuilder) if defined? ActionView
|
20
|
-
if defined? SimpleForm::Inputs
|
21
|
-
require 'uploadcare-rails/simple_form'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module Uploadcare::Rails::Install
|
2
|
-
def self.installed?
|
3
|
-
File.exist?(self.config_location)
|
4
|
-
end
|
5
|
-
|
6
|
-
def self.install
|
7
|
-
loc = self.config_location
|
8
|
-
config = self.default_config
|
9
|
-
|
10
|
-
f = File.open(loc, "w")
|
11
|
-
begin
|
12
|
-
f.puts config.to_yaml
|
13
|
-
rescue
|
14
|
-
raise Uploadcare::Rails::InstallationError, "Failed to write configuration file in '#{loc}'", caller
|
15
|
-
ensure
|
16
|
-
f.close unless f.nil?
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.backup_config(filename = "")
|
21
|
-
if filename.empty?
|
22
|
-
filename = self.get_location "uploadcare.yml.old"
|
23
|
-
filename += ".old" if File.exist?(filename)
|
24
|
-
end
|
25
|
-
begin
|
26
|
-
FileUtils.copy_file self.config_location, filename
|
27
|
-
rescue
|
28
|
-
raise Uploadcare::Rails::InstallationError, "Failed to backup configuration file to '#{filename}'", caller
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.rewrite_config(backup = true)
|
33
|
-
if self.installed? && backup
|
34
|
-
self.backup_config
|
35
|
-
end
|
36
|
-
self.install
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.default_config
|
40
|
-
Hash[
|
41
|
-
"public_key" => "",
|
42
|
-
"private_key" => "",
|
43
|
-
"widget_type" => "plain"
|
44
|
-
]
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.config_location
|
48
|
-
self.get_location "uploadcare.yml"
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.get_location(filename)
|
52
|
-
if defined? Rails && !Rails.root.blank?
|
53
|
-
Rails.root.join("config", filename)
|
54
|
-
else
|
55
|
-
# Try relative path
|
56
|
-
"config/#{filename}"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'uploadcare-rails'
|
2
|
-
|
3
|
-
module SimpleForm::Inputs
|
4
|
-
class UploadcareInput < Base
|
5
|
-
def input
|
6
|
-
config = ::Uploadcare::Rails.config
|
7
|
-
options = {}
|
8
|
-
options[:role] ||= case config["widget_type"]
|
9
|
-
when "plain"
|
10
|
-
"uploadcare-plain-uploader"
|
11
|
-
when "line"
|
12
|
-
"uploadcare-line-uploader"
|
13
|
-
else
|
14
|
-
"uploadcare-plain-uploader"
|
15
|
-
end
|
16
|
-
options["data-public-key"] ||= config["public_key"]
|
17
|
-
options[:type] ||= "hidden"
|
18
|
-
|
19
|
-
"#{@builder.input_field(attribute_name, input_html_options.merge(options))}".html_safe
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
require 'uploadcare'
|
2
|
-
|
3
|
-
class Uploadcare::Rails::Upload
|
4
|
-
SERVICES_URL = 'http://services.uploadcare.com'
|
5
|
-
IMAGE_MIMES = ['jpeg', 'jpg', 'png', 'gif', 'tiff'].map!{|x| "image/#{x}"}
|
6
|
-
attr_reader :uuid
|
7
|
-
|
8
|
-
def initialize(field_method, options, instance)
|
9
|
-
@_field_method = field_method
|
10
|
-
@_options = options
|
11
|
-
@_instance = instance
|
12
|
-
@uuid = self.uuid_value
|
13
|
-
end
|
14
|
-
|
15
|
-
def removed?
|
16
|
-
inf = self.file_info
|
17
|
-
!inf["removed"].blank? && inf["removed"]
|
18
|
-
end
|
19
|
-
|
20
|
-
def image?
|
21
|
-
IMAGE_MIMES.include?(@_file_info["mime_type"])
|
22
|
-
end
|
23
|
-
|
24
|
-
def url
|
25
|
-
self.file_info["url"]
|
26
|
-
end
|
27
|
-
|
28
|
-
def resized_url(to = '640x480')
|
29
|
-
url = [SERVICES_URL].push('resizer').push(@uuid).push(to).join('/')
|
30
|
-
url + "/"
|
31
|
-
end
|
32
|
-
|
33
|
-
def crop_url(to = '640x480')
|
34
|
-
url = [self.resized_url(to)].push('crop').join('/')
|
35
|
-
url + "/"
|
36
|
-
end
|
37
|
-
|
38
|
-
def original_url
|
39
|
-
self.file_info["original_file_url"]
|
40
|
-
end
|
41
|
-
|
42
|
-
def size
|
43
|
-
self.file_info["size"].blank? ? 0 : self.file_info["size"]
|
44
|
-
end
|
45
|
-
|
46
|
-
def kept?
|
47
|
-
!self.file_info["last_keep_claim"].blank?
|
48
|
-
end
|
49
|
-
|
50
|
-
def file_info
|
51
|
-
get_file_info
|
52
|
-
end
|
53
|
-
|
54
|
-
def assign_uuid(new_uuid)
|
55
|
-
if @_options[:auto_keep]
|
56
|
-
self.keep
|
57
|
-
else
|
58
|
-
self.reload unless new_uuid.blank?
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def uuid_value
|
63
|
-
@_instance.send("#{@_field_method.to_s}_before_type_cast")
|
64
|
-
end
|
65
|
-
|
66
|
-
def keep
|
67
|
-
f = self.get_file_instance
|
68
|
-
f.keep
|
69
|
-
self.reload
|
70
|
-
end
|
71
|
-
|
72
|
-
def reload
|
73
|
-
save_instance
|
74
|
-
end
|
75
|
-
|
76
|
-
def remove
|
77
|
-
self.get_file_instance.remove
|
78
|
-
save_instance
|
79
|
-
end
|
80
|
-
|
81
|
-
protected
|
82
|
-
def get_file_info
|
83
|
-
f = self.get_file_instance
|
84
|
-
f.info
|
85
|
-
end
|
86
|
-
|
87
|
-
def get_file_instance
|
88
|
-
self.load_config
|
89
|
-
self.load_api_client
|
90
|
-
|
91
|
-
@_api_client.file(@uuid)
|
92
|
-
end
|
93
|
-
|
94
|
-
def load_config
|
95
|
-
@_config = ::Uploadcare::Rails.config if @_config.nil?
|
96
|
-
end
|
97
|
-
|
98
|
-
def load_api_client
|
99
|
-
self.load_config if @_config.nil?
|
100
|
-
@_api_client = ::Uploadcare.new(@_config["public_key"], @_config["private_key"])
|
101
|
-
end
|
102
|
-
|
103
|
-
def save_instance
|
104
|
-
@_instance.save unless self.uuid_value.blank?
|
105
|
-
end
|
106
|
-
end
|
@@ -1,1777 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Copyright (c) 2011 UploadCare
|
3
|
-
*
|
4
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
-
* of this software and associated documentation files (the "Software"), to deal
|
6
|
-
* in the Software without restriction, including without limitation the rights
|
7
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
-
* copies of the Software, and to permit persons to whom the Software is
|
9
|
-
* furnished to do so, subject to the following conditions:
|
10
|
-
*
|
11
|
-
* The above copyright notice and this permission notice shall be included in
|
12
|
-
* all copies or substantial portions of the Software.
|
13
|
-
*
|
14
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
|
-
* SOFTWARE.
|
21
|
-
*/
|
22
|
-
|
23
|
-
;(function () {
|
24
|
-
"use strict";
|
25
|
-
|
26
|
-
window.UploadCare = {
|
27
|
-
|
28
|
-
// Function, which are waiting UploadCare initializing.
|
29
|
-
_readyCallbacks: [],
|
30
|
-
|
31
|
-
// jQuery version for UploadCare.
|
32
|
-
_jQueryMinVersion: [1, 5, 0],
|
33
|
-
|
34
|
-
// URL to get jQuery from CDN.
|
35
|
-
_jQueryCDN: 'http://ajax.googleapis.com/ajax/libs/' +
|
36
|
-
'jquery/1.6.2/jquery.js',
|
37
|
-
|
38
|
-
// Is UploadCare initialized.
|
39
|
-
initialized: false,
|
40
|
-
|
41
|
-
// jQuery object for UploadCare.
|
42
|
-
jQuery: null,
|
43
|
-
|
44
|
-
// API public key.
|
45
|
-
publicKey: null,
|
46
|
-
|
47
|
-
//Base URL
|
48
|
-
uploadBaseUrl: "http://upload.uploadcare.com",
|
49
|
-
|
50
|
-
//URLs for widget internals. Set before initialization.
|
51
|
-
urls: {
|
52
|
-
byIframe: {
|
53
|
-
upload: "",
|
54
|
-
},
|
55
|
-
byUrl: {
|
56
|
-
upload: "",
|
57
|
-
status: ""
|
58
|
-
},
|
59
|
-
byXHR2: {
|
60
|
-
upload: ""
|
61
|
-
},
|
62
|
-
fileInfo: ""
|
63
|
-
},
|
64
|
-
|
65
|
-
instances: {},
|
66
|
-
|
67
|
-
// Call `callback`, when HTML is loaded.
|
68
|
-
_domReady: function (callback) {
|
69
|
-
var self = this;
|
70
|
-
var isLoaded = false;
|
71
|
-
var unbind = null;
|
72
|
-
var loaded = function () {
|
73
|
-
if ( isLoaded ) {
|
74
|
-
return;
|
75
|
-
}
|
76
|
-
isLoaded = true;
|
77
|
-
unbind();
|
78
|
-
callback.call(self)
|
79
|
-
}
|
80
|
-
|
81
|
-
if ( document.readyState === 'complete' ) {
|
82
|
-
callback.call(this);
|
83
|
-
return;
|
84
|
-
} else if ( document.addEventListener ) {
|
85
|
-
unbind = function () {
|
86
|
-
document.removeEventListener('DOMContentLoaded', loaded, false);
|
87
|
-
}
|
88
|
-
document.addEventListener('DOMContentLoaded', loaded, false);
|
89
|
-
window.addEventListener('load', loaded, false);
|
90
|
-
} else {
|
91
|
-
unbind = function () {
|
92
|
-
document.detachEvent('onreadystatechange', loaded, false);
|
93
|
-
}
|
94
|
-
document.attachEvent('onreadystatechange', loaded, false);
|
95
|
-
window.attachEvent('load', loaded, false);
|
96
|
-
}
|
97
|
-
},
|
98
|
-
|
99
|
-
// Call all callbacks, which were added by `ready` method.
|
100
|
-
_callReadyCallbacks: function () {
|
101
|
-
this.initialized = true;
|
102
|
-
for (var i = 0; i < this._readyCallbacks.length; i++) {
|
103
|
-
this._readyCallbacks[i].call(this, this.jQuery);
|
104
|
-
}
|
105
|
-
},
|
106
|
-
|
107
|
-
// Generate UUID for upload file ID.
|
108
|
-
// Taken from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
|
109
|
-
_uuid: function () {
|
110
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.
|
111
|
-
replace(/[xy]/g, function(c) {
|
112
|
-
var r = Math.random() * 16|0,
|
113
|
-
v = (c == 'x' ? r : (r&0x3|0x8));
|
114
|
-
return v.toString(16);
|
115
|
-
});
|
116
|
-
},
|
117
|
-
|
118
|
-
// Check, that jQuery loaded and have correct version. `noCallback` will be
|
119
|
-
// call, if page doesn’t have jQuery, `versionCallback` – if page have
|
120
|
-
// wrong version of jQuery.
|
121
|
-
_checkJQuery: function (jQuery, noCallback, versionCallback) {
|
122
|
-
if ( !jQuery || typeof(jQuery) === "undefined" ) {
|
123
|
-
noCallback.call(this);
|
124
|
-
return;
|
125
|
-
}
|
126
|
-
var require, subversion, version = jQuery.fn.jquery.split('.');
|
127
|
-
for (var i = 0; i < this._jQueryMinVersion.length; i++) {
|
128
|
-
require = this._jQueryMinVersion[i]
|
129
|
-
subversion = parseInt(version[i]);
|
130
|
-
if ( require > subversion ) {
|
131
|
-
versionCallback.call(this);
|
132
|
-
return;
|
133
|
-
} else if ( require < subversion ) {
|
134
|
-
this._getJQuery();
|
135
|
-
return;
|
136
|
-
}
|
137
|
-
}
|
138
|
-
this._getJQuery();
|
139
|
-
},
|
140
|
-
|
141
|
-
// Copy jQuery to UploadCare object and run all callbacks.
|
142
|
-
_getJQuery: function () {
|
143
|
-
if ( typeof(window.jQuery) !== "undefined" ) {
|
144
|
-
this.jQuery = window.jQuery;
|
145
|
-
}
|
146
|
-
this._callReadyCallbacks();
|
147
|
-
},
|
148
|
-
|
149
|
-
// Load own jQuery for UploadCare.
|
150
|
-
_loadJQuery: function () {
|
151
|
-
var script = document.createElement('script');
|
152
|
-
script.src = this._jQueryCDN;
|
153
|
-
script.onload = script.onreadystatechange = function () {
|
154
|
-
if ( typeof(window.jQuery) !== "undefined" ) {
|
155
|
-
window.jQuery.noConflict();
|
156
|
-
UploadCare.jQuery = window.jQuery;
|
157
|
-
window.jQuery = UploadCare._originjQuery;
|
158
|
-
delete UploadCare._originjQuery;
|
159
|
-
UploadCare._callReadyCallbacks();
|
160
|
-
}
|
161
|
-
};
|
162
|
-
|
163
|
-
var head = document.getElementsByTagName('head')[0];
|
164
|
-
if ( !head ) {
|
165
|
-
head = document.body;
|
166
|
-
}
|
167
|
-
|
168
|
-
if ( typeof(window.jQuery) !== "undefined" ) {
|
169
|
-
this._originjQuery = window.jQuery;
|
170
|
-
}
|
171
|
-
|
172
|
-
head.appendChild(script);
|
173
|
-
},
|
174
|
-
|
175
|
-
// Get user public key from current script tag.
|
176
|
-
// If no key presents, try to get public key from input tag.
|
177
|
-
_getPublicKey: function () {
|
178
|
-
var scripts = document.getElementsByTagName('script');
|
179
|
-
var current = scripts[scripts.length - 1];
|
180
|
-
this.publicKey = current.getAttribute('data-public-key');
|
181
|
-
|
182
|
-
if ( UploadCare.publicKey === void 0 || UploadCare.publicKey === null ) {
|
183
|
-
UploadCare.ready(function($) {
|
184
|
-
$(document).ready(function() {
|
185
|
-
var input = $('input[data-public-key]');
|
186
|
-
UploadCare.publicKey = input.attr('data-public-key');
|
187
|
-
});
|
188
|
-
});
|
189
|
-
}
|
190
|
-
},
|
191
|
-
|
192
|
-
// Return init method for widget. It will try to find inputs with some
|
193
|
-
// `role` in DOM or jQuery node and call widget’s `enlive` method.
|
194
|
-
_widgetInit: function (role) {
|
195
|
-
return function (base) {
|
196
|
-
var widget = this;
|
197
|
-
UploadCare.ready(function ($) {
|
198
|
-
var inputs = null;
|
199
|
-
var $ = UploadCare.jQuery;
|
200
|
-
if ( typeof(base.jquery) == 'undefined' ) {
|
201
|
-
if ( base.tagName == 'INPUT') {
|
202
|
-
inputs = $(base);
|
203
|
-
}
|
204
|
-
} else {
|
205
|
-
if ( base.is('input') ) {
|
206
|
-
inputs = base;
|
207
|
-
}
|
208
|
-
}
|
209
|
-
if ( inputs === null ) {
|
210
|
-
inputs = $('[role~=' + role + ']', base);
|
211
|
-
}
|
212
|
-
|
213
|
-
inputs.each(function (_, input) {
|
214
|
-
var instanceId = UploadCare._id();
|
215
|
-
|
216
|
-
if ( typeof(UploadCare.instances[instanceId]) === 'undefined' ) {
|
217
|
-
UploadCare.instances[instanceId] = {};
|
218
|
-
}
|
219
|
-
input.setAttribute('data-instance-id', instanceId);
|
220
|
-
|
221
|
-
if ( input.getAttribute('data-upload-base-url') !== null ) {
|
222
|
-
UploadCare.instances[instanceId].uploadBaseUrl = input.getAttribute('data-upload-base-url');
|
223
|
-
UploadCare.setUrls(input.getAttribute('data-upload-base-url'));
|
224
|
-
} else {
|
225
|
-
UploadCare.instances[instanceId].uploadBaseUrl = UploadCare.uploadBaseUrl;
|
226
|
-
}
|
227
|
-
|
228
|
-
UploadCare.instances[instanceId].urls = UploadCare.makeUrls( UploadCare.instances[instanceId].uploadBaseUrl );
|
229
|
-
|
230
|
-
if( input.getAttribute('data-public-key') !== null ) {
|
231
|
-
UploadCare.instances[instanceId].publicKey = input.getAttribute('data-public-key');
|
232
|
-
} else {
|
233
|
-
UploadCare.instances[instanceId].publicKey = UploadCare.publicKey;
|
234
|
-
}
|
235
|
-
|
236
|
-
if( input.getAttribute('data-override-style') !== null ) {
|
237
|
-
UploadCare.instances[instanceId].overrideStyle = input.getAttribute('data-override-style');
|
238
|
-
}
|
239
|
-
|
240
|
-
if( input.getAttribute('data-only-images') !== null ) {
|
241
|
-
UploadCare.instances[instanceId].onlyImages = parseInt( input.getAttribute('data-only-images') );
|
242
|
-
}
|
243
|
-
|
244
|
-
UploadCare._makeStateful(UploadCare.instances[instanceId]);
|
245
|
-
|
246
|
-
widget.enlive(input);
|
247
|
-
});
|
248
|
-
});
|
249
|
-
}
|
250
|
-
},
|
251
|
-
|
252
|
-
// Add `translation` in some `locale` as `widget` messages.
|
253
|
-
//
|
254
|
-
// Instead of replace `widget.messages` it will doesn’t change object link,
|
255
|
-
// so you can copy `widget.messages` to `t` variable shortcut in
|
256
|
-
// widget code, before add translation.
|
257
|
-
//
|
258
|
-
// Also it will set `messages.locale` with current locale code.
|
259
|
-
_translate: function (widget, locale, translation) {
|
260
|
-
widget.messages.locale = locale;
|
261
|
-
for ( var name in translation ) {
|
262
|
-
widget.messages[name] = translation[name];
|
263
|
-
}
|
264
|
-
},
|
265
|
-
|
266
|
-
// Create Deferred promise object and add jQuery AJAX like proxy callbacks.
|
267
|
-
_promise: function (deferred, extend) {
|
268
|
-
if ( typeof(extend) == 'undefined' ) {
|
269
|
-
extend = {
|
270
|
-
progress: function () {}
|
271
|
-
};
|
272
|
-
}
|
273
|
-
|
274
|
-
if ( typeof(deferred.state) == 'undefined' ) {
|
275
|
-
deferred.state = function() {
|
276
|
-
return deferred.isResolved() ? "resolved" : (deferred.isRejected() ? "rejected" : "pending");
|
277
|
-
}
|
278
|
-
}
|
279
|
-
|
280
|
-
var promise = deferred.promise(extend);
|
281
|
-
promise.success = promise.done;
|
282
|
-
promise.error = promise.fail;
|
283
|
-
promise.complete = promise.always;
|
284
|
-
return promise;
|
285
|
-
},
|
286
|
-
|
287
|
-
// Return upload params by options hash.
|
288
|
-
_params: function (options) {
|
289
|
-
if ( typeof(options) == 'undefined' ) {
|
290
|
-
options = { };
|
291
|
-
}
|
292
|
-
|
293
|
-
var params = {
|
294
|
-
UPLOADCARE_PUB_KEY: options.publicKey || this.publicKey,
|
295
|
-
};
|
296
|
-
if ( options.meduim ) {
|
297
|
-
params.UPLOADCARE_MEDIUM = options.meduim;
|
298
|
-
}
|
299
|
-
if ( options.instanceId ) {
|
300
|
-
params.UPLOADCARE_INSTANCE_ID = options.instanceId;
|
301
|
-
}
|
302
|
-
|
303
|
-
return params;
|
304
|
-
},
|
305
|
-
|
306
|
-
_makeStateful: function(object) {
|
307
|
-
object.state = {};
|
308
|
-
|
309
|
-
var stateful = {
|
310
|
-
current: 'idle',
|
311
|
-
previous: null,
|
312
|
-
callbacks: {},
|
313
|
-
set: function(state) {
|
314
|
-
this.previous = this.current;
|
315
|
-
this.current = state;
|
316
|
-
//console.log('State set to ' + state + ' from ' + this.previous);
|
317
|
-
this.runCallbacks(state);
|
318
|
-
},
|
319
|
-
get: function() {
|
320
|
-
return this.current;
|
321
|
-
},
|
322
|
-
setCallback: function(state, callback) {
|
323
|
-
if ( typeof(this.callbacks[state]) == 'undefined' ) {
|
324
|
-
this.callbacks[state] = [];
|
325
|
-
}
|
326
|
-
this.callbacks[state].push(callback);
|
327
|
-
|
328
|
-
if ( this.get() == state ) {
|
329
|
-
this.runCallbacks(state);
|
330
|
-
}
|
331
|
-
|
332
|
-
return this;
|
333
|
-
},
|
334
|
-
runCallbacks: function(state) {
|
335
|
-
var $ = UploadCare.jQuery;
|
336
|
-
var prev = this.previous;
|
337
|
-
if ( typeof(this.callbacks[state]) !== 'undefined' && this.callbacks[state].length > 0 ) {
|
338
|
-
var callbacks = this.callbacks[state];
|
339
|
-
$(callbacks).each(function() {
|
340
|
-
this($, prev);
|
341
|
-
});
|
342
|
-
}
|
343
|
-
},
|
344
|
-
clearCallbacks: function(state) {
|
345
|
-
delete this.callbacks[state];
|
346
|
-
}
|
347
|
-
}
|
348
|
-
|
349
|
-
object.state = stateful;
|
350
|
-
},
|
351
|
-
|
352
|
-
_id: function() {
|
353
|
-
return 'id' + parseInt(Math.random() * (100000 - 1) + 1);
|
354
|
-
},
|
355
|
-
|
356
|
-
// Initialize jQuery object and call all function added by `ready`.
|
357
|
-
init: function () {
|
358
|
-
var _jq;
|
359
|
-
|
360
|
-
if ( typeof(window.jQuery) !== "undefined" ) {
|
361
|
-
_jq = window.jQuery;
|
362
|
-
}
|
363
|
-
|
364
|
-
this._checkJQuery(_jq,
|
365
|
-
function () {
|
366
|
-
this._domReady(function () {
|
367
|
-
this._checkJQuery(_jq,
|
368
|
-
this._loadJQuery, this._loadJQuery);
|
369
|
-
});
|
370
|
-
},
|
371
|
-
this._loadJQuery);
|
372
|
-
},
|
373
|
-
|
374
|
-
// Call `callback` when UploadCare will be initialized. First argument will
|
375
|
-
// by jQuery object.
|
376
|
-
ready: function (callback) {
|
377
|
-
if ( this.initialized ) {
|
378
|
-
callback.call(this, this.jQuery);
|
379
|
-
} else {
|
380
|
-
this._readyCallbacks.push(callback)
|
381
|
-
}
|
382
|
-
},
|
383
|
-
|
384
|
-
// Upload file to UploadCare and return jQuery Deferred promise.
|
385
|
-
// UUID for uploaded file will be send to `done` callback.
|
386
|
-
//
|
387
|
-
// If `file` will be file input, `upload` will use iframe method to upload
|
388
|
-
// file from user.
|
389
|
-
//
|
390
|
-
// If `file` will be string, `upload` will request UploadCare servers to
|
391
|
-
// upload file from this URL. In this case promise will contain `progress`
|
392
|
-
// function to add callbacks to uploading status.
|
393
|
-
upload: function (file, options) {
|
394
|
-
var params = this._params(options);
|
395
|
-
|
396
|
-
if ( typeof(file) == 'string' ) {
|
397
|
-
return this.byUrl.upload(file, params);
|
398
|
-
} else {
|
399
|
-
return this.byIframe.upload(file, params);
|
400
|
-
}
|
401
|
-
},
|
402
|
-
|
403
|
-
makeUrls: function(uploadBaseUrl) {
|
404
|
-
uploadBaseUrl = typeof(uploadBaseUrl) === "undefined" ? this.uploadBaseUrl : uploadBaseUrl;
|
405
|
-
|
406
|
-
if ( uploadBaseUrl.slice(-1) === "/" ) {
|
407
|
-
uploadBaseUrl = uploadBaseUrl.slice(0, -1);
|
408
|
-
}
|
409
|
-
|
410
|
-
var urls = {
|
411
|
-
byUrl: {
|
412
|
-
upload: "" + uploadBaseUrl + "/from_url/",
|
413
|
-
status: "" + uploadBaseUrl + "/status/"
|
414
|
-
},
|
415
|
-
byIframe: {
|
416
|
-
upload: "" + uploadBaseUrl + "/iframe/"
|
417
|
-
},
|
418
|
-
byXHR2: {
|
419
|
-
upload: "" + uploadBaseUrl + "/iframe/"
|
420
|
-
},
|
421
|
-
fileInfo: "" + uploadBaseUrl + "/info/"
|
422
|
-
}
|
423
|
-
|
424
|
-
return urls;
|
425
|
-
},
|
426
|
-
|
427
|
-
setUrls: function(uploadBaseUrl) {
|
428
|
-
this.urls = this.makeUrls(uploadBaseUrl);
|
429
|
-
},
|
430
|
-
|
431
|
-
getInstance: function(instanceId) {
|
432
|
-
return UploadCare.instances[instanceId];
|
433
|
-
},
|
434
|
-
|
435
|
-
getInstanceOptions: function(instanceId) {
|
436
|
-
var opts = { };
|
437
|
-
if ( typeof(UploadCare.instances[instanceId]) !== 'undefined' ) {
|
438
|
-
opts = UploadCare.instances[instanceId];
|
439
|
-
}
|
440
|
-
return opts;
|
441
|
-
}
|
442
|
-
};
|
443
|
-
|
444
|
-
// Driver to upload file by iframe.
|
445
|
-
UploadCare.byIframe = {
|
446
|
-
// ID counter to have unique iframe IDs.
|
447
|
-
_lastIframeId: 0,
|
448
|
-
|
449
|
-
// Create iframe to upload file by AJAX.
|
450
|
-
_createIframe: function (instanceId) {
|
451
|
-
this._lastIframeId += 1;
|
452
|
-
var id = 'uploadcareIframe' + this._lastIframeId;
|
453
|
-
var iframe = UploadCare.jQuery('<iframe />').attr({ id: id, name: id });
|
454
|
-
iframe.css('position', 'absolute').css('top', '-9999px');
|
455
|
-
|
456
|
-
if ( instanceId !== void(0) ) {
|
457
|
-
iframe.addClass(instanceId);
|
458
|
-
}
|
459
|
-
|
460
|
-
iframe.appendTo('body');
|
461
|
-
return iframe;
|
462
|
-
},
|
463
|
-
|
464
|
-
_getUploadUrl: function() {
|
465
|
-
return UploadCare.urls.byIframe.upload;
|
466
|
-
},
|
467
|
-
|
468
|
-
// Create form, link it action to `iframe` and clone `file` inside.
|
469
|
-
_createFormForIframe: function (iframe, file, instanceId) {
|
470
|
-
var uploadUrl = this._getUploadUrl();
|
471
|
-
|
472
|
-
if ( instanceId ) {
|
473
|
-
uploadUrl = UploadCare.getInstanceOptions( instanceId ).urls.byIframe.upload;
|
474
|
-
}
|
475
|
-
|
476
|
-
var form = UploadCare.jQuery('<form />').attr({
|
477
|
-
method: 'POST',
|
478
|
-
action: uploadUrl,
|
479
|
-
enctype: 'multipart/form-data',
|
480
|
-
target: iframe.attr('id')
|
481
|
-
});
|
482
|
-
form.css('position', 'absolute').css('top', '-9999px');
|
483
|
-
|
484
|
-
var next = file.clone(true);
|
485
|
-
next.insertBefore(file);
|
486
|
-
form.appendTo('body');
|
487
|
-
file.appendTo(form);
|
488
|
-
|
489
|
-
return form;
|
490
|
-
},
|
491
|
-
|
492
|
-
// Upload file to UploadCare by iframe method and return jQuery Deferred.
|
493
|
-
upload: function (file, params) {
|
494
|
-
var id = UploadCare._uuid();
|
495
|
-
var instanceId = null;
|
496
|
-
var iframe = null;
|
497
|
-
var form = null;
|
498
|
-
var onlyImages = false;
|
499
|
-
|
500
|
-
if( typeof(params.UPLOADCARE_INSTANCE_ID) !== 'undefined' ) {
|
501
|
-
instanceId = params.UPLOADCARE_INSTANCE_ID;
|
502
|
-
delete params.UPLOADCARE_INSTANCE_ID;
|
503
|
-
}
|
504
|
-
|
505
|
-
iframe = this._createIframe(instanceId);
|
506
|
-
form = this._createFormForIframe(iframe, file, instanceId);
|
507
|
-
|
508
|
-
if ( instanceId ) {
|
509
|
-
params.UPLOADCARE_PUB_KEY = UploadCare.getInstanceOptions( instanceId ).publicKey;
|
510
|
-
}
|
511
|
-
|
512
|
-
params.UPLOADCARE_FILE_ID = id;
|
513
|
-
for ( var name in params ) {
|
514
|
-
UploadCare.jQuery('<input type="hidden" />').
|
515
|
-
attr('name', name).val(params[name]).appendTo(form);
|
516
|
-
}
|
517
|
-
|
518
|
-
var deferred = UploadCare.jQuery.Deferred();
|
519
|
-
var complete = function () {
|
520
|
-
iframe.remove();
|
521
|
-
form.remove();
|
522
|
-
};
|
523
|
-
|
524
|
-
var submit = function () {
|
525
|
-
iframe.bind('load', function (e) {
|
526
|
-
e.preventDefault();
|
527
|
-
deferred.resolve(id);
|
528
|
-
complete();
|
529
|
-
});
|
530
|
-
iframe.bind('error', function () {
|
531
|
-
deferred.reject();
|
532
|
-
complete();
|
533
|
-
});
|
534
|
-
|
535
|
-
form.submit();
|
536
|
-
};
|
537
|
-
|
538
|
-
if ( instanceId ) {
|
539
|
-
onlyImages = UploadCare.getInstanceOptions( instanceId ).onlyImages === 1 ? true : false;
|
540
|
-
}
|
541
|
-
|
542
|
-
if ( onlyImages ) {
|
543
|
-
if ( /(jpg|jpeg|bmp|gif|png)/.test( file.val().split('.')[1] ) === false ) {
|
544
|
-
deferred.reject('onlyImages');
|
545
|
-
complete();
|
546
|
-
} else {
|
547
|
-
submit();
|
548
|
-
}
|
549
|
-
} else {
|
550
|
-
submit();
|
551
|
-
}
|
552
|
-
|
553
|
-
return UploadCare._promise(deferred);
|
554
|
-
}
|
555
|
-
};
|
556
|
-
|
557
|
-
// Driver to upload file from Internet by URL.
|
558
|
-
UploadCare.byUrl = {
|
559
|
-
// Period in miliseconds to check uploading progress.
|
560
|
-
checkEvery: 1000,
|
561
|
-
|
562
|
-
_getUploadUrl: function() {
|
563
|
-
return UploadCare.urls.byUrl.upload;
|
564
|
-
},
|
565
|
-
|
566
|
-
_getStatusUrl: function() {
|
567
|
-
return UploadCare.urls.byUrl.status;
|
568
|
-
},
|
569
|
-
|
570
|
-
// Send request to start uploading from Internet.
|
571
|
-
upload: function (url, params) {
|
572
|
-
var deferred = UploadCare.jQuery.Deferred();
|
573
|
-
|
574
|
-
var watchers = [];
|
575
|
-
var promise = UploadCare._promise(deferred, {
|
576
|
-
progress: function (callback) {
|
577
|
-
watchers.push(callback);
|
578
|
-
return this;
|
579
|
-
}
|
580
|
-
});
|
581
|
-
|
582
|
-
var instanceId = null;
|
583
|
-
var uploadUrl = this._getUploadUrl() + "?";
|
584
|
-
var checking = null;
|
585
|
-
var check = function (token) {
|
586
|
-
UploadCare.byUrl.progress(token).
|
587
|
-
success(function (data) {
|
588
|
-
if ( data.status == 'failure' ) {
|
589
|
-
deferred.reject();
|
590
|
-
return;
|
591
|
-
}
|
592
|
-
for ( var i = 0; i < watchers.length; i++ ) {
|
593
|
-
watchers[i](data);
|
594
|
-
}
|
595
|
-
if ( data.status == 'success' ) {
|
596
|
-
deferred.resolve(data.file_id);
|
597
|
-
}
|
598
|
-
}).
|
599
|
-
error(function () {
|
600
|
-
deferred.reject();
|
601
|
-
})
|
602
|
-
};
|
603
|
-
|
604
|
-
if( typeof(params.UPLOADCARE_INSTANCE_ID) !== 'undefined' ) {
|
605
|
-
instanceId = params.UPLOADCARE_INSTANCE_ID;
|
606
|
-
delete params.UPLOADCARE_INSTANCE_ID;
|
607
|
-
}
|
608
|
-
|
609
|
-
params.pub_key = params.UPLOADCARE_PUB_KEY;
|
610
|
-
params.source_url = url;
|
611
|
-
|
612
|
-
if ( instanceId ) {
|
613
|
-
uploadUrl = UploadCare.getInstanceOptions( instanceId ).urls.byUrl.upload + "?";
|
614
|
-
params.pub_key = UploadCare.getInstanceOptions( instanceId ).publicKey;
|
615
|
-
}
|
616
|
-
|
617
|
-
delete params.UPLOADCARE_PUB_KEY;
|
618
|
-
|
619
|
-
for ( var name in params ) {
|
620
|
-
uploadUrl = "" + uploadUrl + "" + name + "=" + params[name] + "&";
|
621
|
-
}
|
622
|
-
|
623
|
-
uploadUrl = "" + uploadUrl + "jsoncallback=?";
|
624
|
-
|
625
|
-
if ( url.length == 0 ) {
|
626
|
-
deferred.reject('badFileUrl');
|
627
|
-
} else {
|
628
|
-
UploadCare.jQuery.ajax(uploadUrl, {dataType: "jsonp"}).
|
629
|
-
success(function (data) {
|
630
|
-
checking = setInterval(function () {
|
631
|
-
check(data.token);
|
632
|
-
}, UploadCare.byUrl.checkEvery);
|
633
|
-
}).
|
634
|
-
error(function () {
|
635
|
-
deferred.reject();
|
636
|
-
});
|
637
|
-
}
|
638
|
-
|
639
|
-
promise.complete(function() {
|
640
|
-
clearInterval(checking);
|
641
|
-
})
|
642
|
-
return promise;
|
643
|
-
},
|
644
|
-
|
645
|
-
// Request UploadCare about uploading status and return AJAX promise.
|
646
|
-
progress: function (token) {
|
647
|
-
var statusUrl = "" + this._getStatusUrl() + "?token=" + token + "&jsoncallback=?";
|
648
|
-
return UploadCare.jQuery.ajax(statusUrl, {dataType: "jsonp"});
|
649
|
-
},
|
650
|
-
};
|
651
|
-
|
652
|
-
UploadCare._getPublicKey();
|
653
|
-
UploadCare.setUrls();
|
654
|
-
UploadCare.init();
|
655
|
-
|
656
|
-
})();
|
657
|
-
/*
|
658
|
-
* Copyright (c) 2011 UploadCare
|
659
|
-
*
|
660
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
661
|
-
* of this software and associated documentation files (the "Software"), to deal
|
662
|
-
* in the Software without restriction, including without limitation the rights
|
663
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
664
|
-
* copies of the Software, and to permit persons to whom the Software is
|
665
|
-
* furnished to do so, subject to the following conditions:
|
666
|
-
*
|
667
|
-
* The above copyright notice and this permission notice shall be included in
|
668
|
-
* all copies or substantial portions of the Software.
|
669
|
-
*
|
670
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
671
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
672
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
673
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
674
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
675
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
676
|
-
* SOFTWARE.
|
677
|
-
*/
|
678
|
-
|
679
|
-
;(function () {
|
680
|
-
"use strict";
|
681
|
-
|
682
|
-
// Plain uploader widget without any style.
|
683
|
-
//
|
684
|
-
// It create simple file input before every hidden input with
|
685
|
-
// `uploadcare-plain-uploader` role. When user select file, widget will upload
|
686
|
-
// it by AJAX and set file ID to hidden input value.
|
687
|
-
//
|
688
|
-
// Widget will block form submit during file uploading.
|
689
|
-
//
|
690
|
-
// Don’t forget to add loading styles, when widget will upload files. Widget
|
691
|
-
// add `uploadcare-loading` to closes block with `uploadcare-container` role
|
692
|
-
// or to closest form.
|
693
|
-
//
|
694
|
-
// If you will add AJAX content and want to enlive new hidden inputs, call
|
695
|
-
// `UploadCare.Plain.init` with new content:
|
696
|
-
//
|
697
|
-
// $.get('/next/page', function (html) {
|
698
|
-
// var newContent = $(html).appendTo('.list');
|
699
|
-
// UploadCare.Plain.init(newContent);
|
700
|
-
// });
|
701
|
-
//
|
702
|
-
// You can add input for upload file from Internal by URL. Just set to hidden
|
703
|
-
// input `data-uploadcare-from-url` attribute with jQuery selector. On URL input
|
704
|
-
// you can set `data-uploadcare-submit` with selector to submit button.
|
705
|
-
// Or you can use `fromUrl` and `fromUrlSubmit` enlive’s options with jQuery
|
706
|
-
// objects.
|
707
|
-
UploadCare.Plain = {
|
708
|
-
|
709
|
-
// Add widgets to inputs inside `base`. You can pass DOM node or jQuery
|
710
|
-
// objects.
|
711
|
-
init: UploadCare._widgetInit('uploadcare-plain-uploader'),
|
712
|
-
|
713
|
-
// Add file input after hidden `input` to upload file to UploadCare.
|
714
|
-
//
|
715
|
-
// You can set widget name as `meduim` option.
|
716
|
-
enlive: function (input, options) {
|
717
|
-
var $ = UploadCare.jQuery;
|
718
|
-
var instance, instanceId;
|
719
|
-
|
720
|
-
if ( typeof(options) == 'undefined' ) {
|
721
|
-
options = { };
|
722
|
-
}
|
723
|
-
|
724
|
-
instanceId = $(input).attr('data-instance-id');
|
725
|
-
|
726
|
-
if ( instanceId ) {
|
727
|
-
instance = UploadCare.getInstance( instanceId );
|
728
|
-
}
|
729
|
-
|
730
|
-
if ( instance ) {
|
731
|
-
instance.state.set('startEnlive');
|
732
|
-
}
|
733
|
-
|
734
|
-
var hidden = $(input);
|
735
|
-
var file = $('<input type="file" name="file" />');
|
736
|
-
file.addClass('uploadcare-uploader');
|
737
|
-
file.insertAfter(hidden);
|
738
|
-
|
739
|
-
var upload = function (uploader) {
|
740
|
-
var form = uploader.closest('form');
|
741
|
-
var contain = uploader.closest('[role~=uploadcare-container]');
|
742
|
-
if ( contain.length == 0 ) {
|
743
|
-
contain = form;
|
744
|
-
}
|
745
|
-
contain.addClass('uploadcare-loading');
|
746
|
-
|
747
|
-
if ( instance ) {
|
748
|
-
if ( instance.state.current.match(/fromUrlEnter/) ) {
|
749
|
-
instance.state.set('fromUrlBeforeUpload');
|
750
|
-
} else {
|
751
|
-
instance.state.set('beforeUpload');
|
752
|
-
}
|
753
|
-
|
754
|
-
}
|
755
|
-
|
756
|
-
var submitBlocking = false;
|
757
|
-
form.bind('submit.uploadcare', function() {
|
758
|
-
submitBlocking = true;
|
759
|
-
return false;
|
760
|
-
})
|
761
|
-
|
762
|
-
var uploadOptions = { meduim: options.meduim || 'plain' };
|
763
|
-
|
764
|
-
var publicKey = hidden.data('public-key');
|
765
|
-
if ( publicKey ) {
|
766
|
-
uploadOptions.publicKey = publicKey;
|
767
|
-
}
|
768
|
-
|
769
|
-
if ( instanceId ) {
|
770
|
-
uploadOptions.instanceId = instanceId;
|
771
|
-
}
|
772
|
-
|
773
|
-
var uploadFrom = uploader;
|
774
|
-
if ( !uploader.is(':file') ) {
|
775
|
-
uploadFrom = uploader.val();
|
776
|
-
}
|
777
|
-
|
778
|
-
hidden.trigger('uploadcare-start');
|
779
|
-
|
780
|
-
if ( instance ) {
|
781
|
-
if ( instance.state.current.match(/fromUrl/) ) {
|
782
|
-
instance.state.set('fromUrlUpload');
|
783
|
-
} else {
|
784
|
-
instance.state.set('upload');
|
785
|
-
}
|
786
|
-
}
|
787
|
-
|
788
|
-
var uploading = UploadCare.upload(uploadFrom, uploadOptions);
|
789
|
-
|
790
|
-
uploading.progress(function (data) {
|
791
|
-
hidden.trigger('uploadcare-progress', data);
|
792
|
-
});
|
793
|
-
uploading.error(function (errorCode) {
|
794
|
-
errorCode = (void 0 === errorCode || null === errorCode) ? 'network' : errorCode;
|
795
|
-
hidden.trigger('uploadcare-error', errorCode);
|
796
|
-
hidden.trigger('uploadcare-complete');
|
797
|
-
});
|
798
|
-
uploading.success(function (id) {
|
799
|
-
if ( hidden.val() !== void(0) && hidden.val().length > 0 && hidden.attr('data-barebone') ) {
|
800
|
-
var vals = hidden.val().substr(1, hidden.val().length - 2).split(',');
|
801
|
-
vals.push(id);
|
802
|
-
hidden.val('[' + vals.join(',') + ']');
|
803
|
-
} else {
|
804
|
-
if (hidden.attr('data-barebone')) {
|
805
|
-
hidden.val('['+id+']');
|
806
|
-
} else {
|
807
|
-
hidden.val(id);
|
808
|
-
}
|
809
|
-
}
|
810
|
-
|
811
|
-
hidden.trigger('uploadcare-success', id);
|
812
|
-
hidden.trigger('uploadcare-complete');
|
813
|
-
|
814
|
-
contain.removeClass('uploadcare-loading');
|
815
|
-
|
816
|
-
if ( instance ) {
|
817
|
-
if ( instance.state.current.match(/fromUrl/) ) {
|
818
|
-
instance.state.set('fromUrlAfterUpload');
|
819
|
-
} else {
|
820
|
-
instance.state.set('afterUpload');
|
821
|
-
}
|
822
|
-
|
823
|
-
}
|
824
|
-
|
825
|
-
form.unbind('submit.uploadcare');
|
826
|
-
if ( submitBlocking ) {
|
827
|
-
form.submit();
|
828
|
-
}
|
829
|
-
});
|
830
|
-
}
|
831
|
-
|
832
|
-
var fromUrl = options.fromUrl;
|
833
|
-
if ( !fromUrl && hidden.data('uploadcare-from-url') ) {
|
834
|
-
var fromUrl = $(hidden.data('uploadcare-from-url'));
|
835
|
-
}
|
836
|
-
if ( fromUrl ) {
|
837
|
-
fromUrl.keypress(function (e) {
|
838
|
-
if ( e.keyCode == '13' ) { // Enter
|
839
|
-
upload(fromUrl);
|
840
|
-
e.preventDefault();
|
841
|
-
}
|
842
|
-
});
|
843
|
-
|
844
|
-
var submit = options.fromUrlSubmit;
|
845
|
-
if ( !submit && fromUrl.data('uploadcare-submit') ) {
|
846
|
-
submit = $(fromUrl.data('uploadcare-submit'));
|
847
|
-
}
|
848
|
-
if ( submit ) {
|
849
|
-
submit.click(function (e) {
|
850
|
-
upload(fromUrl);
|
851
|
-
e.preventDefault();
|
852
|
-
});
|
853
|
-
}
|
854
|
-
}
|
855
|
-
|
856
|
-
file.change(function () {
|
857
|
-
var file = $(this);
|
858
|
-
upload(file);
|
859
|
-
});
|
860
|
-
|
861
|
-
if ( instance ) {
|
862
|
-
instance.state.set('endEnlive');
|
863
|
-
}
|
864
|
-
|
865
|
-
return file;
|
866
|
-
}
|
867
|
-
|
868
|
-
};
|
869
|
-
|
870
|
-
})();
|
871
|
-
/*
|
872
|
-
* Copyright (c) 2011 UploadCare
|
873
|
-
*
|
874
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
875
|
-
* of this software and associated documentation files (the "Software"), to deal
|
876
|
-
* in the Software without restriction, including without limitation the rights
|
877
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
878
|
-
* copies of the Software, and to permit persons to whom the Software is
|
879
|
-
* furnished to do so, subject to the following conditions:
|
880
|
-
*
|
881
|
-
* The above copyright notice and this permission notice shall be included in
|
882
|
-
* all copies or substantial portions of the Software.
|
883
|
-
*
|
884
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
885
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
886
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
887
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
888
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
889
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
890
|
-
* SOFTWARE.
|
891
|
-
*/
|
892
|
-
|
893
|
-
;(function () {
|
894
|
-
"use strict";
|
895
|
-
|
896
|
-
var $;
|
897
|
-
|
898
|
-
UploadCare.ready(function (jQuery) {
|
899
|
-
$ = jQuery;
|
900
|
-
|
901
|
-
// Animation easing from jQuery Easing plugin by George McGinley Smith.
|
902
|
-
$.extend($.easing, {
|
903
|
-
easeInOutQuad: function (x, t, b, c, d) {
|
904
|
-
if ((t/=d/2) < 1) return c/2*t*t + b;
|
905
|
-
return -c/2 * ((--t)*(t-2) - 1) + b;
|
906
|
-
},
|
907
|
-
easeOutBounce: function (x, t, b, c, d) {
|
908
|
-
if ((t/=d) < (1/2.75)) {
|
909
|
-
return c*(7.5625*t*t) + b;
|
910
|
-
} else if (t < (2/2.75)) {
|
911
|
-
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
|
912
|
-
} else if (t < (2.5/2.75)) {
|
913
|
-
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
|
914
|
-
} else {
|
915
|
-
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
|
916
|
-
}
|
917
|
-
}
|
918
|
-
});
|
919
|
-
});
|
920
|
-
|
921
|
-
// Default one line upload widget.
|
922
|
-
//
|
923
|
-
// It create widget before every hidden input with `uploadcare-line-uploader`
|
924
|
-
// role. When user select file, widget will upload it by AJAX and set file ID
|
925
|
-
// to hidden input value.
|
926
|
-
//
|
927
|
-
// Widget will block form submit during file uploading.
|
928
|
-
//
|
929
|
-
// If you will add AJAX content and want to enlive new hidden inputs, call
|
930
|
-
// `UploadCare.Line.init` with new content:
|
931
|
-
//
|
932
|
-
// $.get('/next/page', function (html) {
|
933
|
-
// var newContent = $(html).appendTo('.list');
|
934
|
-
// UploadCare.Line.init(newContent);
|
935
|
-
// });
|
936
|
-
UploadCare.Line = {
|
937
|
-
|
938
|
-
// Text messages. It will be set in translation, see `i18n/` dir.
|
939
|
-
messages: { },
|
940
|
-
|
941
|
-
// CSS for widget. Will be copied from `line-style.sass` by build script.
|
942
|
-
style: '',
|
943
|
-
|
944
|
-
// HTML structure of widget. Will be copied from `line-template.html`
|
945
|
-
// by build script.
|
946
|
-
html: '',
|
947
|
-
|
948
|
-
//Stylesheet for IE support
|
949
|
-
ie_css_url: 'http://static.uploadcare.com/assets/compat/stylesheets/ie.css',
|
950
|
-
//ie_css_url: null,
|
951
|
-
|
952
|
-
// Add widgets to inputs inside `base`. You can pass DOM node or jQuery
|
953
|
-
// objects.
|
954
|
-
init: UploadCare._widgetInit('uploadcare-line-uploader'),
|
955
|
-
|
956
|
-
// Return transition by `path` in messages.
|
957
|
-
message: function (path) {
|
958
|
-
var node = UploadCare.Line.messages;
|
959
|
-
var names = path.split('.');
|
960
|
-
for (var i = 0; i < names.length; i++) {
|
961
|
-
node = node[names[i]];
|
962
|
-
if ( typeof(node) == 'undefined' ) {
|
963
|
-
throw('There is no translation for `' + path + '`');
|
964
|
-
}
|
965
|
-
}
|
966
|
-
return node;
|
967
|
-
},
|
968
|
-
|
969
|
-
// Add widget after hidden `input` to upload file to UploadCare.
|
970
|
-
enlive: function (input) {
|
971
|
-
var hidden = $(input);
|
972
|
-
|
973
|
-
if ( !($.support.opacity && $.support.htmlSerialize) && (/6.0/.test(navigator.userAgent) || /7.0/.test(navigator.userAgent)) ) {
|
974
|
-
if ( this.ie_css_url != null) {
|
975
|
-
var link = $('<link />').attr({
|
976
|
-
rel: "stylesheet",
|
977
|
-
type: "text/css",
|
978
|
-
href: this.ie_css_url
|
979
|
-
});
|
980
|
-
link.appendTo($('head'));
|
981
|
-
}
|
982
|
-
|
983
|
-
$('a.uploadcare-line-computer').click(function() {
|
984
|
-
$('input.uploadcare-uploader').click();
|
985
|
-
});
|
986
|
-
}
|
987
|
-
|
988
|
-
var html = this.html.replace(/{([^}]+)}/g, function (_, name) {
|
989
|
-
if ( name == 'style' ) {
|
990
|
-
return UploadCare.Line.style;
|
991
|
-
} else if ( name == 'file' ) {
|
992
|
-
return '<div data-replace="file"></div>';
|
993
|
-
} else if ( name.match(/^t /) ) {
|
994
|
-
return UploadCare.Line.message(name.substr(2));
|
995
|
-
}
|
996
|
-
});
|
997
|
-
|
998
|
-
var widget = $(html).insertAfter(hidden);
|
999
|
-
|
1000
|
-
var instanceId = hidden.attr('data-instance-id');
|
1001
|
-
var instance;
|
1002
|
-
|
1003
|
-
if ( instanceId ) {
|
1004
|
-
instance = UploadCare.getInstance( instanceId );
|
1005
|
-
}
|
1006
|
-
|
1007
|
-
if ( instance ) {
|
1008
|
-
var toggleTab = function(blocks, positive) {
|
1009
|
-
var elems = [];
|
1010
|
-
$(blocks).each(function() {
|
1011
|
-
elems = $.merge(elems, $('a', this));
|
1012
|
-
elems = $.merge(elems, $('input', this));
|
1013
|
-
});
|
1014
|
-
|
1015
|
-
if ( positive === void(0) ) {
|
1016
|
-
positive = true;
|
1017
|
-
}
|
1018
|
-
|
1019
|
-
$( elems ).each(function() {
|
1020
|
-
var tab = $(this).attr('tabindex');
|
1021
|
-
|
1022
|
-
if ( !tab ) {
|
1023
|
-
tab = -1;
|
1024
|
-
}
|
1025
|
-
if ( tab && tab < 0 && positive ) {
|
1026
|
-
$(this).attr('tabindex', '1');
|
1027
|
-
} else {
|
1028
|
-
$(this).attr('tabindex', '-1');
|
1029
|
-
}
|
1030
|
-
});
|
1031
|
-
}
|
1032
|
-
|
1033
|
-
var reset = function() {
|
1034
|
-
toggleTab(['.uploadcare-line-uploader'], false);
|
1035
|
-
}
|
1036
|
-
|
1037
|
-
var mainWindow = function() {
|
1038
|
-
var blocks = ['.uploadcare-line-error-wrapper', '.uploadcare-line-uploading', '.uploadcare-line-filedata', '.uploadcare-line-from-url'];
|
1039
|
-
|
1040
|
-
if ( widget ) {
|
1041
|
-
widget.data('fromUrl', false);
|
1042
|
-
}
|
1043
|
-
|
1044
|
-
toggleTab(['.uploadcare-line-upload']);
|
1045
|
-
toggleTab(blocks, false);
|
1046
|
-
};
|
1047
|
-
var fromUrlWindow = function() {
|
1048
|
-
reset();
|
1049
|
-
toggleTab(['.uploadcare-line-from-url']);
|
1050
|
-
};
|
1051
|
-
var uploadingWindow = function() {
|
1052
|
-
reset();
|
1053
|
-
toggleTab(['.uploadcare-line-uploading']);
|
1054
|
-
};
|
1055
|
-
var fileInfoWindow = function() {
|
1056
|
-
reset();
|
1057
|
-
toggleTab(['.uploadcare-line-filedata']);
|
1058
|
-
};
|
1059
|
-
var fromUrlExit = function($, prev) {
|
1060
|
-
var fromUrl = widget.data('fromUrl');
|
1061
|
-
if ( fromUrl ) {
|
1062
|
-
instance.state.set('fromUrlEnter');
|
1063
|
-
} else {
|
1064
|
-
instance.state.set('mainWindow');
|
1065
|
-
}
|
1066
|
-
widget.data('fromUrl', false);
|
1067
|
-
};
|
1068
|
-
var fromUrlUpload = function() {
|
1069
|
-
if ( widget ) {
|
1070
|
-
widget.data('fromUrl', true);
|
1071
|
-
}
|
1072
|
-
}
|
1073
|
-
|
1074
|
-
widget.data('fromUrl', false);
|
1075
|
-
|
1076
|
-
instance.state.setCallback('idle', reset);
|
1077
|
-
instance.state.setCallback('startEnlive', mainWindow).setCallback('mainWindow', mainWindow).setCallback('upload', uploadingWindow).setCallback('afterUpload', fileInfoWindow);
|
1078
|
-
instance.state.setCallback('fromUrlEnter', fromUrlWindow).setCallback('fromUrlUpload', uploadingWindow).setCallback('fromUrlAfterUpload', fileInfoWindow);
|
1079
|
-
instance.state.setCallback('fromUrlUpload', fromUrlUpload);
|
1080
|
-
instance.state.setCallback('reloadToBase', fromUrlExit);
|
1081
|
-
}
|
1082
|
-
|
1083
|
-
var file = UploadCare.Plain.enlive(hidden, {
|
1084
|
-
meduim: 'line',
|
1085
|
-
fromUrl: $('.uploadcare-line-url', widget),
|
1086
|
-
fromUrlSubmit: $('.uploadcare-line-url-submit', widget)
|
1087
|
-
});
|
1088
|
-
file.detach().replaceAll($('[data-replace=file]', widget));
|
1089
|
-
|
1090
|
-
widget.data('info_loaded', false);
|
1091
|
-
widget.data('instance', instance);
|
1092
|
-
widget.addClass(instanceId);
|
1093
|
-
|
1094
|
-
$('a', widget).click(false);
|
1095
|
-
//$('a', widget).attr({ "tabindex": "-1" });
|
1096
|
-
//$('input', widget).attr({ "tabindex": "-1" });
|
1097
|
-
|
1098
|
-
this.uploadingEvents(widget, hidden);
|
1099
|
-
this.fromUrlEvents(widget, hidden);
|
1100
|
-
|
1101
|
-
hidden.bind('uploadcare-error', function (ev, errorCode) {
|
1102
|
-
var fixable = false;
|
1103
|
-
|
1104
|
-
errorCode = (void 0 === errorCode || null === errorCode) ? 'network' : errorCode;
|
1105
|
-
fixable = errorCode === 'onlyImages' ? true : false;
|
1106
|
-
UploadCare.Line.showError(widget, errorCode, fixable, function () {
|
1107
|
-
UploadCare.Line.hideUploading(widget);
|
1108
|
-
});
|
1109
|
-
});
|
1110
|
-
|
1111
|
-
hidden.bind('uploadcare-success', function() {
|
1112
|
-
var promise = UploadCare.FileData.fetch(hidden.val(), instanceId);
|
1113
|
-
|
1114
|
-
promise.success(function(data) {
|
1115
|
-
UploadCare.Line.showFileData(data);
|
1116
|
-
});
|
1117
|
-
promise.error(function(errorCode) {
|
1118
|
-
errorCode = (void 0 === errorCode || null === errorCode) ? 'network' : errorCode;
|
1119
|
-
hidden.trigger('uploadcare-error', errorCode);
|
1120
|
-
});
|
1121
|
-
});
|
1122
|
-
|
1123
|
-
if ( hidden.attr('data-override-style') !== void 0 ) {
|
1124
|
-
var overrideStyle = hidden.attr('data-override-style');
|
1125
|
-
var styleTag = $('style', widget);
|
1126
|
-
var styleContent = styleTag.html();
|
1127
|
-
|
1128
|
-
styleContent = "" + styleContent + "." + instanceId + "{" + overrideStyle + "}";
|
1129
|
-
styleTag.html(styleContent);
|
1130
|
-
}
|
1131
|
-
|
1132
|
-
$(document).trigger('enlive');
|
1133
|
-
},
|
1134
|
-
|
1135
|
-
// Add events for uploading status and animate progress bar.
|
1136
|
-
uploadingEvents: function (widget, hidden) {
|
1137
|
-
var progress = $('.uploadcare-line-progress div', widget);
|
1138
|
-
var end = progress.parent().width() - progress.width();
|
1139
|
-
var toLeft = function () {
|
1140
|
-
progress.animate({ left: -1 }, 800, 'easeInOutQuad', toRight);
|
1141
|
-
}
|
1142
|
-
var toRight = function () {
|
1143
|
-
progress.animate({ left: end }, 800, 'easeInOutQuad', toLeft);
|
1144
|
-
}
|
1145
|
-
var instance = widget.data('instance');
|
1146
|
-
|
1147
|
-
hidden.bind('uploadcare-start', function () {
|
1148
|
-
widget.addClass('uploadcare-uploading');
|
1149
|
-
widget.find('.uploadcare-line-slider').css({
|
1150
|
-
"margin-top": -30
|
1151
|
-
});
|
1152
|
-
toRight();
|
1153
|
-
});
|
1154
|
-
|
1155
|
-
var total = $('.uploadcare-line-progress').outerWidth();
|
1156
|
-
|
1157
|
-
progress.data('width', progress.width());
|
1158
|
-
hidden.bind('uploadcare-progress', function (e, data) {
|
1159
|
-
var percentage = data.done / data.total;
|
1160
|
-
progress.stop().css({ left: -1 });
|
1161
|
-
progress.width(total * percentage);
|
1162
|
-
});
|
1163
|
-
|
1164
|
-
var uploading = $('.uploadcare-line-uploading', widget);
|
1165
|
-
var slider = $('.uploadcare-line-slider', widget);
|
1166
|
-
|
1167
|
-
$('.uploadcare-line-cancel', uploading).click(function () {
|
1168
|
-
slider.css({
|
1169
|
-
"margin-top": 0
|
1170
|
-
});
|
1171
|
-
var iframe = $('iframe[class="' + hidden.attr('data-instance-id') + '"]');
|
1172
|
-
if ( iframe.length !== 0 ) {
|
1173
|
-
iframe.remove();
|
1174
|
-
}
|
1175
|
-
UploadCare.Line.hideUploading(widget);
|
1176
|
-
});
|
1177
|
-
|
1178
|
-
var filedata = $('.uploadcare-line-filedata', widget);
|
1179
|
-
|
1180
|
-
$('.uploadcare-line-filedata-close', filedata).click(function() {
|
1181
|
-
hidden.val('');
|
1182
|
-
filedata.css({
|
1183
|
-
top: 1
|
1184
|
-
});
|
1185
|
-
slider.css({
|
1186
|
-
"margin-top": 0
|
1187
|
-
});
|
1188
|
-
|
1189
|
-
if ( instance ) {
|
1190
|
-
instance.state.set('reloadToBase');
|
1191
|
-
}
|
1192
|
-
|
1193
|
-
UploadCare.Line.hideUploading(widget);
|
1194
|
-
});
|
1195
|
-
|
1196
|
-
},
|
1197
|
-
|
1198
|
-
fromUrlEvents: function (widget, hidden) {
|
1199
|
-
var instance, instanceId;
|
1200
|
-
|
1201
|
-
if ( hidden ) {
|
1202
|
-
instanceId = hidden.attr('data-instance-id');
|
1203
|
-
instance = UploadCare.getInstance(instanceId);
|
1204
|
-
};
|
1205
|
-
$('.uploadcare-line-web', widget).click(function () {
|
1206
|
-
if ( instance ) {
|
1207
|
-
instance.state.set('fromUrlEnter');
|
1208
|
-
}
|
1209
|
-
|
1210
|
-
widget.addClass('uploadcare-from-url');
|
1211
|
-
setTimeout(function () {
|
1212
|
-
$('.uploadcare-line-url').focus();
|
1213
|
-
}, 300);
|
1214
|
-
});
|
1215
|
-
|
1216
|
-
var fromUrl = $('.uploadcare-line-from-url', widget);
|
1217
|
-
$('.uploadcare-line-cancel', fromUrl).click(function () {
|
1218
|
-
if ( instance ) {
|
1219
|
-
instance.state.set('reloadToBase');
|
1220
|
-
}
|
1221
|
-
widget.removeClass('uploadcare-from-url');
|
1222
|
-
$('.uploadcare-line-url').val('');
|
1223
|
-
});
|
1224
|
-
},
|
1225
|
-
|
1226
|
-
// Hide uploading status and move progress to start position.
|
1227
|
-
hideUploading: function (widget) {
|
1228
|
-
var progress = $('.uploadcare-line-progress div', widget);
|
1229
|
-
progress.stop().css({ left: -1, width: progress.data('width') });
|
1230
|
-
widget.removeClass('uploadcare-uploading');
|
1231
|
-
},
|
1232
|
-
|
1233
|
-
// Show error with some `code` by widget. If you set `fixable` argument,
|
1234
|
-
// error message willn contain back button.
|
1235
|
-
//
|
1236
|
-
// Method will be get error text from translation by `code`.
|
1237
|
-
showError: function (widget, code, fixable, callback) {
|
1238
|
-
var text = this.message('errors.' + code);
|
1239
|
-
var error = $('.uploadcare-line-error', widget);
|
1240
|
-
$('.uploadcare-line-error-text', error).html(text);
|
1241
|
-
|
1242
|
-
var wrapper = error.parent().show();
|
1243
|
-
var height = error.show().outerHeight();
|
1244
|
-
error.css({ top: -height }).
|
1245
|
-
animate({ top: 0 }, 600, 'easeOutBounce', function () {
|
1246
|
-
widget.addClass('uploadcare-error');
|
1247
|
-
callback();
|
1248
|
-
});
|
1249
|
-
|
1250
|
-
var back = $('.uploadcare-line-error-back', error).toggle(fixable);
|
1251
|
-
if ( fixable ) {
|
1252
|
-
var _this = this;
|
1253
|
-
back.one('click', function () {
|
1254
|
-
error.animate({ top: -height }, 400, 'easeInOutQuad',
|
1255
|
-
function () {
|
1256
|
-
wrapper.hide();
|
1257
|
-
widget.removeClass('uploadcare-error');
|
1258
|
-
});
|
1259
|
-
_this.hideUploading(widget);
|
1260
|
-
$('.uploadcare-line-slider', widget).css({ "margin-top": 0 });
|
1261
|
-
});
|
1262
|
-
}
|
1263
|
-
},
|
1264
|
-
|
1265
|
-
showFileData: function(fileData) {
|
1266
|
-
var widget = $('input[value=' + fileData.file_id + ']').next();
|
1267
|
-
var uploadPane = $('.uploadcare-line-slider', widget);
|
1268
|
-
var fileDataPane = $('.uploadcare-line-filedata', widget);
|
1269
|
-
var filename = $('.uploadcare-line-filedata-filename', widget);
|
1270
|
-
var filesize = $('.uploadcare-line-filedata-filesize', widget);
|
1271
|
-
var human_size = Math.ceil(fileData.size / 1024) + "kb";
|
1272
|
-
var human_filename = fileData.original_filename;
|
1273
|
-
|
1274
|
-
if ( human_filename.length > 16 ) {
|
1275
|
-
human_filename = human_filename.slice(0, 8) + '...' + human_filename.slice(-8);
|
1276
|
-
}
|
1277
|
-
|
1278
|
-
filename.html(human_filename);
|
1279
|
-
filename.innerHTML = human_filename;
|
1280
|
-
filesize.innerHTML = human_size;
|
1281
|
-
filesize.html(human_size);
|
1282
|
-
fileDataPane.animate({top: 0});
|
1283
|
-
uploadPane.css({ "margin-top": -60 });
|
1284
|
-
|
1285
|
-
widget.data('info_loaded', true);
|
1286
|
-
}
|
1287
|
-
|
1288
|
-
};
|
1289
|
-
|
1290
|
-
})();
|
1291
|
-
;(function() {
|
1292
|
-
UploadCare.FileData = {
|
1293
|
-
timeout: 15000,
|
1294
|
-
|
1295
|
-
fetch: function(uuid, instanceId) {
|
1296
|
-
var requestUrl = this._getRequestUrl();
|
1297
|
-
var pubKey = UploadCare.publicKey
|
1298
|
-
|
1299
|
-
if ( instanceId ) {
|
1300
|
-
requestUrl = UploadCare.getInstanceOptions( instanceId ).urls.fileInfo;
|
1301
|
-
pubKey = UploadCare.getInstanceOptions( instanceId ).publicKey;
|
1302
|
-
}
|
1303
|
-
|
1304
|
-
// Barebone support
|
1305
|
-
if ( uuid.indexOf('[') != -1 ) {
|
1306
|
-
console.log('here');
|
1307
|
-
var vals = uuid.substr(1, uuid.length - 2).split(',');
|
1308
|
-
uuid = vals[vals.length - 1];
|
1309
|
-
}
|
1310
|
-
|
1311
|
-
requestUrl = "" + requestUrl + ("?pub_key=" + pubKey);
|
1312
|
-
|
1313
|
-
if ( typeof uuid === void 0 ) {
|
1314
|
-
throw "UUID must be specified";
|
1315
|
-
}
|
1316
|
-
|
1317
|
-
requestUrl = "" + requestUrl + "&file_id=" + uuid + "&jsoncallback=?";
|
1318
|
-
|
1319
|
-
try {
|
1320
|
-
var $ = UploadCare.jQuery;
|
1321
|
-
var _$ = $(this);
|
1322
|
-
var deferred = $.Deferred();
|
1323
|
-
var xhr = $.ajax( requestUrl, {
|
1324
|
-
dataType: "jsonp",
|
1325
|
-
global: true,
|
1326
|
-
beforeSend: function(jqXHR, settings) {
|
1327
|
-
_$.data('_xhr', jqXHR);
|
1328
|
-
|
1329
|
-
jqXHR.state = function() {
|
1330
|
-
return jqXHR.isResolved() ? "resolved" : (jqXHR.isRejected() ? "rejected" : "pending");
|
1331
|
-
}
|
1332
|
-
|
1333
|
-
$(_$).bind('start-timeout', function(ev, t) {
|
1334
|
-
var tries = 0;
|
1335
|
-
|
1336
|
-
t = ( t === void 0 || typeof(t) == "undefined" ) ? _$.timeout : t;
|
1337
|
-
|
1338
|
-
if ( jqXHR.readyState != 4 && (void 0 === jqXHR.status || jqXHR.status >= 400) ) {
|
1339
|
-
var timer = setInterval(function() {
|
1340
|
-
switch( jqXHR.state() ) {
|
1341
|
-
case "resolved":
|
1342
|
-
case "rejected":
|
1343
|
-
void( 0 );
|
1344
|
-
break;
|
1345
|
-
case "pending":
|
1346
|
-
if ( tries < 3 ) {
|
1347
|
-
tries += 1;
|
1348
|
-
} else {
|
1349
|
-
clearInterval(timer);
|
1350
|
-
jqXHR.abort();
|
1351
|
-
}
|
1352
|
-
break;
|
1353
|
-
}
|
1354
|
-
}, t);
|
1355
|
-
}
|
1356
|
-
});
|
1357
|
-
|
1358
|
-
return true;
|
1359
|
-
}
|
1360
|
-
}).success( function(data) {
|
1361
|
-
deferred.resolve(data);
|
1362
|
-
}).error( function(e) {
|
1363
|
-
deferred.reject('misconfiguration');
|
1364
|
-
});
|
1365
|
-
} catch( error ) {
|
1366
|
-
deferred.reject('misconfiguration');
|
1367
|
-
} finally {
|
1368
|
-
if ( !deferred.isResolved() ) {
|
1369
|
-
if ( !xhr || xhr === void 0 ) {
|
1370
|
-
xhr = _$.data('_xhr');
|
1371
|
-
}
|
1372
|
-
|
1373
|
-
if ( !xhr.isResolved() ) {
|
1374
|
-
_$.triggerHandler('start-timeout', 1000);
|
1375
|
-
} else {
|
1376
|
-
deferred.resolve(xhr.data('response'));
|
1377
|
-
}
|
1378
|
-
}
|
1379
|
-
}
|
1380
|
-
|
1381
|
-
return UploadCare._promise(deferred);
|
1382
|
-
},
|
1383
|
-
|
1384
|
-
_getRequestUrl: function() {
|
1385
|
-
return UploadCare.urls.fileInfo;
|
1386
|
-
}
|
1387
|
-
};
|
1388
|
-
|
1389
|
-
UploadCare.ready(function(jQuery) {
|
1390
|
-
jQuery(document).ready(function() {
|
1391
|
-
UploadCare.jQuery.ajaxPrefilter( "script", function( s ) {
|
1392
|
-
if ( s.cache === undefined ) {
|
1393
|
-
s.cache = false;
|
1394
|
-
}
|
1395
|
-
if ( s.crossDomain ) {
|
1396
|
-
s.type = "GET";
|
1397
|
-
s.global = true;
|
1398
|
-
}
|
1399
|
-
});
|
1400
|
-
});
|
1401
|
-
});
|
1402
|
-
})();
|
1403
|
-
;(function() {
|
1404
|
-
UploadCare.DragDrop = {
|
1405
|
-
useLargeDropZone: false,
|
1406
|
-
started: false,
|
1407
|
-
eventTimer: false,
|
1408
|
-
idle: true,
|
1409
|
-
|
1410
|
-
selectors: {
|
1411
|
-
widget: 'div.uploadcare-line-uploader',
|
1412
|
-
cropper: 'div.uploadcare-line-cropper',
|
1413
|
-
slider: 'div.uploadcare-line-slider',
|
1414
|
-
filedata: 'div.uploadcare-line-filedata'
|
1415
|
-
},
|
1416
|
-
|
1417
|
-
init: function () {
|
1418
|
-
return UploadCare.ready(function($) {
|
1419
|
-
try {
|
1420
|
-
if ( $(UploadCare.DragDrop.selectors.widget).length === 0 ) {
|
1421
|
-
throw "Widget block not found. Do you use inline version if widget?";
|
1422
|
-
}
|
1423
|
-
if ( 'draggable' in document.createElement('span') === false ) {
|
1424
|
-
throw "D&D not available, please use modern browser.";
|
1425
|
-
}
|
1426
|
-
} catch ( error ) {
|
1427
|
-
return;
|
1428
|
-
} finally {
|
1429
|
-
UploadCare.DragDrop.enlive($);
|
1430
|
-
}
|
1431
|
-
});
|
1432
|
-
},
|
1433
|
-
enlive: function ($) {
|
1434
|
-
var dragzone, dropzone, filedata, hidden, slider, upload, widget, dropbox;
|
1435
|
-
|
1436
|
-
widget = $(this.selectors.widget);
|
1437
|
-
hidden = $(widget).prev();
|
1438
|
-
slider = $(this.selectors.slider, widget);
|
1439
|
-
filedata = $(this.selectors.filedata, widget);
|
1440
|
-
dragzone = $('.uploadcare-line-thumb', slider).first();
|
1441
|
-
dropzone = this.createDropZone($, widget);
|
1442
|
-
dropbox = $('div.uploadcare-line-thumb-empty', slider);
|
1443
|
-
|
1444
|
-
this.dragDropEvents(dragzone, dropzone);
|
1445
|
-
|
1446
|
-
//TODO: Move to separated method
|
1447
|
-
dropbox.css({
|
1448
|
-
cursor: 'pointer'
|
1449
|
-
});
|
1450
|
-
dropbox.mouseover(function(e) {
|
1451
|
-
UploadCare.DragDrop.onDragOver(e, dragzone, dropzone);
|
1452
|
-
});
|
1453
|
-
dropzone.mouseleave(function(e) {
|
1454
|
-
UploadCare.DragDrop.onDragLeave(e, dragzone, dropzone);
|
1455
|
-
}).click(function(e) {
|
1456
|
-
e.preventDefault();
|
1457
|
-
window.location = 'http://uploadcare.com';
|
1458
|
-
}).css({
|
1459
|
-
cursor: 'pointer'
|
1460
|
-
});
|
1461
|
-
|
1462
|
-
upload = function (files) {
|
1463
|
-
var uploading;
|
1464
|
-
|
1465
|
-
uploading = UploadCare.DragDrop.process(widget, hidden, files);
|
1466
|
-
uploading.success(function (id) {
|
1467
|
-
hidden.val(id);
|
1468
|
-
hidden.trigger('uploadcare-success', id);
|
1469
|
-
hidden.trigger('uploadcare-complete');
|
1470
|
-
|
1471
|
-
UploadCare.DragDrop.idle = true;
|
1472
|
-
});
|
1473
|
-
|
1474
|
-
uploading.error(function (errorNotReject) {
|
1475
|
-
errorNotReject = typeof errorNotReject === void 0 ? false : errorNotReject;
|
1476
|
-
|
1477
|
-
if (errorNotReject) {
|
1478
|
-
UploadCare.Line.showError(widget, 'unknown', true, function() {
|
1479
|
-
UploadCare.Line.hideUploading(widget);
|
1480
|
-
});
|
1481
|
-
} else {
|
1482
|
-
filedata.css({
|
1483
|
-
top: 1
|
1484
|
-
});
|
1485
|
-
slider.css({
|
1486
|
-
"margin-top": 0
|
1487
|
-
});
|
1488
|
-
UploadCare.Line.hideUploading(widget);
|
1489
|
-
UploadCare.DragDrop.idle = true;
|
1490
|
-
}
|
1491
|
-
});
|
1492
|
-
};
|
1493
|
-
|
1494
|
-
dropzone.bind('file-drop', function (ev, dev) {
|
1495
|
-
var files;
|
1496
|
-
files = dev.dataTransfer.files;
|
1497
|
-
if ( typeof files !== "undefined" && files !== null && files.length !== 0 ) {
|
1498
|
-
UploadCare.DragDrop.idle = false;
|
1499
|
-
upload(files);
|
1500
|
-
} else {
|
1501
|
-
UploadCare.DragDrop.onDragLeave(ev, dragzone, dropzone);
|
1502
|
-
}
|
1503
|
-
});
|
1504
|
-
},
|
1505
|
-
|
1506
|
-
createDropZone: function ($, widget) {
|
1507
|
-
var cropper, dropZoneContainer, dropZoneNode, dropZoneNotification, dndLeftCorner, dndRightCorner, dropZoneDecorator;
|
1508
|
-
cropper = $(this.selectors.cropper, widget);
|
1509
|
-
|
1510
|
-
dropZoneContainer = $('<div/>').attr({
|
1511
|
-
"class": this.useLargeDropZone ? "uploadcare-line-largedrop" : "uploadcare-line-tinydrop"
|
1512
|
-
});
|
1513
|
-
|
1514
|
-
dropZoneDecorator = $('<div/>').attr({
|
1515
|
-
"class": "uploadcare-line-drop-decoration"
|
1516
|
-
}).css({
|
1517
|
-
width: widget.width() - 20,
|
1518
|
-
height: widget.height()
|
1519
|
-
});
|
1520
|
-
|
1521
|
-
dropZoneArray = $('<span />').attr({
|
1522
|
-
"class": "dnd-arrow"
|
1523
|
-
});
|
1524
|
-
//dropZoneNotification.html('Drop files here');
|
1525
|
-
dropZoneArray.appendTo(dropZoneDecorator);
|
1526
|
-
|
1527
|
-
dropZoneNotification = $('<span />');
|
1528
|
-
dropZoneNotification.html('Drop file here');
|
1529
|
-
dropZoneNotification.attr({ "class": "droptext"});
|
1530
|
-
dropZoneNotification.appendTo(dropZoneDecorator);
|
1531
|
-
|
1532
|
-
var branding;
|
1533
|
-
|
1534
|
-
branding = $('<span />');
|
1535
|
-
branding.attr({ "class": "branding" });
|
1536
|
-
branding.html('Powered by <strong>UploadCare</strong>');
|
1537
|
-
branding.appendTo(dropZoneDecorator);
|
1538
|
-
|
1539
|
-
dndLeftCorner = $('<div />').attr({ "class": "lc" });
|
1540
|
-
dndRightCorner = $('<div />').attr({ "class": "rc" });
|
1541
|
-
|
1542
|
-
dndLeftCorner.appendTo(dropZoneDecorator);
|
1543
|
-
dndRightCorner.appendTo(dropZoneDecorator);
|
1544
|
-
dropZoneDecorator.appendTo(dropZoneContainer);
|
1545
|
-
|
1546
|
-
dropZoneNode = $('<div/>').attr({
|
1547
|
-
"class": "uploadcare-line-dropzone"
|
1548
|
-
});
|
1549
|
-
dropZoneNode.css({
|
1550
|
-
width: widget.width(),
|
1551
|
-
height: widget.height()
|
1552
|
-
});
|
1553
|
-
|
1554
|
-
dropZoneContainer.appendTo(cropper);
|
1555
|
-
dropZoneNode.appendTo(dropZoneContainer);
|
1556
|
-
return dropZoneNode;
|
1557
|
-
},
|
1558
|
-
|
1559
|
-
dragDropEvents: function (dragzone, dropzone) {
|
1560
|
-
var cooldownEvent;
|
1561
|
-
|
1562
|
-
cooldownEvent = function (ev) {
|
1563
|
-
ev.stopPropagation();
|
1564
|
-
ev.preventDefault();
|
1565
|
-
return ev;
|
1566
|
-
};
|
1567
|
-
|
1568
|
-
var dde = function(event) {
|
1569
|
-
if ( UploadCare.DragDrop.eventTimer !== false ) {
|
1570
|
-
clearTimeout(UploadCare.DragDrop.eventTimer);
|
1571
|
-
UploadCare.DragDrop.eventTimer = false;
|
1572
|
-
}
|
1573
|
-
if ( UploadCare.DragDrop.idle === true ) {
|
1574
|
-
switch(event.type) {
|
1575
|
-
case 'drop':
|
1576
|
-
UploadCare.DragDrop.started = false;
|
1577
|
-
UploadCare.DragDrop.onDragLeave(event, dragzone, dropzone);
|
1578
|
-
break;
|
1579
|
-
case 'dragleave':
|
1580
|
-
UploadCare.DragDrop.eventTimer = setTimeout(function() {
|
1581
|
-
UploadCare.DragDrop.started = false;
|
1582
|
-
UploadCare.DragDrop.onDragLeave(event, dragzone, dropzone);
|
1583
|
-
}, 100);
|
1584
|
-
break;
|
1585
|
-
case 'dragover':
|
1586
|
-
case 'dragenter':
|
1587
|
-
if ( UploadCare.DragDrop.started === false ) {
|
1588
|
-
UploadCare.DragDrop.started = true;
|
1589
|
-
UploadCare.DragDrop.onDragOver(event, dragzone, dropzone);
|
1590
|
-
}
|
1591
|
-
}
|
1592
|
-
}
|
1593
|
-
return cooldownEvent(event);
|
1594
|
-
}
|
1595
|
-
|
1596
|
-
UploadCare.jQuery(document).bind('drop', dde).bind('dragenter', dde).bind('dragover', dde).bind('dragleave', dde);
|
1597
|
-
|
1598
|
-
dropzone[0].ondrop = function (ev) {
|
1599
|
-
UploadCare.DragDrop.onDrop(cooldownEvent(ev), dragzone, dropzone);
|
1600
|
-
dropzone.trigger('file-drop', ev);
|
1601
|
-
};
|
1602
|
-
|
1603
|
-
return null;
|
1604
|
-
},
|
1605
|
-
|
1606
|
-
process: function (widget, hidden, files) {
|
1607
|
-
var deferred, form, getProgress, options, uploading, xhr;
|
1608
|
-
|
1609
|
-
form = new FormData();
|
1610
|
-
deferred = UploadCare.jQuery.Deferred();
|
1611
|
-
options = UploadCare._params({
|
1612
|
-
pubKey: UploadCare.publicKey,
|
1613
|
-
meduim: 'line'
|
1614
|
-
});
|
1615
|
-
|
1616
|
-
options.UPLOADCARE_FILE_ID = UploadCare._uuid();
|
1617
|
-
|
1618
|
-
hidden.trigger('uploadcare-start');
|
1619
|
-
|
1620
|
-
getProgress = function (ev) {
|
1621
|
-
if (ev.lengthComputable) {
|
1622
|
-
hidden.trigger('uploadcare-progress', {
|
1623
|
-
done: ev.loaded,
|
1624
|
-
total: ev.total
|
1625
|
-
});
|
1626
|
-
}
|
1627
|
-
};
|
1628
|
-
|
1629
|
-
UploadCare.jQuery.each(options, function(key, value) {
|
1630
|
-
return form.append(key, value);
|
1631
|
-
});
|
1632
|
-
|
1633
|
-
form.append('file', files[0]);
|
1634
|
-
|
1635
|
-
xhr = new XMLHttpRequest;
|
1636
|
-
|
1637
|
-
xhr.upload.addEventListener('progress', getProgress, false);
|
1638
|
-
xhr.addEventListener('abort', function() {
|
1639
|
-
return deferred.reject();
|
1640
|
-
}, false);
|
1641
|
-
xhr.addEventListener('error', function() {
|
1642
|
-
return deferred.reject(true);
|
1643
|
-
}, false);
|
1644
|
-
xhr.addEventListener('load', function() {
|
1645
|
-
return deferred.resolve(options.UPLOADCARE_FILE_ID);
|
1646
|
-
}, false);
|
1647
|
-
|
1648
|
-
xhr.open("POST", UploadCare.byIframe._getUploadUrl(), true);
|
1649
|
-
xhr.send(form);
|
1650
|
-
|
1651
|
-
uploading = UploadCare.jQuery('.uploadcare-line-uploading', widget);
|
1652
|
-
UploadCare.jQuery('.uploadcare-line-cancel', uploading).click(function() {
|
1653
|
-
xhr.abort();
|
1654
|
-
});
|
1655
|
-
return UploadCare._promise(deferred);
|
1656
|
-
},
|
1657
|
-
|
1658
|
-
onDragOver: function (ev, dragzone, dropzone) {
|
1659
|
-
var widget = dragzone.parents(this.selectors.widget);
|
1660
|
-
|
1661
|
-
widget.addClass('uploadcare-line-uploader-dnd');
|
1662
|
-
|
1663
|
-
dragzone.parents(this.selectors.slider).css({
|
1664
|
-
"margin-top": -90
|
1665
|
-
});
|
1666
|
-
widget.find(this.selectors.filedata).css({
|
1667
|
-
top: -1
|
1668
|
-
});
|
1669
|
-
// dropzone.prev().animate(dropzone.prev().data('margin'));
|
1670
|
-
// widget.animate({
|
1671
|
-
// width: 350,
|
1672
|
-
// height: 70
|
1673
|
-
// }, function() {
|
1674
|
-
// dropzone.css({
|
1675
|
-
// width: 350,
|
1676
|
-
// height: 70
|
1677
|
-
// });
|
1678
|
-
// });
|
1679
|
-
|
1680
|
-
return null;
|
1681
|
-
},
|
1682
|
-
|
1683
|
-
onDragLeave: function (ev, dragzone, dropzone) {
|
1684
|
-
var widget = dragzone.parents(this.selectors.widget);
|
1685
|
-
var slider = dragzone.parents(this.selectors.slider);
|
1686
|
-
var filedata = widget.find(this.selectors.filedata);
|
1687
|
-
|
1688
|
-
widget.removeClass('uploadcare-line-uploader-dnd');
|
1689
|
-
|
1690
|
-
// dropzone.prev().animate({
|
1691
|
-
// "margin-top": 0
|
1692
|
-
// });
|
1693
|
-
// widget.animate(widget.data('dimensions'), function() {
|
1694
|
-
slider.css({
|
1695
|
-
"margin-top": 0
|
1696
|
-
});
|
1697
|
-
filedata.css({
|
1698
|
-
top: 1
|
1699
|
-
});
|
1700
|
-
// });
|
1701
|
-
|
1702
|
-
return null;
|
1703
|
-
},
|
1704
|
-
|
1705
|
-
onDrop: function (ev, dragzone, dropzone) {
|
1706
|
-
var widget = dragzone.parents(this.selectors.widget);
|
1707
|
-
var slider = dragzone.parents(this.selectors.slider);
|
1708
|
-
var filedata = widget.find(this.selectors.filedata);
|
1709
|
-
|
1710
|
-
widget.removeClass('uploadcare-line-uploader-dnd');
|
1711
|
-
|
1712
|
-
// dropzone.prev().animate({
|
1713
|
-
// "margin-top": 0
|
1714
|
-
// });
|
1715
|
-
// widget.animate(widget.data('dimensions'), function() {
|
1716
|
-
slider.css({
|
1717
|
-
"margin-top": -30
|
1718
|
-
});
|
1719
|
-
filedata.css({
|
1720
|
-
top: 1
|
1721
|
-
});
|
1722
|
-
// })
|
1723
|
-
|
1724
|
-
return null;
|
1725
|
-
}
|
1726
|
-
};
|
1727
|
-
})();
|
1728
|
-
|
1729
|
-
UploadCare.ready(function($) {
|
1730
|
-
$(document).bind('enlive', function() {
|
1731
|
-
UploadCare.DragDrop.init();
|
1732
|
-
});
|
1733
|
-
});
|
1734
|
-
UploadCare._translate(UploadCare.Line, 'en', {
|
1735
|
-
uploadFrom: 'Upload from',
|
1736
|
-
computer: 'Computer',
|
1737
|
-
web: 'Web',
|
1738
|
-
uploading: 'Uploading…',
|
1739
|
-
cancel: 'Cancel',
|
1740
|
-
back: 'Back',
|
1741
|
-
url: 'URL',
|
1742
|
-
done: 'Done',
|
1743
|
-
errors: {
|
1744
|
-
network: 'You have problem with Internet',
|
1745
|
-
unknown: 'Something awful happened',
|
1746
|
-
misconfiguration: 'Please check your widget config',
|
1747
|
-
badFileUrl: 'Incorrect file URL.',
|
1748
|
-
onlyImages: 'Only images allowed.'
|
1749
|
-
}
|
1750
|
-
});
|
1751
|
-
UploadCare.Line.html = '<div class="uploadcare-line-uploader"><style scoped="scoped">{style}</style><div class="uploadcare-line-error-wrapper"><div class="uploadcare-line-error"><div class="uploadcare-line-error-cloud"></div><div class="uploadcare-line-error-rain"></div><div class="uploadcare-line-error-text"></div><a href="#" title="{t back}" class="uploadcare-line-error-back"></a></div></div><div class="uploadcare-line-cropper"><div class="uploadcare-line-slider"><div class="uploadcare-line-upload"><div class="uploadcare-line-thumb"><div class="uploadcare-line-thumb-empty"></div></div><div class="uploadcare-line-buttons"><div class="uploadcare-line-file-input">{file}<a href="#" class="uploadcare-line-computer"><div class="uploadcare-line-icon"></div>{t computer}</a></div><a href="#" class="uploadcare-line-web"><div class="uploadcare-line-icon"></div>{t web}</a></div>{t uploadFrom}</div><div class="uploadcare-line-from-url"><div class="uploadcare-line-title">{t url}</div><div class="uploadcare-line-right"><input type="url" class="uploadcare-line-url" /><div class="uploadcare-line-buttons"><a href="#" class="uploadcare-line-url-submit">{t done}</a></div><a href="#" title="{t back}" class="uploadcare-line-cancel"></a></div></div></div><div class="uploadcare-line-uploading"><div class="uploadcare-line-thumb"><div class="uploadcare-line-thumb-empty"></div></div><a href="#" title="{t cancel}" class="uploadcare-line-cancel"></a><div class="uploadcare-line-progress"><div></div></div>{t uploading}</div><div class="uploadcare-line-filedata"><div class="uploadcare-line-filedata-icon-placeholder"><div class="uploadcare-line-filedata-icon-placeholder-icon"></div></div><div class="uploadcare-line-filedata-filename"></div><div class="uploadcare-line-filedata-filesize"></div><div class="uploadcare-line-buttons"><a href="#" title="{t cancel}" class="uploadcare-line-filedata-close">{t cancel}</a></div></div></div></div>';UploadCare.Line.style = '.uploadcare-line-uploader{width:293px;height:30px;line-height:30px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;border:1px solid #d8d8d8;background:#f6f6f6;background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fcfcfc), color-stop(100%, #ececec));background:-webkit-linear-gradient(#fcfcfc,#ececec);background:-moz-linear-gradient(#fcfcfc,#ececec);background:-o-linear-gradient(#fcfcfc,#ececec);background:-ms-linear-gradient(#fcfcfc,#ececec);background:linear-gradient(#fcfcfc,#ececec);color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;-webkit-box-shadow:rgba(0,0,0,0.08) 0 1px 3px;-moz-box-shadow:rgba(0,0,0,0.08) 0 1px 3px;box-shadow:rgba(0,0,0,0.08) 0 1px 3px;position:relative}.uploadcare-line-uploader.uploadcare-error{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.uploadcare-line-cropper{position:absolute;top:-1px;left:-1px;height:100%;width:100%;padding:1px;overflow:hidden}.uploadcare-line-thumb{float:left;width:30px;height:30px;border-right:1px solid #d8d8d8;margin-right:9px;position:relative}.uploadcare-line-thumb-empty{position:absolute;top:3px;left:3px;width:25px;height:25px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAACiklEQVRIx+WWy2sTURjFg6W0SkHd1F22BXERXYsrty1YQYO6shbqQoQu3Ijozv/BjX+AG1015DUhLyfvTMw7MQtj8ZEYFMSJTcr1nGEGk3EyKTiuvHCSzNx7f+fem+/7uC6/338uFArtSZL0PhwOdwKBwIbL1PBuC/0/IBGJRAS/MSeLuQumcRtkkEUm2VpHLBaLp9PpUblcflMqlYqVSuWG2URRlMe5XG5cLBYFVSgUBJ7f1Wq1xclxnEsGWWSSrXVkMpmvjUajJITwQtcgt9kE7zzQI+jJhHagY6Zxbp3hJZNsrQOr+owVBFwONzLJNtzvQetOm5BJtuv/awhFN0LzLUJzn0J4Snh3wlEThK0nlUod5vN5hq5AeH5EqJ46MgAJ9BR6PidSLiBXDpAXolqtCvz+gO/TR+Ymk8nviUSCGXzSxuQ8Ter1uqARdjHXZIqLI1B5DACdsTHxGCbcCU1gZntcU1yct8pSgUl/mPh8Pq02oe+syWS/2+0enxxj8T/+5tqZBIPBB4gqGVuXAT40jguGP+PxeAR9rzHm9lyTdrstoc4oyM5l88Ber7eO0tBkQcS2hWGCAih4FIBkBoPBJSuTKS4+LkNXZpSGleFweLeJRjhNjCMDJD8ej71Wi9PnzuRaDV6C0Z1Wq6UZUZ1Ohwab6Ftwstgtqaq6jQ21sANlNBpdddRgwmgZuskj+CcGf92QkQ2E4TOnuWSSrT3IsvwNRS/qtAmZZGsPSLJ2Nps9iEajL+H+AiX8osVuXxk3FbvbCueSQRaZZGsd/X7/IcKyieT6ghL+CSvYsqhDaT35bG8rnEsGWWSSbUTNKnQL2oXuQ2sWkXXddFOZdVtZ0xm7OnOV738BeS37eGOiGg0AAAAASUVORK5CYII=") no-repeat 50% 50%}.uploadcare-line-buttons{float:right}.uploadcare-line-buttons a{display:block;float:left;height:22px;line-height:22px;margin:3px 3px 0 0;padding:0 7px;border:1px solid #abcddc;border-color:#abcddc #a0c3d3 #92b8c9 #a0c3d3;text-decoration:none;color:#7dadc1;text-shadow:#fff 0 1px 1px;font-size:12px;background:#e6f5fb;background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f4fbfe), color-stop(100%, #d5eef8));background:-webkit-linear-gradient(#f4fbfe,#d5eef8);background:-moz-linear-gradient(#f4fbfe,#d5eef8);background:-o-linear-gradient(#f4fbfe,#d5eef8);background:-ms-linear-gradient(#f4fbfe,#d5eef8);background:linear-gradient(#f4fbfe,#d5eef8);-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(0,0,0,0.1) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,0.1) 0 1px 1px;box-shadow:rgba(0,0,0,0.1) 0 1px 1px}.uploadcare-line-buttons .uploadcare-line-icon{position:absolute;left:7px}.uploadcare-line-cancel{display:block;float:right;width:8px;height:9px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAJCAQAAAClWqWlAAAAj0lEQVQI1wXBwQmDMBgG0G8Cbx6zQCFLFDqVdwdwjAxgsFAwUUFQcvgvthsIBsxFzO3re7Cl/bQPAGi1fdsSzo3so9VW93GkcziaJQf66GPgko8GVMlIFgolJ0MF4PuSe+NGuX9PAJ0eolCyZOEQOw0/zVxzMsmseaafcNVhPw0V1WnCftVgwYoKAKhYsfgDIRFiQ7984PoAAAAASUVORK5CYII=") no-repeat 50% 50%;padding:2px;margin:9px 4px 0 1px}.uploadcare-line-slider{-webkit-transition:all,300ms;-moz-transition:all,300ms;-ms-transition:all,300ms;-o-transition:all,300ms;transition:all,300ms;position:relative;margin:0}.uploadcare-line-buttons .uploadcare-line-computer{padding-left:28px;position:relative;margin-top:0}.uploadcare-line-buttons .uploadcare-line-computer .uploadcare-line-icon{top:5px;width:16px;height:13px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAMAAACXZR4WAAAAP1BMVEUAAAD///////+Qrrytx9OvydeRr72SsL+Tsb+XtsSXt8WZuMeZuciausmcvMufv8+gwtGiw9OkxdWkxtalx9d4pYbSAAAABnRSTlMAWoCz2dmZsTKvAAAAU0lEQVQI162OOxaAIBADAyjIrnzl/md1UcRn7zRJpgoA47aBM+h4PfGX2DG5K7+CfxOBnh8UZFpKOQ1yIouQa2u1v5IsmrEeTUpkjkUyLVD6gzoBORkEIOkz/78AAAAASUVORK5CYII=") no-repeat 50% 50%}.uploadcare-line-buttons .uploadcare-line-web{padding-left:29px;position:relative}.uploadcare-line-buttons .uploadcare-line-web .uploadcare-line-icon{top:2px;width:17px;height:18px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAASCAYAAAC9+TVUAAAC/UlEQVQ4y41US0wTURStBKPRsFA3khgVt7rSxMQYVixwoTFu1BiWLoiGxIULjTGCiQsWIAK1bbAWCq1QWgXbWkpbpp1+7WdaoD9KQfk0fKRSAWmhn+e9IzUFRX3JyZt359xzz33z3nA4fxgNsoGDjXLtrSaFrgkgeC4frIN1JcSLOP8aQNoDSY+a+6gNkc7RYwlMPAjPLFR7xqdv89TmaHPf0CIIXttVoLFXe+zFO8NHudkrIIQ8BlwGnIotJUpNI5Gz8Hw3sZZ8wlWZCfAkWHC7gFy7j6s0TvA1NpLN5cox1vreON/ST/FhJpjI01hJm85JhEMeItA6CLjt3ibS0m/kqj1hvcLhD0NFtgLM9yW014lJYtqXEhm9pJ0eJp1WP+mgR1ghcFTBCsAelPA1lrQpMIkt3MwLQ/V7r4cYIrEF0l22IHnrHo9J7MGs1BHK4Lrd5CMCjS3Mkvlq+g7afGNiGgrdCQZsCTUT8UXm4m2z8RWuwhke67IGiNQe2pDYQ6yjV3oXujnMkVBuETMRk4GL8rwAfIXjSMAWhAY3Iiq1js6hiMQWzKAIQkR5iVjvOI8iKmdk6lKhC57aQqFdscXP7gP7bB4l2AY6yOVydSiIcRnN3OD00oyix+iuKBRR2EcpFMhXxGQWkBia/dKBm7+QWGtCp4NM+CpH7w3XtipNBA7RkbwIkK6srKfqYa5lW9gSk1r9qxAr2+IcEhpcuVg8UcZJbabPCHXOda6SJoVugHQAZ6VnzJ930u8KufPvobCwx+KLAq8YyUVG/6QKNxAd7TzJnUZmCt3InKG4lPZ5f+2bxpqdW16pKax6oc8VioiNzPJOkY10pqbb5l8CTg2gassFoUaiWliXbCNnstmqD8wYhW3BNSgtKFCMAj9PNvUQ3q9agp+UELv42wXEtgCVwel50UsVPQwJBAF3J4V3B8U7DE5qNZl6Crxzf/0dAOEkoPrb92R9eHZR5IrOdH9e/MpLbqafQfw6YD/nfwd+HcAJwGnAUcDe3bg/ALpRdnZzPzzmAAAAAElFTkSuQmCC") no-repeat 50% 50%}.uploadcare-line-file-input{float:left;overflow:hidden;position:relative;margin-top:3px}.uploadcare-line-file-input input{position:absolute;top:0;left:0;width:100%;height:100%;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;cursor:pointer;z-index:2}.uploadcare-line-uploader.uploadcare-from-url .uploadcare-line-slider{left:-293px}.uploadcare-line-from-url{position:absolute;top:0;left:293px;width:293px}.uploadcare-line-title{margin:0 5px 0 10px;float:left}.uploadcare-line-url{float:left;border:1px solid #b9bcbe;border-color:#b9bcbe #bdc0c2 #c1c5c7 #bdc0c2;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;background:#fff;color:#777;height:22px;width:160px;padding:0 5px;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 1px 0 inset;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 1px 0 inset;box-shadow:rgba(0,0,0,0.15) 0 1px 1px 0 inset;margin:3px 3px 0 0}.uploadcare-line-url:focus{outline:none}.uploadcare-line-right{float:right}.uploadcare-line-right .uploadcare-line-buttons{float:left}.uploadcare-line-right .uploadcare-line-cancel{float:left}.uploadcare-line-uploader.uploadcare-uploading .uploadcare-line-slider{margin-top:-30px}.uploadcare-line-progress{float:right;width:137px;height:4px;margin:12px 4px 0 0;border:1px solid #c9c9c9;border-top-color:#bbb;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;background:#d8d8d8;-webkit-box-shadow:#d0d0d0 0 1px 0 0 inset;-moz-box-shadow:#d0d0d0 0 1px 0 0 inset;box-shadow:#d0d0d0 0 1px 0 0 inset;position:relative}.uploadcare-line-progress div{position:absolute;width:40px;height:4px;top:-1px;left:-1px;border:1px solid #a9ccdb;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;background:#b7e2f3 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAEAQMAAACTPww9AAAABlBMVEWb1u634vNqPjngAAAAEElEQVQI12N4wHCBYQNDAQAMuALRrGb97AAAAABJRU5ErkJggg==");-webkit-box-shadow:rgba(255,255,255,0.3) 0 1px 0 0 inset;-moz-box-shadow:rgba(255,255,255,0.3) 0 1px 0 0 inset;box-shadow:rgba(255,255,255,0.3) 0 1px 0 0 inset}.uploadcare-line-error-wrapper{display:none;position:absolute;top:-1px;left:-1px;overflow:hidden;z-index:10}.uploadcare-line-error{padding:5px 0;line-height:20px;width:293px;border:1px solid #dda1a5;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#d15d62;background:#fff;-webkit-box-shadow:rgba(206,88,93,0.45) 0 0 15px 0 inset;-moz-box-shadow:rgba(206,88,93,0.45) 0 0 15px 0 inset;box-shadow:rgba(206,88,93,0.45) 0 0 15px 0 inset;position:relative;display:inline-block}.uploadcare-line-error-cloud{position:absolute;top:6px;left:9px;width:18px;height:12px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAMCAYAAABvEu28AAAAsElEQVQoz2NgQAMXY5PYgZgFymYC4iwgvgHE/6H4LxCfAmJvBmwAKCEHxBOA+AwQHwXiEiDOBeLfSIYg4ydAbItuiBIQn8Si+C8OQ2B4ERAzwwxhAeIWAhpw4f1ALIocJkvINGgHEHPBDNIE4otkGvQBiPuAmA9k0DEyDUHGXQx4YoUU/Apk0E8qGPQNZNAXKhh0iAGa8Cgx7AEQO4AM4gDiTCDeBU36pOBVQOwOin0AgvHi6I+GKv8AAAAASUVORK5CYII=") no-repeat 50% 50%}.uploadcare-line-error-rain{position:absolute;top:18px;left:10px;height:8px;width:15px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAHCAYAAADXhRcnAAAAb0lEQVQY02NggIKLsUmBDFgALvFLMPFLscldQEXzMRVgFweKQcQvxiQxAxlvgQrTUBRAxYE4DU0jqjhQox6SZAeSzXpIbCTxJD1s/jsJxLeJFUf2HxvQqf+Api5GCxg2oMZ/F9HEsdmsh1U8Brs4AKuWR7uentiJAAAAAElFTkSuQmCC") repeat 0 0;animation:uploadcare-line-pulse 1.3s linear infinite;-webkit-animation:uploadcare-line-pulse 1.3s linear infinite;-moz-animation:uploadcare-line-pulse 1.3s linear infinite}.uploadcare-line-error-text{float:left;margin-left:36px;width:225px}.uploadcare-line-error-back{display:block;float:right;padding:2px;margin:4px 4px 0 0;width:8px;height:8px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAGFBMVEUAAADRXWLRXWLRXWLRXWLRXWLRXWLRXWJUkwjSAAAAB3RSTlMAFSotur3qBiuZYwAAACZJREFUCNdjEFVgdmQITzYrZTArS09mYE4vMwARChAuWELUgDkQAK1mCNkIwNXGAAAAAElFTkSuQmCC") no-repeat 50% 50%}.uploadcare-line-filedata{position:relative;top:1px;height:30px}.uploadcare-line-filedata a.uploadcare-line-cancel{display:inline-block !important;margin:0;position:relative;top:9px;right:4px}.uploadcare-line-filedata-icon-placeholder{display:inline-block;vertical-align:top;background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f2fdf3), color-stop(100%, #e7f0d5));background:-webkit-linear-gradient(#f2fdf3,#e7f0d5);background:-moz-linear-gradient(#f2fdf3,#e7f0d5);background:-o-linear-gradient(#f2fdf3,#e7f0d5);background:-ms-linear-gradient(#f2fdf3,#e7f0d5);background:linear-gradient(#f2fdf3,#e7f0d5);border-right:1px solid #d8d8d8;width:30px;height:30px}.uploadcare-line-filedata-icon-placeholder-icon{position:relative;display:inline-block;border:0 none;margin-left:6px;margin-top:6px;padding:0;width:18px;height:18px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjI4OUZGNDcwQzU0MTFFMTk1MTY5QjU3NDNFQTk4OEQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjI4OUZGNDgwQzU0MTFFMTk1MTY5QjU3NDNFQTk4OEQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMjg5RkY0NTBDNTQxMUUxOTUxNjlCNTc0M0VBOTg4RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMjg5RkY0NjBDNTQxMUUxOTUxNjlCNTc0M0VBOTg4RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pviw0ewAAAKlSURBVDjLrZTPS1RRFMfvtMpo0aYiiYK2tmlRELRpEdIu6m+IVoWKgoGQoWG7oNzZpGkSmtoimdw4jhqjNpTjDDkDaqkzzjjOvDf317s/3qi3M1MMmP3QcPGBxz2Hzznvex8PGWPQQYCEYkgqjqRmyFEYKa3g2QEE4sKCOi3VHWWjHFtEVKWR0Bi5rkKOu35OFHLHpZv/H1EK6QJHhU11eTkX2rCcpQCcHd2naAGJguURrn0zvOKLvZlpMavW50heLB/bh8hCWCQ8RK01jc2/2Ho12WgiyfdGurhGudyzZ5FbEJXrON7mm3262RmoM9HkiFFbuZh2xQUFvWWR0s5JoWmV1rooOiK1LIugdj5pRwLvPj2xO0bvmo9LA0Zu5cKwyTUNg4tAIwfIFQjta5bFk0xtdAjJKx2JERNZkPKza/a8ty/YbJ77a7cD8S7juBt+pWUVgMoiKjcqsvRb78hcuxmYaTWLmcltqcltRxAPF7kbC5lgsj/4sOD11xgf9GCZGldKnlZKoR0izNMVKSvW0z/VAhNrTO+HJjO36tvkMtsMkrnXwQfGO1YHQx6ZDI0nHEmqhZAIZDtFXOBi0NdTJGoNwkZFWc9Eo5la6NP9063bnYF60z1x34RXho2j16e54IeEgMuQArIVP4QA4g4poRS/lSbR7FCorSTz+mtNV6ABqDe+2WeGqBWT58l2x+HQT3eBOGc/gdtR7E4KR8Tb0GNTzOTleIPpge9l2QqBZNVHuX2CO+xfIoYoxYeV5rUp/MUehEw6Ru+Z8Vi3wWJtIs/SZyjPoj2JGOMIUwvenV1N2NHZIdgsmQ8bwnIXMc0hwmxEGfktv4goHGJECEGQxaUMiyubJ4YpJYiUwH9kl6gkoxSKNmI8X52n6VN/E5RFB/Vj+w6Gzcd8vWkbFQAAAABJRU5ErkJggg==") no-repeat 50% 50%;width:18px;height:18px}.uploadcare-line-filedata-filename{position:relative;display:inline-block;vertical-align:top;padding-left:10px;width:40%;height:30px}.uploadcare-line-filedata-filesize{display:inline-block;vertical-align:baseline;text-align:center;padding-left:7px;font-weight:400;height:30px;width:60px;opacity:0.9;position:relative}.uploadcare-line-filedata-close{position:relative}.uploadcare-line-tinydrop{position:relative;top:1px;height:30px;text-align:center}.uploadcare-line-drop-decoration{position:absolute;left:10px;top:0px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAeCAIAAAB11XNZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjMyMTk5NDgwOUVDMTFFMUEyMTBGMTk4Q0QyMTA1MzQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjMyMTk5NDkwOUVDMTFFMUEyMTBGMTk4Q0QyMTA1MzQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMzIxOTk0NjA5RUMxMUUxQTIxMEYxOThDRDIxMDUzNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMzIxOTk0NzA5RUMxMUUxQTIxMEYxOThDRDIxMDUzNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlRlfWQAAADFSURBVCjPzZDLSgNREERP9e0h7hQdiBDw/z9MRCKaiI+JOveWi7hQkUxACdayabrOaa2HF3YmjXZvBFNJICKehs3l8vb+8TkkQ8D87OTivB9rSwA7Qpk5mx1FCbydhA2g1fAKCEWgT0y2q/3RAhjXBvhHl0nSqZU9bCdbDnTj/7j4t6SH+elfcCSQpSxX6+ubu3GsCtkE9KfHi3lfa0vj5lZC3axT14WEAUcpto119bAxpMj44lXtt2ZtWwTV1Nq+EWhP0neQhF0gA0Q2WAAAAABJRU5ErkJggg==") repeat-x 0 0;background-position-x:-1px;z-index:1;text-align:left}.uploadcare-line-drop-decoration span{color:#7391a0;display:inline-block;z-index:5}.uploadcare-line-drop-decoration .droptext{margin-left:10px}.uploadcare-line-drop-decoration .branding{font-size:11px;font-weight:200;opacity:0.9;float:right;text-shadow:1px 0px #fff}.uploadcare-line-drop-decoration .dnd-arrow{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAMAAAEbsuwEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGOTdGMTE3NDA3MjA2ODExOUVFMUM2QTRBRUM4NTYwQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1NTFCNUNCMTA2NjkxMUUxQUFBRjgzQ0M2RTczQ0U4RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1NTFCNUNCMDA2NjkxMUUxQUFBRjgzQ0M2RTczQ0U4RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M0IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkY4N0YxMTc0MDcyMDY4MTFCQTE2QUIyNDBEM0NCREEwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY5N0YxMTc0MDcyMDY4MTE5RUUxQzZBNEFFQzg1NjBCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+rdynBwAAALdQTFRF////ZoCO////////////vcnPZ4KP////mKu0orS8n7G6aIKQoLK7kqawmq23may2m6632ODj0dre////9vj59ff49/n6////aoSS6+/x6u7w7fHzaYSSaYSSbomXaYWTaYWTcIybhp6qlay4lq25lKu3gJmmjKWzjaazjKWzaYWTaoWTfZmnfZimfZmnd5KgdpOidpSid5SjcYybdpOico+ecpCfc5CgdpSkdpWkd5ameJameJenijMzbQAAADV0Uk5TAAMDBwgJCgwQEBEeKjAwMTI+TVFSU1hbYmRlaXa/wMfIyMvOztHa2trb3eXl5+fo+fr6/f3V8BPSAAAAcElEQVQIHQXBiUIBUQAAwLHkJiT3kbuSYxWx7/3/d5mBUs9eJFKbah7tMlrhwGQRz3PyX+/43heRZlWkWYWPvzAbGIe4KjDaJND4vV1PZfCaxnCsIqd+idnPi5zO9v8Rw/22bJMffoaw7iag0H9L8AQwIgumRuIwGgAAAABJRU5ErkJggg==") no-repeat 0 0;display:inline-block;width:10px;height:12px;margin-bottom:-2px;margin-right:5px;z-index:5}.uploadcare-line-drop-decoration .lc{position:absolute;left:-10px;top:0;width:10px;height:30px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAeCAIAAACaFxhnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjMyMDVDRUYwOUVDMTFFMUEyMTBGMTk4Q0QyMTA1MzQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjMyMDVDRjAwOUVDMTFFMUEyMTBGMTk4Q0QyMTA1MzQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMzIwNUNFRDA5RUMxMUUxQTIxMEYxOThDRDIxMDUzNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMzIwNUNFRTA5RUMxMUUxQTIxMEYxOThDRDIxMDUzNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhMgTkcAAAFNSURBVCjPpVPZTgJBEKw+XAQWF4yGN///nzQkRANeEQ/IArsz5cPCcuODnUkmMzXVR/W0PLx83nSaEBw176VNygkQ0EjitHm1CbAoytHbx3Seh8B+L7u9ztxsDauM3j6+80Wn3VJIo5EIBKTXfpYhXrVbd/1e4hYjIsnaOQAzU0WMCBVSeX2dzt0UgKuQCLuZOggQAMpwpATFWfM1+YQs59m6YouM3yeDp/GyLCFSXbJmi8jXLJ/M8qIM29Gcq5c0d/dEIIg7sVnLLget8zpMZXvHlagkup3WZVIkbpAN7gQJkrzJUgFC5PYP2Igajon6P9X+ZBMgVPR++DR4fC6KIJC6vrpuipraBtrKHADRaja+Z/PHl3cwdtM066Rmsqo7kP1uZqo/+aIsY2AgImEynMwu3KqmmYgKAAQyRALwerpIlgcTo0URuNWJvfULcDLD4OsDXUsAAAAASUVORK5CYII=") no-repeat 0 0}.uploadcare-line-drop-decoration .rc{position:absolute;right:-10px;top:0;width:10px;height:30px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAeCAIAAACaFxhnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjMyMTk5NDAwOUVDMTFFMUEyMTBGMTk4Q0QyMTA1MzQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjMyMTk5NDEwOUVDMTFFMUEyMTBGMTk4Q0QyMTA1MzQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMzIwNUNGNTA5RUMxMUUxQTIxMEYxOThDRDIxMDUzNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMzIwNUNGNjA5RUMxMUUxQTIxMEYxOThDRDIxMDUzNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlWZRmEAAAE7SURBVCjPtZJLTwJBEISregZBXqKoiR6MN///X9KEqCSrCAbd3e7ysAquUYwH5zCPdHrqq5rh4/oVPw0hC/yxShh2jkyydp8Xi7uHRUoc9vbPT466nQxAgEEi2O3uTUbDQb//tH6dzQsaaQSQBZhxOh6eTIZl7dd3D2VVbS9vlpAUiIAZUkqbMot1+ZklkSTqEAAJGWqhulrnncaErF3VX2PZdJOsqno2L4y4ODtt7OQWV0SxfN7r5GgA+ZWcuZNzznjnZ0ubAGEkv9FuUJt5s/mkLaVk04MBAaMB8BDvn1u/JRmJHaG6/iO177q11SZZVvXN7dyjvrq8AODh7W7CEgNp65uEuxbL1eNqBVpZ+3jQ+wgVWYAQLi/ryB07HPWPxyNXNNqcLV+aNBIJIASXpCaWjwf1kEN/NYY3iBer0LuJJuEAAAAASUVORK5CYII=") no-repeat 0 0}.uploadcare-line-dropzone{position:absolute;left:0;top:0;z-index:10}.uploadcare-line-uploader-dnd{border:1px solid #b2cedc}.uploadcare-line-uploader-dnd .uploadcare-line-tinydrop{top:0px}@keyframes uploadcare-line-pulse{from{background-position:0 0}to{background-position:0 15px}}@-webkit-keyframes uploadcare-line-pulse{from{background-position:0 0}to{background-position:0 15px}}@-moz-keyframes uploadcare-line-pulse{from{background-position:0 0}to{background-position:0 15px}}';/*
|
1752
|
-
* Copyright (c) 2011 UploadCare
|
1753
|
-
*
|
1754
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
1755
|
-
* of this software and associated documentation files (the "Software"), to deal
|
1756
|
-
* in the Software without restriction, including without limitation the rights
|
1757
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
1758
|
-
* copies of the Software, and to permit persons to whom the Software is
|
1759
|
-
* furnished to do so, subject to the following conditions:
|
1760
|
-
*
|
1761
|
-
* The above copyright notice and this permission notice shall be included in
|
1762
|
-
* all copies or substantial portions of the Software.
|
1763
|
-
*
|
1764
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
1765
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
1766
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
1767
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
1768
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
1769
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
1770
|
-
* SOFTWARE.
|
1771
|
-
*/
|
1772
|
-
|
1773
|
-
UploadCare.ready(function ($) {
|
1774
|
-
$(document).ready(function () {
|
1775
|
-
UploadCare.Line.init($('body'));
|
1776
|
-
});
|
1777
|
-
});
|