Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Websites UFRPE
Wagtail Videos
Commits
a7e0b168
Commit
a7e0b168
authored
Jul 07, 2016
by
Seb
Browse files
Major JS cleanup. Handling of thumbnail to replace image preview
parent
517db8ee
Changes
20
Hide whitespace changes
Inline
Side-by-side
README.rst
View file @
a7e0b168
...
...
@@ -29,3 +29,10 @@ In template
How to transcode using ffmpeg
//TODO
Future features
===============
- Richtext embed
- Streamfield block
- Transcoding via amazon service rather than ffmpeg
wagtailvideos/forms.py
View file @
a7e0b168
...
...
@@ -66,23 +66,6 @@ class VideoInsertionForm(forms.Form):
pass
class
URLGeneratorForm
(
forms
.
Form
):
filter_method
=
forms
.
ChoiceField
(
label
=
_
(
"Filter"
),
choices
=
(
(
'original'
,
_
(
"Original size"
)),
(
'width'
,
_
(
"Resize to width"
)),
(
'height'
,
_
(
"Resize to height"
)),
(
'min'
,
_
(
"Resize to min"
)),
(
'max'
,
_
(
"Resize to max"
)),
(
'fill'
,
_
(
"Resize to fill"
)),
),
)
width
=
forms
.
IntegerField
(
_
(
"Width"
),
min_value
=
0
)
height
=
forms
.
IntegerField
(
_
(
"Height"
),
min_value
=
0
)
closeness
=
forms
.
IntegerField
(
_
(
"Closeness"
),
min_value
=
0
,
initial
=
0
)
GroupImagePermissionFormSet
=
collection_member_permission_formset_factory
(
Video
,
[
...
...
wagtailvideos/models.py
View file @
a7e0b168
...
...
@@ -51,7 +51,7 @@ class AbstractVideo(CollectionMember, TagSearchable):
title
=
models
.
CharField
(
max_length
=
255
,
verbose_name
=
_
(
'title'
))
file
=
models
.
FileField
(
verbose_name
=
_
(
'file'
),
upload_to
=
get_upload_to
)
thumbnail
=
models
.
ImageField
()
thumbnail
=
models
.
ImageField
(
upload_to
=
get_upload_to
)
created_at
=
models
.
DateTimeField
(
verbose_name
=
_
(
'created at'
),
auto_now_add
=
True
,
db_index
=
True
)
uploaded_by_user
=
models
.
ForeignKey
(
settings
.
AUTH_USER_MODEL
,
verbose_name
=
_
(
'uploaded by user'
),
...
...
@@ -116,16 +116,23 @@ class AbstractVideo(CollectionMember, TagSearchable):
return
self
.
title
def
get_thumbnail
(
self
):
file_path
=
self
.
file
.
path
if
self
.
thumbnail
:
return
self
.
thumbnail
file_path
=
os
.
path
.
join
(
self
.
file
.
field
.
storage
.
base_location
,
self
.
get_upload_to
(
self
.
filename
()))
print
(
file_path
)
try
:
output_dir
=
tempfile
.
mkdtemp
()
output_file
=
os
.
path
.
join
(
output_dir
,
'
thumb
nail
.jpg'
)
output_file
=
os
.
path
.
join
(
output_dir
,
self
.
filename
(
include_ext
=
False
)
+
'_
thumb.jpg'
)
try
:
FNULL
=
open
(
os
.
devnull
,
'r'
)
subprocess
.
check_call
([
'ffmpeg'
,
'-
itsoffset
'
,
'-4'
,
'-
hide_banner
'
,
'-itsoffset'
,
'-4'
,
'-i'
,
file_path
,
'-vcodec'
,
'mjpeg'
,
'-vframes'
,
'1'
,
...
...
wagtailvideos/static/wagtailvideos/css/vendor/Jcrop.gif
deleted
100644 → 0
View file @
517db8ee
329 Bytes
wagtailvideos/static/wagtailvideos/css/vendor/jquery.Jcrop.min.css
deleted
100644 → 0
View file @
517db8ee
/* jquery.Jcrop.min.css v0.9.12 (build:20130126) */
.jcrop-holder
{
direction
:
ltr
;
text-align
:
left
;}
.jcrop-vline
,
.jcrop-hline
{
background
:
#FFF
url(Jcrop.gif)
;
font-size
:
0
;
position
:
absolute
;}
.jcrop-vline
{
height
:
100%
;
width
:
1px
!important
;}
.jcrop-vline.right
{
right
:
0
;}
.jcrop-hline
{
height
:
1px
!important
;
width
:
100%
;}
.jcrop-hline.bottom
{
bottom
:
0
;}
.jcrop-tracker
{
-webkit-tap-highlight-color
:
transparent
;
-webkit-touch-callout
:
none
;
-webkit-user-select
:
none
;
height
:
100%
;
width
:
100%
;}
.jcrop-handle
{
background-color
:
#333
;
border
:
1px
#EEE
solid
;
font-size
:
1px
;
height
:
7px
;
width
:
7px
;}
.jcrop-handle.ord-n
{
left
:
50%
;
margin-left
:
-4px
;
margin-top
:
-4px
;
top
:
0
;}
.jcrop-handle.ord-s
{
bottom
:
0
;
left
:
50%
;
margin-bottom
:
-4px
;
margin-left
:
-4px
;}
.jcrop-handle.ord-e
{
margin-right
:
-4px
;
margin-top
:
-4px
;
right
:
0
;
top
:
50%
;}
.jcrop-handle.ord-w
{
left
:
0
;
margin-left
:
-4px
;
margin-top
:
-4px
;
top
:
50%
;}
.jcrop-handle.ord-nw
{
left
:
0
;
margin-left
:
-4px
;
margin-top
:
-4px
;
top
:
0
;}
.jcrop-handle.ord-ne
{
margin-right
:
-4px
;
margin-top
:
-4px
;
right
:
0
;
top
:
0
;}
.jcrop-handle.ord-se
{
bottom
:
0
;
margin-bottom
:
-4px
;
margin-right
:
-4px
;
right
:
0
;}
.jcrop-handle.ord-sw
{
bottom
:
0
;
left
:
0
;
margin-bottom
:
-4px
;
margin-left
:
-4px
;}
.jcrop-dragbar.ord-n
,
.jcrop-dragbar.ord-s
{
height
:
7px
;
width
:
100%
;}
.jcrop-dragbar.ord-e
,
.jcrop-dragbar.ord-w
{
height
:
100%
;
width
:
7px
;}
.jcrop-dragbar.ord-n
{
margin-top
:
-4px
;}
.jcrop-dragbar.ord-s
{
bottom
:
0
;
margin-bottom
:
-4px
;}
.jcrop-dragbar.ord-e
{
margin-right
:
-4px
;
right
:
0
;}
.jcrop-dragbar.ord-w
{
margin-left
:
-4px
;}
.jcrop-light
.jcrop-vline
,
.jcrop-light
.jcrop-hline
{
background
:
#FFF
;
filter
:
alpha
(
opacity
=
70
)
!important
;
opacity
:
.70
!important
;}
.jcrop-light
.jcrop-handle
{
-moz-border-radius
:
3px
;
-webkit-border-radius
:
3px
;
background-color
:
#000
;
border-color
:
#FFF
;
border-radius
:
3px
;}
.jcrop-dark
.jcrop-vline
,
.jcrop-dark
.jcrop-hline
{
background
:
#000
;
filter
:
alpha
(
opacity
=
70
)
!important
;
opacity
:
.7
!important
;}
.jcrop-dark
.jcrop-handle
{
-moz-border-radius
:
3px
;
-webkit-border-radius
:
3px
;
background-color
:
#FFF
;
border-color
:
#000
;
border-radius
:
3px
;}
.solid-line
.jcrop-vline
,
.solid-line
.jcrop-hline
{
background
:
#FFF
;}
.jcrop-holder
img
,
img
.jcrop-preview
{
max-width
:
none
;}
wagtailvideos/static/wagtailvideos/js/add-multiple.js
View file @
a7e0b168
...
...
@@ -16,10 +16,6 @@ $(function() {
dropZone
:
$
(
'
.drop-zone
'
),
acceptFileTypes
:
window
.
fileupload_opts
.
accepted_file_types
,
maxFileSize
:
window
.
fileupload_opts
.
max_file_size
,
previewMinWidth
:
150
,
previewMaxWidth
:
150
,
previewMinHeight
:
150
,
previewMaxHeight
:
150
,
messages
:
{
acceptFileTypes
:
window
.
fileupload_opts
.
errormessages
.
accepted_file_types
,
maxFileSize
:
window
.
fileupload_opts
.
errormessages
.
max_file_size
...
...
@@ -43,8 +39,8 @@ $(function() {
});
data
.
context
.
find
(
'
.preview .thumb
'
).
each
(
function
(
index
,
elm
)
{
$
(
elm
).
addClass
(
'
hasthumb
'
)
$
(
elm
).
a
ppend
(
data
.
files
[
index
].
preview
);
debugger
;
$
(
elm
).
a
ddClass
(
'
hasthumb
'
);
});
}).
done
(
function
()
{
...
...
wagtailvideos/static/wagtailvideos/js/hallo-plugins/hallo-wagtailvideo.js
deleted
100644 → 0
View file @
517db8ee
// Generated by CoffeeScript 1.6.2
(
function
()
{
(
function
(
$
)
{
return
$
.
widget
(
'
IKS.hallowagtailvideo
'
,
{
options
:
{
uuid
:
''
,
editable
:
null
},
populateToolbar
:
function
(
toolbar
)
{
var
button
,
widget
;
widget
=
this
;
button
=
$
(
'
<span class="
'
+
this
.
widgetName
+
'
"></span>
'
);
button
.
hallobutton
({
uuid
:
this
.
options
.
uuid
,
editable
:
this
.
options
.
editable
,
label
:
'
Videos
'
,
icon
:
'
icon-video
'
,
command
:
null
});
toolbar
.
append
(
button
);
return
button
.
on
(
'
click
'
,
function
(
event
)
{
var
insertionPoint
,
lastSelection
;
lastSelection
=
widget
.
options
.
editable
.
getSelection
();
insertionPoint
=
$
(
lastSelection
.
endContainer
).
parentsUntil
(
'
.richtext
'
).
last
();
return
ModalWorkflow
({
url
:
window
.
chooserUrls
.
videoChooser
+
'
?select_format=true
'
,
responses
:
{
videoChosen
:
function
(
videoData
)
{
var
elem
;
elem
=
$
(
videoData
.
html
).
get
(
0
);
lastSelection
.
insertNode
(
elem
);
if
(
elem
.
getAttribute
(
'
contenteditable
'
)
===
'
false
'
)
{
insertRichTextDeleteControl
(
elem
);
}
return
widget
.
options
.
editable
.
element
.
trigger
(
'
change
'
);
}
}
});
});
}
});
})(
jQuery
);
}).
call
(
this
);
wagtailvideos/static/wagtailvideos/js/vendor/canvas-to-blob.min.js
deleted
100644 → 0
View file @
517db8ee
!
function
(
a
){
"
use strict
"
;
var
b
=
a
.
HTMLCanvasElement
&&
a
.
HTMLCanvasElement
.
prototype
,
c
=
a
.
Blob
&&
function
(){
try
{
return
Boolean
(
new
Blob
)}
catch
(
a
){
return
!
1
}}(),
d
=
c
&&
a
.
Uint8Array
&&
function
(){
try
{
return
100
===
new
Blob
([
new
Uint8Array
(
100
)]).
size
}
catch
(
a
){
return
!
1
}}(),
e
=
a
.
BlobBuilder
||
a
.
WebKitBlobBuilder
||
a
.
MozBlobBuilder
||
a
.
MSBlobBuilder
,
f
=
(
c
||
e
)
&&
a
.
atob
&&
a
.
ArrayBuffer
&&
a
.
Uint8Array
&&
function
(
a
){
var
b
,
f
,
g
,
h
,
i
,
j
;
for
(
b
=
a
.
split
(
"
,
"
)[
0
].
indexOf
(
"
base64
"
)
>=
0
?
atob
(
a
.
split
(
"
,
"
)[
1
]):
decodeURIComponent
(
a
.
split
(
"
,
"
)[
1
]),
f
=
new
ArrayBuffer
(
b
.
length
),
g
=
new
Uint8Array
(
f
),
h
=
0
;
h
<
b
.
length
;
h
+=
1
)
g
[
h
]
=
b
.
charCodeAt
(
h
);
return
i
=
a
.
split
(
"
,
"
)[
0
].
split
(
"
:
"
)[
1
].
split
(
"
;
"
)[
0
],
c
?
new
Blob
([
d
?
g
:
f
],{
type
:
i
}):(
j
=
new
e
,
j
.
append
(
f
),
j
.
getBlob
(
i
))};
a
.
HTMLCanvasElement
&&!
b
.
toBlob
&&
(
b
.
mozGetAsFile
?
b
.
toBlob
=
function
(
a
,
c
,
d
){
d
&&
b
.
toDataURL
&&
f
?
a
(
f
(
this
.
toDataURL
(
c
,
d
))):
a
(
this
.
mozGetAsFile
(
"
blob
"
,
c
))}:
b
.
toDataURL
&&
f
&&
(
b
.
toBlob
=
function
(
a
,
b
,
c
){
a
(
f
(
this
.
toDataURL
(
b
,
c
)))})),
"
function
"
==
typeof
define
&&
define
.
amd
?
define
(
function
(){
return
f
}):
a
.
dataURLtoBlob
=
f
}(
this
);
\ No newline at end of file
wagtailvideos/static/wagtailvideos/js/vendor/jquery.Jcrop.min.js
deleted
100644 → 0
View file @
517db8ee
/**
* jquery.Jcrop.min.js v0.9.12 (build:20130202)
* jQuery Image Cropping Plugin - released under MIT License
* Copyright (c) 2008-2013 Tapmodo Interactive LLC
* https://github.com/tapmodo/Jcrop
*/
(
function
(
a
){
a
.
Jcrop
=
function
(
b
,
c
){
function
i
(
a
){
return
Math
.
round
(
a
)
+
"
px
"
}
function
j
(
a
){
return
d
.
baseClass
+
"
-
"
+
a
}
function
k
(){
return
a
.
fx
.
step
.
hasOwnProperty
(
"
backgroundColor
"
)}
function
l
(
b
){
var
c
=
a
(
b
).
offset
();
return
[
c
.
left
,
c
.
top
]}
function
m
(
a
){
return
[
a
.
pageX
-
e
[
0
],
a
.
pageY
-
e
[
1
]]}
function
n
(
b
){
typeof
b
!=
"
object
"
&&
(
b
=
{}),
d
=
a
.
extend
(
d
,
b
),
a
.
each
([
"
onChange
"
,
"
onSelect
"
,
"
onRelease
"
,
"
onDblClick
"
],
function
(
a
,
b
){
typeof
d
[
b
]
!=
"
function
"
&&
(
d
[
b
]
=
function
(){})})}
function
o
(
a
,
b
,
c
){
e
=
l
(
D
),
bc
.
setCursor
(
a
===
"
move
"
?
a
:
a
+
"
-resize
"
);
if
(
a
===
"
move
"
)
return
bc
.
activateHandlers
(
q
(
b
),
v
,
c
);
var
d
=
_
.
getFixed
(),
f
=
r
(
a
),
g
=
_
.
getCorner
(
r
(
f
));
_
.
setPressed
(
_
.
getCorner
(
f
)),
_
.
setCurrent
(
g
),
bc
.
activateHandlers
(
p
(
a
,
d
),
v
,
c
)}
function
p
(
a
,
b
){
return
function
(
c
){
if
(
!
d
.
aspectRatio
)
switch
(
a
){
case
"
e
"
:
c
[
1
]
=
b
.
y2
;
break
;
case
"
w
"
:
c
[
1
]
=
b
.
y2
;
break
;
case
"
n
"
:
c
[
0
]
=
b
.
x2
;
break
;
case
"
s
"
:
c
[
0
]
=
b
.
x2
}
else
switch
(
a
){
case
"
e
"
:
c
[
1
]
=
b
.
y
+
1
;
break
;
case
"
w
"
:
c
[
1
]
=
b
.
y
+
1
;
break
;
case
"
n
"
:
c
[
0
]
=
b
.
x
+
1
;
break
;
case
"
s
"
:
c
[
0
]
=
b
.
x
+
1
}
_
.
setCurrent
(
c
),
bb
.
update
()}}
function
q
(
a
){
var
b
=
a
;
return
bd
.
watchKeys
(),
function
(
a
){
_
.
moveOffset
([
a
[
0
]
-
b
[
0
],
a
[
1
]
-
b
[
1
]]),
b
=
a
,
bb
.
update
()}}
function
r
(
a
){
switch
(
a
){
case
"
n
"
:
return
"
sw
"
;
case
"
s
"
:
return
"
nw
"
;
case
"
e
"
:
return
"
nw
"
;
case
"
w
"
:
return
"
ne
"
;
case
"
ne
"
:
return
"
sw
"
;
case
"
nw
"
:
return
"
se
"
;
case
"
se
"
:
return
"
nw
"
;
case
"
sw
"
:
return
"
ne
"
}}
function
s
(
a
){
return
function
(
b
){
return
d
.
disabled
?
!
1
:
a
===
"
move
"
&&!
d
.
allowMove
?
!
1
:(
e
=
l
(
D
),
W
=!
0
,
o
(
a
,
m
(
b
)),
b
.
stopPropagation
(),
b
.
preventDefault
(),
!
1
)}}
function
t
(
a
,
b
,
c
){
var
d
=
a
.
width
(),
e
=
a
.
height
();
d
>
b
&&
b
>
0
&&
(
d
=
b
,
e
=
b
/
a
.
width
()
*
a
.
height
()),
e
>
c
&&
c
>
0
&&
(
e
=
c
,
d
=
c
/
a
.
height
()
*
a
.
width
()),
T
=
a
.
width
()
/
d
,
U
=
a
.
height
()
/
e
,
a
.
width
(
d
).
height
(
e
)}
function
u
(
a
){
return
{
x
:
a
.
x
*
T
,
y
:
a
.
y
*
U
,
x2
:
a
.
x2
*
T
,
y2
:
a
.
y2
*
U
,
w
:
a
.
w
*
T
,
h
:
a
.
h
*
U
}}
function
v
(
a
){
var
b
=
_
.
getFixed
();
b
.
w
>
d
.
minSelect
[
0
]
&&
b
.
h
>
d
.
minSelect
[
1
]?(
bb
.
enableHandles
(),
bb
.
done
()):
bb
.
release
(),
bc
.
setCursor
(
d
.
allowSelect
?
"
crosshair
"
:
"
default
"
)}
function
w
(
a
){
if
(
d
.
disabled
)
return
!
1
;
if
(
!
d
.
allowSelect
)
return
!
1
;
W
=!
0
,
e
=
l
(
D
),
bb
.
disableHandles
(),
bc
.
setCursor
(
"
crosshair
"
);
var
b
=
m
(
a
);
return
_
.
setPressed
(
b
),
bb
.
update
(),
bc
.
activateHandlers
(
x
,
v
,
a
.
type
.
substring
(
0
,
5
)
===
"
touch
"
),
bd
.
watchKeys
(),
a
.
stopPropagation
(),
a
.
preventDefault
(),
!
1
}
function
x
(
a
){
_
.
setCurrent
(
a
),
bb
.
update
()}
function
y
(){
var
b
=
a
(
"
<div></div>
"
).
addClass
(
j
(
"
tracker
"
));
return
g
&&
b
.
css
({
opacity
:
0
,
backgroundColor
:
"
white
"
}),
b
}
function
be
(
a
){
G
.
removeClass
().
addClass
(
j
(
"
holder
"
)).
addClass
(
a
)}
function
bf
(
a
,
b
){
function
t
(){
window
.
setTimeout
(
u
,
l
)}
var
c
=
a
[
0
]
/
T
,
e
=
a
[
1
]
/
U
,
f
=
a
[
2
]
/
T
,
g
=
a
[
3
]
/
U
;
if
(
X
)
return
;
var
h
=
_
.
flipCoords
(
c
,
e
,
f
,
g
),
i
=
_
.
getFixed
(),
j
=
[
i
.
x
,
i
.
y
,
i
.
x2
,
i
.
y2
],
k
=
j
,
l
=
d
.
animationDelay
,
m
=
h
[
0
]
-
j
[
0
],
n
=
h
[
1
]
-
j
[
1
],
o
=
h
[
2
]
-
j
[
2
],
p
=
h
[
3
]
-
j
[
3
],
q
=
0
,
r
=
d
.
swingSpeed
;
c
=
k
[
0
],
e
=
k
[
1
],
f
=
k
[
2
],
g
=
k
[
3
],
bb
.
animMode
(
!
0
);
var
s
,
u
=
function
(){
return
function
(){
q
+=
(
100
-
q
)
/
r
,
k
[
0
]
=
Math
.
round
(
c
+
q
/
100
*
m
),
k
[
1
]
=
Math
.
round
(
e
+
q
/
100
*
n
),
k
[
2
]
=
Math
.
round
(
f
+
q
/
100
*
o
),
k
[
3
]
=
Math
.
round
(
g
+
q
/
100
*
p
),
q
>=
99.8
&&
(
q
=
100
),
q
<
100
?(
bh
(
k
),
t
()):(
bb
.
done
(),
bb
.
animMode
(
!
1
),
typeof
b
==
"
function
"
&&
b
.
call
(
bs
))}}();
t
()}
function
bg
(
a
){
bh
([
a
[
0
]
/
T
,
a
[
1
]
/
U
,
a
[
2
]
/
T
,
a
[
3
]
/
U
]),
d
.
onSelect
.
call
(
bs
,
u
(
_
.
getFixed
())),
bb
.
enableHandles
()}
function
bh
(
a
){
_
.
setPressed
([
a
[
0
],
a
[
1
]]),
_
.
setCurrent
([
a
[
2
],
a
[
3
]]),
bb
.
update
()}
function
bi
(){
return
u
(
_
.
getFixed
())}
function
bj
(){
return
_
.
getFixed
()}
function
bk
(
a
){
n
(
a
),
br
()}
function
bl
(){
d
.
disabled
=!
0
,
bb
.
disableHandles
(),
bb
.
setCursor
(
"
default
"
),
bc
.
setCursor
(
"
default
"
)}
function
bm
(){
d
.
disabled
=!
1
,
br
()}
function
bn
(){
bb
.
done
(),
bc
.
activateHandlers
(
null
,
null
)}
function
bo
(){
G
.
remove
(),
A
.
show
(),
A
.
css
(
"
visibility
"
,
"
visible
"
),
a
(
b
).
removeData
(
"
Jcrop
"
)}
function
bp
(
a
,
b
){
bb
.
release
(),
bl
();
var
c
=
new
Image
;
c
.
onload
=
function
(){
var
e
=
c
.
width
,
f
=
c
.
height
,
g
=
d
.
boxWidth
,
h
=
d
.
boxHeight
;
D
.
width
(
e
).
height
(
f
),
D
.
attr
(
"
src
"
,
a
),
H
.
attr
(
"
src
"
,
a
),
t
(
D
,
g
,
h
),
E
=
D
.
width
(),
F
=
D
.
height
(),
H
.
width
(
E
).
height
(
F
),
M
.
width
(
E
+
L
*
2
).
height
(
F
+
L
*
2
),
G
.
width
(
E
).
height
(
F
),
ba
.
resize
(
E
,
F
),
bm
(),
typeof
b
==
"
function
"
&&
b
.
call
(
bs
)},
c
.
src
=
a
}
function
bq
(
a
,
b
,
c
){
var
e
=
b
||
d
.
bgColor
;
d
.
bgFade
&&
k
()
&&
d
.
fadeTime
&&!
c
?
a
.
animate
({
backgroundColor
:
e
},{
queue
:
!
1
,
duration
:
d
.
fadeTime
}):
a
.
css
(
"
backgroundColor
"
,
e
)}
function
br
(
a
){
d
.
allowResize
?
a
?
bb
.
enableOnly
():
bb
.
enableHandles
():
bb
.
disableHandles
(),
bc
.
setCursor
(
d
.
allowSelect
?
"
crosshair
"
:
"
default
"
),
bb
.
setCursor
(
d
.
allowMove
?
"
move
"
:
"
default
"
),
d
.
hasOwnProperty
(
"
trueSize
"
)
&&
(
T
=
d
.
trueSize
[
0
]
/
E
,
U
=
d
.
trueSize
[
1
]
/
F
),
d
.
hasOwnProperty
(
"
setSelect
"
)
&&
(
bg
(
d
.
setSelect
),
bb
.
done
(),
delete
d
.
setSelect
),
ba
.
refresh
(),
d
.
bgColor
!=
N
&&
(
bq
(
d
.
shade
?
ba
.
getShades
():
G
,
d
.
shade
?
d
.
shadeColor
||
d
.
bgColor
:
d
.
bgColor
),
N
=
d
.
bgColor
),
O
!=
d
.
bgOpacity
&&
(
O
=
d
.
bgOpacity
,
d
.
shade
?
ba
.
refresh
():
bb
.
setBgOpacity
(
O
)),
P
=
d
.
maxSize
[
0
]
||
0
,
Q
=
d
.
maxSize
[
1
]
||
0
,
R
=
d
.
minSize
[
0
]
||
0
,
S
=
d
.
minSize
[
1
]
||
0
,
d
.
hasOwnProperty
(
"
outerImage
"
)
&&
(
D
.
attr
(
"
src
"
,
d
.
outerImage
),
delete
d
.
outerImage
),
bb
.
refresh
()}
var
d
=
a
.
extend
({},
a
.
Jcrop
.
defaults
),
e
,
f
=
navigator
.
userAgent
.
toLowerCase
(),
g
=
/msie/
.
test
(
f
),
h
=
/msie
[
1-6
]\.
/
.
test
(
f
);
typeof
b
!=
"
object
"
&&
(
b
=
a
(
b
)[
0
]),
typeof
c
!=
"
object
"
&&
(
c
=
{}),
n
(
c
);
var
z
=
{
border
:
"
none
"
,
visibility
:
"
visible
"
,
margin
:
0
,
padding
:
0
,
position
:
"
absolute
"
,
top
:
0
,
left
:
0
},
A
=
a
(
b
),
B
=!
0
;
if
(
b
.
tagName
==
"
IMG
"
){
if
(
A
[
0
].
width
!=
0
&&
A
[
0
].
height
!=
0
)
A
.
width
(
A
[
0
].
width
),
A
.
height
(
A
[
0
].
height
);
else
{
var
C
=
new
Image
;
C
.
src
=
A
[
0
].
src
,
A
.
width
(
C
.
width
),
A
.
height
(
C
.
height
)}
var
D
=
A
.
clone
().
removeAttr
(
"
id
"
).
css
(
z
).
show
();
D
.
width
(
A
.
width
()),
D
.
height
(
A
.
height
()),
A
.
after
(
D
).
hide
()}
else
D
=
A
.
css
(
z
).
show
(),
B
=!
1
,
d
.
shade
===
null
&&
(
d
.
shade
=!
0
);
t
(
D
,
d
.
boxWidth
,
d
.
boxHeight
);
var
E
=
D
.
width
(),
F
=
D
.
height
(),
G
=
a
(
"
<div />
"
).
width
(
E
).
height
(
F
).
addClass
(
j
(
"
holder
"
)).
css
({
position
:
"
relative
"
,
backgroundColor
:
d
.
bgColor
}).
insertAfter
(
A
).
append
(
D
);
d
.
addClass
&&
G
.
addClass
(
d
.
addClass
);
var
H
=
a
(
"
<div />
"
),
I
=
a
(
"
<div />
"
).
width
(
"
100%
"
).
height
(
"
100%
"
).
css
({
zIndex
:
310
,
position
:
"
absolute
"
,
overflow
:
"
hidden
"
}),
J
=
a
(
"
<div />
"
).
width
(
"
100%
"
).
height
(
"
100%
"
).
css
(
"
zIndex
"
,
320
),
K
=
a
(
"
<div />
"
).
css
({
position
:
"
absolute
"
,
zIndex
:
600
}).
dblclick
(
function
(){
var
a
=
_
.
getFixed
();
d
.
onDblClick
.
call
(
bs
,
a
)}).
insertBefore
(
D
).
append
(
I
,
J
);
B
&&
(
H
=
a
(
"
<img />
"
).
attr
(
"
src
"
,
D
.
attr
(
"
src
"
)).
css
(
z
).
width
(
E
).
height
(
F
),
I
.
append
(
H
)),
h
&&
K
.
css
({
overflowY
:
"
hidden
"
});
var
L
=
d
.
boundary
,
M
=
y
().
width
(
E
+
L
*
2
).
height
(
F
+
L
*
2
).
css
({
position
:
"
absolute
"
,
top
:
i
(
-
L
),
left
:
i
(
-
L
),
zIndex
:
290
}).
mousedown
(
w
),
N
=
d
.
bgColor
,
O
=
d
.
bgOpacity
,
P
,
Q
,
R
,
S
,
T
,
U
,
V
=!
0
,
W
,
X
,
Y
;
e
=
l
(
D
);
var
Z
=
function
(){
function
a
(){
var
a
=
{},
b
=
[
"
touchstart
"
,
"
touchmove
"
,
"
touchend
"
],
c
=
document
.
createElement
(
"
div
"
),
d
;
try
{
for
(
d
=
0
;
d
<
b
.
length
;
d
++
){
var
e
=
b
[
d
];
e
=
"
on
"
+
e
;
var
f
=
e
in
c
;
f
||
(
c
.
setAttribute
(
e
,
"
return;
"
),
f
=
typeof
c
[
e
]
==
"
function
"
),
a
[
b
[
d
]]
=
f
}
return
a
.
touchstart
&&
a
.
touchend
&&
a
.
touchmove
}
catch
(
g
){
return
!
1
}}
function
b
(){
return
d
.
touchSupport
===!
0
||
d
.
touchSupport
===!
1
?
d
.
touchSupport
:
a
()}
return
{
createDragger
:
function
(
a
){
return
function
(
b
){
return
d
.
disabled
?
!
1
:
a
===
"
move
"
&&!
d
.
allowMove
?
!
1
:(
e
=
l
(
D
),
W
=!
0
,
o
(
a
,
m
(
Z
.
cfilter
(
b
)),
!
0
),
b
.
stopPropagation
(),
b
.
preventDefault
(),
!
1
)}},
newSelection
:
function
(
a
){
return
w
(
Z
.
cfilter
(
a
))},
cfilter
:
function
(
a
){
return
a
.
pageX
=
a
.
originalEvent
.
changedTouches
[
0
].
pageX
,
a
.
pageY
=
a
.
originalEvent
.
changedTouches
[
0
].
pageY
,
a
},
isSupported
:
a
,
support
:
b
()}}(),
_
=
function
(){
function
h
(
d
){
d
=
n
(
d
),
c
=
a
=
d
[
0
],
e
=
b
=
d
[
1
]}
function
i
(
a
){
a
=
n
(
a
),
f
=
a
[
0
]
-
c
,
g
=
a
[
1
]
-
e
,
c
=
a
[
0
],
e
=
a
[
1
]}
function
j
(){
return
[
f
,
g
]}
function
k
(
d
){
var
f
=
d
[
0
],
g
=
d
[
1
];
0
>
a
+
f
&&
(
f
-=
f
+
a
),
0
>
b
+
g
&&
(
g
-=
g
+
b
),
F
<
e
+
g
&&
(
g
+=
F
-
(
e
+
g
)),
E
<
c
+
f
&&
(
f
+=
E
-
(
c
+
f
)),
a
+=
f
,
c
+=
f
,
b
+=
g
,
e
+=
g
}
function
l
(
a
){
var
b
=
m
();
switch
(
a
){
case
"
ne
"
:
return
[
b
.
x2
,
b
.
y
];
case
"
nw
"
:
return
[
b
.
x
,
b
.
y
];
case
"
se
"
:
return
[
b
.
x2
,
b
.
y2
];
case
"
sw
"
:
return
[
b
.
x
,
b
.
y2
]}}
function
m
(){
if
(
!
d
.
aspectRatio
)
return
p
();
var
f
=
d
.
aspectRatio
,
g
=
d
.
minSize
[
0
]
/
T
,
h
=
d
.
maxSize
[
0
]
/
T
,
i
=
d
.
maxSize
[
1
]
/
U
,
j
=
c
-
a
,
k
=
e
-
b
,
l
=
Math
.
abs
(
j
),
m
=
Math
.
abs
(
k
),
n
=
l
/
m
,
r
,
s
,
t
,
u
;
return
h
===
0
&&
(
h
=
E
*
10
),
i
===
0
&&
(
i
=
F
*
10
),
n
<
f
?(
s
=
e
,
t
=
m
*
f
,
r
=
j
<
0
?
a
-
t
:
t
+
a
,
r
<
0
?(
r
=
0
,
u
=
Math
.
abs
((
r
-
a
)
/
f
),
s
=
k
<
0
?
b
-
u
:
u
+
b
):
r
>
E
&&
(
r
=
E
,
u
=
Math
.
abs
((
r
-
a
)
/
f
),
s
=
k
<
0
?
b
-
u
:
u
+
b
)):(
r
=
c
,
u
=
l
/
f
,
s
=
k
<
0
?
b
-
u
:
b
+
u
,
s
<
0
?(
s
=
0
,
t
=
Math
.
abs
((
s
-
b
)
*
f
),
r
=
j
<
0
?
a
-
t
:
t
+
a
):
s
>
F
&&
(
s
=
F
,
t
=
Math
.
abs
(
s
-
b
)
*
f
,
r
=
j
<
0
?
a
-
t
:
t
+
a
)),
r
>
a
?(
r
-
a
<
g
?
r
=
a
+
g
:
r
-
a
>
h
&&
(
r
=
a
+
h
),
s
>
b
?
s
=
b
+
(
r
-
a
)
/
f
:
s
=
b
-
(
r
-
a
)
/
f
):
r
<
a
&&
(
a
-
r
<
g
?
r
=
a
-
g
:
a
-
r
>
h
&&
(
r
=
a
-
h
),
s
>
b
?
s
=
b
+
(
a
-
r
)
/
f
:
s
=
b
-
(
a
-
r
)
/
f
),
r
<
0
?(
a
-=
r
,
r
=
0
):
r
>
E
&&
(
a
-=
r
-
E
,
r
=
E
),
s
<
0
?(
b
-=
s
,
s
=
0
):
s
>
F
&&
(
b
-=
s
-
F
,
s
=
F
),
q
(
o
(
a
,
b
,
r
,
s
))}
function
n
(
a
){
return
a
[
0
]
<
0
&&
(
a
[
0
]
=
0
),
a
[
1
]
<
0
&&
(
a
[
1
]
=
0
),
a
[
0
]
>
E
&&
(
a
[
0
]
=
E
),
a
[
1
]
>
F
&&
(
a
[
1
]
=
F
),[
Math
.
round
(
a
[
0
]),
Math
.
round
(
a
[
1
])]}
function
o
(
a
,
b
,
c
,
d
){
var
e
=
a
,
f
=
c
,
g
=
b
,
h
=
d
;
return
c
<
a
&&
(
e
=
c
,
f
=
a
),
d
<
b
&&
(
g
=
d
,
h
=
b
),[
e
,
g
,
f
,
h
]}
function
p
(){
var
d
=
c
-
a
,
f
=
e
-
b
,
g
;
return
P
&&
Math
.
abs
(
d
)
>
P
&&
(
c
=
d
>
0
?
a
+
P
:
a
-
P
),
Q
&&
Math
.
abs
(
f
)
>
Q
&&
(
e
=
f
>
0
?
b
+
Q
:
b
-
Q
),
S
/
U
&&
Math
.
abs
(
f
)
<
S
/
U
&&
(
e
=
f
>
0
?
b
+
S
/
U
:
b
-
S
/
U
),
R
/
T
&&
Math
.
abs
(
d
)
<
R
/
T
&&
(
c
=
d
>
0
?
a
+
R
/
T
:
a
-
R
/
T
),
a
<
0
&&
(
c
-=
a
,
a
-=
a
),
b
<
0
&&
(
e
-=
b
,
b
-=
b
),
c
<
0
&&
(
a
-=
c
,
c
-=
c
),
e
<
0
&&
(
b
-=
e
,
e
-=
e
),
c
>
E
&&
(
g
=
c
-
E
,
a
-=
g
,
c
-=
g
),
e
>
F
&&
(
g
=
e
-
F
,
b
-=
g
,
e
-=
g
),
a
>
E
&&
(
g
=
a
-
F
,
e
-=
g
,
b
-=
g
),
b
>
F
&&
(
g
=
b
-
F
,
e
-=
g
,
b
-=
g
),
q
(
o
(
a
,
b
,
c
,
e
))}
function
q
(
a
){
return
{
x
:
a
[
0
],
y
:
a
[
1
],
x2
:
a
[
2
],
y2
:
a
[
3
],
w
:
a
[
2
]
-
a
[
0
],
h
:
a
[
3
]
-
a
[
1
]}}
var
a
=
0
,
b
=
0
,
c
=
0
,
e
=
0
,
f
,
g
;
return
{
flipCoords
:
o
,
setPressed
:
h
,
setCurrent
:
i
,
getOffset
:
j
,
moveOffset
:
k
,
getCorner
:
l
,
getFixed
:
m
}}(),
ba
=
function
(){
function
f
(
a
,
b
){
e
.
left
.
css
({
height
:
i
(
b
)}),
e
.
right
.
css
({
height
:
i
(
b
)})}
function
g
(){
return
h
(
_
.
getFixed
())}
function
h
(
a
){
e
.
top
.
css
({
left
:
i
(
a
.
x
),
width
:
i
(
a
.
w
),
height
:
i
(
a
.
y
)}),
e
.
bottom
.
css
({
top
:
i
(
a
.
y2
),
left
:
i
(
a
.
x
),
width
:
i
(
a
.
w
),
height
:
i
(
F
-
a
.
y2
)}),
e
.
right
.
css
({
left
:
i
(
a
.
x2
),
width
:
i
(
E
-
a
.
x2
)}),
e
.
left
.
css
({
width
:
i
(
a
.
x
)})}
function
j
(){
return
a
(
"
<div />
"
).
css
({
position
:
"
absolute
"
,
backgroundColor
:
d
.
shadeColor
||
d
.
bgColor
}).
appendTo
(
c
)}
function
k
(){
b
||
(
b
=!
0
,
c
.
insertBefore
(
D
),
g
(),
bb
.
setBgOpacity
(
1
,
0
,
1
),
H
.
hide
(),
l
(
d
.
shadeColor
||
d
.
bgColor
,
1
),
bb
.
isAwake
()?
n
(
d
.
bgOpacity
,
1
):
n
(
1
,
1
))}
function
l
(
a
,
b
){
bq
(
p
(),
a
,
b
)}
function
m
(){
b
&&
(
c
.
remove
(),
H
.
show
(),
b
=!
1
,
bb
.
isAwake
()?
bb
.
setBgOpacity
(
d
.
bgOpacity
,
1
,
1
):(
bb
.
setBgOpacity
(
1
,
1
,
1
),
bb
.
disableHandles
()),
bq
(
G
,
0
,
1
))}
function
n
(
a
,
e
){
b
&&
(
d
.
bgFade
&&!
e
?
c
.
animate
({
opacity
:
1
-
a
},{
queue
:
!
1
,
duration
:
d
.
fadeTime
}):
c
.
css
({
opacity
:
1
-
a
}))}
function
o
(){
d
.
shade
?
k
():
m
(),
bb
.
isAwake
()
&&
n
(
d
.
bgOpacity
)}
function
p
(){
return
c
.
children
()}
var
b
=!
1
,
c
=
a
(
"
<div />
"
).
css
({
position
:
"
absolute
"
,
zIndex
:
240
,
opacity
:
0
}),
e
=
{
top
:
j
(),
left
:
j
().
height
(
F
),
right
:
j
().
height
(
F
),
bottom
:
j
()};
return
{
update
:
g
,
updateRaw
:
h
,
getShades
:
p
,
setBgColor
:
l
,
enable
:
k
,
disable
:
m
,
resize
:
f
,
refresh
:
o
,
opacity
:
n
}}(),
bb
=
function
(){
function
k
(
b
){
var
c
=
a
(
"
<div />
"
).
css
({
position
:
"
absolute
"
,
opacity
:
d
.
borderOpacity
}).
addClass
(
j
(
b
));
return
I
.
append
(
c
),
c
}
function
l
(
b
,
c
){
var
d
=
a
(
"
<div />
"
).
mousedown
(
s
(
b
)).
css
({
cursor
:
b
+
"
-resize
"
,
position
:
"
absolute
"
,
zIndex
:
c
}).
addClass
(
"
ord-
"
+
b
);
return
Z
.
support
&&
d
.
bind
(
"
touchstart.jcrop
"
,
Z
.
createDragger
(
b
)),
J
.
append
(
d
),
d
}
function
m
(
a
){
var
b
=
d
.
handleSize
,
e
=
l
(
a
,
c
++
).
css
({
opacity
:
d
.
handleOpacity
}).
addClass
(
j
(
"
handle
"
));
return
b
&&
e
.
width
(
b
).
height
(
b
),
e
}
function
n
(
a
){
return
l
(
a
,
c
++
).
addClass
(
"
jcrop-dragbar
"
)}
function
o
(
a
){
var
b
;
for
(
b
=
0
;
b
<
a
.
length
;
b
++
)
g
[
a
[
b
]]
=
n
(
a
[
b
])}
function
p
(
a
){
var
b
,
c
;
for
(
c
=
0
;
c
<
a
.
length
;
c
++
){
switch
(
a
[
c
]){
case
"
n
"
:
b
=
"
hline
"
;
break
;
case
"
s
"
:
b
=
"
hline bottom
"
;
break
;
case
"
e
"
:
b
=
"
vline right
"
;
break
;
case
"
w
"
:
b
=
"
vline
"
}
e
[
a
[
c
]]
=
k
(
b
)}}
function
q
(
a
){
var
b
;
for
(
b
=
0
;
b
<
a
.
length
;
b
++
)
f
[
a
[
b
]]
=
m
(
a
[
b
])}
function
r
(
a
,
b
){
d
.
shade
||
H
.
css
({
top
:
i
(
-
b
),
left
:
i
(
-
a
)}),
K
.
css
({
top
:
i
(
b
),
left
:
i
(
a
)})}
function
t
(
a
,
b
){
K
.
width
(
Math
.
round
(
a
)).
height
(
Math
.
round
(
b
))}
function
v
(){
var
a
=
_
.
getFixed
();
_
.
setPressed
([
a
.
x
,
a
.
y
]),
_
.
setCurrent
([
a
.
x2
,
a
.
y2
]),
w
()}
function
w
(
a
){
if
(
b
)
return
x
(
a
)}
function
x
(
a
){
var
c
=
_
.
getFixed
();
t
(
c
.
w
,
c
.
h
),
r
(
c
.
x
,
c
.
y
),
d
.
shade
&&
ba
.
updateRaw
(
c
),
b
||
A
(),
a
?
d
.
onSelect
.
call
(
bs
,
u
(
c
)):
d
.
onChange
.
call
(
bs
,
u
(
c
))}
function
z
(
a
,
c
,
e
){
if
(
!
b
&&!
c
)
return
;
d
.
bgFade
&&!
e
?
D
.
animate
({
opacity
:
a
},{
queue
:
!
1
,
duration
:
d
.
fadeTime
}):
D
.
css
(
"
opacity
"
,
a
)}
function
A
(){
K
.
show
(),
d
.
shade
?
ba
.
opacity
(
O
):
z
(
O
,
!
0
),
b
=!
0
}
function
B
(){
F
(),
K
.
hide
(),
d
.
shade
?
ba
.
opacity
(
1
):
z
(
1
),
b
=!
1
,
d
.
onRelease
.
call
(
bs
)}
function
C
(){
h
&&
J
.
show
()}
function
E
(){
h
=!
0
;
if
(
d
.
allowResize
)
return
J
.
show
(),
!
0
}
function
F
(){
h
=!
1
,
J
.
hide
()}
function
G
(
a
){
a
?(
X
=!
0
,
F
()):(
X
=!
1
,
E
())}
function
L
(){
G
(
!
1
),
v
()}
var
b
,
c
=
370
,
e
=
{},
f
=
{},
g
=
{},
h
=!
1
;
d
.
dragEdges
&&
a
.
isArray
(
d
.
createDragbars
)
&&
o
(
d
.
createDragbars
),
a
.
isArray
(
d
.
createHandles
)
&&
q
(
d
.
createHandles
),
d
.
drawBorders
&&
a
.
isArray
(
d
.
createBorders
)
&&
p
(
d
.
createBorders
),
a
(
document
).
bind
(
"
touchstart.jcrop-ios
"
,
function
(
b
){
a
(
b
.
currentTarget
).
hasClass
(
"
jcrop-tracker
"
)
&&
b
.
stopPropagation
()});
var
M
=
y
().
mousedown
(
s
(
"
move
"
)).
css
({
cursor
:
"
move
"
,
position
:
"
absolute
"
,
zIndex
:
360
});
return
Z
.
support
&&
M
.
bind
(
"
touchstart.jcrop
"
,
Z
.
createDragger
(
"
move
"
)),
I
.
append
(
M
),
F
(),{
updateVisible
:
w
,
update
:
x
,
release
:
B
,
refresh
:
v
,
isAwake
:
function
(){
return
b
},
setCursor
:
function
(
a
){
M
.
css
(
"
cursor
"
,
a
)},
enableHandles
:
E
,
enableOnly
:
function
(){
h
=!
0
},
showHandles
:
C
,
disableHandles
:
F
,
animMode
:
G
,
setBgOpacity
:
z
,
done
:
L
}}(),
bc
=
function
(){
function
f
(
b
){
M
.
css
({
zIndex
:
450
}),
b
?
a
(
document
).
bind
(
"
touchmove.jcrop
"
,
k
).
bind
(
"
touchend.jcrop
"
,
l
):
e
&&
a
(
document
).
bind
(
"
mousemove.jcrop
"
,
h
).
bind
(
"
mouseup.jcrop
"
,
i
)}
function
g
(){
M
.
css
({
zIndex
:
290
}),
a
(
document
).
unbind
(
"
.jcrop
"
)}
function
h
(
a
){
return
b
(
m
(
a
)),
!
1
}
function
i
(
a
){
return
a
.
preventDefault
(),
a
.
stopPropagation
(),
W
&&
(
W
=!
1
,
c
(
m
(
a
)),
bb
.
isAwake
()
&&
d
.
onSelect
.
call
(
bs
,
u
(
_
.
getFixed
())),
g
(),
b
=
function
(){},
c
=
function
(){}),
!
1
}
function
j
(
a
,
d
,
e
){
return
W
=!
0
,
b
=
a
,
c
=
d
,
f
(
e
),
!
1
}
function
k
(
a
){
return
b
(
m
(
Z
.
cfilter
(
a
))),
!
1
}
function
l
(
a
){
return
i
(
Z
.
cfilter
(
a
))}
function
n
(
a
){
M
.
css
(
"
cursor
"
,
a
)}
var
b
=
function
(){},
c
=
function
(){},
e
=
d
.
trackDocument
;
return
e
||
M
.
mousemove
(
h
).
mouseup
(
i
).
mouseout
(
i
),
D
.
before
(
M
),{
activateHandlers
:
j
,
setCursor
:
n
}}(),
bd
=
function
(){
function
e
(){
d
.
keySupport
&&
(
b
.
show
(),
b
.
focus
())}
function
f
(
a
){
b
.
hide
()}
function
g
(
a
,
b
,
c
){
d
.
allowMove
&&
(
_
.
moveOffset
([
b
,
c
]),
bb
.
updateVisible
(
!
0
)),
a
.
preventDefault
(),
a
.
stopPropagation
()}
function
i
(
a
){
if
(
a
.
ctrlKey
||
a
.
metaKey
)
return
!
0
;
Y
=
a
.
shiftKey
?
!
0
:
!
1
;
var
b
=
Y
?
10
:
1
;
switch
(
a
.
keyCode
){
case
37
:
g
(
a
,
-
b
,
0
);
break
;
case
39
:
g
(
a
,
b
,
0
);
break
;
case
38
:
g
(
a
,
0
,
-
b
);
break
;
case
40
:
g
(
a
,
0
,
b
);
break
;
case
27
:
d
.
allowSelect
&&
bb
.
release
();
break
;
case
9
:
return
!
0
}
return
!
1
}
var
b
=
a
(
'
<input type="radio" />
'
).
css
({
position
:
"
fixed
"
,
left
:
"
-120px
"
,
width
:
"
12px
"
}).
addClass
(
"
jcrop-keymgr
"
),
c
=
a
(
"
<div />
"
).
css
({
position
:
"
absolute
"
,
overflow
:
"
hidden
"
}).
append
(
b
);
return
d
.
keySupport
&&
(
b
.
keydown
(
i
).
blur
(
f
),
h
||!
d
.
fixedSupport
?(
b
.
css
({
position
:
"
absolute
"
,
left
:
"
-20px
"
}),
c
.
append
(
b
).
insertBefore
(
D
)):
b
.
insertBefore
(
D
)),{
watchKeys
:
e
}}();
Z
.
support
&&
M
.
bind
(
"
touchstart.jcrop
"
,
Z
.
newSelection
),
J
.
hide
(),
br
(
!
0
);
var
bs
=
{
setImage
:
bp
,
animateTo
:
bf
,
setSelect
:
bg
,
setOptions
:
bk
,
tellSelect
:
bi
,
tellScaled
:
bj
,
setClass
:
be
,
disable
:
bl
,
enable
:
bm
,
cancel
:
bn
,
release
:
bb
.
release
,
destroy
:
bo
,
focus
:
bd
.
watchKeys
,
getBounds
:
function
(){
return
[
E
*
T
,
F
*
U
]},
getWidgetSize
:
function
(){
return
[
E
,
F
]},
getScaleFactor
:
function
(){
return
[
T
,
U
]},
getOptions
:
function
(){
return
d
},
ui
:{
holder
:
G
,
selection
:
K
}};
return
g
&&
G
.
bind
(
"
selectstart
"
,
function
(){
return
!
1
}),
A
.
data
(
"
Jcrop
"
,
bs
),
bs
},
a
.
fn
.
Jcrop
=
function
(
b
,
c
){
var
d
;
return
this
.
each
(
function
(){
if
(
a
(
this
).
data
(
"
Jcrop
"
)){
if
(
b
===
"
api
"
)
return
a
(
this
).
data
(
"
Jcrop
"
);
a
(
this
).
data
(
"
Jcrop
"
).
setOptions
(
b
)}
else
this
.
tagName
==
"
IMG
"
?
a
.
Jcrop
.
Loader
(
this
,
function
(){
a
(
this
).
css
({
display
:
"
block
"
,
visibility
:
"
hidden
"
}),
d
=
a
.
Jcrop
(
this
,
b
),
a
.
isFunction
(
c
)
&&
c
.
call
(
d
)}):(
a
(
this
).
css
({
display
:
"
block
"
,
visibility
:
"
hidden
"
}),
d
=
a
.
Jcrop
(
this
,
b
),
a
.
isFunction
(
c
)
&&
c
.
call
(
d
))}),
this
},
a
.
Jcrop
.
Loader
=
function
(
b
,
c
,
d
){
function
g
(){
f
.
complete
?(
e
.
unbind
(
"
.jcloader
"
),
a
.
isFunction
(
c
)
&&
c
.
call
(
f
)):
window
.
setTimeout
(
g
,
50
)}
var
e
=
a
(
b
),
f
=
e
[
0
];
e
.
bind
(
"
load.jcloader
"
,
g
).
bind
(
"
error.jcloader
"
,
function
(
b
){
e
.
unbind
(
"
.jcloader
"
),
a
.
isFunction
(
d
)
&&
d
.
call
(
f
)}),
f
.
complete
&&
a
.
isFunction
(
c
)
&&
(
e
.
unbind
(
"
.jcloader
"
),
c
.
call
(
f
))},
a
.
Jcrop
.
defaults
=
{
allowSelect
:
!
0
,
allowMove
:
!
0
,
allowResize
:
!
0
,
trackDocument
:
!
0
,
baseClass
:
"
jcrop
"
,
addClass
:
null
,
bgColor
:
"
black
"
,
bgOpacity
:.
6
,
bgFade
:
!
1
,
borderOpacity
:.
4
,
handleOpacity
:.
5
,
handleSize
:
null
,
aspectRatio
:
0
,
keySupport
:
!
0
,
createHandles
:[
"
n
"
,
"
s
"
,
"
e
"
,
"
w
"
,
"
nw
"
,
"
ne
"
,
"
se
"
,
"
sw
"
],
createDragbars
:[
"
n
"
,
"
s
"
,
"
e
"
,
"
w
"
],
createBorders
:[
"
n
"
,
"
s
"
,
"
e
"
,
"
w
"
],
drawBorders
:
!
0
,
dragEdges
:
!
0
,
fixedSupport
:
!
0
,
touchSupport
:
null
,
shade
:
null
,
boxWidth
:
0
,
boxHeight
:
0
,
boundary
:
2
,
fadeTime
:
400
,
animationDelay
:
20
,
swingSpeed
:
3
,
minSelect
:[
0
,
0
],
maxSize
:[
0
,
0
],
minSize
:[
0
,
0
],
onChange
:
function
(){},
onSelect
:
function
(){},
onDblClick
:
function
(){},
onRelease
:
function
(){}}})(
jQuery
);
\ No newline at end of file
wagtailvideos/static/wagtailvideos/js/vendor/jquery.fileupload-image.js
deleted
100644 → 0
View file @
517db8ee
/*
* jQuery File Upload Image Preview & Resize Plugin 1.7.2
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
/* jshint nomen:false */
/* global define, window, Blob */
(
function
(
factory
)
{
'
use strict
'
;
if
(
typeof
define
===
'
function
'
&&
define
.
amd
)
{
// Register as an anonymous AMD module:
define
([
'
jquery
'
,
'
load-image
'
,
'
load-image-meta
'
,
'
load-image-exif
'
,
'
load-image-ios
'
,
'
canvas-to-blob
'
,
'
./jquery.fileupload-process
'
],
factory
);
}
else
{
// Browser globals:
factory
(
window
.
jQuery
,
window
.
loadImage
);
}
}(
function
(
$
,
loadImage
)
{
'
use strict
'
;
// Prepend to the default processQueue:
$
.
blueimp
.
fileupload
.
prototype
.
options
.
processQueue
.
unshift
(
{
action
:
'
loadImageMetaData
'
,
disableImageHead
:
'
@
'
,
disableExif
:
'
@
'
,
disableExifThumbnail
:
'
@
'
,
disableExifSub
:
'
@
'
,
disableExifGps
:
'
@
'
,
disabled
:
'
@disableImageMetaDataLoad
'
},
{
action
:
'
loadImage
'
,
// Use the action as prefix for the "@" options:
prefix
:
true
,
fileTypes
:
'
@
'
,
maxFileSize
:
'
@
'
,
noRevoke
:
'
@
'
,
disabled
:
'
@disableImageLoad
'
},
{
action
:
'
resizeImage
'
,
// Use "image" as prefix for the "@" options:
prefix
:
'
image
'
,
maxWidth
:
'
@
'
,
maxHeight
:
'
@
'
,
minWidth
:
'
@
'
,
minHeight
:
'
@
'
,
crop
:
'
@
'
,
orientation
:
'
@
'
,
forceResize
:
'
@
'
,
disabled
:
'
@disableImageResize
'
},
{
action
:
'
saveImage
'
,
quality
:
'
@imageQuality
'
,
type
:
'
@imageType
'
,
disabled
:
'
@disableImageResize
'
},
{
action
:
'
saveImageMetaData
'
,
disabled
:
'
@disableImageMetaDataSave
'
},
{
action
:
'
resizeImage
'
,
// Use "preview" as prefix for the "@" options:
prefix
:
'
preview
'
,
maxWidth
:
'
@
'
,
maxHeight
:
'
@
'
,
minWidth
:
'
@
'
,
minHeight
:
'
@
'
,
crop
:
'
@
'
,
orientation
:
'
@
'
,
thumbnail
:
'
@
'
,
canvas
:
'
@
'
,
disabled
:
'
@disableImagePreview
'
},
{
action
:
'
setImage
'
,
name
:
'
@imagePreviewName
'
,
disabled
:
'
@disableImagePreview
'
},
{
action
:
'
deleteImageReferences
'
,
disabled
:
'
@disableImageReferencesDeletion
'
}
);
// The File Upload Resize plugin extends the fileupload widget
// with image resize functionality:
$
.
widget
(
'
blueimp.fileupload
'
,
$
.
blueimp
.
fileupload
,
{
options
:
{
// The regular expression for the types of images to load:
// matched against the file type:
loadImageFileTypes
:
/^image
\/(
gif|jpeg|png|svg
\+
xml
)
$/
,
// The maximum file size of images to load:
loadImageMaxFileSize
:
10000000
,
// 10MB
// The maximum width of resized images:
imageMaxWidth
:
1920
,
// The maximum height of resized images:
imageMaxHeight
:
1080
,
// Defines the image orientation (1-8) or takes the orientation
// value from Exif data if set to true:
imageOrientation
:
false
,
// Define if resized images should be cropped or only scaled:
imageCrop
:
false
,
// Disable the resize image functionality by default:
disableImageResize
:
true
,
// The maximum width of the preview images:
previewMaxWidth
:
80
,
// The maximum height of the preview images:
previewMaxHeight
:
80
,
// Defines the preview orientation (1-8) or takes the orientation
// value from Exif data if set to true:
previewOrientation
:
true
,
// Create the preview using the Exif data thumbnail:
previewThumbnail
:
true
,
// Define if preview images should be cropped or only scaled:
previewCrop
:
false
,
// Define if preview images should be resized as canvas elements:
previewCanvas
:
true
},
processActions
:
{
// Loads the image given via data.files and data.index
// as img element, if the browser supports the File API.
// Accepts the options fileTypes (regular expression)
// and maxFileSize (integer) to limit the files to load:
loadImage
:
function
(
data
,
options
)
{
if
(
options
.
disabled
)
{
return
data
;
}
var
that
=
this
,
file
=
data
.
files
[
data
.
index
],
dfd
=
$
.
Deferred
();
if
((
$
.
type
(
options
.
maxFileSize
)
===
'
number
'
&&
file
.
size
>
options
.
maxFileSize
)
||
(
options
.
fileTypes
&&
!
options
.
fileTypes
.
test
(
file
.
type
))
||
!
loadImage
(
file
,
function
(
img
)
{
if
(
img
.
src
)
{
data
.
img
=
img
;
}
dfd
.
resolveWith
(
that
,
[
data
]);
},
options
))
{
return
data
;
}
return
dfd
.
promise
();
},
// Resizes the image given as data.canvas or data.img
// and updates data.canvas or data.img with the resized image.
// Also stores the resized image as preview property.
// Accepts the options maxWidth, maxHeight, minWidth,
// minHeight, canvas and crop:
resizeImage
:
function
(
data
,
options
)
{
if
(
options
.
disabled
||
!
(
data
.
canvas
||
data
.
img
))
{
return
data
;
}
options
=
$
.
extend
({
canvas
:
true
},
options
);
var
that
=
this
,
dfd
=
$
.
Deferred
(),
img
=
(
options
.
canvas
&&
data
.
canvas
)
||
data
.
img
,
resolve
=
function
(
newImg
)
{
if
(
newImg
&&
(
newImg
.
width
!==
img
.
width
||
newImg
.
height
!==
img
.
height
||
options
.
forceResize
))
{
data
[
newImg
.
getContext
?
'
canvas
'
:
'
img
'
]
=
newImg
;
}
data
.
preview
=
newImg
;
dfd
.
resolveWith
(
that
,
[
data
]);
},
thumbnail
;
if
(
data
.
exif
)
{
if
(
options
.
orientation
===
true
)
{
options
.
orientation
=
data
.
exif
.
get
(
'
Orientation
'
);
}
if
(
options
.
thumbnail
)
{
thumbnail
=
data
.
exif
.
get
(
'
Thumbnail
'
);
if
(
thumbnail
)
{
loadImage
(
thumbnail
,
resolve
,
options
);
return
dfd
.
promise
();
}
}
// Prevent orienting the same image twice:
if
(
data
.
orientation
)
{
delete
options
.
orientation
;
}
else
{
data
.
orientation
=
options
.
orientation
;
}
}
if
(
img
)
{
resolve
(
loadImage
.
scale
(
img
,
options
));
return
dfd
.
promise
();
}
return
data
;
},
// Saves the processed image given as data.canvas
// inplace at data.index of data.files:
saveImage
:
function
(
data
,
options
)
{
if
(
!
data
.
canvas
||
options
.
disabled
)
{
return
data
;
}
var
that
=
this
,
file
=
data
.
files
[
data
.
index
],
dfd
=
$
.
Deferred
();
if
(
data
.
canvas
.
toBlob
)
{
data
.
canvas
.
toBlob
(
function
(
blob
)
{
if
(
!
blob
.
name
)
{
if
(
file
.
type
===
blob
.
type
)
{
blob
.
name
=
file
.
name
;
}
else
if
(
file
.
name
)
{
blob
.
name
=
file
.
name
.
replace
(
/
\.
.+$/
,
'
.
'
+
blob
.
type
.
substr
(
6
)
);
}
}
// Don't restore invalid meta data:
if
(
file
.
type
!==
blob
.
type
)
{
delete
data
.
imageHead
;
}
// Store the created blob at the position
// of the original file in the files list:
data
.
files
[
data
.
index
]
=
blob
;
dfd
.
resolveWith
(
that
,
[
data
]);
},
options
.
type
||
file
.
type
,
options
.
quality
);
}
else
{
return
data
;
}
return
dfd
.
promise
();
},
loadImageMetaData
:
function
(
data
,
options
)
{
if
(
options
.
disabled
)
{
return
data
;
}
var
that
=
this
,
dfd
=
$
.
Deferred
();
loadImage
.
parseMetaData
(
data
.
files
[
data
.
index
],
function
(
result
)
{
$
.
extend
(
data
,
result
);
dfd
.
resolveWith
(
that
,
[
data
]);
},
options
);
return
dfd
.
promise
();
},
saveImageMetaData
:
function
(
data
,
options
)
{
if
(
!
(
data
.
imageHead
&&
data
.
canvas
&&
data
.
canvas
.
toBlob
&&
!
options
.
disabled
))
{
return
data
;
}
var
file
=
data
.
files
[
data
.
index
],
blob
=
new
Blob
([
data
.
imageHead
,
// Resized images always have a head size of 20 bytes,
// including the JPEG marker and a minimal JFIF header:
this
.
_blobSlice
.
call
(
file
,
20
)
],
{
type
:
file
.
type
});
blob
.
name
=
file
.
name
;
data
.
files
[
data
.
index
]
=
blob
;
return
data
;
},
// Sets the resized version of the image as a property of the
// file object, must be called after "saveImage":
setImage
:
function
(
data
,
options
)
{
if
(
data
.
preview
&&
!
options
.
disabled
)
{
data
.
files
[
data
.
index
][
options
.
name
||
'
preview
'
]
=
data
.
preview
;
}
return
data
;
},
deleteImageReferences
:
function
(
data
,
options
)
{
if
(
!
options
.
disabled
)
{
delete
data
.
img
;
delete
data
.
canvas
;
delete
data
.
preview
;
delete
data
.
imageHead
;
}
return
data
;
}
}
});
}));
\ No newline at end of file
wagtailvideos/static/wagtailvideos/js/vendor/jquery.fileupload-validate.js
deleted
100644 → 0
View file @
517db8ee
/*
* jQuery File Upload Validation Plugin 1.1.2
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
/* global define, window */
(
function
(
factory
)
{
'
use strict
'
;
if
(
typeof
define
===
'
function
'
&&
define
.
amd
)
{
// Register as an anonymous AMD module:
define
([
'
jquery
'
,
'
./jquery.fileupload-process
'
],
factory
);
}
else
{
// Browser globals:
factory
(
window
.
jQuery
);
}
}(
function
(
$
)
{
'
use strict
'
;
// Append to the default processQueue:
$
.
blueimp
.
fileupload
.
prototype
.
options
.
processQueue
.
push
(
{
action
:
'
validate
'
,
// Always trigger this action,
// even if the previous action was rejected:
always
:
true
,
// Options taken from the global options map:
acceptFileTypes
:
'
@
'
,
maxFileSize
:
'
@
'
,
minFileSize
:
'
@
'
,
maxNumberOfFiles
:
'
@
'
,
disabled
:
'
@disableValidation
'
}
);
// The File Upload Validation plugin extends the fileupload widget
// with file validation functionality:
$
.
widget
(
'
blueimp.fileupload
'
,
$
.
blueimp
.
fileupload
,
{
options
:
{
/*
// The regular expression for allowed file types, matches
// against either file type or file name:
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
// The maximum allowed file size in bytes:
maxFileSize: 10000000, // 10 MB
// The minimum allowed file size in bytes:
minFileSize: undefined, // No minimal file size
// The limit of files to be uploaded:
maxNumberOfFiles: 10,
*/
// Function returning the current number of files,
// has to be overriden for maxNumberOfFiles validation:
getNumberOfFiles
:
$
.
noop
,
// Error and info messages:
messages
:
{
maxNumberOfFiles
:
'
Maximum number of files exceeded
'
,
acceptFileTypes
:
'
File type not allowed
'
,
maxFileSize
:
'
File is too large
'
,
minFileSize
:
'
File is too small
'
}
},
processActions
:
{
validate
:
function
(
data
,
options
)
{
if
(
options
.
disabled
)
{
return
data
;
}
var
dfd
=
$
.
Deferred
(),
settings
=
this
.
options
,
file
=
data
.
files
[
data
.
index
],
fileSize
;
if
(
options
.
minFileSize
||
options
.
maxFileSize
)
{
fileSize
=
file
.
size
;
}
if
(
$
.
type
(
options
.
maxNumberOfFiles
)
===
'
number
'
&&
(
settings
.
getNumberOfFiles
()
||
0
)
+
data
.
files
.
length
>
options
.
maxNumberOfFiles
)
{
file
.
error
=
settings
.
i18n
(
'
maxNumberOfFiles
'
);
}
else
if
(
options
.
acceptFileTypes
&&
!
(
options
.
acceptFileTypes
.
test
(
file
.
type
)
||
options
.
acceptFileTypes
.
test
(
file
.
name
)))
{
file
.
error
=
settings
.
i18n
(
'
acceptFileTypes
'
);
}
else
if
(
fileSize
>
options
.
maxFileSize
)
{
file
.
error
=
settings
.
i18n
(
'
maxFileSize
'
);
}
else
if
(
$
.
type
(
fileSize
)
===
'
number
'
&&
fileSize
<
options
.
minFileSize
)
{
file
.
error
=
settings
.
i18n
(
'
minFileSize
'
);
}
else
{
delete
file
.
error
;
}
if
(
file
.
error
||
data
.
files
.
error
)
{
data
.
files
.
error
=
true
;
dfd
.
rejectWith
(
this
,
[
data
]);
}
else
{
dfd
.
resolveWith
(
this
,
[
data
]);
}
return
dfd
.
promise
();
}
}
});
}));
wagtailvideos/static/wagtailvideos/js/vendor/load-image.min.js
deleted
100644 → 0
View file @
517db8ee
!
function
(
a
){
"
use strict
"
;
var
b
=
function
(
a
,
c
,
d
){
var
e
,
f
,
g
=
document
.
createElement
(
"
img
"
);
if
(
g
.
onerror
=
c
,
g
.
onload
=
function
(){
!
f
||
d
&&
d
.
noRevoke
||
b
.
revokeObjectURL
(
f
),
c
&&
c
(
b
.
scale
(
g
,
d
))},
b
.
isInstanceOf
(
"
Blob
"
,
a
)
||
b
.
isInstanceOf
(
"
File
"
,
a
))
e
=
f
=
b
.
createObjectURL
(
a
),
g
.
_type
=
a
.
type
;
else
{
if
(
"
string
"
!=
typeof
a
)
return
!
1
;
e
=
a
,
d
&&
d
.
crossOrigin
&&
(
g
.
crossOrigin
=
d
.
crossOrigin
)}
return
e
?(
g
.
src
=
e
,
g
):
b
.
readFile
(
a
,
function
(
a
){
var
b
=
a
.
target
;
b
&&
b
.
result
?
g
.
src
=
b
.
result
:
c
&&
c
(
a
)})},
c
=
window
.
createObjectURL
&&
window
||
window
.
URL
&&
URL
.
revokeObjectURL
&&
URL
||
window
.
webkitURL
&&
webkitURL
;
b
.
isInstanceOf
=
function
(
a
,
b
){
return
Object
.
prototype
.
toString
.
call
(
b
)
===
"
[object
"
+
a
+
"
]
"
},
b
.
transformCoordinates
=
function
(){},
b
.
getTransformedOptions
=
function
(
a
){
return
a
},
b
.
renderImageToCanvas
=
function
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
,
j
){
return
a
.
getContext
(
"
2d
"
).
drawImage
(
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
,
j
),
a
},
b
.
hasCanvasOption
=
function
(
a
){
return
a
.
canvas
||
a
.
crop
},
b
.
scale
=
function
(
a
,
c
){
c
=
c
||
{};
var
d
,
e
,
f
,
g
,
h
,
i
,
j
,
k
,
l
,
m
=
document
.
createElement
(
"
canvas
"
),
n
=
a
.
getContext
||
b
.
hasCanvasOption
(
c
)
&&
m
.
getContext
,
o
=
a
.
naturalWidth
||
a
.
width
,
p
=
a
.
naturalHeight
||
a
.
height
,
q
=
o
,
r
=
p
,
s
=
function
(){
var
a
=
Math
.
max
((
f
||
q
)
/
q
,(
g
||
r
)
/
r
);
a
>
1
&&
(
q
=
Math
.
ceil
(
q
*
a
),
r
=
Math
.
ceil
(
r
*
a
))},
t
=
function
(){
var
a
=
Math
.
min
((
d
||
q
)
/
q
,(
e
||
r
)
/
r
);
1
>
a
&&
(
q
=
Math
.
ceil
(
q
*
a
),
r
=
Math
.
ceil
(
r
*
a
))};
return
n
&&
(
c
=
b
.
getTransformedOptions
(
c
),
j
=
c
.
left
||
0
,
k
=
c
.
top
||
0
,
c
.
sourceWidth
?(
h
=
c
.
sourceWidth
,
void
0
!==
c
.
right
&&
void
0
===
c
.
left
&&
(
j
=
o
-
h
-
c
.
right
)):
h
=
o
-
j
-
(
c
.
right
||
0
),
c
.
sourceHeight
?(
i
=
c
.
sourceHeight
,
void
0
!==
c
.
bottom
&&
void
0
===
c
.
top
&&
(
k
=
p
-
i
-
c
.
bottom
)):
i
=
p
-
k
-
(
c
.
bottom
||
0
),
q
=
h
,
r
=
i
),
d
=
c
.
maxWidth
,
e
=
c
.
maxHeight
,
f
=
c
.
minWidth
,
g
=
c
.
minHeight
,
n
&&
d
&&
e
&&
c
.
crop
?(
q
=
d
,
r
=
e
,
l
=
h
/
i
-
d
/
e
,
0
>
l
?(
i
=
e
*
h
/
d
,
void
0
===
c
.
top
&&
void
0
===
c
.
bottom
&&
(
k
=
(
p
-
i
)
/
2
)):
l
>
0
&&
(
h
=
d
*
i
/
e
,
void
0
===
c
.
left
&&
void
0
===
c
.
right
&&
(
j
=
(
o
-
h
)
/
2
))):((
c
.
contain
||
c
.
cover
)
&&
(
f
=
d
=
d
||
f
,
g
=
e
=
e
||
g
),
c
.
cover
?(
t
(),
s
()):(
s
(),
t
())),
n
?(
m
.
width
=
q
,
m
.
height
=
r
,
b
.
transformCoordinates
(
m
,
c
),
b
.
renderImageToCanvas
(
m
,
a
,
j
,
k
,
h
,
i
,
0
,
0
,
q
,
r
)):(
a
.
width
=
q
,
a
.
height
=
r
,
a
)},
b
.
createObjectURL
=
function
(
a
){
return
c
?
c
.
createObjectURL
(
a
):
!
1
},
b
.
revokeObjectURL
=
function
(
a
){
return
c
?
c
.
revokeObjectURL
(
a
):
!
1
},
b
.
readFile
=
function
(
a
,
b
,
c
){
if
(
window
.
FileReader
){
var
d
=
new
FileReader
;
if
(
d
.
onload
=
d
.
onerror
=
b
,
c
=
c
||
"
readAsDataURL
"
,
d
[
c
])
return
d
[
c
](
a
),
d
}
return
!
1
},
"
function
"
==
typeof
define
&&
define
.
amd
?
define
(
function
(){
return
b
}):
a
.
loadImage
=
b
}(
this
),
function
(
a
){
"
use strict
"
;
"
function
"
==
typeof
define
&&
define
.
amd
?
define
([
"
load-image
"
],
a
):
a
(
window
.
loadImage
)}(
function
(
a
){
"
use strict
"
;
if
(
window
.
navigator
&&
window
.
navigator
.
platform
&&
/iP
(
hone|od|ad
)
/
.
test
(
window
.
navigator
.
platform
)){
var
b
=
a
.
renderImageToCanvas
;
a
.
detectSubsampling
=
function
(
a
){
var
b
,
c
;
return
a
.
width
*
a
.
height
>
1048576
?(
b
=
document
.
createElement
(
"
canvas
"
),
b
.
width
=
b
.
height
=
1
,
c
=
b
.
getContext
(
"
2d
"
),
c
.
drawImage
(
a
,
-
a
.
width
+
1
,
0
),
0
===
c
.
getImageData
(
0
,
0
,
1
,
1
).
data
[
3
]):
!
1
},
a
.
detectVerticalSquash
=
function
(
a
,
b
){
var
c
,
d
,
e
,
f
,
g
,
h
=
a
.
naturalHeight
||
a
.
height
,
i
=
document
.
createElement
(
"
canvas
"
),
j
=
i
.
getContext
(
"
2d
"
);
for
(
b
&&
(
h
/=
2
),
i
.
width
=
1
,
i
.
height
=
h
,
j
.
drawImage
(
a
,
0
,
0
),
c
=
j
.
getImageData
(
0
,
0
,
1
,
h
).
data
,
d
=
0
,
e
=
h
,
f
=
h
;
f
>
d
;)
g
=
c
[
4
*
(
f
-
1
)
+
3
],
0
===
g
?
e
=
f
:
d
=
f
,
f
=
e
+
d
>>
1
;
return
f
/
h
||
1
},
a
.
renderImageToCanvas
=
function
(
c
,
d
,
e
,
f
,
g
,
h
,
i
,
j
,
k
,
l
){
if
(
"
image/jpeg
"
===
d
.
_type
){
var
m
,
n
,
o
,
p
,
q
=
c
.
getContext
(
"
2d
"
),
r
=
document
.
createElement
(
"
canvas
"
),
s
=
1024
,
t
=
r
.
getContext
(
"
2d
"
);
if
(
r
.
width
=
s
,
r
.
height
=
s
,
q
.
save
(),
m
=
a
.
detectSubsampling
(
d
),
m
&&
(
e
/=
2
,
f
/=
2
,
g
/=
2
,
h
/=
2
),
n
=
a
.
detectVerticalSquash
(
d
,
m
),
m
||
1
!==
n
){
for
(
f
*=
n
,
k
=
Math
.
ceil
(
s
*
k
/
g
),
l
=
Math
.
ceil
(
s
*
l
/
h
/
n
),
j
=
0
,
p
=
0
;
h
>
p
;){
for
(
i
=
0
,
o
=
0
;
g
>
o
;)
t
.
clearRect
(
0
,
0
,
s
,
s
),
t
.
drawImage
(
d
,
e
,
f
,
g
,
h
,
-
o
,
-
p
,
g
,
h
),
q
.
drawImage
(
r
,
0
,
0
,
s
,
s
,
i
,
j
,
k
,
l
),
o
+=
s
,
i
+=
k
;
p
+=
s
,
j
+=
l
}
return
q
.
restore
(),
c
}}
return
b
(
c
,
d
,
e
,
f
,
g
,
h
,
i
,
j
,
k
,
l
)}}}),
function
(
a
){
"
use strict
"
;
"
function
"
==
typeof
define
&&
define
.
amd
?
define
([
"
load-image
"
],
a
):
a
(
window
.
loadImage
)}(
function
(
a
){
"
use strict
"
;
var
b
=
a
.
hasCanvasOption
;
a
.
hasCanvasOption
=
function
(
a
){
return
b
(
a
)
||
a
.
orientation
},
a
.
transformCoordinates
=
function
(
a
,
b
){
var
c
=
a
.
getContext
(
"
2d
"
),
d
=
a
.
width
,
e
=
a
.
height
,
f
=
b
.
orientation
;
if
(
f
)
switch
(
f
>
4
&&
(
a
.
width
=
e
,
a
.
height
=
d
),
f
){
case
2
:
c
.
translate
(
d
,
0
),
c
.
scale
(
-
1
,
1
);
break
;
case
3
:
c
.
translate
(
d
,
e
),
c
.
rotate
(
Math
.
PI
);
break
;
case
4
:
c
.
translate
(
0
,
e
),
c
.
scale
(
1
,
-
1
);
break
;
case
5
:
c
.
rotate
(.
5
*
Math
.
PI
),
c
.
scale
(
1
,
-
1
);
break
;
case
6
:
c
.
rotate
(.
5
*
Math
.
PI
),
c
.
translate
(
0
,
-
e
);
break
;
case
7
:
c
.
rotate
(.
5
*
Math
.
PI
),
c
.
translate
(
d
,
-
e
),
c
.
scale
(
-
1
,
1
);
break
;
case
8
:
c
.
rotate
(
-
.
5
*
Math
.
PI
),
c
.
translate
(
-
d
,
0
)}},
a
.
getTransformedOptions
=
function
(
a
){
if
(
!
a
.
orientation
||
1
===
a
.
orientation
)
return
a
;
var
b
,
c
=
{};
for
(
b
in
a
)
a
.
hasOwnProperty
(
b
)
&&
(
c
[
b
]
=
a
[
b
]);
switch
(
a
.
orientation
){
case
2
:
c
.
left
=
a
.
right
,
c
.
right
=
a
.
left
;
break
;
case
3
:
c
.
left
=
a
.
right
,
c
.
top
=
a
.
bottom
,
c
.
right
=
a
.
left
,
c
.
bottom
=
a
.
top
;
break
;
case
4
:
c
.
top
=
a
.
bottom
,
c
.
bottom
=
a
.
top
;
break
;
case
5
:
c
.
left
=
a
.
top
,
c
.
top
=
a
.
left
,
c
.
right
=
a
.
bottom
,
c
.
bottom
=
a
.
right
;
break
;
case
6
:
c
.
left
=
a
.
top
,
c
.
top
=
a
.
right
,
c
.
right
=
a
.
bottom
,
c
.
bottom
=
a
.
left
;
break
;
case
7
:
c
.
left
=
a
.
bottom
,
c
.
top
=
a
.
right
,
c
.
right
=
a
.
top
,
c
.
bottom
=
a
.
left
;
break
;
case
8
:
c
.
left
=
a
.
bottom
,
c
.
top
=
a
.
left
,
c
.
right
=
a
.
top
,
c
.
bottom
=
a
.
right
}
return
a
.
orientation
>
4
&&
(
c
.
maxWidth
=
a
.
maxHeight
,
c
.
maxHeight
=
a
.
maxWidth
,
c
.
minWidth
=
a
.
minHeight
,
c
.
minHeight
=
a
.
minWidth
,
c
.
sourceWidth
=
a
.
sourceHeight
,
c
.
sourceHeight
=
a
.
sourceWidth
),
c
}}),
function
(
a
){
"
use strict
"
;
"
function
"
==
typeof
define
&&
define
.
amd
?
define
([
"
load-image
"
],
a
):
a
(
window
.
loadImage
)}(
function
(
a
){
"
use strict
"
;
var
b
=
window
.
Blob
&&
(
Blob
.
prototype
.
slice
||
Blob
.
prototype
.
webkitSlice
||
Blob
.
prototype
.
mozSlice
);
a
.
blobSlice
=
b
&&
function
(){
var
a
=
this
.
slice
||
this
.
webkitSlice
||
this
.
mozSlice
;
return
a
.
apply
(
this
,
arguments
)},
a
.
metaDataParsers
=
{
jpeg
:{
65505
:[]}},
a
.
parseMetaData
=
function
(
b
,
c
,
d
){
d
=
d
||
{};
var
e
=
this
,
f
=
d
.
maxMetaDataSize
||
262144
,
g
=
{},
h
=!
(
window
.
DataView
&&
b
&&
b
.
size
>=
12
&&
"
image/jpeg
"
===
b
.
type
&&
a
.
blobSlice
);(
h
||!
a
.
readFile
(
a
.
blobSlice
.
call
(
b
,
0
,
f
),
function
(
b
){
if
(
b
.
target
.
error
)
return
console
.
log
(
b
.
target
.
error
),
c
(
g
),
void
0
;
var
f
,
h
,
i
,
j
,
k
=
b
.
target
.
result
,
l
=
new
DataView
(
k
),
m
=
2
,
n
=
l
.
byteLength
-
4
,
o
=
m
;
if
(
65496
===
l
.
getUint16
(
0
)){
for
(;
n
>
m
&&
(
f
=
l
.
getUint16
(
m
),
f
>=
65504
&&
65519
>=
f
||
65534
===
f
);){
if
(
h
=
l
.
getUint16
(
m
+
2
)
+
2
,
m
+
h
>
l
.
byteLength
){
console
.
log
(
"
Invalid meta data: Invalid segment size.
"
);
break
}
if
(
i
=
a
.
metaDataParsers
.
jpeg
[
f
])
for
(
j
=
0
;
j
<
i
.
length
;
j
+=
1
)
i
[
j
].
call
(
e
,
l
,
m
,
h
,
g
,
d
);
m
+=
h
,
o
=
m
}
!
d
.
disableImageHead
&&
o
>
6
&&
(
g
.
imageHead
=
k
.
slice
?
k
.
slice
(
0
,
o
):
new
Uint8Array
(
k
).
subarray
(
0
,
o
))}
else
console
.
log
(
"
Invalid JPEG file: Missing JPEG marker.
"
);
c
(
g
)},
"
readAsArrayBuffer
"
))
&&
c
(
g
)}}),
function
(
a
){
"
use strict
"
;
"
function
"
==
typeof
define
&&
define
.
amd
?
define
([
"
load-image
"
,
"
load-image-meta
"
],
a
):
a
(
window
.
loadImage
)}(
function
(
a
){
"
use strict
"
;
a
.
ExifMap
=
function
(){
return
this
},
a
.
ExifMap
.
prototype
.
map
=
{
Orientation
:
274
},
a
.
ExifMap
.
prototype
.
get
=
function
(
a
){
return
this
[
a
]
||
this
[
this
.
map
[
a
]]},
a
.
getExifThumbnail
=
function
(
a
,
b
,
c
){
var
d
,
e
,
f
;
if
(
!
c
||
b
+
c
>
a
.
byteLength
)
return
console
.
log
(
"
Invalid Exif data: Invalid thumbnail data.
"
),
void
0
;
for
(
d
=
[],
e
=
0
;
c
>
e
;
e
+=
1
)
f
=
a
.
getUint8
(
b
+
e
),
d
.
push
((
16
>
f
?
"
0
"
:
""
)
+
f
.
toString
(
16
));
return
"
data:image/jpeg,%
"
+
d
.
join
(
"
%
"
)},
a
.
exifTagTypes
=
{
1
:{
getValue
:
function
(
a
,
b
){
return
a
.
getUint8
(
b
)},
size
:
1
},
2
:{
getValue
:
function
(
a
,
b
){
return
String
.
fromCharCode
(
a
.
getUint8
(
b
))},
size
:
1
,
ascii
:
!
0
},
3
:{
getValue
:
function
(
a
,
b
,
c
){
return
a
.
getUint16
(
b
,
c
)},
size
:
2
},
4
:{
getValue
:
function
(
a
,
b
,
c
){
return
a
.
getUint32
(
b
,
c
)},
size
:
4
},
5
:{
getValue
:
function
(
a
,
b
,
c
){
return
a
.
getUint32
(
b
,
c
)
/
a
.
getUint32
(
b
+
4
,
c
)},
size
:
8
},
9
:{
getValue
:
function
(
a
,
b
,
c
){
return
a
.
getInt32
(
b
,
c
)},
size
:
4
},
10
:{
getValue
:
function
(
a
,
b
,
c
){
return
a
.
getInt32
(
b
,
c
)
/
a
.
getInt32
(
b
+
4
,
c
)},
size
:
8
}},
a
.
exifTagTypes
[
7
]
=
a
.
exifTagTypes
[
1
],
a
.
getExifValue
=
function
(
b
,
c
,
d
,
e
,
f
,
g
){
var
h
,
i
,
j
,
k
,
l
,
m
,
n
=
a
.
exifTagTypes
[
e
];
if
(
!
n
)
return
console
.
log
(
"
Invalid Exif data: Invalid tag type.
"
),
void
0
;
if
(
h
=
n
.
size
*
f
,
i
=
h
>
4
?
c
+
b
.
getUint32
(
d
+
8
,
g
):
d
+
8
,
i
+
h
>
b
.
byteLength
)
return
console
.
log
(
"
Invalid Exif data: Invalid data offset.
"
),
void
0
;
if
(
1
===
f
)
return
n
.
getValue
(
b
,
i
,
g
);
for
(
j
=
[],
k
=
0
;
f
>
k
;
k
+=
1
)
j
[
k
]
=
n
.
getValue
(
b
,
i
+
k
*
n
.
size
,
g
);
if
(
n
.
ascii
){
for
(
l
=
""
,
k
=
0
;
k
<
j
.
length
&&
(
m
=
j
[
k
],
"
\
x00
"
!==
m
);
k
+=
1
)
l
+=
m
;
return
l
}
return
j
},
a
.
parseExifTag
=
function
(
b
,
c
,
d
,
e
,
f
){
var
g
=
b
.
getUint16
(
d
,
e
);
f
.
exif
[
g
]
=
a
.
getExifValue
(
b
,
c
,
d
,
b
.
getUint16
(
d
+
2
,
e
),
b
.
getUint32
(
d
+
4
,
e
),
e
)},
a
.
parseExifTags
=
function
(
a
,
b
,
c
,
d
,
e
){
var
f
,
g
,
h
;
if
(
c
+
6
>
a
.
byteLength
)
return
console
.
log
(
"
Invalid Exif data: Invalid directory offset.
"
),
void
0
;
if
(
f
=
a
.
getUint16
(
c
,
d
),
g
=
c
+
2
+
12
*
f
,
g
+
4
>
a
.
byteLength
)
return
console
.
log
(
"
Invalid Exif data: Invalid directory size.
"
),
void
0
;
for
(
h
=
0
;
f
>
h
;
h
+=
1
)
this
.
parseExifTag
(
a
,
b
,
c
+
2
+
12
*
h
,
d
,
e
);
return
a
.
getUint32
(
g
,
d
)},
a
.
parseExifData
=
function
(
b
,
c
,
d
,
e
,
f
){
if
(
!
f
.
disableExif
){
var
g
,
h
,
i
,
j
=
c
+
10
;
if
(
1165519206
===
b
.
getUint32
(
c
+
4
)){
if
(
j
+
8
>
b
.
byteLength
)
return
console
.
log
(
"
Invalid Exif data: Invalid segment size.
"
),
void
0
;
if
(
0
!==
b
.
getUint16
(
c
+
8
))
return
console
.
log
(
"
Invalid Exif data: Missing byte alignment offset.
"
),
void
0
;
switch
(
b
.
getUint16
(
j
)){
case
18761
:
g
=!
0
;
break
;
case
19789
:
g
=!
1
;
break
;
default
:
return
console
.
log
(
"
Invalid Exif data: Invalid byte alignment marker.
"
),
void
0
}
if
(
42
!==
b
.
getUint16
(
j
+
2
,
g
))
return
console
.
log
(
"
Invalid Exif data: Missing TIFF marker.
"
),
void
0
;
h
=
b
.
getUint32
(
j
+
4
,
g
),
e
.
exif
=
new
a
.
ExifMap
,
h
=
a
.
parseExifTags
(
b
,
j
,
j
+
h
,
g
,
e
),
h
&&!
f
.
disableExifThumbnail
&&
(
i
=
{
exif
:{}},
h
=
a
.
parseExifTags
(
b
,
j
,
j
+
h
,
g
,
i
),
i
.
exif
[
513
]
&&
(
e
.
exif
.
Thumbnail
=
a
.
getExifThumbnail
(
b
,
j
+
i
.
exif
[
513
],
i
.
exif
[
514
]))),
e
.
exif
[
34665
]
&&!
f
.
disableExifSub
&&
a
.
parseExifTags
(
b
,
j
,
j
+
e
.
exif
[
34665
],
g
,
e
),
e
.
exif
[
34853
]
&&!
f
.
disableExifGps
&&
a
.
parseExifTags
(
b
,
j
,
j
+
e
.
exif
[
34853
],
g
,
e
)}}},
a
.
metaDataParsers
.
jpeg
[
65505
].
push
(
a
.
parseExifData
)}),
function
(
a
){
"
use strict
"
;
"
function
"
==
typeof
define
&&
define
.
amd
?
define
([
"
load-image
"
,
"
load-image-exif
"
],
a
):
a
(
window
.
loadImage
)}(
function
(
a
){
"
use strict
"
;
a
.
ExifMap
.
prototype
.
tags
=
{
256
:
"
ImageWidth
"
,
257
:
"
ImageHeight
"
,
34665
:
"
ExifIFDPointer
"
,
34853
:
"
GPSInfoIFDPointer
"
,
40965
:
"
InteroperabilityIFDPointer
"
,
258
:
"
BitsPerSample
"
,
259
:
"
Compression
"
,
262
:
"
PhotometricInterpretation
"
,
274
:
"
Orientation
"
,
277
:
"
SamplesPerPixel
"
,
284
:
"
PlanarConfiguration
"
,
530
:
"
YCbCrSubSampling
"
,
531
:
"
YCbCrPositioning
"
,
282
:
"
XResolution
"
,
283
:
"
YResolution
"
,
296
:
"
ResolutionUnit
"
,
273
:
"
StripOffsets
"
,
278
:
"
RowsPerStrip
"
,
279
:
"
StripByteCounts
"
,
513
:
"
JPEGInterchangeFormat
"
,
514
:
"
JPEGInterchangeFormatLength
"
,
301
:
"
TransferFunction
"
,
318
:
"
WhitePoint
"
,
319
:
"
PrimaryChromaticities
"
,
529
:
"
YCbCrCoefficients
"
,
532
:
"
ReferenceBlackWhite
"
,
306
:
"
DateTime
"
,
270
:
"
ImageDescription
"
,
271
:
"
Make
"
,
272
:
"
Model
"
,
305
:
"
Software
"
,
315
:
"
Artist
"
,
33432
:
"
Copyright
"
,
36864
:
"
ExifVersion
"
,
40960
:
"
FlashpixVersion
"
,
40961
:
"
ColorSpace
"
,
40962
:
"
PixelXDimension
"
,
40963
:
"
PixelYDimension
"
,
42240
:
"
Gamma
"
,
37121
:
"
ComponentsConfiguration
"
,
37122
:
"
CompressedBitsPerPixel
"
,
37500
:
"
MakerNote
"
,
37510
:
"
UserComment
"
,
40964
:
"
RelatedSoundFile
"
,
36867
:
"
DateTimeOriginal
"
,
36868
:
"
DateTimeDigitized
"
,
37520
:
"
SubSecTime
"
,
37521
:
"
SubSecTimeOriginal
"
,
37522
:
"
SubSecTimeDigitized
"
,
33434
:
"
ExposureTime
"
,
33437
:
"
FNumber
"
,
34850
:
"
ExposureProgram
"
,
34852
:
"
SpectralSensitivity
"
,
34855
:
"
PhotographicSensitivity
"
,
34856
:
"
OECF
"
,
34864
:
"
SensitivityType
"
,
34865
:
"
StandardOutputSensitivity
"
,
34866
:
"
RecommendedExposureIndex
"
,
34867
:
"
ISOSpeed
"
,
34868
:
"
ISOSpeedLatitudeyyy
"
,
34869
:
"
ISOSpeedLatitudezzz
"
,
37377
:
"
ShutterSpeedValue
"
,
37378
:
"
ApertureValue
"
,
37379
:
"
BrightnessValue
"
,
37380
:
"
ExposureBias
"
,
37381
:
"
MaxApertureValue
"
,
37382
:
"
SubjectDistance
"
,
37383
:
"
MeteringMode
"
,
37384
:
"
LightSource
"
,
37385
:
"
Flash
"
,
37396
:
"
SubjectArea
"
,
37386
:
"
FocalLength
"
,
41483
:
"
FlashEnergy
"
,
41484
:
"
SpatialFrequencyResponse
"
,
41486
:
"
FocalPlaneXResolution
"
,
41487
:
"
FocalPlaneYResolution
"
,
41488
:
"
FocalPlaneResolutionUnit
"
,
41492
:
"
SubjectLocation
"
,
41493
:
"
ExposureIndex
"
,
41495
:
"
SensingMethod
"
,
41728
:
"
FileSource
"
,
41729
:
"
SceneType
"
,
41730
:
"
CFAPattern
"
,
41985
:
"
CustomRendered
"
,
41986
:
"
ExposureMode
"
,
41987
:
"
WhiteBalance
"
,
41988
:
"
DigitalZoomRatio
"
,
41989
:
"
FocalLengthIn35mmFilm
"
,
41990
:
"
SceneCaptureType
"
,
41991
:
"
GainControl
"
,
41992
:
"
Contrast
"
,
41993
:
"
Saturation
"
,
41994
:
"
Sharpness
"
,
41995
:
"
DeviceSettingDescription
"
,
41996
:
"
SubjectDistanceRange
"
,
42016
:
"
ImageUniqueID
"
,
42032
:
"
CameraOwnerName
"
,
42033
:
"
BodySerialNumber
"
,
42034
:
"
LensSpecification
"
,
42035
:
"
LensMake
"
,
42036
:
"
LensModel
"
,
42037
:
"
LensSerialNumber
"
,
0
:
"
GPSVersionID
"
,
1
:
"
GPSLatitudeRef
"
,
2
:
"
GPSLatitude
"
,
3
:
"
GPSLongitudeRef
"
,
4
:
"
GPSLongitude
"
,
5
:
"
GPSAltitudeRef
"
,
6
:
"
GPSAltitude
"
,
7
:
"
GPSTimeStamp
"
,
8
:
"
GPSSatellites
"
,
9
:
"
GPSStatus
"
,
10
:
"
GPSMeasureMode
"
,
11
:
"
GPSDOP
"
,
12
:
"
GPSSpeedRef
"
,
13
:
"
GPSSpeed
"
,
14
:
"
GPSTrackRef
"
,
15
:
"
GPSTrack
"
,
16
:
"
GPSImgDirectionRef
"
,
17
:
"
GPSImgDirection
"
,
18
:
"
GPSMapDatum
"
,
19
:
"
GPSDestLatitudeRef
"
,
20
:
"
GPSDestLatitude
"
,
21
:
"
GPSDestLongitudeRef
"
,
22
:
"
GPSDestLongitude
"
,
23
:
"
GPSDestBearingRef
"
,
24
:
"
GPSDestBearing
"
,
25
:
"
GPSDestDistanceRef
"
,
26
:
"
GPSDestDistance
"
,
27
:
"
GPSProcessingMethod
"
,
28
:
"
GPSAreaInformation
"
,
29
:
"
GPSDateStamp
"
,
30
:
"
GPSDifferential
"
,
31
:
"
GPSHPositioningError
"
},
a
.
ExifMap
.
prototype
.
stringValues
=
{
ExposureProgram
:{
0
:
"
Undefined
"
,
1
:
"
Manual
"
,
2
:
"
Normal program
"
,
3
:
"
Aperture priority
"
,
4
:
"
Shutter priority
"
,
5
:
"
Creative program
"
,
6
:
"
Action program
"
,
7
:
"
Portrait mode
"
,
8
:
"
Landscape mode
"
},
MeteringMode
:{
0
:
"
Unknown
"
,
1
:
"
Average
"
,
2
:
"
CenterWeightedAverage
"
,
3
:
"
Spot
"
,
4
:
"
MultiSpot
"
,
5
:
"
Pattern
"
,
6
:
"
Partial
"
,
255
:
"
Other
"
},
LightSource
:{
0
:
"
Unknown
"
,
1
:
"
Daylight
"
,
2
:
"
Fluorescent
"
,
3
:
"
Tungsten (incandescent light)
"
,
4
:
"
Flash
"
,
9
:
"
Fine weather
"
,
10
:
"
Cloudy weather
"
,
11
:
"
Shade
"
,
12
:
"
Daylight fluorescent (D 5700 - 7100K)
"
,
13
:
"
Day white fluorescent (N 4600 - 5400K)
"
,
14
:
"
Cool white fluorescent (W 3900 - 4500K)
"
,
15
:
"
White fluorescent (WW 3200 - 3700K)
"
,
17
:
"
Standard light A
"
,
18
:
"
Standard light B
"
,
19
:
"
Standard light C
"
,
20
:
"
D55
"
,
21
:
"
D65
"
,
22
:
"
D75
"
,
23
:
"
D50
"
,
24
:
"
ISO studio tungsten
"
,
255
:
"
Other
"
},
Flash
:{
0
:
"
Flash did not fire
"
,
1
:
"
Flash fired
"
,
5
:
"
Strobe return light not detected
"
,
7
:
"
Strobe return light detected
"
,
9
:
"
Flash fired, compulsory flash mode
"
,
13
:
"
Flash fired, compulsory flash mode, return light not detected
"
,
15
:
"
Flash fired, compulsory flash mode, return light detected
"
,
16
:
"
Flash did not fire, compulsory flash mode
"
,
24
:
"
Flash did not fire, auto mode
"
,
25
:
"
Flash fired, auto mode
"
,
29
:
"
Flash fired, auto mode, return light not detected
"
,
31
:
"
Flash fired, auto mode, return light detected
"
,
32
:
"
No flash function
"
,
65
:
"
Flash fired, red-eye reduction mode
"
,
69
:
"
Flash fired, red-eye reduction mode, return light not detected
"
,
71
:
"
Flash fired, red-eye reduction mode, return light detected
"
,
73
:
"
Flash fired, compulsory flash mode, red-eye reduction mode
"
,
77
:
"
Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected
"
,
79
:
"
Flash fired, compulsory flash mode, red-eye reduction mode, return light detected
"
,
89
:
"
Flash fired, auto mode, red-eye reduction mode
"
,
93
:
"
Flash fired, auto mode, return light not detected, red-eye reduction mode
"
,
95
:
"
Flash fired, auto mode, return light detected, red-eye reduction mode
"
},
SensingMethod
:{
1
:
"
Undefined
"
,
2
:
"
One-chip color area sensor
"
,
3
:
"
Two-chip color area sensor
"
,
4
:
"
Three-chip color area sensor
"
,
5
:
"
Color sequential area sensor
"
,
7
:
"
Trilinear sensor
"
,
8
:
"
Color sequential linear sensor
"
},
SceneCaptureType
:{
0
:
"
Standard
"
,
1
:
"
Landscape
"
,
2
:
"
Portrait
"
,
3
:
"
Night scene
"
},
SceneType
:{
1
:
"
Directly photographed
"
},
CustomRendered
:{
0
:
"
Normal process
"
,
1
:
"
Custom process
"
},
WhiteBalance
:{
0
:
"
Auto white balance
"
,
1
:
"
Manual white balance
"
},
GainControl
:{
0
:
"
None
"
,
1
:
"
Low gain up
"
,
2
:
"
High gain up
"
,
3
:
"
Low gain down
"
,
4
:
"
High gain down
"
},
Contrast
:{
0
:
"
Normal
"
,
1
:
"
Soft
"
,
2
:
"
Hard
"
},
Saturation
:{
0
:
"
Normal
"
,
1
:
"
Low saturation
"
,
2
:
"
High saturation
"
},
Sharpness
:{
0
:
"
Normal
"
,
1
:
"
Soft
"
,
2
:
"
Hard
"
},
SubjectDistanceRange
:{
0
:
"
Unknown
"
,
1
:
"
Macro
"
,
2
:
"
Close view
"
,
3
:
"
Distant view
"
},
FileSource
:{
3
:
"
DSC
"
},
ComponentsConfiguration
:{
0
:
""
,
1
:
"
Y
"
,
2
:
"
Cb
"
,
3
:
"
Cr
"
,
4
:
"
R
"
,
5
:
"
G
"
,
6
:
"
B
"
},
Orientation
:{
1
:
"
top-left
"
,
2
:
"
top-right
"
,
3
:
"
bottom-right
"
,
4
:
"
bottom-left
"
,
5
:
"
left-top
"
,
6
:
"
right-top
"
,
7
:
"
right-bottom
"
,
8
:
"
left-bottom
"
}},
a
.
ExifMap
.
prototype
.
getText
=
function
(
a
){
var
b
=
this
.
get
(
a
);
switch
(
a
){
case
"
LightSource
"
:
case
"
Flash
"
:
case
"
MeteringMode
"
:
case
"
ExposureProgram
"
:
case
"
SensingMethod
"
:
case
"
SceneCaptureType
"
:
case
"
SceneType
"
:
case
"
CustomRendered
"
:
case
"
WhiteBalance
"
:
case
"
GainControl
"
:
case
"
Contrast
"
:
case
"
Saturation
"
:
case
"
Sharpness
"
:
case
"
SubjectDistanceRange
"
:
case
"
FileSource
"
:
case
"
Orientation
"
:
return
this
.
stringValues
[
a
][
b
];
case
"
ExifVersion
"
:
case
"
FlashpixVersion
"
:
return
String
.
fromCharCode
(
b
[
0
],
b
[
1
],
b
[
2
],
b
[
3
]);
case
"
ComponentsConfiguration
"
:
return
this
.
stringValues
[
a
][
b
[
0
]]
+
this
.
stringValues
[
a
][
b
[
1
]]
+
this
.
stringValues
[
a
][
b
[
2
]]
+
this
.
stringValues
[
a
][
b
[
3
]];
case
"
GPSVersionID
"
:
return
b
[
0
]
+
"
.
"
+
b
[
1
]
+
"
.
"
+
b
[
2
]
+
"
.
"
+
b
[
3
]}
return
String
(
b
)},
function
(
a
){
var
b
,
c
=
a
.
tags
,
d
=
a
.
map
;
for
(
b
in
c
)
c
.
hasOwnProperty
(
b
)
&&
(
d
[
c
[
b
]]
=
b
)}(
a
.
ExifMap
.
prototype
),
a
.
ExifMap
.
prototype
.
getAll
=
function
(){
var
a
,
b
,
c
=
{};
for
(
a
in
this
)
this
.
hasOwnProperty
(
a
)
&&
(
b
=
this
.
tags
[
a
],
b
&&
(
c
[
b
]
=
this
.
getText
(
b
)));
return
c
}});
\ No newline at end of file
wagtailvideos/static/wagtailvideos/js/video-url-generator.js
deleted
100644 → 0
View file @
517db8ee
$
(
function
()
{
'
use strict
'
;
$
(
'
.video-url-generator
'
).
each
(
function
()
{
var
$this
=
$
(
this
);
var
$form
=
$this
.
find
(
'
form
'
);
var
$filterMethodField
=
$form
.
find
(
'
select#id_filter_method
'
);
var
$widthField
=
$form
.
find
(
'
input#id_width
'
);
var
$heightField
=
$form
.
find
(
'
input#id_height
'
);
var
$closenessField
=
$form
.
find
(
'
input#id_closeness
'
);
var
$result
=
$this
.
find
(
'
#result-url
'
);
var
$loadingMask
=
$this
.
find
(
'
.loading-mask
'
)
var
$preview
=
$this
.
find
(
'
img.preview
'
);
var
$sizeNote
=
$
(
'
#note-size
'
)
var
generatorUrl
=
$this
.
data
(
'
generatorUrl
'
);
function
formChangeHandler
()
{
var
filterSpec
=
$filterMethodField
.
val
();
$loadingMask
.
addClass
(
'
loading
'
);
if
(
filterSpec
==
'
original
'
)
{
$widthField
.
prop
(
'
disabled
'
,
true
);
$heightField
.
prop
(
'
disabled
'
,
true
);
$closenessField
.
prop
(
'
disabled
'
,
true
);
}
else
if
(
filterSpec
==
'
width
'
)
{
$widthField
.
prop
(
'
disabled
'
,
false
);
$heightField
.
prop
(
'
disabled
'
,
true
);
$closenessField
.
prop
(
'
disabled
'
,
true
);
filterSpec
+=
'
-
'
+
$widthField
.
val
();
}
else
if
(
filterSpec
==
'
height
'
)
{
$widthField
.
prop
(
'
disabled
'
,
true
);
$heightField
.
prop
(
'
disabled
'
,
false
);
$closenessField
.
prop
(
'
disabled
'
,
true
);
filterSpec
+=
'
-
'
+
$heightField
.
val
();
}
else
if
(
filterSpec
==
'
min
'
||
filterSpec
==
'
max
'
||
filterSpec
==
'
fill
'
)
{
$widthField
.
prop
(
'
disabled
'
,
false
);
$heightField
.
prop
(
'
disabled
'
,
false
);
if
(
filterSpec
==
'
fill
'
)
{
$closenessField
.
prop
(
'
disabled
'
,
false
);
filterSpec
+=
'
-
'
+
$widthField
.
val
()
+
'
x
'
+
$heightField
.
val
()
+
'
-c
'
+
$closenessField
.
val
()
}
else
{
$closenessField
.
prop
(
'
disabled
'
,
true
);
filterSpec
+=
'
-
'
+
$widthField
.
val
()
+
'
x
'
+
$heightField
.
val
();
}
}
// Display note about scaled down images if image is large
if
(
$widthField
.
val
()
>
$
(
window
).
width
())
{
$sizeNote
.
show
();
}
else
{
$sizeNote
.
hide
();
}
// Fields with width and height
$
.
getJSON
(
generatorUrl
.
replace
(
'
__filterspec__
'
,
filterSpec
))
.
done
(
function
(
data
)
{
$result
.
val
(
data
.
url
);
$preview
.
attr
(
'
src
'
,
data
.
preview_url
);
$loadingMask
.
removeClass
(
'
loading
'
);
})
.
fail
(
function
(
data
)
{
$result
.
val
(
data
.
responseJSON
.
error
);
$preview
.
attr
(
'
src
'
,
''
);
$loadingMask
.
removeClass
(
'
loading
'
);
});
}
$form
.
change
(
$
.
debounce
(
500
,
formChangeHandler
));
$form
.
keyup
(
$
.
debounce
(
500
,
formChangeHandler
));
formChangeHandler
();
// When the user clicks the URL, automatically select the whole thing (for easier copying)
$result
.
click
(
function
()
{
$
(
this
).
select
();
});
});
});
wagtailvideos/static/wagtailvideos/scss/focal-point-chooser.scss
deleted
100644 → 0
View file @
517db8ee
@import
'wagtailadmin/scss/variables'
;
@import
'wagtailadmin/scss/mixins'
;
.focal-point-chooser
{
position
:
relative
;
.current-focal-point-indicator
{
@include
transition
(
opacity
0
.2s
ease
);
box-shadow
:
1px
1px
10px
0
rgba
(
0
,
0
,
0
,
1
);
position
:
absolute
;
border
:
1px
solid
$color-teal
;
opacity
:
0
.5
;
.hidden
{
display
:
none
;
}
}
&
:hover
.current-focal-point-indicator
{
opacity
:
0
;
}
}
wagtailvideos/templates/wagtailvideos/multiple/add.html
View file @
a7e0b168
...
...
@@ -48,7 +48,6 @@
<
li
class
=
"
row
"
>
<
div
class
=
"
left col3
"
>
<
div
class
=
"
preview
"
>
<
div
class
=
"
thumb icon icon-image
"
><
/div
>
<
div
class
=
"
progress
"
>
<
div
class
=
"
bar
"
style
=
"
width: 0%;
"
><
/div
>
<
/div
>
...
...
@@ -68,13 +67,9 @@
{{ block.super }}
<!-- this exact order of plugins is vital -->
<script
src=
"{% static 'wagtailvideos/js/vendor/load-image.min.js' %}"
></script>
<script
src=
"{% static 'wagtailvideos/js/vendor/canvas-to-blob.min.js' %}"
></script>
<script
src=
"{% static 'wagtailadmin/js/vendor/jquery.iframe-transport.js' %}"
></script>
<script
src=
"{% static 'wagtailadmin/js/vendor/jquery.fileupload.js' %}"
></script>
<script
src=
"{% static 'wagtailadmin/js/vendor/jquery.fileupload-process.js' %}"
></script>
<script
src=
"{% static 'wagtailvideos/js/vendor/jquery.fileupload-image.js' %}"
></script>
<script
src=
"{% static 'wagtailvideos/js/vendor/jquery.fileupload-validate.js' %}"
></script>
<script
src=
"{% static 'wagtailadmin/js/vendor/tag-it.js' %}"
></script>
<!-- Main script -->
...
...
wagtailvideos/templates/wagtailvideos/multiple/edit_form.html
View file @
a7e0b168
{% load i18n %}
<div
data-video-thumb=
"{{ video.id }}"
class=
'thumb icon icon-image hasthumb'
>
<img
src=
"{{ video.thumbnail.url }}"
/>
</div>
<form
action=
"{% url 'wagtailvideos:edit_multiple' video.id %}"
method=
"POST"
enctype=
"multipart/form-data"
>
<ul
class=
"fields"
>
{% csrf_token %}
...
...
@@ -16,3 +18,7 @@
</li>
</ul>
</form>
<script>
var
thumb
=
$
(
"
[data-video-thumb=
\"
"
+
{{
video
.
id
}}
+
"
\"
]
"
);
$
(
"
.preview
"
).
append
(
thumb
);
</script>
wagtailvideos/templates/wagtailvideos/videos/_file_field.html
View file @
a7e0b168
{% extends "wagtailadmin/shared/field.html" %}
{% load i18n
wagtailimages_tags
%}
{% load i18n %}
{% block form_field %}
<img
src=
'{{video.thumbnail.url}}'
/>
<img
src=
'{{video.thumbnail.url
}}'
/>
<a
href=
"{{
original_image
.url }}"
class=
"icon icon-
image
"
>
{{ video.filename }}
</a><br
/><br
/>
<a
href=
"{{
video
.url }}"
class=
"icon icon-
media
"
>
{{ video.filename }}
</a><br
/><br
/>
{% trans "Change image file:" %}
{{ field }}
...
...
wagtailvideos/templates/wagtailvideos/videos/edit.html
View file @
a7e0b168
...
...
@@ -17,7 +17,7 @@
{% block content %}
{% trans "Editing" as editing_str %}
{% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=video.title icon="
image
" usage_object=video %}
{% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=video.title icon="
media
" usage_object=video %}
<div
class=
"row row-flush nice-padding"
>
...
...
@@ -70,8 +70,6 @@
{% endif %}
</div>
<div
class=
"col2 "
>
<img
src=
'{{video.thumbnail.url}}'
/>
<dl>
<dt>
{% trans "Filesize" %}
</dt>
<dd>
{% if filesize %}{{ filesize|filesizeformat }}{% else %}{% trans "File not found" %}{% endif %}
</dd>
...
...
wagtailvideos/views/videos.py
View file @
a7e0b168
...
...
@@ -12,8 +12,7 @@ from wagtail.wagtailadmin.utils import PermissionPolicyChecker
from
wagtail.wagtailcore.models
import
Collection
,
Site
from
wagtail.wagtailsearch.backends
import
get_search_backends
from
wagtailvideos.forms
import
(
URLGeneratorForm
,
VideoTranscodeAdminForm
,
get_video_form
)
from
wagtailvideos.forms
import
VideoTranscodeAdminForm
,
get_video_form
from
wagtailvideos.models
import
Video
from
wagtailvideos.permissions
import
permission_policy
...
...
@@ -79,12 +78,12 @@ def edit(request, video_id):
form
=
VideoForm
(
request
.
POST
,
request
.
FILES
,
instance
=
video
)
if
form
.
is_valid
():
if
'file'
in
form
.
changed_data
:
# if providing a new
image
file, delete the old one and all renditions.
# if providing a new
video
file, delete the old one and all renditions.
# NB Doing this via original_file.delete() clears the file field,
# which definitely isn't what we want...
original_file
.
storage
.
delete
(
original_file
.
name
)
# Set new
image
file size
# Set new
video
file size
video
.
file_size
=
video
.
file
.
size
video
=
form
.
save
()
...
...
wagtailvideos/wagtail_hooks.py
View file @
a7e0b168
...
...
@@ -21,7 +21,6 @@ def register_admin_urls():
@
hooks
.
register
(
'insert_editor_js'
)
def
editor_js
():
js_files
=
[
static
(
'wagtailvideos/js/hallo-plugins/hallo-wagtailvideo.js'
),
static
(
'wagtailvideos/js/video-chooser.js'
),
]
js_includes
=
format_html_join
(
...
...
@@ -32,7 +31,6 @@ def editor_js():
"""
<script>
window.chooserUrls.videoChooser = '{0}';
registerHalloPlugin('hallowagtailvideo');
</script>
"""
,
urlresolvers
.
reverse
(
'wagtailvideos:chooser'
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment