]> scripts.mit.edu Git - autoinstalls/wordpress.git/blob - wp-admin/js/image-edit.dev.js
Wordpress 3.2
[autoinstalls/wordpress.git] / wp-admin / js / image-edit.dev.js
1 var imageEdit;
2
3 (function($) {
4 imageEdit = {
5         iasapi : {},
6         hold : {},
7         postid : '',
8
9         intval : function(f) {
10                 return f | 0;
11         },
12
13         setDisabled : function(el, s) {
14                 if ( s ) {
15                         el.removeClass('disabled');
16                         $('input', el).removeAttr('disabled');
17                 } else {
18                         el.addClass('disabled');
19                         $('input', el).prop('disabled', true);
20                 }
21         },
22
23         init : function(postid, nonce) {
24                 var t = this, old = $('#image-editor-' + t.postid),
25                         x = t.intval( $('#imgedit-x-' + postid).val() ),
26                         y = t.intval( $('#imgedit-y-' + postid).val() );
27
28                 if ( t.postid != postid && old.length )
29                         t.close(t.postid);
30
31                 t.hold['w'] = t.hold['ow'] = x;
32                 t.hold['h'] = t.hold['oh'] = y;
33                 t.hold['xy_ratio'] = x / y;
34                 t.hold['sizer'] = parseFloat( $('#imgedit-sizer-' + postid).val() );
35                 t.postid = postid;
36                 $('#imgedit-response-' + postid).empty();
37
38                 $('input[type="text"]', '#imgedit-panel-' + postid).keypress(function(e) {
39                         var k = e.keyCode;
40
41                         if ( 36 < k && k < 41 )
42                                 $(this).blur()
43
44                         if ( 13 == k ) {
45                                 e.preventDefault();
46                                 e.stopPropagation();
47                                 return false;
48                         }
49                 });
50         },
51
52         toggleEditor : function(postid, toggle) {
53                 var wait = $('#imgedit-wait-' + postid);
54
55                 if ( toggle )
56                         wait.height( $('#imgedit-panel-' + postid).height() ).fadeIn('fast');
57                 else
58                         wait.fadeOut('fast');
59         },
60
61         toggleHelp : function(el) {
62                 $(el).siblings('.imgedit-help').slideToggle('fast');
63                 return false;
64         },
65
66         getTarget : function(postid) {
67                 return $('input[name="imgedit-target-' + postid + '"]:checked', '#imgedit-save-target-' + postid).val() || 'full';
68         },
69
70         scaleChanged : function(postid, x) {
71                 var w = $('#imgedit-scale-width-' + postid), h = $('#imgedit-scale-height-' + postid),
72                 warn = $('#imgedit-scale-warn-' + postid), w1 = '', h1 = '';
73
74                 if ( x ) {
75                         h1 = (w.val() != '') ? this.intval( w.val() / this.hold['xy_ratio'] ) : '';
76                         h.val( h1 );
77                 } else {
78                         w1 = (h.val() != '') ? this.intval( h.val() * this.hold['xy_ratio'] ) : '';
79                         w.val( w1 );
80                 }
81
82                 if ( ( h1 && h1 > this.hold['oh'] ) || ( w1 && w1 > this.hold['ow'] ) )
83                         warn.css('visibility', 'visible');
84                 else
85                         warn.css('visibility', 'hidden');
86         },
87
88         getSelRatio : function(postid) {
89                 var x = this.hold['w'], y = this.hold['h'],
90                         X = this.intval( $('#imgedit-crop-width-' + postid).val() ),
91                         Y = this.intval( $('#imgedit-crop-height-' + postid).val() );
92
93                 if ( X && Y )
94                         return X + ':' + Y;
95
96                 if ( x && y )
97                         return x + ':' + y;
98
99                 return '1:1';
100         },
101
102         filterHistory : function(postid, setSize) {
103                 // apply undo state to history
104                 var history = $('#imgedit-history-' + postid).val(), pop, n, o, i, op = [];
105
106                 if ( history != '' ) {
107                         history = JSON.parse(history);
108                         pop = this.intval( $('#imgedit-undone-' + postid).val() );
109                         if ( pop > 0 ) {
110                                 while ( pop > 0 ) {
111                                         history.pop();
112                                         pop--;
113                                 }
114                         }
115
116                         if ( setSize ) {
117                                 if ( !history.length ) {
118                                         this.hold['w'] = this.hold['ow'];
119                                         this.hold['h'] = this.hold['oh'];
120                                         return '';
121                                 }
122
123                                 // restore
124                                 o = history[history.length - 1];
125                                 o = o.c || o.r || o.f || false;
126
127                                 if ( o ) {
128                                         this.hold['w'] = o.fw;
129                                         this.hold['h'] = o.fh;
130                                 }
131                         }
132
133                         // filter the values
134                         for ( n in history ) {
135                                 i = history[n];
136                                 if ( i.hasOwnProperty('c') ) {
137                                         op[n] = { 'c': { 'x': i.c.x, 'y': i.c.y, 'w': i.c.w, 'h': i.c.h } };
138                                 } else if ( i.hasOwnProperty('r') ) {
139                                         op[n] = { 'r': i.r.r };
140                                 } else if ( i.hasOwnProperty('f') ) {
141                                         op[n] = { 'f': i.f.f };
142                                 }
143                         }
144                         return JSON.stringify(op);
145                 }
146                 return '';
147         },
148
149         refreshEditor : function(postid, nonce, callback) {
150                 var t = this, data, img;
151
152                 t.toggleEditor(postid, 1);
153                 data = {
154                         'action': 'imgedit-preview',
155                         '_ajax_nonce': nonce,
156                         'postid': postid,
157                         'history': t.filterHistory(postid, 1),
158                         'rand': t.intval(Math.random() * 1000000)
159                 };
160
161                 img = $('<img id="image-preview-' + postid + '" />');
162                 img.load( function() {
163                         var max1, max2, parent = $('#imgedit-crop-' + postid), t = imageEdit;
164
165                         parent.empty().append(img);
166
167                         // w, h are the new full size dims
168                         max1 = Math.max( t.hold.w, t.hold.h );
169                         max2 = Math.max( $(img).width(), $(img).height() );
170                         t.hold['sizer'] = max1 > max2 ? max2 / max1 : 1;
171
172                         t.initCrop(postid, img, parent);
173                         t.setCropSelection(postid, 0);
174
175                         if ( (typeof callback != "unknown") && callback != null )
176                                 callback();
177
178                         if ( $('#imgedit-history-' + postid).val() && $('#imgedit-undone-' + postid).val() == 0 )
179                                 $('input.imgedit-submit-btn', '#imgedit-panel-' + postid).removeAttr('disabled');
180                         else
181                                 $('input.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', true);
182
183                         t.toggleEditor(postid, 0);
184                 }).attr('src', ajaxurl + '?' + $.param(data));
185         },
186
187         action : function(postid, nonce, action) {
188                 var t = this, data, w, h, fw, fh;
189
190                 if ( t.notsaved(postid) )
191                         return false;
192
193                 data = {
194                         'action': 'image-editor',
195                         '_ajax_nonce': nonce,
196                         'postid': postid
197                 };
198
199                 if ( 'scale' == action ) {
200                         w = $('#imgedit-scale-width-' + postid),
201                         h = $('#imgedit-scale-height-' + postid),
202                         fw = t.intval(w.val()),
203                         fh = t.intval(h.val());
204
205                         if ( fw < 1 ) {
206                                 w.focus();
207                                 return false;
208                         } else if ( fh < 1 ) {
209                                 h.focus();
210                                 return false;
211                         }
212
213                         if ( fw == t.hold.ow || fh == t.hold.oh )
214                                 return false;
215
216                         data['do'] = 'scale';
217                         data['fwidth'] = fw;
218                         data['fheight'] = fh;
219                 } else if ( 'restore' == action ) {
220                         data['do'] = 'restore';
221                 } else {
222                         return false;
223                 }
224
225                 t.toggleEditor(postid, 1);
226                 $.post(ajaxurl, data, function(r) {
227                         $('#image-editor-' + postid).empty().append(r);
228                         t.toggleEditor(postid, 0);
229                 });
230         },
231
232         save : function(postid, nonce) {
233                 var data, target = this.getTarget(postid), history = this.filterHistory(postid, 0);
234
235                 if ( '' == history )
236                         return false;
237
238                 this.toggleEditor(postid, 1);
239                 data = {
240                         'action': 'image-editor',
241                         '_ajax_nonce': nonce,
242                         'postid': postid,
243                         'history': history,
244                         'target': target,
245                         'do': 'save'
246                 };
247
248                 $.post(ajaxurl, data, function(r) {
249                         var ret = JSON.parse(r);
250
251                         if ( ret.error ) {
252                                 $('#imgedit-response-' + postid).html('<div class="error"><p>' + ret.error + '</p><div>');
253                                 imageEdit.close(postid);
254                                 return;
255                         }
256
257                         if ( ret.fw && ret.fh )
258                                 $('#media-dims-' + postid).html( ret.fw + ' &times; ' + ret.fh );
259
260                         if ( ret.thumbnail )
261                                 $('.thumbnail', '#thumbnail-head-' + postid).attr('src', ''+ret.thumbnail);
262
263                         if ( ret.msg )
264                                 $('#imgedit-response-' + postid).html('<div class="updated"><p>' + ret.msg + '</p></div>');
265
266                         imageEdit.close(postid);
267                 });
268         },
269
270         open : function(postid, nonce) {
271                 var data, elem = $('#image-editor-' + postid), head = $('#media-head-' + postid),
272                         btn = $('#imgedit-open-btn-' + postid), spin = btn.siblings('img');
273
274                 btn.prop('disabled', true);
275                 spin.css('visibility', 'visible');
276
277                 data = {
278                         'action': 'image-editor',
279                         '_ajax_nonce': nonce,
280                         'postid': postid,
281                         'do': 'open'
282                 };
283
284                 elem.load(ajaxurl, data, function() {
285                         elem.fadeIn('fast');
286                         head.fadeOut('fast', function(){
287                                 btn.removeAttr('disabled');
288                                 spin.css('visibility', 'hidden');
289                         });
290                 });
291         },
292
293         imgLoaded : function(postid) {
294                 var img = $('#image-preview-' + postid), parent = $('#imgedit-crop-' + postid);
295
296                 this.initCrop(postid, img, parent);
297                 this.setCropSelection(postid, 0);
298                 this.toggleEditor(postid, 0);
299         },
300
301         initCrop : function(postid, image, parent) {
302                 var t = this, selW = $('#imgedit-sel-width-' + postid),
303                         selH = $('#imgedit-sel-height-' + postid);
304
305                 t.iasapi = $(image).imgAreaSelect({
306                         parent: parent,
307                         instance: true,
308                         handles: true,
309                         keys: true,
310                         minWidth: 3,
311                         minHeight: 3,
312
313                         onInit: function(img, c) {
314                                 parent.children().mousedown(function(e){
315                                         var ratio = false, sel, defRatio;
316
317                                         if ( e.shiftKey ) {
318                                                 sel = t.iasapi.getSelection();
319                                                 defRatio = t.getSelRatio(postid);
320                                                 ratio = ( sel && sel.width && sel.height ) ? sel.width + ':' + sel.height : defRatio;
321                                         }
322
323                                         t.iasapi.setOptions({
324                                                 aspectRatio: ratio
325                                         });
326                                 });
327                         },
328
329                         onSelectStart: function(img, c) {
330                                 imageEdit.setDisabled($('#imgedit-crop-sel-' + postid), 1);
331                         },
332
333                         onSelectEnd: function(img, c) {
334                                 imageEdit.setCropSelection(postid, c);
335                         },
336
337                         onSelectChange: function(img, c) {
338                                 var sizer = imageEdit.hold.sizer;
339                                 selW.val( imageEdit.round(c.width / sizer) );
340                                 selH.val( imageEdit.round(c.height / sizer) );
341                         }
342                 });
343         },
344
345         setCropSelection : function(postid, c) {
346                 var sel, min = $('#imgedit-minthumb-' + postid).val() || '128:128',
347                         sizer = this.hold['sizer'];
348                         min = min.split(':');
349                         c = c || 0;
350
351                 if ( !c || ( c.width < 3 && c.height < 3 ) ) {
352                         this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 0);
353                         this.setDisabled($('#imgedit-crop-sel-' + postid), 0);
354                         $('#imgedit-sel-width-' + postid).val('');
355                         $('#imgedit-sel-height-' + postid).val('');
356                         $('#imgedit-selection-' + postid).val('');
357                         return false;
358                 }
359
360                 if ( c.width < (min[0] * sizer) && c.height < (min[1] * sizer) ) {
361                         this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 0);
362                         $('#imgedit-selection-' + postid).val('');
363                         return false;
364                 }
365
366                 sel = { 'x': c.x1, 'y': c.y1, 'w': c.width, 'h': c.height };
367                 this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 1);
368                 $('#imgedit-selection-' + postid).val( JSON.stringify(sel) );
369         },
370
371         close : function(postid, warn) {
372                 warn = warn || false;
373
374                 if ( warn && this.notsaved(postid) )
375                         return false;
376
377                 this.iasapi = {};
378                 this.hold = {};
379                 $('#image-editor-' + postid).fadeOut('fast', function() {
380                         $('#media-head-' + postid).fadeIn('fast');
381                         $(this).empty();
382                 });
383         },
384
385         notsaved : function(postid) {
386                 var h = $('#imgedit-history-' + postid).val(),
387                         history = (h != '') ? JSON.parse(h) : new Array(),
388                         pop = this.intval( $('#imgedit-undone-' + postid).val() );
389
390                 if ( pop < history.length ) {
391                         if ( confirm( $('#imgedit-leaving-' + postid).html() ) )
392                                 return false;
393                         return true;
394                 }
395                 return false;
396         },
397
398         addStep : function(op, postid, nonce) {
399                 var t = this, elem = $('#imgedit-history-' + postid),
400                 history = (elem.val() != '') ? JSON.parse(elem.val()) : new Array(),
401                 undone = $('#imgedit-undone-' + postid),
402                 pop = t.intval(undone.val());
403
404                 while ( pop > 0 ) {
405                         history.pop();
406                         pop--;
407                 }
408                 undone.val(0); // reset
409
410                 history.push(op);
411                 elem.val( JSON.stringify(history) );
412
413                 t.refreshEditor(postid, nonce, function() {
414                         t.setDisabled($('#image-undo-' + postid), true);
415                         t.setDisabled($('#image-redo-' + postid), false);
416                 });
417         },
418
419         rotate : function(angle, postid, nonce, t) {
420                 if ( $(t).hasClass('disabled') )
421                         return false;
422
423                 this.addStep({ 'r': { 'r': angle, 'fw': this.hold['h'], 'fh': this.hold['w'] }}, postid, nonce);
424         },
425
426         flip : function (axis, postid, nonce, t) {
427                 if ( $(t).hasClass('disabled') )
428                         return false;
429
430                 this.addStep({ 'f': { 'f': axis, 'fw': this.hold['w'], 'fh': this.hold['h'] }}, postid, nonce);
431         },
432
433         crop : function (postid, nonce, t) {
434                 var sel = $('#imgedit-selection-' + postid).val(),
435                         w = this.intval( $('#imgedit-sel-width-' + postid).val() ),
436                         h = this.intval( $('#imgedit-sel-height-' + postid).val() );
437
438                 if ( $(t).hasClass('disabled') || sel == '' )
439                         return false;
440
441                 sel = JSON.parse(sel);
442                 if ( sel.w > 0 && sel.h > 0 && w > 0 && h > 0 ) {
443                         sel['fw'] = w;
444                         sel['fh'] = h;
445                         this.addStep({ 'c': sel }, postid, nonce);
446                 }
447         },
448
449         undo : function (postid, nonce) {
450                 var t = this, button = $('#image-undo-' + postid), elem = $('#imgedit-undone-' + postid),
451                         pop = t.intval( elem.val() ) + 1;
452
453                 if ( button.hasClass('disabled') )
454                         return;
455
456                 elem.val(pop);
457                 t.refreshEditor(postid, nonce, function() {
458                         var elem = $('#imgedit-history-' + postid),
459                         history = (elem.val() != '') ? JSON.parse(elem.val()) : new Array();
460
461                         t.setDisabled($('#image-redo-' + postid), true);
462                         t.setDisabled(button, pop < history.length);
463                 });
464         },
465
466         redo : function(postid, nonce) {
467                 var t = this, button = $('#image-redo-' + postid), elem = $('#imgedit-undone-' + postid),
468                         pop = t.intval( elem.val() ) - 1;
469
470                 if ( button.hasClass('disabled') )
471                         return;
472
473                 elem.val(pop);
474                 t.refreshEditor(postid, nonce, function() {
475                         t.setDisabled($('#image-undo-' + postid), true);
476                         t.setDisabled(button, pop > 0);
477                 });
478         },
479
480         setNumSelection : function(postid) {
481                 var sel, elX = $('#imgedit-sel-width-' + postid), elY = $('#imgedit-sel-height-' + postid),
482                         x = this.intval( elX.val() ), y = this.intval( elY.val() ),
483                         img = $('#image-preview-' + postid), imgh = img.height(), imgw = img.width(),
484                         sizer = this.hold['sizer'], x1, y1, x2, y2, ias = this.iasapi;
485
486                 if ( x < 1 ) {
487                         elX.val('');
488                         return false;
489                 }
490
491                 if ( y < 1 ) {
492                         elY.val('');
493                         return false;
494                 }
495
496                 if ( x && y && ( sel = ias.getSelection() ) ) {
497                         x2 = sel.x1 + Math.round( x * sizer );
498                         y2 = sel.y1 + Math.round( y * sizer );
499                         x1 = sel.x1;
500                         y1 = sel.y1;
501
502                         if ( x2 > imgw ) {
503                                 x1 = 0;
504                                 x2 = imgw;
505                                 elX.val( Math.round( x2 / sizer ) );
506                         }
507
508                         if ( y2 > imgh ) {
509                                 y1 = 0;
510                                 y2 = imgh;
511                                 elY.val( Math.round( y2 / sizer ) );
512                         }
513
514                         ias.setSelection( x1, y1, x2, y2 );
515                         ias.update();
516                         this.setCropSelection(postid, ias.getSelection());
517                 }
518         },
519
520         round : function(num) {
521                 var s;
522                 num = Math.round(num);
523
524                 if ( this.hold.sizer > 0.6 )
525                         return num;
526
527                 s = num.toString().slice(-1);
528
529                 if ( '1' == s )
530                         return num - 1;
531                 else if ( '9' == s )
532                         return num + 1;
533
534                 return num;
535         },
536
537         setRatioSelection : function(postid, n, el) {
538                 var sel, r, x = this.intval( $('#imgedit-crop-width-' + postid).val() ),
539                         y = this.intval( $('#imgedit-crop-height-' + postid).val() ),
540                         h = $('#image-preview-' + postid).height();
541
542                 if ( !this.intval( $(el).val() ) ) {
543                         $(el).val('');
544                         return;
545                 }
546
547                 if ( x && y ) {
548                         this.iasapi.setOptions({
549                                 aspectRatio: x + ':' + y
550                         });
551
552                         if ( sel = this.iasapi.getSelection(true) ) {
553                                 r = Math.ceil( sel.y1 + ((sel.x2 - sel.x1) / (x / y)) );
554
555                                 if ( r > h ) {
556                                         r = h;
557                                         if ( n )
558                                                 $('#imgedit-crop-height-' + postid).val('');
559                                         else
560                                                 $('#imgedit-crop-width-' + postid).val('');
561                                 }
562
563                                 this.iasapi.setSelection( sel.x1, sel.y1, sel.x2, r );
564                                 this.iasapi.update();
565                         }
566                 }
567         }
568 }
569 })(jQuery);