{"version":3,"sources":["kendo.imageeditor.js"],"names":["f","define","$","undefined","kendo","window","ui","extend","proxy","ToolBar","Item","toolbar","CLICK","DROPDOWNCHANGE","ACTION","ImageEditorToolBar","init","element","options","that","this","_extendOptions","fn","call","_attachEvents","toggleTools","events","concat","defaultTools","open","type","icon","name","command","showText","save","toggleCondition","separator","undo","redo","separator1","crop","resize","zoomIn","zoomOut","zoomDropdown","text","items","bind","_dropDownChange","_click","tools","Object","keys","_extendToolsOptions","messages","length","map","tool","toolOptions","isBuiltInTool","isPlainObject","deepExtend","id","guid","attributes","aria-label","title","data-command","data-options","data-toggle","overflow","ev","target","data","action","args","trigger","conditions","find","each","index","elm","widget","condition","toToggle","is","widgetInstance","enable","destroy","ImageEditorZoomDropDown","input","attr","template","dropDown","DropDownList","optionLabel","dataTextField","dataSource","change","_change","append","wrapper","list","hide","sender","dataItem","registerComponent","imageeditor","ZoomDropDown","jQuery","amd","a1","a2","a3","Class","NS","paneStyles","form","button","confirmButton","cropOverlay","resizeHandle","resizeHandlePrefix","round","Math","Pane","currentPaneTool","addClass","commonMessages","common","paneWrapper","formWidget","Form","formSettings","buttonsTemplate","format","cancel","confirm","bindButtonEvents","show","buttons","_clickHandler","on","console","error","refresh","off","html","CropPane","buildCropModel","canvasUI","model","_model","toJSON","executeCommand","key","cropMessages","panes","aspectRatioItems","aspectRatioDS","push","value","formData","onChange","label","layout","grid","cols","gutter","aspectRatio","field","editor","editorOptions","dataValueField","colSpan","orientation","_orientationEditor","width","style","max","min","height","lockAspectRatio","container","appendTo","kendoButtonGroup","portrait","data-value","selected","landscape","select","set","canvas","getCanvasElement","top","left","i","handleElm","borderWidth","canvasContainer","cropElement","handle","handles","zoomLevel","getZoomLevel","_initResizeHandle","_canvasUI","parseInt","css","backgroundImage","_image","src","backgroundSize","backgroundClip","backgroundPosition","kendoDraggable","ignore","drag","_adjustTopLeft","offsetTop","y","delta","offsetLeft","x","newModel","$target","oldModel","adjustments","correctedLeft","correctedTop","indexOf","offsetWidth","offsetHeight","compare","compareModel","tempModel","newSize","force","size","maxWidth","maxHeight","originalRatio","gcd","_gcd","_calcSize","wRatio","hRatio","expectedRatio","realRatio","sizeByRatio","isPortrait","ratios","split","a","b","remove","ResizePane","buildResizeModel","originalWidth","originalHeight","measure","resizeMessages","encoded","pixels","percents","measureW","measureH","ratio","aspectRatioLocked","resetNumericsTo","_preventChange","widthNumeric","heightNumeric","isPercent","setOptions","ImageEditorPane","imageeditorNS","Command","OpenPaneImageEditorCommand","exec","pane","ZoomImageEditorCommand","zoomStep","spacing","imgHeight","currentZoom","newHeight","isNaN","_processStringValue","parseFloat","_canvas","_zoomLevel","initialZoom","expectedHeight","canvasWrapper","CropImageEditorCommand","ctx","getCurrent2dContext","croppedImage","getImageData","clearRect","putImageData","drawImage","toDataURL","done","image","drawCanvas","fail","ResizeImageEditorCommand","getCurrentImage","UndoImageEditorCommand","undoStack","pop","redoStack","RedoImageEditorCommand","SaveImageEditorCommand","saveAs","dataURI","OpenImageEditorCommand","upload","_upload","kendoUpload","onSelect","onError","multiple","validation","allowedExtensions","getKendoUpload","click","file","files","rawFile","reader","FileReader","addEventListener","result","_initUndoRedoStack","_toggleTools","readAsDataURL","ImageEditorCommand","commands","Widget","outerHeight","_outerHeight","ERROR","IMAGELOADED","IMAGERENDERED","EXECUTE","imageEditorStyles","header","contentWrapper","ImageEditor","_wrapper","_renderHeader","_contentWrapper","_keyHandler","imageUrl","_drawCanvas","notify","fileName","zoomActualSize","zoomFitToScreen","1:1","4:5","5:7","2:3","16:9","_resizeHandler","onResize","_initToolbar","toolbarElement","toolbarOptions","toolbarHeight","prevent","ctrlKey","keyCode","preventDefault","canRedo","canUndo","hasImage","canExport","deferred","Deferred","Image","onload","progress","resolve","onerror","reject","arguments","promise","getContext","_ctx","commandName","commandOptions","plugin"],"mappings":"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","file":"kendo.imageeditor.min.js","sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function (f, define) {\n define('imageeditor/toolbar', [\n 'kendo.toolbar',\n 'kendo.dropdownlist'\n ], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, ui = kendo.ui, extend = $.extend, proxy = $.proxy, ToolBar = kendo.ui.ToolBar, Item = kendo.toolbar.Item, CLICK = 'click', DROPDOWNCHANGE = 'dropDownChange', ACTION = 'action';\n var ImageEditorToolBar = ToolBar.extend({\n init: function (element, options) {\n var that = this;\n that._extendOptions(options);\n ToolBar.fn.init.call(that, element, options);\n that._attachEvents();\n that.toggleTools();\n },\n events: ToolBar.fn.events.concat([\n DROPDOWNCHANGE,\n ACTION\n ]),\n defaultTools: {\n open: {\n type: 'button',\n icon: 'upload',\n name: 'open',\n command: 'OpenImageEditorCommand',\n showText: 'overflow'\n },\n save: {\n type: 'button',\n icon: 'download',\n name: 'save',\n command: 'SaveImageEditorCommand',\n showText: 'overflow',\n toggleCondition: 'canExport'\n },\n separator: { type: 'separator' },\n undo: {\n type: 'button',\n icon: 'undo',\n name: 'undo',\n command: 'UndoImageEditorCommand',\n showText: 'overflow',\n toggleCondition: 'undo'\n },\n redo: {\n type: 'button',\n icon: 'redo',\n name: 'redo',\n command: 'RedoImageEditorCommand',\n showText: 'overflow',\n toggleCondition: 'redo'\n },\n separator1: { type: 'separator' },\n crop: {\n type: 'button',\n icon: 'crop',\n name: 'crop',\n command: 'OpenPaneImageEditorCommand',\n options: 'crop',\n showText: 'overflow',\n toggleCondition: 'canExport'\n },\n resize: {\n type: 'button',\n icon: 'image-resize',\n name: 'resize',\n command: 'OpenPaneImageEditorCommand',\n options: 'resize',\n showText: 'overflow',\n toggleCondition: 'canExport'\n },\n zoomIn: {\n type: 'button',\n icon: 'zoom-in',\n name: 'zoomIn',\n command: 'ZoomImageEditorCommand',\n showText: 'overflow',\n options: 'zoomIn',\n toggleCondition: 'enable'\n },\n zoomOut: {\n type: 'button',\n icon: 'zoom-out',\n name: 'zoomOut',\n command: 'ZoomImageEditorCommand',\n showText: 'overflow',\n options: 'zoomOut',\n toggleCondition: 'enable'\n },\n zoomDropdown: {\n type: 'imageEditorZoomDropDown',\n name: 'zoomDropdown',\n command: 'ZoomImageEditorCommand',\n text: 'Zoom options',\n toggleCondition: 'enable',\n items: [\n {\n name: 'zoomActualSize',\n icon: 'zoom-actual-size',\n text: 'Show actual size',\n options: 'actualSize'\n },\n {\n name: 'zoomFitToScreen',\n icon: 'zoom-best-fit',\n text: 'Fit to screen',\n options: 'fitToScreen'\n }\n ]\n }\n },\n _attachEvents: function () {\n var that = this;\n that.bind(DROPDOWNCHANGE, proxy(that._dropDownChange, that));\n that.bind(CLICK, proxy(that._click, that));\n },\n _extendOptions: function (options) {\n var that = this, tools = options.items ? options.items : Object.keys(that.defaultTools);\n that.options = options;\n that.options.items = that._extendToolsOptions(tools);\n },\n _extendToolsOptions: function (tools) {\n var that = this, messages = that.options.messages;\n if (!tools.length) {\n return;\n }\n return tools.map(function (tool) {\n var isBuiltInTool = $.isPlainObject(tool) && Object.keys(tool).length === 1 && tool.name, toolOptions, text;\n tool = isBuiltInTool ? tool.name : tool;\n toolOptions = $.isPlainObject(tool) ? tool : extend({}, that.defaultTools[tool]);\n text = messages[toolOptions.name] || toolOptions.text;\n kendo.deepExtend(toolOptions, {\n id: toolOptions.name + '-' + kendo.guid(),\n name: toolOptions.name,\n text: text,\n attributes: {\n 'aria-label': text,\n 'title': text,\n 'data-command': toolOptions.command,\n 'data-options': toolOptions.options,\n 'data-toggle': toolOptions.toggleCondition\n },\n overflow: toolOptions.overflow\n });\n if (toolOptions.type === 'imageEditorZoomDropDown') {\n toolOptions.items = that._extendToolsOptions(toolOptions.items);\n }\n return toolOptions;\n }, that);\n },\n _click: function (ev) {\n var command = $(ev.target).data('command'), options = $(ev.target).data('options');\n if (!command) {\n return;\n }\n this.action({\n command: command,\n options: options\n });\n },\n _dropDownChange: function (ev) {\n if (!ev.command) {\n return;\n }\n this.action({\n command: ev.command,\n options: ev.options\n });\n },\n action: function (args) {\n this.trigger(ACTION, args);\n },\n toggleTools: function (conditions) {\n var that = this, tools = that.element.find('[data-toggle]');\n tools.each(function (index, elm) {\n var tool = $(elm), widget = null, condition = tool.data('toggle'), toToggle = conditions && conditions[condition];\n if (tool.is('[data-role]')) {\n widget = kendo.widgetInstance(tool);\n }\n if (widget && widget.enable) {\n widget.enable(toToggle || false);\n } else {\n that.enable(tool, toToggle);\n }\n });\n },\n destroy: function () {\n var that = this;\n if (that.zoomDropdown) {\n that.zoomDropdown.destroy();\n }\n ToolBar.fn.destroy.call(this);\n }\n });\n var ImageEditorZoomDropDown = Item.extend({\n init: function (options, toolbar) {\n var that = this, element = $('
'), input = $('').attr(options.attributes), template = ' #:text#';\n that.element = element;\n that.input = input;\n that.toolbar = toolbar;\n that.dropDown = new ui.DropDownList(that.input, {\n optionLabel: {\n text: options.text,\n icon: ''\n },\n dataTextField: 'text',\n dataSource: options.items,\n template: template,\n change: proxy(that._change, that)\n });\n that.element.append(that.dropDown.wrapper);\n that.dropDown.list.find('.k-list-optionlabel').hide();\n that.toolbar.zoomDropdown = that;\n },\n _change: function (ev) {\n var that = this;\n that.toolbar.trigger(DROPDOWNCHANGE, {\n command: ev.sender.element.data('command'),\n options: ev.sender.dataItem().options\n });\n },\n destroy: function () {\n this.dropDown.destroy();\n }\n });\n kendo.toolbar.registerComponent('imageEditorZoomDropDown', ImageEditorZoomDropDown);\n extend(kendo.ui, {\n imageeditor: {\n ToolBar: ImageEditorToolBar,\n ZoomDropDown: ImageEditorZoomDropDown\n }\n });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('imageeditor/pane', [\n 'kendo.core',\n 'kendo.form',\n 'kendo.buttongroup',\n 'kendo.draganddrop'\n ], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, extend = $.extend, proxy = $.proxy, Class = kendo.Class, NS = '.k-imageeditor-pane', CLICK = 'click';\n var paneStyles = {\n form: 'k-imageeditor-pane-form',\n button: 'k-imageeditor-pane-button',\n confirmButton: 'k-imageeditor-pane-confirm-button',\n cropOverlay: 'k-imageeditor-crop-overlay',\n crop: 'k-imageeditor-crop',\n resizeHandle: 'k-resize-handle',\n resizeHandlePrefix: 'k-resize-'\n };\n var round = function (f) {\n return Math.round(f * 1000) / 1000;\n };\n var Pane = Class.extend({\n init: function (imageeditor) {\n var that = this;\n that.imageeditor = imageeditor;\n if (that.imageeditor.currentPaneTool) {\n that.imageeditor.currentPaneTool.destroy();\n }\n that.element = $('
').addClass(paneStyles.form);\n },\n open: function () {\n var that = this, imageeditor = that.imageeditor, commonMessages = imageeditor.options.messages.common;\n imageeditor.paneWrapper.append(that.element);\n that.formWidget = new kendo.ui.Form(that.element, extend(that.formSettings(), { buttonsTemplate: kendo.format('' + '', paneStyles.button, paneStyles.confirmButton, commonMessages.cancel, commonMessages.confirm) }));\n that.bindButtonEvents();\n imageeditor.paneWrapper.show();\n imageeditor.currentPaneTool = that;\n },\n bindButtonEvents: function () {\n var that = this, formWidget = that.formWidget, buttons = formWidget.element.find('.' + paneStyles.button);\n that._clickHandler = proxy(that._click, that);\n buttons.on(CLICK + NS, that._clickHandler);\n },\n _click: function (ev) {\n var that = this, target = $(ev.target), action = target.data('action');\n if (that[action]) {\n that[action]();\n }\n },\n cancel: function () {\n this.destroy();\n },\n confirm: function () {\n window.console.error('Pane\\'s confirm method is not implemented!');\n this.destroy();\n },\n refresh: function () {\n },\n destroy: function () {\n var that = this, imageeditor = that.imageeditor;\n that.formWidget.element.find('.' + paneStyles.button).off(NS);\n that.formWidget.destroy();\n imageeditor.paneWrapper.html('');\n imageeditor.paneWrapper.hide();\n delete imageeditor.currentPaneTool;\n }\n });\n var CropPane = Pane.extend({\n init: function (imageeditor) {\n var that = this;\n Pane.fn.init.call(that, imageeditor);\n that.buildCropModel();\n that.canvasUI();\n },\n confirm: function () {\n var that = this, model = that.formWidget._model.toJSON();\n that.destroy();\n that.imageeditor.executeCommand({\n command: 'CropImageEditorCommand',\n options: model\n });\n },\n formSettings: function () {\n var that = this, cropMessages = that.imageeditor.options.messages.panes.crop, commonMessages = that.imageeditor.options.messages.common, aspectRatioItems = cropMessages.aspectRatioItems, aspectRatioDS = [];\n if (aspectRatioItems) {\n for (var key in aspectRatioItems) {\n aspectRatioDS.push({\n value: key,\n text: aspectRatioItems[key]\n });\n }\n } else {\n aspectRatioDS = [\n {\n value: 'originalRatio',\n text: 'Original ratio'\n },\n {\n value: '1:1',\n text: '1:1 (Square)'\n },\n {\n value: '4:5',\n text: '4:5 (8:10)'\n },\n {\n value: '5:7',\n text: '5:7'\n },\n {\n value: '2:3',\n text: '2:3 (4:6)'\n },\n {\n value: '16:9',\n text: '16:9'\n }\n ];\n }\n return {\n formData: that._model,\n change: proxy(that.onChange, that),\n items: [{\n type: 'group',\n label: cropMessages.title || 'Crop Image',\n layout: 'grid',\n grid: {\n cols: 2,\n gutter: '0 8px'\n },\n items: [\n {\n label: cropMessages.aspectRatio || 'Aspect ratio:',\n field: 'aspectRatio',\n editor: 'DropDownList',\n editorOptions: {\n dataValueField: 'value',\n dataTextField: 'text',\n dataSource: aspectRatioDS\n },\n colSpan: 2\n },\n {\n label: cropMessages.orientation,\n field: 'orientation',\n editor: $.proxy(that._orientationEditor, that),\n colSpan: 2\n },\n {\n label: commonMessages.width || 'Width:',\n field: 'width',\n attributes: { style: 'max-width: 100px;' },\n editor: 'NumericTextBox',\n editorOptions: {\n format: 'n0',\n max: that._model.width,\n min: 0\n },\n colSpan: 1\n },\n {\n label: commonMessages.height || 'Height:',\n field: 'height',\n attributes: { style: 'max-width: 100px;' },\n editor: 'NumericTextBox',\n editorOptions: {\n format: 'n0',\n max: that._model.height,\n min: 0\n },\n colSpan: 1\n },\n {\n label: commonMessages.lockAspectRatio || 'Lock aspect ratio',\n field: 'lockAspectRatio',\n colSpan: 2\n }\n ]\n }]\n };\n },\n _orientationEditor: function (container, options) {\n var that = this, cropMessages = that.imageeditor.options.messages.panes.crop, value = options.model[options.field];\n $('
').appendTo(container).kendoButtonGroup({\n items: [\n {\n text: cropMessages.portrait || 'Portrait',\n attributes: { 'data-value': 'portrait' },\n selected: value === 'portrait'\n },\n {\n text: cropMessages.landscape || 'Landscape',\n attributes: { 'data-value': 'landscape' },\n selected: value === 'landscape'\n }\n ],\n select: function (ev) {\n var value = ev.sender.wrapper.find('.k-state-active').data('value');\n options.model.set(options.field, value);\n }\n });\n },\n buildCropModel: function () {\n var that = this, imageeditor = that.imageeditor, canvas = imageeditor.getCanvasElement(), width = canvas.width, height = canvas.height;\n that._model = {\n top: 0,\n left: 0,\n aspectRatio: 'originalRatio',\n width: width,\n height: height,\n orientation: width - height < 0 ? 'portrait' : 'landscape',\n lockAspectRatio: true\n };\n },\n canvasUI: function () {\n var that = this, imageeditor = that.imageeditor, canvasContainer = that.imageeditor.canvasContainer, cropOverlay = $('
').addClass(paneStyles.cropOverlay), cropElement = $('
').addClass(paneStyles.crop), handle = '', handles = [\n 'nw',\n 'n',\n 'ne',\n 'w',\n 'e',\n 'sw',\n 's',\n 'se'\n ], zoomLevel = imageeditor.getZoomLevel();\n for (var i = 0; i < handles.length; i++) {\n var handleElm = $(handle).addClass(paneStyles.resizeHandlePrefix + handles[i]).attr('data-orientation', handles[i]);\n that._initResizeHandle(handleElm);\n cropElement.append(handleElm);\n }\n that.cropElement = cropElement;\n that._canvasUI = cropOverlay.append(cropElement).appendTo(canvasContainer);\n var width = Math.round(that._model.width * zoomLevel);\n var height = Math.round(that._model.height * zoomLevel);\n var borderWidth = parseInt(that.cropElement.css('border-top-width'), 10);\n that.cropElement.css({\n width: width,\n height: height,\n backgroundImage: 'url(\\'' + imageeditor._image.src + '\\')',\n backgroundSize: kendo.format('{0}px {1}px', width, height),\n backgroundClip: 'content-box',\n backgroundPosition: kendo.format('-{0}px -{0}px', borderWidth)\n });\n that.cropElement.kendoDraggable({\n ignore: '.' + paneStyles.resizeHandle,\n drag: function (ev) {\n that._adjustTopLeft(ev.target.offsetTop + ev.y.delta, ev.target.offsetLeft + ev.x.delta);\n }\n });\n },\n refresh: function () {\n var that = this, newModel = that.formWidget._model, zoomLevel = that.imageeditor.getZoomLevel(), width = Math.round(newModel.width * zoomLevel), height = Math.round(newModel.height * zoomLevel), top = Math.round(newModel.top * zoomLevel), left = Math.round(newModel.left * zoomLevel), borderWidth = parseInt(that.cropElement.css('border-top-width'), 10);\n that.cropElement.css({\n top: top,\n left: left,\n width: width,\n height: height,\n backgroundSize: kendo.format('{0}px {1}px', that._model.width * zoomLevel, that._model.height * zoomLevel),\n backgroundPosition: kendo.format('-{0}px -{1}px', left + borderWidth, top + borderWidth)\n });\n },\n _initResizeHandle: function (handle) {\n var that = this;\n handle.kendoDraggable({\n drag: function (ev) {\n var $target = $(ev.sender.element), newModel = that.formWidget._model, oldModel = that._model, orientation = $target.data('orientation'), adjustments = {}, zoomLevel = that.imageeditor.getZoomLevel(), correctedLeft = newModel.left * zoomLevel, correctedTop = newModel.top * zoomLevel;\n if (orientation.indexOf('w') >= 0) {\n adjustments.left = that.cropElement[0].offsetLeft + ev.x.delta;\n adjustments.width = that.cropElement[0].offsetWidth - ev.x.delta;\n } else if (orientation.indexOf('e') >= 0) {\n adjustments.width = that.cropElement[0].offsetWidth + ev.x.delta;\n }\n if (orientation.indexOf('n') >= 0) {\n adjustments.top = that.cropElement[0].offsetTop + ev.y.delta;\n adjustments.height = that.cropElement[0].offsetHeight - ev.y.delta;\n } else if (orientation.indexOf('s') >= 0) {\n adjustments.height = that.cropElement[0].offsetHeight + ev.y.delta;\n }\n if (adjustments.width && (adjustments.left || correctedLeft) + adjustments.width <= oldModel.width * zoomLevel) {\n newModel.set('width', Math.round(adjustments.width / zoomLevel));\n }\n if (adjustments.height && (adjustments.top || correctedTop) + adjustments.height <= oldModel.height * zoomLevel) {\n newModel.set('height', Math.round(adjustments.height / zoomLevel));\n }\n if (adjustments.top || adjustments.left) {\n that._adjustTopLeft(adjustments.top, adjustments.left);\n }\n }\n });\n },\n _adjustTopLeft: function (top, left, compare) {\n var that = this, compareModel = compare || that.formWidget._model, newModel = that.formWidget._model, oldModel = that._model, zoomLevel = that.imageeditor.getZoomLevel();\n if (top >= 0 && top / zoomLevel + compareModel.height <= oldModel.height) {\n newModel.set('top', Math.round(top / zoomLevel));\n }\n if (left >= 0 && left / zoomLevel + compareModel.width <= oldModel.width) {\n newModel.set('left', Math.round(left / zoomLevel));\n }\n },\n onChange: function (ev) {\n var that = this, zoomLevel = that.imageeditor.getZoomLevel(), newModel = ev.sender._model, oldModel = that._model, maxWidth = oldModel.width, maxHeight = oldModel.height, originalRatio = oldModel.width + ':' + oldModel.height, gcd = that._gcd(oldModel.width, oldModel.height);\n originalRatio = oldModel.width / gcd + ':' + oldModel.height / gcd;\n if (ev.field === 'aspectRatio' && ev.value === 'originalRatio') {\n newModel.set('top', 0);\n newModel.set('left', 0);\n newModel.set('width', oldModel.width);\n newModel.set('height', oldModel.height);\n newModel.set('orientation', oldModel.orientation);\n } else if (ev.field === 'orientation') {\n var tempModel = extend({}, newModel, {\n width: newModel.height,\n height: newModel.width\n });\n var newSize = that._calcSize(tempModel, originalRatio, maxWidth, maxHeight);\n newModel.set('width', newSize.width);\n newModel.set('height', newSize.height);\n } else if (newModel.lockAspectRatio) {\n var force = ev.field;\n var size = that._calcSize(newModel, originalRatio, maxWidth, maxHeight, force);\n newModel.set('width', size.width);\n newModel.set('height', size.height);\n }\n var width = Math.round(newModel.width * zoomLevel);\n var height = Math.round(newModel.height * zoomLevel);\n var top = Math.round(newModel.top * zoomLevel);\n var left = Math.round(newModel.left * zoomLevel);\n var borderWidth = parseInt(that.cropElement.css('border-top-width'), 10);\n that.cropElement.css({\n top: top,\n left: left,\n width: width,\n height: height,\n backgroundPosition: kendo.format('-{0}px -{1}px', left + borderWidth, top + borderWidth)\n });\n },\n _calcSize: function (model, originalRatio, maxWidth, maxHeight, force) {\n var width = Math.min(model.width, maxWidth), height = Math.min(model.height, maxHeight), isPortrait = model.orientation === 'portrait', ratios = model.aspectRatio;\n if (ratios.indexOf(':') < 0) {\n ratios = originalRatio;\n }\n ratios = ratios.split(':').map(function (value) {\n return parseInt(value, 10);\n });\n var wRatio = isPortrait ? Math.min(ratios[0], ratios[1]) : Math.max(ratios[0], ratios[1]);\n var hRatio = !isPortrait ? Math.min(ratios[0], ratios[1]) : Math.max(ratios[0], ratios[1]);\n var expectedRatio = round(wRatio / hRatio);\n var realRatio = round(width / height);\n var sizeByRatio = {\n width: Math.round(height * expectedRatio),\n height: Math.round(width / expectedRatio)\n };\n if (force === 'width') {\n return {\n width: width,\n height: sizeByRatio.height\n };\n }\n if (force === 'height') {\n return {\n width: sizeByRatio.width,\n height: height\n };\n }\n if (realRatio > expectedRatio) {\n width = sizeByRatio.width;\n } else if (realRatio < expectedRatio) {\n height = sizeByRatio.height;\n }\n return {\n width: width,\n height: height\n };\n },\n _gcd: function (a, b) {\n return b === 0 ? a : this._gcd(b, a % b);\n },\n destroy: function () {\n kendo.destroy(this._canvasUI);\n this._canvasUI.remove();\n Pane.fn.destroy.call(this);\n }\n });\n var ResizePane = Pane.extend({\n init: function (imageeditor) {\n Pane.fn.init.call(this, imageeditor);\n this.buildResizeModel();\n },\n confirm: function () {\n var that = this, originalWidth = that._model.width, originalHeight = that._model.height, model = that.formWidget._model.toJSON();\n if (model.measure === 'percents') {\n model.width = originalWidth * (model.width / 100);\n model.height = originalHeight * (model.height / 100);\n }\n that.imageeditor.executeCommand({\n command: 'ResizeImageEditorCommand',\n options: model\n });\n that.destroy();\n },\n formSettings: function () {\n var that = this, resizeMessages = that.imageeditor.options.messages.panes.resize, commonMessages = that.imageeditor.options.messages.common;\n return {\n formData: that._model,\n change: proxy(that.onChange, that),\n items: [{\n type: 'group',\n label: resizeMessages.title || 'Resize image',\n layout: 'grid',\n grid: {\n cols: 2,\n gutter: '0 8px'\n },\n items: [\n {\n label: commonMessages.width || 'Width:',\n field: 'width',\n attributes: { style: 'max-width: 100px;' },\n editor: 'NumericTextBox',\n editorOptions: {\n format: 'n0',\n min: 0\n },\n colSpan: 1\n },\n {\n field: 'measureW',\n editor: 'DropDownList',\n attributes: { style: 'max-width: 100px;' },\n label: {\n text: ' ',\n encoded: false\n },\n editorOptions: {\n dataTextField: 'text',\n dataValueField: 'value',\n dataSource: [\n {\n text: resizeMessages.pixels || 'Pixels',\n value: 'pixels'\n },\n {\n text: resizeMessages.percents || 'Percents',\n value: 'percents'\n }\n ]\n },\n colSpan: 1\n },\n {\n label: commonMessages.height || 'Height:',\n field: 'height',\n attributes: { style: 'max-width: 100px;' },\n editor: 'NumericTextBox',\n editorOptions: {\n format: 'n0',\n min: 0\n },\n colSpan: 1\n },\n {\n field: 'measureH',\n label: {\n text: ' ',\n encoded: false\n },\n attributes: { style: 'max-width: 100px;' },\n editor: 'DropDownList',\n editorOptions: {\n dataTextField: 'text',\n dataValueField: 'value',\n dataSource: [\n {\n text: resizeMessages.pixels || 'Pixels',\n value: 'pixels'\n },\n {\n text: resizeMessages.percents || 'Percents',\n value: 'percents'\n }\n ]\n },\n colSpan: 1\n },\n {\n label: commonMessages.lockAspectRatio || 'Lock aspect ratio',\n field: 'lockAspectRatio',\n colSpan: 2\n }\n ]\n }]\n };\n },\n buildResizeModel: function () {\n var that = this, imageeditor = that.imageeditor, canvas = imageeditor.getCanvasElement(), width = canvas.width, height = canvas.height;\n that._model = {\n width: width,\n height: height,\n measure: 'pixels',\n measureW: 'pixels',\n measureH: 'pixels',\n lockAspectRatio: true,\n ratio: round(width / height)\n };\n },\n onChange: function (ev) {\n var that = this, newModel = ev.sender._model, aspectRatioLocked = newModel.lockAspectRatio;\n if (ev.field === 'measureW' || ev.field === 'measureH') {\n newModel.set('measureW', ev.value);\n newModel.set('measureH', ev.value);\n newModel.set('measure', ev.value);\n } else if (ev.field === 'measure') {\n that.resetNumericsTo(ev.value);\n } else if (ev.field === 'width' && aspectRatioLocked && !that._preventChange) {\n newModel.set('height', newModel.width / newModel.ratio);\n } else if (ev.field === 'height' && aspectRatioLocked && !that._preventChange) {\n newModel.set('width', newModel.height * newModel.ratio);\n }\n newModel.set('ratio', round(newModel.width / newModel.height));\n },\n resetNumericsTo: function (type) {\n var that = this, originalWidth = that._model.width, originalHeight = that._model.height, formWidget = that.formWidget, model = formWidget._model, widthNumeric = formWidget.element.find('[name=width]').data('kendoNumericTextBox'), heightNumeric = formWidget.element.find('[name=height]').data('kendoNumericTextBox'), isPercent = type === 'percents', options = {\n percents: { format: '#\\\\%' },\n pixels: { format: 'n0' }\n };\n widthNumeric.setOptions(options[type]);\n heightNumeric.setOptions(options[type]);\n that._preventChange = true;\n model.set('width', isPercent ? originalWidth / widthNumeric.value() * 100 : originalWidth * (widthNumeric.value() / 100));\n model.set('height', isPercent ? originalHeight / heightNumeric.value() * 100 : originalHeight * (heightNumeric.value() / 100));\n that._preventChange = false;\n }\n });\n extend(kendo.ui.imageeditor, {\n ImageEditorPane: Pane,\n panes: {\n crop: CropPane,\n resize: ResizePane\n }\n });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('imageeditor/commands', [\n 'imageeditor/pane',\n 'kendo.upload'\n ], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, imageeditorNS = kendo.ui.imageeditor, extend = $.extend, proxy = $.proxy, Class = kendo.Class;\n var Command = Class.extend({\n init: function (options) {\n this.options = extend({}, options, this.options);\n this.imageeditor = options.imageeditor;\n }\n });\n var OpenPaneImageEditorCommand = Command.extend({\n init: function (options) {\n Command.fn.init.call(this, options);\n },\n exec: function () {\n var that = this, imageeditor = that.imageeditor, pane = new imageeditorNS.panes[that.options.value](imageeditor);\n pane.open();\n }\n });\n var ZoomImageEditorCommand = Command.extend({\n options: {\n zoomStep: 0.05,\n spacing: 20\n },\n init: function (options) {\n Command.fn.init.call(this, options);\n },\n exec: function () {\n var that = this, options = that.options, value = options.value, imageeditor = that.imageeditor, imgHeight = imageeditor._image.height, currentZoom = imageeditor.getZoomLevel(), newHeight = imgHeight;\n if (!isNaN(value)) {\n value = parseFloat(value);\n } else if (typeof value === 'string') {\n value = that._processStringValue(value, currentZoom);\n }\n newHeight = Math.round(imgHeight * value);\n if (newHeight > 0) {\n $(imageeditor._canvas).css('height', newHeight);\n imageeditor._zoomLevel = value;\n }\n if (imageeditor.currentPaneTool) {\n imageeditor.currentPaneTool.refresh();\n }\n },\n _processStringValue: function (value, initialZoom) {\n var that = this, options = that.options, imageeditor = that.imageeditor, imgHeight = imageeditor._image.height, expectedHeight = imageeditor.canvasWrapper.height() - options.spacing, zoomStep = options.zoomStep;\n switch (value) {\n case 'zoomIn':\n return initialZoom + zoomStep;\n case 'zoomOut':\n return initialZoom - zoomStep;\n case 'fitToScreen':\n return Math.round(expectedHeight / imgHeight * 100) / 100;\n default:\n return 1;\n }\n }\n });\n var CropImageEditorCommand = Command.extend({\n init: function (options) {\n Command.fn.init.call(this, options);\n },\n exec: function () {\n var that = this, options = that.options, imageeditor = that.imageeditor, canvas = imageeditor.getCanvasElement(), ctx = imageeditor.getCurrent2dContext(), croppedImage = ctx.getImageData(options.left, options.top, options.width, options.height);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = options.width;\n canvas.height = options.height;\n ctx.putImageData(croppedImage, 0, 0);\n imageeditor.drawImage(canvas.toDataURL()).done(function (image) {\n imageeditor.drawCanvas(image);\n }).fail(function (ev) {\n imageeditor.trigger('error', ev);\n });\n }\n });\n var ResizeImageEditorCommand = Command.extend({\n init: function (options) {\n Command.fn.init.call(this, options);\n },\n exec: function () {\n var that = this, options = that.options, imageeditor = that.imageeditor, canvas = imageeditor.getCanvasElement(), ctx = imageeditor.getCurrent2dContext(), image = imageeditor.getCurrentImage();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = options.width;\n canvas.height = options.height;\n ctx.drawImage(image, 0, 0, options.width, options.height);\n imageeditor.drawImage(canvas.toDataURL()).done(function (image) {\n imageeditor.drawCanvas(image);\n }).fail(function (ev) {\n imageeditor.trigger('error', ev);\n });\n }\n });\n var UndoImageEditorCommand = Command.extend({\n exec: function () {\n var that = this, imageeditor = that.imageeditor, canvas = imageeditor.getCanvasElement(), ctx = imageeditor.getCurrent2dContext(), image = imageeditor.undoStack.pop();\n if (image) {\n imageeditor.redoStack.push(imageeditor.getCurrentImage());\n delete imageeditor._image;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = image.width;\n canvas.height = image.height;\n ctx.drawImage(image, 0, 0, image.width, image.height);\n imageeditor.drawImage(canvas.toDataURL()).done(function (image) {\n imageeditor.drawCanvas(image);\n }).fail(function (ev) {\n imageeditor.trigger('error', ev);\n });\n }\n }\n });\n var RedoImageEditorCommand = Command.extend({\n exec: function () {\n var that = this, imageeditor = that.imageeditor, canvas = imageeditor.getCanvasElement(), ctx = imageeditor.getCurrent2dContext(), image = imageeditor.redoStack.pop();\n if (image) {\n imageeditor.undoStack.push(imageeditor.getCurrentImage());\n delete imageeditor._image;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = image.width;\n canvas.height = image.height;\n ctx.drawImage(image, 0, 0, image.width, image.height);\n imageeditor.drawImage(canvas.toDataURL()).done(function (image) {\n imageeditor.drawCanvas(image);\n }).fail(function (ev) {\n imageeditor.trigger('error', ev);\n });\n }\n }\n });\n var SaveImageEditorCommand = Command.extend({\n exec: function () {\n var that = this, imageeditor = that.imageeditor, canvas = imageeditor.getCanvasElement();\n kendo.saveAs(extend({}, imageeditor.options.saveAs, { dataURI: canvas.toDataURL() }));\n }\n });\n var OpenImageEditorCommand = Command.extend({\n exec: function () {\n var that = this, imageeditor = that.imageeditor, upload = imageeditor._upload;\n if (!upload) {\n var input = $('');\n input.kendoUpload({\n select: proxy(that.onSelect, that),\n error: proxy(that.onError, that),\n multiple: false,\n validation: {\n allowedExtensions: [\n '.jpg',\n '.jpeg',\n '.gif',\n '.png',\n '.bmp',\n '.tiff',\n '.webp'\n ]\n }\n });\n imageeditor._upload = upload = input.getKendoUpload();\n }\n upload.element.click();\n },\n onSelect: function (ev) {\n var that = this, imageeditor = that.imageeditor, file = ev.files[0].rawFile, reader = new FileReader();\n reader.addEventListener('load', function () {\n imageeditor.drawImage(reader.result).done(function (image) {\n if (!imageeditor.trigger('imageLoaded', { image: image })) {\n imageeditor.drawCanvas(image);\n imageeditor._initUndoRedoStack();\n imageeditor._toggleTools();\n }\n }).fail(function (ev) {\n imageeditor.trigger('error', ev);\n });\n }, false);\n if (file) {\n reader.readAsDataURL(file);\n }\n },\n onError: function (ev) {\n var that = this, imageeditor = that.imageeditor;\n imageeditor.trigger('error', ev);\n }\n });\n extend(kendo.ui.imageeditor, {\n ImageEditorCommand: Command,\n commands: {\n OpenPaneImageEditorCommand: OpenPaneImageEditorCommand,\n ZoomImageEditorCommand: ZoomImageEditorCommand,\n CropImageEditorCommand: CropImageEditorCommand,\n ResizeImageEditorCommand: ResizeImageEditorCommand,\n UndoImageEditorCommand: UndoImageEditorCommand,\n RedoImageEditorCommand: RedoImageEditorCommand,\n SaveImageEditorCommand: SaveImageEditorCommand,\n OpenImageEditorCommand: OpenImageEditorCommand\n }\n });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.imageeditor', [\n 'imageeditor/toolbar',\n 'imageeditor/commands'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'imageeditor',\n name: 'ImageEditor',\n category: 'web',\n depends: ['core']\n };\n (function ($, undefined) {\n var kendo = window.kendo, extend = $.extend, isPlainObject = $.isPlainObject, Widget = kendo.ui.Widget, ui = kendo.ui, NS = '.kendoImageEditor', outerHeight = kendo._outerHeight, ERROR = 'error', IMAGELOADED = 'imageLoaded', IMAGERENDERED = 'imageRendered', EXECUTE = 'execute';\n var imageEditorStyles = {\n wrapper: 'k-widget k-imageeditor',\n header: 'k-imageeditor-header',\n toolbar: 'k-imageeditor-toolbar',\n paneWrapper: 'k-imageeditor-action-pane',\n contentWrapper: 'k-imageeditor-content',\n canvasWrapper: 'k-imageeditor-canvas-container',\n canvasContainer: 'k-imageeditor-canvas'\n };\n var ImageEditor = Widget.extend({\n init: function (element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n options = $.extend(true, {}, options);\n that._wrapper();\n that._renderHeader();\n that._contentWrapper();\n that._keyHandler();\n if (options.imageUrl) {\n that._drawCanvas();\n }\n that._initUndoRedoStack();\n that._toggleTools();\n kendo.notify(that);\n },\n options: {\n name: 'ImageEditor',\n width: '100%',\n height: 570,\n imageUrl: '',\n toolbar: {},\n saveAs: { fileName: 'image.png' },\n messages: {\n toolbar: {\n open: 'Open Image',\n save: 'Save Image',\n undo: 'Undo',\n redo: 'Redo',\n crop: 'Crop',\n resize: 'Resize',\n zoomIn: 'Zoom In',\n zoomOut: 'Zoom Out',\n zoomDropdown: 'Zoom options',\n zoomActualSize: 'Show actual size',\n zoomFitToScreen: 'Fit to screen'\n },\n panes: {\n crop: {\n title: 'Crop Image',\n aspectRatio: 'Aspect Ratio:',\n aspectRatioItems: {\n 'originalRatio': 'Original ratio',\n '1:1': '1:1 (Square)',\n '4:5': '4:5 (8:10)',\n '5:7': '5:7',\n '2:3': '2:3 (4:6)',\n '16:9': '16:9'\n },\n orientation: 'Orientation:',\n portrait: 'Portrait',\n landscape: 'Landscape'\n },\n resize: {\n title: 'Resize image',\n pixels: 'Pixels',\n percents: 'Percents'\n }\n },\n common: {\n width: 'Width:',\n height: 'Height:',\n cancel: 'Cancel',\n confirm: 'Confirm',\n lockAspectRatio: 'Lock aspect ratio'\n }\n }\n },\n events: [\n ERROR,\n IMAGELOADED,\n IMAGERENDERED,\n EXECUTE\n ],\n _wrapper: function () {\n var that = this, options = that.options, width = options.width, height = options.height;\n that.wrapper = that.element.addClass(imageEditorStyles.wrapper);\n if (width) {\n that.wrapper.width(width);\n }\n if (height) {\n that.wrapper.height(height);\n }\n that._resizeHandler = kendo.onResize(function () {\n that.resize(true);\n });\n },\n _renderHeader: function () {\n var that = this, options = that.options;\n that.header = $('
').addClass(imageEditorStyles.header);\n if (options.toolbar) {\n that.header.append(that._initToolbar().element);\n }\n that.wrapper.append(that.header);\n },\n _initToolbar: function () {\n var that = this, options = that.options, toolbarElement = $('
').addClass(imageEditorStyles.toolbar), toolbarOptions = extend({}, options.toolbar, {\n messages: options.messages.toolbar,\n action: that.executeCommand.bind(that)\n });\n that.toolbar = new ui.imageeditor.ToolBar(toolbarElement, toolbarOptions);\n return that.toolbar;\n },\n _contentWrapper: function () {\n var that = this, contentWrapper = $('
').addClass(imageEditorStyles.contentWrapper), canvasWrapper = $('
').addClass(imageEditorStyles.canvasWrapper), canvasContainer = $('
').addClass(imageEditorStyles.canvasContainer), paneWrapper = $('
').addClass(imageEditorStyles.paneWrapper).hide(), toolbarHeight = outerHeight(that.header);\n that.canvasWrapper = canvasWrapper;\n that.canvasContainer = canvasContainer;\n that.paneWrapper = paneWrapper;\n canvasWrapper.append(canvasContainer);\n contentWrapper.height(outerHeight(that.wrapper) - toolbarHeight);\n contentWrapper.append(canvasWrapper).append(paneWrapper);\n that.wrapper.append(contentWrapper);\n },\n _keyHandler: function () {\n var that = this, prevent = false;\n that.wrapper.on('keydown' + NS, function (ev) {\n if (ev.ctrlKey) {\n switch (ev.keyCode) {\n case 48:\n that.executeCommand({\n command: 'ZoomImageEditorCommand',\n options: 'fitToScreen'\n });\n prevent = true;\n break;\n case 189:\n that.executeCommand({\n command: 'ZoomImageEditorCommand',\n options: 'zoomOut'\n });\n prevent = true;\n break;\n case 187:\n that.executeCommand({\n command: 'ZoomImageEditorCommand',\n options: 'zoomIn'\n });\n prevent = true;\n break;\n case 90:\n that.executeCommand({ command: 'UndoImageEditorCommand' });\n prevent = true;\n break;\n case 89:\n that.executeCommand({ command: 'RedoImageEditorCommand' });\n prevent = true;\n break;\n }\n if (prevent) {\n ev.preventDefault();\n }\n }\n });\n },\n _drawCanvas: function () {\n var that = this;\n var imageUrl = that.options.imageUrl;\n that.drawImage(imageUrl).done(function (image) {\n if (!that.trigger(IMAGELOADED, { image: image })) {\n that.drawCanvas(image);\n }\n }).fail(function (ev) {\n that.trigger(ERROR, ev);\n });\n },\n _initUndoRedoStack: function () {\n var that = this;\n that.undoStack = [];\n that.redoStack = [];\n },\n _toggleTools: function () {\n var that = this, canRedo = that.redoStack.length > 0, canUndo = that.undoStack.length > 0, hasImage = !!that._image, canExport = true;\n try {\n that._canvas.toDataURL();\n } catch (error) {\n canExport = false;\n }\n that.toolbar.toggleTools({\n redo: canRedo,\n undo: canUndo,\n enable: hasImage,\n canExport: canExport\n });\n },\n drawImage: function (imageUrl) {\n var that = this, deferred = new $.Deferred(), image = new Image();\n image.onload = function () {\n kendo.ui.progress(that.canvasContainer, false);\n deferred.resolve(image);\n };\n image.onerror = function () {\n kendo.ui.progress(that.canvasContainer, false);\n deferred.reject(arguments);\n };\n kendo.ui.progress(that.canvasContainer, true);\n image.src = imageUrl;\n return deferred.promise();\n },\n drawCanvas: function (image) {\n var that = this;\n var canvas = $('Canvas element')[0];\n var ctx = canvas.getContext('2d');\n if (that._canvas) {\n $(that._canvas).remove();\n }\n if (that._image) {\n that.undoStack.push(that._image);\n }\n that._canvas = canvas;\n that._ctx = ctx;\n that._image = image;\n canvas.width = image.width;\n canvas.height = image.height;\n ctx.drawImage(image, 0, 0);\n that.canvasContainer.append(canvas);\n if (image.height > that.canvasWrapper.height()) {\n that.executeCommand({\n command: 'ZoomImageEditorCommand',\n options: 'fitToScreen'\n });\n } else {\n that.executeCommand({\n command: 'ZoomImageEditorCommand',\n options: that.getZoomLevel()\n });\n }\n that.trigger(IMAGERENDERED, {\n canvas: canvas,\n ctx: ctx,\n image: image\n });\n that._toggleTools();\n },\n getCanvasElement: function () {\n return this._canvas;\n },\n getCurrent2dContext: function () {\n return this._ctx;\n },\n getCurrentImage: function () {\n return this._image;\n },\n executeCommand: function (args) {\n var commandName = args.command, commandOptions = extend({ imageeditor: this }, isPlainObject(args.options) ? args.options : { value: args.options }), command = new ui.imageeditor.commands[commandName](commandOptions);\n if (!this.trigger(EXECUTE, args)) {\n this._toggleTools();\n return command.exec();\n }\n },\n getZoomLevel: function () {\n return this._zoomLevel || 1;\n },\n destroy: function () {\n var that = this;\n that.element.off(NS);\n if (that.currentPaneTool) {\n that.currentPaneTool.destroy();\n }\n if (that.toolbar) {\n that.toolbar.destroy();\n }\n if (that._upload) {\n that._upload.destroy();\n }\n Widget.fn.destroy.call(that);\n }\n });\n ui.plugin(ImageEditor);\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"]}