/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
define([
'core',
'irregularstack',
'gateway',
'common/main/lib/component/Window',
'common/main/lib/component/LoadMask',
'common/main/lib/component/Tooltip',
'common/main/lib/component/SynchronizeTip',
'common/main/lib/component/DataView',
'common/main/lib/component/Calendar',
'common/main/lib/util/LocalStorage',
'common/main/lib/util/Shortcuts',
'common/main/lib/view/OpenDialog',
'common/forms/lib/view/modals',
'documenteditor/forms/app/view/ApplicationView',
'common/main/lib/controller/LaunchController'
], function (Viewport) {
'use strict';
var LoadingDocument = -256,
maxPages = 0,
labelDocName,
_submitFail = true,
screenTip,
mouseMoveData = null,
isTooltipHiding = false,
bodyWidth = 0,
ttOffset = [0, -10],
_logoImage = '',
requireUserAction = true;
DE.Controllers.ApplicationController = Backbone.Controller.extend(_.assign({
views: [
'ApplicationView'
],
initialize: function() {
},
onLaunch: function() {
var me = this;
if (!Common.Utils.isBrowserSupported()){
Common.Utils.showBrowserRestriction();
$('#editor_sdk').hide().remove();
$('#toolbar').hide().remove();
Common.Gateway.reportError(undefined, this.unsupportedBrowserErrorText);
return;
}
this.stackLongActions = new Common.IrregularStack({
strongCompare : function(obj1, obj2){return obj1.id === obj2.id && obj1.type === obj2.type;},
weakCompare : function(obj1, obj2){return obj1.type === obj2.type;}
});
this._state = {isDisconnected: false, licenseType: false, isDocModified: false, isFormDisconnected: false};
this._isDisabled = false;
this.view = this.createView('ApplicationView').render();
window["flat_desine"] = true;
var translationTable = {
'Your text here': this.txtArt,
"Choose an item": this.txtChoose,
"Enter a date": this.txtEnterDate,
"Click to load image": this.txtClickToLoad
}
var config = {
'id-view' : 'editor_sdk',
'embedded' : true,
'translate': translationTable,
'isRtlInterface': Common.UI.isRTL()
},
hcolor = (/(?:&|^)headingsColor=([^&]+)&?/i).exec(window.location.search.substring(1));
hcolor && (config['headings-color'] = '#' + hcolor[1]);
this.api = new Asc.asc_docs_api(config);
Common.UI.Themes.init(this.api);
Common.Controllers.LaunchController.init(this.api);
$(window).on('resize', this.onDocumentResize.bind(this));
this.boxSdk = $('#editor_sdk');
this.boxSdk.on('click', function(e) {
if (e.target.localName == 'canvas') {
if (me._preventClick)
me._preventClick = false;
else {
if (e.target.getAttribute && e.target.getAttribute("oo_no_focused"))
return;
me.boxSdk.focus();
}
}
});
this.boxSdk.on('mousedown', function(e){
if (e.target.localName == 'canvas')
Common.UI.Menu.Manager.hideAll();
});
this.editorConfig = {};
this.embedConfig = {};
this.appOptions = {};
this.internalFormObj = null;
if (this.api){
this.api.asc_registerCallback('asc_onError', this.onError.bind(this));
this.api.asc_registerCallback('asc_onDocumentContentReady', this.onDocumentContentReady.bind(this));
this.api.asc_registerCallback('asc_onOpenDocumentProgress', this.onOpenDocument.bind(this));
this.api.asc_registerCallback('asc_onDocumentUpdateVersion', this.onUpdateVersion.bind(this));
this.api.asc_registerCallback('asc_onServerVersion', this.onServerVersion.bind(this));
this.api.asc_registerCallback('asc_onAdvancedOptions', this.onAdvancedOptions.bind(this));
this.api.asc_registerCallback('asc_onCountPages', this.onCountPages.bind(this));
this.api.asc_registerCallback('asc_onCurrentPage', this.onCurrentPage.bind(this));
this.api.asc_registerCallback('asc_onDocumentModifiedChanged', _.bind(this.onDocumentModifiedChanged, this));
this.api.asc_registerCallback('asc_onZoomChange', this.onApiZoomChange.bind(this));
this.api.asc_registerCallback('asc_onDisconnectEveryone', _.bind(this.onDisconnectEveryone, this));
this.api.asc_registerCallback('asc_onCoAuthoringDisconnect', _.bind(this.onApiServerDisconnect, this));
Common.NotificationCenter.on('api:disconnect', _.bind(this.onApiServerDisconnect, this));
// Initialize api gateway
Common.Gateway.on('init', this.loadConfig.bind(this));
Common.Gateway.on('opendocument', this.loadDocument.bind(this));
Common.Gateway.on('showmessage', this.onExternalMessage.bind(this));
Common.NotificationCenter.on('showmessage', this.onExternalMessage.bind(this));
Common.Gateway.appReady();
}
Common.NotificationCenter.on({
'modal:show': function(){
if (screenTip) {
screenTip.toolTip.hide();
screenTip.isVisible = false;
}
Common.Utils.ModalWindow.show();
me.api.asc_enableKeyEvents(false);
},
'modal:close': function(dlg) {
Common.Utils.ModalWindow.close();
if (!Common.Utils.ModalWindow.isVisible())
me.api.asc_enableKeyEvents(true);
},
'modal:hide': function(dlg) {
Common.Utils.ModalWindow.close();
if (!Common.Utils.ModalWindow.isVisible())
me.api.asc_enableKeyEvents(true);
},
'dataview:blur': function(e){
if (!Common.Utils.ModalWindow.isVisible()) {
me.api.asc_enableKeyEvents(true);
}
},
'menu:hide': function(e, isFromInputControl){
if (!Common.Utils.ModalWindow.isVisible() && !isFromInputControl)
me.api.asc_enableKeyEvents(true);
}
});
$(document.body).on('blur', 'input, textarea', function(e) {
if (!Common.Utils.ModalWindow.isVisible()) {
if (!/area_id/.test(e.target.id) ) {
me.api.asc_enableKeyEvents(true);
}
}
});
window.onbeforeunload = _.bind(this.onBeforeUnload, this);
this.warnNoLicense = this.warnNoLicense.replace(/%1/g, '{{COMPANY_NAME}}');
this.warnNoLicenseUsers = this.warnNoLicenseUsers.replace(/%1/g, '{{COMPANY_NAME}}');
this.textNoLicenseTitle = this.textNoLicenseTitle.replace(/%1/g, '{{COMPANY_NAME}}');
},
onDocumentResize: function() {
this.api && this.api.Resize();
bodyWidth = $('body').width();
},
onBeforeUnload: function() {
Common.localStorage.save();
},
onError: function(id, level, errData) {
if (id == Asc.c_oAscError.ID.LoadingScriptError) {
this.showTips([this.scriptLoadError]);
this.tooltip && this.tooltip.getBSTip().$tip.css('z-index', 10000);
return;
}
this.hidePreloader();
this.onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
var config = {
closable: true
};
switch (id)
{
case Asc.c_oAscError.ID.Unknown:
config.msg = this.unknownErrorText;
break;
case Asc.c_oAscError.ID.ConvertationTimeout:
config.msg = this.convertationTimeoutText;
break;
case Asc.c_oAscError.ID.ConvertationError:
config.msg = this.convertationErrorText;
break;
case Asc.c_oAscError.ID.ConvertationOpenError:
config.msg = this.openErrorText;
break;
case Asc.c_oAscError.ID.DownloadError:
config.msg = this.downloadErrorText;
break;
case Asc.c_oAscError.ID.UplImageSize:
config.msg = this.uploadImageSizeMessage;
break;
case Asc.c_oAscError.ID.UplImageExt:
config.msg = this.uploadImageExtMessage;
break;
case Asc.c_oAscError.ID.ConvertationPassword:
config.msg = this.errorFilePassProtect;
break;
case Asc.c_oAscError.ID.UserDrop:
config.msg = this.errorUserDrop;
break;
case Asc.c_oAscError.ID.ConvertationOpenLimitError:
config.msg = this.errorFileSizeExceed;
break;
case Asc.c_oAscError.ID.UpdateVersion:
config.msg = this.errorUpdateVersionOnDisconnect;
config.maxwidth = 600;
break;
case Asc.c_oAscError.ID.AccessDeny:
config.msg = this.errorAccessDeny;
break;
case Asc.c_oAscError.ID.Submit:
config.msg = this.errorSubmit;
_submitFail = true;
this.submitedTooltip && this.submitedTooltip.hide();
break;
case Asc.c_oAscError.ID.EditingError:
config.msg = (this.appOptions.isDesktopApp && this.appOptions.isOffline) ? this.errorEditingSaveas : this.errorEditingDownloadas;
break;
case Asc.c_oAscError.ID.ForceSaveButton:
case Asc.c_oAscError.ID.ForceSaveTimeout:
config.msg = this.errorForceSave;
config.maxwidth = 600;
break;
case Asc.c_oAscError.ID.LoadingFontError:
config.msg = this.errorLoadingFont;
break;
case Asc.c_oAscError.ID.Warning:
config.msg = this.errorConnectToServer;
config.closable = false;
break;
case Asc.c_oAscError.ID.VKeyEncrypt:
config.msg = this.errorToken;
break;
case Asc.c_oAscError.ID.KeyExpire:
config.msg = this.errorTokenExpire;
break;
case Asc.c_oAscError.ID.CoAuthoringDisconnect:
config.msg = this.errorViewerDisconnect;
break;
case Asc.c_oAscError.ID.SessionAbsolute:
config.msg = this.errorSessionAbsolute;
break;
case Asc.c_oAscError.ID.SessionIdle:
config.msg = this.errorSessionIdle;
break;
case Asc.c_oAscError.ID.SessionToken:
config.msg = this.errorSessionToken;
break;
case Asc.c_oAscError.ID.UplImageUrl:
config.msg = this.errorBadImageUrl;
break;
case Asc.c_oAscError.ID.DataEncrypted:
config.msg = this.errorDataEncrypted;
break;
case Asc.c_oAscError.ID.ConvertationSaveError:
config.msg = (this.appOptions.isDesktopApp && this.appOptions.isOffline) ? this.saveErrorTextDesktop : this.saveErrorText;
break;
case Asc.c_oAscError.ID.TextFormWrongFormat:
config.msg = this.errorTextFormWrongFormat;
break;
case Asc.c_oAscError.ID.ConvertationOpenFormat:
config.maxwidth = 600;
if (errData === 'pdf')
config.msg = this.errorInconsistentExtPdf.replace('%1', this.document.fileType || '');
else if (errData === 'docx')
config.msg = this.errorInconsistentExtDocx.replace('%1', this.document.fileType || '');
else if (errData === 'xlsx')
config.msg = this.errorInconsistentExtXlsx.replace('%1', this.document.fileType || '');
else if (errData === 'pptx')
config.msg = this.errorInconsistentExtPptx.replace('%1', this.document.fileType || '');
else
config.msg = this.errorInconsistentExt;
break;
default:
config.msg = (typeof id == 'string') ? id : this.errorDefaultMessage.replace('%1', id);
if (typeof id == 'string')
config.maxwidth = 600;
break;
}
if (level == Asc.c_oAscError.Level.Critical) {
// report only critical errors
Common.Gateway.reportError(id, config.msg);
config.title = this.criticalErrorTitle;
config.iconCls = 'error';
config.closable = false;
if (this.appOptions.canRequestClose) {
config.msg += '
' + this.criticalErrorExtTextClose;
config.callback = function(btn) {
if (btn == 'ok') {
Common.Gateway.requestClose();
Common.Controllers.Desktop.requestClose();
}
}
} else if (this.appOptions.canBackToFolder && !this.appOptions.isDesktopApp && typeof id !== 'string' && this.appOptions.customization.goback.url && this.appOptions.customization.goback.blank===false) {
var me = this;
config.msg += '
' + this.criticalErrorExtText;
config.callback = function(btn) {
if (btn == 'ok') {
if ( !Common.Controllers.Desktop.process('goback') )
parent.location.href = me.appOptions.customization.goback.url;
}
}
}
if (id == Asc.c_oAscError.ID.DataEncrypted) {
this.api.asc_coAuthoringDisconnect();
Common.NotificationCenter.trigger('api:disconnect');
}
}
else {
Common.Gateway.reportWarning(id, config.msg);
config.title = this.notcriticalErrorTitle;
config.iconCls = 'warn';
config.buttons = ['ok'];
config.callback = _.bind(function(btn){
if (id == Asc.c_oAscError.ID.Warning && btn == 'ok' && this.appOptions.canDownload) {
Common.UI.Menu.Manager.hideAll();
if (this.appOptions.isDesktopApp && this.appOptions.isOffline)
this.api.asc_DownloadAs();
else {
var me = this;
setTimeout(function() {
$('button', me.view.btnOptions.cmpEl).click();
}, 10);
}
} else if (id == Asc.c_oAscError.ID.EditingError) {
Common.NotificationCenter.trigger('api:disconnect', true); // enable download and print
}
}, this);
}
if (!Common.Utils.ModalWindow.isVisible() || $('.asc-window.modal.alert[data-value=' + id + ']').length<1)
Common.UI.alert(config).$window.attr('data-value', id);
(id!==undefined) && Common.component.Analytics.trackEvent('Internal Error', id.toString());
},
hidePreloader: function() {
$('#loading-mask').fadeOut('slow');
},
onOpenDocument: function(progress) {
var elem = document.getElementById('loadmask-text');
var proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());
proc = this.textLoadingDocument + ': ' + Common.Utils.String.fixedDigits(Math.min(Math.round(proc*100), 100), 3, " ") + "%";
elem ? elem.innerHTML = proc : this.loadMask && this.loadMask.setTitle(proc);
},
onCountPages: function(count) {
if (maxPages !== count) {
maxPages = count;
$('#pages').text(this.textOf + " " + count);
}
},
onCurrentPage: function(number) {
this.view.txtGoToPage.setValue(number + 1);
},
updateWindowTitle: function(force) {
var isModified = this.api.isDocumentModified();
if (this._state.isDocModified !== isModified || force) {
this._isDocReady && (this._state.isDocModified !== isModified) && Common.Gateway.setDocumentModified(isModified);
this._state.isDocModified = isModified;
}
},
onDocumentModifiedChanged: function() {
var isModified = this.api.asc_isDocumentCanSave();
if (this._state.isDocModified !== isModified) {
this._isDocReady && Common.Gateway.setDocumentModified(this.api.isDocumentModified());
}
this.appOptions.canFillForms && this.api.isDocumentModified() && this.requiredTooltip && this.requiredTooltip.hide();
this.updateWindowTitle();
},
loadConfig: function(data) {
this.editorConfig = $.extend(this.editorConfig, data.config);
this.embedConfig = $.extend(this.embedConfig, data.config.embedded);
$('#toolbar').addClass('top');
this.boxSdk.addClass('top');
ttOffset[1] = 40;
this.appOptions.customization = this.editorConfig.customization;
this.appOptions.canRenameAnonymous = !((typeof (this.appOptions.customization) == 'object') && (typeof (this.appOptions.customization.anonymous) == 'object') && (this.appOptions.customization.anonymous.request===false));
this.appOptions.guestName = (typeof (this.appOptions.customization) == 'object') && (typeof (this.appOptions.customization.anonymous) == 'object') &&
(typeof (this.appOptions.customization.anonymous.label) == 'string') && this.appOptions.customization.anonymous.label.trim()!=='' ?
Common.Utils.String.htmlEncode(this.appOptions.customization.anonymous.label) : this.textGuest;
var value;
if (this.appOptions.canRenameAnonymous) {
value = Common.localStorage.getItem("guest-username");
Common.Utils.InternalSettings.set("guest-username", value);
Common.Utils.InternalSettings.set("save-guest-username", !!value);
}
this.editorConfig.user =
this.appOptions.user = Common.Utils.fillUserInfo(this.editorConfig.user, this.editorConfig.lang, value ? (value + ' (' + this.appOptions.guestName + ')' ) : this.textAnonymous,
Common.localStorage.getItem("guest-id") || ('uid-' + Date.now()));
this.appOptions.user.anonymous && Common.localStorage.setItem("guest-id", this.appOptions.user.id);
this.appOptions.canRequestClose = this.editorConfig.canRequestClose;
this.appOptions.canBackToFolder = (this.editorConfig.canBackToFolder!==false) && (typeof (this.editorConfig.customization) == 'object') && (typeof (this.editorConfig.customization.goback) == 'object')
&& (!_.isEmpty(this.editorConfig.customization.goback.url) || this.editorConfig.customization.goback.requestClose && this.appOptions.canRequestClose);
this.appOptions.canRequestInsertImage = this.editorConfig.canRequestInsertImage;
this.appOptions.fileChoiceUrl = this.editorConfig.fileChoiceUrl;
this.appOptions.saveAsUrl = this.editorConfig.saveAsUrl;
this.appOptions.canRequestSaveAs = this.editorConfig.canRequestSaveAs;
this.appOptions.isDesktopApp = this.editorConfig.targetApp == 'desktop' || Common.Controllers.Desktop.isActive();
this.appOptions.lang = this.editorConfig.lang;
this.appOptions.canPlugins = false;
this.appOptions.canRequestFillingStatus = this.editorConfig.canRequestFillingStatus;
Common.Controllers.Desktop.init(this.appOptions);
this.appOptions.canCloseEditor = false;
var _canback = false;
if (typeof this.appOptions.customization === 'object') {
if (typeof this.appOptions.customization.goback == 'object' && this.appOptions.canBackToFolder!==false) {
_canback = this.appOptions.customization.close===undefined ?
this.appOptions.customization.goback.url || this.appOptions.customization.goback.requestClose && this.appOptions.canRequestClose :
this.appOptions.customization.goback.url && !this.appOptions.customization.goback.requestClose;
if (this.appOptions.customization.goback.requestClose)
console.log("Obsolete: The 'requestClose' parameter of the 'customization.goback' section is deprecated. Please use 'close' parameter in the 'customization' section instead.");
}
if (this.appOptions.customization.close && typeof this.appOptions.customization.close === 'object')
this.appOptions.canCloseEditor = (this.appOptions.customization.close.visible!==false) && this.appOptions.canRequestClose && !this.appOptions.isDesktopApp;
}
this.appOptions.canBackToFolder = !!_canback;
if (this.editorConfig.canRequestRefreshFile) {
Common.Gateway.on('refreshfile', _.bind(this.onRefreshFile, this));
this.api.asc_registerCallback('asc_onRequestRefreshFile', _.bind(this.onRequestRefreshFile, this));
}
},
onExternalMessage: function(msg) {
if (msg && msg.msg) {
msg.msg = (msg.msg).toString();
this.showTips([msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)]);
Common.component.Analytics.trackEvent('External Error');
}
},
showTips: function(strings) {
var me = this;
if (!strings.length) return;
if (typeof(strings)!='object') strings = [strings];
function showNextTip() {
var str_tip = strings.shift();
if (str_tip) {
str_tip += '\n' + me.textCloseTip;
tooltip.setTitle(str_tip);
tooltip.show();
}
}
if (!this.tooltip) {
this.tooltip = new Common.UI.Tooltip({
owner: $('#toolbar'),
hideonclick: true,
placement: 'bottom',
cls: 'main-info',
offset: 30
});
}
var tooltip = this.tooltip;
tooltip.on('tooltip:hide', function(){
setTimeout(showNextTip, 300);
});
showNextTip();
},
loadDocument: function(data) {
this.permissions = {};
this.document = data.doc;
var docInfo = {};
if (data.doc) {
this.permissions = $.extend(this.permissions, data.doc.permissions);
var _options = $.extend({}, data.doc.options, this.editorConfig.actionLink || {});
var _user = new Asc.asc_CUserInfo();
_user.put_Id(this.appOptions.user.id);
_user.put_FullName(this.appOptions.user.fullname);
_user.put_IsAnonymousUser(!!this.appOptions.user.anonymous);
docInfo = new Asc.asc_CDocInfo();
docInfo.put_Id(data.doc.key);
docInfo.put_Url(data.doc.url);
docInfo.put_DirectUrl(data.doc.directUrl);
docInfo.put_Title(data.doc.title);
docInfo.put_Format(data.doc.fileType);
docInfo.put_VKey(data.doc.vkey);
docInfo.put_Options(_options);
docInfo.put_UserInfo(_user);
docInfo.put_CallbackUrl(this.editorConfig.callbackUrl);
docInfo.put_Token(data.doc.token);
docInfo.put_Permissions(data.doc.permissions);
docInfo.put_EncryptedInfo(this.editorConfig.encryptionKeys);
docInfo.put_Lang(this.editorConfig.lang);
docInfo.put_Mode(this.editorConfig.mode);
docInfo.put_Wopi(this.editorConfig.wopi);
this.editorConfig.shardkey && docInfo.put_Shardkey(this.editorConfig.shardkey);
var enable = !this.editorConfig.customization || (this.editorConfig.customization.macros!==false);
docInfo.asc_putIsEnabledMacroses(!!enable);
enable = !this.editorConfig.customization || (this.editorConfig.customization.plugins!==false);
docInfo.asc_putIsEnabledPlugins(!!enable);
var type = /^(?:(djvu|xps|oxps))$/.exec(data.doc.fileType);
if (type && typeof type[1] === 'string') {
this.permissions.edit = this.permissions.review = false;
}
}
labelDocName = $('#title-doc-name');
if (data.doc) {
labelDocName.text(data.doc.title || '');
this.embedConfig.docTitle = data.doc.title;
}
this.api.asc_registerCallback('asc_onGetEditorPermissions', _.bind(this.onEditorPermissions, this));
this.api.asc_registerCallback('asc_onRunAutostartMacroses', _.bind(this.onRunAutostartMacroses, this));
this.api.asc_registerCallback('asc_onLicenseChanged', _.bind(this.onLicenseChanged, this));
this.api.asc_setDocInfo(docInfo);
this.api.asc_getEditorPermissions(this.editorConfig.licenseUrl, this.editorConfig.customerId);
this.api.asc_enableKeyEvents(true);
Common.Analytics.trackEvent('Load', 'Start');
},
onRunAutostartMacroses: function() {
if (!this.editorConfig.customization || (this.editorConfig.customization.macros!==false)) {
this.api.asc_runAutostartMacroses();
}
},
onEditorPermissions: function(params) {
var licType = params.asc_getLicenseType();
if (Asc.c_oLicenseResult.Expired === licType || Asc.c_oLicenseResult.Error === licType || Asc.c_oLicenseResult.ExpiredTrial === licType ||
Asc.c_oLicenseResult.NotBefore === licType || Asc.c_oLicenseResult.ExpiredLimited === licType) {
Common.UI.warning({
title: Asc.c_oLicenseResult.NotBefore === licType ? this.titleLicenseNotActive : this.titleLicenseExp,
msg: Asc.c_oLicenseResult.NotBefore === licType ? this.warnLicenseBefore : this.warnLicenseExp,
buttons: [],
closable: false
});
if (this._isDocReady || this._isPermissionsInited) { // receive after refresh file
Common.NotificationCenter.trigger('api:disconnect');
}
return;
}
if ( this.onServerVersion(params.asc_getBuildVersion())) return;
if ( this._isDocReady || this._isPermissionsInited ) {
this.api.asc_LoadDocument();
return;
}
this.permissions.review = (this.permissions.review === undefined) ? (this.permissions.edit !== false) : this.permissions.review;
if (params.asc_getRights() !== Asc.c_oRights.Edit)
this.permissions.edit = this.permissions.review = false;
this.appOptions.isOffline = this.api.asc_isOffline();
this.appOptions.trialMode = params.asc_getLicenseMode();
this.appOptions.isBeta = params.asc_getIsBeta();
this.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit);
this.appOptions.canSubmitForms = this.appOptions.canLicense && (typeof (this.editorConfig.customization) == 'object') && !this.appOptions.isOffline &&
!!this.editorConfig.customization.submitForm && (typeof this.editorConfig.customization.submitForm !== 'object' || this.editorConfig.customization.submitForm.visible!==false);
var type = /^(?:(pdf))$/.exec(this.document.fileType); // can fill forms only in pdf format
this.appOptions.isOFORM = !!(type && typeof type[1] === 'string');
this.appOptions.canFillForms = this.appOptions.canLicense && this.appOptions.isOFORM && ((this.permissions.fillForms===undefined) ? (this.permissions.edit !== false) : this.permissions.fillForms) &&
(this.editorConfig.mode !== 'view') && !this._state.isFormDisconnected;
this.api.asc_setViewMode(!this.appOptions.canFillForms);
this.appOptions.canBranding = params.asc_getCustomization();
this.appOptions.canBranding && this.setBranding(this.appOptions.customization);
this.appOptions.canDownload = this.permissions.download !== false;
this.appOptions.canPrint = (this.permissions.print !== false);
this.appOptions.fileKey = this.document.key;
this.appOptions.isAnonymousSupport = !!this.api.asc_isAnonymousSupport();
AscCommon.UserInfoParser.setParser(true);
AscCommon.UserInfoParser.setCurrentName(this.appOptions.user.fullname);
DE.getController('Plugins').setMode(this.appOptions, this.api);
var me = this;
me.view.btnDownload.setVisible(false && this.appOptions.canDownload && this.appOptions.canFillForms && !this.appOptions.canSubmitForms);
if (me.appOptions.isOffline || me.appOptions.canRequestSaveAs || !!me.appOptions.saveAsUrl) {
me.view.btnDownload.setCaption(me.appOptions.isOffline ? me.textSaveAsDesktop : me.textSaveAs);
me.view.btnDownload.updateHint('');
}
me.showFillingForms(false); // hide filling forms
me.view.btnFillStatus.setVisible(this.appOptions.canRequestFillingStatus);
if (this.appOptions.canFillForms) {
me.view.btnPrev.on('click', function(){
me.api.asc_MoveToFillingForm(false);
me.onEditComplete();
});
me.view.btnNext.on('click', function(){
me.api.asc_MoveToFillingForm(true);
me.onEditComplete();
});
me.view.btnClear.on('click', function(){
me.api.asc_ClearAllSpecialForms();
me.onEditComplete();
});
me.view.btnSubmit.on('click', function(){
if (!me.api.asc_IsAllRequiredFormsFilled()) {
me.api.asc_MoveToFillingForm(true, true, true);
me.onEditComplete();
if (!me.requiredTooltip) {
me.requiredTooltip = new Common.UI.SynchronizeTip({
extCls: 'colored',
placement: 'bottom-left',
target: me.view.btnSubmit.$el,
text: me.textRequired,
showLink: false,
closable: true
});
me.requiredTooltip.on('closeclick', function () {
me.requiredTooltip.hide();
});
}
!me.requiredTooltip.isVisible() && me.requiredTooltip.show();
// Common.UI.warning({
// msg: me.textRequired,
// callback: function() {
// me.api.asc_MoveToFillingForm(true, true, true);
// }
// });
return;
}
me.api.asc_SendForm();
Common.Controllers.Desktop.removeRecent();
Common.Controllers.Desktop.process('goback');
Common.Controllers.Desktop.requestClose();
});
me.view.btnDownload.on('click', function(){
if (me.appOptions.canDownload) {
if (me.appOptions.isOffline)
me.api.asc_DownloadAs(new Asc.asc_CDownloadOptions(Asc.c_oAscFileType.PDF));
else {
me.isFromBtnDownload = me.appOptions.canRequestSaveAs || !!me.appOptions.saveAsUrl;
var options = new Asc.asc_CDownloadOptions(Asc.c_oAscFileType.PDF, me.isFromBtnDownload);
options.asc_setIsSaveAs(me.isFromBtnDownload);
me.api.asc_DownloadAs(options);
}
}
});
me.view.btnUndo.on('click', function(){
me.api.Undo(false);
me.onEditComplete();
});
me.view.btnRedo.on('click', function(){
me.api.Redo(false);
me.onEditComplete();
});
me.view.btnFillStatus.on('click', function(){
Common.UI.TooltipManager.closeTip('showFillStatus');
Common.Gateway.requestFillingStatus(me.appOptions.user.roles && me.appOptions.user.roles.length>0 ? me.appOptions.user.roles[0] : undefined);
});
this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyForms);
this.api.asc_SetFastCollaborative(true);
this.api.asc_setAutoSaveGap(1);
this.api.SetCollaborativeMarksShowType(Asc.c_oAscCollaborativeMarksShowType.None);
}
this.view.btnClose.setVisible(this.appOptions.canCloseEditor);
if (this.appOptions.canCloseEditor) {
this.view.btnClose.updateHint(this.appOptions.customization.close.text || this.view.textClose);
this.view.btnClose.on('click', function(){
Common.Gateway.requestClose();
});
}
if (this.appOptions.canFillForms) {
this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this));
}
this._isPermissionsInited = true;
this.onLongActionBegin(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
this.api.asc_LoadDocument();
this.api.Resize();
},
onServerVersion: function(buildVersion) {
if (this.changeServerVersion) return true;
if (DocsAPI.DocEditor.version() !== buildVersion && !window.compareVersions) {
this.changeServerVersion = true;
Common.UI.warning({
title: this.titleServerVersion,
msg: this.errorServerVersion,
callback: function() {
_.defer(function() {
Common.Gateway.updateVersion();
})
}
});
if (this._isDocReady) { // receive after refresh file
Common.NotificationCenter.trigger('api:disconnect');
}
return true;
}
return false;
},
onUpdateVersion: function(callback) {
this.editorConfig && this.editorConfig.canUpdateVersion && console.log("Obsolete: The 'onOutdatedVersion' event is deprecated. Please use 'onRequestRefreshFile' event and 'refreshFile' method instead.");
var me = this;
me.needToUpdateVersion = true;
me.onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
Common.UI.warning({
title: this.titleUpdateVersion,
msg: this.errorUpdateVersion,
callback: function() {
_.defer(function() {
Common.Gateway.updateVersion();
if (callback) callback.call(me);
me.editorConfig && me.editorConfig.canUpdateVersion && me.onLongActionBegin(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
})
}
});
Common.NotificationCenter.trigger('api:disconnect');
},
onLicenseChanged: function(params) {
var licType = params.asc_getLicenseType();
if (licType !== undefined && this.appOptions.canFillForms &&
(licType===Asc.c_oLicenseResult.Connections || licType===Asc.c_oLicenseResult.UsersCount || licType===Asc.c_oLicenseResult.ConnectionsOS || licType===Asc.c_oLicenseResult.UsersCountOS
|| licType===Asc.c_oLicenseResult.SuccessLimit && (this.appOptions.trialMode & Asc.c_oLicenseMode.Limited) !== 0))
this._state.licenseType = licType;
if (this._isDocReady)
this.applyLicense();
},
applyLicense: function() {
if (!this.appOptions.isAnonymousSupport && !!this.appOptions.user.anonymous) {
this.api.asc_coAuthoringDisconnect();
Common.NotificationCenter.trigger('api:disconnect');
Common.UI.warning({
title: this.notcriticalErrorTitle,
msg : this.warnLicenseAnonymous,
buttons: ['ok']
});
} else if (this._state.licenseType) {
var license = this._state.licenseType,
title = this.textNoLicenseTitle,
buttons = ['ok'],
primary = 'ok',
modal = false;
if ((this.appOptions.trialMode & Asc.c_oLicenseMode.Limited) !== 0 &&
(license===Asc.c_oLicenseResult.SuccessLimit || this.appOptions.permissionsLicense===Asc.c_oLicenseResult.SuccessLimit)) {
license = this.warnLicenseLimitedRenewed;
} else if (license===Asc.c_oLicenseResult.Connections || license===Asc.c_oLicenseResult.UsersCount) {
title = this.titleReadOnly;
license = (license===Asc.c_oLicenseResult.Connections) ? this.tipLicenseExceeded : this.tipLicenseUsersExceeded;
} else {
license = (license===Asc.c_oLicenseResult.ConnectionsOS) ? this.warnNoLicense : this.warnNoLicenseUsers;
buttons = [{value: 'buynow', caption: this.textBuyNow}, {value: 'contact', caption: this.textContactUs}];
primary = 'buynow';
modal = true;
}
if (this._state.licenseType!==Asc.c_oLicenseResult.SuccessLimit && this.appOptions.canFillForms) {
this.api.asc_coAuthoringDisconnect();
Common.NotificationCenter.trigger('api:disconnect');
}
!modal ? Common.UI.TooltipManager.showTip({ step: 'licenseError', text: license, header: title, target: '#toolbar', maxwidth: 430,
automove: true, noHighlight: true, noArrow: true, textButton: this.textContinue}) :
Common.UI.info({
maxwidth: 500,
title: title,
msg : license,
buttons: buttons,
primary: primary,
callback: function(btn) {
if (btn == 'buynow')
window.open('{{PUBLISHER_URL}}', "_blank");
else if (btn == 'contact')
window.open('mailto:{{SALES_EMAIL}}', "_blank");
}
});
}
},
setBranding: function (value) {
if ( value && value.logo) {
var logo = $('#header-logo');
if (value.logo.visible===false) {
logo.addClass('hidden');
logo.parent().removeClass('margin-right-large');
return;
}
if (value.logo.image || value.logo.imageDark || value.logo.imageLight) {
_logoImage = Common.UI.Themes.isDarkTheme() ? (value.logo.imageDark || value.logo.image || value.logo.imageLight) :
(value.logo.imageLight || value.logo.image || value.logo.imageDark);
logo.html('');
logo.css({'background-image': 'none', width: 'auto', height: 'auto'});
}
if (value.logo.url) {
logo.attr('href', value.logo.url);
} else if (value.logo.url!==undefined) {
logo.removeAttr('href');logo.removeAttr('target');
}
}
},
onLongActionBegin: function(type, id) {
var action = {id: id, type: type};
this.stackLongActions.push(action);
this.setLongActionView(action);
},
setLongActionView: function(action) {
var title = '', text = '', force = false;
switch (action.id)
{
case Asc.c_oAscAsyncAction['Print']:
text = this.downloadTextText;
break;
case Asc.c_oAscAsyncAction['Submit']:
_submitFail = false;
text = this.savingText;
this.submitedTooltip && this.submitedTooltip.hide();
this.view.btnSubmit.setDisabled(!_submitFail || this._state.hasForm);
this.view.btnSubmit.cmpEl.css("pointer-events", "none");
this.disableFillingForms(true);
break;
case LoadingDocument:
text = this.textLoadingDocument + ' ';
break;
default:
text = this.waitText;
break;
}
if (action.type == Asc.c_oAscAsyncActionType['BlockInteraction']) {
if (!this.loadMask)
this.loadMask = new Common.UI.LoadMask({owner: $(document.body)});
this.loadMask.setTitle(text);
this.loadMask.show();
}
},
onLongActionEnd: function(type, id){
var action = {id: id, type: type};
this.stackLongActions.pop(action);
this.updateWindowTitle(true);
action = this.stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information});
action && this.setLongActionView(action);
action = this.stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});
action ? this.setLongActionView(action) : this.loadMask && this.loadMask.hide();
if (id==Asc.c_oAscAsyncAction['Submit']) {
this.view.btnSubmit.setDisabled(!_submitFail || this._state.hasForm);
this.view.btnSubmit.cmpEl.css("pointer-events", "auto");
if (!_submitFail) {
Common.Gateway.submitForm();
this.view.btnSubmit.setCaption(this.textFilled);
this.view.btnSubmit.cmpEl.removeClass('yellow').removeClass('back-color').addClass('gray');
var text = (typeof this.appOptions.customization.submitForm==='object') ? this.appOptions.customization.submitForm.resultMessage : this.textSubmitOk;
if (text!=='') {
if (!this.submitedTooltip) {
this.submitedTooltip = new Common.UI.SynchronizeTip({
text: text || this.textSubmitOk,
extCls: 'no-arrow colored',
style: 'max-width: 400px',
showLink: false,
target: $('.toolbar'),
placement: 'bottom'
});
this.submitedTooltip.on('closeclick', function () {
this.submitedTooltip.hide();
}, this);
}
this.submitedTooltip.show();
}
this.api.asc_setRestriction(Asc.c_oAscRestrictionType.View, this.api.asc_getRestrictionSettings());
this.onApiServerDisconnect(true);
} else
this.disableFillingForms(false);
}
if ( type == Asc.c_oAscAsyncActionType.BlockInteraction &&
!((id == Asc.c_oAscAsyncAction['LoadDocumentFonts'] || id == Asc.c_oAscAsyncAction['LoadFonts'] || id == Asc.c_oAscAsyncAction['ApplyChanges'] || id == Asc.c_oAscAsyncAction['DownloadAs']) && Common.Utils.ModalWindow.isVisible()) ) {
this.api.asc_enableKeyEvents(true);
}
},
onAdvancedOptions: function(type, advOptions, mode, formatOptions) {
if (this._openDlg) return;
var me = this;
if (type == Asc.c_oAscAdvancedOptionsID.DRM) {
me._openDlg = new Common.Views.OpenDialog({
title: Common.Views.OpenDialog.prototype.txtTitleProtected,
closeFile: me.appOptions.canRequestClose,
type: Common.Utils.importTextType.DRM,
warning: !(me.appOptions.isDesktopApp && me.appOptions.isOffline) && (typeof advOptions == 'string'),
warningMsg: advOptions,
validatePwd: !!me._isDRM,
iconType: 'svg',
handler: function (result, value) {
me.isShowOpenDialog = false;
if (result == 'ok') {
if (me.api) {
me.api.asc_setAdvancedOptions(type, value.drmOptions);
me.loadMask && me.loadMask.show();
}
} else {
Common.Gateway.requestClose();
Common.Controllers.Desktop.requestClose();
}
me._openDlg = null;
}
});
me._isDRM = true;
}
if (me._openDlg) {
this.isShowOpenDialog = true;
this.loadMask && this.loadMask.hide();
this.onLongActionEnd(Asc.c_oAscAsyncActionType.BlockInteraction, LoadingDocument);
me._openDlg.show();
}
if (requireUserAction) {
Common.Gateway.userActionRequired();
requireUserAction = false;
}
},
onDocMouseMoveStart: function() {
screenTip.isHidden = true;
},
onDocMouseMoveEnd: function() {
var me = this;
if (screenTip.isHidden && screenTip.isVisible) {
screenTip.isVisible = false;
isTooltipHiding = true;
screenTip.toolTip.hide(function(){
isTooltipHiding = false;
if (mouseMoveData) me.onDocMouseMove(mouseMoveData);
mouseMoveData = null;
});
}
},
onDocMouseMove: function(data) {
var me = this;
if (data) {
var type = data.get_Type();
if (type == Asc.c_oAscMouseMoveDataTypes.Hyperlink || type==Asc.c_oAscMouseMoveDataTypes.Form) { // hyperlink
if (isTooltipHiding) {
mouseMoveData = data;
return;
}
var str = (type == Asc.c_oAscMouseMoveDataTypes.Hyperlink) ? me.txtPressLink : data.get_FormHelpText();
if (str.length>500)
str = str.substr(0, 500) + '...';
str = Common.Utils.String.htmlEncode(str);
var recalc = false;
screenTip.isHidden = false;
if (screenTip.tipType !== type || screenTip.tipLength !== str.length || screenTip.strTip.indexOf(str)<0 ) {
screenTip.toolTip.setTitle(str);
screenTip.tipLength = str.length;
screenTip.strTip = str;
screenTip.tipType = type;
recalc = true;
}
var showPoint = [data.get_X()+5, data.get_Y() + ttOffset[1]-15];
if (!screenTip.isVisible || recalc) {
screenTip.isVisible = true;
screenTip.toolTip.show([-10000, -10000]);
}
if ( recalc ) {
screenTip.tipHeight = screenTip.toolTip.getBSTip().$tip.height();
screenTip.tipWidth = screenTip.toolTip.getBSTip().$tip.width();
}
!bodyWidth && (bodyWidth = $('body').width());
recalc = false;
if (showPoint[0] + screenTip.tipWidth > bodyWidth ) {
showPoint[0] = bodyWidth - screenTip.tipWidth;
recalc = true;
}
if (showPoint[1] - screenTip.tipHeight < 0) {
showPoint[1] = (recalc) ? showPoint[1]+30 : 0;
} else
showPoint[1] -= screenTip.tipHeight;
screenTip.toolTip.getBSTip().$tip.css({top: showPoint[1] + 'px', left: showPoint[0] + 'px'});
}
}
},
onDownloadUrl: function(url, fileType) {
if (this.isFromBtnDownload) { // download as pdf
var me = this,
defFileName = this.embedConfig.docTitle;
!defFileName && (defFileName = me.txtUntitled);
var idx = defFileName.lastIndexOf('.');
if (idx>0)
defFileName = defFileName.substring(0, idx) + '.pdf';
if (me.appOptions.canRequestSaveAs) {
Common.Gateway.requestSaveAs(url, defFileName, fileType);
} else {
me._saveCopyDlg = new Common.Views.SaveAsDlg({
saveFolderUrl: me.appOptions.saveAsUrl,
saveFileUrl: url,
defFileName: defFileName
});
me._saveCopyDlg.on('saveaserror', function(obj, err){
Common.UI.warning({
closable: false,
msg: err,
callback: function(btn){
me.onEditComplete();
}
});
}).on('close', function(obj){
me._saveCopyDlg = undefined;
});
me._saveCopyDlg.show();
}
} else {
Common.Gateway.downloadAs(url);
}
this.isFromBtnDownload = false;
},
onPrint: function() {
if (!this.appOptions.canPrint || Common.Utils.ModalWindow.isVisible()) return;
if (this.api)
this.api.asc_Print(new Asc.asc_CDownloadOptions(null, Common.Utils.isChrome || Common.Utils.isOpera || Common.Utils.isGecko && Common.Utils.firefoxVersion>86)); // if isChrome or isOpera == true use asc_onPrintUrl event
Common.component.Analytics.trackEvent('Print');
},
onPrintUrl: function(url) {
if (this.iframePrint) {
this.iframePrint.parentNode.removeChild(this.iframePrint);
this.iframePrint = null;
}
if (!this.iframePrint) {
var me = this;
this.iframePrint = document.createElement("iframe");
this.iframePrint.id = "id-print-frame";
this.iframePrint.style.display = 'none';
this.iframePrint.style.visibility = "hidden";
this.iframePrint.style.position = "fixed";
this.iframePrint.style.right = "0";
this.iframePrint.style.bottom = "0";
document.body.appendChild(this.iframePrint);
this.iframePrint.onload = function() {
try {
me.iframePrint.contentWindow.focus();
me.iframePrint.contentWindow.print();
me.iframePrint.contentWindow.blur();
window.focus();
} catch (e) {
me.api.asc_DownloadAs(new Asc.asc_CDownloadOptions(Asc.c_oAscFileType.PDF));
}
};
}
if (url) this.iframePrint.src = url;
},
onFillRequiredFields: function(isFilled) {
// this.view.btnSubmit.setDisabled(!isFilled);
// this.view.btnSubmit.cmpEl.css("pointer-events", isFilled ? "auto" : "none");
this.view.btnSubmit.cmpEl.removeClass(isFilled ? 'back-color' : 'yellow').addClass(isFilled ? 'yellow' : 'back-color');
isFilled && this.requiredTooltip && this.requiredTooltip.hide();
},
onProcessMouse: function(data) {
if (data.type == 'mouseup') {
var e = document.getElementById('editor_sdk');
if (e) {
var r = Common.Utils.getBoundingClientRect(e);
this.api.OnMouseUp(
data.x - r.left,
data.y - r.top
);
}
}
},
onRequestClose: function() {
Common.Gateway.requestClose();
},
onDownloadAs: function() {
if ( !this.appOptions.canDownload ) {
Common.Gateway.reportError(Asc.c_oAscError.ID.AccessDeny, this.errorAccessDeny);
return;
}
var type = /^(?:(djvu|xps|oxps))$/.exec(this.document.fileType);
if (type && typeof type[1] === 'string')
this.api.asc_DownloadOrigin(true);
else {
var options = new Asc.asc_CDownloadOptions(Asc.c_oAscFileType.DOCX, true);
options.asc_setIsSaveAs(true);
this.api.asc_DownloadAs(options);
}
},
onHyperlinkClick: function(url) {
if (url) {
var type = this.api.asc_getUrlType(url);
if (type===AscCommon.c_oAscUrlType.Http || type===AscCommon.c_oAscUrlType.Email)
window.open(url);
else {
var me = this;
setTimeout(function() {
Common.UI.warning({
maxwidth: 500,
msg: Common.Utils.String.format(me.txtWarnUrl, url),
buttons: ['no', 'yes'],
primary: 'no',
callback: function(btn) {
try {
(btn == 'yes') && window.open(url);
} catch (err) {
err && console.log(err.stack);
}
}
});
}, 1);
}
}
},
onShowContentControlsActions: function(obj, x, y) {
if (this._isDisabled) return;
var me = this;
switch (obj.type) {
case Asc.c_oAscContentControlSpecificType.DateTime:
setTimeout(function() {
me.onShowDateActions(obj, x, y);
}, 1);
break;
case Asc.c_oAscContentControlSpecificType.Picture:
if (obj.pr && obj.pr.get_Lock) {
var lock = obj.pr.get_Lock();
if (lock == Asc.c_oAscSdtLockType.SdtContentLocked || lock==Asc.c_oAscSdtLockType.ContentLocked)
return;
}
setTimeout(function() {
me.onShowImageActions(obj, x, y);
}, 1);
break;
case Asc.c_oAscContentControlSpecificType.Signature:
if (obj.pr && obj.pr.get_Lock) {
var lock = obj.pr.get_Lock();
if (lock == Asc.c_oAscSdtLockType.SdtContentLocked || lock==Asc.c_oAscSdtLockType.ContentLocked)
return;
}
me.api.asc_addImage(obj.pr);
setTimeout(function(){
me.api.asc_UncheckContentControlButtons();
}, 500);
break;
case Asc.c_oAscContentControlSpecificType.DropDownList:
case Asc.c_oAscContentControlSpecificType.ComboBox:
setTimeout(function() {
me.onShowListActions(obj, x, y);
}, 1);
break;
}
},
onHideContentControlsActions: function() {
this.listControlMenu && this.listControlMenu.isVisible() && this.listControlMenu.hide();
this.imageControlMenu && this.imageControlMenu.isVisible() && this.imageControlMenu.hide();
var controlsContainer = this.boxSdk.find('#calendar-control-container');
if (controlsContainer.is(':visible'))
controlsContainer.hide();
},
onShowImageActions: function(obj, x, y) {
var menu = this.imageControlMenu,
menuContainer = menu ? this.boxSdk.find(Common.Utils.String.format('#menu-container-{0}', menu.id)) : null,
me = this;
this.internalFormObj = obj ? obj.pr : null;
this._fromShowContentControls = true;
Common.UI.Menu.Manager.hideAll();
if (!menu) {
this.imageControlMenu = menu = new Common.UI.Menu({
maxHeight: 207,
menuAlign: 'tl-bl',
items: [
{caption: this.mniImageFromFile, value: 'file'},
{caption: this.mniImageFromUrl, value: 'url'},
{caption: this.mniImageFromStorage, value: 'storage', visible: this.appOptions.canRequestInsertImage || this.appOptions.fileChoiceUrl && this.appOptions.fileChoiceUrl.indexOf("{documentType}")>-1}
]
});
menu.on('item:click', function(menu, item) {
setTimeout(function(){
me.onImageSelect(menu, item);
}, 1);
setTimeout(function(){
me.api.asc_UncheckContentControlButtons();
}, 500);
});
// Prepare menu container
if (!menuContainer || menuContainer.length < 1) {
menuContainer = $(Common.Utils.String.format('