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