{"version":3,"file":"kendo.window.min.js","sources":["kendo.window.js"],"sourcesContent":["(function(f, define) {\n define('kendo.window',[ \"kendo.draganddrop\", \"kendo.popup\"], f);\n})(function() {\n\n var __meta__ = {\n id: \"window\",\n name: \"Window\",\n category: \"web\",\n description: \"The Window widget displays content in a modal or non-modal HTML window.\",\n depends: [ \"draganddrop\", \"popup\" ],\n features: [ {\n id: \"window-fx\",\n name: \"Animation\",\n description: \"Support for animation\",\n depends: [ \"fx\" ]\n } ]\n };\n\n (function($, undefined) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n TabKeyTrap = kendo.ui.Popup.TabKeyTrap,\n Draggable = kendo.ui.Draggable,\n isPlainObject = $.isPlainObject,\n activeElement = kendo._activeElement,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n extend = $.extend,\n each = $.each,\n template = kendo.template,\n BODY = \"body\",\n templates,\n NS = \".kendoWindow\",\n MODAL_NS = \".kendoWindowModal\",\n // classNames\n KWINDOW = \".k-window\",\n KWINDOWTITLE = \".k-window-title\",\n KWINDOWTITLEBAR = KWINDOWTITLE + \"bar\",\n KWINDOWCONTENT = \".k-window-content\",\n KDIALOGCONTENT = \".k-dialog-content\",\n KWINDOWRESIZEHANDLES = \".k-resize-handle\",\n KOVERLAY = \".k-overlay\",\n KCONTENTFRAME = \"k-content-frame\",\n LOADING = \"k-i-loading\",\n KHOVERSTATE = \"k-hover\",\n KFOCUSEDSTATE = \"k-focus\",\n MAXIMIZEDSTATE = \"k-window-maximized\",\n INLINE_FLEX = \"k-display-inline-flex\",\n // constants\n VISIBLE = \":visible\",\n HIDDEN = \"hidden\",\n CURSOR = \"cursor\",\n // events\n OPEN = \"open\",\n ACTIVATE = \"activate\",\n DEACTIVATE = \"deactivate\",\n CLOSE = \"close\",\n REFRESH = \"refresh\",\n MINIMIZE = \"minimize\",\n MAXIMIZE = \"maximize\",\n RESIZESTART = \"resizeStart\",\n RESIZE = \"resize\",\n RESIZEEND = \"resizeEnd\",\n DRAGSTART = \"dragstart\",\n DRAGEND = \"dragend\",\n RESTORE = \"restore\",\n KENDOKEYDOWN = \"kendoKeydown\",\n ERROR = \"error\",\n OVERFLOW = \"overflow\",\n DATADOCOVERFLOWRULE = \"original-overflow-rule\",\n ZINDEX = \"zIndex\",\n MINIMIZE_MAXIMIZE = \".k-window-actions .k-i-window-minimize,.k-window-actions .k-i-window-maximize\",\n KPIN = \".k-i-pin\",\n KUNPIN = \".k-i-unpin\",\n PIN_UNPIN = KPIN + \",\" + KUNPIN,\n TITLEBAR_BUTTONS = \".k-window-titlebar .k-window-action\",\n REFRESHICON = \".k-window-titlebar .k-i-refresh\",\n WINDOWEVENTSHANDLED = \"WindowEventsHandled\",\n zero = /^0[a-z]*$/i,\n isLocalUrl = kendo.isLocalUrl,\n SIZE = {\n small: \"k-window-sm\",\n medium: \"k-window-md\",\n large: \"k-window-lg\"\n };\n\n function defined(x) {\n return (typeof x != \"undefined\");\n }\n\n function toInt(element, property) {\n return parseInt(element.css(property), 10) || 0;\n }\n\n function constrain(value, low, high) {\n var normalizedValue;\n\n if (value && isNaN(value) && value.toString().indexOf(\"px\") < 0) {\n normalizedValue = value;\n } else {\n normalizedValue = Math.max(\n Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)),\n low === -Infinity ? low : parseInt(low, 10)\n );\n }\n\n return normalizedValue;\n }\n\n function executableScript() {\n return !this.type || this.type.toLowerCase().indexOf(\"script\") >= 0;\n }\n\n\n function getPosition(elem) {\n var result = { top: elem.offsetTop, left: elem.offsetLeft },\n parent = elem.offsetParent;\n\n while (parent) {\n result.top += parent.offsetTop;\n result.left += parent.offsetLeft;\n\n var parentOverflowX = $(parent).css(\"overflowX\");\n var parentOverflowY = $(parent).css(\"overflowY\");\n\n if (parentOverflowY === \"auto\" || parentOverflowY === \"scroll\") {\n result.top -= parent.scrollTop;\n }\n\n if (parentOverflowX === \"auto\" || parentOverflowX === \"scroll\") {\n result.left -= parent.scrollLeft;\n }\n\n parent = parent.offsetParent;\n }\n\n return result;\n }\n\n var Window = Widget.extend({\n init: function(element, options) {\n var that = this,\n wrapper,\n offset = {},\n visibility, display, position,\n isVisible = false,\n content,\n windowContent,\n windowFrame,\n globalWindow,\n suppressActions = options && options.actions && !options.actions.length,\n id;\n\n Widget.fn.init.call(that, element, options);\n options = that.options;\n position = options.position;\n element = that.element;\n content = options.content;\n globalWindow = $(window);\n\n if (suppressActions) {\n options.actions = [];\n }\n\n that.appendTo = $(options.appendTo);\n\n that.containment = options.draggable.containment ? $(options.draggable.containment).first() : null;\n\n if (content && !isPlainObject(content)) {\n content = options.content = { url: content };\n }\n\n // remove script blocks to prevent double-execution\n element.find(\"script\").filter(executableScript).remove();\n\n if (!element.parent().is(that.appendTo) && !that.containment && (position.top === undefined || position.left === undefined)) {\n if (element.is(VISIBLE)) {\n offset = element.offset();\n isVisible = true;\n } else {\n visibility = element.css(\"visibility\");\n display = element.css(\"display\");\n\n element.css({ visibility: HIDDEN, display: \"\" });\n\n if (document.body.contains(element[0])) {\n offset = element.offset();\n } else {\n offset = { top: 0, left: 0 };\n }\n\n element.css({ visibility: visibility, display: display });\n }\n\n if (position.top === undefined) {\n position.top = offset.top;\n }\n if (position.left === undefined) {\n position.left = offset.left;\n }\n }\n\n if (!defined(options.visible) || options.visible === null) {\n options.visible = element.is(VISIBLE);\n }\n\n wrapper = that.wrapper = element.closest(KWINDOW);\n\n if (!element.is(\".k-window-content\") || !wrapper[0]) {\n element.addClass(\"k-window-content\");\n element.attr(\"tabindex\", 0);\n that._createWindow(element, options);\n wrapper = that.wrapper = element.closest(KWINDOW);\n\n that.title(that.options.title);\n that._dimensions();\n }\n\n that.minTop = that.minLeft = -Infinity;\n that.maxTop = that.maxLeft = Infinity;\n that._position();\n\n if (content) {\n that.refresh(content);\n }\n\n if (options.visible) {\n that.toFront(null, !options.modal);\n }\n\n windowContent = wrapper.children(KWINDOWCONTENT);\n\n if (options.visible && options.modal) {\n that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n }\n\n wrapper\n .on(\"mouseenter\" + NS, TITLEBAR_BUTTONS, that._buttonEnter.bind(that))\n .on(\"mouseleave\" + NS, TITLEBAR_BUTTONS, that._buttonLeave.bind(that))\n .on(\"click\" + NS, \"> \" + TITLEBAR_BUTTONS, that._windowActionHandler.bind(that))\n .on(\"keydown\" + NS, that, that._keydown.bind(that))\n .on(\"focus\" + NS, that._focus.bind(that))\n .on(\"blur\" + NS, that._blur.bind(that));\n\n windowContent\n .on(\"keydown\" + NS, that, that._keydownContent.bind(that));\n\n windowFrame = windowContent.find(\".\" + KCONTENTFRAME)[0];\n\n if (windowFrame && !globalWindow.data(WINDOWEVENTSHANDLED)) {\n\n globalWindow.on(\"blur\" + NS, function() {\n var element = $(document.activeElement).parent(KWINDOWCONTENT);\n if (element.length) {\n var windowInstance = kendo.widgetInstance(element);\n windowInstance._focus();\n }\n });\n\n globalWindow.on(\"focus\" + NS, function() {\n $(KWINDOWCONTENT).not(KDIALOGCONTENT).each(function(i, element) {\n kendo.widgetInstance($(element))._blur();\n });\n });\n\n globalWindow.data(WINDOWEVENTSHANDLED, true);\n }\n\n this._resizable();\n\n this._draggable();\n\n if (options.pinned && this.wrapper.is(\":visible\")) {\n that.pin();\n }\n\n id = element.attr(\"id\");\n if (id) {\n id = id + \"_wnd_title\";\n wrapper.attr({\n \"role\": \"dialog\",\n \"aria-labelledby\": id\n }).children(KWINDOWTITLEBAR)\n .children(KWINDOWTITLE)\n .attr(\"id\", id);\n }\n\n wrapper.add(wrapper.children(\".k-resize-handle,\" + KWINDOWTITLEBAR))\n .on(kendo.support.mousedown + NS, that.toFront.bind(that));\n\n that.touchScroller = kendo.touchScroller(element);\n\n that._resizeHandler = that._onDocumentResize.bind(that);\n\n that._marker = kendo.guid().substring(0, 8);\n\n $(window).on(\"resize\" + NS + that._marker, that._resizeHandler);\n\n if (options.visible) {\n that.trigger(OPEN);\n that.trigger(ACTIVATE);\n }\n\n kendo.notify(that);\n\n if (this.options.modal) {\n this._tabKeyTrap = new TabKeyTrap(wrapper);\n this._tabKeyTrap.trap();\n this._tabKeyTrap.shouldTrap = function() {\n return wrapper.data(\"isFront\");\n };\n }\n },\n\n _buttonEnter: function(e) {\n $(e.currentTarget).addClass(KHOVERSTATE);\n },\n\n _buttonLeave: function(e) {\n $(e.currentTarget).removeClass(KHOVERSTATE);\n },\n\n _focus: function() {\n this.wrapper.addClass(KFOCUSEDSTATE);\n },\n\n _blur: function() {\n this.wrapper.removeClass(KFOCUSEDSTATE);\n },\n\n _dimensions: function() {\n var wrapper = this.wrapper;\n var options = this.options;\n var width = options.width;\n var height = options.height;\n var maxHeight = options.maxHeight;\n var sizeClass = options.size;\n var dimensions = [\"minWidth\",\"minHeight\",\"maxWidth\",\"maxHeight\"];\n var contentBoxSizing = wrapper.css(\"box-sizing\") == \"content-box\";\n\n var lrBorderWidth = contentBoxSizing ? toInt(wrapper, \"border-left-width\") + toInt(wrapper, \"border-right-width\") : 0;\n var tbBorderWidth = contentBoxSizing ? toInt(wrapper, \"border-top-width\") + toInt(wrapper, \"border-bottom-width\") : 0;\n var paddingTop = contentBoxSizing ? toInt(wrapper, \"padding-top\") : 0;\n\n if (this.containment && !this._isPinned) {\n this._updateBoundaries();\n options.maxHeight = Math.min(this.containment.height - (tbBorderWidth + paddingTop), maxHeight);\n options.maxWidth = Math.min(this.containment.width - lrBorderWidth, options.maxWidth);\n }\n\n for (var i = 0; i < dimensions.length; i++) {\n var value = options[dimensions[i]] || \"\";\n if (value != Infinity) {\n wrapper.css(dimensions[i], value);\n }\n }\n\n if (maxHeight != Infinity) {\n this.element.css(\"maxHeight\", maxHeight);\n }\n\n if (width) {\n wrapper.outerWidth(constrain(width, options.minWidth, options.maxWidth));\n }\n else {\n wrapper.outerWidth(\"\");\n }\n\n if (height) {\n wrapper.outerHeight(constrain(height, options.minHeight, options.maxHeight));\n }\n else {\n wrapper.outerHeight(\"\");\n }\n\n if (!options.visible) {\n wrapper.removeClass(INLINE_FLEX).hide();\n }\n\n if (sizeClass && SIZE[sizeClass]) {\n wrapper.addClass(SIZE[sizeClass]);\n }\n },\n\n _position: function() {\n var wrapper = this.wrapper,\n position = this.options.position,\n containmentTop, containmentLeft;\n\n this._updateBoundaries();\n\n if (this.containment) {\n position.top = position.top || 0;\n position.left = position.left || 0;\n\n containmentTop = position.top.toString().indexOf(\"%\") > 0 ?\n parseInt(this.containment.height * (parseFloat(position.top) / 100), 10) :\n position.top;\n\n containmentLeft = position.left.toString().indexOf(\"%\") > 0 ?\n parseInt(this.containment.width * (parseFloat(position.left) / 100), 10) :\n position.left;\n\n position.top = constrain(containmentTop, this.minTop, this.maxTop);\n position.left = constrain(containmentLeft, this.minLeft, this.maxLeft);\n }\n\n if (position.top && position.top.toString().indexOf(\"px\") > 0) {\n position.top = Number(position.top.replace(\"px\", \"\"));\n }\n\n if (position.left && position.left.toString().indexOf(\"px\") > 0) {\n position.left = Number(position.left.replace(\"px\", \"\"));\n }\n\n if (position.top === 0) {\n position.top = position.top.toString();\n }\n\n if (position.left === 0) {\n position.left = position.left.toString();\n }\n\n wrapper.css({\n top: position.top || \"\",\n left: position.left || \"\"\n });\n },\n\n _updateBoundaries: function() {\n var containment = this.containment;\n\n if (!containment) {\n return null;\n }\n\n containment.width = containment.innerWidth();\n containment.height = containment.innerHeight();\n\n if (parseInt(containment.width, 10) > containment[0].clientWidth) {\n containment.width -= kendo.support.scrollbar();\n }\n\n if (parseInt(containment.height, 10) > containment[0].clientHeight) {\n containment.height -= kendo.support.scrollbar();\n }\n\n containment.position = getPosition(containment[0]);\n\n if (this._isPinned) {\n this.minTop = this.minLeft = -Infinity;\n this.maxTop = this.maxLeft = Infinity;\n } else {\n this.minTop = containment.scrollTop();\n this.minLeft = containment.scrollLeft();\n this.maxLeft = this.minLeft + containment.width - outerWidth(this.wrapper, true);\n this.maxTop = this.minTop + containment.height - outerHeight(this.wrapper, true);\n }\n },\n\n _animationOptions: function(id) {\n var animation = this.options.animation;\n var basicAnimation = {\n open: { effects: {} },\n close: { hide: true, effects: {} }\n };\n\n return animation && animation[id] || basicAnimation[id];\n },\n\n _resize: function() {\n kendo.resize(this.element.children());\n },\n\n _resizable: function() {\n var resizable = this.options.resizable;\n var wrapper = this.wrapper;\n\n if (this.resizing) {\n wrapper\n .off(\"dblclick\" + NS)\n .children(KWINDOWRESIZEHANDLES).remove();\n\n this.resizing.destroy();\n this.resizing = null;\n }\n\n if (resizable) {\n wrapper.on(\"dblclick\" + NS, KWINDOWTITLEBAR, (function(e) {\n if (!$(e.target).closest(\".k-window-action\").length) {\n this.toggleMaximization();\n }\n }).bind(this));\n\n each(\"n e s w se sw ne nw\".split(\" \"), function(index, handler) {\n wrapper.append(templates.resizeHandle(handler));\n });\n\n this.resizing = new WindowResizing(this);\n }\n\n wrapper = null;\n },\n\n _draggable: function() {\n var draggable = this.options.draggable;\n\n if (this.dragging) {\n this.dragging.destroy();\n this.dragging = null;\n }\n if (draggable) {\n this.dragging = new WindowDragging(this, draggable.dragHandle || KWINDOWTITLEBAR);\n }\n },\n\n _actions: function() {\n var options = this.options;\n var actions = options.actions;\n var pinned = options.pinned;\n var titlebar = this.wrapper.children(KWINDOWTITLEBAR);\n var container = titlebar.find(\".k-window-actions\");\n var windowSpecificCommands = [ \"maximize\", \"minimize\" ];\n\n actions = $.map(actions, function(action) {\n action = pinned && action.toLowerCase() === \"pin\" ? \"unpin\" : action;\n return { name: (windowSpecificCommands.indexOf(action.toLowerCase()) > - 1) ? \"window-\" + action : action };\n });\n\n container.html(kendo.render(templates.action, actions));\n },\n\n setOptions: function(options) {\n var that = this;\n var sizeClass = that.options.size;\n var doc = this.containment && !that._isPinned ? this.containment : $(document);\n // make a deep extend over options.position telerik/kendo-ui-core#844\n var cachedOptions = JSON.parse(JSON.stringify(options));\n extend(options.position, that.options.position);\n extend(options.position, cachedOptions.position);\n\n that._containerScrollTop = doc.scrollTop();\n that._containerScrollLeft = doc.scrollLeft();\n\n Widget.fn.setOptions.call(that, options);\n var scrollable = that.options.scrollable !== false;\n\n that.restore();\n\n if (typeof options.title !== \"undefined\") {\n that.title(options.title);\n }\n\n that.wrapper.removeClass(SIZE[sizeClass]);\n that._dimensions();\n\n that._position();\n that._resizable();\n that._draggable();\n that._actions();\n if (typeof options.modal !== \"undefined\") {\n var visible = that.options.visible !== false;\n that._enableDocumentScrolling();\n that._overlay(options.modal && visible);\n }\n\n that.element.css(OVERFLOW, scrollable ? \"\" : \"hidden\");\n },\n\n events: [\n OPEN,\n ACTIVATE,\n DEACTIVATE,\n CLOSE,\n MINIMIZE,\n MAXIMIZE,\n REFRESH,\n RESTORE,\n RESIZESTART,\n RESIZE,\n RESIZEEND,\n DRAGSTART,\n DRAGEND,\n KENDOKEYDOWN,\n ERROR\n ],\n\n options: {\n name: \"Window\",\n animation: {\n open: {\n effects: { zoom: { direction: \"in\" }, fade: { direction: \"in\" } },\n duration: 350\n },\n close: {\n effects: { zoom: { direction: \"out\", properties: { scale: 0.7 } }, fade: { direction: \"out\" } },\n duration: 350,\n hide: true\n }\n },\n title: \"\",\n actions: [\"Close\"],\n autoFocus: true,\n modal: false,\n size: \"auto\",\n resizable: true,\n draggable: true,\n minWidth: 90,\n minHeight: 50,\n maxWidth: Infinity,\n maxHeight: Infinity,\n pinned: false,\n scrollable: true,\n position: {},\n content: null,\n visible: null,\n height: null,\n width: null,\n appendTo: \"body\",\n isMaximized: false,\n isMinimized: false\n },\n\n _closable: function() {\n return $.inArray(\"close\", $.map(this.options.actions, function(x) { return x.toLowerCase(); })) > -1;\n },\n\n _keydownContent: function(e) {\n var that = this,\n keys = kendo.keys,\n keyCode = e.keyCode;\n\n if (keyCode == keys.ESC && that._closable()) {\n e.stopPropagation();\n that._close(false);\n }\n },\n\n _keydown: function(e) {\n var that = this,\n options = that.options,\n keys = kendo.keys,\n keyCode = e.keyCode,\n wrapper = that.wrapper,\n offset, handled,\n distance = 10,\n isMaximized = options.isMaximized,\n isMinimized = options.isMinimized,\n newWidth, newHeight, w, h;\n\n if (keyCode == keys.ESC && that._closable()) {\n e.stopPropagation();\n that._close(false);\n }\n\n if (e.target != e.currentTarget || that._closing) {\n return;\n }\n\n // Refresh\n if (e.altKey && keyCode == 82) {// Alt + R\n that.refresh();\n }\n\n // Pin/Unpin\n if (e.altKey && keyCode == 80) {// Alt + P\n if (that.options.pinned) {\n that.unpin();\n } else {\n that.pin();\n }\n }\n\n // Maximize/Restore/Miminimize\n if (e.altKey && keyCode == keys.UP) {\n if (isMinimized) {\n that.restore();\n that.wrapper.trigger(\"focus\");\n } else if (!isMaximized) {\n that.maximize();\n that.wrapper.trigger(\"focus\");\n }\n } else if (e.altKey && keyCode == keys.DOWN) {\n if (!isMinimized && !isMaximized) {\n that.minimize();\n that.wrapper.trigger(\"focus\");\n } else if (isMaximized) {\n that.restore();\n that.wrapper.trigger(\"focus\");\n }\n }\n\n offset = kendo.getOffset(wrapper);\n\n if (that.containment && !that._isPinned) {\n offset = that.options.position;\n }\n\n if (options.draggable && !e.ctrlKey && !e.altKey && !isMaximized) {\n that._updateBoundaries();\n if (keyCode == keys.UP) {\n offset.top = constrain(offset.top - distance, that.minTop, that.maxTop);\n handled = wrapper.css(\"top\", offset.top);\n } else if (keyCode == keys.DOWN) {\n offset.top = constrain(offset.top + distance, that.minTop, that.maxTop);\n handled = wrapper.css(\"top\", offset.top);\n } else if (keyCode == keys.LEFT) {\n offset.left = constrain(offset.left - distance, that.minLeft, that.maxLeft);\n handled = wrapper.css(\"left\", offset.left);\n } else if (keyCode == keys.RIGHT) {\n offset.left = constrain(offset.left + distance, that.minLeft, that.maxLeft);\n handled = wrapper.css(\"left\", offset.left);\n }\n }\n\n if (options.resizable && e.ctrlKey && !isMaximized && !isMinimized) {\n if (keyCode == keys.UP) {\n handled = true;\n newHeight = wrapper.outerHeight() - distance;\n } else if (keyCode == keys.DOWN) {\n handled = true;\n if (that.containment && !that._isPinned) {\n newHeight = Math.min(wrapper.outerHeight() + distance,\n that.containment.height - offset.top - toInt(wrapper, \"padding-top\") -\n toInt(wrapper, \"borderBottomWidth\") - toInt(wrapper, \"borderTopWidth\"));\n } else {\n newHeight = wrapper.outerHeight() + distance;\n }\n } if (keyCode == keys.LEFT) {\n handled = true;\n newWidth = wrapper.outerWidth() - distance;\n } else if (keyCode == keys.RIGHT) {\n handled = true;\n if (that.containment && !that._isPinned) {\n newWidth = Math.min(wrapper.outerWidth() + distance,\n that.containment.width - offset.left -\n toInt(wrapper, \"borderLeftWidth\") - toInt(wrapper, \"borderRightWidth\"));\n } else {\n newWidth = wrapper.outerWidth() + distance;\n }\n }\n\n if (handled) {\n w = constrain(newWidth, options.minWidth, options.maxWidth);\n h = constrain(newHeight, options.minHeight, options.maxHeight);\n\n if (!isNaN(w)) {\n wrapper.outerWidth(w);\n that.options.width = w + \"px\";\n }\n if (!isNaN(h)) {\n wrapper.outerHeight(h);\n that.options.height = h + \"px\";\n }\n\n that.resize();\n }\n }\n\n if (handled) {\n e.preventDefault();\n }\n },\n\n _overlay: function(visible) {\n var overlay = this.containment ? this.containment.children(KOVERLAY) : this.appendTo.children(KOVERLAY),\n wrapper = this.wrapper,\n display = visible ? \"block\" : \"none\",\n zIndex = parseInt(wrapper.css(ZINDEX), 10) - 1;\n\n if (!overlay.length) {\n overlay = $(\"
\");\n }\n\n overlay\n .insertBefore(wrapper[0])\n .css({\n zIndex: zIndex,\n display: display\n });\n\n if (this.options.modal.preventScroll && !this.containment) {\n this._stopDocumentScrolling();\n }\n\n return overlay;\n },\n\n _actionForIcon: function(icon) {\n var iconClass = /\\bk-i(-\\w+)+\\b/.exec(icon[0].className)[0];\n return {\n \"k-i-close\": \"_close\",\n \"k-i-window-maximize\": \"maximize\",\n \"k-i-window-minimize\": \"minimize\",\n \"k-i-window-restore\": \"restore\",\n \"k-i-refresh\": \"refresh\",\n \"k-i-pin\": \"pin\",\n \"k-i-unpin\": \"unpin\"\n }[iconClass];\n },\n\n _windowActionHandler: function(e) {\n if (this._closing) {\n return;\n }\n var icon = $(e.target).closest(\".k-window-action\").find(\".k-icon\");\n var action = this._actionForIcon(icon);\n\n if (action) {\n e.preventDefault();\n this[action]();\n return false;\n }\n },\n\n _modals: function() {\n var that = this,\n windowElements = $(KWINDOW + VISIBLE),\n windowInstance,\n modals = [];\n\n for (var i = 0; i < windowElements.length; i += 1) {\n windowInstance = that._object($(windowElements[i]));\n\n if (windowInstance &&\n windowInstance.options &&\n windowInstance.options.modal &&\n windowInstance.options.visible &&\n windowInstance.options.appendTo === that.options.appendTo &&\n (!windowInstance.containment || (that.containment && windowInstance.containment[0] === that.containment[0]))) {\n modals.push(windowInstance.wrapper[0]);\n }\n }\n\n modals.sort(function(a, b) {\n return a.style.zIndex - b.style.zIndex;\n });\n\n that = null;\n\n return $(modals);\n },\n\n _object: function(element) {\n var content = element.children(KWINDOWCONTENT);\n var widget = kendo.widgetInstance(content);\n\n if (widget) {\n return widget;\n }\n\n return undefined;\n },\n\n center: function() {\n var that = this,\n position = that.options.position,\n wrapper = that.wrapper,\n documentWindow = $(window),\n scrollTop = 0,\n scrollLeft = 0,\n newTop, newLeft;\n\n if (that.options.isMaximized) {\n return that;\n }\n\n if (that.options.pinned && !that._isPinned) {\n that.pin();\n }\n\n if (!that.options.pinned) {\n scrollTop = documentWindow.scrollTop();\n scrollLeft = documentWindow.scrollLeft();\n }\n\n if (this.containment && !that.options.pinned) {\n newTop = this.minTop + (this.maxTop - this.minTop) / 2;\n newLeft = this.minLeft + (this.maxLeft - this.minLeft) / 2;\n } else {\n that._scrollIsAppended = true;\n newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.outerWidth()) / 2);\n newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.outerHeight() - toInt(wrapper, \"paddingTop\")) / 2);\n }\n\n wrapper.css({\n left: newLeft,\n top: newTop\n });\n\n position.top = newTop;\n position.left = newLeft;\n\n return that;\n },\n\n title: function(title) {\n var that = this,\n value,\n encoded = true,\n wrapper = that.wrapper,\n titleBar = wrapper.children(KWINDOWTITLEBAR),\n titleElement = titleBar.children(KWINDOWTITLE);\n\n if (!arguments.length) {\n return titleElement.html();\n }\n\n if ($.isPlainObject(title)) {\n value = typeof title.text !== \"undefined\" ? title.text : \"\";\n encoded = title.encoded !== false;\n } else {\n value = title;\n }\n\n if (value === false) {\n wrapper.addClass(\"k-window-titleless\");\n wrapper.css(\"padding-top\", 0);\n titleBar.remove();\n } else {\n if (!titleBar.length) {\n wrapper.prepend(templates.titlebar({\n title: encoded ? kendo.htmlEncode(value) : value\n }));\n that._actions();\n titleBar = wrapper.children(KWINDOWTITLEBAR);\n } else {\n titleElement.html(encoded ? kendo.htmlEncode(value) : value);\n }\n }\n\n that.options.title = value;\n\n return that;\n },\n\n content: function(html, data) {\n var content = this.wrapper.children(KWINDOWCONTENT),\n scrollContainer = content.children(\".km-scroll-container\");\n\n content = scrollContainer[0] ? scrollContainer : content;\n\n if (!defined(html)) {\n return content.html();\n }\n\n this.angular(\"cleanup\", function() {\n return { elements: content.children() };\n });\n\n kendo.destroy(this.element.children());\n\n content.empty().html(html);\n\n this.angular(\"compile\", function() {\n var a = [];\n for (var i = content.length; --i >= 0;) {\n a.push({ dataItem: data });\n }\n return {\n elements: content.children(),\n data: a\n };\n });\n\n return this;\n },\n\n open: function() {\n var that = this,\n wrapper = that.wrapper,\n options = that.options,\n showOptions = this._animationOptions(\"open\"),\n contentElement = wrapper.children(KWINDOWCONTENT),\n overlay, otherModalsVisible,\n containmentContext = this.containment && !that._isPinned,\n doc = containmentContext ? this.containment : $(document);\n\n if (!that.trigger(OPEN)) {\n if (that._closing) {\n wrapper.kendoStop(true, true);\n }\n\n that._closing = false;\n\n that.toFront();\n\n if (options.autoFocus) {\n that.wrapper.trigger(\"focus\");\n }\n\n options.visible = true;\n\n if (options.modal) {\n otherModalsVisible = !!that._modals().length;\n overlay = that._overlay(otherModalsVisible);\n\n overlay.kendoStop(true, true);\n\n if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n var overlayFx = kendo.fx(overlay).fadeIn();\n overlayFx.duration(showOptions.duration || 0);\n overlayFx.endValue(0.5);\n overlayFx.play();\n } else {\n overlay.css(\"opacity\", 0.5);\n }\n\n overlay.show();\n\n $(window).on(\"focus\" + MODAL_NS, function() {\n if (wrapper.data(\"isFront\") && !$(document.activeElement).closest(wrapper).length) {\n that.wrapper.trigger(\"focus\");\n }\n });\n }\n\n if (!wrapper.is(VISIBLE)) {\n contentElement.css(OVERFLOW, HIDDEN);\n\n that.wrapper.find(TITLEBAR_BUTTONS).addClass(\"k-button-flat\");\n\n wrapper.addClass(INLINE_FLEX).kendoStop().kendoAnimate({\n effects: showOptions.effects,\n duration: showOptions.duration,\n complete: this._activate.bind(this)\n });\n }\n }\n\n if (options.isMaximized) {\n that._containerScrollTop = doc.scrollTop();\n that._containerScrollLeft = doc.scrollLeft();\n that._stopDocumentScrolling();\n }\n\n if (this.options.pinned && !this._isPinned) {\n this.pin();\n }\n\n return that;\n },\n\n _activate: function() {\n var scrollable = this.options.scrollable !== false;\n\n if (this.options.autoFocus) {\n this.wrapper.trigger(\"focus\");\n }\n\n this.element.css(OVERFLOW, scrollable ? \"\" : \"hidden\");\n kendo.resize(this.element.children());\n\n this.trigger(ACTIVATE);\n },\n\n _removeOverlay: function(suppressAnimation) {\n var modals = this._modals();\n var options = this.options;\n var hideOverlay = options.modal && !modals.length;\n var hideOptions = this._animationOptions(\"close\");\n\n if (hideOverlay) {\n if (!suppressAnimation && hideOptions.duration && kendo.effects.Fade) {\n var overlayFx = kendo.fx(options.modal ? this._overlay(true) : $(undefined)).fadeOut();\n overlayFx.duration(hideOptions.duration || 0);\n overlayFx.startValue(0.5);\n overlayFx.play();\n } else {\n this._overlay(false).remove();\n }\n if (options.modal.preventScroll) {\n this._enableDocumentScrolling();\n }\n } else if (modals.length) {\n this._object(modals.last())._overlay(true);\n\n if (options.modal.preventScroll) {\n this._stopDocumentScrolling();\n }\n }\n },\n\n _close: function(systemTriggered) {\n var that = this,\n wrapper = that.wrapper,\n options = that.options,\n showOptions = this._animationOptions(\"open\"),\n hideOptions = this._animationOptions(\"close\"),\n containmentContext = this.containment && !that._isPinned,\n doc = containmentContext ? this.containment : $(document),\n defaultPrevented;\n\n if (that._closing) {\n return;\n }\n\n defaultPrevented = that.trigger(CLOSE, { userTriggered: !systemTriggered });\n that._closing = !defaultPrevented;\n\n if (wrapper.is(VISIBLE) && !defaultPrevented) {\n options.visible = false;\n\n $(KWINDOW).each(function(i, element) {\n var contentElement = $(element).children(KWINDOWCONTENT);\n\n // Remove overlay set by toFront\n if (element != wrapper && contentElement.find(\"> .\" + KCONTENTFRAME).length > 0) {\n contentElement.children(KOVERLAY).remove();\n }\n });\n\n this._removeOverlay();\n\n // Prevent close animation from stopping\n that.wrapper.find(TITLEBAR_BUTTONS).removeClass(\"k-button-flat\");\n\n wrapper.kendoStop().kendoAnimate({\n effects: hideOptions.effects || showOptions.effects,\n reverse: hideOptions.reverse === true,\n duration: hideOptions.duration,\n complete: this._deactivate.bind(this)\n });\n $(window).off(MODAL_NS);\n }\n\n if (that.options.isMaximized) {\n that._enableDocumentScrolling();\n if (that._containerScrollTop && that._containerScrollTop > 0) {\n doc.scrollTop(that._containerScrollTop);\n }\n if (that._containerScrollLeft && that._containerScrollLeft > 0) {\n doc.scrollLeft(that._containerScrollLeft);\n }\n }\n\n if (that.options.iframe) {\n that.wrapper.trigger(\"blur\");\n }\n },\n\n _deactivate: function() {\n var that = this;\n\n that.wrapper\n .removeClass(INLINE_FLEX)\n .hide()\n .css(\"opacity\", \"\");\n\n that.trigger(DEACTIVATE);\n\n if (that.options.modal) {\n var lastModal = that._object(that._modals().last());\n if (lastModal) {\n lastModal.toFront();\n }\n }\n },\n\n close: function() {\n this._close(true);\n return this;\n },\n\n _actionable: function(element) {\n return $(element).is(TITLEBAR_BUTTONS + \",\" + TITLEBAR_BUTTONS + \" .k-icon, :input, a, .k-input, .k-icon, [role='gridcell'], .k-input-value-text\");\n },\n\n _shouldFocus: function(target) {\n var active = activeElement(),\n element = this.wrapper;\n\n return this.options.autoFocus &&\n !$(active).is(element) &&\n !this._actionable(target) &&\n (!element.find(active).length || !element.find(target).length);\n },\n\n toFront: function(e, avoidFocus) {\n var that = this,\n wrapper = that.wrapper,\n currentWindow = wrapper[0],\n containmentContext = that.containment && !that._isPinned,\n openAnimation = this._animationOptions(\"open\"),\n zIndex = +wrapper.css(ZINDEX),\n originalZIndex = zIndex,\n target = (e && e.target) || null;\n\n $(KWINDOW).each(function(i, element) {\n var windowObject = $(element),\n zIndexNew = windowObject.css(ZINDEX),\n contentElement = windowObject.children(KWINDOWCONTENT);\n\n if (!isNaN(zIndexNew)) {\n zIndex = Math.max(+zIndexNew, zIndex);\n }\n\n wrapper.data(\"isFront\", element == currentWindow);\n // Add overlay to windows with iframes and lower z-index to prevent\n // trapping of events when resizing / dragging\n\n if (element != currentWindow &&\n contentElement.find(\".\" + KCONTENTFRAME).length &&\n !contentElement.find(KOVERLAY).length) {\n contentElement.append(templates.overlay);\n }\n });\n\n if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n wrapper.css(ZINDEX, zIndex + 2);\n }\n that.element.find(\"> .k-overlay\").remove();\n\n if (that._shouldFocus(target)) {\n if (!avoidFocus) {\n setTimeout(function() {\n that.wrapper.focus();\n }, openAnimation ? openAnimation.duration : 0);\n }\n\n var scrollTop = containmentContext ? that.containment.scrollTop() : $(window).scrollTop(),\n windowTop = parseInt(wrapper.position().top, 10);\n\n if (!that.options.pinned && windowTop > 0 && windowTop < scrollTop) {\n if (scrollTop > 0) {\n $(window).scrollTop(windowTop);\n } else {\n wrapper.css(\"top\", scrollTop);\n }\n }\n }\n\n wrapper = null;\n\n return that;\n },\n\n toggleMaximization: function() {\n if (this._closing) {\n return this;\n }\n\n return this[this.options.isMaximized ? \"restore\" : \"maximize\"]();\n },\n\n restore: function() {\n var that = this;\n var options = that.options;\n var minHeight = options.minHeight;\n var restoreOptions = that.restoreOptions;\n var shouldRestrictTop;\n var container = that.containment && !that._isPinned ? that.containment : $(document);\n\n if (!options.isMaximized && !options.isMinimized) {\n return that;\n }\n\n if (minHeight && minHeight != Infinity) {\n that.wrapper.css(\"min-height\", minHeight);\n }\n\n if (restoreOptions && !options.isMaximized) {\n restoreOptions.height = constrain(restoreOptions.height, that.options.minHeight, that.options.maxHeight);\n\n shouldRestrictTop = options.position.top + parseInt(restoreOptions.height, 10) > that.maxTop;\n\n if (shouldRestrictTop) {\n options.position.top = constrain(options.position.top, that.minTop, that.maxTop - parseInt(restoreOptions.height, 10));\n\n extend(restoreOptions, {\n left: options.position.left,\n top: options.position.top\n });\n }\n }\n\n that.wrapper\n .css({\n position: options.pinned ? \"fixed\" : \"absolute\",\n left: restoreOptions.left,\n top: restoreOptions.top,\n width: restoreOptions.width,\n height: restoreOptions.height\n })\n .removeClass(MAXIMIZEDSTATE)\n .find(\".k-window-content,.k-resize-handle\").show().end()\n .find(\".k-window-titlebar .k-i-window-restore\").parent().remove().end().end()\n .find(MINIMIZE_MAXIMIZE).parent().show().end().end()\n .find(PIN_UNPIN).parent().show();\n\n if (options.isMaximized) {\n that.wrapper.find(\".k-i-window-maximize\").parent().trigger(\"focus\");\n } else if (options.isMinimized) {\n that.wrapper.find(\".k-i-window-minimize\").parent().trigger(\"focus\");\n }\n\n that.options.width = restoreOptions.width;\n that.options.height = restoreOptions.height;\n\n if (!that.options.modal.preventScroll) {\n that._enableDocumentScrolling();\n }\n\n if (that._containerScrollTop && that._containerScrollTop > 0) {\n container.scrollTop(that._containerScrollTop);\n }\n if (that._containerScrollLeft && that._containerScrollLeft > 0) {\n container.scrollLeft(that._containerScrollLeft);\n }\n\n options.isMaximized = options.isMinimized = false;\n\n that.wrapper.removeAttr(\"aria-labelled-by\");\n\n that.resize();\n\n that.trigger(RESTORE);\n\n return that;\n },\n\n _sizingAction: function(actionId, callback) {\n var that = this,\n wrapper = that.wrapper,\n style = wrapper[0].style,\n options = that.options;\n\n if (options.isMaximized || options.isMinimized) {\n return that;\n }\n\n that.restoreOptions = {\n width: style.width,\n height: style.height\n };\n\n wrapper\n .children(KWINDOWRESIZEHANDLES).hide().end()\n .children(KWINDOWTITLEBAR).find(MINIMIZE_MAXIMIZE).parent().hide()\n .eq(0).before(templates.action({ name: \"window-restore\" }));\n\n callback.call(that);\n\n that.wrapper.children(KWINDOWTITLEBAR).find(PIN_UNPIN).parent().toggle(actionId !== \"maximize\");\n\n that.trigger(actionId);\n\n wrapper.find(\".k-i-window-restore\").parent().trigger(\"focus\");\n\n return that;\n },\n\n maximize: function() {\n this._sizingAction(\"maximize\", function() {\n var that = this,\n wrapper = that.wrapper,\n containmentContext = this.containment && !that._isPinned,\n position = wrapper.position(),\n doc = $(document);\n\n extend(that.restoreOptions, {\n left: position.left + (containmentContext ? this.containment.scrollLeft() : 0),\n top: position.top + (containmentContext ? this.containment.scrollTop() : 0)\n });\n\n this._containerScrollTop = containmentContext ? this.containment.scrollTop() : doc.scrollTop();\n this._containerScrollLeft = containmentContext ? this.containment.scrollLeft() : doc.scrollLeft();\n\n that._stopDocumentScrolling();\n\n wrapper\n .css({\n top: containmentContext ? this.containment.scrollTop() : 0,\n left: containmentContext ? this.containment.scrollLeft() : 0,\n position: containmentContext ? \"absolute\" : \"fixed\"\n })\n .addClass(MAXIMIZEDSTATE);\n\n that.options.isMaximized = true;\n\n that._onDocumentResize();\n });\n\n return this;\n },\n\n _stopDocumentScrolling: function() {\n var that = this;\n var containment = that.containment;\n\n if (containment && !that._isPinned) {\n that._storeOverflowRule(containment);\n containment.css(OVERFLOW, HIDDEN);\n that.wrapper.css({\n maxWidth: containment.innerWidth(),\n maxHeight: containment.innerHeight()\n });\n return;\n }\n\n var $body = $(\"body\");\n that._storeOverflowRule($body);\n $body.css(OVERFLOW, HIDDEN);\n\n var $html = $(\"html\");\n that._storeOverflowRule($html);\n $html.css(OVERFLOW, HIDDEN);\n },\n\n _enableDocumentScrolling: function() {\n var that = this;\n var containment = that.containment;\n\n if (containment && !that._isPinned) {\n that._restoreOverflowRule(containment);\n that.wrapper.css({\n maxWidth: containment.width,\n maxHeight: containment.height\n });\n return;\n }\n\n that._restoreOverflowRule($(document.body));\n that._restoreOverflowRule($(\"html\"));\n },\n\n _storeOverflowRule: function($element) {\n if (this._isOverflowStored($element)) {\n return;\n }\n\n var overflowRule = $element.get(0).style.overflow;\n\n if (typeof overflowRule === \"string\") {\n $element.data(DATADOCOVERFLOWRULE, overflowRule);\n }\n },\n\n _isOverflowStored: function($element) {\n return typeof $element.data(DATADOCOVERFLOWRULE) === \"string\";\n },\n\n _restoreOverflowRule: function($element) {\n var overflowRule = $element.data(DATADOCOVERFLOWRULE);\n\n if (overflowRule !== null && overflowRule !== undefined) {\n $element.css(OVERFLOW, overflowRule);\n $element.removeData(DATADOCOVERFLOWRULE);\n } else {\n $element.css(OVERFLOW, \"\");\n }\n },\n\n isMaximized: function() {\n return this.options.isMaximized;\n },\n\n minimize: function() {\n this._sizingAction(\"minimize\", function() {\n var that = this;\n\n that.wrapper.css({\n height: \"\",\n minHeight: \"\"\n });\n\n that.element.hide();\n\n that.options.isMinimized = true;\n });\n\n this.wrapper.attr(\"aria-labelled-by\", this.element.attr(\"aria-labelled-by\"));\n\n this._updateBoundaries();\n\n return this;\n },\n\n isMinimized: function() {\n return this.options.isMinimized;\n },\n\n pin: function() {\n var that = this,\n win = $(window),\n wrapper = that.wrapper,\n options = that.options,\n position = options.position,\n top = this.containment ? getPosition(wrapper[0]).top + toInt(this.containment, \"borderTopWidth\") : toInt(wrapper, \"top\"),\n left = this.containment ? getPosition(wrapper[0]).left + toInt(this.containment, \"borderLeftWidth\") : toInt(wrapper, \"left\");\n\n if (!that.options.isMaximized) {\n position.top = top;\n position.left = left;\n\n if (that._scrollIsAppended && (!this.containment || this.containment.css(\"position\") !== \"fixed\")) {\n\n position.top -= win.scrollTop();\n position.left -= win.scrollLeft();\n that._scrollIsAppended = false;\n }\n\n wrapper.css(extend(position, { position: \"fixed\" }));\n wrapper.children(KWINDOWTITLEBAR).find(KPIN).addClass(\"k-i-unpin\").removeClass(\"k-i-pin\");\n\n that._isPinned = true;\n that.options.pinned = true;\n\n if (this.containment) {\n options.maxWidth = options.maxHeight = Infinity;\n wrapper.css({\n maxWidth: \"\",\n maxHeight: \"\"\n });\n }\n }\n },\n\n unpin: function() {\n var that = this,\n win = $(window),\n wrapper = that.wrapper,\n options = that.options,\n position = that.options.position,\n containment = that.containment,\n top = parseInt(wrapper.css(\"top\"), 10) + win.scrollTop(),\n left = parseInt(wrapper.css(\"left\"), 10) + win.scrollLeft();\n\n if (!that.options.isMaximized) {\n that._isPinned = false;\n that._scrollIsAppended = true;\n that.options.pinned = false;\n\n if (containment) {\n that._updateBoundaries();\n\n options.maxWidth = Math.min(containment.width, options.maxWidth);\n options.maxHeight = Math.min(containment.height - toInt(wrapper, \"padding-top\"), options.maxHeight);\n\n wrapper.css({\n maxWidth: options.maxWidth,\n maxHeight: options.maxHeight\n });\n\n if (top < containment.position.top) {\n top = that.minTop;\n } else if (top > containment.position.top + containment.height) {\n top = that.maxTop;\n } else {\n top = top + containment.scrollTop() - (containment.position.top + toInt(containment, \"border-top-width\"));\n }\n\n if (left < containment.position.left) {\n left = that.minLeft;\n } else if (left > containment.position.left + containment.width) {\n left = that.maxLeft;\n } else {\n left = left + containment.scrollLeft() - (containment.position.left + toInt(containment, \"border-left-width\"));\n }\n\n }\n\n position.top = constrain(top, that.minTop, that.maxTop);\n position.left = constrain(left, that.minLeft, that.maxLeft);\n\n wrapper.css(extend(position, { position: \"\" }));\n wrapper.children(KWINDOWTITLEBAR).find(KUNPIN).addClass(\"k-i-pin\").removeClass(\"k-i-unpin\");\n }\n },\n\n _onDocumentResize: function() {\n var that = this,\n wrapper = that.wrapper,\n wnd = $(window),\n zoomLevel = kendo.support.zoomLevel(),\n contentBoxSizing = wrapper.css(\"box-sizing\") == \"content-box\",\n w, h;\n\n if (!that.options.isMaximized) {\n return;\n }\n\n var lrBorderWidth = contentBoxSizing ? toInt(wrapper, \"border-left-width\") + toInt(wrapper, \"border-right-width\") : 0;\n var tbBorderWidth = contentBoxSizing ? toInt(wrapper, \"border-top-width\") + toInt(wrapper, \"border-bottom-width\") : 0;\n var paddingTop = contentBoxSizing ? toInt(wrapper, \"padding-top\") : 0;\n\n if (that.containment && !that._isPinned) {\n w = that.containment.innerWidth() - lrBorderWidth;\n h = that.containment.innerHeight() - (tbBorderWidth + paddingTop);\n } else {\n w = wnd.width() / zoomLevel - lrBorderWidth;\n h = wnd.height() / zoomLevel - (tbBorderWidth + paddingTop);\n }\n\n wrapper.css({\n width: w,\n height: h\n });\n that.options.width = w;\n that.options.height = h;\n\n that.resize();\n },\n\n refresh: function(options) {\n var that = this,\n initOptions = that.options,\n element = $(that.element),\n iframe,\n showIframe,\n url;\n\n if (!isPlainObject(options)) {\n options = { url: options };\n }\n\n options = extend(initOptions.content, options);\n\n showIframe = defined(initOptions.iframe) ? initOptions.iframe : options.iframe;\n\n url = options.url;\n\n if (url) {\n if (!defined(showIframe)) {\n showIframe = !isLocalUrl(url);\n }\n\n if (!showIframe) {\n // perform AJAX request\n that._ajaxRequest(options);\n } else {\n iframe = element.find(\".\" + KCONTENTFRAME)[0];\n\n if (iframe) {\n // refresh existing iframe\n iframe.src = url || iframe.src;\n } else {\n // render new iframe\n element.html(templates.contentFrame(extend({}, initOptions, { content: options })));\n }\n\n element.find(\".\" + KCONTENTFRAME)\n .off(\"load\" + NS)\n .on(\"load\" + NS, this._triggerRefresh.bind(this));\n }\n } else {\n if (options.template) {\n // refresh template\n that.content(template(options.template)({}));\n }\n\n that.trigger(REFRESH);\n }\n\n element.toggleClass(\"k-window-iframecontent\", !!showIframe);\n\n return that;\n },\n\n _triggerRefresh: function() {\n this.trigger(REFRESH);\n },\n\n _ajaxComplete: function() {\n clearTimeout(this._loadingIconTimeout);\n this.wrapper.find(REFRESHICON).removeClass(LOADING);\n },\n\n _ajaxError: function(xhr, status) {\n this.trigger(ERROR, { status: status, xhr: xhr });\n },\n\n _ajaxSuccess: function(contentTemplate) {\n return function(data) {\n var html = data;\n if (contentTemplate) {\n html = template(contentTemplate)(data || {});\n }\n\n this.content(html, data);\n this.element.prop(\"scrollTop\", 0);\n\n this.trigger(REFRESH);\n };\n },\n\n _showLoading: function() {\n this.wrapper.find(REFRESHICON).addClass(LOADING);\n },\n\n _ajaxRequest: function(options) {\n this._loadingIconTimeout = setTimeout(this._showLoading.bind(this), 100);\n\n $.ajax(extend({\n type: \"GET\",\n dataType: \"html\",\n cache: false,\n error: this._ajaxError.bind(this),\n complete: this._ajaxComplete.bind(this),\n success: this._ajaxSuccess(options.template).bind(this)\n }, options));\n },\n\n _destroy: function() {\n if (this.resizing) {\n this.resizing.destroy();\n }\n\n if (this.dragging) {\n this.dragging.destroy();\n }\n\n this.wrapper.off(NS)\n .children(KWINDOWCONTENT).off(NS).end()\n .find(\".k-resize-handle,.k-window-titlebar\").off(NS);\n\n $(window).off(\"resize\" + NS + this._marker);\n $(window).off(MODAL_NS);\n $(window).off(NS);\n\n clearTimeout(this._loadingIconTimeout);\n\n Widget.fn.destroy.call(this);\n\n this.unbind(undefined);\n\n kendo.destroy(this.wrapper);\n },\n\n destroy: function() {\n this._destroy();\n\n if (this.options.modal) {\n this._removeOverlay(true);\n }\n\n this.wrapper.empty().remove();\n\n this.wrapper = this.appendTo = this.element = $();\n },\n\n _createWindow: function() {\n var contentHtml = this.element,\n options = this.options,\n iframeSrcAttributes,\n wrapper,\n isRtl = kendo.support.isRtl(contentHtml);\n\n if (options.scrollable === false) {\n contentHtml.css(\"overflow\", \"hidden\");\n }\n\n wrapper = $(templates.wrapper(options));\n\n // Collect the src attributes of all iframes and then set them to empty string.\n // This seems to fix this IE9 \"feature\": http://msdn.microsoft.com/en-us/library/gg622929%28v=VS.85%29.aspx?ppud=4\n iframeSrcAttributes = contentHtml.find(\"iframe:not(.k-content-frame)\").map(function() {\n var src = this.getAttribute(\"src\");\n this.src = \"\";\n return src;\n });\n\n // Make sure the wrapper is appended to the body only once. IE9+ will throw exceptions if you move iframes in DOM\n wrapper\n .toggleClass(\"k-rtl\", isRtl)\n .attr(\"tabindex\", 0)\n .append(contentHtml)\n .find(\"iframe:not(.k-content-frame)\").each(function(index) {\n // Restore the src attribute of the iframes when they are part of the live DOM tree\n this.src = iframeSrcAttributes[index];\n });\n\n if (this.containment) {\n this.containment.prepend(wrapper);\n } else if (this.appendTo) {\n wrapper.appendTo(this.appendTo);\n }\n\n wrapper.find(\".k-window-title\")\n .css(isRtl ? \"left\" : \"right\", outerWidth(wrapper.find(\".k-window-actions\")) + 10);\n\n contentHtml.css(\"visibility\", \"\").show();\n\n contentHtml.find(\"[data-role=editor]\").each(function() {\n var editor = $(this).data(\"kendoEditor\");\n\n if (editor) {\n editor.refresh();\n }\n });\n\n wrapper = contentHtml = null;\n }\n });\n\n templates = {\n wrapper: template(\"\"),\n action: template(\n \"\" +\n \"\" +\n \"\"\n ),\n titlebar: template(\n \" \"\n ),\n overlay: \"\",\n contentFrame: template(\n \"\"\n ),\n resizeHandle: template(\"\")\n };\n\n\n function WindowResizing(wnd) {\n var that = this;\n that.owner = wnd;\n that._preventDragging = false;\n that._draggable = new Draggable(wnd.wrapper, {\n filter: \">\" + KWINDOWRESIZEHANDLES,\n group: wnd.wrapper.id + \"-resizing\",\n dragstart: that.dragstart.bind(that),\n drag: that.drag.bind(that),\n dragend: that.dragend.bind(that)\n });\n\n that._draggable.userEvents.bind(\"press\", that.addOverlay.bind(that));\n that._draggable.userEvents.bind(\"release\", that.removeOverlay.bind(that));\n }\n\n WindowResizing.prototype = {\n addOverlay: function() {\n this.owner.wrapper.append(templates.overlay);\n },\n removeOverlay: function() {\n this.owner.wrapper.find(KOVERLAY).remove();\n },\n dragstart: function(e) {\n var that = this;\n var wnd = that.owner;\n var wrapper = wnd.wrapper;\n\n that._preventDragging = wnd.trigger(RESIZESTART);\n if (that._preventDragging) {\n return;\n }\n\n that.elementPadding = parseInt(wrapper.css(\"padding-top\"), 10);\n that.initialPosition = kendo.getOffset(wrapper, \"position\");\n\n that.resizeDirection = e.currentTarget.prop(\"className\").replace(\"k-resize-handle k-resize-\", \"\");\n\n that.initialSize = {\n width: wrapper.outerWidth(),\n height: wrapper.outerHeight()\n };\n\n wnd._updateBoundaries();\n\n that.containerOffset = wnd.containment ? wnd.containment.position : kendo.getOffset(wnd.appendTo);\n\n var offsetParent = wrapper.offsetParent();\n\n if (offsetParent.is(\"html\")) {\n that.containerOffset.top = that.containerOffset.left = 0;\n } else {\n var marginTop = offsetParent.css(\"margin-top\");\n var marginLeft = offsetParent.css(\"margin-left\");\n var hasMargin = !zero.test(marginTop) || !zero.test(marginLeft);\n if (hasMargin) {\n var wrapperPosition = getPosition(wrapper[0]);\n var relativeElMarginLeft = wrapperPosition.left - that.containerOffset.left - that.initialPosition.left;\n var relativeElMarginTop = wrapperPosition.top - that.containerOffset.top - that.initialPosition.top;\n\n that._relativeElMarginLeft = relativeElMarginLeft > 1 ? relativeElMarginLeft : 0;\n that._relativeElMarginTop = relativeElMarginTop > 1 ? relativeElMarginTop : 0;\n\n that.initialPosition.left += that._relativeElMarginLeft;\n that.initialPosition.top += that._relativeElMarginTop;\n }\n }\n\n wrapper\n .children(KWINDOWRESIZEHANDLES).not(e.currentTarget).hide();\n\n $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n },\n drag: function(e) {\n if (this._preventDragging) {\n return;\n }\n var that = this,\n wnd = that.owner,\n wrapper = wnd.wrapper,\n options = wnd.options,\n position = options.position,\n direction = that.resizeDirection,\n containerOffset = that.containerOffset,\n initialPosition = that.initialPosition,\n initialSize = that.initialSize,\n containmentContext = wnd.containment && !wnd._isPinned,\n rtl = kendo.support.isRtl(wnd.containment),\n leftRtlOffset = containmentContext && rtl && wnd.containment.innerWidth() > wnd.containment.width ? kendo.support.scrollbar() : 0,\n scrollOffset = containmentContext ? { top: wnd.containment.scrollTop(), left: wnd.containment.scrollLeft() } : { top: 0, left: 0 },\n newWidth, newHeight,\n windowBottom, windowRight,\n x = Math.max(e.x.location, 0),\n y = Math.max(e.y.location, 0);\n\n if (direction.indexOf(\"e\") >= 0) {\n\n if (wnd.containment && x - initialSize.width >= wnd.maxLeft - scrollOffset.left + containerOffset.left + leftRtlOffset) {\n newWidth = wnd.maxLeft + leftRtlOffset - initialPosition.left + initialSize.width - scrollOffset.left;\n } else {\n newWidth = x - initialPosition.left - containerOffset.left;\n }\n\n wrapper.outerWidth(constrain(newWidth, options.minWidth, options.maxWidth));\n } else if (direction.indexOf(\"w\") >= 0) {\n windowRight = initialPosition.left + initialSize.width + containerOffset.left;\n newWidth = constrain(windowRight - x, options.minWidth, options.maxWidth);\n position.left = windowRight - newWidth - containerOffset.left - leftRtlOffset - (that._relativeElMarginLeft || 0) + scrollOffset.left;\n\n if (wnd.containment && position.left <= wnd.minLeft) {\n position.left = wnd.minLeft;\n newWidth = constrain(windowRight - leftRtlOffset - position.left - containerOffset.left + scrollOffset.left, options.minWidth, options.maxWidth);\n }\n\n wrapper.css({\n left: position.left,\n width: newWidth\n });\n }\n\n var newWindowTop = y;\n if (wnd.options.pinned) {\n newWindowTop -= $(window).scrollTop();\n }\n if (direction.indexOf(\"s\") >= 0) {\n newHeight = newWindowTop - initialPosition.top - that.elementPadding - containerOffset.top;\n\n if (newWindowTop - initialSize.height - that.elementPadding >= wnd.maxTop + containerOffset.top - scrollOffset.top) {\n newHeight = wnd.maxTop - initialPosition.top + initialSize.height - scrollOffset.top;\n }\n\n wrapper.outerHeight(constrain(newHeight, options.minHeight, options.maxHeight));\n } else if (direction.indexOf(\"n\") >= 0) {\n windowBottom = initialPosition.top + initialSize.height + containerOffset.top;\n newHeight = constrain(windowBottom - newWindowTop, options.minHeight, options.maxHeight);\n position.top = windowBottom - newHeight - containerOffset.top - (that._relativeElMarginTop || 0) + scrollOffset.top;\n\n if (position.top <= wnd.minTop && wnd.containment) {\n position.top = wnd.minTop;\n newHeight = constrain(windowBottom - position.top - containerOffset.top + scrollOffset.top, options.minHeight, options.maxHeight);\n }\n\n wrapper.css({\n top: position.top,\n height: newHeight\n });\n }\n\n if (newWidth) {\n wnd.options.width = newWidth + \"px\";\n }\n if (newHeight) {\n wnd.options.height = newHeight + \"px\";\n }\n\n wnd.resize();\n },\n dragend: function(e) {\n if (this._preventDragging) {\n return;\n }\n\n var that = this,\n wnd = that.owner,\n wrapper = wnd.wrapper;\n\n wrapper\n .children(KWINDOWRESIZEHANDLES).not(e.currentTarget).show();\n\n $(BODY).css(CURSOR, \"\");\n\n if (wnd.touchScroller) {\n wnd.touchScroller.reset();\n }\n\n if (e.keyCode == 27) {\n wrapper.css(that.initialPosition)\n .css(that.initialSize);\n }\n\n wnd.trigger(RESIZEEND);\n\n return false;\n },\n destroy: function() {\n if (this._draggable) {\n this._draggable.destroy();\n }\n\n this._draggable = this.owner = null;\n }\n };\n\n function WindowDragging(wnd, dragHandle) {\n var that = this;\n that.owner = wnd;\n that._preventDragging = false;\n that._draggable = new Draggable(wnd.wrapper, {\n filter: dragHandle,\n group: wnd.wrapper.id + \"-moving\",\n dragstart: that.dragstart.bind(that),\n drag: that.drag.bind(that),\n dragend: that.dragend.bind(that),\n dragcancel: that.dragcancel.bind(that)\n });\n\n that._draggable.userEvents.stopPropagation = false;\n }\n\n WindowDragging.prototype = {\n dragstart: function(e) {\n var wnd = this.owner,\n draggable = wnd.options.draggable,\n element = wnd.element,\n actions = element.find(\".k-window-actions\"),\n containerOffset = kendo.getOffset(wnd.appendTo);\n\n this._preventDragging = wnd.trigger(DRAGSTART) || !draggable;\n if (this._preventDragging || wnd.isMaximized()) {\n return;\n }\n\n wnd.initialWindowPosition = kendo.getOffset(wnd.wrapper, \"position\");\n\n wnd.initialPointerPosition = {\n left: wnd.options.position.left,\n top: wnd.options.position.top\n };\n\n wnd.startPosition = {\n left: e.x.client - wnd.initialWindowPosition.left,\n top: e.y.client - wnd.initialWindowPosition.top\n };\n\n wnd._updateBoundaries();\n if (!wnd.containment) {\n if (actions.length > 0) {\n wnd.minLeft = outerWidth(actions) + parseInt(actions.css(\"right\"), 10) - outerWidth(element);\n } else {\n wnd.minLeft = 20 - outerWidth(element); // at least 20px remain visible\n }\n\n wnd.minLeft -= containerOffset.left;\n wnd.minTop = -containerOffset.top;\n }\n\n $(templates.overlay).appendTo(wnd.wrapper).css({ opacity: 0 });\n\n wnd.wrapper.children(KWINDOWRESIZEHANDLES).hide();\n\n $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n },\n\n drag: function(e) {\n var wnd = this.owner;\n var position = wnd.options.position;\n var axis = wnd.options.draggable.axis;\n var left;\n var top;\n\n if (this._preventDragging || wnd.isMaximized()) {\n return;\n }\n\n if (!axis || axis.toLowerCase() === \"x\") {\n left = e.x.client - wnd.startPosition.left;\n\n if (wnd.containment && !wnd._isPinned) {\n left += wnd.containment.scrollLeft();\n }\n\n position.left = constrain(left, wnd.minLeft, wnd.maxLeft);\n }\n\n if (!axis || axis.toLowerCase() === \"y\") {\n top = e.y.client - wnd.startPosition.top;\n\n if (wnd.containment && !wnd._isPinned) {\n top += wnd.containment.scrollTop();\n }\n\n position.top = constrain(top, wnd.minTop, wnd.maxTop);\n }\n\n if (kendo.support.transforms) {\n $(wnd.wrapper).css(\n \"transform\", \"translate(\" +\n (position.left - wnd.initialPointerPosition.left) + \"px, \" +\n (position.top - wnd.initialPointerPosition.top) + \"px)\"\n );\n } else {\n $(wnd.wrapper).css(position);\n }\n\n },\n\n _finishDrag: function() {\n var wnd = this.owner;\n\n wnd.wrapper\n .children(KWINDOWRESIZEHANDLES).toggle(!wnd.options.isMinimized).end()\n .find(KOVERLAY).remove();\n\n $(BODY).css(CURSOR, \"\");\n },\n\n dragcancel: function(e) {\n if (this._preventDragging) {\n return;\n }\n this._finishDrag();\n\n e.currentTarget.closest(KWINDOW).css(this.owner.initialWindowPosition);\n },\n\n dragend: function() {\n var wnd = this.owner;\n\n if (this._preventDragging || wnd.isMaximized()) {\n return;\n }\n\n $(wnd.wrapper)\n .css(wnd.options.position)\n .css(\"transform\", \"\");\n\n this._finishDrag();\n\n wnd.trigger(DRAGEND);\n\n return false;\n },\n destroy: function() {\n if (this._draggable) {\n this._draggable.destroy();\n }\n\n this._draggable = this.owner = null;\n }\n };\n\n kendo.ui.plugin(Window);\n\n })(window.kendo.jQuery);\n\n return window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","depends","features","$","window","kendo","jQuery","undefined","Widget","ui","TabKeyTrap","Popup","Draggable","isPlainObject","activeElement","_activeElement","outerWidth","_outerWidth","outerHeight","_outerHeight","extend","each","template","BODY","templates","NS","MODAL_NS","KWINDOW","KWINDOWTITLE","KWINDOWTITLEBAR","KWINDOWCONTENT","KDIALOGCONTENT","KWINDOWRESIZEHANDLES","KOVERLAY","KCONTENTFRAME","LOADING","KHOVERSTATE","KFOCUSEDSTATE","MAXIMIZEDSTATE","INLINE_FLEX","VISIBLE","HIDDEN","CURSOR","OPEN","ACTIVATE","DEACTIVATE","CLOSE","REFRESH","MINIMIZE","MAXIMIZE","RESIZESTART","RESIZE","RESIZEEND","DRAGSTART","DRAGEND","RESTORE","KENDOKEYDOWN","ERROR","OVERFLOW","DATADOCOVERFLOWRULE","ZINDEX","MINIMIZE_MAXIMIZE","KPIN","KUNPIN","PIN_UNPIN","TITLEBAR_BUTTONS","REFRESHICON","WINDOWEVENTSHANDLED","zero","isLocalUrl","SIZE","small","medium","large","defined","x","toInt","element","property","parseInt","css","constrain","value","low","high","normalizedValue","isNaN","toString","indexOf","Math","max","min","Infinity","executableScript","this","type","toLowerCase","getPosition","elem","result","top","offsetTop","left","offsetLeft","parent","offsetParent","parentOverflowX","parentOverflowY","scrollTop","scrollLeft","Window","init","options","that","wrapper","offset","visibility","display","position","isVisible","content","windowContent","windowFrame","globalWindow","suppressActions","actions","length","fn","call","appendTo","containment","draggable","first","url","find","filter","remove","is","document","body","contains","visible","closest","addClass","attr","_createWindow","title","_dimensions","minTop","minLeft","maxTop","maxLeft","_position","refresh","toFront","modal","children","_overlay","opacity","on","_buttonEnter","bind","_buttonLeave","_windowActionHandler","_keydown","_focus","_blur","_keydownContent","data","windowInstance","widgetInstance","not","i","_resizable","_draggable","pinned","pin","role","aria-labelledby","add","support","mousedown","touchScroller","_resizeHandler","_onDocumentResize","_marker","guid","substring","trigger","notify","_tabKeyTrap","trap","shouldTrap","e","currentTarget","removeClass","width","height","maxHeight","sizeClass","size","dimensions","contentBoxSizing","lrBorderWidth","tbBorderWidth","paddingTop","_isPinned","_updateBoundaries","maxWidth","minWidth","minHeight","hide","containmentTop","containmentLeft","parseFloat","Number","replace","innerWidth","innerHeight","clientWidth","scrollbar","clientHeight","_animationOptions","animation","basicAnimation","open","effects","close","_resize","resize","resizable","resizing","off","destroy","target","toggleMaximization","split","index","handler","append","resizeHandle","WindowResizing","dragging","WindowDragging","dragHandle","_actions","titlebar","container","windowSpecificCommands","map","action","html","render","setOptions","doc","cachedOptions","JSON","parse","stringify","_containerScrollTop","_containerScrollLeft","scrollable","restore","_enableDocumentScrolling","events","zoom","direction","fade","duration","properties","scale","autoFocus","isMaximized","isMinimized","_closable","inArray","keys","keyCode","ESC","stopPropagation","_close","handled","distance","newWidth","newHeight","w","h","_closing","altKey","unpin","UP","maximize","DOWN","minimize","getOffset","ctrlKey","LEFT","RIGHT","preventDefault","overlay","zIndex","insertBefore","preventScroll","_stopDocumentScrolling","_actionForIcon","icon","iconClass","exec","className","k-i-close","k-i-window-maximize","k-i-window-minimize","k-i-window-restore","k-i-refresh","k-i-pin","k-i-unpin","_modals","windowElements","modals","_object","push","sort","a","b","style","widget","center","documentWindow","newTop","newLeft","_scrollIsAppended","encoded","titleBar","titleElement","arguments","text","prepend","htmlEncode","scrollContainer","angular","elements","empty","dataItem","showOptions","contentElement","otherModalsVisible","containmentContext","kendoStop","Fade","overlayFx","fx","fadeIn","endValue","play","show","kendoAnimate","complete","_activate","_removeOverlay","suppressAnimation","hideOverlay","hideOptions","fadeOut","startValue","last","systemTriggered","defaultPrevented","userTriggered","reverse","_deactivate","iframe","lastModal","_actionable","_shouldFocus","active","avoidFocus","currentWindow","openAnimation","originalZIndex","windowObject","zIndexNew","setTimeout","focus","windowTop","restoreOptions","shouldRestrictTop","end","removeAttr","_sizingAction","actionId","callback","eq","before","toggle","_storeOverflowRule","$body","$html","_restoreOverflowRule","$element","_isOverflowStored","overflowRule","get","overflow","removeData","win","wnd","zoomLevel","initOptions","showIframe","_ajaxRequest","src","contentFrame","_triggerRefresh","toggleClass","_ajaxComplete","clearTimeout","_loadingIconTimeout","_ajaxError","xhr","status","_ajaxSuccess","contentTemplate","prop","_showLoading","ajax","dataType","cache","error","success","_destroy","unbind","contentHtml","iframeSrcAttributes","isRtl","getAttribute","editor","owner","_preventDragging","group","dragstart","drag","dragend","userEvents","addOverlay","removeOverlay","dragcancel","prototype","elementPadding","initialPosition","resizeDirection","initialSize","containerOffset","marginTop","marginLeft","hasMargin","test","wrapperPosition","relativeElMarginLeft","relativeElMarginTop","_relativeElMarginLeft","_relativeElMarginTop","rtl","leftRtlOffset","scrollOffset","windowBottom","windowRight","location","y","newWindowTop","reset","initialWindowPosition","initialPointerPosition","startPosition","client","axis","transforms","_finishDrag","plugin","amd","a1","a2","a3"],"mappings":"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"}