rails_admin_jcrop 0.2.1 → 1.1.2
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/README.markdown +7 -0
- data/app/assets/javascripts/rails_admin/ra.jcrop.js +4 -16
- data/lib/rails_admin_jcrop.rb +1 -0
- data/lib/rails_admin_jcrop/asset_engine/carrier_wave.rb +1 -2
- data/lib/rails_admin_jcrop/image_helper.rb +21 -0
- data/lib/rails_admin_jcrop/version.rb +1 -1
- data/vendor/assets/javascripts/rails_admin/jquery.Jcrop.js +66 -62
- data/vendor/assets/javascripts/rails_admin/jquery.Jcrop.min.js +18 -18
- data/vendor/assets/javascripts/rails_admin/jquery.color.js +661 -0
- data/vendor/assets/javascripts/rails_admin/jquery.min.js +4 -0
- data/vendor/assets/stylesheets/rails_admin/Jcrop.gif +0 -0
- data/vendor/assets/stylesheets/rails_admin/jquery.Jcrop.css +165 -0
- data/vendor/assets/{javascripts → stylesheets}/rails_admin/jquery.Jcrop.min.css +7 -6
- metadata +10 -6
- data/vendor/assets/javascripts/rails_admin/jquery.Jcrop.css +0 -86
data/README.markdown
CHANGED
@@ -39,6 +39,12 @@
|
|
39
39
|
4. Done! Click the image on your RailsAdmin model edit page and enjoy cropping!
|
40
40
|

