%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 18.218.189.173
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/main/core/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/main/core//core_canvas.js
;(function(window){
	if (window.BX["CanvasEditor"])
		return false;
	var BX = window.BX, E = {},
	FormToArray = function(form, data) {
		data = (data || {});
		var i, ii,
			_data = [],
			n = form.elements.length,
			files = 0, length = 0;
		if(!!form)
		{
			for(i=0; i<n; i++)
			{
				var el = form.elements[i];
				if (el.disabled)
					continue;
				switch(el.type.toLowerCase())
				{
					case 'text':
					case 'textarea':
					case 'password':
					case 'hidden':
					case 'select-one':
						_data.push({name: el.name, value: el.value});
						length += (el.name.length + el.value.length);
						break;
					case 'file':
						if (!!el.files)
						{
							for(ii=0;ii<el.files.length;ii++)
							{
								files++;
								_data.push({name: el.name, value: el.files[ii]});
								length += el.files[ii].size;
							}
						}
						break;
					case 'radio':
					case 'checkbox':
						if(el.checked)
						{
							_data.push({name: el.name, value: el.value});
							length += (el.name.length + el.value.length);
						}
						break;
					case 'select-multiple':
						for (var j = 0; j < el.options.length; j++) {
							if (el.options[j].selected)
							{
								_data.push({name : el.name, value : el.options[j].value});
								length += (el.name.length + el.options[j].length);
							}
						}
						break;
					default:
						break;
				}
			}

			i = 0; length = 0;
			var current = data;

			while(i < _data.length)
			{
				var p = _data[i].name.indexOf('[');
				if (p == -1) {
					current[_data[i].name] = _data[i].value;
					current = data;
					i++;
				}
				else
				{
					var name = _data[i].name.substring(0, p);
					var rest = _data[i].name.substring(p+1);
					if(!current[name])
						current[name] = [];

					var pp = rest.indexOf(']');
					if(pp == -1)
					{
						current = data;
						i++;
					}
					else if(pp == 0)
					{
						//No index specified - so take the next integer
						current = current[name];
						_data[i].name = '' + current.length;
					}
					else
					{
						//Now index name becomes and name and we go deeper into the array
						current = current[name];
						_data[i].name = rest.substring(0, pp) + rest.substring(pp+1);
					}
				}
			}
		}
		return {data : data, filesCount : files, roughSize : length};
	};

	BX.CanvasEditor = function (id)
	{
		this.previewSize = {width : 1024, height : 860, minWidth : 500, minHeight : 335};
		this.dialogName = "BX.CanvasEditor";
		this.id = id + 'Editor';
		this.canvas = new BX.Canvas();
		BX.addCustomEvent(this.canvas, "onChangeSize", BX.delegate(function(params, changeCoeff) {
			var props = params.props,
				style = { width : parseInt(params.style.width.replace('px', '')), height : parseInt(params.style.height.replace('px', '')) },
				cover = BX.pos(this.canvas.getCanvas().parentNode.parentNode),
				cover1 = { style : params.style }, ratio, coeff = 0, cnv = this.canvas.getCanvas();

			if (changeCoeff == true)
			{
				if (style.height > cover.height || style.width > cover.width)
				{
					ratio = BX.UploaderUtils.scaleImage(props, cover, "inscribed");
					coeff = ratio.coeff;
					if (!cnv.hasAttribute("bx-bxu-html-compression-ratio-real"))
						cnv.setAttribute("bx-bxu-html-compression-ratio-real", cnv.getAttribute("bx-bxu-html-compression-ratio"));
					cnv.setAttribute("bx-bxu-html-compression-ratio", coeff);
				}
				else if (cnv.hasAttribute("bx-bxu-html-compression-ratio-real"))
				{
					coeff = cnv.getAttribute("bx-bxu-html-compression-ratio-real");
					cnv.setAttribute("bx-bxu-html-compression-ratio", coeff);
					cnv.removeAttribute("bx-bxu-html-compression-ratio-real");
				}
				if (coeff > 0)
					return this.canvas.setProps(props, false);
			}
			var top = Math.ceil((cover.height - style.height) / 2),
				left = Math.ceil((cover.width - style.width) / 2),
				right = (cover.width - left - style.width),
				cover2 = { style : {
					paddingTop : top + 'px',
					paddingBottom : (cover.height - top - style.height) + 'px',
					paddingLeft : left + 'px',
					paddingRight : right + 'px'
				} };
			BX.adjust(this.canvas.getCanvas().parentNode, cover1);
			BX.adjust(this.canvas.getCanvas().parentNode.parentNode, cover2);
		}, this));

		BX.addCustomEvent(this.canvas, "onChangeCanvas", BX.delegate(function(ratio) {
			this.canvas.getCanvas().removeAttribute("bx-bxu-html-compression-ratio-real");
			var props = ratio.destin, padding = {},
				width = Math.max(props.width, this.previewSize.minWidth),
				height = Math.max(props.height, this.previewSize.minHeight);
			padding.left = Math.ceil((width - props.width) / 2);
			padding.right = width - padding.left - props.width;
			padding.top = Math.ceil((height - props.height) / 2);
			padding.bottom = height - padding.top - props.height;
			BX.adjust(this.canvas.getCanvas().parentNode.parentNode, { style : {
					padding : '' + padding.top + 'px ' + padding.right + 'px ' + padding.bottom + 'px ' + padding.left + 'px'
				}
			} );
		}, this));

		this.popup = null;
		return this;
	};
	BX.CanvasEditor.prototype = {
		onApply : function()
		{
			this.canvas.apply();
			BX.onCustomEvent(this, "onApplyCanvas", [this.canvas.orig, FormToArray(BX(this.id + 'params'))]);
		},
		onCancel : function()
		{
			BX.onCustomEvent(this, "onCancelCanvas", [this.canvas.orig]);
		},
		onDelete : function()
		{
			BX.onCustomEvent(this, "onDeleteCanvas", [this.canvas.orig]);
		},
		showEditor : function(canvas, params) {
			params = (!!params && typeof params == "object" ? params : {template : params});
			BX.onCustomEvent(this, "onBeforeShow");
			var res = BX.GetWindowInnerSize();
			if (res.innerWidth < this.previewSize.width)
				this.previewSize.width = res.innerWidth;
			if (res.innerHeight * 0.8 < (this.previewSize.height))
				this.previewSize.height = res.innerHeight * 0.8;
			if (this.popup === null)
			{
				var ratio = BX.UploaderUtils.scaleImage(canvas, this.previewSize, "inscribed");
				var editorNode = BX.create("DIV", {
					attrs : {
						id : this.id + 'Proper',
						className : "bxu-edit-popup"
					},
					style : { display : "none" },
					html : [
						'<div class="bxu-edit-top"> \
							<span class="bxu-edit-name" id="', this.id, 'title">', BX.util.htmlspecialchars(params["title"]), '</span> \
							<span class="bxu-edit-cls" id="', this.id, 'close"></span> \
						</div> \
						<div class="bxu-edit-img-wrap">\
							<div class="bxu-edit-img-wrap-in" style="position:relative; margin:0;padding:0;border:none;"> \
								<div style="position:relative; margin:0;padding:0;border:none;"> \
									<canvas id="', this.id, 'canvas" width="', ratio.destin.width, '" height="', ratio.destin.height, '"><canvas> \
								</div> \
							</div> \
						</div> \
						<div class="bxu-edit-btn-block"> \
							<div class="bxu-edit-btn-wrap"> \
								<span class="bxu-edit-btn bxu-edit-btn-turn-l" id="', this.id, 'turn-l', '" title="', BX.message("CANVAS_TURN_L"),'"> \
									<span class="bxu-edit-btn-icon"></span> \
								</span> \
								<span class="bxu-edit-btn bxu-edit-btn-turn-r" id="', this.id, 'turn-r', '"title="', BX.message("CANVAS_TURN_R"),'"> \
									<span class="bxu-edit-btn-icon"></span> \
								</span> \
								<span class="bxu-edit-btn bxu-edit-btn-flip-v" id="', this.id, 'flip-v', '" title="', BX.message("CANVAS_FLIP_V"),'"> \
									<span class="bxu-edit-btn-icon"></span> \
								</span> \
								<span class="bxu-edit-btn bxu-edit-btn-flip-h" id="', this.id, 'flip-h', '" title="', BX.message("CANVAS_FLIP_H"),'"> \
									<span class="bxu-edit-btn-icon"></span> \
								</span> \
								<span class="bxu-edit-btn bxu-edit-btn-crop" id="', this.id, 'crop', '" title="', BX.message("CANVAS_CROP"),'"> \
									<span class="bxu-edit-btn-icon"></span> \
								</span> \
								<span class="bxu-edit-btn bxu-edit-btn-grayscale" id="', this.id, 'grayscale', '" title="', BX.message("CANVAS_GRAYSCALE"),'"> \
									<span class="bxu-edit-btn-icon"></span> \
								</span> \
								<span class="bxu-edit-btn bxu-edit-btn-sign" id="', this.id, 'sign', '" title="', BX.message("CANVAS_SIGN"),'"> \
									<span class="bxu-edit-btn-icon"></span> \
								</span> \
							</div> \
							<div class="bxu-edit-inp-wrap"> \
								<form onsubmit="return false;" id="', this.id , 'params">', (params["template"] || ''), '</form> \
							</div> \
						</div>'].join("")
				});
				var func = BX.delegate(function() {
					BX(this.id + 'canvas').parentNode.replaceChild(this.canvas.cnv, BX(this.id + 'canvas'));
					BX.bind(BX(this.id + 'turn-l'), "click", BX.proxy(function(){ this.rotate(false); }, this.canvas));
					BX.bind(BX(this.id + 'turn-r'), "click", BX.proxy(function(){ this.rotate(true); }, this.canvas));
					BX.bind(BX(this.id + 'flip-v'), "click", BX.proxy(function(){ this.flip(false); }, this.canvas));
					BX.bind(BX(this.id + 'flip-h'), "click", BX.proxy(function(){ this.flip(true); }, this.canvas));
					BX.bind(BX(this.id + 'crop'), "click", BX.proxy(function(){ this.crop(BX.proxy_context); }, this.canvas));
					BX.bind(BX(this.id + 'grayscale'), "click", BX.proxy(function(){ this.blackAndWhite(); }, this.canvas));
					BX.bind(BX(this.id + 'sign'), "click", BX.proxy(function(){ this.poster(BX.proxy_context); }, this.canvas));
					BX.bind(BX(this.id + 'close'), "click", BX.proxy(this.popup.close, this.popup));
					BX.bind(BX(this.id + 'params'), "submit", BX.proxy(this.onApply, this));

					BX.removeCustomEvent(this.popup, "onPopupShow", func);
				}, this), func3 = BX.delegate(this.onCancel, this);

				this.popup = BX.PopupWindowManager.create(
					'popup' + this.id,
					null,
					{
						className : "bxu-popup",
						autoHide : false,
						lightShadow : true,
						closeIcon : false,
						closeByEsc : true,
						zIndex : 1,
						content : editorNode,
						overlay : {},
						events : {
							onPopupClose : BX.delegate(
								function(){
									BX.onCustomEvent(this, "onClose", [this]);
									this.canvas.reset();
								}, this
							)
						},
						buttons : [
							new BX.PopupWindowButton( {text : BX.message('CANVAS_OK'), className : "", events : { click : BX.delegate(function(){
								this.onApply();
								BX.removeCustomEvent(this.popup, "onPopupClose", func3);
								this.popup.close();
							}, this) } } )
							, new BX.PopupWindowButton( {text : BX.message('CANVAS_CANCEL'), className : "", events : { click : BX.delegate(function(){
								this.popup.close();
							}, this) } } )
							//, new BX.PopupWindowButton( {text : BX.message('CANVAS_DELETE'), className : "", events : { click : BX.delegate(this.onDelete, this) } } )
						]
					}
				);
				BX.addCustomEvent(this.popup, "onPopupShow", func);
				BX.addCustomEvent(this.popup, "onPopupClose", func3);

			}
			var func2 = BX.delegate(function(){
				if (canvas != null)
					this.copyCanvas(canvas);
				BX(this.id + 'params').innerHTML = (params["template"] || '');
				if (!!params["template"])
				{
					BX.defer_proxy(function(){
						var form = BX(this.id + 'params');
						if (!!form)
						{
							for (var ii = 0; ii < form.elements.length; ii++)
							{
								if (form.elements[ii].type.toUpperCase() == "TEXT" || form.elements[ii].tagName.toUpperCase() == "TEXTAREA")
								{
									BX.focus(form.elements[ii]);
									break;
								}
							}
						}
					}, this)();
				}
				BX(this.id + 'title').innerHTML = BX.util.htmlspecialchars(params["title"] || '');
				BX.removeCustomEvent(this.popup, "onAfterPopupShow", func2);
			}, this);
			BX.addCustomEvent(this.popup, "onAfterPopupShow", func2);

			this.popup.show();
			this.popup.adjustPosition();
			BX.onCustomEvent(this, "onAfterShow");

			return true;
		},
		copyCanvas : function(canvas)
		{
			this.canvas.copy(canvas, this.previewSize);
		}
	};
	BX.CanvasEditor.show = function(canvas, html, params)
	{
		var id = "";
		if (typeof params == "string")
			id = params;
		else if (typeof params == "object")
			id = params["id"];
		id = (typeof id === "string" && id.length > 0 ? id : "default");
		if(!E[id])
			E[id] = new BX.CanvasEditor(id);
		E[id].showEditor(canvas, html, params);
		return E[id];
	};
	BX.CanvasEditor.replaceCanvas = function(canvas, id)
	{
		id = (typeof id === "string" && id.length > 0 ? id : "default");
		if(!!E[id])
			E[id].copyCanvas(canvas);
	};

	BX.Canvas = function()
	{
		this.cnv = null;
		this.ctx = null;
		this.init();
		return this;
	};
	BX.Canvas.prototype = {
		getVisFromReal : function(prop)
		{
			var c = this.cnv.getAttribute("bx-bxu-html-compression-ratio");
			return ((0 < c && c < 1) ? parseInt(c * prop) : prop);
		},
		getRealFromVis : function(prop)
		{
			var c = this.cnv.getAttribute("bx-bxu-html-compression-ratio");
			return ((0 < c && c < 1) ? parseInt(prop / c) : prop);
		},
		setStyles : function(props)
		{
			var p = {width : this.getRealFromVis(props.width), height : this.getRealFromVis(props.height)},
				styles = {width : props.width + 'px', height : props.height + 'px'};
			BX.adjust(this.cnv, {props : p, style : styles });
			BX.onCustomEvent(this, "onChangeSize", [{props : p, style : styles }])
		},
		setProps : function(props, recalcCoeff)
		{
			var p = ({width : props.width, height : props.height}),
				styles = {width : this.getVisFromReal(props.width) + 'px', height : this.getVisFromReal(props.height) + 'px'};
			BX.adjust(this.cnv, {props : p, style : styles });
			BX.onCustomEvent(this, "onChangeSize", [{props : p, style : styles }, recalcCoeff]);
		},
		getCanvas : function()
		{
			return this.cnv;
		},
		init : function()
		{
			this.cnv = BX.create('CANVAS');
			BX.adjust(this.cnv, { width : 100, height : 100 } );
			this.ctx = this.cnv.getContext("2d");
			this.initDnD();
			return this.cnv;
		},
		reset : function()
		{
			this.ctx.clearRect(0, 0, this.cnv.width, this.cnv.height);
			BX.adjust(this.cnv, { width : 100, height : 100 } );
		},
		apply : function()
		{
			this.orig.width = this.cnv.width;
			this.orig.height = this.cnv.height;
			this.orig.ctx = this.orig.getContext("2d");
			this.orig.ctx.drawImage(this.cnv, 0, 0);
		},
		copy : function(canvas, params)
		{
			this.orig = canvas;

			params = (params || {});
			params.width = (params.width > 0 ? params.width : 0);
			params.height = (params.height > 0 ? params.height : 0);

			var ratio = BX.UploaderUtils.scaleImage(canvas, params, "inscribed");
			this.cnv.setAttribute("bx-bxu-html-compression-ratio", ratio.coeff);

			this.setProps(canvas);
			BX.onCustomEvent(this, "onChangeCanvas", [ratio]);

			this.ctx = this.cnv.getContext("2d");
			this.ctx.drawImage(canvas, 0, 0);
			return this.cnv;
		},
		poster : function(node)
		{
			if (!!this.posterPopup)
				this.posterPopup.close();
			var res = BX.pos(node);

			this.posterPopup = new BX.PopupWindow('bx-poster-popup-' + node.id, node, {
				lightShadow : true,
				offsetTop: -3,
				className : "bxu-poster-popup",
				offsetLeft: Math.ceil(res.width / 2),
				autoHide: true,
				closeByEsc: true,
				bindOptions: {position: "top"},
				overlay : false,
				events : {
					onPopupClose : function() { this.destroy() },
					onPopupDestroy : BX.proxy(function() { this.posterPopup = null; }, this)
				},
				buttons : [
					new BX.PopupWindowButton( {text : BX.message('CANVAS_OK'), events : { click : BX.delegate(function() {
						var msg = BX('posterPopupText' + node.id);
						if (!!msg && msg.value.length > 0)
							this.posterApply(msg.value);
						this.posterPopup.close();
					}, this) } } )
					, new BX.PopupWindowButton( {text : BX.message('CANVAS_CANCEL'), events : { click : BX.delegate(function(){this.posterPopup.close();}, this) } } )
				],
				content : ['<div class="bxu-poster-popup-dt">', BX.message("CANVAS_POSTER_SIGN"), '</div> \
					<input type="text" id="posterPopupText', node.id,'" maxlength="255" value="" />'].join("")
			});
			this.posterPopup.show();
			this.posterPopup.setAngle({position:'bottom'});
			this.posterPopup.bindOptions.forceBindPosition = true;
			this.posterPopup.adjustPosition();
			BX.focus(BX('posterPopupText' + node.id));
			this.posterPopup.bindOptions.forceBindPosition = false;
		},
		posterApply : function(msg)
		{
			if (msg)
			{
				var size = Math.min(this.cnv.width, this.cnv.height) / 10;
				this.ctx.fillStyle = "black";
				this.ctx.fillRect(0, 0, this.cnv.width, size);
				this.ctx.fillRect(0, this.cnv.height - 2 * size, this.cnv.width, 2 * size);
				this.ctx.fillRect(0, 0, size, this.cnv.height);
				this.ctx.fillRect(this.cnv.width - size, 0, size, this.cnv.height);
				this.ctx.strokeStyle = "white";
				var border = 5;
				this.ctx.strokeRect(size - border, size - border,
					this.cnv.width - (size * 2) + 2 * border,
					this.cnv.height - (size * 3) + 2 * border);
				this.ctx.fillStyle = "white";
				this.ctx.textAlign = "center";
				this.ctx.textBaseline = "middle";
				this.ctx.font = size + "px marketing";
				this.ctx.fillText(msg, this.cnv.width / 2, this.cnv.height - size, this.cnv.width);
			}
		},
		blackAndWhite : function()
		{
			var frame = this.ctx.getImageData(0, 0, this.cnv.width, this.cnv.height), v, i;
			for (i = 0; i < frame.data.length; i += 4)
			{
				v = (frame.data[i] + frame.data[i + 1] + frame.data[i + 2]) / 3;
				frame.data[i] = v;
				frame.data[i + 1] = v;
				frame.data[i + 2] = v;
			}
			this.ctx.putImageData(frame, 0, 0);
		},
		flip : function(verticaly)
		{
			this.ctx.save();
			if (verticaly)
			{
				this.ctx.scale(1, -1);
				this.ctx.translate(0, - this.cnv.height);
			}
			else
			{
				this.ctx.scale(-1, 1);
				this.ctx.translate(-this.cnv.width, 0);
			}
			this.ctx.drawImage(this.cnv, 0, 0);
			this.ctx.restore();
		},
		rotate : function(clockwise)
		{
			this.turn(this.cnv, this.ctx, clockwise);
		},
		turn : function(cnv, ctx, clockwise)
		{
			var tmpCanvas = BX.create('CANVAS', {props : { width : cnv.width, height : cnv.height }, style : { display : "none" } } );
			tmpCanvas.getContext("2d").drawImage(cnv, 0, 0);

			this.setProps({width : tmpCanvas.height, height : tmpCanvas.width}, true);

			ctx.save();

			if (clockwise)
				ctx.translate(this.cnv.width, 0);
			else
				ctx.translate(0, this.cnv.height);
			var rad = Math.PI / 2 * (clockwise ? 1 : -1);
			ctx.rotate(rad);
			ctx.drawImage(tmpCanvas, 0, 0);
			ctx.restore();
			tmpCanvas = null;
		},
		resize : function(ratio)
		{
			var tmpCanvas = BX.create('CANVAS', {props : { width : this.cnv.width, height : this.cnv.height }, style : { display : "none" } } );
			tmpCanvas.getContext("2d").drawImage(this.cnv, 0, 0);

			this.cnv.width *= ratio;
			this.cnv.height *= ratio;

			this.ctx.save();
			this.ctx.scale(ratio, ratio);
			this.ctx.drawImage(tmpCanvas, 0, 0);
			this.ctx.restore();

			tmpCanvas = null;
		},
		_imageDropped : function(url, x, y, drawBorder)
		{
			var img = BX.create("IMG", {
					style : { display : "none" },
					events : {
						load : BX.delegate(function()
						{
							var ratioX = (img.width > this.cnv.width / 3 ? (this.cnv.width / 3) / img.width : 1),
								ratioY = (img.height > this.cnv.height / 3 ? (this.cnv.height / 3) / img.height : 1),
								ratio = Math.min(ratioX, ratioY);
							this.cnv.save();
							this.cnv.translate(x - img.width * ratio / 2, y - img.height * ratio / 2);
							this.cnv.scale(ratio, ratio);
							this.cnv.drawImage(img, 0, 0);
							if (drawBorder)
							{
								this.cnv.strokeStyle = "white";
								this.cnv.lineWidth = 5 / ratio;
								this.cnv.strokeRect(0, 0, img.width, img.height);
							}
							this.cnv.restore();
							document.body.removeChild(img);
							img = null;
						}, this)
					}
				});
			img.src = url;
			document.body.appendChild(img);
		},
		initDnD : function()
		{
			if (!!BX.DD && BX.type.isDomNode(this.cnv) && this.cnv.parentNode)
			{
				this.cnvDD = new BX.DD.dropFiles(this.cnv.canvas);
				if (this.cnvDD && this.cnvDD.supported() && BX.ajax.FormData.isSupported())
				{
					BX.addCustomEvent(this.cnvDD, 'dragover', BX.preventDefault);
					BX.addCustomEvent(this.cnvDD, 'drop', BX.delegate(function(e)
					{
						BX.preventDefault(e);
						BX.fixEventPageXY(e);

						var dt = e.dataTransfer,
							x = e.pageX - this.cnv.canvas.offsetLeft - this.cnv.canvas.parentNode.offsetLeft,
							y = e.pageY - this.cnv.canvas.offsetTop - this.cnv.canvas.parentNode.offsetTop,
							files = dt.files;
						if (files.length == 0)
						{
							var type = "application/x-moz-file-promise-url";
							if (dt.types.contains(type)) { this._imageDropped(dt.getData(type), x, y, false); }
						}
						else
						{
							var file = files[0], reader = new FileReader();
							reader.onload = BX.proxy(function(e) {
								this._imageDropped(e.target.result, x, y, true);
								reader = null;
							}, this);
							reader.readAsDataURL(file);
						}
					}, this));
				}
			}
		},
		cropParams : null,
		crop : function(button)
		{
			if (!!button)
				BX.addClass(button, "bxu-edit-btn-active");
			var cropBox = BX.create("DIV", {
				attrs : { id : "crop" + this.id, className : "bx-bxu-canvas-crop-rectangle" },
				style : { border : "3px dashed gray", position : "absolute", display : "none", zIndex : 1201 } } );

			this.cropParams = {
				x : 0, y : 0, width : 0, height : 0, top : 0, left : 0,
				mousedown : BX.delegate(function(e)
					{
						BX.fixEventPageXY(e);
						if (e.layerX || e.layerX == 0)
						{
							this.cropParams.left = e.layerX;
							this.cropParams.top = e.layerY;
						}
						else if(e.offsetX || e.offsetX == 0)
						{
							this.cropParams.left = e.offsetX;
							this.cropParams.top = e.offsetY;
						}
						else
						{
							this.cropParams.top = e.pageX - this.cnv.pos["left"];
							this.cropParams.left = e.pageY - this.cnv.pos["top"];
						}
						this.cropParams["~top"] = this.cropParams.top;
						this.cropParams["~left"] = this.cropParams.left;
						this.cropParams.x = e.pageX;
						this.cropParams.y = e.pageY;

						BX.bind(document, "mousemove", this.cropParams.mousemove);
					}, this),
				mousemove : BX.delegate(function(e)
					{
						BX.fixEventPageXY(e);
						var x = e.pageX, y = e.pageY;

						this.cropParams.width = (x - this.cropParams.x);
						if (this.cropParams.width < 0)
						{
							this.cropParams.left = this.cropParams["~left"] + this.cropParams.width;
							this.cropParams.width *= -1;
							if (this.cropParams.left < 0)
							{
								this.cropParams.left = 0;
								this.cropParams.width = this.cropParams["~left"];
							}
						}
						else
						{
							this.cropParams.left = this.cropParams["~left"];
							if ((this.cropParams.left + this.cropParams.width) > this.cnv.pos.width)
								this.cropParams.width = this.cnv.pos.width - this.cropParams.left;
						}

						this.cropParams.height = y - this.cropParams.y;
						if (this.cropParams.height < 0)
						{
							this.cropParams.top = this.cropParams["~top"] + this.cropParams.height;
							this.cropParams.height *= -1;
							if (this.cropParams.top < 0)
							{
								this.cropParams.top = 0;
								this.cropParams.height = this.cropParams["~top"];
							}
						}
						else
						{
							this.cropParams.top = this.cropParams["~top"];
							if ((this.cropParams.top + this.cropParams.height) > this.cnv.pos.height)
								this.cropParams.height = this.cnv.pos.height - this.cropParams.top;
						}

						BX.adjust(cropBox, {style : {
							left : (this.cropParams.left + 'px'),
							top : (this.cropParams.top + 'px'),
							width : ((this.cropParams.width - (cropBox.borderLeft + cropBox.borderRight)) + 'px'),
							height : ((this.cropParams.height - (cropBox.borderTop + cropBox.borderBottom)) + 'px'),
							display : "block"
						}});
					}, this),
				mouseup : BX.delegate(function(e)
					{
						BX.PreventDefault(e);
						if (this.cropParams.width > 0 && this.cropParams.height > 0)
						{
							var cnv = BX.create("CANVAS", {
								props : { width : this.cnv.width, height : this.cnv.height },
								style : { display : "none" } } );

							cnv.getContext("2d").drawImage(this.cnv, 0, 0);

							this.setStyles(this.cropParams);

							this.ctx.save();

							this.ctx.drawImage(cnv, -this.getRealFromVis(this.cropParams["left"]), -this.getRealFromVis(this.cropParams["top"]));
							this.ctx.restore();

							cnv = null;
						}
						this.cropParams.clear(e);
					}, this),
				clear :  BX.delegate(function(e)
					{
						if (!!button)
							BX.removeClass(button, "bxu-edit-btn-active");
						BX.unbind(this.cnv, "mousedown", this.cropParams.mousedown);
						BX.unbind(document, "mousemove", this.cropParams.mousemove);
						BX.unbind(this.cnv, "mouseup", this.cropParams.mouseup);
						BX.unbind(cropBox, "mouseup", this.cropParams.mouseup);
						BX.unbind(document, "mouseup", this.cropParams.mouseup);
						this.cnv.parentNode.style.position = this.cnv.parentNode.style._position;
						this.cnv.parentNode.removeChild(cropBox);
						cropBox = null;
						this.cropParams = null;
					}, this)
			};
			BX.bind(this.cnv, "mousedown", this.cropParams.mousedown);
			BX.bind(this.cnv, "mouseup", this.cropParams.mouseup);
			BX.bind(cropBox, "mouseup", this.cropParams.mouseup);
			BX.bind(document, "mouseup", this.cropParams.mouseup);
			this.cnv.pos = BX.pos(this.cnv);
			this.cnv.parentNode.style._position = this.cnv.parentNode.style.position;
			this.cnv.parentNode.style.position = "relative";
			this.cnv.parentNode.appendChild(cropBox);
			for (var ii = 0, i = ["top", "right", "bottom", "left"]; ii < i.length; ii++)
			{
				cropBox["b" + i[ii]] = parseInt(BX.style(cropBox, 'border-' + i[ii] + '-width'));
				cropBox["b" + i[ii]] = (!isNaN(cropBox["b" + i[ii]]) && cropBox["b" + i[ii]] > 0 ? cropBox["b" + i[ii]] : 0);
			}
			cropBox.borderLeft = cropBox["bleft"];
			cropBox.borderTop = cropBox["btop"];
			cropBox.borderRight = cropBox["bright"];
			cropBox.borderBottom = cropBox["bbottom"];
		}
	};
}(window));

Youez - 2016 - github.com/yon3zu
LinuXploit