').appendTo(self.body);\n self.html.bind('mousemove', self.resizeHandler);\n e.preventDefault();\n });\n self.html.bind('mouseup', function () {\n self.body.find('#console_resizing_fade').remove();\n self.html.unbind('mousemove', self.resizeHandler);\n });\n self.console.find('#dev_console_hide').click(function () {\n if (self.consoleWindow && self.consoleWindow.closed) {\n self.consoleWindow = null;\n }\n self.body.css('height', '');\n self.console.css('z-index', '-1');\n if (self.consoleWindow !== null) {\n $(self.consoleWindow).unload();\n self.consoleWindow.close();\n }\n self.body.find('#console_resizing_fade').remove();\n self.consoleWindow = null;\n });\n self.console.find('#dev_console_expand').click(function () {\n if (self.consoleWindow && self.consoleWindow.closed) {\n self.consoleWindow = null;\n }\n if (self.consoleWindow === null) {\n var width = self.console.width() * 0.8;\n var height = self.console.height();\n if (navigator.userAgent.toLowerCase().indexOf('chrome') !== -1) {\n height += 20;\n }\n var left = (screen.width - width) / 2;\n var top = (screen.height - height) / 2;\n var params = 'width=' + width + ',height=' + height;\n params += ',top=' + top + ',left=' + left;\n params += ',screenY=' + top + ',screenX=' + left; // let's support older NS too ;)\n params += ',resizable'; // given as an example of a =yes\n params += ',dialog'; // NS/FF only thing\n self.consoleWindow = window.open('', '_blank', params);\n if (self.consoleWindow) {\n $(self.consoleWindow.document.body.parentNode).addClass('consoleWindow');\n self.consoleWindow.document.title = self.consoleTitle.text();\n $(self.consoleWindow.document.body).append(self.consoleInner);\n $(document.body).css('height', '');\n $(this).html('↓');\n $.each(self.styles, function () {\n $(self.consoleWindow.document.body.parentNode).find('head').append(this.cloneNode(true));\n });\n self.console.css('z-index', '-1');\n $(self.consoleWindow).unload(function () {\n $(this).html('↑');\n self.console.append(self.consoleInner);\n\n }.bind(this));\n\n // Styles from application.css, codemirror.css are used in the consoleWindow.\n var applicationCss = editor.$mainBody.parent().find('head')\n .find(\"link[href*='application.css'],link[href*='codemirror.css']\")\n .clone();\n $(self.consoleWindow.document).find('head').append(applicationCss);\n }\n } else {\n $(self.consoleWindow).unload();\n self.consoleWindow.close();\n self.body.css('height', 100 - (100 * parseFloat(self.console.css('height')) / parseFloat(self.console.parent().css('height'))) + '%');\n self.console.css('z-index', '');\n }\n\n });\n\n $(window).unload(function () {\n if (self.consoleWindow !== null) {\n self.consoleWindow.close();\n }\n });\n\n if (AppSettings.isDebug) {\n var actions = {\n 'newfolder': function () {\n var path1 = self.treeView.getFolder(self.treeView.getSelectPath()),\n path2 = prompt(\"New folder name:\", path1 + '/new_dir');\n if (path2 === null) {\n return;\n }\n self.treeView.createFolder(path2);\n },\n 'newfile': function () {\n var path1 = self.treeView.getFolder(self.treeView.getSelectPath()),\n path2 = prompt(\"New file name:\", path1 + '/new_file.js');\n if (path2 === null) {\n return;\n }\n self.treeView.createFile(path2);\n },\n 'rename': function () {\n var path1 = self.treeView.getSelectPath();\n if (path1 === '/') {\n return;\n }\n var path2 = prompt(\"Rename or move:\", path1);\n if (path2 === null) {\n return;\n }\n if (self.fso.isFile(path1)) {\n if ('undefined' !== typeof self.editors[path1]) {\n self.editors[path2] = self.editors[path1];\n delete self.editors[path1];\n }\n }\n self.treeView.move(path1, path2);\n },\n 'uploadfiles': function () {\n alert('file upload should be implemented coming soon!');\n // do something here ...\n },\n 'save': function () {\n for (var file in self.editors) {\n if (self.editors.hasOwnProperty(file)) {\n self.fso.write(file, self.editors[file].getValue());\n }\n }\n\n self.dataSource.save(self.fso, function (error) {\n ErrorUtility.logError(error);\n });\n },\n 'downloadaszip': function () {\n for (var file in self.editors) {\n if (self.editors.hasOwnProperty(file)) {\n self.fso.write(file, self.editors[file].getValue());\n }\n }\n\n var data = {\n content: JSON.stringify(self.fso)\n };\n\n // TODO: not send to server\n\n var requestData = {\n url: AppSettings.serverActionsUrl.controlToZip,\n success: function (fsoContent) {\n var result = Utility.saveFileToDiskFromUrlOrBase64(fsoContent, self.name + '.zip');\n ErrorUtility.logWarning(result.error);\n },\n type: 'POST',\n data: JSON.stringify(data),\n contentType: 'text/plain',\n dataType: 'json',\n xhrFields: { withCredentials: true },\n error: function (error) {\n ErrorUtility.logError(error);\n }\n };\n RequestController.request(requestData);\n },\n 'delete': function () {\n var path = self.treeView.getSelectPath();\n if (confirm(\"Are you sure to delete \\\"\" + path + \"\\\"?\")) {\n self.treeView.remove(path);\n if (self.fso.isFile(path)) {\n self.consoleEditorPlace.css({ backgroundImage: 'none' }).children().hide();\n if ('undefined' !== typeof self.editors[path]) {\n $(self.editors[path].getWrapperElement()).remove();\n delete self.editors[path];\n }\n }\n }\n }\n };\n\n self.console.find('#dev_console_toolbar').toggleClass('dev_console_toolbar_disable', !AppSettings.isLocal).on('click', 'a', function () { /* CodeAnalyser ignore:line */\n if (!this.id) {\n return;\n }\n var action = this.id.replace('dev_console_toolbar_', '');\n if ('undefined' !== typeof actions[action]) {\n actions[action]();\n }\n });\n }\n }\n\n this.show = function (dataSource) {\n designer.ui.knockout.renderDialog(this);\n\n load();\n\n if (!self.loaded) {\n return;\n }\n\n if (self.consoleWindow && self.consoleWindow.closed) {\n self.consoleWindow = null;\n }\n\n self.console.css('display', '');\n self.fso = null;\n self.dataSource = dataSource;\n self.editors = {};\n self.consoleEditorPlace.css({ backgroundImage: 'none' }).children().remove();\n self.fileTreePlace.children().remove();\n if (self.consoleWindow === null) {\n self.console.css('z-index', '');\n self.body.css('height', 100 - (100 * parseFloat(self.console.css('height')) / parseFloat(self.console.parent().css('height'))) + '%');\n } else {\n self.consoleWindow.focus();\n }\n async.parallel([\n function (cb) {\n dataSource.load(function (error, fso, selectedItem, name) {\n self.fso = fso;\n self.name = name;\n self.treeView = new FsoTreeView(self.fileTreePlace, self.fso, onFileSelect);\n self.treeView.selectItem(selectedItem);\n self.consoleTitle.text(name);\n if (self.consoleWindow){\n self.consoleWindow.document.title = name;\n }\n cb(error);\n });\n }\n ], function (error) {\n ErrorUtility.logError(error);\n });\n };\n\n function onFileSelect(file) {\n self.consoleEditorPlace.css({ backgroundImage: 'none' }).children().hide();\n var parts = file.split('.');\n var ext = '';\n if (parts.length > 1) {\n ext = parts[parts.length - 1].toLowerCase();\n }\n if (['png', 'jpg', 'jpeg', 'gif', 'bmp', 'ico'].indexOf(ext) !== -1) {\n self.consoleEditorPlace.css({ backgroundImage: 'url(' + ImageController.base64ToDataUrl(self.fso.read(file, 'base64')) + ')', backgroundRepeat: 'no-repeat', backgroundPosition: '50% 50%' });\n return;\n }\n if ('undefined' === typeof self.editors) {\n self.editors = {};\n }\n if ('undefined' === typeof self.editors[file]) {\n var mode = 'text/' + ext;\n if (['css', 'less'].indexOf(ext) !== -1) {\n mode = 'css';\n }\n if (['js', 'json'].indexOf(ext) !== -1) {\n mode = 'javascript';\n }\n if (['php', 'html', 'phtml'].indexOf(ext) !== -1) {\n mode = 'application/x-httpd-php';\n }\n self.editors[file] = window.CodeMirror(self.consoleEditorPlace[0], {\n mode: mode,\n lineNumbers: true,\n matchBrackets: true,\n tabMode: \"indent\",\n extraKeys: {\n \"F11\": function (cm) {\n cm.setOption(\"fullScreen\", !cm.getOption(\"fullScreen\"));\n },\n \"Esc\": function (cm) {\n if (cm.getOption(\"fullScreen\")) {\n cm.setOption(\"fullScreen\", false);\n }\n }\n }\n });\n self.editors[file].setValue(self.fso.read(file));\n }\n $(self.editors[file].getWrapperElement()).show();\n self.editors[file].focus();\n }\n};"
}
}
},
"ExportThemeDialog": {
"type": "dir",
"items": {
"ExportThemeDialog.css": {
"type": "text",
"content": ".prompt-input{padding:0 5px;width:260px}.prompt-content{padding-top:10px}.prompt-error{color:#ff261c}.prompt-checkbox{width:24px}#promptDialog .default-button{border-color:#74b9ef}.dialog-input-container{margin-bottom:0}.dialog-error-container{margin:0}"
},
"ExportThemeDialog.htm": {
"type": "text",
"content": "
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n\n
\n\n
\n\n
\n\n
\n
\n
"
},
"ExportThemeDialog.js": {
"type": "text",
"content": "/* global $, Utils, PromptDialog, ko, createGuid, l */\n/* exported ExportThemeDialog */\n\nvar ExportThemeDialog = (function () {\n 'use strict';\n\n ExportThemeDialog = function () {\n\n this.customizeLabel = ko.observable('');\n this.customizeThemeChecked = ko.observable(true);\n\n this.$promptDialogValue = null;\n this.$promptErrorLabel = null;\n\n ExportThemeDialog.superclass.constructor.call(this);\n\n this.customizeLabel(l('#AllowCustomizeTheme'));\n this.customizeLabelVisible = ko.observable(true);\n\n this.parentShow = this.show;\n this.parentHide = this.hide;\n\n this.show = function show(title, prompt, okBtnKey, cancelBtnKey, defaultValue, customizeLabelVisibleValue, callback, validation, customHtml, forceButtons) {\n\n this.parentShow(title, prompt, okBtnKey, cancelBtnKey, defaultValue, callback, validation, customHtml, forceButtons);\n\n this.customizeLabelVisible(customizeLabelVisibleValue);\n };\n\n this.hide = function hide(){\n this.parentHide();\n };\n\n this.onDialogButtonsBound = function (div) {\n this.dialogButtonsDiv = div;\n }.bind(this);\n\n this.cancel = (function () {\n this.hide();\n this.modalCallback(null, null, false, true /* canceled */);\n }).bind(this);\n\n /**\n * Copy-paste from 'Prompt Dialog', except 'allowCustomize'\n * @type {*}\n */\n this.ok = function () {\n var val = this.$promptDialogValue.val();\n var allowCustomize = this.customizeThemeChecked();\n var successKey = \"success\";\n this.validationCallback(val, successKey, function (error, validationMessage) {\n if (validationMessage !== successKey) {\n this.$promptErrorLabel.text(validationMessage);\n this.$promptErrorLabel.css('display', '');\n } else {\n this.hide();\n this.modalCallback(null, val, allowCustomize, false);\n }\n }.bind(this));\n }.bind(this);\n\n this.guid = createGuid();\n\n this.onPromptDialogValueBound = function onPromptDialogValueBound(element){\n this.$promptDialogValue = $(element);\n };\n\n this.onPromptErrorLabelBound = function onPromptErrorLabelBound(element){\n this.$promptErrorLabel = $(element);\n };\n\n };\n\n Utils.extend(ExportThemeDialog, PromptDialog);\n\n return ExportThemeDialog;\n\n})();"
}
}
},
"FrameLayoutMenu": {
"type": "dir",
"items": {
"FrameLayoutMenu.css": {
"type": "text",
"content": ".FrameLayoutMenu{position:absolute;z-index:999;background:transparent;width:50px;box-sizing:border-box}"
},
"FrameLayoutMenu.htm": {
"type": "text",
"content": "\n"
},
"FrameLayoutMenu.js": {
"type": "text",
"content": "/* export FrameLayoutMenu */\n/* global PWStackHelper, editor, UIHelper, PubSubController, Channels, ControlStorageController */\n\nfunction FrameLayoutMenu() {\n 'use strict';\n\n this.visible = ko.observable(false);\n this.cmItem = ko.observable();\n\n this.hideHandler = this.hide.bind(this);\n\n PubSubController.subscribe(Channels.contentEditor.start, this.hideHandler);\n PubSubController.subscribe(Channels.mouseEvents.dragStart, this.hideHandler);\n PubSubController.subscribe(Channels.previewEvents.unload, this.hideHandler);\n}\n\nFrameLayoutMenu.prototype.onFrameLayoutMenuBound = function (element) {\n 'use strict';\n\n this.$window = $(element);\n this.positionFunc = this.position.bind(this);\n this.control = null;\n};\n\nFrameLayoutMenu.prototype.bind = function () {\n 'use strict';\n\n //editor.$previewWindow.scroll(this.position.bind(this));\n\n PubSubController.subscribe(Channels.previewEvents.scroll, this.positionFunc);\n\n var pc = $(\"#previewContainer\");\n\n this.previewContainerTop = pc.offset().top;\n this.previewContainerHeight = pc.outerHeight();\n this.previewContainerLeft = pc.offset().left;\n this.previewContainerWidth = pc.outerWidth();\n};\n\nFrameLayoutMenu.prototype.unbind = function () {\n 'use strict';\n\n PubSubController.unsubscribe(Channels.previewEvents.scroll, this.positionFunc);\n};\n\nFrameLayoutMenu.prototype.move = function (position) {\n 'use strict';\n\n this.$window.css('left', position.left);\n this.$window.css('right', position.right);\n this.$window.css('top', position.top);\n};\n\nFrameLayoutMenu.prototype.position = function () {\n 'use strict';\n\n if (!this.visible() || !this.control) {\n return;\n }\n\n var newLeft, newTop, previewBottomOffset = 10;\n\n\n var frameBB = UIHelper.getBoundingBox(editor.previewController.$currentFrame),\n containerDom = $('.data-control-id-' + this.control.prop('dataId'), editor.$previewBody);\n\n if (containerDom.length === 0) {\n return;\n }\n\n var scrollTop = editor.$previewBody && editor.$previewBody.scrollTop() || editor.$previewWindow.scrollTop();\n\n newLeft = containerDom.offset().left + frameBB.left + containerDom.outerWidth() + 10;\n newTop = containerDom.offset().top + frameBB.top - scrollTop;\n\n if (newTop > this.previewContainerTop + this.previewContainerHeight - this.$window.height() - previewBottomOffset) {\n this.hide();\n return;\n }\n\n if (newTop < this.previewContainerTop) {\n this.hide();\n return;\n }\n\n newLeft = Math.min(newLeft, this.previewContainerLeft + this.previewContainerWidth - this.$window.width());\n\n this.move({\n left: newLeft,\n top: newTop,\n right: 'auto'\n });\n};\n\nFrameLayoutMenu.prototype.show = function (control) {\n 'use strict';\n\n while (control) {\n if (ControlStorageController.getEditorJson(control.getPseudoStack()).selectable === true) break;\n control = control.isTopControl() ? null : control.parent();\n }\n\n if (!control)return;\n\n this.bind();\n\n this.visible(true);\n\n this.control = control;\n\n this.position();\n this.cmItem(PWStackHelper.getItem('FrameLayoutMenu', control, {}));\n};\n\nFrameLayoutMenu.prototype.hide = function () {\n 'use strict';\n\n this.unbind();\n\n this.control = null;\n this.cmItem(undefined);\n this.visible(false);\n};\n\nFrameLayoutMenu.prototype.dispose = function () {\n 'use strict';\n PubSubController.unsubscribe(Channels.previewEvents.unload, this.hideHandler);\n PubSubController.unsubscribe(Channels.contentEditor.start, this.hideHandler);\n PubSubController.unsubscribe(Channels.mouseEvents.dragStart, this.hideHandler);\n};"
}
}
},
"LoginForm": {
"type": "dir",
"items": {
"LoginForm.css": {
"type": "text",
"content": ".login-close{background:#fff url({images}UIIcons/close-window.png) center center no-repeat;display:block;height:24px;position:absolute;right:10px;top:10px;width:24px}#login_dialog .dialog-content{padding-top:0;padding-bottom:0;width:470px;height:355px;overflow:hidden}#login_frame{width:100%;height:100%;border:0}#login_dialog .dialog-footer a{font-size:0}#login_dialog .dialog-footer img{width:70px;height:20px;margin-left:0}"
},
"LoginForm.htm": {
"type": "text",
"content": "
"
},
"LoginForm.js": {
"type": "text",
"content": "/* global $, AppSettings, designer, DialogHelper */\n/* exported LoginForm */\n\nvar LoginForm = function () {\n 'use strict';\n\n var self = this;\n this.frameSrc = '';\n this._onLoggedIn = null;\n\n this.$form = null;\n this.$overlay = null;\n\n this._onMessage = (function (e) {\n\n var MIN_HEIGHT = 200;\n var MIN_WIDTH = 470;\n\n if (e.data.key === 'loggedin') {\n this.doLogin(e.data);\n }\n if (e.data.key === 'resize') {\n\n if (e.data.width < 1 || e.data.height < 1) {\n return;\n }\n\n var container = $('#login_dialog').find('.dialog-content');\n var frame = $('#login_frame');\n\n var w = e.data.width + (container.width() - frame.width());\n var h = e.data.height + (container.height() - frame.height());\n if (w >= MIN_WIDTH) {\n container.css('width', w + 'px');\n }\n if (h >= MIN_HEIGHT) {\n container.css('height', h + 'px');\n }\n }\n }).bind(this);\n\n window.addEventListener('message', this._onMessage);\n\n this.doLogin = function (obj) {\n if (obj && obj.userName) {\n AppSettings.userName = obj.userName;\n AppSettings.userId = obj.userId;\n AppSettings.apiToken = obj.apiToken;\n AppSettings.authorized = true;\n\n var e = $.Event('onlogin', {profileData: obj});\n $(this).trigger(e);\n\n if (this._onLoggedIn) {\n this._onLoggedIn();\n }\n }\n this.close();\n };\n\n var doLogout = function () {\n AppSettings.userName = null;\n AppSettings.userId = 0;\n AppSettings.authorized = false;\n $(self).trigger('onlogout');\n };\n\n\n this.resizeTimer = 0;\n this.show = function (onLoggedIn) {\n this.frameSrc = AppSettings.serverActionsUrl.externalLogOn;\n this._onLoggedIn = onLoggedIn;\n\n AppSettings.userName = null;\n AppSettings.userId = 0;\n AppSettings.authorized = false;\n\n designer.ui.knockout.renderDialog(this);\n $('.login-iframe').attr('src', this.frameSrc);\n\n this.$overlay = DialogHelper.setDialogZIndex(this.$form, true);\n\n this.$overlay.show();\n this.$form.show();\n this.resizeTimer = setInterval(function () {\n $('.login-iframe')[0].contentWindow.postMessage({key: 'resize'}, '*');\n }, 100);\n\n };\n\n this.onBinded = function (element) {\n this.$form = $(element);\n };\n\n this.logout = function () {\n var iframe = $('
');\n\n $(\"body\").append(iframe);\n\n iframe.load(function () {\n doLogout();\n iframe.remove();\n });\n\n iframe.attr({\n 'src': AppSettings.serverActionsUrl.accountLogOff + '?rand=' + new Date().getTime(),\n 'style': 'display: none;'\n });\n };\n\n this.close = function () {\n clearInterval(this.resizeTimer);\n if (!this.$form) return;\n\n this.$form.hide();\n this.$overlay.remove();\n $('.login-iframe').attr('src', 'about:blank');\n\n if (!AppSettings.authorized) {\n $(this).trigger('onlogout');\n $(this).trigger('oncancel');\n }\n };\n\n this.dispose = function () {\n this.frameSrc = '';\n this._onLoggedIn = null;\n window.removeEventListener('message', this._onMessage);\n };\n\n this.guid = window.createGuid();\n};\n\nLoginForm.checkLogin = function (callback) { // don't rename\n 'use strict';\n\n var lf = new LoginForm();\n var url = AppSettings.serverActionsUrl.externalLogOn;\n\n var logonFrame = $('
');\n\n logonFrame.on('load', function () { /* CodeAnalyser ignore:line */\n setTimeout(function () {\n logonFrame.remove();\n lf.dispose();\n if (typeof callback === \"function\") {\n callback(null);\n }\n }, 100);\n });\n\n logonFrame.on('error', function () { /* CodeAnalyser ignore:line */\n logonFrame.remove();\n lf.dispose();\n if (typeof callback === \"function\") {\n callback(new Error('Unable to load hidden-frame data'));\n }\n });\n\n logonFrame.attr({src: url}).hide().appendTo('body');\n};"
}
}
},
"MainForm": {
"type": "dir",
"items": {
"MainForm.css": {
"type": "text",
"content": "html,body{background-color:#FDFDFD;height:100%;margin:0;overflow:hidden;padding:0;position:relative;width:100%}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:#aaa;border-radius:0}::-webkit-scrollbar-thumb:hover{background:#7d7d7d}.top-menu{background-color:#F1F1F1;box-sizing:border-box;display:block;font:11px Arial,Helvetica,sans-serif;height:38px;left:0;margin:0;padding:3px 7px 0 3px;position:absolute;right:0;bottom:0}.pw-panel-left.pw-panel-visible.pw-panel-pinned ~ .main .top-menu{left:200px}.pw-panel-right.pw-panel-visible.pw-panel-pinned ~ .main .top-menu{right:250px}.top-menu li{position:relative;display:block}.editor-path-list li{float:left}.top-menu .item a,.top-menu .icon-item a{border-radius:4px;position:relative;display:block;padding:0 10px;color:#737373;text-decoration:none;white-space:nowrap;line-height:31px;height:31px}.top-menu .more{border-radius:2px;background:white}.top-menu .item a[class*=icon-]:before{margin-right:.5em}.top-menu a[class*=icon-]:before{display:block;float:left;width:24px;height:31px;content:''}.top-menu .more>a:after{display:block;float:right;margin-left:.5em;width:12px;height:32px;background:url({images}MainForm/icon-exdpand-arrow.png) no-repeat center;content:''}.top-menu>.more:hover>a{border-radius:2px 2px 0 0}.top-menu>.separator{display:block;width:1px;height:32px;background:#575757}.top-menu>*{display:block;position:absolute}.top-menu .pull-right{right:0}.top-menu .pull-left{left:0}.top-menu-two ~ #previewContainer{top:70px}.top-menu-three .pull-right{left:10px;right:auto;top:37px}.editor-path-list{left:121px;top:8px}.top-menu-three ~ #previewContainer{top:100px}.top-menu .item .no-padding-left,.top-menu .icon-item .no-padding-left{padding-left:0}.top-menu .item .no-padding-right,.top-menu .icon-item .no-padding-right{padding-right:0}.top-menu .icon-save:before{background:url({images}MainForm/icon-save.png) no-repeat 0 center}.top-menu .icon-file:before{background:url({images}MainForm/icon-bar-file.png) no-repeat 0 center}.top-menu .icon-undo:before{background:url({images}MainForm/icon-bar-undo.png) no-repeat 0 center;opacity:.5}.top-menu .saving a,.top-menu .saving a:hover{background:0}.top-menu .icon-item.hover .icon-undo:before{opacity:1}.top-menu .icon-redo:before{background:url({images}MainForm/icon-bar-redo.png) no-repeat 0 center;opacity:.5}.top-menu .icon-item.hover .icon-redo:before{opacity:1}.top-menu .icon-account:before{background:url({images}MainForm/icon-bar-account.png) no-repeat 0 center;width:16px!important}.top-menu .icon-close:before{background:url({images}MainForm/icon-bar-close.png) no-repeat 0 center;width:16px!important}.top-menu .icon-desktop-button:before{background:url({images}MainForm/icon-desktop.png) no-repeat 0 center}.top-menu .icon-tablet-portrait-button:before{background:url({images}MainForm/icon-ipad-portrait.png) no-repeat 0 center}.top-menu .icon-tablet-landscape-button:before{background:url({images}MainForm/icon-ipad-landscape.png) no-repeat 0 center}.top-menu .icon-iphone-landscape-button:before{background:url({images}MainForm/icon-iphone-landscape.png) no-repeat 0 center}.top-menu .icon-iphone-portrait-button:before{background:url({images}MainForm/icon-iphone-portrait.png) no-repeat 0 center}.top-menu .item:hover>.top-submenu,.top-menu .icon-item:hover>.top-submenu{visibility:visible}.top-menu .icon-item .combo{border:1px solid #ccc;border-radius:4px;box-shadow:0 0 5px 0 rgba(0,0,0,.1);display:block;width:145px}.top-submenu{position:absolute;top:100%;left:0;display:block;visibility:hidden;padding:5px;min-width:100px;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:2px;background:#fff;box-shadow:0 1px 5px 0 rgba(0,0,0,.6)}.top-submenu .item{float:none;width:150px}.top-submenu .item>a{padding-left:.5em;color:#4d4d4d;text-shadow:0 0 0 transparent}.top-submenu .separator{float:none;width:100%;height:1px;background:#eee}.top-submenu .icon-preview:before{background:url({images}MainForm/icon-preview.png) no-repeat 0 center}.top-submenu .item:hover .icon-preview:before{background:url({images}MainForm/icon-preview-a.png) no-repeat 0 center}.top-submenu .item:hover .icon-save:before{background:url({images}MainForm/icon-save-a.png) no-repeat 0 center}.top-submenu .icon-publish:before{background:url({images}MainForm/icon-publish.png) no-repeat 0 center}.top-submenu .item:hover .icon-publish:before{background:url({images}MainForm/icon-publish-a.png) no-repeat 0 center}.top-submenu .icon-export:before{background:url({images}MainForm/icon-export.png) no-repeat 0 center}.top-submenu .item:hover .icon-export:before{background:url({images}MainForm/icon-export-a.png) no-repeat 0 center}.top-submenu .icon-desktop:before{background:url({images}MainForm/icon-desktop.png) no-repeat 0 center}.top-submenu .icon-iphone-portrait:before{background:url({images}MainForm/icon-iphone-portrait.png) no-repeat 0 center}.top-submenu .item:hover .icon-iphone-portrait:before{background:url({images}MainForm/icon-iphone-portrait-a.png) no-repeat 0 center}.top-submenu .icon-iphone-landscape:before{background:url({images}MainForm/icon-iphone-landscape.png) no-repeat 0 center}.top-submenu .item:hover .icon-desktop:before{background:url({images}MainForm/icon-desktop-a.png) no-repeat 0 center}.top-submenu .item:hover .icon-iphone-landscape:before{background:url({images}MainForm/icon-iphone-landscape-a.png) no-repeat 0 center}.top-submenu .icon-ipad-portrait:before{background:url({images}MainForm/icon-ipad-portrait.png) no-repeat 0 center}.top-submenu .item:hover .icon-ipad-portrait:before{background:url({images}MainForm/icon-ipad-portrait-a.png) no-repeat 0 center}.top-submenu .icon-ipad-landscape:before{background:url({images}MainForm/icon-ipad-landscape.png) no-repeat 0 center}.top-submenu .item:hover .icon-ipad-landscape:before{background:url({images}MainForm/icon-ipad-landscape-a.png) no-repeat 0 center}#previewContainer{background-color:#fff;bottom:38px;left:0;overflow:hidden;position:absolute;right:0;z-index:1}.pw-panel-right.pw-panel-visible.pw-panel-pinned ~ .main #previewContainer{right:250px}.pw-panel-left.pw-panel-visible.pw-panel-pinned ~ .main #previewContainer{left:200px}#preview{top:0;right:0;bottom:0;left:0;width:100%;height:100%;border:0}.make-hidden{display:none}#previewContainer.tablet-landscape,#previewContainer.tablet-portrait,#previewContainer.iphone-landscape,#previewContainer.iphone-portrait{overflow:hidden}#previewContainer.tablet-landscape #frameContainer,#previewContainer.tablet-portrait #frameContainer,#previewContainer.iphone-landscape #frameContainer,#previewContainer.iphone-portrait #frameContainer{height:100%;margin:0 auto;border-left:1px solid #c4c4c4;border-right:1px solid #c4c4c4}#previewContainer.tablet-landscape #responsiveContainer,#previewContainer.tablet-portrait #responsiveContainer,#previewContainer.iphone-landscape #responsiveContainer,#previewContainer.iphone-portrait #responsiveContainer{overflow:auto}#frameContainer{overflow:hidden}#responsiveContainer{background-image:url('{images}retina_dust.png');position:absolute;bottom:0;left:0;right:0;top:0}#frameWrapper,#frameDefaultsWrapper{width:100%;height:100%}#previewContainer.desktop #frameContainer{margin:0;height:100%;width:100%;min-width:1210px}#previewContainer.desktop #responsiveContainer{margin:0;background:0;overflow-x:auto;overflow-y:hidden}#previewContainer.tablet-landscape #frameContainer{width:1024px}#previewContainer.tablet-landscape #frameWrapper iframe,#previewContainer.tablet-landscape #frameDefaultsWrapper iframe{overflow-x:hidden}#previewContainer.tablet-portrait #frameContainer{width:768px}#previewContainer.iphone-landscape #frameContainer{width:480px}#previewContainer.iphone-portrait #frameContainer{width:320px}#previewContainer{top:126px}.main.preview #previewContainer{top:40px}.unselectable{-webkit-user-select:none!important;-khtml-user-select:none!important;-moz-user-select:none!important;-o-user-select:none!important;user-select:none!important}#pageslide,#pageslide-fake{color:#333;padding:0;height:100%;width:200px}#pageslide-fake{background-color:#fff;display:block}.alert{padding:8px 14px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;position:absolute;top:7px;left:330px!important;right:10px}.alert ~ #previewContainer{top:85px}.alert ~ .top-menu-two ~ #previewContainer{top:120px}.alert ~ .top-menu-three ~ #previewContainer{top:145px}.alert ~ .top-menu{top:45px}@media screen and (max-width:1330px){#undo-redo-item{border-right-width:0!important}}#inspect-view-caption{background-color:#46a2ea;color:#fff;content:attr(data-caption);cursor:pointer;font:10px/1 Arial,Helvetica,sans-serif;left:1px;padding:2px;position:absolute;top:1px}#inspect-view-caption:hover{background-color:#74b9ef}#inspect-view-caption-path,.inspect-view-caption-path-part,#inspect-view-caption-caption{display:inline-block}#inspect-view-caption-path,.inspect-view-caption-path-part{background:#2f96e7;margin-right:1px;padding:0 1px}#inspect-view-caption-path:hover,.inspect-view-caption-path-part:hover{background:#5dadec}.inspect-view-caption-path-part:after{content:' › ';display:inline}.color-picker-item{position:absolute;top:2px;left:2px;display:inline-block;border-radius:3px;background-color:white;width:22px;height:22px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;border:1px solid #fff}.color-picker-item>.transparent{background:url({images}transparency-small.png)}.color-picker-item .color-picker-color-preview{display:inline-block;width:100%;height:100%;border-radius:4px}.color-picker-item.white .color-picker-color-preview{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;border:1px solid #c7c7c7}.ribbon-wrapper{background:#F1F1F1;left:0;position:absolute;right:0;border-bottom:1px solid #ddd;height:124px;top:0}.ribbon-wrapper .tabbed-view-content{height:88px;overflow-x:auto;overflow-y:hidden;width:100%}.ribbon-wrapper .tabbed-view-content .tabbed-view-content{height:auto}.ribbon-wrapper .tabbed-view-content::-webkit-scrollbar{width:4px;height:4px}.ribbon-tabs>.PWTabbedView{background-color:#F1F1F1;margin:0;white-space:nowrap}.ribbon-file{color:#fff;font:12px Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;left:0;position:absolute;top:5px;width:55px;z-index:9001}.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button,.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button *{line-height:27px;height:27px}.ribbon-file,.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button{background:#528FCC}.ribbon-file>.PWDropDownButton,.ribbon-file>.PWDropDownButton>.UIPopup,.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button,.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button *{bottom:0;left:0;margin:0!important;padding:0!important;position:absolute;top:0;right:0}.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button .pw-label-image,.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button .pw-label-arrow{display:none}.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button .pw-label-text{color:#fff;text-align:center}.ribbon-file>.PWDropDownButton>.UIPopup>.ui-popup-preview-button:hover,.ribbon-file>.PWDropDownButton>.UIPopup>.hover-element:hover,.ribbon-file>.PWDropDownButton>.UIPopup.hover-bg-rounded:hover{background-color:#70a3d6!important}.ribbon-file>.PWDropDownButton>.UIPopup.active-bg,.ribbon-file>.PWDropDownButton>.UIPopup.active-bg>.hover-element,.ribbon-file>.PWDropDownButton>.active-bg.open.hover-bg-rounded:not(.disabled)>.drop-down-button.hover-element{background-color:#f1f1f1!important;color:#3077BC!important;outline:0}.ribbon-file>.PWDropDownButton>.UIPopup.active-bg>.ui-popup-preview-button .pw-label-text{color:#3077BC!important}.ribbon-right-menu{font-size:0;position:absolute;right:0;top:0;z-index:9997}.ribbon-right-menu>.pw-controls-row{width:100%}@media screen and (max-width:1180px){.ribbon-wrapper{padding-top:29px;//34+5}.ribbon-right-menu{height:29px;right:0;left:0;z-index:9002}.ribbon-right-menu>.pw-controls-row{background:#528FCC;height:100%;margin:0;text-align:right;width:100%}.ribbon-right-menu>.pw-controls-row>.pw-controls{display:inline-block;float:none}.ribbon-file{top:34px}.pw-panel-right,.pw-panel-left,#previewContainer{top:155px!important}}.loading-overlay{position:absolute;display:block;top:0;left:0;right:0;bottom:0;z-index:10000}.loading-overlay.hidden{display:none}"
},
"MainForm.htm": {
"type": "text",
"content": "
\n \n
\n \n \n
\n \n \n \n \n
\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n
\n\n \n\n
\n\n
\n \n
\n\n
\n"
},
"MainForm.js": {
"type": "text",
"content": "/* exported MainForm */\n/* global $, l, ko, PWStackHelper, ViewProvider, DataProviderFacade, _$, ErrorUtility */\n\nvar MainForm = function () {\n 'use strict';\n\n var info = DataProviderFacade.getCmsInfo();\n // Note: In AppLoader.js \"Themler for %CMSNAME%\" title hardcoded\n if (info && info.themeName) {\n window.document.title = info.themeName + ' - ' + l('Designer_Title', DataProviderFacade.realCmsName());\n } else {\n window.document.title = l('Designer_Title', DataProviderFacade.realCmsName());\n }\n\n var isActive = window.DataProviderFacade.getCmsInfo().isThemeActive;\n this.isActiveTheme = ko.observable(isActive);\n\n var getSaveCaption = function () {\n return this.isActiveTheme() ? l(\"Save & Publish\") : l(\"Save\");\n }.bind(this);\n\n this.correctViewWidth = function (view) {\n var fc = $('#previewContainer #frameContainer'),\n fcWidth,\n scrollbarWidth;\n\n fc.css('width', '');\n\n if (view === 'desktop') {\n return;\n }\n\n scrollbarWidth = this.getScrollbarWidth(fc);\n fcWidth = fc.width();\n //console.log(fcWidth, scrollbarWidth);\n fc.css('width', (fcWidth + scrollbarWidth) + 'px');\n };\n\n\n this.getScrollbarWidth = function (context) {\n if (typeof this.scrollbarWidth !== 'undefined') {\n return this.scrollbarWidth;\n }\n\n if (!context || !context.length) {\n return 0;\n }\n\n var div = $(\"
\"),\n width;\n\n context.append(div);\n div.append(\"
\");\n width = div.width() - div.children().width();\n div.remove();\n\n this.scrollbarWidth = width;\n\n return width;\n };\n\n this.saving = ko.observable(false);\n\n this.makeThemeAsActive = function () {\n if (this.isActiveTheme()) {\n return;\n }\n\n DataProviderFacade.makeThemeAsActive(function (error) {\n if (!ErrorUtility.logError(error)) {\n this.isActiveTheme(true);\n this.saveButtonCaption(getSaveCaption());\n }\n }.bind(this));\n }.bind(this);\n\n this.guid = window.createGuid();\n\n this.rmItem = ko.observable();\n this.urItem = ko.observable();\n this.ribbonTabsView = ko.observable();\n this.ribbonFileView = ko.observable();\n this.ribbonRightMenuView = ko.observable();\n this.leftPanelView = ko.observable();\n this.rightPanelView = ko.observable();\n\n this.init = function (theme) {\n ViewProvider.whenReady(function () {\n this.rmItem(PWStackHelper.getItem(\"RightMenuView\", _$(theme, ''), {}));\n this.urItem(PWStackHelper.getItem(\"UndoRedoMenuView\", _$(theme, ''), {}));\n this.ribbonTabsView(PWStackHelper.getItem(\"RibbonTabsView\", _$(theme, ''), {}));\n this.ribbonFileView(PWStackHelper.getItem(\"RibbonFileView\", _$(theme, ''), {}));\n this.ribbonRightMenuView(PWStackHelper.getItem(\"RibbonRightMenuView\", _$(theme, ''), {}));\n this.leftPanelView(PWStackHelper.getItem(\"LeftPanelView\", _$(theme, ''), {}));\n this.rightPanelView(PWStackHelper.getItem(\"RightPanelView\", _$(theme, ''), {}));\n\n this.repositionTopMenuHandler = this.repositionTopMenu.bind(this);\n /* jshint ignore:start */\n $(window).on(\"resize\", this.repositionTopMenuHandler);\n PubSubController.subscribe(Channels.path.changed, this.repositionTopMenuHandler);\n /* jshint ignore:end */\n }.bind(this));\n };\n\n this.deInit = function () {\n /* jshint ignore:start */\n $(window).off(\"resize\", this.repositionTopMenuHandler);\n PubSubController.unsubscribe(Channels.path.changed, this.repositionTopMenuHandler);\n /* jshint ignore:end */\n };\n\n this.repositionTopMenu = function () {\n // Top menu hash:\n if (!this.tmh) {\n this.tmh = {};\n }\n\n this.tmh.topMenu =\n this.tmh.topMenu || $('.top-menu');\n\n this.tmh.leftElem =\n this.tmh.leftElem || $('.top-menu > .pull-left');\n\n this.tmh.rightElem =\n this.tmh.rightElem || $('.top-menu > .pull-right');\n\n if (!this.tmh.pathElem || this.tmh.pathElem.parent().length === 0) {\n this.tmh.pathElem = $('.editor-path-list');\n }\n\n this.tmh.otherWidth =\n this.tmh.otherWidth || $(\"#pageslide\").outerWidth(true);\n\n var windowWidth = $(window).width(),\n freeSpace = windowWidth - this.tmh.otherWidth;\n\n if (this.tmh.leftElem.outerWidth(true) + this.tmh.rightElem.outerWidth(true) +\n this.tmh.pathElem.outerWidth(true) <= freeSpace) {\n\n this.tmh.topMenu.removeClass(\"top-menu-two top-menu-three\");\n return;\n }\n\n if (this.tmh.leftElem.outerWidth(true) + this.tmh.rightElem.outerWidth(true) <= freeSpace) {\n this.tmh.topMenu\n .removeClass(\"top-menu-three\")\n .addClass(\"top-menu-two\");\n\n return;\n }\n\n this.tmh.topMenu\n .removeClass(\"top-menu-two\")\n .addClass(\"top-menu-three\");\n };\n};\n"
}
}
},
"MediaLibrary": {
"type": "dir",
"items": {
"MediaLibrary.css": {
"type": "text",
"content": ".dialog.medialibrary{display:none;position:absolute;top:4%;left:2%;width:95%;height:92%;min-width:600px;min-height:400px;padding:5px;z-index:9000}.dialog.medialibrary .dialog-button{display:none;margin-left:5px}.dialog.medialibrary .dialog-button:first-child{margin-left:0}.mediadialog-header{width:100%;height:25px;padding:5px;padding-left:10px}.media-frame{top:25px;left:0;width:100%;height:calc(100% - 40px)}.media-iframe{width:100%;height:100%;border:0;background:#fff url({images}loader_bar.gif) center center no-repeat}.dialog.medialibrary .dialog-header{padding-bottom:20px}.medialibrary-next,.medialibrary-back,.medialibrary-home,.medialibrary-downloads,.medialibrary-pipe{color:#808080!important;display:inline-block;font-size:14px;font-weight:normal;line-height:28px;padding:0 5px;text-decoration:none!important}.medialibrary-next{background:url({images}UIIcons/forward-bw-16.png) right center no-repeat;padding-right:20px}.medialibrary-back{background:url({images}UIIcons/back-bw-16.png) left center no-repeat;padding-left:20px}.medialibrary-home{background:url({images}UIIcons/icon-home-16.png) left center no-repeat;padding-left:20px}.medialibrary-downloads{background:url({images}UIIcons/download-bw.png) left center no-repeat;padding-left:25px}.medialibrary-logo{color:#808080!important;background:#fff url({images}MainForm/billion-photos-poweredby.png) right center no-repeat;display:block;height:20px;position:absolute;right:50px;top:12px;padding-right:95px}.medialibrary-close{background:#fff url({images}UIIcons/close-window.png) center center no-repeat;display:block;height:24px;position:absolute;right:10px;top:10px;width:24px}"
},
"MediaLibrary.htm": {
"type": "text",
"content": "
"
},
"MediaLibrary.js": {
"type": "text",
"content": "/* global AppSettings, ErrorUtility, Utils, BrowserForm, designer, CONST, SubscriptionDialog, PhotoSubscriptionDialog, RequestController, ConfirmEmailDialog, ko */\n/* exported MediaLibrary */\n\nvar MediaLibrary = (function () {\n 'use strict';\n\n MediaLibrary = function () {\n\n MediaLibrary.superclass.constructor.call(this);\n\n this._onPictureSelected = null;\n this._onMessageApply = this._onMessageApply.bind(this);\n this.showMyDownloads = ko.observable(AppSettings.authorized);\n this._baseUrl = null;\n this._isClipart = false;\n this._lastAction = null;\n MediaLibrary._lastFilterUrl = null;\n\n this._buildUrl = function (options) {\n\n var parameters = [];\n\n if (AppSettings.authorized) {\n parameters.push('sso=1');\n }\n\n if (typeof options.category === 'number' || typeof options.category === 'string') {\n parameters.push('Search.CategoryID=' + options.category);\n }\n\n if (typeof options.subCategory === 'number' || typeof options.subCategory === 'string') {\n parameters.push('Search.SubCategoryIds=' + options.subCategory);\n }\n\n if (typeof options.transparent === 'boolean' || typeof options.transparent === 'string') {\n parameters.push('Search.IsTransparent=' + options.transparent.toString());\n }\n\n if (typeof options.free === 'boolean' || typeof options.free === 'string') {\n parameters.push('Search.ShowFree=' + options.free.toString());\n }\n\n if (typeof options.photos === 'boolean' || typeof options.photos === 'string') {\n parameters.push('Search.Photos=' + options.photos.toString());\n }\n\n if (typeof options.illustrations === 'boolean' || typeof options.illustrations === 'string') {\n parameters.push('Search.Illustrations=' + options.illustrations.toString());\n }\n\n this._isClipart = options.isClipart;\n this._baseUrl = this._isClipart ? AppSettings.clipartUrl : AppSettings.mediaLibraryUrl;\n var url = this._baseUrl;\n if (parameters.length > 0) {\n url = url + '?' + parameters.join('&');\n }\n\n return url;\n };\n\n this.show = function (control, options, onPictureSelected, onDialogClosed) {\n if (!MediaLibrary._lastFilterUrl) {\n this.frameSrc = null;\n }\n\n MediaLibrary.superclass.show.call(this, control, options);\n\n if (MediaLibrary._lastFilterUrl) {\n this.goToUrl(this._baseUrl + MediaLibrary._lastFilterUrl);\n }\n\n if (this._isClipart && options.mediaId) {\n this.goToUrl(this._baseUrl + 'detail/' + options.mediaId);\n }\n\n window.addEventListener('message', this._onMessageApply);\n\n this.showMyDownloads(AppSettings.authorized);\n this._onPictureSelected = onPictureSelected;\n this._onDialogClosed = onDialogClosed;\n };\n\n this.close = function () {\n if (this._onDialogClosed)\n this._onDialogClosed();\n window.removeEventListener('message', this._onMessageApply);\n MediaLibrary.superclass.close.call(this);\n this.$iframe.attr('src', 'about:blank');\n };\n\n this._addToHistory = function (url) {\n MediaLibrary.superclass._addToHistory.call(this, url);\n var u = url.toLowerCase();\n var base = this._baseUrl.toLowerCase();\n if (u.indexOf('/media/index?') !== -1 && u.indexOf(base) === 0) {\n MediaLibrary._lastFilterUrl = u.replace(base, '');\n }\n };\n };\n\n Utils.extend(MediaLibrary, BrowserForm);\n\n BrowserForm.prototype.goToUrl = function (url) {\n this._initHistory();\n this._updateButtonsState();\n this.$iframe.attr('src', url);\n };\n\n BrowserForm.prototype.downloads = function () {\n var url = this.options.isClipart ? AppSettings.clipartLastDownloadsUrl\n : AppSettings.mediaLibraryLastDownloadsUrl;\n this.$iframe.attr('src', url);\n };\n\n\n MediaLibrary.prototype._onMessageApply = function (e) {\n if (typeof e.data !== 'object') {\n return;\n }\n\n if (e.data.key === 'applyimage') {\n var url = e.data.url;\n var action = e.data.button;\n this._applyImage(e.data.mediaId, url, action);\n } else if (e.data.key === 'error') {\n if (e.data.errorCode === CONST.ERROR.AUTH_ERROR) {\n designer.ui.dialog.loginForm.show((function () {\n var currentUrl = this._historyStack[this._historyPointer];\n var ssoUrl = currentUrl.replace('errorCode=' + CONST.ERROR.AUTH_ERROR, 'sso=1');\n if (this._lastAction) {\n ssoUrl = ssoUrl + '&action=' + this._lastAction;\n }\n this.$iframe.attr('src', ssoUrl);\n this._historyProcess = true;\n }).bind(this));\n } else if (e.data.errorCode === CONST.ERROR.SUBSCRIPTION_ERROR ||\n e.data.errorCode === CONST.ERROR.SUBSCRIPTIONS_EXPIRED) {\n SubscriptionDialog.show(e.data.errorCode);\n } else if (e.data.errorCode === CONST.ERROR.PHOTO_SUBSCRIPTION_ERROR) {\n this.close();\n PhotoSubscriptionDialog.show();\n }else if (e.data.errorCode === CONST.ERROR.EMAIL_NOT_CONFIRMED) {\n ConfirmEmailDialog.show(e.data.url);\n }\n }\n };\n\n MediaLibrary.getMediaLibraryOrigin = function () {\n\n var a = window.document.createElement(\"a\");\n a.href = AppSettings.mediaLibraryUrl;\n\n return a.origin;\n };\n\n MediaLibrary.prototype._selectPicture = function (mediaId, url, isCdn) {\n\n if (typeof mediaId === 'string') {\n mediaId = Number(mediaId);\n }\n\n var onProcessed = function (error) {\n this._enableDialog();\n if (ErrorUtility.logWarning(error)) {\n return false;\n }\n this.close();\n return true;\n }.bind(this);\n\n var control = this._targetControl;\n if (control === null) {\n return;\n }\n\n this._onPictureSelected({url:url, isCdn:isCdn, mediaId:mediaId}, onProcessed);\n };\n\n MediaLibrary.prototype._applyImage = function (mediaId, url, action) {\n this._disableDialog();\n this._lastAction = null;\n var requestData = {\n url: url,\n success: (function (result) {\n var url = result.downloadUrl;\n if (url.indexOf('errorCode=') !== -1) {\n this._lastAction = action;\n this.$iframe.attr('src', url);\n this._enableDialog();\n return;\n }\n this._selectPicture(mediaId, url, result.isCdn);\n }).bind(this),\n error: (function () {\n this._enableDialog();\n }).bind(this),\n type: 'GET',\n dataType: 'json',\n xhrFields: {withCredentials: true}\n };\n\n RequestController.request(requestData);\n };\n\n return MediaLibrary;\n})();"
}
}
},
"MessageBox": {
"type": "dir",
"items": {
"MessageBox.css": {
"type": "text",
"content": "#messageBox .dialog{max-width:550px;min-width:100px;padding:50px;padding-top:45px}#messageBox .dialog>*{margin:20px 0;padding:0}#messageBox .dialog>*:first-child{margin-top:0}#messageBox .dialog>*:last-child{margin-bottom:0}#messageBox .dialog-footer{background:0}#messageBox .dialog>#messageBoxButtons{margin-top:30px}#messageBoxTitle,#messageBoxMessage,#messageBoxButtons{font-family:Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;font-weight:400}#messageBoxTitle{font-size:22px}#messageBoxMessage{font-size:16px}#messageBoxFrameId{width:100%;height:150px;margin:0!important}"
},
"MessageBox.htm": {
"type": "text",
"content": "
"
},
"MessageBox.js": {
"type": "text",
"content": "/* global $, designer, l, PubSubController, Channels, LogController, DialogHelper */\n/* exported MessageBox */\n\nvar MessageBox = function () {\n 'use strict';\n\n var _modalCallback = null;\n var _logMessage;\n var _showed = false;\n var _defaultButton = null;\n\n this.$overlay = null;\n this.$dialog = null;\n this.frameContentExist = ko.observable();\n\n this.showUntranslated = function (title, message, buttons, modal, callback, defaultButton, forceButtons, options) { //TODO: refactor, make function (title, message, options, callback)\n _showInternal.call(this, title, message, buttons, callback, defaultButton, forceButtons, options);\n };\n\n this.show = function (title, message, buttons, modal, callback, defaultButton, forceButtons, options) { //TODO: refactor, make function (title, message, options, callback)\n _showInternal.call(this, l(title), l(message), buttons, callback, defaultButton, forceButtons, options);\n };\n\n function _showInternal(title, message, buttons, callback, defaultButton, forceButtons, options) { //TODO: refactor, make function (title, message, options, callback)\n /*jshint validthis:true*/\n\n if (_showed) {\n return; // Always - modal\n }\n\n _logMessage = '[DIALOG] MessageBox showed, title:' + title;\n LogController.time(_logMessage, {isProductionLog: true});\n\n var frameInnerContent = options && options.frameContent;\n this.frameContentExist(!!frameInnerContent);\n\n designer.ui.knockout.renderDialog(this);\n this.$dialog = $('#messageBox');\n\n _modalCallback = callback;\n\n var reBr = /[\\n|\\r]+/g;\n this.$dialog.find('#messageBoxTitle').html(title.replace(reBr, '
'));\n\n var messageBoxMessage = this.$dialog.find('#messageBoxMessage');\n if (message) {\n messageBoxMessage.html($.parseHTML(message.replace(reBr, '
'), null, false));\n messageBoxMessage.show();\n } else {\n messageBoxMessage.hide();\n }\n\n var frame = this.$dialog.find('#messageBoxFrameId');\n if (frameInnerContent) {\n var frameDoc = frame[0].contentDocument;\n frameDoc.open();\n frameDoc.write(frameInnerContent);\n frameDoc.close();\n }\n\n // Buttons\n if (!buttons) {\n buttons = ['OK'];\n }\n _defaultButton = !defaultButton && buttons.length > 0 ? buttons[0] : defaultButton;\n\n var buttonsContainer = this.$dialog.find('#messageBoxButtons');\n buttonsContainer.empty();\n var i;\n for (i = 0; i < buttons.length; i++) {\n var buttonName = buttons[i];\n var buttonCaption = l(buttonName);\n var btn = $('
' + buttonCaption + '');\n btn.css(\"display\", \"inline-block\");\n btn.click(this.btnClick);\n buttonsContainer.append(btn);\n }\n\n if (buttons.length > 1) {\n buttonsContainer.removeClass(\"center\");\n } else {\n buttonsContainer.addClass(\"center\");\n }\n\n if (buttons.length >= 3 || forceButtons) {\n buttonsContainer.find(\".link-button\")\n .removeClass(\"link-button\")\n .addClass(\"other-button\");\n } else {\n buttonsContainer.find(\".other-button\")\n .removeClass(\"other-button\")\n .addClass(\"link-button\");\n }\n\n this.$overlay = DialogHelper.setDialogZIndex(this.$dialog, true);\n\n var defaultBtn = DialogHelper.getDefaultBtn(this.$dialog, _defaultButton);\n if (defaultBtn) {\n $(\"#messageBoxButtons\").prepend(defaultBtn);\n defaultBtn\n .removeClass(\"link-button other-button\")\n .addClass('default-button');\n }\n\n PubSubController.subscribe(Channels.keyEvents.keyUp, this.onKeyUp);\n\n this.$overlay.show();\n this.$dialog.show();\n\n _showed = true;\n }\n\n this.isShown = function () {\n return _showed;\n };\n\n this.hide = function () {\n _showed = false;\n\n PubSubController.unsubscribe(Channels.keyEvents.keyUp, this.onKeyUp);\n\n this.$dialog.hide();\n this.$overlay.remove();\n\n LogController.timeEnd(_logMessage, {isProductionLog: true});\n };\n\n this.btnClick = (function (e) {\n this.hide();\n var btnName = $(this).data('btnname');\n if (!btnName) {\n btnName = $(e.target).data('btnname');\n }\n\n if (_modalCallback) {\n _modalCallback(null /* errors */, btnName);\n }\n }).bind(this);\n\n this.onKeyUp = function (e) {\n if (!_showed) {\n return;\n }\n\n DialogHelper.onKeyUp(this.$dialog, e, false, _defaultButton);\n }.bind(this);\n\n this.guid = window.createGuid();\n};"
}
}
},
"ProgressDialog": {
"type": "dir",
"items": {
"ProgressDialog.css": {
"type": "text",
"content": "#progressDialog .dialog{max-width:600px;min-width:100px;padding:50px;padding-top:45px}#progressDialog .dialog>*{margin:20px 0;padding:0}#progressDialog .dialog>*:first-child{margin-top:0}#progressDialog .dialog>*:last-child{margin-bottom:0}#progressDialog .dialog-footer{background:0}#progressDialogTitle,#progressDialogMessage{font-family:Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;font-weight:300}#progressDialogTitle{font-size:22px}#progressDialogMessage{font-size:16px}"
},
"ProgressDialog.htm": {
"type": "text",
"content": "
"
},
"ProgressDialog.js": {
"type": "text",
"content": "/* global $, designer, l, DialogHelper */\n/* exported ProgressDialog */\n\nvar ProgressDialog = function () {\n 'use strict';\n\n var _showed = false;\n\n this.$overlay = null;\n this.$dialog = null;\n\n this.showUntranslated = function(title, message) {\n _showInternal.call(this, title, message);\n };\n\n this.show = function(title, message, buttons) {\n _showInternal.call(this, l(title), l(message), buttons);\n };\n\n function _showInternal(title, message) {\n /*jshint validthis:true*/\n\n designer.ui.knockout.renderDialog(this);\n this.$dialog = $('#progressDialog');\n\n var reBr = /[\\n|\\r]+/g;\n this.$dialog.find('#progressDialogTitle').html(title.replace(reBr, '
'));\n this.$dialog.find('#progressDialogMessage').html(message.replace(reBr, '
'));\n\n this.$overlay = DialogHelper.setDialogZIndex(this.$dialog, true);\n\n this.$overlay.show();\n this.$dialog.show();\n\n _showed = true;\n }\n\n this.hide = function () {\n\n _showed = false;\n\n this.$dialog.hide();\n this.$overlay.remove();\n\n };\n\n this.guid = window.createGuid();\n};"
}
}
},
"PromptDialog": {
"type": "dir",
"items": {
"PromptDialog.css": {
"type": "text",
"content": "#promptDialog{width:372px;padding:50px;padding-top:45px}#promptDialog>*,#promptDialog .dialog-content>*{margin:20px 0;padding:0}#promptDialog>*:first-child,#promptDialog .dialog-content>*:first-child{margin-top:0}#promptDialog>*:last-child,#promptDialog .dialog-content>*:last-child{margin-bottom:0}#promptDialog .dialog-input-container>*{margin:10px 0}#promptDialog .dialog-input-container>*:first-child{margin-top:0}#promptDialog .dialog-input-container>*:last-child{margin-bottom:0}#promptDialog .dialog-error-container{margin:-15px 0 0}#promptDialog .dialog-error-container+div{margin-top:5px}#promptDialog,#promptDialog input{font-family:Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;font-weight:400}#promptDialog .dialog-header{font-size:22px;font-weight:400!important}#promptDialog,#promptDialog input{font-size:16px}#promptDialog .dialog-error-container{font-size:18px}#promptDialog .prompt-input{padding:10px;width:350px}#promptDialog .prompt-error{color:#ff261c}"
},
"PromptDialog.htm": {
"type": "text",
"content": "
"
},
"PromptDialog.js": {
"type": "text",
"content": "/* global $, ko, l, designer, createGuid, CONST, PubSubController, Channels, LogController, DialogHelper */\n/* exported PromptDialog */\n\nvar PromptDialog = function () {\n 'use strict';\n\n var _showed = false;\n var _logMessage = '';\n\n this.modalCallback = null;\n this.validationCallback = null;\n\n this.okBtn = ko.observable('');\n this.cancelBtn = ko.observable('');\n this.prompt = ko.observable('');\n this.title = ko.observable('');\n\n this.$overlay = null;\n this.$dialog = null;\n this.$promptDialogValue = null;\n this.$promptErrorLabel = null;\n\n this._showInternal = function (defaultValue, callback, validation, customHtml, forceButtons) {\n PubSubController.subscribe(Channels.keyEvents.keyUp, this.onKeyUp);\n\n _logMessage = '[DIALOG] PromptDialog showed, defaultValue:' + defaultValue;\n LogController.time(_logMessage, {isProductionLog: true});\n\n if (!customHtml) {\n customHtml = '';\n }\n\n designer.ui.knockout.renderDialog(this);\n\n this.modalCallback = callback;\n\n this.validationCallback = function (val, successKey, callback) {\n if (typeof validation === \"function\") {\n validation(val, successKey, callback);\n } else {\n callback(null, successKey);\n }\n };\n\n this.hideErrorLabel();\n this.$promptDialogValue.val(defaultValue);\n\n this.$promptDialogValue.on('input', this.onChange);\n\n $('#PromptCustomHtmlContainer').remove();\n if (customHtml !== '') {\n var customHtmlDom =\n $('
');\n\n customHtmlDom\n .find('#PromptCustomHtml')\n .html(customHtml);\n\n customHtmlDom.insertBefore(this.dialogButtonsDiv);\n }\n\n if (forceButtons) {\n $(\"#promptDialog .dialog-buttons .link-button\")\n .removeClass(\"link-button\")\n .addClass(\"other-button\");\n } else {\n $(\"#promptDialog .dialog-buttons .other-button\")\n .removeClass(\"other-button\")\n .addClass(\"link-button\");\n }\n\n this.$overlay = DialogHelper.setDialogZIndex(this.$dialog, true);\n\n this.$overlay.show();\n this.$dialog.show();\n this.$dialog.css('display', 'inline-block');\n\n this.onChange();\n _showed = true;\n };\n\n this.show = function (title, prompt, okBtnKey, cancelBtnKey, defaultValue, callback, validation, customHtml, forceButtons) {\n this.title(l(title));\n this.prompt(l(prompt));\n this.okBtn(l(okBtnKey));\n this.cancelBtn(l(cancelBtnKey));\n\n this._showInternal(defaultValue, callback, validation, customHtml, forceButtons);\n };\n\n this.showUntranslated = function (title, prompt, okBtnText, cancelBtnText, defaultValue, callback, validation, customHtml, forceButtons) {\n this.title(title);\n this.prompt(prompt);\n this.okBtn(okBtnText);\n this.cancelBtn(cancelBtnText);\n\n this._showInternal(defaultValue, callback, validation, customHtml, forceButtons);\n };\n\n this.hide = function () {\n PubSubController.unsubscribe(Channels.keyEvents.keyUp, this.onKeyUp);\n this.hideErrorLabel();\n\n this.$promptDialogValue.off('input', this.onChange);\n this.$dialog.hide();\n\n if (this.$overlay) {\n this.$overlay.remove();\n }\n this.$overlay = null;\n\n _showed = false;\n\n LogController.timeEnd(_logMessage, {isProductionLog: true});\n };\n\n this.ok = function () {\n this.onChange(function () {\n this.hide();\n this.modalCallback(null /* errors */, this.$promptDialogValue.val(), false);\n }.bind(this));\n }.bind(this);\n\n this.cancel = (function () {\n this.hide();\n this.modalCallback(null, null, true /* canceled */);\n }).bind(this);\n\n this.onKeyUp = (function (e) {\n\n if (!_showed) {\n return;\n }\n\n var code = (e.keyCode ? e.keyCode : e.which);\n if (code === CONST.KEY_CODES.ESC) {\n this.cancel();\n } else if (code === CONST.KEY_CODES.ENTER) {\n this.ok();\n }\n }).bind(this);\n\n this.onChange = function (successCallback) {\n var val = this.$promptDialogValue.val();\n var successKey = \"success\";\n this.validationCallback(val, successKey, function (error, validationMessage) {\n if (validationMessage !== successKey) {\n this.$promptErrorLabel.text(validationMessage);\n this.$promptErrorLabel.css('display', '');\n } else {\n this.hideErrorLabel();\n if (typeof successCallback === \"function\") {\n successCallback();\n }\n }\n }.bind(this));\n }.bind(this);\n\n this.hideErrorLabel = function () {\n this.$promptErrorLabel.html(' ');\n this.$promptErrorLabel.css('display', 'none');\n };\n\n this.onDialogBound = function onDialogBound(element) {\n this.$dialog = $(element);\n };\n\n this.onPromptDialogValueBound = function onPromptDialogValueBound(element) {\n this.$promptDialogValue = $(element);\n };\n\n this.onPromptErrorLabelBound = function onPromptErrorLabelBound(element) {\n this.$promptErrorLabel = $(element);\n };\n\n this.guid = createGuid();\n};"
}
}
},
"PropertyWindow": {
"type": "dir",
"items": {
"Lists": {
"type": "dir",
"items": {
"StylingCategories.json": {
"type": "text",
"content": "[{\"items\":[{\"name\":\"Text\",\"caption\":\"Text\"},{\"name\":\"Headings\",\"caption\":\"Headings\"},{\"name\":\"BulletList\",\"caption\":\"Bullet List\"},{\"name\":\"OrderedList\",\"caption\":\"Ordered List\"},{\"name\":\"blockquotes\",\"caption\":\"Quote\"}],\"class\":\"group-typography\",\"group\":\"group-typography\",\"caption\":\"Typography\",\"icon\":\"UIIcons/TypeCategoryIcons/icon-text.png\"},{\"items\":[{\"name\":\"Button\",\"caption\":\"Button\",\"inLine\":true},{\"name\":\"Image\",\"caption\":\"Image\",\"inLine\":true},{\"name\":\"Label\",\"caption\":\"Label\",\"inLine\":true},{\"name\":\"inputs\",\"caption\":\"Input\",\"inLine\":true},{\"name\":\"Table\",\"caption\":\"Table\",\"inLine\":true},{\"name\":\"Accordion\",\"caption\":\"Accordion\",\"inLine\":true}],\"class\":\"group-forms\",\"group\":\"group-forms\",\"caption\":\"Forms\",\"icon\":\"UIIcons/TypeCategoryIcons/icon-input.png\"},{\"items\":[{\"name\":\"Block\",\"caption\":\"Block\",\"inLine\":true},{\"name\":\"HorizontalMenu\",\"caption\":\"Horizontal Menu\",\"inLine\":true},{\"name\":\"VerticalMenu\",\"caption\":\"Vertical Menu\",\"inLine\":true}],\"class\":\"group-block\",\"group\":\"group-block\",\"caption\":\"Widgets\",\"icon\":\"UIIcons/TypeCategoryIcons/icon-block.png\"},{\"items\":[{\"name\":\"Carousel\",\"caption\":\"Carousel\",\"inline\":true},{\"name\":\"Indicators\",\"caption\":\"Indicators\",\"inline\":true},{\"name\":\"Pagination\",\"caption\":\"Pagination\",\"inline\":true}],\"class\":\"group-slider\",\"group\":\"group-slider\",\"caption\":\"Navigation\",\"icon\":\"UIIcons/TypeCategoryIcons/icon-slider.png\"},{\"items\":[{\"name\":\"Rating\",\"caption\":\"Rating\",\"inLine\":true},{\"name\":\"ProductNewIcon\",\"caption\":\"New\",\"inLine\":true},{\"name\":\"ProductSaleIcon\",\"caption\":\"Sale\",\"inLine\":true},{\"name\":\"ProductReducedPriceIcon\",\"caption\":\"Reduced Price\",\"inLine\":true},{\"name\":\"ProductOutOfStockIcon\",\"caption\":\"Out Of Stock\",\"inLine\":true}],\"class\":\"group-product-icons\",\"group\":\"group-product-icons\",\"caption\":\"Shop Icons\",\"icon\":\"UIIcons/TypeCategoryIcons/icon-ecommerce.png\"},{\"items\":[{\"name\":\"WarningMessage\",\"caption\":\"Warning\",\"inLine\":true},{\"name\":\"ErrorMessage\",\"caption\":\"Error\",\"inLine\":true},{\"name\":\"InfoMessage\",\"caption\":\"Information\",\"inLine\":true},{\"name\":\"SuccessMessage\",\"caption\":\"Success\",\"inLine\":true}],\"class\":\"group-alerts\",\"group\":\"group-alerts\",\"caption\":\"Alerts\",\"icon\":\"UIIcons/TypeCategoryIcons/icon-alerts.png\"}]"
}
}
},
"products-preset.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAAFAAAABACAIAAAACpWdhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNjgwMkZBN0IyQjVFNDExOTE5RTlDQTBGQ0RERTdGOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4MTlCMDkzMEI1QkYxMUU0QjM1MTg2NDcxQjAwMkI2NSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4MTlCMDkyRkI1QkYxMUU0QjM1MTg2NDcxQjAwMkI2NSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkY3ODAyRkE3QjJCNUU0MTE5MTlFOUNBMEZDRERFN0Y5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY2ODAyRkE3QjJCNUU0MTE5MTlFOUNBMEZDRERFN0Y5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+IpBV2wAAAylJREFUeNrsW91OGkEUdpcNXiigQWBxtbGJ4YJaG3unNBH6CPgoylOAj1IfoXpRTGq0VqummCqGlL8ixqCGoET61UlXVLrSgVHCnpPNOuOM851vzt9ARikWi/WYSeQek4nCfszPz3c91cXFRTNamAgT4e5MWvfk4/Jyd9B7Hwo1Rbjh1DYKNvSV3y+a7e7eHrk0ETZp0npUzs/P0+n0cbGoKMqIpnk8nnw+/zOdvrq6GhgY0IaHBwcHW9Ts4uIil8sVT04A4VVVl8tVKBSyuRwgHA4HfoP3ExFOpVI/Dg5Yu1KpJPb38eijv27kJWRsjJstdjN5dMTal5eXB4eHePTR4xt5ARkdFU44k8kwtuPj4x63G6be2t5mQ28mJ202G1T5nkgkk0mLxcKhEASGZWyxaa6hIZhaz7fI7f39/cViETpg3wEBbxJLGHuP99upKbvdLkmS0+kMzs6WSiVQBXytVoN7Q6f1jQ3M5CaM9+uJCawJCETHzPT02dkZlmUQcO++vj5sdDabFU5Y0zQY8MvmJuuGgkFZlhG3aEOV5ZWV+pl8/qyqKgz4bWeHdQMzM4BgEQuI+OqqPtPr9QrP0tCmvosYbtiGjPASdrvd9V3EcMP2H8J3lRFiYWw2fPj09PTr1ha61WpVH9LbzOExk7NUyjJ8GGGys7vLlu3t7b0HwRyeA0LmU+i2JEjS7cDfNp8q9yCwiAEE4pkPwiwHj3K5TCctLpHq4koSo2J7IVol/HltTbRN9BL4nBbGAcDv9+NogfOAnjyur6+RaVB+Mdq6ZljE5/PhEILDXD0E0hVKIzcEv4VVjwePUNu6XS489PGQCBNhIsyVtD4sLfFhzIXDzU/+FI/zobwLBNpM+L/05pYm9SaXJsJ3pVarmYuwoijmImy1WimGibAZDx4LCwvtxXt4SyoajbYXIhKJkIWJMBEmwkS4O8vSE9y1Na4iZGFhFhZ9N63hJapnIyz0VholLSL89C79ry8o58JhgyHjP+z0pPVQRZ2MwdCjo+TSRJgIE2ExScsg0xgnoY5KUc0SNqgixgWmc8oPubTJY5j9Xx5ZuAvltwADALpZOM5DdbkNAAAAAElFTkSuQmCC"
},
"PropertyWindow.css": {
"type": "text",
"content": ".pw-left{background-color:#737373;float:left;font:11px Arial,Helvetica,sans-serif;height:100%;width:67px}.pw-tabs,.pw-tabs *{box-sizing:border-box;display:block;float:none}.pw-tabs{overflow:hidden}.pw-tabs,.pw-tabs .pw-button,.pw-tabs .pw-button *{width:100%}.pw-tabs .hover-bg-rounded{border-top-right-radius:0;border-bottom-right-radius:0}.pw-tabs .pw-button{border-radius:0;overflow:hidden;padding:5px;text-align:center}.pw-tabs .pw-label{padding:0}.pw-tabs .pw-label-caption{color:#fff;line-height:100%;margin-top:.35em;font-family:Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;font-size:10px;letter-spacing:.035em}.pw-tabs .hover-bg-rounded:hover,.pw-tabs .checked-bg{background-color:#fff!important;position:relative}.pw-tabs .hover-bg-rounded:hover:before,.pw-tabs .checked-bg:before{background:#F5A932;bottom:0;content:'';left:0;position:absolute;top:0;width:4px}.pw-tabs .hover-bg-rounded:hover:before{background:#ffc466}.pw-tabs .hover-bg-rounded:hover .pw-label-caption,.pw-tabs .checked-bg .pw-label-caption{color:#222}.pw-tabs .pw-label-image{background-size:contain;height:32px;margin:0 auto!important;width:32px}@media screen and (max-height:925px){.pw-left{font-size:10px}.pw-tabs .pw-button{padding:4px}.pw-tabs .pw-label-image{height:26px;width:26px}}@media screen and (max-height:800px){.pw-left{font-size:10px}.pw-tabs .pw-button{padding:3px}.pw-tabs .pw-label-image{height:22px;width:22px}.pw-tabs .pw-label-caption{margin-top:.2em}}@media screen and (max-height:700px){.pw-left{font-size:10px}.pw-tabs .pw-button{padding:3px}.pw-tabs .pw-label-image{height:22px;width:22px}.pw-tabs .pw-label-caption{margin-top:.2em}}@media screen and (max-height:600px){.pw-tabs .pw-label-image{height:26px;width:26px}.pw-tabs .pw-label-caption{display:none!important}}@media screen and (max-height:500px){.pw-tabs .pw-label-image{height:22px;width:22px}.pw-tabs .pw-label-caption{display:none!important}}.ui-button .ui-icon.advanced-icon{left:.4em;width:16px;height:16px;background-image:url({images}advanced.png)}.ui-button.ui-state-hover .ui-icon.advanced-icon{background-image:url({images}advanced.png)}button.ui-button .ui-icon.custom-ico{width:0;height:0;background-image:url('')}.ui-input{width:55px;height:20px}.pw-close-button{position:absolute;cursor:pointer;top:290px;left:245px;z-index:999;width:11px;height:45px;background:#fafafa;-webkit-box-shadow:2px 0 4px rgba(0,0,0,0.2);box-shadow:2px 0 4px rgba(0,0,0,0.2);background-image:url({images}UIIcons/close-btn.png);background-position:center center;background-repeat:no-repeat}.pw-close-button.hide{left:0}.pw-close-button.hide>.left{border:1px solid #c3c3c3;border-right:transparent}.pw-close-button .left{float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;width:5px;height:100%;border:1px solid transparent}.pw-close-button .right{float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;width:6px;height:100%;border:1px solid #c3c3c3;border-left:transparent}.pw-savePreset-link{margin:0;width:100%;height:40px;color:#61aaf3;vertical-align:middle;text-align:left;text-decoration:none;font-size:13px;line-height:40px}.pw-savePreset-link:before{display:block;float:left;width:20px;height:36px;background:url({images}save-preset.png) center no-repeat;content:''}.pw-gallery-loader-wrapper{position:absolute;top:0;left:0;width:100%;background:url({images}ajax-loader.gif) center center no-repeat}.pw-link{color:#61aaf3;text-decoration:none;font-size:13px}.pw-icon-control{width:26px;height:26px;background:no-repeat center;position:relative;margin-top:1px;margin-left:8px;float:left;display:block}.noicon{opacity:.5}.disable-hover,.disable-hover *{pointer-events:none!important}.main-form-status{background-color:#e2f0fc;border-radius:3px;font:12px Arial,Helvetica,sans-serif;position:absolute;left:231px;top:5px;z-index:1}.main-form-status .pw-controls-row{margin:0!important}"
}
}
},
"RightClickMenu": {
"type": "dir",
"items": {
"RightClickMenu.css": {
"type": "text",
"content": ".RightClickMenu{position:absolute;z-index:9998;background:#fff;min-width:200px;border:1px solid #c3c3c3;box-shadow:0 0 2px rgba(0,0,0,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;padding:1px}.RightClickMenu .pw-label-arrow.right:after{border-top-color:transparent;border-left-color:#858585;margin-top:11px;left:2px}"
},
"RightClickMenu.htm": {
"type": "text",
"content": "\n"
},
"RightClickMenu.js": {
"type": "text",
"content": "/* export RightClickMenu */\n/* global PWStackHelper, editor, PubSubController, Channels, UIHelper */\nfunction RightClickMenu() {\n 'use strict';\n this.cmItem = ko.observable();\n this.visible = ko.observable(false);\n this.hideHandler = this.hide.bind(this);\n PubSubController.subscribe(Channels.previewEvents.scroll, this.hideHandler);\n PubSubController.subscribe(Channels.rightClickMenu.hide, this.hideHandler);\n}\n\nRightClickMenu.prototype.onRightClickMenuBound = function (element) {\n 'use strict';\n this.$window = $(element);\n};\n\nRightClickMenu.prototype.move = function (position) {\n 'use strict';\n this.$window.css('left', position.left);\n this.$window.css('right', position.right);\n this.$window.css('top', position.top);\n};\n\nRightClickMenu.prototype.show = function (data) {\n 'use strict';\n var frameBB = UIHelper.getBoundingBox(editor.previewController.$currentFrame);\n this.move({\n left: data.event.clientX + frameBB.left,\n top: data.event.clientY + frameBB.top\n });\n this.cmItem(PWStackHelper.getItem('RightClickMenu', data.control, {}));\n this.visible(true);\n};\n\nRightClickMenu.prototype.hide = function () {\n 'use strict';\n this.cmItem(undefined);\n this.visible(false);\n};\n\nRightClickMenu.prototype.dispose = function () {\n 'use strict';\n PubSubController.unsubscribe(Channels.previewEvents.scroll, this.hideHandler);\n PubSubController.unsubscribe(Channels.rightClickMenu.hide, this.hideHandler);\n};\n"
}
}
},
"SaveForm": {
"type": "dir",
"items": {
"SaveForm.css": {
"type": "text",
"content": ".dialog.saveform{display:block;width:337px;height:166px;position:absolute;top:50%;left:50%;margin-left:-50px;margin-top:-50px;padding:5px;z-index:9999}.overlay{display:none;background:#aaa;opacity:.7;position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000}.dialog-content.save-dlg-content{padding:15px}.with-position{position:absolute;right:22px;bottom:17px}"
},
"SaveForm.htm": {
"type": "text",
"content": "
"
},
"SaveForm.js": {
"type": "text",
"content": "/* global $, designer */\n/*exported SaveForm */\n\nvar SaveForm = function (data) {\n 'use strict';\n var self = this;\n self.dontSaveCpt = \"Don't save\";\n\n self.hide = function (o, e) {\n self.$form.fadeOut(200);\n self.$overlay.fadeOut(200);\n if (e !== undefined)\n e.preventDefault();\n };\n\n self.show = function () {\n designer.ui.knockout.renderDialog(this);\n self.$form.fadeIn(200, function () {\n var leftMargin = -(parseInt(self.$form.outerWidth() / 2, 10));\n var topMargin = -(parseInt(self.$form.outerHeight() / 2, 10));\n self.$form.css(\"margin-left\", leftMargin);\n self.$form.css(\"margin-top\", topMargin);\n });\n\n self.$overlay.fadeIn(200);\n };\n\n self.onSaveClick = function () {\n self.hide();\n data.save();\n };\n\n self.onDontSaveClick = function () {\n self.hide();\n data.dontSave();\n };\n\n self.onCancelClick = function () {\n self.hide();\n };\n\n self.saveFormBinded = function (element) {\n self.$form = $(element);\n };\n\n self.overlayBinded = function (element) {\n self.$overlay = $(element);\n };\n};"
}
}
},
"SectionPresetsDialog": {
"type": "dir",
"items": {
"SectionPresetsDialog.css": {
"type": "text",
"content": ".dialog.sectionpresets{display:none;position:absolute;top:4%;left:2%;width:95%;height:92%;min-width:600px;min-height:400px;padding:5px;z-index:10002}.dialog.sectionpresets .dialog-button{display:none;margin-left:5px}.dialog.sectionpresets .dialog-button:first-child{margin-left:0}.sectionpresets-header{width:100%;height:25px}.sectionpresets-frame{top:25px;left:0;width:100%;height:calc(100% - 40px)}.sectionpresets-iframe{width:100%;height:100%;border:0;background:#fff url({images}loader_bar.gif) center center no-repeat}.dialog.sectionpresets .dialog-header{padding-bottom:20px}.sectionpresets-next,.sectionpresets-back,.sectionpresets-home,.sectionpresets-pipe{color:#808080!important;display:inline-block;font-size:14px;font-weight:normal;line-height:28px;padding:0 5px;text-decoration:none!important}.sectionpresets-next{background:url({images}UIIcons/forward-bw-16.png) right center no-repeat;padding-right:20px}.sectionpresets-back{background:url({images}UIIcons/back-bw-16.png) left center no-repeat;padding-left:20px}.sectionpresets-home{background:url({images}UIIcons/icon-home-16.png) left center no-repeat;padding-left:20px}.sectionpresets-logo{color:#808080!important;background:#fff url({images}logo_small.png) right center no-repeat;display:block;height:20px;position:absolute;right:50px;top:12px;padding-right:118px;background-size:contain}.sectionpresets-close{background:#fff url({images}UIIcons/close-window.png) center center no-repeat;display:block;height:24px;position:absolute;right:10px;top:10px;width:24px}"
},
"SectionPresetsDialog.htm": {
"type": "text",
"content": "
"
},
"SectionPresetsDialog.js": {
"type": "text",
"content": "/* global AppSettings, Utils, BrowserForm, CONST, designer, SubscriptionDialog, ConfirmEmailDialog, PresetHelper,\n RequestController, ViewProvider, PWStackHelper, PubSubController, Channels, ManifestController */\n/* exported Themes */\n\nvar SectionPresetsDialog = (function () {\n 'use strict';\n\n SectionPresetsDialog = function () {\n\n SectionPresetsDialog.superclass.constructor.call(this);\n\n this.homeUrl = AppSettings.themesStockUrl;\n this._onMessageApply = this._onMessageApply.bind(this);\n this._baseUrl = null;\n this._onSelectSection = null;\n SectionPresetsDialog._lastFilterUrls = {};\n\n this.buttonsViewItem = ko.observable();\n this.backHandler = this.back.bind(this);\n this.homeHandler = this.home.bind(this);\n this.closeHandler = this.close.bind(this);\n\n this.getCurrentBaseUrl = function (control) {\n\t\t\tvar manifestId = ManifestController.getManifestVersion();\n\t\t\tif (!manifestId)\n\t\t\t\treturn AppSettings.sectionUrl + PresetHelper.getSectionPresetCategory(control) + '/';\n\t\t\t\n return AppSettings.sectionUrl + 'v' + ManifestController.getManifestVersion() +\n '/' + PresetHelper.getSectionPresetCategory(control) + '/';\n };\n\n this._buildUrl = function () {\n this._baseUrl = this.getCurrentBaseUrl(this._targetControl);\n return this._addUrlBaseParams(this._baseUrl);\n };\n\n this._addToHistory = function (url) {\n SectionPresetsDialog.superclass._addToHistory.call(this, url);\n var lowerUrl = url.toLowerCase();\n if (url.indexOf(this._baseUrl) === 0 && lowerUrl.indexOf('/detail/') === -1) {\n SectionPresetsDialog._lastFilterUrls[this._baseUrl] = url.replace(this._baseUrl, '');\n }\n };\n\n this.show = function (control, options, onSectionSelected, onDialogClosed) {\n var viewName;\n\n if (options.changeSection) {\n viewName = 'MediaDialogButtonsChange';\n } else {\n viewName = 'MediaDialogButtons';\n }\n\n if (!SectionPresetsDialog._lastFilterUrls[this._baseUrl] || this._baseUrl !== this.getCurrentBaseUrl(control)) {\n this.frameSrc = null;\n }\n\n ViewProvider.whenReady(function () {\n this.buttonsViewItem(PWStackHelper.getItem(viewName, control, {isSection: true}));\n }.bind(this));\n\n SectionPresetsDialog.superclass.show.call(this, control, options); //this._baseUrl can change\n\n PubSubController.subscribe(Channels.sectionDialog.back, this.backHandler);\n PubSubController.subscribe(Channels.sectionDialog.home, this.homeHandler);\n PubSubController.subscribe(Channels.previewEvents.changedOrLoaded, this.closeHandler);\n\n if (SectionPresetsDialog._lastFilterUrls[this._baseUrl]) {\n var url = this._baseUrl + SectionPresetsDialog._lastFilterUrls[this._baseUrl];\n url = this._addUrlBaseParams(url);\n this.goToUrl(url);\n }\n\n window.addEventListener('message', this._onMessageApply);\n this._onSelectSection = onSectionSelected;\n this._onDialogClosed = onDialogClosed;\n };\n\n\n this.close = function () {\n if (typeof this._onDialogClosed === \"function\")\n this._onDialogClosed();\n window.removeEventListener('message', this._onMessageApply);\n SectionPresetsDialog.superclass.close.call(this);\n this.buttonsViewItem(null);\n PubSubController.unsubscribe(Channels.sectionDialog.back, this.backHandler);\n PubSubController.unsubscribe(Channels.sectionDialog.home, this.homeHandler);\n PubSubController.unsubscribe(Channels.previewEvents.changedOrLoaded, this.closeHandler);\n this.$iframe.attr('src', 'about:blank');\n };\n };\n\n Utils.extend(SectionPresetsDialog, BrowserForm);\n\n SectionPresetsDialog.prototype.goToUrl = function (url) {\n this._initHistory();\n this._updateButtonsState();\n this.$iframe.attr('src', url);\n };\n\n SectionPresetsDialog.prototype._onMessageApply = function (e) {\n if (typeof e.data !== 'object') {\n return;\n }\n\n if (e.data.key === 'addsection') {\n var url = e.data.url;\n if (url.indexOf('/') === 0)\n url = AppSettings.themesStockUrl + url;\n\n this._processAddSection(e.data.mediaId, url, e.data.type);\n } else if (e.data.key === 'error') {\n if (e.data.errorCode === CONST.ERROR.AUTH_ERROR) {\n designer.ui.dialog.loginForm.show((function () {\n var currentUrl = this._historyStack[this._historyPointer];\n\n var ssoUrl = currentUrl;\n var errorCodeParam = 'errorCode=' + CONST.ERROR.AUTH_ERROR;\n if (ssoUrl.indexOf(errorCodeParam) >= 0)\n ssoUrl = currentUrl.replace(errorCodeParam, '');\n\n ssoUrl = this._addUrlBaseParams(ssoUrl);\n\n this.$iframe.attr('src', ssoUrl);\n this._historyProcess = true;\n }).bind(this));\n } else if (e.data.errorCode === CONST.ERROR.SUBSCRIPTION_ERROR ||\n e.data.errorCode === CONST.ERROR.SUBSCRIPTIONS_EXPIRED) {\n SubscriptionDialog.show(e.data.errorCode);\n } else if (e.data.errorCode === CONST.ERROR.EMAIL_NOT_CONFIRMED) {\n ConfirmEmailDialog.show(e.data.url);\n }\n }\n };\n\n SectionPresetsDialog.prototype._processAddSection = function (mediaId, url, subType) {\n this._disableDialog();\n\n var requestData = {\n url: url,\n success: (function (result) {\n var url = result.downloadUrl;\n if (url.indexOf('errorCode=') !== -1) {\n this.$iframe.attr('src', url);\n this._enableDialog();\n return;\n }\n if (this._onSelectSection) this._onSelectSection({url: url, mediaId: mediaId, subType: subType});\n this.close();\n }).bind(this),\n error: (function () {\n this._enableDialog();\n }).bind(this),\n type: 'GET',\n dataType: 'json',\n xhrFields: {withCredentials: true}\n };\n\n RequestController.request(requestData);\n };\n\n return SectionPresetsDialog;\n})();"
}
}
},
"StartDialog": {
"type": "dir",
"items": {
"StartDialog.css": {
"type": "text",
"content": "#startDialog{bottom:0;height:auto;left:0;overflow:auto;right:0;top:0;width:auto}#startDialog .for-cms{position:absolute;left:253px;top:45px;font-size:15px}#startDialog .back-to-cms{position:absolute;left:400px;top:40px;padding:0 5px;color:#333}#startDialog .dialog{font-family:Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;font-weight:400;bottom:50px;left:50px;min-height:480px;min-width:840px;position:absolute;right:50px;top:50px}.start-dialog-top,.start-dialog-left,.start-dialog-right,.start-dialog-top-right,.open-in-themler{position:absolute}.start-dialog-top{border-bottom:1px solid #428bca;height:100px;left:0;right:0;top:0}.start-dialog-right{bottom:0;right:0;top:101px;width:300px}.start-dialog-top-right,.open-in-themler{background:#fff;z-index:100}.start-dialog-top-right{right:320px;left:235px;top:120px}.open-in-themler{left:27px;top:112px;width:200px}.start-dialog-left{bottom:15px;right:315px;left:15px;top:115px}.start-dialog-left .list-box-item{cursor:pointer;background:#fff}.start-dialog-left .list-box-item-template{height:100%;box-sizing:border-box}.start-dialog-left .list-box-item-template .template-icon{box-sizing:border-box;width:100%;height:100%;background-size:100% auto;position:relative}.start-dialog-left .list-box-item-template .template-icon .template-active-sign{background:rgba(255,255,255,0.9);border-radius:50%;position:absolute;right:4px;top:4px;padding:5px}.start-dialog-left .list-box-item .list-box-item-caption{text-align:center;position:absolute;bottom:10px;margin:0;left:10px;width:auto;right:10px;font-size:larger;padding:7px 0;color:#575757;font-family:Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;background-color:rgba(255,255,255,0.9)}.start-dialog-tabs{bottom:0;display:none;position:absolute;left:350px}.start-dialog-tabs.visible{display:block}.start-dialog-tabs a,.start-dialog-tabs img,.start-dialog-tabs span{display:block}.start-dialog-tabs a{border-bottom:7px solid transparent;box-sizing:border-box;color:#555!important;float:left;font-size:11px;font-family:Arial,'Helvetica Neue',Tahoma,Verdana,sans-serif;padding:5px 10px;text-align:center;text-decoration:none!important}.start-dialog-tabs a:hover{border-bottom-color:#64a6df}.start-dialog-tabs a.active,.start-dialog-tabs a.active:hover{border-bottom-color:#428bca}.start-dialog-tabs img{margin:0 auto;width:55px}.start-dialog-tab-content{display:none}.start-dialog-tab-content.active{display:block}.start-dialog-row{display:block;margin:20px}.start-dialog-button .pw-button{text-align:center;border-radius:8px;background:#5ca1e6;display:inline-block;font-weight:bold;font-size:14px;padding:10px 30px}.start-dialog-button .pw-button.hover-bg-rounded:hover:not(.disabled){background-color:#428bca!important}.start-dialog-button .pw-button .pw-label{color:#fff!important}.start-dialog-button .pw-button.hover-bg-rounded.disabled{background-color:rgba(92,161,230,0.5)!important}.start-dialog-recent{color:#7f7f7f;text-align:left}.start-dialog-recent h2{font-size:14px;font-weight:bold;margin:0}#startDialog .start-dialog-left{max-height:100%;overflow:auto}#startDialog .start-dialog-left .one-col-item{margin:10px}#startDialog .start-dialog-left .list-box-item{white-space:normal}#startDialog .start-dialog-left .list-box-item .list-box-item-icon{padding:10px;width:100%}#startDialog .start-dialog-left .list-box-item .list-box-item-icon+.list-box-item-caption{line-height:1.4!important}#startDialog .start-dialog-left .pw-controls{float:left}#startDialog .start-dialog-left .list-box-gallery .one-col-item{float:left}#startDialog .start-dialog-left .gray-scrollbar{height:auto!important}#startDialog .start-dialog-left .UIGallery{border-width:0}#start-dialog-close{background:no-repeat center center url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTYwRkFDOEI5RTIyMTFFM0JDNjRENEM5MkQwNjRFODgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTYwRkFDOEM5RTIyMTFFM0JDNjRENEM5MkQwNjRFODgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBNjBGQUM4OTlFMjIxMUUzQkM2NEQ0QzkyRDA2NEU4OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBNjBGQUM4QTlFMjIxMUUzQkM2NEQ0QzkyRDA2NEU4OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Poe7Sp4AAAEuSURBVHjapJNNTsJQFIXbhkDSoctgBQwcECKJQkdMSKxMGDFyCSRugTX4E2MimsboHFyKG7AM1Xpu/WpeXigMeMnH7b3vntNHc19YFEVwyAqzLLN4I07FhXjd0X8mrsWbSJMkCSI9GCNxJJY01YmX9I3QlT8/Yiq+RUs8iYEnHlBv0TdF9+eidScmbDZ505C9IXmT/Qn9gWtQmaSOyaO4Ilbi1BXbanhHvedot4jm1L/EuXjwP0y05WNZ08yrzbaJ6wxiMfZqY+p7DazpWfTJP4l96vEuA9u0qTohfxdtYkA9800iR/wieuRrBueDuKbeoy/2DWxIuo7YBicnz8krky79/wah6JCveGPu/dWc+oq8g66cA7uOiTgWC7GpuQsbTnLJacprHB56nX8FGAAbiUarj0/0sgAAAABJRU5ErkJggg==');border-radius:4px;display:block;height:24px;right:10px;position:absolute;top:10px;width:24px;z-index:99999}#start-dialog-close:hover{background-color:#e2f0fc}"
},
"StartDialog.htm": {
"type": "text",
"content": "
\n
\n
\n
\n
\n
\n
RECENT THEMES
\n \n
\n \n
\n
\n
\n
joomla
\n
drupal
\n
woocommerce
\n
virtuemart
\n
magento
\n
prestashop
\n
\n \n
\n \n \n
\n \n
\n
"
},
"StartDialog.js": {
"type": "text",
"content": "/* global $, ko, PWStackHelper, designer, CONST, PubSubController, Channels, AppStorage, ViewProvider, ImageController, _$,\n AppSettings, ErrorUtility, RequestController, DataProviderFacade, DialogHelper */\n/* exported StartDialog */\n\nvar StartDialog = function () {\n 'use strict';\n\n this.cms = ko.observable('wordpress');\n\n this.recentProjects = ko.observable();\n this.projectsList = ko.observable();\n this.themeButtonsLeft = ko.observable();\n this.themeButtonsRight = ko.observable();\n this.createButtonView = ko.observable();\n this.themlerDirectory = ko.observable('');\n this.logoUrl = \"url('\" + ImageController.getIconUrl(\"logo_small.png\") + \"') 50px center no-repeat\";\n this.themlerStartup = location.pathname.substr(0, location.pathname.indexOf('/', 1)) + \"/startup\";\n\n var _modalCallback = null;\n var _showed = false;\n\n this.$overlay = null;\n this.$dialog = null;\n\n this.init = function () {\n var appStorageControl = _$(new AppStorage(), '');\n\n ViewProvider.whenReady(function () {\n this.recentProjects(PWStackHelper.getItem(\"RecentProjectsView\", appStorageControl, {}));\n this.projectsList(PWStackHelper.getItem(\"ProjectsListView\", appStorageControl, {}));\n this.themeButtonsLeft(PWStackHelper.getItem(\"ThemeButtonsLeft\", appStorageControl, {}));\n this.themeButtonsRight(PWStackHelper.getItem(\"ThemeButtonsRight\", appStorageControl, {}));\n if (location.href.indexOf('startup=true') !== -1)\n this.createButtonView(PWStackHelper.getItem(\"CreateButtonView\", appStorageControl, {}));\n }.bind(this));\n\n if (AppSettings.isDesktop) {\n var selfUrl = window.location.href;\n var themlerFolder = selfUrl.match(/\\/themler_\\d+\\//i);\n var cmsName = DataProviderFacade.realCmsName().toLowerCase();\n if (themlerFolder && themlerFolder.length > 0) {\n var url = themlerFolder + 'startup/api.php?cms=' + cmsName;\n var requestData = {\n url: url,\n success: function (json) {\n if (json.themlerDirectory) {\n this.themlerDirectory(json.themlerDirectory);\n }\n }.bind(this),\n type: 'GET',\n contentType: 'application/json',\n dataType: 'json',\n error: function (error) {\n ErrorUtility.logError(error);\n }\n };\n RequestController.request(requestData, true);\n }\n }\n\n };\n\n this.getCmsName = function () {\n var name = DataProviderFacade.realCmsName();\n if (name === 'Html')\n name = 'HTML';\n return name;\n };\n\n this.show = function (checkThemes) {\n var publishDialogClosed = function publishDialogClosed() {\n PubSubController.publish(Channels.themesDialog.closed);\n };\n DataProviderFacade.reloadThemesInfo(function (error, data) {\n var themes,\n keys\n ;\n if (error) {\n ErrorUtility.logWarning(error);\n publishDialogClosed();\n return;\n }\n if (data) {\n themes = JSON.parse(data).themes;\n if (!themes) {\n publishDialogClosed();\n return;\n }\n keys = Object.keys(themes);\n if (checkThemes && keys.length === 1) {\n publishDialogClosed();\n } else {\n this.init();\n\n /*jshint validthis:true*/\n var title, message, callback;\n title = \"hello\";\n message = \"world\";\n\n if (_showed) {\n return; // Always - modal\n }\n\n designer.ui.knockout.renderDialog(this);\n this.$dialog = $('#startDialog');\n\n _modalCallback = callback;\n\n var reBr = /[\\n|\\r]+/g;\n this.$dialog.find('#startDialogTitle').html(title.replace(reBr, '
'));\n\n var startDialogMessage = this.$dialog.find('#startDialogMessage');\n if (message) {\n startDialogMessage.html(message.replace(reBr, '
'));\n startDialogMessage.show();\n } else {\n startDialogMessage.hide();\n }\n\n this.$overlay = DialogHelper.setDialogZIndex(this.$dialog, true);\n\n this.$overlay.on('click', function () {\n this.hide();\n }.bind(this));\n\n PubSubController.subscribe(Channels.keyEvents.keyUp, this.onKeyUp);\n\n this.$dialog.on('click', '#start-dialog-close', function (e) {\n this.hide();\n e.preventDefault();\n }.bind(this));\n\n this.$overlay.show();\n this.$dialog.show();\n\n _showed = true;\n }\n } else {\n publishDialogClosed();\n }\n }.bind(this));\n };\n\n this.isShown = function () {\n return _showed;\n };\n\n this.hide = function () {\n _showed = false;\n\n PubSubController.unsubscribe(Channels.keyEvents.keyUp, this.onKeyUp);\n\n this.$dialog.hide();\n\n this.$dialog.off('click');\n\n this.recentProjects(null);\n this.projectsList(null);\n this.themeButtonsLeft(null);\n this.themeButtonsRight(null);\n this.createButtonView(null);\n\n this.$overlay.off('click');\n this.$overlay.remove();\n\n PubSubController.publish(Channels.themesDialog.closed);\n };\n\n this.onKeyUp = (function (e) {\n if ($(document.activeElement).closest('.active-element').length > 0) {\n // It's focused in PWButton.click()\n $(document.activeElement).blur();\n return;\n }\n\n if (!_showed) {\n return;\n }\n\n var code = e.keyCode ?\n e.keyCode :\n e.which;\n\n if (code === CONST.KEY_CODES.ESC) {\n this.hide();\n }\n\n e.preventDefault();\n }).bind(this);\n\n this.guid = window.createGuid();\n};"
}
}
},
"Themes": {
"type": "dir",
"items": {
"Themes.css": {
"type": "text",
"content": ".dialog.themes{display:none;position:absolute;top:4%;left:2%;width:95%;height:92%;min-width:600px;min-height:400px;padding:5px;z-index:10002}.dialog.themes .dialog-button{display:none;margin-left:5px}.dialog.themes .dialog-button:first-child{margin-left:0}.themes-header{width:100%;height:25px;padding:5px;padding-left:10px}.themes-frame{top:25px;left:0;width:100%;height:calc(100% - 40px)}.themes-iframe{width:100%;height:100%;border:0;background:#fff url({images}loader_bar.gif) center center no-repeat}.dialog.themes .dialog-header{padding-bottom:20px}.themes-next,.themes-back,.themes-home,.themes-pipe{color:#808080!important;display:inline-block;font-size:14px;font-weight:normal;line-height:28px;padding:0 5px;text-decoration:none!important}.themes-next{background:url({images}UIIcons/forward-bw-16.png) right center no-repeat;padding-right:20px}.themes-back{background:url({images}UIIcons/back-bw-16.png) left center no-repeat;padding-left:20px}.themes-home{background:url({images}UIIcons/icon-home-16.png) left center no-repeat;padding-left:20px}.themes-logo{color:#808080!important;background:#fff url({images}MainForm/billion-themes-poweredby.png) right center no-repeat;display:block;height:20px;position:absolute;right:50px;top:12px;padding-right:103px}.themes-close{background:#fff url({images}UIIcons/close-window.png) center center no-repeat;display:block;height:24px;position:absolute;right:10px;top:10px;width:24px}"
},
"Themes.htm": {
"type": "text",
"content": "
"
},
"Themes.js": {
"type": "text",
"content": "/* global AppSettings, Utils, BrowserForm, CONST, designer, SubscriptionDialog, ConfirmEmailDialog, RequestController */\n/* exported Themes */\n\nvar Themes = (function () {\n 'use strict';\n\n Themes = function () {\n\n Themes.superclass.constructor.call(this);\n\n this.homeUrl = AppSettings.themesStockUrl;\n this._onMessageApply = this._onMessageApply.bind(this);\n this._baseUrl = null;\n this._onSelectSection = null;\n Themes._lastFilterUrl = null;\n\n this._buildUrl = function () {\n this._baseUrl = AppSettings.themesDesignerUrl;\n var url = RequestController.updateQueryStringParameter(this._baseUrl, \"Search.Themler\", \"True\");\n return this._addUrlBaseParams(url);\n };\n\n this._addToHistory = function (url) {\n Themes.superclass._addToHistory.call(this, url);\n var currentUrl = url.toLowerCase();\n var base = this._baseUrl.toLowerCase();\n if (currentUrl.indexOf(base) === 0) {\n Themes._lastFilterUrl = currentUrl.replace(base, '');\n }\n };\n\n this.show = function (control, options, onThemeSelected) {\n if (!Themes._lastFilterUrl) {\n this.frameSrc = null;\n }\n\n Themes.superclass.show.call(this, control, options);\n\n if (Themes._lastFilterUrl) {\n\t\t\t\tvar url = this._baseUrl + Themes._lastFilterUrl;\n\t\t\t\turl = this._addUrlBaseParams(url);\n this.goToUrl(url);\n }\n\n window.addEventListener('message', this._onMessageApply);\n this._onSelectSection = onThemeSelected;\n };\n\n\n this.close = function () {\n window.removeEventListener('message', this._onMessageApply);\n Themes.superclass.close.call(this);\n this.$iframe.attr('src', 'about:blank');\n };\n\n };\n\n Utils.extend(Themes, BrowserForm);\n\n Themes.prototype.goToUrl = function (url) {\n this._initHistory();\n this._updateButtonsState();\n this.$iframe.attr('src', url);\n };\n\n Themes.prototype._onMessageApply = function (e) {\n if (typeof e.data !== 'object') {\n return;\n }\n\t\t\n if (e.data.key === 'addtheme') {\n var url = e.data.url;\n if (url.indexOf('/') === 0)\n url = AppSettings.themesStockUrl + url;\n\n this._processAddTheme(e.data.mediaId, url);\n\t\t} else if (e.data.key === 'error') {\n if (e.data.errorCode === CONST.ERROR.AUTH_ERROR) { \n\t\t\t\tdesigner.ui.dialog.loginForm.show((function () {\n\t\t\t\t\tvar currentUrl = this._historyStack[this._historyPointer];\n\t\t\t\t\t\n\t\t\t\t\tvar ssoUrl = currentUrl;\n\t\t\t\t\tvar errorCodeParam = 'errorCode=' + CONST.ERROR.AUTH_ERROR;\n\t\t\t\t\t\n\t\t\t\t\tif (ssoUrl.indexOf(errorCodeParam) >= 0)\n\t\t\t\t\t\tssoUrl = currentUrl.replace(errorCodeParam, '');\n\t\t\t\t\t\n\t\t\t\t\tssoUrl = this._addUrlBaseParams(ssoUrl);\n\t\t\t\t\t\n\t\t\t\t\tthis.$iframe.attr('src', ssoUrl);\n\t\t\t\t\tthis._historyProcess = true;\n\t\t\t\t}).bind(this));\n } else if (e.data.errorCode === CONST.ERROR.SUBSCRIPTION_ERROR ||\n e.data.errorCode === CONST.ERROR.SUBSCRIPTIONS_EXPIRED) {\n SubscriptionDialog.show(e.data.errorCode);\n } else if (e.data.errorCode === CONST.ERROR.EMAIL_NOT_CONFIRMED) {\n ConfirmEmailDialog.show(e.data.url);\n }\n }\n };\n\n Themes.prototype._processAddTheme = function (mediaId, url) {\n this._disableDialog();\n\n var requestData = {\n url: url,\n success: (function (result) {\n var url = result.downloadUrl;\n if (url.indexOf('errorCode=') !== -1) {\n this.$iframe.attr('src', url);\n this._enableDialog();\n return;\n }\n if (this._onSelectSection) this._onSelectSection(url, mediaId);\n this.close();\n }).bind(this),\n error: (function () {\n this._enableDialog();\n }).bind(this),\n type: 'GET',\n dataType: 'json',\n xhrFields: {withCredentials: true}\n };\n\n RequestController.request(requestData);\n };\n\n return Themes;\n})();"
}
}
},
"UploadControl": {
"type": "dir",
"items": {
"UploadControl.css": {
"type": "text",
"content": ".dialog.upload{display:none;width:340px;height:230px}"
},
"UploadControl.htm": {
"type": "text",
"content": "
"
},
"UploadControl.js": {
"type": "text",
"content": "/* global $, createGuid, AppSettings, RequestController, designer */\n/* exported UploadControl */\n\nvar UploadControl = function () {\n \"use strict\";\n\n this.guid = createGuid();\n\n this.show = function () {\n designer.ui.knockout.renderDialog(this);\n var left = window.screen.width / 2 - this.$form.width() / 2;\n var top = window.screen.height / 2 - this.$form.height();\n this.$form.css('left', left);\n this.$form.css('top', top);\n $('#uploadForm').show();\n }.bind(this);\n\n this.onBound = function (element) {\n this.$form = $(element);\n }.bind(this);\n\n function clearInput($source) {\n /// The .clone() thing does not work in Opera (and possibly others)\n var $form = $('
';\r\n\r\n }, this, {deferEvaluation: true});\r\n}\r\n\r\nUtils.extend(UIPParagraphStyleExists, UIProvider);"
},
"UIPParentPagesList.js": {
"type": "text",
"content": "/**\r\n * Created by oksana on 14.07.2015.\r\n */\r\n/*global Utils, editor, ErrorUtility, UIPContentAttribute */\r\n/**\r\n *\r\n * @param {ProviderData} data\r\n * @constructor\r\n */\r\nfunction UIPParentPagesList(data) {\r\n 'use strict';\r\n\r\n UIPParentPagesList.superclass.constructor.call(this, data);\r\n\r\n this.allowDnd = false;\r\n\r\n this.selectedItem = ko.computed(function () {\r\n var result = null;\r\n this.traverseItems(this.items(), function (item) {\r\n if (item.value === this.value()) {\r\n result = item;\r\n }\r\n }.bind(this));\r\n\r\n return result;\r\n }, this, {deferEvaluation: true});\r\n}\r\n\r\nUtils.extend(UIPParentPagesList, UIPContentAttribute);\r\n\r\nUIPParentPagesList.prototype.dispose = function () {\r\n 'use strict';\r\n UIPParentPagesList.superclass.dispose.call(this);\r\n this.selectedItem.dispose();\r\n};\r\n\r\n/**\r\n * Make items for the PWTree.\r\n *\r\n * @param items Source \"id,parent\" array.\r\n * @param {String} parentId Parent id. For example, \"\" for root or \"page.0\" etc.\r\n * @returns {Array} Items with a tree structure.\r\n */\r\nUIPParentPagesList.prototype.getTreeItems = function (items, parentId, currentId) {\r\n 'use strict';\r\n var newItems = [];\r\n\r\n for (var i in items) {\r\n if (items.hasOwnProperty(i)) {\r\n var el = items[i];\r\n\r\n if (el.id && el.id !== currentId && el.parent === parentId) {\r\n newItems.push({\r\n value: el.id,\r\n caption: el.caption,\r\n items: this.getTreeItems(items, el.id, currentId)\r\n });\r\n }\r\n }\r\n }\r\n\r\n return newItems;\r\n\r\n};\r\n\r\nUIPParentPagesList.prototype.traverseItems = function (items, traverseFunc) {\r\n 'use strict';\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n\r\n traverseFunc(items[i]);\r\n if (items[i].items)\r\n this.traverseItems(items[i].items, traverseFunc);\r\n }\r\n\r\n};\r\n\r\nUIPParentPagesList.prototype.getItems = function (callback) {\r\n 'use strict';\r\n\r\n editor.pagesListController.getItems(this.options.postType, null, false, function (error, data) {\r\n if (error) {\r\n ErrorUtility.logWarning(error);\r\n callback(error);\r\n } else {\r\n var currentItem = editor.pagesListController.getCurrentItem(this.options.postType);\r\n var items = this.getTreeItems(data, '', currentItem && currentItem.id);\r\n items.splice(0, 0, {value: '', caption: \"No Parent\"});\r\n this.items(items);\r\n callback(null, this.items());\r\n }\r\n }.bind(this));\r\n};"
},
"UIPParsedContent.js": {
"type": "text",
"content": "/* global Utils, UIProvider, ControlRender, editor, designer, AppSettings */\n/**\n *\n * @param {ProviderData} data\n * @constructor\n */\nfunction UIPParsedContent(data) {\n 'use strict';\n\n UIPParsedContent.superclass.constructor.call(this, data);\n this.baseValue = this.value;\n this.value = ko.computed({\n read: function () {\n return this.parse(this.baseValue(), this.control());\n },\n write: function (value) {\n this.prepareForSaving(value, this.control(), function (error, res) {\n this.baseValue(res);\n }.bind(this));\n },\n owner: this,\n deferEvaluation: true\n });\n}\n\nUtils.extend(UIPParsedContent, UIProvider);\n\nUIPParsedContent.prototype.dispose = function () {\n 'use strict';\n UIPParsedContent.superclass.dispose.call(this);\n this.baseValue.dispose();\n};\n\nUIPParsedContent.prototype.parse = function (content, contentContainer) {\n 'use strict';\n\n return ControlRender.processContent(content, contentContainer, 'name.html');\n};\n\nUIPParsedContent.prototype.prepareForSaving = function (content, contentContainer, callback) {\n 'use strict';\n\n if (!editor.contentEditorController || !contentContainer) {\n callback(null, content);\n return;\n }\n\n var res, escTagsData = editor.contentEditorController.removeEscapeTags(content);\n if (!this.options.noParse && escTagsData.isReplaced) {\n if (!AppSettings.isTest) {\n this.startAsync();\n designer.ui.dialog.messageBox.show(\n \"#TextBoxTagChangeTitle\", \"#TextBoxTagChangeMsg\", ['OK', 'Cancel'], true, function (errors, result) {\n if (result === 'OK') {\n res = editor.contentEditorController.prepareContentForSaving(escTagsData.content, contentContainer);\n if (res) res = res.replace(/@@/g, '@');\n callback(null, res);\n } else {\n callback(null, this.value());\n }\n this.stopAsync();\n }.bind(this), 'OK'\n );\n } else {\n res = editor.contentEditorController.prepareContentForSaving(escTagsData.content, contentContainer);\n if (res) res = res.replace(/@@/g, '@');\n callback(null, res);\n }\n } else {\n res = editor.contentEditorController.prepareContentForSaving(content, contentContainer, this.options.noParse);\n if (res) res = res.replace(/@@/g, '@');\n callback(null, res);\n }\n};\n"
},
"UIPPaste.js": {
"type": "text",
"content": "/*exported UIPPaste*/\n/*global Utils, UIPBasePaste, PubSubController, Channels */\n\nfunction UIPPaste(data) {\n 'use strict';\n UIPPaste.superclass.constructor.call(this, data);\n\n this.enable = this.enable.bind(this);\n\n PubSubController.subscribe(Channels.controls.copy, this.enable);\n PubSubController.subscribe(Channels.controls.paste, this.enable);\n PubSubController.subscribe(Channels.controls.remove, this.enable);\n PubSubController.subscribe(Channels.previewEvents.loaded, this.enable);\n\n this.enable();\n}\n\nUtils.extend(UIPPaste, UIPBasePaste);\n\nUIPPaste.prototype.getBufferInfo = function(clipboardItem) {\n 'use strict';\n if (!clipboardItem) return null;\n\n return clipboardItem.copyInfo;\n};\n\nUIPPaste.prototype.dispose = function () {\n 'use strict';\n UIPPaste.superclass.dispose.call(this);\n PubSubController.unsubscribe(Channels.controls.copy, this.enable);\n PubSubController.unsubscribe(Channels.controls.paste, this.enable);\n PubSubController.unsubscribe(Channels.controls.remove, this.enable);\n PubSubController.unsubscribe(Channels.previewEvents.loaded, this.enable);\n};"
},
"UIPPasteAsLink.js": {
"type": "text",
"content": "/*exported UIPPasteAsLink*/\n/* global Utils, UIPBasePaste, ExchangeBuffer, PubSubController, Channels, PreviewHelper, l, ControlTemplateController */\nfunction UIPPasteAsLink(data) {\n 'use strict';\n UIPPasteAsLink.superclass.constructor.call(this, data);\n\n this._disabledTitle = l('Paste Link');\n\n var baseEnable = this.enable;\n this.enable = (function () {\n this._disabledMessage = null;\n var clipboardItem = ExchangeBuffer.get();\n if (clipboardItem) {\n var originalInfo = clipboardItem.originalInfo;\n if (!ControlTemplateController.existInTheme({dataId: originalInfo.control.prop('dataId')})) {\n this.enabled(false);\n return;\n }\n\n // Can't paste target to layout if the source control in absolute\n if (originalInfo.control.css('position') === 'absolute') {\n this._disabledMessage = l('#CannotPaste', originalInfo.control.prop('constructorName'), l('#ControlInAbsolutePosition'));\n return;\n }\n // Can't paste target to absolute (positioning issues)\n var controlInfo = PreviewHelper.getControlInfo(originalInfo.control);\n if (controlInfo && controlInfo.control && controlInfo.control.css('position') === 'absolute') {\n this.enabled(false);\n return;\n }\n }\n\n baseEnable.call(this);\n }).bind(this);\n\n PubSubController.subscribe(Channels.controls.copy, this.enable);\n PubSubController.subscribe(Channels.controls.paste, this.enable);\n PubSubController.subscribe(Channels.controls.remove, this.enable);\n PubSubController.subscribe(Channels.previewEvents.loaded, this.enable);\n PubSubController.subscribe(Channels.shortcodesEditor.start, this.enable);\n PubSubController.subscribe(Channels.shortcodesEditor.stop, this.enable);\n\n this.enable();\n}\n\nUtils.extend(UIPPasteAsLink, UIPBasePaste);\n\nUIPPasteAsLink.prototype.getBufferInfo = function (clipboardItem) {\n 'use strict';\n if (!clipboardItem) return null;\n\n return clipboardItem.originalInfo;\n};\n\nUIPPasteAsLink.prototype.dispose = function () {\n 'use strict';\n UIPPasteAsLink.superclass.dispose.call(this);\n PubSubController.unsubscribe(Channels.controls.copy, this.enable);\n PubSubController.unsubscribe(Channels.controls.paste, this.enable);\n PubSubController.unsubscribe(Channels.controls.remove, this.enable);\n PubSubController.unsubscribe(Channels.previewEvents.loaded, this.enable);\n PubSubController.unsubscribe(Channels.shortcodesEditor.start, this.enable);\n PubSubController.unsubscribe(Channels.shortcodesEditor.stop, this.enable);\n};\n\n"
},
"UIPPasteStyle.js": {
"type": "text",
"content": "/**\n * Created by san0k on 05.06.14.\n */\n\n/* exported UIPPasteStyle */\n/* globals editor, UIProvider, Utils, ExchangeBuffer, SerializeController, PreviewHelper, EffectsCollection,\n ControlStorageController, PresetHelper, CopyStyleItemType, PubSubController, Channels,\n MixinsController2, ControlPresetGenerator, _$, ControlTemplateController */\n\nfunction UIPPasteStyle(data) {\n 'use strict';\n UIPPasteStyle.superclass.constructor.call(this, data);\n\n this.enable = this.enable.bind(this);\n PubSubController.subscribe(Channels.selection.selectionChanged, this.enable);\n\n this.enable();\n}\n\nUtils.extend(UIPPasteStyle, UIProvider);\n\nUIPPasteStyle.prototype.enable = function () {\n 'use strict';\n var dataId = editor.selection.selectedItem.dataId;\n var clone = ExchangeBuffer.style.get();\n this.enabled(!!dataId && !!clone && (PreviewHelper.isControlFromControls(dataId) || editor.themeController.getTheme().dataId === dataId));\n};\n\nUIPPasteStyle.prototype._hasSimilarStructure = function (object1, object2) {\n 'use strict';\n if (!object1 || !object2) return false;\n object1 = _$(object1);\n var result = false;\n object1.traverse(function (objectProp1, p) {\n if (objectProp1.isSameFacade(object1))return true;\n if (object2.hasOwnProperty(p)) {\n var objectProp2 = object2[p];\n if (!objectProp2) return false;\n\n if (objectProp1.prop('constructorName') === objectProp2.constructorName) {\n result = true;\n return false;\n }\n if (MixinsController2.isProxy(objectProp1) || MixinsController2.isProxy(objectProp2)) {\n\n var srcTypeCategory = ControlStorageController.getEditorJson([{constructorName: objectProp1.prop('constructorName')}]).typeCategory;\n var dstTypeCategory = ControlStorageController.getEditorJson([{constructorName: objectProp2.constructorName}]).typeCategory;\n\n if (dstTypeCategory && srcTypeCategory === dstTypeCategory) {\n result = true;\n }\n }\n }\n return false;\n });\n return result;\n};\n\nUIPPasteStyle.prototype._resolveControls = function () {\n 'use strict';\n\n var clone = ExchangeBuffer.style.get();\n if (!clone) return null;\n\n var controlInfo = PreviewHelper.getControlInfo(editor.selection.getSelectedControl());\n if (!controlInfo) return null;\n\n var selectableControl = controlInfo.control;\n\n if (clone.type === CopyStyleItemType.typography) {\n return {\n source: clone,\n destination: selectableControl\n };\n }\n\n var modelControl = selectableControl.getTopLevelFacade();\n var isFirstLevelSelectable = (selectableControl.isSameFacade(modelControl));\n\n var selectableClone = null;\n (function _findSelectable(clone) {\n if (selectableClone) return;\n if (clone.selectable) {\n selectableClone = clone;\n } else {\n for (var i in clone) {\n if (clone.hasOwnProperty(i) && clone[i] && 'object' === typeof clone[i]) {\n _findSelectable(clone[i]);\n }\n }\n }\n })(clone);\n if (!selectableClone) {\n return;\n }\n\n if (isFirstLevelSelectable && clone.selectable) {\n return {\n source: clone,\n destination: selectableControl\n };\n }\n if (!isFirstLevelSelectable && !clone.selectable) {\n return {\n source: selectableClone,\n destination: selectableControl\n };\n }\n\n if (this._hasSimilarStructure(modelControl, clone.children)) {\n return {\n source: clone,\n destination: modelControl\n };\n }\n\n if (this._hasSimilarStructure(selectableControl, clone.children)) {\n return {\n source: clone,\n destination: selectableControl\n };\n }\n\n if (selectableClone) {\n if (this._hasSimilarStructure(modelControl, selectableClone.children)) {\n return {\n source: selectableClone,\n destination: modelControl\n };\n }\n }\n\n return {\n source: selectableClone,\n destination: selectableControl\n };\n};\n\nUIPPasteStyle.prototype.click = function () {\n 'use strict';\n\n var controls = this._resolveControls();\n if (!controls) return;\n\n var clone = controls.source;\n if (!clone) return;\n\n var control = controls.destination;\n if (!control) return;\n\n var replicationObject, oldState;\n\n if (clone.type === CopyStyleItemType.typography) {\n\n var typoStyle = editor.selection.selectedItem.resolved.typography;\n if (typoStyle) {\n control.css(typoStyle, clone.css);\n control.css(typoStyle + 'LinkHovered', clone.cssHover);\n control.css(typoStyle + 'LinkPassive', clone.cssPassive);\n }\n return;\n }\n\n replicationObject = this._fillObject(control, clone) || {};\n\n // save position, rotation, size etc. state of control if it can be positioned or resized\n oldState = PresetHelper.saveState(control);\n control.replaceWith(SerializeController.fillFromObject(control, replicationObject, ControlPresetGenerator.cloneReviewer, true));\n\n // restore control position, rotation & size\n PresetHelper.restoreState(control, oldState);\n};\n\nUIPPasteStyle.prototype._fillObject = function (control, pattern) {\n 'use strict';\n\n var replicationObject = {\n constructorName: control.prop('constructorName')\n };\n\n if (pattern.type === CopyStyleItemType.proxy) {\n if (control.prop('constructorName') === pattern.constructorName) {\n replicationObject = pattern.properties;\n } else {\n var exists = ControlTemplateController.existInTheme(control.prop('dataId')),\n newControl = SerializeController.fillFromObject(control, pattern.properties, ControlPresetGenerator.cloneReviewer, true);\n return exists ? undefined : newControl;\n }\n }\n\n this._fillChildren(control, pattern, replicationObject);\n\n if (pattern.css) {\n var controlCss = control.cssToJson();\n var controlTypography = controlCss ? controlCss.typography : null;\n if (controlCss && controlCss.typography) delete controlCss.typography;\n\n var patternTypography = pattern.css.typography;\n if (patternTypography) delete pattern.css.typography;\n\n replicationObject.css = pattern.css;\n\n for (var propertyName in controlCss) {\n if (controlCss.hasOwnProperty(propertyName)) {\n if (pattern.ignoredProperties.indexOf(propertyName) !== -1) {\n replicationObject.css[propertyName] = controlCss[propertyName];\n } else if (!replicationObject.css[propertyName]) {\n replicationObject.css[propertyName] = '';\n }\n }\n }\n\n if (patternTypography || (controlTypography && controlTypography.length > 0)) {\n replicationObject.css.typography = patternTypography;\n\n for (var p1 in controlTypography) {\n if (controlTypography.hasOwnProperty(p1)) {\n if (!replicationObject.css.typography[p1]) {\n replicationObject.css.typography[p1] = {};\n }\n for (var p2 in controlTypography[p1]) {\n if (controlTypography[p1].hasOwnProperty(p2)) {\n if (!replicationObject.css.typography[p1][p2]) {\n replicationObject.css.typography[p1][p2] = '';\n }\n }\n }\n }\n }\n } else if (controlTypography) {\n replicationObject.css.typography = controlTypography;\n }\n }\n\n if (pattern.effects && pattern.effects.length) {\n var isFirst = true;\n for (var effectKey in pattern.effects) {\n //CodeAnalyser skip:controlTraverse\n if (pattern.effects.hasOwnProperty(effectKey) && pattern.effects[effectKey]) {\n\n if (isFirst) {\n replicationObject.effects = new EffectsCollection();\n isFirst = false;\n }\n\n var effectJSON = pattern.effects[effectKey];\n var effect = SerializeController.fillFromObject(new window[effectJSON.constructorName](), effectJSON);\n replicationObject.effects.push(effect);\n }\n }\n }\n\n return replicationObject;\n};\n\nUIPPasteStyle.prototype._fillChildren = function (control, pattern, replicationObject) {\n 'use strict';\n if (!pattern.children || pattern.children.length === 0) return;\n for (var prop in pattern.children) {\n //CodeAnalyser skip:controlTraverse\n if (pattern.children.hasOwnProperty(prop)) {\n if (control.hasSubControl(prop) && pattern.children[prop]) {\n var childPattern = pattern.children[prop];\n if (control.find(prop).prop('constructorName') === childPattern.constructorName ||\n childPattern.type === CopyStyleItemType.proxy) {\n replicationObject[prop] = this._fillObject(control.find(prop), childPattern);\n }\n }\n }\n }\n};\n\nUIPPasteStyle.prototype.dispose = function () {\n 'use strict';\n PubSubController.unsubscribe(Channels.selection.selectionChanged, this.enable);\n UIPPasteStyle.superclass.dispose.call(this);\n};\n"
},
"UIPPicture.js": {
"type": "text",
"content": "/*global Utils, UIProvider, editor */\r\n\r\nfunction UIPPicture(data) {\r\n 'use strict';\r\n if (!window.Picture) {\r\n data.options.visible = false;\r\n }\r\n else {\r\n if (data.options.isMainMenu && window.hasOwnProperty('editor') && null !== window.editor.selection.selectedItem.dataId)\r\n data.control = window.editor.selection.getSelectedControl();\r\n data.options.visible = data.control.prop('constructorName') === 'Picture';\r\n if (data.control !== editor.themeController.getTheme()) {\r\n\r\n data.control.directChildren()\r\n .forEach(function (property) {\r\n if(property.prop('constructorName') === 'Picture'){\r\n data.control = property;\r\n data.options.visible = true;\r\n return;\r\n }\r\n });\r\n\r\n }\r\n }\r\n UIPPicture.superclass.constructor.call(this, data);\r\n}\r\n\r\nUtils.extend(UIPPicture, UIProvider);\r\n"
},
"UIPPictureEditable.js": {
"type": "text",
"content": "/*global Utils, UIProvider*/\r\n\r\nfunction UIPPictureEditable(data) {\r\n 'use strict';\r\n\r\n if (data.control.prop('constructorName') === 'IconState') {\r\n data.options.enabled = (data.control.find('picture').prop('fileName').length > 0) ? false : true;\r\n }\r\n\r\n UIPPictureEditable.superclass.constructor.call(this, data);\r\n}\r\n\r\nUtils.extend(UIPPictureEditable, UIProvider);\r\n"
},
"UIPPictureFromFile.js": {
"type": "text",
"content": "/* exported UIPPictureFromFile */\n/* global Utils, UIPBasePictureFromUrl, l, ImageController, designer, CONST, AppSettings*/\n/**\n * @param {ProviderData} data\n * @constructor\n */\nfunction UIPPictureFromFile(data) {\n 'use strict';\n UIPPictureFromFile.superclass.constructor.call(this, data);\n}\n\nUtils.extend(UIPPictureFromFile, UIPBasePictureFromUrl);\n\nUIPPictureFromFile.prototype.click = function () {\n 'use strict';\n this.uploadFromDisk(CONST.UPLOAD_TYPE.IMAGE, this.acceptImages, this.validateImages);\n};\n\nUIPPictureFromFile.prototype.upload = function UIPPictureFromFile_upload(options, callback) {\n 'use strict';\n var blobSize = options.file.size || options.file.length || 0;\n\n if (ImageController.rawImageHasRecommendedSize(blobSize)) {\n UIPPictureFromFile.superclass.upload.call(this, options, callback);\n } else {\n var blob = options.file;\n if (!(options.file instanceof Blob)){\n blob = new Blob([blob], { type: 'image/' + ImageController.getImageFormat(blob)});\n }\n var buttons = [];\n var ReduceSizeLabel = 'Reduce Size';\n if (['image/jpeg', 'image/png'].indexOf(blob.type) !== -1){\n buttons.push(ReduceSizeLabel);\n }\n\n if (blob.size <= CONST.IMAGE.UPLOAD_IMAGE_LIMIT) {\n buttons.push('Continue Anyway');\n }\n buttons.push('Cancel');\n this.startAsync();\n designer.ui.dialog.messageBox.showUntranslated(l('#VALIDATE_IMAGE_DIALOG_TITLE'), l('#VALIDATE_IMAGE_DIALOG_MESSAGE', AppSettings.recommendedImageSize),\n buttons, true, function (error, button) {\n switch (button) {\n case ReduceSizeLabel:\n var tooLargeDlg = function(){\n designer.ui.dialog.messageBox.show('#VALIDATE_IMAGE_DIALOG_TITLE', '#ImageTooBitMessage');\n if (typeof callback === \"function\") {\n callback(null);\n }\n this.stopAsync();\n }.bind(this);\n var img = new Image();\n var reader = new FileReader();\n reader.onerror = tooLargeDlg;\n reader.onload = function(e){\n img.src = e.target.result;\n };\n reader.readAsDataURL(blob);\n reader.onerror = tooLargeDlg;\n img.onload = function(){\n var w = img.width,\n h = img.height,\n canvas = document.createElement('canvas'),\n ctx = canvas.getContext('2d');\n canvas.width = w;\n canvas.height = h;\n ctx.drawImage(img, 0, 0);\n var dataURL = null;\n try {\n canvas.width = Math.round(\n Math.sqrt(\n w * w * (AppSettings.reduceImageSize * 1024 * 1024) /\n (canvas.toDataURL(blob.type, AppSettings.recommendedImageQuality).length * 0.75)\n )\n ); //1.33 - +33% - base64 correction\n canvas.height = Math.round(canvas.width * h / w);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n dataURL = canvas.toDataURL(blob.type, AppSettings.recommendedImageQuality);\n } catch(e){\n dataURL = null;\n }\n if (null === dataURL){\n tooLargeDlg();\n return;\n }\n var binary_string = atob( dataURL.slice(dataURL.indexOf(',') + 1)),\n len = binary_string.length,\n bytes = new Uint8Array( len );\n for (var i = 0; i < len; i++) {\n bytes[i] = binary_string.charCodeAt(i);\n }\n options.file = new Blob([bytes.buffer], {type: blob.type});\n UIPPictureFromFile.superclass.upload.call(this, options, callback);\n this.stopAsync();\n }.bind(this);\n break;\n case 'Continue Anyway':\n UIPPictureFromFile.superclass.upload.call(this, options, callback);\n this.stopAsync();\n break;\n case 'Cancel':\n if (typeof callback === \"function\") {\n callback(null);\n }\n this.stopAsync();\n break;\n }\n }.bind(this), buttons.indexOf(ReduceSizeLabel) !== -1 ? ReduceSizeLabel: 'Cancel');\n }\n};"
},
"UIPPictureFromLibrary.js": {
"type": "text",
"content": "/* exported UIPPictureFromLibrary */\n/* global CONST, Utils, designer, UIPPictureFromFile, ImageController */\n/**\n *\n * @param {ProviderData} data\n * @constructor\n */\nfunction UIPPictureFromLibrary(data) {\n 'use strict';\n UIPPictureFromLibrary.superclass.constructor.call(this, data);\n}\n\nUtils.extend(UIPPictureFromLibrary, UIPPictureFromFile);\n\nUIPPictureFromLibrary.prototype.click = function () {\n 'use strict';\n this.startAsync();\n var control = this.control();\n var picture = ImageController.getPictureFromControl(control);\n var mediaId = picture && picture.mediaId;\n designer.ui.dialog.selectMediaDialog.show(control, $.extend({isClipart: true, mediaId: mediaId}, this.options), function onPictureSelected(mediaInfo, downloadCallback) {\n this.uploadFromUrl(CONST.UPLOAD_TYPE.IMAGE, mediaInfo.url, mediaInfo, downloadCallback);\n }.bind(this), function onDialogClosed() {\n this.stopAsync();\n }.bind(this));\n};"
},
"UIPPictureUrl.js": {
"type": "text",
"content": "/* exported UIPPictureUrl */\r\n/* global Utils, UIPBasePictureFromUrl, designer, ImageController, ErrorUtility, CONST, ShortcodesEditor */\r\n\r\nfunction UIPPictureUrl(data) {\r\n 'use strict';\r\n UIPPictureUrl.superclass.constructor.call(this, data);\r\n}\r\n\r\nUtils.extend(UIPPictureUrl, UIPBasePictureFromUrl);\r\n\r\nUIPPictureUrl.prototype.click = function () {\r\n 'use strict';\r\n this._targetControl = this.control();\r\n var pictureControl = ImageController.getPictureFromControl(this._targetControl);\r\n var url = pictureControl ? ImageController.getUrl(pictureControl.fileName) : \"\";\r\n if (!ImageController.isAbsoluteUrl(url))\r\n url = \"http://\";\r\n this.startAsync();\r\n designer.ui.dialog.promptDialog.show('Image', '#ImageUrl', 'OK', 'Cancel', url,\r\n function (errs, newUrl, canceled) {\r\n if (!ErrorUtility.logWarning(errs) && !canceled && newUrl !== url) {\r\n $('