|
41
41
|
|
42
|
+
### Tips ###
|
43
|
+
|
44
|
+
* Crop is done when you successfully return from the modal box, you don't need to save the whole record.
|
45
|
+
* If you don't see the cropped image on rails admin edit page, the browser is possibly displaying cached version. Try refresh your browser.
|
46
|
+
* `rails_admin_jcrop >= 1.0.0` works with `rails_admin ~> 0.3.x`. For older rails_admin, use rails_admin_jcrop 0.2.1.
|
47
|
+
|
42
48
|
## Field Options ##
|
43
49
|
|
44
50
|
### jcrop_options ###
|
@@ -115,6 +121,7 @@ Any help is encouraged. Here are some ways you can contribute:
|
|
115
121
|
### Contributors ###
|
116
122
|
|
117
123
|
* [Alan Rosin Sikora](https://github.com/alansikora) ([alansikora](https://github.com/alansikora))
|
124
|
+
* [cec](https://github.com/cec)
|
118
125
|
|
119
126
|
### And ... ###
|
120
127
|
|
@@ -5,7 +5,8 @@
|
|
5
5
|
var widget = this;
|
6
6
|
var dom_widget = widget.element;
|
7
7
|
|
8
|
-
dom_widget.find('
|
8
|
+
var thumbnailLink = dom_widget.find('img.img-polaroid').parent();
|
9
|
+
thumbnailLink.unbind().bind("click", function(e){
|
9
10
|
widget._bindModalOpening(e, dom_widget.find('a.jcrop_handle').data('link'));
|
10
11
|
return false;
|
11
12
|
});
|
@@ -107,21 +108,8 @@
|
|
107
108
|
_getModal: function() {
|
108
109
|
var widget = this;
|
109
110
|
if (!widget.dialog) {
|
110
|
-
|
111
|
-
|
112
|
-
<div class="modal-header">\
|
113
|
-
<a href="#" class="close" data-dismiss="modal">×</a>\
|
114
|
-
<h3 class="modal-header-title">...</h3>\
|
115
|
-
</div>\
|
116
|
-
<div class="modal-body">\
|
117
|
-
...\
|
118
|
-
</div>\
|
119
|
-
<div class="modal-footer">\
|
120
|
-
<a href="#" class="btn cancel-action">...</a>\
|
121
|
-
<a href="#" class="btn btn-primary save-action">...</a>\
|
122
|
-
</div>\
|
123
|
-
</div>')
|
124
|
-
.modal({
|
111
|
+
widget.dialog = $('<div id="modal" class="modal fade"><div class="modal-header"><a href="#" class="close" data-dismiss="modal">×</a><h3 class="modal-header-title">...</h3></div><div class="modal-body">...</div><div class="modal-footer"><a href="#" class="btn cancel-action">...</a><a href="#" class="btn btn-primary save-action">...</a></div></div>');
|
112
|
+
widget.dialog.modal({
|
125
113
|
keyboard: true,
|
126
114
|
backdrop: true,
|
127
115
|
show: true
|
data/lib/rails_admin_jcrop.rb
CHANGED
@@ -14,8 +14,7 @@ module RailsAdminJcrop
|
|
14
14
|
def rails_admin_crop
|
15
15
|
return unless model.rails_admin_cropping?
|
16
16
|
manipulate! do |img|
|
17
|
-
|
18
|
-
img.crop geometry
|
17
|
+
::RailsAdminJcrop::ImageHelper.crop(img, model.crop_w, model.crop_h, model.crop_x, model.crop_y)
|
19
18
|
img
|
20
19
|
end
|
21
20
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module RailsAdminJcrop
|
2
|
+
module ImageHelper
|
3
|
+
|
4
|
+
class <<self
|
5
|
+
def crop(*args)
|
6
|
+
processor = defined?(::Magick) ? 'rmagick' : 'minimagick'
|
7
|
+
send("#{processor}_crop", *args)
|
8
|
+
end
|
9
|
+
|
10
|
+
def minimagick_crop(img, w, h, x, y)
|
11
|
+
geometry = "#{w}x#{h}+#{x}+#{y}"
|
12
|
+
img.crop geometry
|
13
|
+
end
|
14
|
+
|
15
|
+
def rmagick_crop(img, w, h, x, y)
|
16
|
+
img.crop! x.to_i, y.to_i, w.to_i, h.to_i
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* jquery.Jcrop.js v0.9.
|
2
|
+
* jquery.Jcrop.js v0.9.12
|
3
3
|
* jQuery Image Cropping Plugin - released under MIT License
|
4
4
|
* Author: Kelly Hallman <khallman@gmail.com>
|
5
5
|
* http://github.com/tapmodo/Jcrop
|
6
|
-
* Copyright (c) 2008-
|
6
|
+
* Copyright (c) 2008-2013 Tapmodo Interactive LLC {{{
|
7
7
|
*
|
8
8
|
* Permission is hereby granted, free of charge, to any person
|
9
9
|
* obtaining a copy of this software and associated documentation
|
@@ -33,11 +33,14 @@
|
|
33
33
|
|
34
34
|
$.Jcrop = function (obj, opt) {
|
35
35
|
var options = $.extend({}, $.Jcrop.defaults),
|
36
|
-
docOffset,
|
36
|
+
docOffset,
|
37
|
+
_ua = navigator.userAgent.toLowerCase(),
|
38
|
+
is_msie = /msie/.test(_ua),
|
39
|
+
ie6mode = /msie [1-6]\./.test(_ua);
|
37
40
|
|
38
41
|
// Internal Methods {{{
|
39
42
|
function px(n) {
|
40
|
-
return n + 'px';
|
43
|
+
return Math.round(n) + 'px';
|
41
44
|
}
|
42
45
|
function cssClass(cl) {
|
43
46
|
return options.baseClass + '-' + cl;
|
@@ -66,13 +69,13 @@
|
|
66
69
|
});
|
67
70
|
}
|
68
71
|
//}}}
|
69
|
-
function startDragMode(mode, pos) //{{{
|
72
|
+
function startDragMode(mode, pos, touch) //{{{
|
70
73
|
{
|
71
74
|
docOffset = getPos($img);
|
72
75
|
Tracker.setCursor(mode === 'move' ? mode : mode + '-resize');
|
73
76
|
|
74
77
|
if (mode === 'move') {
|
75
|
-
return Tracker.activateHandlers(createMover(pos), doneSelect);
|
78
|
+
return Tracker.activateHandlers(createMover(pos), doneSelect, touch);
|
76
79
|
}
|
77
80
|
|
78
81
|
var fc = Coords.getFixed();
|
@@ -82,7 +85,7 @@
|
|
82
85
|
Coords.setPressed(Coords.getCorner(opp));
|
83
86
|
Coords.setCurrent(opc);
|
84
87
|
|
85
|
-
Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect);
|
88
|
+
Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect, touch);
|
86
89
|
}
|
87
90
|
//}}}
|
88
91
|
function dragmodeHandler(mode, f) //{{{
|
@@ -237,7 +240,7 @@
|
|
237
240
|
var pos = mouseAbs(e);
|
238
241
|
Coords.setPressed(pos);
|
239
242
|
Selection.update();
|
240
|
-
Tracker.activateHandlers(selectDrag, doneSelect);
|
243
|
+
Tracker.activateHandlers(selectDrag, doneSelect, e.type.substring(0,5)==='touch');
|
241
244
|
KeyManager.watchKeys();
|
242
245
|
|
243
246
|
e.stopPropagation();
|
@@ -254,7 +257,7 @@
|
|
254
257
|
function newTracker() //{{{
|
255
258
|
{
|
256
259
|
var trk = $('<div></div>').addClass(cssClass('tracker'));
|
257
|
-
if (
|
260
|
+
if (is_msie) {
|
258
261
|
trk.css({
|
259
262
|
opacity: 0,
|
260
263
|
backgroundColor: 'white'
|
@@ -267,9 +270,6 @@
|
|
267
270
|
// }}}
|
268
271
|
// Initialization {{{
|
269
272
|
// Sanitize some options {{{
|
270
|
-
if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) {
|
271
|
-
ie6mode = true;
|
272
|
-
}
|
273
273
|
if (typeof(obj) !== 'object') {
|
274
274
|
obj = $(obj)[0];
|
275
275
|
}
|
@@ -398,8 +398,7 @@
|
|
398
398
|
// Touch support detection function adapted (under MIT License)
|
399
399
|
// from code by Jeffrey Sambells - http://github.com/iamamused/
|
400
400
|
function hasTouchSupport() {
|
401
|
-
var support = {},
|
402
|
-
events = ['touchstart', 'touchmove', 'touchend'],
|
401
|
+
var support = {}, events = ['touchstart', 'touchmove', 'touchend'],
|
403
402
|
el = document.createElement('div'), i;
|
404
403
|
|
405
404
|
try {
|
@@ -427,25 +426,27 @@
|
|
427
426
|
return {
|
428
427
|
createDragger: function (ord) {
|
429
428
|
return function (e) {
|
430
|
-
e.pageX = e.originalEvent.changedTouches[0].pageX;
|
431
|
-
e.pageY = e.originalEvent.changedTouches[0].pageY;
|
432
429
|
if (options.disabled) {
|
433
430
|
return false;
|
434
431
|
}
|
435
432
|
if ((ord === 'move') && !options.allowMove) {
|
436
433
|
return false;
|
437
434
|
}
|
435
|
+
docOffset = getPos($img);
|
438
436
|
btndown = true;
|
439
|
-
startDragMode(ord, mouseAbs(e));
|
437
|
+
startDragMode(ord, mouseAbs(Touch.cfilter(e)), true);
|
440
438
|
e.stopPropagation();
|
441
439
|
e.preventDefault();
|
442
440
|
return false;
|
443
441
|
};
|
444
442
|
},
|
445
443
|
newSelection: function (e) {
|
444
|
+
return newSelection(Touch.cfilter(e));
|
445
|
+
},
|
446
|
+
cfilter: function (e){
|
446
447
|
e.pageX = e.originalEvent.changedTouches[0].pageX;
|
447
448
|
e.pageY = e.originalEvent.changedTouches[0].pageY;
|
448
|
-
return
|
449
|
+
return e;
|
449
450
|
},
|
450
451
|
isSupported: hasTouchSupport,
|
451
452
|
support: detectSupport()
|
@@ -622,21 +623,13 @@
|
|
622
623
|
//}}}
|
623
624
|
function rebound(p) //{{{
|
624
625
|
{
|
625
|
-
if (p[0] < 0)
|
626
|
-
|
627
|
-
}
|
628
|
-
if (p[1] < 0) {
|
629
|
-
p[1] = 0;
|
630
|
-
}
|
626
|
+
if (p[0] < 0) p[0] = 0;
|
627
|
+
if (p[1] < 0) p[1] = 0;
|
631
628
|
|
632
|
-
if (p[0] > boundx)
|
633
|
-
|
634
|
-
}
|
635
|
-
if (p[1] > boundy) {
|
636
|
-
p[1] = boundy;
|
637
|
-
}
|
629
|
+
if (p[0] > boundx) p[0] = boundx;
|
630
|
+
if (p[1] > boundy) p[1] = boundy;
|
638
631
|
|
639
|
-
return [p[0], p[1]];
|
632
|
+
return [Math.round(p[0]), Math.round(p[1])];
|
640
633
|
}
|
641
634
|
//}}}
|
642
635
|
function flipCoords(x1, y1, x2, y2) //{{{
|
@@ -896,10 +889,15 @@
|
|
896
889
|
//}}}
|
897
890
|
function insertHandle(ord) //{{{
|
898
891
|
{
|
899
|
-
var hs = options.handleSize
|
900
|
-
|
901
|
-
|
902
|
-
|
892
|
+
var hs = options.handleSize,
|
893
|
+
|
894
|
+
div = dragDiv(ord, hdep++).css({
|
895
|
+
opacity: options.handleOpacity
|
896
|
+
}).addClass(cssClass('handle'));
|
897
|
+
|
898
|
+
if (hs) { div.width(hs).height(hs); }
|
899
|
+
|
900
|
+
return div;
|
903
901
|
}
|
904
902
|
//}}}
|
905
903
|
function insertDragbar(ord) //{{{
|
@@ -953,7 +951,7 @@
|
|
953
951
|
//}}}
|
954
952
|
function resize(w, h) //{{{
|
955
953
|
{
|
956
|
-
$sel.width(w).height(h);
|
954
|
+
$sel.width(Math.round(w)).height(Math.round(h));
|
957
955
|
}
|
958
956
|
//}}}
|
959
957
|
function refresh() //{{{
|
@@ -1053,9 +1051,11 @@
|
|
1053
1051
|
//}}}
|
1054
1052
|
function animMode(v) //{{{
|
1055
1053
|
{
|
1056
|
-
if (
|
1054
|
+
if (v) {
|
1055
|
+
animating = true;
|
1057
1056
|
disableHandles();
|
1058
1057
|
} else {
|
1058
|
+
animating = false;
|
1059
1059
|
enableHandles();
|
1060
1060
|
}
|
1061
1061
|
}
|
@@ -1128,21 +1128,21 @@
|
|
1128
1128
|
onDone = function () {},
|
1129
1129
|
trackDoc = options.trackDocument;
|
1130
1130
|
|
1131
|
-
function toFront() //{{{
|
1131
|
+
function toFront(touch) //{{{
|
1132
1132
|
{
|
1133
1133
|
$trk.css({
|
1134
1134
|
zIndex: 450
|
1135
1135
|
});
|
1136
|
-
|
1136
|
+
|
1137
|
+
if (touch)
|
1137
1138
|
$(document)
|
1138
1139
|
.bind('touchmove.jcrop', trackTouchMove)
|
1139
1140
|
.bind('touchend.jcrop', trackTouchEnd);
|
1140
|
-
|
1141
|
-
if (trackDoc)
|
1141
|
+
|
1142
|
+
else if (trackDoc)
|
1142
1143
|
$(document)
|
1143
1144
|
.bind('mousemove.jcrop',trackMove)
|
1144
1145
|
.bind('mouseup.jcrop',trackUp);
|
1145
|
-
}
|
1146
1146
|
}
|
1147
1147
|
//}}}
|
1148
1148
|
function toBack() //{{{
|
@@ -1150,7 +1150,12 @@
|
|
1150
1150
|
$trk.css({
|
1151
1151
|
zIndex: 290
|
1152
1152
|
});
|
1153
|
-
|
1153
|
+
// Monkey patch, see https://github.com/tapmodo/Jcrop/issues/79
|
1154
|
+
//$(document).unbind('.jcrop');
|
1155
|
+
$(document).unbind('touchmove.jcrop');
|
1156
|
+
$(document).unbind('touchend.jcrop');
|
1157
|
+
$(document).unbind('mousemove.jcrop');
|
1158
|
+
$(document).unbind('mouseup.jcrop');
|
1154
1159
|
}
|
1155
1160
|
//}}}
|
1156
1161
|
function trackMove(e) //{{{
|
@@ -1181,27 +1186,24 @@
|
|
1181
1186
|
return false;
|
1182
1187
|
}
|
1183
1188
|
//}}}
|
1184
|
-
function activateHandlers(move, done) //{{{
|
1189
|
+
function activateHandlers(move, done, touch) //{{{
|
1185
1190
|
{
|
1186
1191
|
btndown = true;
|
1187
1192
|
onMove = move;
|
1188
1193
|
onDone = done;
|
1189
|
-
toFront();
|
1194
|
+
toFront(touch);
|
1190
1195
|
return false;
|
1191
1196
|
}
|
1192
1197
|
//}}}
|
1193
1198
|
function trackTouchMove(e) //{{{
|
1194
1199
|
{
|
1195
|
-
|
1196
|
-
|
1197
|
-
return trackMove(e);
|
1200
|
+
onMove(mouseAbs(Touch.cfilter(e)));
|
1201
|
+
return false;
|
1198
1202
|
}
|
1199
1203
|
//}}}
|
1200
1204
|
function trackTouchEnd(e) //{{{
|
1201
1205
|
{
|
1202
|
-
|
1203
|
-
e.pageY = e.originalEvent.changedTouches[0].pageY;
|
1204
|
-
return trackUp(e);
|
1206
|
+
return trackUp(Touch.cfilter(e));
|
1205
1207
|
}
|
1206
1208
|
//}}}
|
1207
1209
|
function setCursor(t) //{{{
|
@@ -1227,8 +1229,9 @@
|
|
1227
1229
|
position: 'fixed',
|
1228
1230
|
left: '-120px',
|
1229
1231
|
width: '12px'
|
1230
|
-
}),
|
1231
|
-
|
1232
|
+
}).addClass('jcrop-keymgr'),
|
1233
|
+
|
1234
|
+
$keywrap = $('<div />').css({
|
1232
1235
|
position: 'absolute',
|
1233
1236
|
overflow: 'hidden'
|
1234
1237
|
}).append($keymgr);
|
@@ -1337,8 +1340,8 @@
|
|
1337
1340
|
pcent = 0,
|
1338
1341
|
velocity = options.swingSpeed;
|
1339
1342
|
|
1340
|
-
|
1341
|
-
|
1343
|
+
x1 = animat[0];
|
1344
|
+
y1 = animat[1];
|
1342
1345
|
x2 = animat[2];
|
1343
1346
|
y2 = animat[3];
|
1344
1347
|
|
@@ -1352,10 +1355,10 @@
|
|
1352
1355
|
return function () {
|
1353
1356
|
pcent += (100 - pcent) / velocity;
|
1354
1357
|
|
1355
|
-
animat[0] =
|
1356
|
-
animat[1] =
|
1357
|
-
animat[2] = x2 + ((pcent / 100) * ix2);
|
1358
|
-
animat[3] = y2 + ((pcent / 100) * iy2);
|
1358
|
+
animat[0] = Math.round(x1 + ((pcent / 100) * ix1));
|
1359
|
+
animat[1] = Math.round(y1 + ((pcent / 100) * iy1));
|
1360
|
+
animat[2] = Math.round(x2 + ((pcent / 100) * ix2));
|
1361
|
+
animat[3] = Math.round(y2 + ((pcent / 100) * iy2));
|
1359
1362
|
|
1360
1363
|
if (pcent >= 99.8) {
|
1361
1364
|
pcent = 100;
|
@@ -1365,6 +1368,7 @@
|
|
1365
1368
|
queueAnimator();
|
1366
1369
|
} else {
|
1367
1370
|
Selection.done();
|
1371
|
+
Selection.animMode(false);
|
1368
1372
|
if (typeof(callback) === 'function') {
|
1369
1373
|
callback.call(api);
|
1370
1374
|
}
|
@@ -1428,6 +1432,7 @@
|
|
1428
1432
|
{
|
1429
1433
|
$div.remove();
|
1430
1434
|
$origimg.show();
|
1435
|
+
$origimg.css('visibility','visible');
|
1431
1436
|
$(obj).removeData('Jcrop');
|
1432
1437
|
}
|
1433
1438
|
//}}}
|
@@ -1576,8 +1581,7 @@
|
|
1576
1581
|
}
|
1577
1582
|
};
|
1578
1583
|
|
1579
|
-
if (
|
1580
|
-
$div.bind('selectstart', function () { return false; });
|
1584
|
+
if (is_msie) $div.bind('selectstart', function () { return false; });
|
1581
1585
|
|
1582
1586
|
$origimg.data('Jcrop', api);
|
1583
1587
|
return api;
|
@@ -1659,7 +1663,7 @@
|
|
1659
1663
|
bgFade: false,
|
1660
1664
|
borderOpacity: 0.4,
|
1661
1665
|
handleOpacity: 0.5,
|
1662
|
-
handleSize:
|
1666
|
+
handleSize: null,
|
1663
1667
|
|
1664
1668
|
aspectRatio: 0,
|
1665
1669
|
keySupport: true,
|
@@ -1,22 +1,22 @@
|
|
1
1
|
/**
|
2
|
-
* jquery.Jcrop.min.js v0.9.
|
2
|
+
* jquery.Jcrop.min.js v0.9.12 (build:20130202)
|
3
3
|
* jQuery Image Cropping Plugin - released under MIT License
|
4
|
-
* Copyright (c) 2008-
|
4
|
+
* Copyright (c) 2008-2013 Tapmodo Interactive LLC
|
5
5
|
* https://github.com/tapmodo/Jcrop
|
6
6
|
*/
|
7
|
-
(function(a){a.Jcrop=function(b,c){function
|
8
|
-
a){
|
9
|
-
(),a.preventDefault(),!1}function
|
10
|
-
(a){
|
11
|
-
)&&(
|
12
|
-
boxHeight);var
|
13
|
-
),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
|
14
|
-
)return p();var f=d.aspectRatio,g=d.minSize[0]/
|
15
|
-
(a-=c,c-=c),e<0&&(b-=e,e-=e),c>
|
16
|
-
,1,1):(
|
17
|
-
(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
|
18
|
-
)}function G(a){
|
19
|
-
(a){return b(
|
20
|
-
:
|
21
|
-
(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:
|
22
|
-
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);
|
7
|
+
(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
|
8
|
+
(),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
|
9
|
+
(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],
|
10
|
+
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
|
11
|
+
.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").
|
12
|
+
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"
|
13
|
+
,"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[
|
14
|
+
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
|
15
|
+
(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.
|
16
|
+
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++
|
17
|
+
).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
|
18
|
+
(){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"
|
19
|
+
,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;
|
20
|
+
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(
|
21
|
+
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
|
22
|
+
:!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);
|