papercrop 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of papercrop might be problematic. Click here for more details.
- data/README.md +0 -0
- data/lib/assets/images/Jcrop.gif +0 -0
- data/lib/assets/javascripts/jquery.jcrop.js +246 -0
- data/lib/assets/javascripts/papercrop.js +41 -0
- data/lib/assets/stylesheets/jquery.jcrop.css +35 -0
- data/lib/paperclip_processors/cropper.rb +28 -0
- data/lib/papercrop/active_record_extension.rb +79 -0
- data/lib/papercrop/controller_extension.rb +29 -0
- data/lib/papercrop/engine.rb +4 -0
- data/lib/papercrop/helpers.rb +50 -0
- data/lib/papercrop.rb +4 -0
- data/vendor/jcrop-v0.9.10/MIT-LICENSE.txt +22 -0
- data/vendor/jcrop-v0.9.10/css/Jcrop.gif +0 -0
- data/vendor/jcrop-v0.9.10/css/jquery.Jcrop.css +86 -0
- data/vendor/jcrop-v0.9.10/js/jquery.Jcrop.js +1695 -0
- metadata +92 -0
data/README.md
ADDED
File without changes
|
Binary file
|
@@ -0,0 +1,246 @@
|
|
1
|
+
/**
|
2
|
+
* jquery.Jcrop.min.js v0.9.9 (build:20110607)
|
3
|
+
* jQuery Image Cropping Plugin
|
4
|
+
* @author Kelly Hallman <khallman@gmail.com>
|
5
|
+
* Copyright (c) 2008-2011 Kelly Hallman - released under MIT License
|
6
|
+
* https://github.com/tapmodo/Jcrop
|
7
|
+
*/
|
8
|
+
|
9
|
+
(function($){$.Jcrop=function(obj,opt){var options=$.extend({},$.Jcrop.defaults),docOffset,lastcurs,ie6mode=false;function px(n){return parseInt(n,10)+'px';}
|
10
|
+
function pct(n){return parseInt(n,10)+'%';}
|
11
|
+
function cssClass(cl){return options.baseClass+'-'+cl;}
|
12
|
+
function supportsColorFade(){return $.fx.step.hasOwnProperty('backgroundColor');}
|
13
|
+
function getPos(obj)
|
14
|
+
{var pos=$(obj).offset();return[pos.left,pos.top];}
|
15
|
+
function mouseAbs(e)
|
16
|
+
{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];}
|
17
|
+
function setOptions(opt)
|
18
|
+
{if(typeof(opt)!=='object'){opt={};}
|
19
|
+
options=$.extend(options,opt);if(typeof(options.onChange)!=='function'){options.onChange=function(){};}
|
20
|
+
if(typeof(options.onSelect)!=='function'){options.onSelect=function(){};}
|
21
|
+
if(typeof(options.onRelease)!=='function'){options.onRelease=function(){};}}
|
22
|
+
function myCursor(type)
|
23
|
+
{if(type!==lastcurs){Tracker.setCursor(type);lastcurs=type;}}
|
24
|
+
function startDragMode(mode,pos)
|
25
|
+
{docOffset=getPos($img);Tracker.setCursor(mode==='move'?mode:mode+'-resize');if(mode==='move'){return Tracker.activateHandlers(createMover(pos),doneSelect);}
|
26
|
+
var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);}
|
27
|
+
function dragmodeHandler(mode,f)
|
28
|
+
{return function(pos){if(!options.aspectRatio){switch(mode){case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;}}else{switch(mode){case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;}}
|
29
|
+
Coords.setCurrent(pos);Selection.update();};}
|
30
|
+
function createMover(pos)
|
31
|
+
{var lloc=pos;KeyManager.watchKeys();return function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};}
|
32
|
+
function oppLockCorner(ord)
|
33
|
+
{switch(ord){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';}}
|
34
|
+
function createDragger(ord)
|
35
|
+
{return function(e){if(options.disabled){return false;}
|
36
|
+
if((ord==='move')&&!options.allowMove){return false;}
|
37
|
+
btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};}
|
38
|
+
function presize($obj,w,h)
|
39
|
+
{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height();}
|
40
|
+
if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width();}
|
41
|
+
xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);}
|
42
|
+
function unscale(c)
|
43
|
+
{return{x:parseInt(c.x*xscale,10),y:parseInt(c.y*yscale,10),x2:parseInt(c.x2*xscale,10),y2:parseInt(c.y2*yscale,10),w:parseInt(c.w*xscale,10),h:parseInt(c.h*yscale,10)};}
|
44
|
+
function doneSelect(pos)
|
45
|
+
{var c=Coords.getFixed();if((c.w>options.minSelect[0])&&(c.h>options.minSelect[1])){Selection.enableHandles();Selection.done();}else{Selection.release();}
|
46
|
+
Tracker.setCursor(options.allowSelect?'crosshair':'default');}
|
47
|
+
function newSelection(e)
|
48
|
+
{if(options.disabled){return false;}
|
49
|
+
if(!options.allowSelect){return false;}
|
50
|
+
btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Selection.update();Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();e.stopPropagation();e.preventDefault();return false;}
|
51
|
+
function selectDrag(pos)
|
52
|
+
{Coords.setCurrent(pos);Selection.update();}
|
53
|
+
function newTracker()
|
54
|
+
{var trk=$('<div></div>').addClass(cssClass('tracker'));if($.browser.msie){trk.css({opacity:0,backgroundColor:'white'});}
|
55
|
+
return trk;}
|
56
|
+
if($.browser.msie&&($.browser.version.split('.')[0]==='6')){ie6mode=true;}
|
57
|
+
if(typeof(obj)!=='object'){obj=$(obj)[0];}
|
58
|
+
if(typeof(opt)!=='object'){opt={};}
|
59
|
+
setOptions(opt);var img_css={border:'none',margin:0,padding:0,position:'absolute'};var $origimg=$(obj);var $img=$origimg.clone().removeAttr('id').css(img_css);$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);delete(options.bgColor);if(options.addClass){$div.addClass(options.addClass);}
|
60
|
+
var $img2=$('<img />').attr('src',$img.attr('src')).css(img_css).width(boundx).height(boundy),$img_holder=$('<div />').width(pct(100)).height(pct(100)).css({zIndex:310,position:'absolute',overflow:'hidden'}).append($img2),$hdl_holder=$('<div />').width(pct(100)).height(pct(100)).css('zIndex',320),$sel=$('<div />').css({position:'absolute',zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);if(ie6mode){$sel.css({overflowY:'hidden'});}
|
61
|
+
var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var bgopacity=options.bgOpacity,xlimit,ylimit,xmin,ymin,xscale,yscale,enabled=true,btndown,animating,shift_down;docOffset=getPos($img);var Touch=(function(){function hasTouchSupport(){var support={},events=['touchstart','touchmove','touchend'],el=document.createElement('div'),i;try{for(i=0;i<events.length;i++){var eventName=events[i];eventName='on'+eventName;var isSupported=(eventName in el);if(!isSupported){el.setAttribute(eventName,'return;');isSupported=typeof el[eventName]=='function';}
|
62
|
+
support[events[i]]=isSupported;}
|
63
|
+
return support.touchstart&&support.touchend&&support.touchmove;}
|
64
|
+
catch(err){return false;}}
|
65
|
+
function detectSupport(){if((options.touchSupport===true)||(options.touchSupport===false))return options.touchSupport;else return hasTouchSupport();}
|
66
|
+
return{createDragger:function(ord){return function(e){e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;if(options.disabled){return false;}
|
67
|
+
if((ord==='move')&&!options.allowMove){return false;}
|
68
|
+
btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};},newSelection:function(e){e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return newSelection(e);},isSupported:hasTouchSupport,support:detectSupport()};}());var Coords=(function(){var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos)
|
69
|
+
{pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];}
|
70
|
+
function setCurrent(pos)
|
71
|
+
{pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];}
|
72
|
+
function getOffset()
|
73
|
+
{return[ox,oy];}
|
74
|
+
function moveOffset(offset)
|
75
|
+
{var ox=offset[0],oy=offset[1];if(0>x1+ox){ox-=ox+x1;}
|
76
|
+
if(0>y1+oy){oy-=oy+y1;}
|
77
|
+
if(boundy<y2+oy){oy+=boundy-(y2+oy);}
|
78
|
+
if(boundx<x2+ox){ox+=boundx-(x2+ox);}
|
79
|
+
x1+=ox;x2+=ox;y1+=oy;y2+=oy;}
|
80
|
+
function getCorner(ord)
|
81
|
+
{var c=getFixed();switch(ord){case'ne':return[c.x2,c.y];case'nw':return[c.x,c.y];case'se':return[c.x2,c.y2];case'sw':return[c.x,c.y2];}}
|
82
|
+
function getFixed()
|
83
|
+
{if(!options.aspectRatio){return getRect();}
|
84
|
+
var aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,max_x=options.maxSize[0]/xscale,max_y=options.maxSize[1]/yscale,rw=x2-x1,rh=y2-y1,rwa=Math.abs(rw),rha=Math.abs(rh),real_ratio=rwa/rha,xx,yy;if(max_x===0){max_x=boundx*10;}
|
85
|
+
if(max_y===0){max_y=boundy*10;}
|
86
|
+
if(real_ratio<aspect){yy=y2;w=rha*aspect;xx=rw<0?x1-w:w+x1;if(xx<0){xx=0;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}else if(xx>boundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;}else if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}}
|
87
|
+
if(xx>x1){if(xx-x1<min_x){xx=x1+min_x;}else if(xx-x1>max_x){xx=x1+max_x;}
|
88
|
+
if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xx<x1){if(x1-xx<min_x){xx=x1-min_x;}else if(x1-xx>max_x){xx=x1-max_x;}
|
89
|
+
if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}}
|
90
|
+
if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;}
|
91
|
+
if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;}
|
92
|
+
return makeObj(flipCoords(x1,y1,xx,yy));}
|
93
|
+
function rebound(p)
|
94
|
+
{if(p[0]<0){p[0]=0;}
|
95
|
+
if(p[1]<0){p[1]=0;}
|
96
|
+
if(p[0]>boundx){p[0]=boundx;}
|
97
|
+
if(p[1]>boundy){p[1]=boundy;}
|
98
|
+
return[p[0],p[1]];}
|
99
|
+
function flipCoords(x1,y1,x2,y2)
|
100
|
+
{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2<x1){xa=x2;xb=x1;}
|
101
|
+
if(y2<y1){ya=y2;yb=y1;}
|
102
|
+
return[Math.round(xa),Math.round(ya),Math.round(xb),Math.round(yb)];}
|
103
|
+
function getRect()
|
104
|
+
{var xsize=x2-x1,ysize=y2-y1,delta;if(xlimit&&(Math.abs(xsize)>xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit);}
|
105
|
+
if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit);}
|
106
|
+
if(ymin/yscale&&(Math.abs(ysize)<ymin/yscale)){y2=(ysize>0)?(y1+ymin/yscale):(y1-ymin/yscale);}
|
107
|
+
if(xmin/xscale&&(Math.abs(xsize)<xmin/xscale)){x2=(xsize>0)?(x1+xmin/xscale):(x1-xmin/xscale);}
|
108
|
+
if(x1<0){x2-=x1;x1-=x1;}
|
109
|
+
if(y1<0){y2-=y1;y1-=y1;}
|
110
|
+
if(x2<0){x1-=x2;x2-=x2;}
|
111
|
+
if(y2<0){y1-=y2;y2-=y2;}
|
112
|
+
if(x2>boundx){delta=x2-boundx;x1-=delta;x2-=delta;}
|
113
|
+
if(y2>boundy){delta=y2-boundy;y1-=delta;y2-=delta;}
|
114
|
+
if(x1>boundx){delta=x1-boundy;y2-=delta;y1-=delta;}
|
115
|
+
if(y1>boundy){delta=y1-boundy;y2-=delta;y1-=delta;}
|
116
|
+
return makeObj(flipCoords(x1,y1,x2,y2));}
|
117
|
+
function makeObj(a)
|
118
|
+
{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};}
|
119
|
+
return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}());var Selection=(function(){var awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;function insertBorder(type)
|
120
|
+
{var jq=$('<div />').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;}
|
121
|
+
function dragDiv(ord,zi)
|
122
|
+
{var jq=$('<div />').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi});if(Touch.support){jq.bind('touchstart',Touch.createDragger(ord));}
|
123
|
+
$hdl_holder.append(jq);return jq;}
|
124
|
+
function insertHandle(ord)
|
125
|
+
{return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass('handle'));}
|
126
|
+
function insertDragbar(ord)
|
127
|
+
{var s=options.handleSize,h=s,w=s,t=hhs,l=hhs;switch(ord){case'n':case's':w=pct(100);break;case'e':case'w':h=pct(100);break;}
|
128
|
+
return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});}
|
129
|
+
function createHandles(li)
|
130
|
+
{var i;for(i=0;i<li.length;i++){handle[li[i]]=insertHandle(li[i]);}}
|
131
|
+
function moveHandles(c)
|
132
|
+
{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=-hhs+1,west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;if(handle.e){handle.e.css({top:px(midvert),left:px(east)});handle.w.css({top:px(midvert)});handle.s.css({top:px(south),left:px(midhoriz)});handle.n.css({left:px(midhoriz)});}
|
133
|
+
if(handle.ne){handle.ne.css({left:px(east)});handle.se.css({top:px(south),left:px(east)});handle.sw.css({top:px(south)});}
|
134
|
+
if(handle.b){handle.b.css({top:px(south)});handle.r.css({left:px(east)});}}
|
135
|
+
function moveto(x,y)
|
136
|
+
{$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)});}
|
137
|
+
function resize(w,h)
|
138
|
+
{$sel.width(w).height(h);}
|
139
|
+
function refresh()
|
140
|
+
{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();}
|
141
|
+
function updateVisible()
|
142
|
+
{if(awake){return update();}}
|
143
|
+
function update()
|
144
|
+
{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);if(seehandles){moveHandles(c);}
|
145
|
+
if(!awake){show();}
|
146
|
+
options.onChange.call(api,unscale(c));}
|
147
|
+
function show()
|
148
|
+
{$sel.show();if(options.bgFade){$img.fadeTo(options.fadeTime,bgopacity);}else{$img.css('opacity',bgopacity);}
|
149
|
+
awake=true;}
|
150
|
+
function release()
|
151
|
+
{disableHandles();$sel.hide();if(options.bgFade){$img.fadeTo(options.fadeTime,1);}else{$img.css('opacity',1);}
|
152
|
+
awake=false;options.onRelease.call(api);}
|
153
|
+
function showHandles()
|
154
|
+
{if(seehandles){moveHandles(Coords.getFixed());$hdl_holder.show();}}
|
155
|
+
function enableHandles()
|
156
|
+
{seehandles=true;if(options.allowResize){moveHandles(Coords.getFixed());$hdl_holder.show();return true;}}
|
157
|
+
function disableHandles()
|
158
|
+
{seehandles=false;$hdl_holder.hide();}
|
159
|
+
function animMode(v)
|
160
|
+
{if(animating===v){disableHandles();}else{enableHandles();}}
|
161
|
+
function done()
|
162
|
+
{animMode(false);refresh();}
|
163
|
+
if(options.drawBorders){borders={top:insertBorder('hline'),bottom:insertBorder('hline bottom'),left:insertBorder('vline'),right:insertBorder('vline right')};}
|
164
|
+
if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');}
|
165
|
+
if(options.sideHandles){createHandles(['n','s','e','w']);}
|
166
|
+
if(options.cornerHandles){createHandles(['sw','nw','ne','se']);}
|
167
|
+
var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360});if(Touch.support){$track.bind('touchstart.jcrop',Touch.createDragger('move'));}
|
168
|
+
$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,isAwake:function(){return awake;},setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done};}());var Tracker=(function(){var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;function toFront()
|
169
|
+
{$trk.css({zIndex:450});if(trackDoc){$(document).bind('mousemove',trackMove).bind('mouseup',trackUp);}}
|
170
|
+
function toBack()
|
171
|
+
{$trk.css({zIndex:290});if(trackDoc){$(document).unbind('mousemove',trackMove).unbind('mouseup',trackUp);}}
|
172
|
+
function trackMove(e)
|
173
|
+
{onMove(mouseAbs(e));return false;}
|
174
|
+
function trackUp(e)
|
175
|
+
{e.preventDefault();e.stopPropagation();if(btndown){btndown=false;onDone(mouseAbs(e));if(Selection.isAwake()){options.onSelect.call(api,unscale(Coords.getFixed()));}
|
176
|
+
toBack();onMove=function(){};onDone=function(){};}
|
177
|
+
return false;}
|
178
|
+
function activateHandlers(move,done)
|
179
|
+
{btndown=true;onMove=move;onDone=done;toFront();return false;}
|
180
|
+
function trackTouchMove(e)
|
181
|
+
{e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return trackMove(e);}
|
182
|
+
function trackTouchEnd(e)
|
183
|
+
{e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return trackUp(e);}
|
184
|
+
function setCursor(t)
|
185
|
+
{$trk.css('cursor',t);}
|
186
|
+
if(Touch.support){$(document).bind('touchmove',trackTouchMove).bind('touchend',trackTouchEnd);}
|
187
|
+
if(!trackDoc){$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);}
|
188
|
+
$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}());var KeyManager=(function(){var $keymgr=$('<input type="radio" />').css({position:'fixed',left:'-120px',width:'12px'}),$keywrap=$('<div />').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys()
|
189
|
+
{if(options.keySupport){$keymgr.show();$keymgr.focus();}}
|
190
|
+
function onBlur(e)
|
191
|
+
{$keymgr.hide();}
|
192
|
+
function doNudge(e,x,y)
|
193
|
+
{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible();}
|
194
|
+
e.preventDefault();e.stopPropagation();}
|
195
|
+
function parseKey(e)
|
196
|
+
{if(e.ctrlKey){return true;}
|
197
|
+
shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true;}
|
198
|
+
return false;}
|
199
|
+
if(options.keySupport){$keymgr.keydown(parseKey).blur(onBlur);if(ie6mode||!options.fixedSupport){$keymgr.css({position:'absolute',left:'-20px'});$keywrap.append($keymgr).insertBefore($img);}else{$keymgr.insertBefore($img);}}
|
200
|
+
return{watchKeys:watchKeys};}());function setClass(cname)
|
201
|
+
{$div.removeClass().addClass(cssClass('holder')).addClass(cname);}
|
202
|
+
function animateTo(a,callback)
|
203
|
+
{var x1=parseInt(a[0],10)/xscale,y1=parseInt(a[1],10)/yscale,x2=parseInt(a[2],10)/xscale,y2=parseInt(a[3],10)/yscale;if(animating){return;}
|
204
|
+
var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x=animat[0];y=animat[1];x2=animat[2];y2=animat[3];Selection.animMode(true);var anim_timer;function queueAnimator(){window.setTimeout(animator,interv);}
|
205
|
+
var animator=(function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent>=99.8){pcent=100;}
|
206
|
+
if(pcent<100){setSelectRaw(animat);queueAnimator();}else{Selection.done();if(typeof(callback)==='function'){callback.call(api);}}};}());queueAnimator();}
|
207
|
+
function setSelect(rect)
|
208
|
+
{setSelectRaw([parseInt(rect[0],10)/xscale,parseInt(rect[1],10)/yscale,parseInt(rect[2],10)/xscale,parseInt(rect[3],10)/yscale]);}
|
209
|
+
function setSelectRaw(l)
|
210
|
+
{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();}
|
211
|
+
function tellSelect()
|
212
|
+
{return unscale(Coords.getFixed());}
|
213
|
+
function tellScaled()
|
214
|
+
{return Coords.getFixed();}
|
215
|
+
function setOptionsNew(opt)
|
216
|
+
{setOptions(opt);interfaceUpdate();}
|
217
|
+
function disableCrop()
|
218
|
+
{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');}
|
219
|
+
function enableCrop()
|
220
|
+
{options.disabled=false;interfaceUpdate();}
|
221
|
+
function cancelCrop()
|
222
|
+
{Selection.done();Tracker.activateHandlers(null,null);}
|
223
|
+
function destroy()
|
224
|
+
{$div.remove();$origimg.show();$(obj).removeData('Jcrop');}
|
225
|
+
function setImage(src,callback)
|
226
|
+
{Selection.release();disableCrop();var img=new Image();img.onload=function(){var iw=img.width;var ih=img.height;var bw=options.boxWidth;var bh=options.boxHeight;$img.width(iw).height(ih);$img.attr('src',src);$img2.attr('src',src);presize($img,bw,bh);boundx=$img.width();boundy=$img.height();$img2.width(boundx).height(boundy);$trk.width(boundx+(bound*2)).height(boundy+(bound*2));$div.width(boundx).height(boundy);enableCrop();if(typeof(callback)==='function'){callback.call(api);}};img.src=src;}
|
227
|
+
function interfaceUpdate(alt)
|
228
|
+
{if(options.allowResize){if(alt){Selection.enableOnly();}else{Selection.enableHandles();}}else{Selection.disableHandles();}
|
229
|
+
Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');if(options.hasOwnProperty('setSelect')){setSelect(options.setSelect);Selection.done();delete(options.setSelect);}
|
230
|
+
if(options.hasOwnProperty('trueSize')){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;}
|
231
|
+
if(options.hasOwnProperty('bgColor')){if(supportsColorFade()&&options.fadeTime){$div.animate({backgroundColor:options.bgColor},{queue:false,duration:options.fadeTime});}else{$div.css('backgroundColor',options.bgColor);}
|
232
|
+
delete(options.bgColor);}
|
233
|
+
if(options.hasOwnProperty('bgOpacity')){bgopacity=options.bgOpacity;if(Selection.isAwake()){if(options.fadeTime){$img.fadeTo(options.fadeTime,bgopacity);}else{$div.css('opacity',options.opacity);}}
|
234
|
+
delete(options.bgOpacity);}
|
235
|
+
xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if(options.hasOwnProperty('outerImage')){$img.attr('src',options.outerImage);delete(options.outerImage);}
|
236
|
+
Selection.refresh();}
|
237
|
+
if(Touch.support){$trk.bind('touchstart',Touch.newSelection);}
|
238
|
+
$hdl_holder.hide();interfaceUpdate(true);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},getScaleFactor:function(){return[xscale,yscale];},ui:{holder:$div,selection:$sel}};if($.browser.msie){$div.bind('selectstart',function(){return false;});}
|
239
|
+
$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options,callback)
|
240
|
+
{function attachWhenDone(from)
|
241
|
+
{var opt=(typeof(options)==='object')?options:{};var loadsrc=opt.useImg||from.src;var img=new Image();img.onload=function(){function attachJcrop(){var api=$.Jcrop(from,opt);if(typeof(callback)==='function'){callback.call(api);}}
|
242
|
+
function attachAttempt(){if(!img.width||!img.height){window.setTimeout(attachAttempt,50);}else{attachJcrop();}}
|
243
|
+
window.setTimeout(attachAttempt,50);};img.src=loadsrc;}
|
244
|
+
this.each(function(){if($(this).data('Jcrop')){if(options==='api'){return $(this).data('Jcrop');}
|
245
|
+
else{$(this).data('Jcrop').setOptions(options);}}
|
246
|
+
else{attachWhenDone(this);}});return this;};$.Jcrop.defaults={allowSelect:true,allowMove:true,allowResize:true,trackDocument:true,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:0.6,bgFade:false,borderOpacity:0.4,handleOpacity:0.5,handleSize:9,handleOffset:5,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,fixedSupport:true,touchSupport: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(){},onRelease:function(){}};}(jQuery));
|
@@ -0,0 +1,41 @@
|
|
1
|
+
(function() {
|
2
|
+
$(document).ready(function() {
|
3
|
+
$('div[id$=_cropbox]').each(function() {
|
4
|
+
var aspect, attachment, preview, update_crop;
|
5
|
+
|
6
|
+
attachment = $(this).attr('id').replace('_cropbox', '');
|
7
|
+
preview = !!$("#" + attachment + "_crop_preview").length;
|
8
|
+
aspect = $("input#" + attachment + "_aspect").val();
|
9
|
+
|
10
|
+
update_crop = function(coords) {
|
11
|
+
var preview_width, rx, ry;
|
12
|
+
|
13
|
+
if (preview) {
|
14
|
+
preview_width = $("#" + attachment + "_crop_preview_wrapper").width();
|
15
|
+
rx = preview_width / coords.w;
|
16
|
+
ry = preview_width / coords.h;
|
17
|
+
|
18
|
+
$("img#" + attachment + "_crop_preview").css({
|
19
|
+
width : Math.round(rx * $("input[id$='_" + attachment + "_original_w']").val()) + "px",
|
20
|
+
height : Math.round((ry * $("input[id$='_" + attachment + "_original_h']").val()) / aspect) + "px",
|
21
|
+
marginLeft : "-" + Math.round(rx * coords.x) + "px",
|
22
|
+
marginTop : "-" + Math.round((ry * coords.y) / aspect) + "px"
|
23
|
+
});
|
24
|
+
}
|
25
|
+
|
26
|
+
$("#" + attachment + "_crop_x").val(Math.round(coords.x));
|
27
|
+
$("#" + attachment + "_crop_y").val(Math.round(coords.y));
|
28
|
+
$("#" + attachment + "_crop_w").val(Math.round(coords.w));
|
29
|
+
$("#" + attachment + "_crop_h").val(Math.round(coords.h));
|
30
|
+
};
|
31
|
+
|
32
|
+
$(this).find('img').Jcrop({
|
33
|
+
onChange : update_crop,
|
34
|
+
onSelect : update_crop,
|
35
|
+
setSelect : [0, 0, 500, 500],
|
36
|
+
aspectRatio : aspect,
|
37
|
+
boxWidth : $("input[id$='_" + attachment + "_box_w']").val()
|
38
|
+
});
|
39
|
+
});
|
40
|
+
});
|
41
|
+
}).call(this);
|
@@ -0,0 +1,35 @@
|
|
1
|
+
/* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */
|
2
|
+
.jcrop-holder { text-align: left; }
|
3
|
+
|
4
|
+
.jcrop-vline, .jcrop-hline
|
5
|
+
{
|
6
|
+
font-size: 0px;
|
7
|
+
position: absolute;
|
8
|
+
background: white url('Jcrop.gif') top left repeat;
|
9
|
+
}
|
10
|
+
.jcrop-vline { height: 100%; width: 1px !important; }
|
11
|
+
.jcrop-hline { width: 100%; height: 1px !important; }
|
12
|
+
.jcrop-vline.right { right: 0px; }
|
13
|
+
.jcrop-hline.bottom { bottom: 0px; }
|
14
|
+
.jcrop-handle {
|
15
|
+
font-size: 1px;
|
16
|
+
width: 7px !important;
|
17
|
+
height: 7px !important;
|
18
|
+
border: 1px #eee solid;
|
19
|
+
background-color: #333;
|
20
|
+
}
|
21
|
+
|
22
|
+
.jcrop-tracker { width: 100%; height: 100%; }
|
23
|
+
|
24
|
+
.custom .jcrop-vline,
|
25
|
+
.custom .jcrop-hline
|
26
|
+
{
|
27
|
+
background: yellow;
|
28
|
+
}
|
29
|
+
.custom .jcrop-handle
|
30
|
+
{
|
31
|
+
border-color: black;
|
32
|
+
background-color: #C7BB00;
|
33
|
+
-moz-border-radius: 3px;
|
34
|
+
-webkit-border-radius: 3px;
|
35
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "paperclip"
|
2
|
+
|
3
|
+
module Paperclip
|
4
|
+
class Cropper < Thumbnail
|
5
|
+
|
6
|
+
def transformation_command
|
7
|
+
if crop_command
|
8
|
+
crop_command + super.join(' ').sub(/ -crop \S+/, '').split(' ')
|
9
|
+
else
|
10
|
+
super
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def crop_command
|
16
|
+
target = @attachment.instance
|
17
|
+
|
18
|
+
if target.cropping?(@attachment.name)
|
19
|
+
w = target.send :"#{@attachment.name}_crop_w"
|
20
|
+
h = target.send :"#{@attachment.name}_crop_h"
|
21
|
+
x = target.send :"#{@attachment.name}_crop_x"
|
22
|
+
y = target.send :"#{@attachment.name}_crop_y"
|
23
|
+
["-crop", "#{w}x#{h}+#{x}+#{y}"]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Papercrop
|
2
|
+
module ActiveRecordExtension
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
def crop_attached_file(attachment_name, opts = {})
|
12
|
+
[:crop_x, :crop_y, :crop_w, :crop_h, :original_w, :original_h, :box_w, :aspect].each do |a|
|
13
|
+
attr_accessor :"#{attachment_name}_#{a}"
|
14
|
+
end
|
15
|
+
|
16
|
+
if opts[:aspect].kind_of?(String) && opts[:aspect] =~ /^(\d{1,2}):(\d{1,2})$/
|
17
|
+
opts[:aspect] = Range.new *opts[:aspect].split(':').map(&:to_i)
|
18
|
+
end
|
19
|
+
|
20
|
+
unless opts[:aspect].kind_of?(Range)
|
21
|
+
opts[:aspect] = 1..1
|
22
|
+
end
|
23
|
+
|
24
|
+
send :define_method, :"#{attachment_name}_aspect" do
|
25
|
+
opts[:aspect].first.to_f / opts[:aspect].last.to_f
|
26
|
+
end
|
27
|
+
|
28
|
+
attachment_definitions[attachment_name][:processors] ||= []
|
29
|
+
attachment_definitions[attachment_name][:processors] << :cropper
|
30
|
+
|
31
|
+
after_update :"reprocess_to_crop_#{attachment_name}_attachment"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
module InstanceMethods
|
38
|
+
|
39
|
+
def cropping?(attachment_name)
|
40
|
+
!self.send(:"#{attachment_name}_crop_x").blank? &&
|
41
|
+
!self.send(:"#{attachment_name}_crop_y").blank? &&
|
42
|
+
!self.send(:"#{attachment_name}_crop_w").blank? &&
|
43
|
+
!self.send(:"#{attachment_name}_crop_h").blank?
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def image_geometry(attachment_name, style = :original)
|
48
|
+
@geometry ||= {}
|
49
|
+
@geometry[style] ||= Paperclip::Geometry.from_file(self.send(attachment_name).path(style))
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def method_missing(method, *args)
|
54
|
+
if method.to_s =~ /(reprocess_to_crop_)(\S{1,})(_attachment)/
|
55
|
+
reprocess_cropped_attachment(
|
56
|
+
method.to_s.scan(/(reprocess_to_crop_)(\S{1,})(_attachment)/).flatten.second.to_sym
|
57
|
+
)
|
58
|
+
else
|
59
|
+
super
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def reprocess_cropped_attachment(attachment_name)
|
66
|
+
self.send(attachment_name.to_sym).reprocess! if cropping? attachment_name
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
if defined? ActiveRecord::Base
|
75
|
+
ActiveRecord::Base.class_eval do
|
76
|
+
include Papercrop::ActiveRecordExtension
|
77
|
+
include Papercrop::ActiveRecordExtension::InstanceMethods
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Papercrop
|
2
|
+
module ControllerExtension
|
3
|
+
|
4
|
+
def self.included(klass)
|
5
|
+
klass.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
def crop_image(field_name, opts)
|
12
|
+
opts[:after] ||= [:create, :update]
|
13
|
+
opts[:class] ||= self.class.name.gsub("Controller", "").singularize.constantize
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
module InstanceMethods
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# if defined? ActionController::Base
|
26
|
+
# ActionController::Base.class_eval do
|
27
|
+
# include Papercrop::ControllerExtension
|
28
|
+
# end
|
29
|
+
# end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Papercrop
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
def crop_preview(attachment, opts = {})
|
5
|
+
attachment = attachment.to_sym
|
6
|
+
width = opts[:width] || 100
|
7
|
+
height = (width / self.object.send(:"#{attachment}_aspect")).round
|
8
|
+
|
9
|
+
if self.object.send(attachment).class == Paperclip::Attachment
|
10
|
+
wrapper_options = {
|
11
|
+
:id => "#{attachment}_crop_preview_wrapper",
|
12
|
+
:style => "width:#{width}px; height:#{height}px; overflow:hidden"
|
13
|
+
}
|
14
|
+
|
15
|
+
preview_image = @template.image_tag(self.object.send(attachment).url, :id => "#{attachment}_crop_preview")
|
16
|
+
|
17
|
+
@template.content_tag(:div, preview_image, wrapper_options)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def cropbox(attachment, opts = {})
|
23
|
+
attachment = attachment.to_sym
|
24
|
+
original_width = self.object.image_geometry(attachment, :original).width
|
25
|
+
original_height = self.object.image_geometry(attachment, :original).height
|
26
|
+
box_width = opts[:width] || original_width
|
27
|
+
|
28
|
+
if self.object.send(attachment).class == Paperclip::Attachment
|
29
|
+
box = self.hidden_field(:"#{attachment}_original_w", :value => original_width)
|
30
|
+
box << self.hidden_field(:"#{attachment}_original_h", :value => original_height)
|
31
|
+
box << self.hidden_field(:"#{attachment}_box_w", :value => box_width)
|
32
|
+
|
33
|
+
for attribute in [:crop_x, :crop_y, :crop_w, :crop_h, :aspect] do
|
34
|
+
box << self.hidden_field(:"#{attachment}_#{attribute}", :id => "#{attachment}_#{attribute}")
|
35
|
+
end
|
36
|
+
|
37
|
+
crop_image = @template.image_tag(self.object.send(attachment).url)
|
38
|
+
|
39
|
+
box << @template.content_tag(:div, crop_image, :id => "#{attachment}_cropbox")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
if defined? ActionView::Helpers::FormBuilder
|
47
|
+
ActionView::Helpers::FormBuilder.class_eval do
|
48
|
+
include Papercrop::Helpers
|
49
|
+
end
|
50
|
+
end
|
data/lib/papercrop.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2011 Tapmodo Interactive LLC,
|
2
|
+
http://github.com/tapmodo/Jcrop
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
Binary file
|
@@ -0,0 +1,86 @@
|
|
1
|
+
/* jquery.Jcrop.css v0.9.10 - MIT License */
|
2
|
+
|
3
|
+
/*
|
4
|
+
The outer-most container in a typical Jcrop instance
|
5
|
+
If you are having difficulty with formatting related to styles
|
6
|
+
on a parent element, place any fixes here or in a like selector
|
7
|
+
|
8
|
+
You can also style this element if you want to add a border, etc
|
9
|
+
A better method for styling can be seen below with .jcrop-light
|
10
|
+
(Add a class to the holder and style elements for that extended class)
|
11
|
+
*/
|
12
|
+
.jcrop-holder {
|
13
|
+
direction: ltr;
|
14
|
+
text-align: left;
|
15
|
+
}
|
16
|
+
|
17
|
+
/* These styles define the border lines */
|
18
|
+
.jcrop-vline,.jcrop-hline{background:#FFF url(Jcrop.gif) top left repeat;font-size:0;position:absolute;}
|
19
|
+
.jcrop-vline{height:100%;width:1px!important;}
|
20
|
+
.jcrop-hline{height:1px!important;width:100%;}
|
21
|
+
.jcrop-vline.right{right:0;}
|
22
|
+
.jcrop-hline.bottom{bottom:0;}
|
23
|
+
|
24
|
+
/* Handle style - size is set by Jcrop handleSize option (currently) */
|
25
|
+
.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;}
|
26
|
+
|
27
|
+
/* This style is used for invisible click targets */
|
28
|
+
.jcrop-tracker
|
29
|
+
{
|
30
|
+
height: 100%;
|
31
|
+
width: 100%;
|
32
|
+
-webkit-tap-highlight-color: transparent; /* "turn off" link highlight */
|
33
|
+
-webkit-touch-callout: none; /* disable callout, image save panel */
|
34
|
+
-webkit-user-select: none; /* disable cut copy paste */
|
35
|
+
}
|
36
|
+
|
37
|
+
/* Positioning of handles and drag bars */
|
38
|
+
.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;}
|
39
|
+
.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;}
|
40
|
+
.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;}
|
41
|
+
.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;}
|
42
|
+
.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;}
|
43
|
+
.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;}
|
44
|
+
.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;}
|
45
|
+
.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;}
|
46
|
+
.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;}
|
47
|
+
.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;}
|
48
|
+
.jcrop-dragbar.ord-n{margin-top:-4px;}
|
49
|
+
.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;}
|
50
|
+
.jcrop-dragbar.ord-e{margin-right:-4px;right:0;}
|
51
|
+
.jcrop-dragbar.ord-w{margin-left:-4px;}
|
52
|
+
|
53
|
+
/* The "jcrop-light" class/extension */
|
54
|
+
.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline
|
55
|
+
{
|
56
|
+
background:#FFF;
|
57
|
+
filter:Alpha(opacity=70)!important;
|
58
|
+
opacity:.70!important;
|
59
|
+
}
|
60
|
+
.jcrop-light .jcrop-handle
|
61
|
+
{
|
62
|
+
-moz-border-radius:3px;
|
63
|
+
-webkit-border-radius:3px;
|
64
|
+
background-color:#000;
|
65
|
+
border-color:#FFF;
|
66
|
+
border-radius:3px;
|
67
|
+
}
|
68
|
+
|
69
|
+
/* The "jcrop-dark" class/extension */
|
70
|
+
.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline
|
71
|
+
{
|
72
|
+
background:#000;
|
73
|
+
filter:Alpha(opacity=70)!important;
|
74
|
+
opacity:.7!important;
|
75
|
+
}
|
76
|
+
.jcrop-dark .jcrop-handle
|
77
|
+
{
|
78
|
+
-moz-border-radius:3px;
|
79
|
+
-webkit-border-radius:3px;
|
80
|
+
background-color:#FFF;
|
81
|
+
border-color:#000;
|
82
|
+
border-radius:3px;
|
83
|
+
}
|
84
|
+
|
85
|
+
/* Fix for twitter bootstrap et al. */
|
86
|
+
.jcrop-holder img,img.jcrop-preview{ max-width: none; }
|