text: /**
   * @class  elFinder command "resize"
   * Open dialog to resize image
   *
   * @author Dmitry (dio) Levashov
   * @author Alexey Sukhotin
   * @author Naoki Sawada
   * @author Sergio Jovani
   **/
  elFinder.prototype.commands.resize = function() {
  	"use strict";
  	var fm = this.fm,
  		losslessRotate = 0,
  		getBounceBox = function(w, h, theta) {
  			var srcPts = [
  					{x: w/2, y: h/2},
  					{x: -w/2, y: h/2},
  					{x: -w/2, y: -h/2},
  					{x: w/2, y: -h/2}
  				],
  				dstPts = [],
  				min = {x: Number.MAX_VALUE, y: Number.MAX_VALUE},
  				max = {x: Number.MIN_VALUE, y: Number.MIN_VALUE};
  			$.each(srcPts, function(i, srcPt){
  				dstPts.push({
  					x: srcPt.x * Math.cos(theta) - srcPt.y * Math.sin(theta),
  					y: srcPt.x * Math.sin(theta) + srcPt.y * Math.cos(theta)
  				});
  			});
  			$.each(dstPts, function(i, pt) {
  				min.x = Math.min(min.x, pt.x);
  				min.y = Math.min(min.y, pt.y);
  				max.x = Math.max(max.x, pt.x);
  				max.y = Math.max(max.y, pt.y);
  			});
  			return {
  				width: max.x - min.x, height: max.y - min.y
  			};
  		};
  	
  	this.updateOnSelect = false;
  	
  	this.getstate = function() {
  		var sel = fm.selectedFiles();
  		return sel.length == 1 && sel[0].read && sel[0].write && sel[0].mime.indexOf('image/') !== -1 ? 0 : -1;
  	};
  	
  	this.resizeRequest = function(data, f, dfrd) {
  		var file = f || fm.file(data.target),
  			tmb  = file? file.tmb : null,
  			enabled = fm.isCommandEnabled('resize', data.target);
  		
  		if (enabled && (! file || (file && file.read && file.write && file.mime.indexOf('image/') !== -1 ))) {
  			return fm.request({
  				data : Object.assign(data, {
  					cmd : 'resize'
  				}),
  				notify : {type : 'resize', cnt : 1}
  			})
  			.fail(function(error) {
  				if (dfrd) {
  					dfrd.reject(error);
  				}
  			})
  			.done(function() {
  				if (data.quality) {
  					fm.storage('jpgQuality', data.quality === fm.option('jpgQuality')? null : data.quality);
  				}
  				dfrd && dfrd.resolve();
  			});
  		} else {
  			var error;
  			
  			if (file) {
  				if (file.mime.indexOf('image/') === -1) {
  					error = ['errResize', file.name, 'errUsupportType'];
  				} else {
  					error = ['errResize', file.name, 'errPerm'];
  				}
  			} else {
  				error = ['errResize', data.target, 'errPerm'];
  			}
  			
  			if (dfrd) {
  				dfrd.reject(error);
  			} else {
  				fm.error(error);
  			}
  			return $.Deferred().reject(error);
  		}
  	};
  	
  	this.exec = function(hashes) {
  		var self  = this,
  			files = this.files(hashes),
  			dfrd  = $.Deferred(),
  			api2  = (fm.api > 1),
  			options = this.options,
  			dialogWidth = 650,
  			fmnode = fm.getUI(),
  			ctrgrup = $().controlgroup? 'controlgroup' : 'buttonset',
  			grid8Def = typeof options.grid8px === 'undefined' || options.grid8px !== 'disable'? true : false,
  			presetSize = Array.isArray(options.presetSize)? options.presetSize : [],
  			clactive = 'elfinder-dialog-active',
  			clsediting = fm.res('class', 'editing'),
  			open = function(file, id, src) {
  				var isJpeg   = (file.mime === 'image/jpeg'),
  					dialog   = $('<div class="elfinder-resize-container"></div>'),
  					input    = '<input type="number" class="ui-corner-all"/>',
  					row      = '<div class="elfinder-resize-row"></div>',
  					label    = '<div class="elfinder-resize-label"></div>',
  					changeTm = null,
  					operate  = false,
  					opStart  = function() { operate = true; },
  					opStop   = function() {
  						if (operate) {
  							operate = false;
  							control.trigger('change');
  						}
  					},
  					control  = $('<div class="elfinder-resize-control"></div>')
  						.on('focus', 'input[type=text],input[type=number]', function() {
  							$(this).trigger('select');
  						})
  						.on('change', function() {
  							changeTm && cancelAnimationFrame(changeTm);
  							changeTm = requestAnimationFrame(function() {
  								var panel, quty, canvas, ctx, img, sx, sy, sw, sh, deg, theta, bb;
  								if (sizeImg && ! operate && (canvas = sizeImg.data('canvas'))) {
  									panel = control.children('div.elfinder-resize-control-panel:visible');
  									quty = panel.find('input.elfinder-resize-quality');
  									if (quty.is(':visible')) {
  										ctx = sizeImg.data('ctx');
  										img = sizeImg.get(0);
  										if (panel.hasClass('elfinder-resize-uiresize')) {
  											// resize
  											sw = canvas.width = width.val();
  											sh = canvas.height = height.val();
  											ctx.drawImage(img, 0, 0, sw, sh);
  										} else if (panel.hasClass('elfinder-resize-uicrop')) {
  											// crop
  											sx = pointX.val();
  											sy = pointY.val();
  											sw = offsetX.val();
  											sh = offsetY.val();
  											canvas.width = sw;
  											canvas.height = sh;
  											ctx.drawImage(img, sx, sy, sw, sh, 0, 0, sw, sh);
  										} else {
  											// rotate
  											deg = degree.val();
  											theta = (degree.val() * Math.PI) / 180;
  											bb = getBounceBox(owidth, oheight, theta);
  											sw = canvas.width = bb.width;
  											sh = canvas.height = bb.height;
  											ctx.save();
  											if (deg % 90 !== 0) {
  												ctx.fillStyle = bg.val() || '#FFF';
  												ctx.fillRect(0, 0, sw, sh);
  											}
  											ctx.translate(sw / 2, sh / 2);
  											ctx.rotate(theta);
  											ctx.drawImage(img, -img.width/2, -img.height/2, owidth, oheight);
  											ctx.restore();
  										}
  										canvas.toBlob(function(blob) {
  											blob && quty.next('span').text(' (' + fm.formatSize(blob.size) + ')');
  										}, 'image/jpeg', Math.max(Math.min(quty.val(), 100), 1) / 100);
  									}
  								}
  							});
  						})
  						.on('mouseup', 'input', function(e) {
  							$(e.target).trigger('change');
  						}),
  					preview  = $('<div class="elfinder-resize-preview"></div>')
  						.on('touchmove', function(e) {
  							if ($(e.target).hasClass('touch-punch')) {
  								e.stopPropagation();
  								e.preventDefault();
  							}
  						}),
  					spinner  = $('<div class="elfinder-resize-loading">'+fm.i18n('ntfloadimg')+'</div>'),
  					rhandle  = $('<div class="elfinder-resize-handle touch-punch"></div>'),
  					rhandlec = $('<div class="elfinder-resize-handle touch-punch"></div>'),
  					uiresize = $('<div class="elfinder-resize-uiresize elfinder-resize-control-panel"></div>'),
  					uicrop   = $('<div class="elfinder-resize-uicrop elfinder-resize-control-panel"></div>'),
  					uirotate = $('<div class="elfinder-resize-rotate elfinder-resize-control-panel"></div>'),
  					uideg270 = $('<button></button>').attr('title',fm.i18n('rotate-cw')).append($('<span class="elfinder-button-icon elfinder-button-icon-rotate-l"></span>')),
  					uideg90  = $('<button></button>').attr('title',fm.i18n('rotate-ccw')).append($('<span class="elfinder-button-icon elfinder-button-icon-rotate-r"></span>')),
  					uiprop   = $('<span ></span>'),
  					reset    = $('<button class="elfinder-resize-reset">').text(fm.i18n('reset'))
  						.on('click', function() {
  							resetView();
  						})
  						.button({
  							icons: {
  								primary: 'ui-icon-arrowrefresh-1-n'
  							},
  							text: false
  						}),
  					uitype   = $('<div class="elfinder-resize-type"></div>')
  						.append('<input type="radio" name="type" id="'+id+'-resize" value="resize" checked="checked" /><label for="'+id+'-resize">'+fm.i18n('resize')+'</label>',
  						'<input class="api2" type="radio" name="type" id="'+id+'-crop" value="crop" /><label class="api2" for="'+id+'-crop">'+fm.i18n('crop')+'</label>',
  						'<input class="api2" type="radio" name="type" id="'+id+'-rotate" value="rotate" /><label class="api2" for="'+id+'-rotate">'+fm.i18n('rotate')+'</label>'),
  					mode     = 'resize',
  					type     = uitype[ctrgrup]()[ctrgrup]('disable').find('input')
  						.on('change', function() {
  							mode = $(this).val();
  							
  							resetView();
  							resizable(true);
  							croppable(true);
  							rotateable(true);
  							
  							if (mode == 'resize') {
  								uiresize.show();
  								uirotate.hide();
  								uicrop.hide();
  								resizable();
  								isJpeg && grid8px.insertAfter(uiresize.find('.elfinder-resize-grid8'));
  							}
  							else if (mode == 'crop') {
  								uirotate.hide();
  								uiresize.hide();
  								uicrop.show();
  								croppable();
  								isJpeg && grid8px.insertAfter(uicrop.find('.elfinder-resize-grid8'));
  							} else if (mode == 'rotate') {
  								uiresize.hide();
  								uicrop.hide();
  								uirotate.show();
  								rotateable();
  							}
  						}),
  					width   = $(input)
  						.on('change', function() {
  							var w = round(parseInt(width.val())),
  								h = round(cratio ? w/ratio : parseInt(height.val()));
  
  							if (w > 0 && h > 0) {
  								resize.updateView(w, h);
  								width.val(w);
  								height.val(h);
  							}
  						}).addClass('elfinder-focus'),
  					height  = $(input)
  						.on('change', function() {
  							var h = round(parseInt(height.val())),
  								w = round(cratio ? h*ratio : parseInt(width.val()));
  
  							if (w > 0 && h > 0) {
  								resize.updateView(w, h);
  								width.val(w);
  								height.val(h);
  							}
  						}),
  					pointX  = $(input).on('change', function(){crop.updateView();}),
  					pointY  = $(input).on('change', function(){crop.updateView();}),
  					offsetX = $(input).on('change', function(){crop.updateView('w');}),
  					offsetY = $(input).on('change', function(){crop.updateView('h');}),
  					quality = isJpeg && api2?
  						$(input).val(fm.storage('jpgQuality') > 0? fm.storage('jpgQuality') : fm.option('jpgQuality'))
  							.addClass('elfinder-resize-quality')
  							.attr('min', '1').attr('max', '100').attr('title', '1 - 100')
  							.on('blur', function(){
  								var q = Math.min(100, Math.max(1, parseInt(this.value)));
  								control.find('input.elfinder-resize-quality').val(q);
  							})
  						: null,
  					degree = $('<input type="number" class="ui-corner-all" maxlength="3" value="0" />')
  						.on('change', function() {
  							rotate.update();
  						}),
  					uidegslider = $('<div class="elfinder-resize-rotate-slider touch-punch"></div>')
  						.slider({
  							min: 0,
  							max: 360,
  							value: degree.val(),
  							animate: true,
  							start: opStart,
  							stop: opStop,
  							change: function(event, ui) {
  								if (ui.value != uidegslider.slider('value')) {
  									rotate.update(ui.value);
  								}
  							},
  							slide: function(event, ui) {
  								rotate.update(ui.value, false);
  							}
  						}).find('.ui-slider-handle')
  							.addClass('elfinder-tabstop')
  							.off('keydown')
  							.on('keydown', function(e) {
  								if (e.keyCode == $.ui.keyCode.LEFT || e.keyCode == $.ui.keyCode.RIGHT) {
  									e.stopPropagation();
  									e.preventDefault();
  									rotate.update(Number(degree.val()) + (e.keyCode == $.ui.keyCode.RIGHT? 1 : -1), false);
  								}
  							})
  						.end(),
  					pickimg,
  					pickcanv,
  					pickctx,
  					pickc = {},
  					pick = function(e) {
  						var color, r, g, b, h, s, l;
  
  						try {
  							color = pickc[Math.round(e.offsetX)][Math.round(e.offsetY)];
  						} catch(e) {}
  						if (!color) return;
  
  						r = color[0]; g = color[1]; b = color[2];
  						h = color[3]; s = color[4]; l = color[5];
  
  						setbg(r, g, b, (e.type === 'click'));
  					},
  					palpick = function(e) {
  						setbg($(this).css('backgroundColor'), '', '', (e.type === 'click'));
  					},
  					setbg = function(r, g, b, off) {
  						var s, m, cc;
  						if (typeof r === 'string') {
  							g = '';
  							if (r && (s = $('<span>').css('backgroundColor', r).css('backgroundColor')) && (m = s.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i))) {
  								r = Number(m[1]);
  								g = Number(m[2]);
  								b = Number(m[3]);
  							}
  						}
  						cc = (g === '')? r : '#' + getColorCode(r, g, b);
  						bg.val(cc).css({ backgroundColor: cc, backgroundImage: 'none', color: (r+g+b < 384? '#fff' : '#000') });
  						preview.css('backgroundColor', cc);
  						if (off) {
  							imgr.off('.picker').removeClass('elfinder-resize-picking');
  							pallet.off('.picker').removeClass('elfinder-resize-picking');
  						}
  					},
  					getColorCode = function(r, g, b) {
  						return $.map([r,g,b], function(c){return ('0'+parseInt(c).toString(16)).slice(-2);}).join('');
  					},
  					picker = $('<button>').text(fm.i18n('colorPicker'))
  					.on('click', function() { 
  						imgr.on('mousemove.picker click.picker', pick).addClass('elfinder-resize-picking');
  						pallet.on('mousemove.picker click.picker', 'span', palpick).addClass('elfinder-resize-picking');
  					})
  					.button({
  						icons: {
  							primary: 'ui-icon-pin-s'
  						},
  						text: false
  					}),
  					reseter = $('<button>').text(fm.i18n('reset'))
  						.on('click', function() { 
  							setbg('', '', '', true);
  						})
  						.button({
  							icons: {
  								primary: 'ui-icon-arrowrefresh-1-n'
  							},
  							text: false
  						}),
  					bg = $('<input class="ui-corner-all elfinder-resize-bg" type="text">')
  						.on('focus', function() {
  							$(this).attr('style', '');
  						})
  						.on('blur', function() {
  							setbg($(this).val());
  						}),
  					pallet  = $('<div class="elfinder-resize-pallet">').on('click', 'span', function() {
  						setbg($(this).css('backgroundColor'));
  					}),
  					ratio   = 1,
  					prop    = 1,
  					owidth  = 0,
  					oheight = 0,
  					cratio  = true,
  					cratioc = false,
  					pwidth  = 0,
  					pheight = 0,
  					rwidth  = 0,
  					rheight = 0,
  					rdegree = 0,
  					grid8   = isJpeg? grid8Def : false,
  					constr  = $('<button>').html(fm.i18n('aspectRatio'))
  						.on('click', function() {
  							cratio = ! cratio;
  							constr.button('option', {
  								icons : { primary: cratio? 'ui-icon-locked' : 'ui-icon-unlocked'}
  							});
  							resize.fixHeight();
  							rhandle.resizable('option', 'aspectRatio', cratio).data('uiResizable')._aspectRatio = cratio;
  						})
  						.button({
  							icons : {
  								primary: cratio? 'ui-icon-locked' : 'ui-icon-unlocked'
  							},
  							text: false
  						}),
  					constrc = $('<button>').html(fm.i18n('aspectRatio'))
  						.on('click', function() {
  							cratioc = ! cratioc;
  							constrc.button('option', {
  								icons : { primary: cratioc? 'ui-icon-locked' : 'ui-icon-unlocked'}
  							});
  							rhandlec.resizable('option', 'aspectRatio', cratioc).data('uiResizable')._aspectRatio = cratioc;
  						})
  						.button({
  							icons : {
  								primary: cratioc? 'ui-icon-locked' : 'ui-icon-unlocked'
  							},
  							text: false
  						}),
  					grid8px = $('<button>').html(fm.i18n(grid8? 'enabled' : 'disabled')).toggleClass('ui-state-active', grid8)
  						.on('click', function() {
  							grid8 = ! grid8;
  							grid8px.html(fm.i18n(grid8? 'enabled' : 'disabled')).toggleClass('ui-state-active', grid8);
  							setStep8();
  						})
  						.button(),
  					setStep8 = function() {
  						var step = grid8? 8 : 1;
  						$.each([width, height, offsetX, offsetY, pointX, pointY], function() {
  							this.attr('step', step);
  						});
  						if (grid8) {
  							width.val(round(width.val()));
  							height.val(round(height.val()));
  							offsetX.val(round(offsetX.val()));
  							offsetY.val(round(offsetY.val()));
  							pointX.val(round(pointX.val()));
  							pointY.val(round(pointY.val()));
  							if (uiresize.is(':visible')) {
  								resize.updateView(width.val(), height.val());
  							} else if (uicrop.is(':visible')) {
  								crop.updateView();
  							}
  						}
  					},
  					setuprimg = function() {
  						var r_scale,
  							fail = function() {
  								bg.parent().hide();
  								pallet.hide();
  							};
  						r_scale = Math.min(pwidth, pheight) / Math.sqrt(Math.pow(owidth, 2) + Math.pow(oheight, 2));
  						rwidth = Math.ceil(owidth * r_scale);
  						rheight = Math.ceil(oheight * r_scale);
  						imgr.width(rwidth)
  							.height(rheight)
  							.css('margin-top', (pheight-rheight)/2 + 'px')
  							.css('margin-left', (pwidth-rwidth)/2 + 'px');
  						if (imgr.is(':visible') && bg.is(':visible')) {
  							if (file.mime !== 'image/png') {
  								preview.css('backgroundColor', bg.val());
  								pickimg = $('<img>');
  								if (fm.isCORS) {
  									pickimg.attr('crossorigin', 'use-credentials');
  								}
  								pickimg.on('load', function() {
  									if (pickcanv && pickcanv.width !== rwidth) {
  										setColorData();
  									}
  								})
  								.on('error', fail)
  								.attr('src', canvSrc);
  							} else {
  								fail();
  							}
  						}
  					},
  					setupimg = function() {
  						resize.updateView(owidth, oheight);
  						setuprimg();
  						basec
  							.width(img.width())
  							.height(img.height());
  						imgc
  							.width(img.width())
  							.height(img.height());
  						crop.updateView();
  						jpgCalc();
  					},
  					setColorData = function() {
  						if (pickctx) {
  							var n, w, h, r, g, b, a, s, l, hsl, hue,
  								data, scale, tx1, tx2, ty1, ty2, rgb,
  								domi = {},
  								domic = [],
  								domiv, palc,
  								rgbToHsl = function (r, g, b) {
  									var h, s, l,
  										max = Math.max(Math.max(r, g), b),
  										min = Math.min(Math.min(r, g), b);
  		
  									// Hue, 0 ~ 359
  									if (max === min) {
  										h = 0;
  									} else if (r === max) {
  										h = ((g - b) / (max - min) * 60 + 360) % 360;
  									} else if (g === max) {
  										h = (b - r) / (max - min) * 60 + 120;
  									} else if (b === max) {
  										h = (r - g) / (max - min) * 60 + 240;
  									}
  									// Saturation, 0 ~ 1
  									s = (max - min) / max;
  									// Lightness, 0 ~ 1
  									l = (r *  0.3 + g * 0.59 + b * 0.11) / 255;
  		
  									return [h, s, l, 'hsl'];
  								},
  								rgbRound = function(c) {
  									return Math.round(c / 8) * 8;
  								};
  							
  							calc:
  							try {
  								w = pickcanv.width = imgr.width();
  								h = pickcanv.height = imgr.height();
  								scale = w / owidth;
  								pickctx.scale(scale, scale);
  								pickctx.drawImage(pickimg.get(0), 0, 0);
  			
  								data = pickctx.getImageData(0, 0, w, h).data;
  			
  								// Range to detect the dominant color
  								tx1 = w * 0.1;
  								tx2 = w * 0.9;
  								ty1 = h * 0.1;
  								ty2 = h * 0.9;
  			
  								for (var y = 0; y < h - 1; y++) {
  									for (var x = 0; x < w - 1; x++) {
  										n = x * 4 + y * w * 4;
  										// RGB
  										r = data[n]; g = data[n + 1]; b = data[n + 2]; a = data[n + 3];
  										// check alpha ch
  										if (a !== 255) {
  											bg.parent().hide();
  											pallet.hide();
  											break calc;
  										}
  										// HSL
  										hsl = rgbToHsl(r, g, b);
  										hue = Math.round(hsl[0]); s = Math.round(hsl[1] * 100); l = Math.round(hsl[2] * 100);
  										if (! pickc[x]) {
  											pickc[x] = {};
  										}
  										// set pickc
  										pickc[x][y] = [r, g, b, hue, s, l];
  										// detect the dominant color
  										if ((x < tx1 || x > tx2) && (y < ty1 || y > ty2)) {
  											rgb = rgbRound(r) + ',' + rgbRound(g) + ',' + rgbRound(b);
  											if (! domi[rgb]) {
  												domi[rgb] = 1;
  											} else {
  												++domi[rgb];
  											}
  										}
  									}
  								}
  								
  								if (! pallet.children(':first').length) {
  									palc = 1;
  									$.each(domi, function(c, v) {
  										domic.push({c: c, v: v});
  									});
  									$.each(domic.sort(function(a, b) {
  										return (a.v > b.v)? -1 : 1;
  									}), function() {
  										if (this.v < 2 || palc > 10) {
  											return false;
  										}
  										pallet.append($('<span style="width:20px;height:20px;display:inline-block;background-color:rgb('+this.c+');">'));
  										++palc;
  									});
  								}
  							} catch(e) {
  								picker.hide();
  								pallet.hide();
  							}
  						}
  					},
  					setupPicker = function() {
  						try {
  							pickcanv = document.createElement('canvas');
  							pickctx = pickcanv.getContext('2d');
  						} catch(e) {
  							picker.hide();
  							pallet.hide();
  						}
  					},
  					setupPreset = function() {
  						preset.on('click', 'span.elfinder-resize-preset', function() {
  							var btn = $(this),
  								w = btn.data('s')[0],
  								h = btn.data('s')[1],
  								r = owidth / oheight;
  							btn.data('s', [h, w]).text(h + 'x' + w);
  							if (owidth > w || oheight > h) {
  								if (owidth <= w) {
  									w = round(h * r);
  								} else if (oheight <= h) {
  									h = round(w / r);
  								} else {
  									if (owidth - w > oheight - h) {
  										h = round(w / r);
  									} else {
  										w = round(h * r);
  									}
  								}
  							} else {
  								w = owidth;
  								h = oheight;
  							}
  							width.val(w);
  							height.val(h);
  							resize.updateView(w, h);
  							jpgCalc();
  						});
  						presetc.on('click', 'span.elfinder-resize-preset', function() {
  							var btn = $(this),
  								w = btn.data('s')[0],
  								h = btn.data('s')[1],
  								x = pointX.val(),
  								y = pointY.val();
  							
  							btn.data('s', [h, w]).text(h + 'x' + w);
  							if (owidth >= w && oheight >= h) {
  								if (owidth - w - x < 0) {
  									x = owidth - w;
  								}
  								if (oheight - h - y < 0) {
  									y = oheight - h;
  								}
  								pointX.val(x);
  								pointY.val(y);
  								offsetX.val(w);
  								offsetY.val(h);
  								crop.updateView();
  								jpgCalc();
  							}
  						});
  						presetc.children('span.elfinder-resize-preset').each(function() {
  							var btn = $(this),
  								w = btn.data('s')[0],
  								h = btn.data('s')[1];
  							
  							btn[(owidth >= w && oheight >= h)? 'show' : 'hide']();
  						});
  					},
  					dimreq  = null,
  					inited  = false,
  					setdim  = function(dim) {
  						var rfile = fm.file(file.hash);
  						rfile.width = dim[0];
  						rfile.height = dim[1];
  					},
  					init    = function() {
  						var elm, memSize, r_scale, imgRatio;
  						
  						if (inited) {
  							return;
  						}
  						inited = true;
  						dimreq && dimreq.state && dimreq.state() === 'pending' && dimreq.reject();
  						
  						// check lossless rotete
  						if (fm.api >= 2.1030) {
  							if (losslessRotate === 0) {
  								fm.request({
  									data: {
  										cmd    : 'resize',
  										target : file.hash,
  										degree : 0,
  										mode   : 'rotate'
  									},
  									preventDefault : true
  								}).done(function(data) {
  									losslessRotate = data.losslessRotate? 1 : -1;
  									if (losslessRotate === 1 && (degree.val() % 90 === 0)) {
  										uirotate.children('div.elfinder-resize-quality').hide();
  									}
  								}).fail(function() {
  									losslessRotate = -1;
  								});
  							}
  						} else {
  							losslessRotate = -1;
  						}
  						
  						elm = img.get(0);
  						memSize = file.width && file.height? {w: file.width, h: file.height} : (elm.naturalWidth? null : {w: img.width(), h: img.height()});
  					
  						memSize && img.removeAttr('width').removeAttr('height');
  						
  						owidth  = file.width || elm.naturalWidth || elm.width || img.width();
  						oheight = file.height || elm.naturalHeight || elm.height || img.height();
  						if (!file.width || !file.height) {
  							setdim([owidth, oheight]);
  						}
  						
  						memSize && img.width(memSize.w).height(memSize.h);
  						
  						dMinBtn.show();
  	
  						imgRatio = oheight / owidth;
  						
  						if (imgRatio < 1 && preview.height() > preview.width() * imgRatio) {
  							preview.height(preview.width() * imgRatio);
  						}
  						
  						if (preview.height() > img.height() + 20) {
  							preview.height(img.height() + 20);
  						}
  						
  						pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
  						
  						spinner.remove();
  						
  						ratio = owidth/oheight;
  	
  						rhandle.append(img.show()).show();
  						width.val(owidth);
  						height.val(oheight);
  	
  						setupPicker();
  						setupPreset();
  						setupimg();
  						
  						uitype[ctrgrup]('enable');
  						control.find('input,select').prop('disabled', false)
  							.filter(':text').on('keydown', function(e) {
  								var cOpts;
  								if (e.keyCode == $.ui.keyCode.ENTER) {
  									e.stopPropagation();
  									e.preventDefault();
  									cOpts = {
  										title  : $('input:checked', uitype).val(),
  										text   : 'confirmReq',
  										accept : {
  											label    : 'btnApply',
  											callback : function() {  
  												save();
  											}
  										},
  										cancel : {
  											label    : 'btnCancel',
  											callback : function(){
  												$(this).trigger('focus');
  											}
  										}
  									};
  										
  									if (useSaveAs) {
  										cOpts['buttons'] = [{
  											label    : 'btnSaveAs',
  											callback : function() {
  												requestAnimationFrame(saveAs);
  											}
  										}];
  									}
  									fm.confirm(cOpts);
  									return;
  								}
  							})
  							.on('keyup', function() {
  								var $this = $(this);
  								if (! $this.hasClass('elfinder-resize-bg')) {
  									requestAnimationFrame(function() {
  										$this.val($this.val().replace(/[^0-9]/g, ''));
  									});
  								}
  							})
  							.filter(':first');
  						
  						setStep8();
  						!fm.UA.Mobile && width.trigger('focus');
  						resizable();
  					},
  					img     = $('<img/>')
  						.on('load', init)
  						.on('error', function() {
  							spinner.html(fm.i18n('ntfsmth')).css('background', 'transparent');
  						}),
  					basec = $('<div></div>'),
  					imgc = $('<img/>'),
  					coverc = $('<div></div>'),
  					imgr = $('<img class="elfinder-resize-imgrotate" />'),
  					round = function(v, max) {
  						v = grid8? Math.round(v/8)*8 : Math.round(v);
  						v = Math.max(0, v);
  						if (max && v > max) {
  							v = grid8? Math.floor(max/8)*8 : max;
  						}
  						return v;
  					},
  					resetView = function() {
  						width.val(owidth);
  						height.val(oheight);
  						resize.updateView(owidth, oheight);
  						pointX.val(0);
  						pointY.val(0);
  						offsetX.val(owidth);
  						offsetY.val(oheight);
  						crop.updateView();
  						jpgCalc();
  					},
  					resize = {
  						update : function() {
  							width.val(round(img.width()/prop));
  							height.val(round(img.height()/prop));
  							jpgCalc();
  						},
  						
  						updateView : function(w, h) {
  							if (w > pwidth || h > pheight) {
  								if (w / pwidth > h / pheight) {
  									prop = pwidth / w;
  									img.width(pwidth).height(round(h*prop));
  								} else {
  									prop = pheight / h;
  									img.height(pheight).width(round(w*prop));
  								}
  							} else {
  								img.width(round(w)).height(round(h));
  							}
  							
  							prop = img.width()/w;
  							uiprop.text('1 : '+(1/prop).toFixed(2));
  							resize.updateHandle();
  						},
  						
  						updateHandle : function() {
  							rhandle.width(img.width()).height(img.height());
  						},
  						fixHeight : function() {
  							var w, h;
  							if (cratio) {
  								w = width.val();
  								h = round(w/ratio);
  								resize.updateView(w, h);
  								height.val(h);
  							}
  						}
  					},
  					crop = {
  						update : function(change) {
  							pointX.val(round(((rhandlec.data('x')||rhandlec.position().left))/prop, owidth));
  							pointY.val(round(((rhandlec.data('y')||rhandlec.position().top))/prop, oheight));
  							if (change !== 'xy') {
  								offsetX.val(round((rhandlec.data('w')||rhandlec.width())/prop, owidth - pointX.val()));
  								offsetY.val(round((rhandlec.data('h')||rhandlec.height())/prop, oheight - pointY.val()));
  							}
  							jpgCalc();
  						},
  						updateView : function(change) {
  							var r, x, y, w, h;
  							
  							pointX.val(round(pointX.val(), owidth - (grid8? 8 : 1)));
  							pointY.val(round(pointY.val(), oheight - (grid8? 8 : 1)));
  							offsetX.val(round(offsetX.val(), owidth - pointX.val()));
  							offsetY.val(round(offsetY.val(), oheight - pointY.val()));
  							
  							if (cratioc) {
  								r = coverc.width() / coverc.height();
  								if (change === 'w') {
  									offsetY.val(round(parseInt(offsetX.val()) / r));
  								} else if (change === 'h') {
  									offsetX.val(round(parseInt(offsetY.val()) * r));
  								}
  							}
  							x = Math.round(parseInt(pointX.val()) * prop);
  							y = Math.round(parseInt(pointY.val()) * prop);
  							if (change !== 'xy') {
  								w = Math.round(parseInt(offsetX.val()) * prop);
  								h = Math.round(parseInt(offsetY.val()) * prop);
  							} else {
  								w = rhandlec.data('w');
  								h = rhandlec.data('h');
  							}
  							rhandlec.data({x: x, y: y, w: w, h: h})
  								.width(w)
  								.height(h)
  								.css({left: x, top: y});
  							coverc.width(w)
  								.height(h);
  						},
  						resize_update : function(e, ui) {
  							rhandlec.data({x: ui.position.left, y: ui.position.top, w: ui.size.width, h: ui.size.height});
  							crop.update();
  							crop.updateView();
  						},
  						drag_update : function(e, ui) {
  							rhandlec.data({x: ui.position.left, y: ui.position.top});
  							crop.update('xy');
  						}
  					},
  					rotate = {
  						mouseStartAngle : 0,
  						imageStartAngle : 0,
  						imageBeingRotated : false,
  						
  						setQuality : function() {
  							uirotate.children('div.elfinder-resize-quality')[(losslessRotate > 0 && (degree.val() % 90) === 0)? 'hide' : 'show']();
  						},
  						
  						update : function(value, animate) {
  							if (typeof value == 'undefined') {
  								rdegree = value = parseInt(degree.val());
  							}
  							if (typeof animate == 'undefined') {
  								animate = true;
  							}
  							if (! animate || fm.UA.Opera || fm.UA.ltIE8) {
  								imgr.rotate(value);
  							} else {
  								imgr.animate({rotate: value + 'deg'});
  							}
  							value = value % 360;
  							if (value < 0) {
  								value += 360;
  							}
  							degree.val(parseInt(value));
  
  							uidegslider.slider('value', degree.val());
  							
  							rotate.setQuality();
  						},
  						
  						execute : function ( e ) {
  							
  							if ( !rotate.imageBeingRotated ) return;
  							
  							var imageCentre = rotate.getCenter( imgr );
  							var ev = e.originalEvent.touches? e.originalEvent.touches[0] : e;
  							var mouseXFromCentre = ev.pageX - imageCentre[0];
  							var mouseYFromCentre = ev.pageY - imageCentre[1];
  							var mouseAngle = Math.atan2( mouseYFromCentre, mouseXFromCentre );
  							
  							var rotateAngle = mouseAngle - rotate.mouseStartAngle + rotate.imageStartAngle;
  							rotateAngle = Math.round(parseFloat(rotateAngle) * 180 / Math.PI);
  							
  							if ( e.shiftKey ) {
  								rotateAngle = Math.round((rotateAngle + 6)/15) * 15;
  							}
  							
  							imgr.rotate(rotateAngle);
  							
  							rotateAngle = rotateAngle % 360;
  							if (rotateAngle < 0) {
  								rotateAngle += 360;
  							}
  							degree.val(rotateAngle);
  
  							uidegslider.slider('value', degree.val());
  							
  							rotate.setQuality();
  							
  							return false;
  						},
  						
  						start : function ( e ) {
  							if (imgr.hasClass('elfinder-resize-picking')) {
  								return;
  							}
  							
  							opStart();
  							rotate.imageBeingRotated = true;
  							
  							var imageCentre = rotate.getCenter( imgr );
  							var ev = e.originalEvent.touches? e.originalEvent.touches[0] : e;
  							var mouseStartXFromCentre = ev.pageX - imageCentre[0];
  							var mouseStartYFromCentre = ev.pageY - imageCentre[1];
  							rotate.mouseStartAngle = Math.atan2( mouseStartYFromCentre, mouseStartXFromCentre );
  							
  							rotate.imageStartAngle = parseFloat(imgr.rotate()) * Math.PI / 180.0;
  							
  							$(document).on('mousemove', rotate.execute);
  							imgr.on('touchmove', rotate.execute);
  							
  							return false;
  						},
  							
  						stop : function ( e ) {
  							
  							if ( !rotate.imageBeingRotated ) return;
  							
  							$(document).off('mousemove', rotate.execute);
  							imgr.off('touchmove', rotate.execute);
  							
  							requestAnimationFrame(function() { rotate.imageBeingRotated = false; });
  							opStop();
  							
  							return false;
  						},
  						
  						getCenter : function ( image ) {
  							
  							var currentRotation = imgr.rotate();
  							imgr.rotate(0);
  							
  							var imageOffset = imgr.offset();
  							var imageCentreX = imageOffset.left + imgr.width() / 2;
  							var imageCentreY = imageOffset.top + imgr.height() / 2;
  							
  							imgr.rotate(currentRotation);
  							
  							return Array( imageCentreX, imageCentreY );
  						}
  					},
  					resizable = function(destroy) {
  						if (destroy) {
  							rhandle.filter(':ui-resizable').resizable('destroy');
  							rhandle.hide();
  						}
  						else {
  							rhandle.show();
  							rhandle.resizable({
  								alsoResize  : img,
  								aspectRatio : cratio,
  								resize      : resize.update,
  								start       : opStart,
  								stop        : function(e) {
  									resize.fixHeight;
  									resize.updateView(width.val(), height.val());
  									opStop();
  								}
  							});
  							dinit();
  						}
  					},
  					croppable = function(destroy) {
  						if (destroy) {
  							rhandlec.filter(':ui-resizable').resizable('destroy')
  								.filter(':ui-draggable').draggable('destroy');
  							basec.hide();
  						}
  						else {
  							basec.show();
  							
  							rhandlec
  								.resizable({
  									containment : basec,
  									aspectRatio : cratioc,
  									resize      : crop.resize_update,
  									start       : opStart,
  									stop        : opStop,
  									handles     : 'all'
  								})
  								.draggable({
  									handle      : coverc,
  									containment : imgc,
  									drag        : crop.drag_update,
  									start       : opStart,
  									stop        : function() {
  										crop.updateView('xy');
  										opStop();
  									}
  								});
  							
  							dinit();
  							crop.update();
  						}
  					},
  					rotateable = function(destroy) {
  						if (destroy) {
  							imgr.hide();
  						}
  						else {
  							imgr.show();
  							dinit();
  						}
  					},
  					checkVals = function() {
  						var w, h, x, y, d, q, b = '';
  						
  						if (mode == 'resize') {
  							w = parseInt(width.val()) || 0;
  							h = parseInt(height.val()) || 0;
  						} else if (mode == 'crop') {
  							w = parseInt(offsetX.val()) || 0;
  							h = parseInt(offsetY.val()) || 0;
  							x = parseInt(pointX.val()) || 0;
  							y = parseInt(pointY.val()) || 0;
  						} else if (mode == 'rotate') {
  							w = owidth;
  							h = oheight;
  							d = parseInt(degree.val()) || 0;
  							if (d < 0 || d > 360) {
  								fm.error('Invalid rotate degree');
  								return false;
  							}
  							if (d == 0 || d == 360) {
  								fm.error('errResizeNoChange');
  								return false;
  							}
  							b = bg.val();
  						}
  						q = quality? parseInt(quality.val()) : 0;
  						
  						if (mode != 'rotate') {
  							if (w <= 0 || h <= 0) {
  								fm.error('Invalid image size');
  								return false;
  							}
  							if (w == owidth && h == oheight) {
  								fm.error('errResizeNoChange');
  								return false;
  							}
  						}
  						
  						return {w: w, h: h, x: x, y: y, d: d, q: q, b: b};
  					},
  					save = function() {
  						var vals;
  						
  						if (vals = checkVals()) {
  							dialog.elfinderdialog('close');
  							self.resizeRequest({
  								target : file.hash,
  								width  : vals.w,
  								height : vals.h,
  								x      : vals.x,
  								y      : vals.y,
  								degree : vals.d,
  								quality: vals.q,
  								bg     : vals.b,
  								mode   : mode
  							}, file, dfrd);
  						}
  					},
  					saveAs = function() {
  						var fail = function() {
  								dialogs.addClass(clsediting).fadeIn(function() {
  									base.addClass(clactive);
  								});
  								fm.disable();
  							},
  							make = function() {
  								self.mime = file.mime;
  								self.prefix = file.name.replace(/ \d+(\.[^.]+)?$/, '$1');
  								self.requestCmd = 'mkfile';
  								self.nextAction = {};
  								self.data = {target : file.phash};
  								$.proxy(fm.res('mixin', 'make'), self)()
  									.done(function(data) {
  										var hash, dfd;
  										if (data.added && data.added.length) {
  											hash = data.added[0].hash;
  											dfd = fm.api < 2.1032? fm.url(file.hash, { async: true, temporary: true }) : null;
  											$.when(dfd).done(function(url) {
  												fm.request({
  													options : {type : 'post'},
  													data : {
  														cmd     : 'put',
  														target  : hash,
  														encoding: dfd? 'scheme' : 'hash', 
  														content : dfd? fm.convAbsUrl(url) : file.hash
  													},
  													notify : {type : 'copy', cnt : 1},
  													syncOnFail : true
  												})
  												.fail(fail)
  												.done(function(data) {
  													data = fm.normalize(data);
  													fm.updateCache(data);
  													file = fm.file(hash);
  													data.changed && data.changed.length && fm.change(data);
  													base.show().find('.elfinder-dialog-title').html(fm.escape(file.name));
  													save();
  													dialogs.fadeIn();
  												});
  											}).fail(fail);
  										} else {
  											fail();
  										}
  									})
  									.fail(fail)
  									.always(function() {
  										delete self.mime;
  										delete self.prefix;
  										delete self.nextAction;
  										delete self.data;
  									});
  								fm.trigger('unselectfiles', { files: [ file.hash ] });
  							},
  							reqOpen = null,
  							dialogs;
  						
  						if (checkVals()) {
  							dialogs = fmnode.children('.' + self.dialogClass + ':visible').removeClass(clsediting).fadeOut();
  							base.removeClass(clactive);
  							fm.enable();
  							if (fm.searchStatus.state < 2 && file.phash !== fm.cwd().hash) {
  								reqOpen = fm.exec('open', [file.phash], {thash: file.phash});
  							}
  							
  							$.when([reqOpen]).done(function() {
  								reqOpen? fm.one('cwdrender', make) : make();
  							}).fail(fail);
  						}
  					},
  					buttons = {},
  					hline   = 'elfinder-resize-handle-hline',
  					vline   = 'elfinder-resize-handle-vline',
  					rpoint  = 'elfinder-resize-handle-point',
  					canvSrc = src,
  					sizeImg = quality? $('<img>').attr('crossorigin', fm.isCORS? 'use-credentials' : '').attr('src', canvSrc).on('load', function() {
  						try {
  							var canv = document.createElement('canvas');
  							sizeImg.data('canvas', canv).data('ctx', canv.getContext('2d'));
  							jpgCalc();
  						} catch(e) {
  							sizeImg.removeData('canvas').removeData('ctx');
  						}
  					}) : null,
  					jpgCalc = function() {
  						control.find('input.elfinder-resize-quality:visible').trigger('change');
  					},
  					dinit   = function(e) {
  						if (base.hasClass('elfinder-dialog-minimized') || base.is(':hidden')) {
  							return;
  						}
  						
  						preset.hide();
  						presetc.hide();
  						
  						var win   = fm.options.dialogContained? fmnode : $(window),
  							winH  = win.height(),
  							winW  = win.width(),
  							presW = 'auto',
  							presIn = true,
  							dw, ctrW, prvW;
  						
  						base.width(Math.min(dialogWidth, winW - 30));
  						preview.attr('style', '');
  						if (owidth && oheight) {
  							pwidth  = preview.width()  - (rhandle.outerWidth()  - rhandle.width());
  							pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
  							resize.updateView(owidth, oheight);
  						}
  						ctrW  = dialog.find('div.elfinder-resize-control').width();
  						prvW  = preview.width();
  						
  						dw = dialog.width() - 20;
  						if (prvW > dw) {
  							preview.width(dw);
  							presIn = false;
  						} else if ((dw - prvW) < ctrW) {
  							if (winW > winH) {
  								preview.width(dw - ctrW - 20);
  							} else {
  								preview.css({ float: 'none', marginLeft: 'auto', marginRight: 'auto'});
  								presIn = false;
  							}
  						}
  						if (presIn) {
  							presW = ctrW;
  						}
  						pwidth  = preview.width()  - (rhandle.outerWidth()  - rhandle.width());
  						if (fmnode.hasClass('elfinder-fullscreen')) {
  							if (base.height() > winH) {
  								winH -= 2;
  								preview.height(winH - base.height() + preview.height());
  								base.css('top', 0 - fmnode.offset().top);
  							}
  						} else {
  							winH -= 30;
  							(preview.height() > winH) && preview.height(winH);
  						}
  						pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
  						if (owidth && oheight) {
  							setupimg();
  						}
  						if (img.height() && preview.height() > img.height() + 20) {
  							preview.height(img.height() + 20);
  							pheight = preview.height() - (rhandle.outerHeight() - rhandle.height());
  							setuprimg();
  						}
  						
  						preset.css('width', presW).show();
  						presetc.css('width', presW).show();
  						if (!presetc.children('span.elfinder-resize-preset:visible').length) {
  							presetc.hide();
  						}
  						dialog.elfinderdialog('posInit');
  					},
  					preset = (function() {
  						var sets = $('<fieldset class="elfinder-resize-preset-container">').append($('<legend>').html(fm.i18n('presets'))).css('box-sizing', 'border-box').hide(),
  							hasC;
  						$.each(presetSize, function(i, s) {
  							if (s.length === 2) {
  								hasC = true;
  								sets.append($('<span class="elfinder-resize-preset"></span>')
  									.data('s', s)
  									.text(s[0]+'x'+s[1])
  									.button()
  								);
  							}
  						});
  						if (!hasC) {
  							return $();
  						} else {
  							return sets;
  						}
  					})(),
  					presetc = preset.clone(true),
  					useSaveAs = fm.uploadMimeCheck(file.mime, file.phash),
  					dMinBtn, base;
  				
  				uiresize.append(
  					$(row).append($(label).text(fm.i18n('width')), width),
  					$(row).append($(label).text(fm.i18n('height')), height, $('<div class="elfinder-resize-whctrls">').append(constr, reset)),
  					(quality? $(row).append($(label).text(fm.i18n('quality')), quality, $('<span></span>')) : $()),
  					(isJpeg? $(row).append($(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8'), grid8px) : $()),
  					$(row).append($(label).text(fm.i18n('scale')), uiprop),
  					$(row).append(preset)
  				);
  
  				if (api2) {
  					uicrop.append(
  						$(row).append($(label).text('X'), pointX),
  						$(row).append($(label).text('Y')).append(pointY),
  						$(row).append($(label).text(fm.i18n('width')), offsetX),
  						$(row).append($(label).text(fm.i18n('height')), offsetY, $('<div class="elfinder-resize-whctrls">').append(constrc, reset.clone(true))),
  						(quality? $(row).append($(label).text(fm.i18n('quality')), quality.clone(true), $('<span></span>')) : $()),
  						(isJpeg? $(row).append($(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8')) : $()),
  						$(row).append(presetc)
  					);
  					
  					uirotate.append(
  						$(row).addClass('elfinder-resize-degree').append(
  							$(label).text(fm.i18n('rotate')),
  							degree,
  							$('<span></span>').text(fm.i18n('degree')),
  							$('<div></div>').append(uideg270, uideg90)[ctrgrup]()
  						),
  						$(row).css('height', '20px').append(uidegslider),
  						((quality)? $(row)[losslessRotate < 1? 'show' : 'hide']().addClass('elfinder-resize-quality').append(
  							$(label).text(fm.i18n('quality')),
  							quality.clone(true),
  							$('<span></span>')) : $()
  						),
  						$(row).append($(label).text(fm.i18n('bgcolor')), bg, picker, reseter),
  						$(row).css('height', '20px').append(pallet)
  					);
  					uideg270.on('click', function() {
  						rdegree = rdegree - 90;
  						rotate.update(rdegree);
  					});
  					uideg90.on('click', function(){
  						rdegree = rdegree + 90;
  						rotate.update(rdegree);
  					});
  				}
  				
  				dialog.append(uitype).on('resize', function(e){
  					e.stopPropagation();
  				});
  
  				if (api2) {
  					control.append(/*$(row), */uiresize, uicrop.hide(), uirotate.hide());
  				} else {
  					control.append(/*$(row), */uiresize);
  				}
  				
  				rhandle.append('<div class="'+hline+' '+hline+'-top"></div>',
  					'<div class="'+hline+' '+hline+'-bottom"></div>',
  					'<div class="'+vline+' '+vline+'-left"></div>',
  					'<div class="'+vline+' '+vline+'-right"></div>',
  					'<div class="'+rpoint+' '+rpoint+'-e"></div>',
  					'<div class="'+rpoint+' '+rpoint+'-se"></div>',
  					'<div class="'+rpoint+' '+rpoint+'-s"></div>');
  					
  				preview.append(spinner).append(rhandle.hide()).append(img.hide());
  
  				if (api2) {
  					rhandlec.css('position', 'absolute')
  						.append('<div class="'+hline+' '+hline+'-top"></div>',
  						'<div class="'+hline+' '+hline+'-bottom"></div>',
  						'<div class="'+vline+' '+vline+'-left"></div>',
  						'<div class="'+vline+' '+vline+'-right"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-n"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-e"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-s"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-w"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-ne"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-se"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-sw"></div>',
  						'<div class="'+rpoint+' '+rpoint+'-nw"></div>');
  
  					preview.append(basec.css('position', 'absolute').hide().append(imgc, rhandlec.append(coverc)));
  					
  					preview.append(imgr.hide());
  				}
  				
  				preview.css('overflow', 'hidden');
  				
  				dialog.append(preview, control);
  				
  				buttons[fm.i18n('btnApply')] = save;
  				if (useSaveAs) {
  					buttons[fm.i18n('btnSaveAs')] = function() { requestAnimationFrame(saveAs); };
  				}
  				buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); };
  				
  				dialog.find('input,button').addClass('elfinder-tabstop');
  				
  				base = self.fmDialog(dialog, {
  					title          : fm.escape(file.name),
  					width          : dialogWidth,
  					resizable      : false,
  					buttons        : buttons,
  					open           : function() {
  						var doDimReq = function(force) {
  								dimreq = fm.request({
  									data : {cmd : 'dim', target : file.hash, substitute : substituteImg? 400 : ''},
  									preventDefault : true
  								})
  								.done(function(data) {
  									if (!data.url && needPng) {
  										dialog.elfinderdialog('close');
  										fm.error(['errOpen', file.name]);
  									} else {
  										if (data.dim) {
  											var dim = data.dim.split('x');
  											file.width = dim[0];
  											file.height = dim[1];
  											setdim(dim);
  											if (data.url) {
  												img.attr('src', data.url);
  												imgc.attr('src', data.url);
  												imgr.attr('src', data.url);
  											}
  											return init();
  										}
  									}
  								});
  							},
  							needPng = !{'image/jpeg':true,'image/png':true,'image/gif':true,}[file.mime],
  							substituteImg = fm.option('substituteImg', file.hash) && (needPng || file.size > options.dimSubImgSize)? true : false,
  							hasSize = (file.width && file.height)? true : false;
  						dMinBtn = base.find('.ui-dialog-titlebar .elfinder-titlebar-minimize').hide();
  						fm.bind('resize', dinit);
  						img.attr('src', src).one('error.dimreq', function() {
  							doDimReq(true);
  						});
  						imgc.attr('src', src);
  						imgr.attr('src', src);
  						if (api2) {
  							imgr.on('mousedown touchstart', rotate.start)
  								.on('touchend', rotate.stop);
  							base.on('mouseup', rotate.stop);
  						}
  						if (hasSize && !substituteImg) {
  							return init();
  						}
  						if (file.size > (options.getDimThreshold || 0)) {
  							img.off('error.dimreq');
  							doDimReq();
  						} else if (hasSize) {
  							return init();
  						}
  					},
  					close          : function() {
  						if (api2) {
  							imgr.off('mousedown touchstart', rotate.start)
  								.off('touchend', rotate.stop);
  							$(document).off('mouseup', rotate.stop);
  						}
  						fm.unbind('resize', dinit);
  						$(this).elfinderdialog('destroy');
  					},
  					resize         : function(e, data) {
  						if (data && data.minimize === 'off') {
  							dinit();
  						}
  					}
  				}).attr('id', id).closest('.ui-dialog').addClass(clsediting);
  				
  				// for IE < 9 dialog mising at open second+ time.
  				if (fm.UA.ltIE8) {
  					$('.elfinder-dialog').css('filter', '');
  				}
  				
  				coverc.css({ 'opacity': 0.2, 'background-color': '#fff', 'position': 'absolute'}),
  				rhandlec.css('cursor', 'move');
  				rhandlec.find('.elfinder-resize-handle-point').css({
  					'background-color' : '#fff',
  					'opacity': 0.5,
  					'border-color':'#000'
  				});
  
  				if (! api2) {
  					uitype.find('.api2').remove();
  				}
  				
  				control.find('input,select').prop('disabled', true);
  				control.find('input.elfinder-resize-quality')
  					.next('span').addClass('elfinder-resize-jpgsize').attr('title', fm.i18n('roughFileSize'));
  
  			},
  			
  			id, dialog
  			;
  			
  
  		if (!files.length || files[0].mime.indexOf('image/') === -1) {
  			return dfrd.reject();
  		}
  		
  		id = 'resize-'+fm.namespace+'-'+files[0].hash;
  		dialog = fmnode.find('#'+id);
  		
  		if (dialog.length) {
  			dialog.elfinderdialog('toTop');
  			return dfrd.resolve();
  		}
  		
  		
  		fm.openUrl(files[0].hash, 'sameorigin', function(src) {
  			open(files[0], id, src);
  		});
  			
  		return dfrd;
  	};
  
  };
  
  (function ($) {
  	
  	var findProperty = function (styleObject, styleArgs) {
  		var i = 0 ;
  		for( i in styleArgs) {
  	        if (typeof styleObject[styleArgs[i]] != 'undefined') 
  	        	return styleArgs[i];
  		}
  		styleObject[styleArgs[i]] = '';
  	    return styleArgs[i];
  	};
  	
  	$.cssHooks.rotate = {
  		get: function(elem, computed, extra) {
  			return $(elem).rotate();
  		},
  		set: function(elem, value) {
  			$(elem).rotate(value);
  			return value;
  		}
  	};
  	$.cssHooks.transform = {
  		get: function(elem, computed, extra) {
  			var name = findProperty( elem.style , 
  				['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
  			return elem.style[name];
  		},
  		set: function(elem, value) {
  			var name = findProperty( elem.style , 
  				['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
  			elem.style[name] = value;
  			return value;
  		}
  	};
  	
  	$.fn.rotate = function(val) {
  		var r;
  		if (typeof val == 'undefined') {
  			if (!!window.opera) {
  				r = this.css('transform').match(/rotate\((.*?)\)/);
  				return  ( r && r[1])?
  					Math.round(parseFloat(r[1]) * 180 / Math.PI) : 0;
  			} else {
  				r = this.css('transform').match(/rotate\((.*?)\)/);
  				return  ( r && r[1])? parseInt(r[1]) : 0;
  			}
  		}
  		this.css('transform', 
  			this.css('transform').replace(/none|rotate\(.*?\)/, '') + 'rotate(' + parseInt(val) + 'deg)');
  		return this;
  	};
  
  	$.fx.step.rotate  = function(fx) {
  		if ( fx.state == 0 ) {
  			fx.start = $(fx.elem).rotate();
  			fx.now = fx.start;
  		}
  		$(fx.elem).rotate(fx.now);
  	};
  
  	if (typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined") { // IE & IE<9
  		var GetAbsoluteXY = function(element) {
  			var pnode = element;
  			var x = pnode.offsetLeft;
  			var y = pnode.offsetTop;
  			
  			while ( pnode.offsetParent ) {
  				pnode = pnode.offsetParent;
  				if (pnode != document.body && pnode.currentStyle['position'] != 'static') {
  					break;
  				}
  				if (pnode != document.body && pnode != document.documentElement) {
  					x -= pnode.scrollLeft;
  					y -= pnode.scrollTop;
  				}
  				x += pnode.offsetLeft;
  				y += pnode.offsetTop;
  			}
  			
  			return { x: x, y: y };
  		};
  		
  		var StaticToAbsolute = function (element) {
  			if ( element.currentStyle['position'] != 'static') {
  				return ;
  			}
  
  			var xy = GetAbsoluteXY(element);
  			element.style.position = 'absolute' ;
  			element.style.left = xy.x + 'px';
  			element.style.top = xy.y + 'px';
  		};
  
  		var IETransform = function(element,transform){
  
  			var r;
  			var m11 = 1;
  			var m12 = 1;
  			var m21 = 1;
  			var m22 = 1;
  
  			if (typeof element.style['msTransform'] != 'undefined'){
  				return true;
  			}
  
  			StaticToAbsolute(element);
  
  			r = transform.match(/rotate\((.*?)\)/);
  			var rotate =  ( r && r[1])	?	parseInt(r[1])	:	0;
  
  			rotate = rotate % 360;
  			if (rotate < 0) rotate = 360 + rotate;
  
  			var radian= rotate * Math.PI / 180;
  			var cosX =Math.cos(radian);
  			var sinY =Math.sin(radian);
  
  			m11 *= cosX;
  			m12 *= -sinY;
  			m21 *= sinY;
  			m22 *= cosX;
  
  			element.style.filter =  (element.style.filter || '').replace(/progid:DXImageTransform\.Microsoft\.Matrix\([^)]*\)/, "" ) +
  				("progid:DXImageTransform.Microsoft.Matrix(" + 
  					 "M11=" + m11 + 
  					",M12=" + m12 + 
  					",M21=" + m21 + 
  					",M22=" + m22 + 
  					",FilterType='bilinear',sizingMethod='auto expand')") 
  				;
  
  	  		var ow = parseInt(element.style.width || element.width || 0 );
  	  		var oh = parseInt(element.style.height || element.height || 0 );
  
  			radian = rotate * Math.PI / 180;
  			var absCosX =Math.abs(Math.cos(radian));
  			var absSinY =Math.abs(Math.sin(radian));
  
  			var dx = (ow - (ow * absCosX + oh * absSinY)) / 2;
  			var dy = (oh - (ow * absSinY + oh * absCosX)) / 2;
  
  			element.style.marginLeft = Math.floor(dx) + "px";
  			element.style.marginTop  = Math.floor(dy) + "px";
  
  			return(true);
  		};
  		
  		var transform_set = $.cssHooks.transform.set;
  		$.cssHooks.transform.set = function(elem, value) {
  			transform_set.apply(this, [elem, value] );
  			IETransform(elem,value);
  			return value;
  		};
  	}
  
  })(jQuery);
  