avatars_for_rails 0.0.10 → 0.1.0
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.rdoc +0 -1
- data/app/assets/images/pbar-ani.gif +0 -0
- data/app/assets/javascripts/avatars.js +8 -0
- data/app/assets/javascripts/jquery.Jcrop.min.js +163 -0
- data/app/assets/javascripts/jquery.fileupload-ui.js +259 -0
- data/app/assets/javascripts/jquery.fileupload.js +475 -0
- data/app/assets/javascripts/jquery.form.js +815 -0
- data/app/assets/stylesheets/avatars.css +118 -0
- data/app/assets/stylesheets/jquery.Jcrop.css +35 -0
- data/app/assets/stylesheets/jquery.fileupload-ui.css +70 -0
- data/app/views/avatars/_form.html.erb +8 -6
- data/app/views/avatars/_includes.html.erb +2 -2
- data/app/views/avatars/_precrop.html.erb +2 -2
- data/avatars_for_rails.gemspec +3 -3
- data/lib/generators/avatars_for_rails/install_generator.rb +0 -8
- data/spec/dummy/public/stylesheets/jquery.fileupload-ui.css +1 -1
- metadata +40 -31
data/README.rdoc
CHANGED
@@ -18,7 +18,6 @@ Then, if you have a class named actor and you want it to have avatars, run:
|
|
18
18
|
rails generate avatars_for_rails:install actor
|
19
19
|
|
20
20
|
This will generate the following:
|
21
|
-
* A public/ file with the js and css files required.
|
22
21
|
* A initializer file with configuration for avatars_for_rails.
|
23
22
|
* A migration providing the database schema for using avatars_for_rails with the actor class.
|
24
23
|
|
Binary file
|
@@ -0,0 +1,8 @@
|
|
1
|
+
$(document).ready( function() {
|
2
|
+
//Full Caption Sliding (Hidden to Visible)
|
3
|
+
$('.boxgrid.captionfull').hover( function() {
|
4
|
+
$(".cover", this).stop().animate({top:'61px'},{queue:false,duration:160});
|
5
|
+
}, function() {
|
6
|
+
$(".cover", this).stop().animate({top:'104px'},{queue:false,duration:160});
|
7
|
+
});
|
8
|
+
});
|
@@ -0,0 +1,163 @@
|
|
1
|
+
/**
|
2
|
+
* Jcrop v.0.9.8 (minimized)
|
3
|
+
* (c) 2008 Kelly Hallman and DeepLiquid.com
|
4
|
+
* More information: http://deepliquid.com/content/Jcrop.html
|
5
|
+
* Released under MIT License - this header must remain with code
|
6
|
+
*/
|
7
|
+
|
8
|
+
|
9
|
+
(function($){$.Jcrop=function(obj,opt)
|
10
|
+
{var obj=obj,opt=opt;if(typeof(obj)!=='object')obj=$(obj)[0];if(typeof(opt)!=='object')opt={};if(!('trackDocument'in opt))
|
11
|
+
{opt.trackDocument=$.browser.msie?false:true;if($.browser.msie&&$.browser.version.split('.')[0]=='8')
|
12
|
+
opt.trackDocument=true;}
|
13
|
+
if(!('keySupport'in opt))
|
14
|
+
opt.keySupport=$.browser.msie?false:true;var defaults={trackDocument:false,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:.6,borderOpacity:.4,handleOpacity:.5,handlePad:5,handleSize:9,handleOffset:5,edgeMargin:14,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,boxWidth:0,boxHeight:0,boundary:8,animationDelay:20,swingSpeed:3,allowSelect:true,allowMove:true,allowResize:true,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){}};var options=defaults;setOptions(opt);var $origimg=$(obj);var $img=$origimg.clone().removeAttr('id').css({position:'absolute'});$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);;if(options.addClass)$div.addClass(options.addClass);var $img2=$('<img />').attr('src',$img.attr('src')).css('position','absolute').width(boundx).height(boundy);var $img_holder=$('<div />').width(pct(100)).height(pct(100)).css({zIndex:310,position:'absolute',overflow:'hidden'}).append($img2);var $hdl_holder=$('<div />').width(pct(100)).height(pct(100)).css('zIndex',320);var $sel=$('<div />').css({position:'absolute',zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);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 xlimit,ylimit,xmin,ymin;var xscale,yscale,enabled=true;var docOffset=getPos($img),btndown,lastcurs,dimmed,animating,shift_down;var Coords=function()
|
15
|
+
{var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos)
|
16
|
+
{var pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];};function setCurrent(pos)
|
17
|
+
{var pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];};function getOffset()
|
18
|
+
{return[ox,oy];};function moveOffset(offset)
|
19
|
+
{var ox=offset[0],oy=offset[1];if(0>x1+ox)ox-=ox+x1;if(0>y1+oy)oy-=oy+y1;if(boundy<y2+oy)oy+=boundy-(y2+oy);if(boundx<x2+ox)ox+=boundx-(x2+ox);x1+=ox;x2+=ox;y1+=oy;y2+=oy;};function getCorner(ord)
|
20
|
+
{var c=getFixed();switch(ord)
|
21
|
+
{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];}};function getFixed()
|
22
|
+
{if(!options.aspectRatio)return getRect();var aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,min_y=options.minSize[1]/yscale,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}
|
23
|
+
if(max_y==0){max_y=boundy*10}
|
24
|
+
if(real_ratio<aspect)
|
25
|
+
{yy=y2;w=rha*aspect;xx=rw<0?x1-w:w+x1;if(xx<0)
|
26
|
+
{xx=0;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}
|
27
|
+
else if(xx>boundx)
|
28
|
+
{xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}
|
29
|
+
else
|
30
|
+
{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0)
|
31
|
+
{yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;}
|
32
|
+
else if(yy>boundy)
|
33
|
+
{yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}}
|
34
|
+
if(xx>x1){if(xx-x1<min_x){xx=x1+min_x;}else if(xx-x1>max_x){xx=x1+max_x;}
|
35
|
+
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;}
|
36
|
+
if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}}
|
37
|
+
if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;}
|
38
|
+
if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;}
|
39
|
+
return last=makeObj(flipCoords(x1,y1,xx,yy));};function rebound(p)
|
40
|
+
{if(p[0]<0)p[0]=0;if(p[1]<0)p[1]=0;if(p[0]>boundx)p[0]=boundx;if(p[1]>boundy)p[1]=boundy;return[p[0],p[1]];};function flipCoords(x1,y1,x2,y2)
|
41
|
+
{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2<x1)
|
42
|
+
{xa=x2;xb=x1;}
|
43
|
+
if(y2<y1)
|
44
|
+
{ya=y2;yb=y1;}
|
45
|
+
return[Math.round(xa),Math.round(ya),Math.round(xb),Math.round(yb)];};function getRect()
|
46
|
+
{var xsize=x2-x1;var ysize=y2-y1;if(xlimit&&(Math.abs(xsize)>xlimit))
|
47
|
+
x2=(xsize>0)?(x1+xlimit):(x1-xlimit);if(ylimit&&(Math.abs(ysize)>ylimit))
|
48
|
+
y2=(ysize>0)?(y1+ylimit):(y1-ylimit);if(ymin&&(Math.abs(ysize)<ymin))
|
49
|
+
y2=(ysize>0)?(y1+ymin):(y1-ymin);if(xmin&&(Math.abs(xsize)<xmin))
|
50
|
+
x2=(xsize>0)?(x1+xmin):(x1-xmin);if(x1<0){x2-=x1;x1-=x1;}
|
51
|
+
if(y1<0){y2-=y1;y1-=y1;}
|
52
|
+
if(x2<0){x1-=x2;x2-=x2;}
|
53
|
+
if(y2<0){y1-=y2;y2-=y2;}
|
54
|
+
if(x2>boundx){var delta=x2-boundx;x1-=delta;x2-=delta;}
|
55
|
+
if(y2>boundy){var delta=y2-boundy;y1-=delta;y2-=delta;}
|
56
|
+
if(x1>boundx){var delta=x1-boundy;y2-=delta;y1-=delta;}
|
57
|
+
if(y1>boundy){var delta=y1-boundy;y2-=delta;y1-=delta;}
|
58
|
+
return makeObj(flipCoords(x1,y1,x2,y2));};function makeObj(a)
|
59
|
+
{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};};return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}();var Selection=function()
|
60
|
+
{var start,end,dragmode,awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;if(options.drawBorders){borders={top:insertBorder('hline').css('top',$.browser.msie?px(-1):px(0)),bottom:insertBorder('hline'),left:insertBorder('vline'),right:insertBorder('vline')};}
|
61
|
+
if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');}
|
62
|
+
options.sideHandles&&createHandles(['n','s','e','w']);options.cornerHandles&&createHandles(['sw','nw','ne','se']);function insertBorder(type)
|
63
|
+
{var jq=$('<div />').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;};function dragDiv(ord,zi)
|
64
|
+
{var jq=$('<div />').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi});$hdl_holder.append(jq);return jq;};function insertHandle(ord)
|
65
|
+
{return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass('handle'));};function insertDragbar(ord)
|
66
|
+
{var s=options.handleSize,o=hhs,h=s,w=s,t=o,l=o;switch(ord)
|
67
|
+
{case'n':case's':w=pct(100);break;case'e':case'w':h=pct(100);break;}
|
68
|
+
return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});};function createHandles(li)
|
69
|
+
{for(i in li)handle[li[i]]=insertHandle(li[i]);};function moveHandles(c)
|
70
|
+
{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;'e'in handle&&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)});'ne'in handle&&handle.ne.css({left:px(east)})&&handle.se.css({top:px(south),left:px(east)})&&handle.sw.css({top:px(south)});'b'in handle&&handle.b.css({top:px(south)})&&handle.r.css({left:px(east)});};function moveto(x,y)
|
71
|
+
{$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)});};function resize(w,h)
|
72
|
+
{$sel.width(w).height(h);};function refresh()
|
73
|
+
{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();};function updateVisible()
|
74
|
+
{if(awake)return update();};function update()
|
75
|
+
{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);options.drawBorders&&borders['right'].css({left:px(c.w-1)})&&borders['bottom'].css({top:px(c.h-1)});seehandles&&moveHandles(c);awake||show();options.onChange(unscale(c));};function show()
|
76
|
+
{$sel.show();$img.css('opacity',options.bgOpacity);awake=true;};function release()
|
77
|
+
{disableHandles();$sel.hide();$img.css('opacity',1);awake=false;};function showHandles()
|
78
|
+
{if(seehandles)
|
79
|
+
{moveHandles(Coords.getFixed());$hdl_holder.show();}};function enableHandles()
|
80
|
+
{seehandles=true;if(options.allowResize)
|
81
|
+
{moveHandles(Coords.getFixed());$hdl_holder.show();return true;}};function disableHandles()
|
82
|
+
{seehandles=false;$hdl_holder.hide();};function animMode(v)
|
83
|
+
{(animating=v)?disableHandles():enableHandles();};function done()
|
84
|
+
{animMode(false);refresh();};var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360})
|
85
|
+
$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done};}();var Tracker=function()
|
86
|
+
{var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;if(!trackDoc)
|
87
|
+
{$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);}
|
88
|
+
function toFront()
|
89
|
+
{$trk.css({zIndex:450});if(trackDoc)
|
90
|
+
{$(document).mousemove(trackMove).mouseup(trackUp);}}
|
91
|
+
function toBack()
|
92
|
+
{$trk.css({zIndex:290});if(trackDoc)
|
93
|
+
{$(document).unbind('mousemove',trackMove).unbind('mouseup',trackUp);}}
|
94
|
+
function trackMove(e)
|
95
|
+
{onMove(mouseAbs(e));};function trackUp(e)
|
96
|
+
{e.preventDefault();e.stopPropagation();if(btndown)
|
97
|
+
{btndown=false;onDone(mouseAbs(e));options.onSelect(unscale(Coords.getFixed()));toBack();onMove=function(){};onDone=function(){};}
|
98
|
+
return false;};function activateHandlers(move,done)
|
99
|
+
{btndown=true;onMove=move;onDone=done;toFront();return false;};function setCursor(t){$trk.css('cursor',t);};$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}();var KeyManager=function()
|
100
|
+
{var $keymgr=$('<input type="radio" />').css({position:'absolute',left:'-30px'}).keypress(parseKey).blur(onBlur),$keywrap=$('<div />').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys()
|
101
|
+
{if(options.keySupport)
|
102
|
+
{$keymgr.show();$keymgr.focus();}};function onBlur(e)
|
103
|
+
{$keymgr.hide();};function doNudge(e,x,y)
|
104
|
+
{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible();};e.preventDefault();e.stopPropagation();};function parseKey(e)
|
105
|
+
{if(e.ctrlKey)return true;shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode)
|
106
|
+
{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;}
|
107
|
+
return nothing(e);};if(options.keySupport)$keywrap.insertBefore($img);return{watchKeys:watchKeys};}();function px(n){return''+parseInt(n)+'px';};function pct(n){return''+parseInt(n)+'%';};function cssClass(cl){return options.baseClass+'-'+cl;};function getPos(obj)
|
108
|
+
{var pos=$(obj).offset();return[pos.left,pos.top];};function mouseAbs(e)
|
109
|
+
{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];};function myCursor(type)
|
110
|
+
{if(type!=lastcurs)
|
111
|
+
{Tracker.setCursor(type);lastcurs=type;}};function startDragMode(mode,pos)
|
112
|
+
{docOffset=getPos($img);Tracker.setCursor(mode=='move'?mode:mode+'-resize');if(mode=='move')
|
113
|
+
return Tracker.activateHandlers(createMover(pos),doneSelect);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);};function dragmodeHandler(mode,f)
|
114
|
+
{return function(pos){if(!options.aspectRatio)switch(mode)
|
115
|
+
{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;}
|
116
|
+
else switch(mode)
|
117
|
+
{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;}
|
118
|
+
Coords.setCurrent(pos);Selection.update();};};function createMover(pos)
|
119
|
+
{var lloc=pos;KeyManager.watchKeys();return function(pos)
|
120
|
+
{Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};};function oppLockCorner(ord)
|
121
|
+
{switch(ord)
|
122
|
+
{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 createDragger(ord)
|
123
|
+
{return function(e){if(options.disabled)return false;if((ord=='move')&&!options.allowMove)return false;btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};};function presize($obj,w,h)
|
124
|
+
{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0)
|
125
|
+
{nw=w;nh=(w/$obj.width())*$obj.height();}
|
126
|
+
if((nh>h)&&h>0)
|
127
|
+
{nh=h;nw=(h/$obj.height())*$obj.width();}
|
128
|
+
xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);};function unscale(c)
|
129
|
+
{return{x:parseInt(c.x*xscale),y:parseInt(c.y*yscale),x2:parseInt(c.x2*xscale),y2:parseInt(c.y2*yscale),w:parseInt(c.w*xscale),h:parseInt(c.h*yscale)};};function doneSelect(pos)
|
130
|
+
{var c=Coords.getFixed();if(c.w>options.minSelect[0]&&c.h>options.minSelect[1])
|
131
|
+
{Selection.enableHandles();Selection.done();}
|
132
|
+
else
|
133
|
+
{Selection.release();}
|
134
|
+
Tracker.setCursor(options.allowSelect?'crosshair':'default');};function newSelection(e)
|
135
|
+
{if(options.disabled)return false;if(!options.allowSelect)return false;btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();Selection.update();e.stopPropagation();e.preventDefault();return false;};function selectDrag(pos)
|
136
|
+
{Coords.setCurrent(pos);Selection.update();};function newTracker()
|
137
|
+
{var trk=$('<div></div>').addClass(cssClass('tracker'));$.browser.msie&&trk.css({opacity:0,backgroundColor:'white'});return trk;};function animateTo(a)
|
138
|
+
{var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating)return;var animto=Coords.flipCoords(x1,y1,x2,y2);var c=Coords.getFixed();var animat=initcr=[c.x,c.y,c.x2,c.y2];var interv=options.animationDelay;var x=animat[0];var y=animat[1];var x2=animat[2];var y2=animat[3];var ix1=animto[0]-initcr[0];var iy1=animto[1]-initcr[1];var ix2=animto[2]-initcr[2];var iy2=animto[3]-initcr[3];var pcent=0;var velocity=options.swingSpeed;Selection.animMode(true);var animator=function()
|
139
|
+
{return function()
|
140
|
+
{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<100)animateStart();else Selection.done();if(pcent>=99.8)pcent=100;setSelectRaw(animat);};}();function animateStart()
|
141
|
+
{window.setTimeout(animator,interv);};animateStart();};function setSelect(rect)
|
142
|
+
{setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);};function setSelectRaw(l)
|
143
|
+
{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();};function setOptions(opt)
|
144
|
+
{if(typeof(opt)!='object')opt={};options=$.extend(options,opt);if(typeof(options.onChange)!=='function')
|
145
|
+
options.onChange=function(){};if(typeof(options.onSelect)!=='function')
|
146
|
+
options.onSelect=function(){};};function tellSelect()
|
147
|
+
{return unscale(Coords.getFixed());};function tellScaled()
|
148
|
+
{return Coords.getFixed();};function setOptionsNew(opt)
|
149
|
+
{setOptions(opt);interfaceUpdate();};function disableCrop()
|
150
|
+
{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');};function enableCrop()
|
151
|
+
{options.disabled=false;interfaceUpdate();};function cancelCrop()
|
152
|
+
{Selection.done();Tracker.activateHandlers(null,null);};function destroy()
|
153
|
+
{$div.remove();$origimg.show();};function interfaceUpdate(alt)
|
154
|
+
{options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles();Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');$div.css('backgroundColor',options.bgColor);if('setSelect'in options){setSelect(opt.setSelect);Selection.done();delete(options.setSelect);}
|
155
|
+
if('trueSize'in options){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;}
|
156
|
+
xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if('outerImage'in options)
|
157
|
+
{$img.attr('src',options.outerImage);delete(options.outerImage);}
|
158
|
+
Selection.refresh();};$hdl_holder.hide();interfaceUpdate(true);var api={animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},release:Selection.release,destroy:destroy};$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options)
|
159
|
+
{function attachWhenDone(from)
|
160
|
+
{var loadsrc=options.useImg||from.src;var img=new Image();img.onload=function(){$.Jcrop(from,options);};img.src=loadsrc;};if(typeof(options)!=='object')options={};this.each(function()
|
161
|
+
{if($(this).data('Jcrop'))
|
162
|
+
{if(options=='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);}
|
163
|
+
else attachWhenDone(this);});return this;};})(jQuery);
|
@@ -0,0 +1,259 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery File Upload User Interface Plugin 3.2.2
|
3
|
+
*
|
4
|
+
* Copyright 2010, Sebastian Tschan, AQUANTUM
|
5
|
+
* Licensed under the MIT license:
|
6
|
+
* http://creativecommons.org/licenses/MIT/
|
7
|
+
*
|
8
|
+
* https://blueimp.net
|
9
|
+
* http://www.aquantum.de
|
10
|
+
*/
|
11
|
+
|
12
|
+
/*jslint browser: true */
|
13
|
+
/*global jQuery */
|
14
|
+
|
15
|
+
(function ($) {
|
16
|
+
|
17
|
+
var UploadHandler,
|
18
|
+
methods;
|
19
|
+
|
20
|
+
UploadHandler = function (container, options) {
|
21
|
+
var uploadHandler = this,
|
22
|
+
undef = 'undefined',
|
23
|
+
func = 'function',
|
24
|
+
dragOverTimeout,
|
25
|
+
isDropZoneEnlarged;
|
26
|
+
|
27
|
+
this.dropZone = container;
|
28
|
+
this.progressSelector = '.file_upload_progress div';
|
29
|
+
this.cancelSelector = '.file_upload_cancel div';
|
30
|
+
this.cssClassSmall = 'file_upload_small';
|
31
|
+
this.cssClassLarge = 'file_upload_large';
|
32
|
+
this.cssClassHighlight = 'file_upload_highlight';
|
33
|
+
this.dropEffect = 'highlight';
|
34
|
+
this.uploadTable = this.downloadTable = $();
|
35
|
+
|
36
|
+
this.buildUploadRow = this.buildDownloadRow = function () {
|
37
|
+
return null;
|
38
|
+
};
|
39
|
+
|
40
|
+
this.addNode = function (parentNode, node, callBack) {
|
41
|
+
if (node) {
|
42
|
+
node.css('display', 'none').appendTo(parentNode).fadeIn(function () {
|
43
|
+
if (typeof callBack === func) {
|
44
|
+
try {
|
45
|
+
callBack();
|
46
|
+
} catch (e) {
|
47
|
+
// Fix endless exception loop:
|
48
|
+
$(this).stop();
|
49
|
+
throw e;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
});
|
53
|
+
} else if (typeof callBack === func) {
|
54
|
+
callBack();
|
55
|
+
}
|
56
|
+
};
|
57
|
+
|
58
|
+
this.removeNode = function (node, callBack) {
|
59
|
+
if (node) {
|
60
|
+
node.fadeOut(function () {
|
61
|
+
$(this).remove();
|
62
|
+
if (typeof callBack === func) {
|
63
|
+
try {
|
64
|
+
callBack();
|
65
|
+
} catch (e) {
|
66
|
+
// Fix endless exception loop:
|
67
|
+
$(this).stop();
|
68
|
+
throw e;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
});
|
72
|
+
} else if (typeof callBack === func) {
|
73
|
+
callBack();
|
74
|
+
}
|
75
|
+
};
|
76
|
+
|
77
|
+
this.onAbort = function (event, files, index, xhr, handler) {
|
78
|
+
uploadHandler.removeNode(handler.uploadRow);
|
79
|
+
};
|
80
|
+
|
81
|
+
this.cancelUpload = function (event, files, index, xhr, handler) {
|
82
|
+
var readyState = xhr.readyState;
|
83
|
+
xhr.abort();
|
84
|
+
// If readyState is below 2, abort() has no effect:
|
85
|
+
if (isNaN(readyState) || readyState < 2) {
|
86
|
+
handler.onAbort(event, files, index, xhr, handler);
|
87
|
+
}
|
88
|
+
};
|
89
|
+
|
90
|
+
this.initProgressBar = function (node, value) {
|
91
|
+
if (typeof node.progressbar === func) {
|
92
|
+
return node.progressbar({
|
93
|
+
value: value
|
94
|
+
});
|
95
|
+
} else {
|
96
|
+
var progressbar = $('<progress value="' + value + '" max="100"/>').appendTo(node);
|
97
|
+
progressbar.progressbar = function (key, value) {
|
98
|
+
progressbar.attr('value', value);
|
99
|
+
};
|
100
|
+
return progressbar;
|
101
|
+
}
|
102
|
+
};
|
103
|
+
|
104
|
+
this.initUploadRow = function (event, files, index, xhr, handler, callBack) {
|
105
|
+
var uploadRow = handler.uploadRow = uploadHandler.buildUploadRow(files, index);
|
106
|
+
if (uploadRow) {
|
107
|
+
handler.progressbar = uploadHandler.initProgressBar(
|
108
|
+
uploadRow.find(uploadHandler.progressSelector),
|
109
|
+
(xhr.upload ? 0 : 100)
|
110
|
+
);
|
111
|
+
uploadRow.find(uploadHandler.cancelSelector).click(function (e) {
|
112
|
+
uploadHandler.cancelUpload(e, files, index, xhr, handler);
|
113
|
+
});
|
114
|
+
}
|
115
|
+
uploadHandler.addNode(uploadHandler.uploadTable, uploadRow, callBack);
|
116
|
+
};
|
117
|
+
|
118
|
+
this.initUpload = function (event, files, index, xhr, handler, callBack) {
|
119
|
+
uploadHandler.initUploadRow(event, files, index, xhr, handler, function () {
|
120
|
+
if (typeof uploadHandler.beforeSend === func) {
|
121
|
+
uploadHandler.beforeSend(event, files, index, xhr, handler, callBack);
|
122
|
+
} else {
|
123
|
+
callBack();
|
124
|
+
}
|
125
|
+
});
|
126
|
+
};
|
127
|
+
|
128
|
+
this.onProgress = function (event, files, index, xhr, handler) {
|
129
|
+
if (handler.progressbar) {
|
130
|
+
handler.progressbar.progressbar(
|
131
|
+
'value',
|
132
|
+
parseInt(event.loaded / event.total * 100, 10)
|
133
|
+
);
|
134
|
+
}
|
135
|
+
};
|
136
|
+
|
137
|
+
this.parseResponse = function (xhr) {
|
138
|
+
if (typeof xhr.responseText !== undef) {
|
139
|
+
return $.parseJSON(xhr.responseText);
|
140
|
+
} else {
|
141
|
+
// Instead of an XHR object, an iframe is used for legacy browsers:
|
142
|
+
return $.parseJSON(xhr.contents().text());
|
143
|
+
}
|
144
|
+
};
|
145
|
+
|
146
|
+
this.initDownloadRow = function (event, files, index, xhr, handler, callBack) {
|
147
|
+
var json, downloadRow;
|
148
|
+
try {
|
149
|
+
json = handler.response = uploadHandler.parseResponse(xhr);
|
150
|
+
downloadRow = handler.downloadRow = uploadHandler.buildDownloadRow(json);
|
151
|
+
uploadHandler.addNode(uploadHandler.downloadTable, downloadRow, callBack);
|
152
|
+
} catch (e) {
|
153
|
+
if (typeof uploadHandler.onError === func) {
|
154
|
+
handler.originalEvent = event;
|
155
|
+
uploadHandler.onError(e, files, index, xhr, handler);
|
156
|
+
} else {
|
157
|
+
throw e;
|
158
|
+
}
|
159
|
+
}
|
160
|
+
};
|
161
|
+
|
162
|
+
this.onLoad = function (event, files, index, xhr, handler) {
|
163
|
+
uploadHandler.removeNode(handler.uploadRow, function () {
|
164
|
+
uploadHandler.initDownloadRow(event, files, index, xhr, handler, function () {
|
165
|
+
if (typeof uploadHandler.onComplete === func) {
|
166
|
+
uploadHandler.onComplete(event, files, index, xhr, handler);
|
167
|
+
}
|
168
|
+
});
|
169
|
+
});
|
170
|
+
};
|
171
|
+
|
172
|
+
this.dropZoneEnlarge = function () {
|
173
|
+
if (!isDropZoneEnlarged) {
|
174
|
+
if (typeof uploadHandler.dropZone.switchClass === func) {
|
175
|
+
uploadHandler.dropZone.switchClass(
|
176
|
+
uploadHandler.cssClassSmall,
|
177
|
+
uploadHandler.cssClassLarge
|
178
|
+
);
|
179
|
+
} else {
|
180
|
+
uploadHandler.dropZone.addClass(uploadHandler.cssClassLarge);
|
181
|
+
uploadHandler.dropZone.removeClass(uploadHandler.cssClassSmall);
|
182
|
+
}
|
183
|
+
isDropZoneEnlarged = true;
|
184
|
+
}
|
185
|
+
};
|
186
|
+
|
187
|
+
this.dropZoneReduce = function () {
|
188
|
+
if (typeof uploadHandler.dropZone.switchClass === func) {
|
189
|
+
uploadHandler.dropZone.switchClass(
|
190
|
+
uploadHandler.cssClassLarge,
|
191
|
+
uploadHandler.cssClassSmall
|
192
|
+
);
|
193
|
+
} else {
|
194
|
+
uploadHandler.dropZone.addClass(uploadHandler.cssClassSmall);
|
195
|
+
uploadHandler.dropZone.removeClass(uploadHandler.cssClassLarge);
|
196
|
+
}
|
197
|
+
isDropZoneEnlarged = false;
|
198
|
+
};
|
199
|
+
|
200
|
+
this.onDocumentDragEnter = function (event) {
|
201
|
+
uploadHandler.dropZoneEnlarge();
|
202
|
+
};
|
203
|
+
|
204
|
+
this.onDocumentDragOver = function (event) {
|
205
|
+
if (dragOverTimeout) {
|
206
|
+
clearTimeout(dragOverTimeout);
|
207
|
+
}
|
208
|
+
dragOverTimeout = setTimeout(function () {
|
209
|
+
uploadHandler.dropZoneReduce();
|
210
|
+
}, 200);
|
211
|
+
};
|
212
|
+
|
213
|
+
this.onDragEnter = this.onDragLeave = function (event) {
|
214
|
+
uploadHandler.dropZone.toggleClass(uploadHandler.cssClassHighlight);
|
215
|
+
};
|
216
|
+
|
217
|
+
this.onDrop = function (event) {
|
218
|
+
if (dragOverTimeout) {
|
219
|
+
clearTimeout(dragOverTimeout);
|
220
|
+
}
|
221
|
+
if (uploadHandler.dropEffect && typeof uploadHandler.dropZone.effect === func) {
|
222
|
+
uploadHandler.dropZone.effect(uploadHandler.dropEffect, function () {
|
223
|
+
uploadHandler.dropZone.removeClass(uploadHandler.cssClassHighlight);
|
224
|
+
uploadHandler.dropZoneReduce();
|
225
|
+
});
|
226
|
+
} else {
|
227
|
+
uploadHandler.dropZone.removeClass(uploadHandler.cssClassHighlight);
|
228
|
+
uploadHandler.dropZoneReduce();
|
229
|
+
}
|
230
|
+
};
|
231
|
+
|
232
|
+
$.extend(this, options);
|
233
|
+
};
|
234
|
+
|
235
|
+
methods = {
|
236
|
+
init : function (options) {
|
237
|
+
return this.each(function () {
|
238
|
+
$(this).fileUpload(new UploadHandler($(this), options));
|
239
|
+
});
|
240
|
+
},
|
241
|
+
|
242
|
+
destroy : function (namespace) {
|
243
|
+
return this.each(function () {
|
244
|
+
$(this).fileUpload('destroy', namespace);
|
245
|
+
});
|
246
|
+
}
|
247
|
+
};
|
248
|
+
|
249
|
+
$.fn.fileUploadUI = function (method) {
|
250
|
+
if (methods[method]) {
|
251
|
+
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
252
|
+
} else if (typeof method === 'object' || !method) {
|
253
|
+
return methods.init.apply(this, arguments);
|
254
|
+
} else {
|
255
|
+
$.error('Method ' + method + ' does not exist on jQuery.fileUploadUI');
|
256
|
+
}
|
257
|
+
};
|
258
|
+
|
259
|
+
}(jQuery));
|
@@ -0,0 +1,475 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery File Upload Plugin 3.4
|
3
|
+
*
|
4
|
+
* Copyright 2010, Sebastian Tschan, AQUANTUM
|
5
|
+
* Licensed under the MIT license:
|
6
|
+
* http://creativecommons.org/licenses/MIT/
|
7
|
+
*
|
8
|
+
* https://blueimp.net
|
9
|
+
* http://www.aquantum.de
|
10
|
+
*/
|
11
|
+
|
12
|
+
/*jslint browser: true */
|
13
|
+
/*global File, FileReader, FormData, unescape, jQuery */
|
14
|
+
|
15
|
+
(function ($) {
|
16
|
+
|
17
|
+
var FileUpload,
|
18
|
+
methods;
|
19
|
+
|
20
|
+
FileUpload = function (container) {
|
21
|
+
var fileUpload = this,
|
22
|
+
uploadForm = (container.is('form') ? container : container.find('form').first()),
|
23
|
+
fileInput = uploadForm.find('input:file').first(),
|
24
|
+
settings = {
|
25
|
+
namespace: 'file_upload',
|
26
|
+
cssClass: 'file_upload',
|
27
|
+
dragDropSupport: true,
|
28
|
+
dropZone: container,
|
29
|
+
url: uploadForm.attr('action'),
|
30
|
+
method: uploadForm.attr('method'),
|
31
|
+
fieldName: fileInput.attr('name'),
|
32
|
+
multipart: true,
|
33
|
+
multiFileRequest: false,
|
34
|
+
formData: function () {
|
35
|
+
return uploadForm.serializeArray();
|
36
|
+
},
|
37
|
+
withCredentials: false,
|
38
|
+
forceIframeUpload: false
|
39
|
+
},
|
40
|
+
documentListeners = {},
|
41
|
+
dropZoneListeners = {},
|
42
|
+
fileInputListeners = {},
|
43
|
+
undef = 'undefined',
|
44
|
+
func = 'function',
|
45
|
+
num = 'number',
|
46
|
+
protocolRegExp = /^http(s)?:\/\//,
|
47
|
+
|
48
|
+
MultiLoader = function (callBack, numberComplete) {
|
49
|
+
var loaded = 0;
|
50
|
+
this.complete = function () {
|
51
|
+
loaded += 1;
|
52
|
+
if (loaded === numberComplete) {
|
53
|
+
callBack();
|
54
|
+
}
|
55
|
+
};
|
56
|
+
},
|
57
|
+
|
58
|
+
isXHRUploadCapable = function () {
|
59
|
+
return typeof XMLHttpRequest !== undef && typeof File !== undef && (
|
60
|
+
!settings.multipart || typeof FormData !== undef || typeof FileReader !== undef
|
61
|
+
);
|
62
|
+
},
|
63
|
+
|
64
|
+
initEventHandlers = function () {
|
65
|
+
if (settings.dragDropSupport) {
|
66
|
+
if (typeof settings.onDocumentDragEnter === func) {
|
67
|
+
documentListeners['dragenter.' + settings.namespace] = settings.onDocumentDragEnter;
|
68
|
+
}
|
69
|
+
if (typeof settings.onDocumentDragLeave === func) {
|
70
|
+
documentListeners['dragleave.' + settings.namespace] = settings.onDocumentDragLeave;
|
71
|
+
}
|
72
|
+
documentListeners['dragover.' + settings.namespace] = fileUpload.onDocumentDragOver;
|
73
|
+
documentListeners['drop.' + settings.namespace] = fileUpload.onDocumentDrop;
|
74
|
+
$(document).bind(documentListeners);
|
75
|
+
if (typeof settings.onDragEnter === func) {
|
76
|
+
dropZoneListeners['dragenter.' + settings.namespace] = settings.onDragEnter;
|
77
|
+
}
|
78
|
+
if (typeof settings.onDragLeave === func) {
|
79
|
+
dropZoneListeners['dragleave.' + settings.namespace] = settings.onDragLeave;
|
80
|
+
}
|
81
|
+
dropZoneListeners['dragover.' + settings.namespace] = fileUpload.onDragOver;
|
82
|
+
dropZoneListeners['drop.' + settings.namespace] = fileUpload.onDrop;
|
83
|
+
settings.dropZone.bind(dropZoneListeners);
|
84
|
+
}
|
85
|
+
fileInputListeners['change.' + settings.namespace] = fileUpload.onChange;
|
86
|
+
fileInput.bind(fileInputListeners);
|
87
|
+
},
|
88
|
+
|
89
|
+
removeEventHandlers = function () {
|
90
|
+
$.each(documentListeners, function (key, value) {
|
91
|
+
$(document).unbind(key, value);
|
92
|
+
});
|
93
|
+
$.each(dropZoneListeners, function (key, value) {
|
94
|
+
settings.dropZone.unbind(key, value);
|
95
|
+
});
|
96
|
+
$.each(fileInputListeners, function (key, value) {
|
97
|
+
fileInput.unbind(key, value);
|
98
|
+
});
|
99
|
+
},
|
100
|
+
|
101
|
+
initUploadEventHandlers = function (files, index, xhr, settings) {
|
102
|
+
if (typeof settings.onProgress === func) {
|
103
|
+
xhr.upload.onprogress = function (e) {
|
104
|
+
settings.onProgress(e, files, index, xhr, settings);
|
105
|
+
};
|
106
|
+
}
|
107
|
+
if (typeof settings.onLoad === func) {
|
108
|
+
xhr.onload = function (e) {
|
109
|
+
settings.onLoad(e, files, index, xhr, settings);
|
110
|
+
};
|
111
|
+
}
|
112
|
+
if (typeof settings.onAbort === func) {
|
113
|
+
xhr.onabort = function (e) {
|
114
|
+
settings.onAbort(e, files, index, xhr, settings);
|
115
|
+
};
|
116
|
+
}
|
117
|
+
if (typeof settings.onError === func) {
|
118
|
+
xhr.onerror = function (e) {
|
119
|
+
settings.onError(e, files, index, xhr, settings);
|
120
|
+
};
|
121
|
+
}
|
122
|
+
},
|
123
|
+
|
124
|
+
getFormData = function (settings) {
|
125
|
+
if (typeof settings.formData === func) {
|
126
|
+
return settings.formData();
|
127
|
+
} else if ($.isArray(settings.formData)) {
|
128
|
+
return settings.formData;
|
129
|
+
} else if (settings.formData) {
|
130
|
+
var formData = [];
|
131
|
+
$.each(settings.formData, function (name, value) {
|
132
|
+
formData.push({name: name, value: value});
|
133
|
+
});
|
134
|
+
return formData;
|
135
|
+
}
|
136
|
+
return [];
|
137
|
+
},
|
138
|
+
|
139
|
+
isSameDomain = function (url) {
|
140
|
+
if (protocolRegExp.test(url)) {
|
141
|
+
var host = location.host,
|
142
|
+
indexStart = location.protocol.length + 2,
|
143
|
+
index = url.indexOf(host, indexStart),
|
144
|
+
pathIndex = index + host.length;
|
145
|
+
if ((index === indexStart || index === url.indexOf('@', indexStart) + 1) &&
|
146
|
+
(url.length === pathIndex || $.inArray(url.charAt(pathIndex), ['/', '?', '#']) !== -1)) {
|
147
|
+
return true;
|
148
|
+
}
|
149
|
+
return false;
|
150
|
+
}
|
151
|
+
return true;
|
152
|
+
},
|
153
|
+
|
154
|
+
nonMultipartUpload = function (file, xhr, sameDomain) {
|
155
|
+
if (sameDomain) {
|
156
|
+
xhr.setRequestHeader('X-File-Name', unescape(encodeURIComponent(file.name)));
|
157
|
+
}
|
158
|
+
xhr.setRequestHeader('Content-Type', file.type);
|
159
|
+
xhr.send(file);
|
160
|
+
},
|
161
|
+
|
162
|
+
formDataUpload = function (files, xhr, settings) {
|
163
|
+
var formData = new FormData(),
|
164
|
+
i;
|
165
|
+
$.each(getFormData(settings), function (index, field) {
|
166
|
+
formData.append(field.name, field.value);
|
167
|
+
});
|
168
|
+
for (i = 0; i < files.length; i += 1) {
|
169
|
+
formData.append(settings.fieldName, files[i]);
|
170
|
+
}
|
171
|
+
xhr.send(formData);
|
172
|
+
},
|
173
|
+
|
174
|
+
loadFileContent = function (file, callBack) {
|
175
|
+
var fileReader = new FileReader();
|
176
|
+
fileReader.onload = function (e) {
|
177
|
+
file.content = e.target.result;
|
178
|
+
callBack();
|
179
|
+
};
|
180
|
+
fileReader.readAsBinaryString(file);
|
181
|
+
},
|
182
|
+
|
183
|
+
buildMultiPartFormData = function (boundary, files, fields) {
|
184
|
+
var doubleDash = '--',
|
185
|
+
crlf = '\r\n',
|
186
|
+
formData = '';
|
187
|
+
$.each(fields, function (index, field) {
|
188
|
+
formData += doubleDash + boundary + crlf +
|
189
|
+
'Content-Disposition: form-data; name="' +
|
190
|
+
unescape(encodeURIComponent(field.name)) +
|
191
|
+
'"' + crlf + crlf +
|
192
|
+
unescape(encodeURIComponent(field.value)) + crlf;
|
193
|
+
});
|
194
|
+
$.each(files, function (index, file) {
|
195
|
+
formData += doubleDash + boundary + crlf +
|
196
|
+
'Content-Disposition: form-data; name="' +
|
197
|
+
unescape(encodeURIComponent(settings.fieldName)) +
|
198
|
+
'"; filename="' + unescape(encodeURIComponent(file.name)) + '"' + crlf +
|
199
|
+
'Content-Type: ' + file.type + crlf + crlf +
|
200
|
+
file.content + crlf;
|
201
|
+
});
|
202
|
+
formData += doubleDash + boundary + doubleDash + crlf;
|
203
|
+
return formData;
|
204
|
+
},
|
205
|
+
|
206
|
+
fileReaderUpload = function (files, xhr, settings) {
|
207
|
+
var boundary = '----MultiPartFormBoundary' + (new Date()).getTime(),
|
208
|
+
loader,
|
209
|
+
i;
|
210
|
+
xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
|
211
|
+
loader = new MultiLoader(function () {
|
212
|
+
xhr.sendAsBinary(buildMultiPartFormData(
|
213
|
+
boundary,
|
214
|
+
files,
|
215
|
+
getFormData(settings)
|
216
|
+
));
|
217
|
+
}, files.length);
|
218
|
+
for (i = 0; i < files.length; i += 1) {
|
219
|
+
loadFileContent(files[i], loader.complete);
|
220
|
+
}
|
221
|
+
},
|
222
|
+
|
223
|
+
upload = function (files, index, xhr, settings) {
|
224
|
+
var sameDomain = isSameDomain(settings.url),
|
225
|
+
filesToUpload;
|
226
|
+
initUploadEventHandlers(files, index, xhr, settings);
|
227
|
+
xhr.open(settings.method, settings.url, true);
|
228
|
+
if (sameDomain) {
|
229
|
+
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
230
|
+
} else if (settings.withCredentials) {
|
231
|
+
xhr.withCredentials = true;
|
232
|
+
}
|
233
|
+
if (!settings.multipart) {
|
234
|
+
nonMultipartUpload(files[index], xhr, sameDomain);
|
235
|
+
} else {
|
236
|
+
if (typeof index === num) {
|
237
|
+
filesToUpload = [files[index]];
|
238
|
+
} else {
|
239
|
+
filesToUpload = files;
|
240
|
+
}
|
241
|
+
if (typeof FormData !== undef) {
|
242
|
+
formDataUpload(filesToUpload, xhr, settings);
|
243
|
+
} else if (typeof FileReader !== undef) {
|
244
|
+
fileReaderUpload(filesToUpload, xhr, settings);
|
245
|
+
} else {
|
246
|
+
$.error('Browser does neither support FormData nor FileReader interface');
|
247
|
+
}
|
248
|
+
}
|
249
|
+
},
|
250
|
+
|
251
|
+
handleUpload = function (event, files, index) {
|
252
|
+
var xhr = new XMLHttpRequest(),
|
253
|
+
uploadSettings = $.extend({}, settings);
|
254
|
+
if (typeof settings.initUpload === func) {
|
255
|
+
settings.initUpload(
|
256
|
+
event,
|
257
|
+
files,
|
258
|
+
index,
|
259
|
+
xhr,
|
260
|
+
uploadSettings,
|
261
|
+
function () {
|
262
|
+
upload(files, index, xhr, uploadSettings);
|
263
|
+
}
|
264
|
+
);
|
265
|
+
} else {
|
266
|
+
upload(files, index, xhr, uploadSettings);
|
267
|
+
}
|
268
|
+
},
|
269
|
+
|
270
|
+
handleFiles = function (event, files) {
|
271
|
+
var i;
|
272
|
+
if (settings.multiFileRequest) {
|
273
|
+
handleUpload(event, files);
|
274
|
+
} else {
|
275
|
+
for (i = 0; i < files.length; i += 1) {
|
276
|
+
handleUpload(event, files, i);
|
277
|
+
}
|
278
|
+
}
|
279
|
+
},
|
280
|
+
|
281
|
+
legacyUploadFormDataInit = function (input, settings) {
|
282
|
+
var formData = getFormData(settings);
|
283
|
+
uploadForm.find(':input').not(':disabled')
|
284
|
+
.attr('disabled', true)
|
285
|
+
.addClass(settings.namespace + '_disabled');
|
286
|
+
$.each(formData, function (index, field) {
|
287
|
+
$('<input type="hidden"/>')
|
288
|
+
.attr('name', field.name)
|
289
|
+
.val(field.value)
|
290
|
+
.addClass(settings.namespace + '_form_data')
|
291
|
+
.insertBefore(fileInput);
|
292
|
+
});
|
293
|
+
input.insertAfter(fileInput);
|
294
|
+
},
|
295
|
+
|
296
|
+
legacyUploadFormDataReset = function (input, settings) {
|
297
|
+
input.remove();
|
298
|
+
uploadForm.find('.' + settings.namespace + '_disabled')
|
299
|
+
.removeAttr('disabled')
|
300
|
+
.removeClass(settings.namespace + '_disabled');
|
301
|
+
uploadForm.find('.' + settings.namespace + '_form_data').remove();
|
302
|
+
},
|
303
|
+
|
304
|
+
legacyUpload = function (input, iframe, settings) {
|
305
|
+
iframe
|
306
|
+
.unbind('abort')
|
307
|
+
.bind('abort', function (e) {
|
308
|
+
iframe.readyState = 0;
|
309
|
+
// javascript:false as iframe src prevents warning popups on HTTPS in IE6
|
310
|
+
// concat is used here to prevent the "Script URL" JSLint error:
|
311
|
+
iframe.unbind('load').attr('src', 'javascript'.concat(':false;'));
|
312
|
+
if (typeof settings.onAbort === func) {
|
313
|
+
settings.onAbort(e, [{name: input.val(), type: null, size: null}], 0, iframe, settings);
|
314
|
+
}
|
315
|
+
})
|
316
|
+
.unbind('load')
|
317
|
+
.bind('load', function (e) {
|
318
|
+
iframe.readyState = 4;
|
319
|
+
if (typeof settings.onLoad === func) {
|
320
|
+
settings.onLoad(e, [{name: input.val(), type: null, size: null}], 0, iframe, settings);
|
321
|
+
}
|
322
|
+
});
|
323
|
+
uploadForm
|
324
|
+
.attr('action', settings.url)
|
325
|
+
.attr('target', iframe.attr('name'));
|
326
|
+
legacyUploadFormDataInit(input, settings);
|
327
|
+
iframe.readyState = 2;
|
328
|
+
uploadForm.get(0).submit();
|
329
|
+
legacyUploadFormDataReset(input, settings);
|
330
|
+
},
|
331
|
+
|
332
|
+
handleLegacyUpload = function (event, input) {
|
333
|
+
// javascript:false as iframe src prevents warning popups on HTTPS in IE6:
|
334
|
+
var iframe = $('<iframe src="javascript:false;" style="display:none" name="iframe_' +
|
335
|
+
settings.namespace + '_' + (new Date()).getTime() + '"></iframe>'),
|
336
|
+
uploadSettings = $.extend({}, settings);
|
337
|
+
iframe.readyState = 0;
|
338
|
+
iframe.abort = function () {
|
339
|
+
iframe.trigger('abort');
|
340
|
+
};
|
341
|
+
iframe.bind('load', function () {
|
342
|
+
iframe.unbind('load');
|
343
|
+
if (typeof settings.initUpload === func) {
|
344
|
+
settings.initUpload(
|
345
|
+
event,
|
346
|
+
[{name: input.val(), type: null, size: null}],
|
347
|
+
0,
|
348
|
+
iframe,
|
349
|
+
uploadSettings,
|
350
|
+
function () {
|
351
|
+
legacyUpload(input, iframe, uploadSettings);
|
352
|
+
}
|
353
|
+
);
|
354
|
+
} else {
|
355
|
+
legacyUpload(input, iframe, uploadSettings);
|
356
|
+
}
|
357
|
+
}).appendTo(uploadForm);
|
358
|
+
},
|
359
|
+
|
360
|
+
resetFileInput = function () {
|
361
|
+
var inputClone = fileInput.clone(true);
|
362
|
+
$('<form/>').append(inputClone).get(0).reset();
|
363
|
+
fileInput.replaceWith(inputClone);
|
364
|
+
fileInput = inputClone;
|
365
|
+
};
|
366
|
+
|
367
|
+
this.onDocumentDragOver = function (e) {
|
368
|
+
if (typeof settings.onDocumentDragOver === func &&
|
369
|
+
settings.onDocumentDragOver(e) === false) {
|
370
|
+
return false;
|
371
|
+
}
|
372
|
+
e.preventDefault();
|
373
|
+
};
|
374
|
+
|
375
|
+
this.onDocumentDrop = function (e) {
|
376
|
+
if (typeof settings.onDocumentDrop === func &&
|
377
|
+
settings.onDocumentDrop(e) === false) {
|
378
|
+
return false;
|
379
|
+
}
|
380
|
+
e.preventDefault();
|
381
|
+
};
|
382
|
+
|
383
|
+
this.onDragOver = function (e) {
|
384
|
+
if (typeof settings.onDragOver === func &&
|
385
|
+
settings.onDragOver(e) === false) {
|
386
|
+
return false;
|
387
|
+
}
|
388
|
+
var dataTransfer = e.originalEvent.dataTransfer;
|
389
|
+
if (dataTransfer) {
|
390
|
+
dataTransfer.dropEffect = dataTransfer.effectAllowed = 'copy';
|
391
|
+
}
|
392
|
+
e.preventDefault();
|
393
|
+
};
|
394
|
+
|
395
|
+
this.onDrop = function (e) {
|
396
|
+
if (typeof settings.onDrop === func &&
|
397
|
+
settings.onDrop(e) === false) {
|
398
|
+
return false;
|
399
|
+
}
|
400
|
+
var dataTransfer = e.originalEvent.dataTransfer;
|
401
|
+
if (dataTransfer && dataTransfer.files && isXHRUploadCapable()) {
|
402
|
+
handleFiles(e, dataTransfer.files);
|
403
|
+
}
|
404
|
+
e.preventDefault();
|
405
|
+
};
|
406
|
+
|
407
|
+
this.onChange = function (e) {
|
408
|
+
if (typeof settings.onChange === func &&
|
409
|
+
settings.onChange(e) === false) {
|
410
|
+
return false;
|
411
|
+
}
|
412
|
+
if (!settings.forceIframeUpload && e.target.files && isXHRUploadCapable()) {
|
413
|
+
handleFiles(e, e.target.files);
|
414
|
+
} else {
|
415
|
+
handleLegacyUpload(e, $(e.target));
|
416
|
+
}
|
417
|
+
resetFileInput();
|
418
|
+
};
|
419
|
+
|
420
|
+
this.init = function (options) {
|
421
|
+
if (options) {
|
422
|
+
$.extend(settings, options);
|
423
|
+
}
|
424
|
+
if (container.data(settings.namespace)) {
|
425
|
+
$.error('FileUpload with namespace "' + settings.namespace + '" already assigned to this element');
|
426
|
+
return;
|
427
|
+
}
|
428
|
+
container
|
429
|
+
.data(settings.namespace, fileUpload)
|
430
|
+
.addClass(settings.cssClass);
|
431
|
+
settings.dropZone.addClass(settings.cssClass);
|
432
|
+
initEventHandlers();
|
433
|
+
};
|
434
|
+
|
435
|
+
this.destroy = function () {
|
436
|
+
removeEventHandlers();
|
437
|
+
container
|
438
|
+
.removeData(settings.namespace)
|
439
|
+
.removeClass(settings.cssClass);
|
440
|
+
settings.dropZone.removeClass(settings.cssClass);
|
441
|
+
};
|
442
|
+
};
|
443
|
+
|
444
|
+
methods = {
|
445
|
+
init : function (options) {
|
446
|
+
return this.each(function () {
|
447
|
+
(new FileUpload($(this))).init(options);
|
448
|
+
});
|
449
|
+
},
|
450
|
+
|
451
|
+
destroy : function (namespace) {
|
452
|
+
return this.each(function () {
|
453
|
+
namespace = namespace ? namespace : 'file_upload';
|
454
|
+
var fileUpload = $(this).data(namespace);
|
455
|
+
if (fileUpload) {
|
456
|
+
fileUpload.destroy();
|
457
|
+
} else {
|
458
|
+
$.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
|
459
|
+
}
|
460
|
+
});
|
461
|
+
|
462
|
+
}
|
463
|
+
};
|
464
|
+
|
465
|
+
$.fn.fileUpload = function (method) {
|
466
|
+
if (methods[method]) {
|
467
|
+
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
468
|
+
} else if (typeof method === 'object' || !method) {
|
469
|
+
return methods.init.apply(this, arguments);
|
470
|
+
} else {
|
471
|
+
$.error('Method ' + method + ' does not exist on jQuery.fileUpload');
|
472
|
+
}
|
473
|
+
};
|
474
|
+
|
475
|
+
}(jQuery));
|