{"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","canvasContainer","cropElement","handle","handles","zoomLevel","getZoomLevel","_initResizeHandle","css","_canvasUI","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","parseInt","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","_image","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","src","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, 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 = that.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.css({\n width: that._model.width * zoomLevel,\n height: that._model.height * zoomLevel\n });\n that._canvasUI = cropOverlay.append(cropElement).appendTo(canvasContainer);\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();\n that.cropElement.css({\n top: newModel.top * zoomLevel,\n left: newModel.left * zoomLevel,\n width: newModel.width * zoomLevel,\n height: newModel.height * zoomLevel\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 that.cropElement.css({\n top: newModel.top * zoomLevel,\n left: newModel.left * zoomLevel,\n width: newModel.width * zoomLevel,\n height: newModel.height * zoomLevel\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 = 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}));"]}