/* * * (c) Copyright Ascensio System SIA 2010-2019 * * 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-12 Ernesta Birznieka-Upisha * 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 * */ if (window.Common === undefined) { window.Common = {}; } if (Common.Utils === undefined) { Common.Utils = {}; } function _extend_object(dest, source) { if ( typeof _ != "undefined" ) { return _.extend({}, dest, source); } else if ( !!Object ) { return Object.assign({}, dest, source); } return source; } var utils = new(function() { var userAgent = navigator.userAgent.toLowerCase(), check = function(regex){ return regex.test(userAgent); }, isStrict = document.compatMode == "CSS1Compat", version = function (is, regex) { var m; return (is && (m = regex.exec(userAgent))) ? parseFloat(m[1]) : 0; }, docMode = document.documentMode, isEdge = check(/edge/), isOpera = check(/opera/), isOpera10_5 = isOpera && check(/version\/10\.5/), isIE = !isOpera && (check(/msie/) || check(/trident/) || check(/edge/)), isIE7 = isIE && ((check(/msie 7/) && docMode != 8 && docMode != 9 && docMode != 10) || docMode == 7), isIE8 = isIE && ((check(/msie 8/) && docMode != 7 && docMode != 9 && docMode != 10) || docMode == 8), isIE9 = isIE && ((check(/msie 9/) && docMode != 7 && docMode != 8 && docMode != 10) || docMode == 9), isIE10 = isIE && ((check(/msie 10/) && docMode != 7 && docMode != 8 && docMode != 9) || docMode == 10), isIE11 = isIE && ((check(/trident\/7\.0/) && docMode != 7 && docMode != 8 && docMode != 9 && docMode != 10) || docMode == 11), isIE6 = isIE && check(/msie 6/), isChrome = !isIE && check(/\bchrome\b/), isWebKit = !isIE && check(/webkit/), isSafari = !isIE && !isChrome && check(/safari/), isSafari2 = isSafari && check(/applewebkit\/4/), // unique to Safari 2 isSafari3 = isSafari && check(/version\/3/), isSafari4 = isSafari && check(/version\/4/), isSafari5_0 = isSafari && check(/version\/5\.0/), isSafari5 = isSafari && check(/version\/5/), isGecko = !isWebKit && !isIE && check(/gecko/), // IE11 adds "like gecko" into the user agent string isGecko3 = isGecko && check(/rv:1\.9/), isGecko4 = isGecko && check(/rv:2\.0/), isGecko5 = isGecko && check(/rv:5\./), isGecko10 = isGecko && check(/rv:10\./), isFF3_0 = isGecko3 && check(/rv:1\.9\.0/), isFF3_5 = isGecko3 && check(/rv:1\.9\.1/), isFF3_6 = isGecko3 && check(/rv:1\.9\.2/), isWindows = check(/windows|win32/), isMac = check(/macintosh|mac os x/), isLinux = check(/linux/), chromeVersion = version(true, /\bchrome\/(\d+\.\d+)/), firefoxVersion = version(true, /\bfirefox\/(\d+\.\d+)/), ieVersion = version(isIE, /msie (\d+\.\d+)/), operaVersion = version(isOpera, /version\/(\d+\.\d+)/), safariVersion = version(isSafari, /version\/(\d+\.\d+)/), webKitVersion = version(isWebKit, /webkit\/(\d+\.\d+)/), isSecure = /^https/i.test(window.location.protocol), emailRe = /^(mailto:)?([a-z0-9'\._-]+@[a-z0-9\.-]+\.[a-z0-9]{2,4})([a-яё0-9\._%+-=\? :&]*)/i, ipRe = /^(((https?)|(ftps?)):\/\/)?([\-\wа-яё]*:?[\-\wа-яё]*@)?(((1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])\.){3}(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9]))(:\d+)?(\/[%\-\wа-яё]*(\.[\wа-яё]{2,})?(([\wа-яё\-\.\?\\\/+@&#;:`~=%!,\(\)]*)(\.[\wа-яё]{2,})?)*)*\/?/i, hostnameRe = /^(((https?)|(ftps?)):\/\/)?([\-\wа-яё]*:?[\-\wа-яё]*@)?(([\-\wа-яё]+\.)+[\wа-яё\-]{2,}(:\d+)?(\/[%\-\wа-яё]*(\.[\wа-яё]{2,})?(([\wа-яё\-\.\?\\\/\+@&#;:`'~=%!,\(\)]*)(\.[\wа-яё]{2,})?)*)*\/?)/i, localRe = /^(((https?)|(ftps?)):\/\/)([\-\wа-яё]*:?[\-\wа-яё]*@)?(([\-\wа-яё]+)(:\d+)?(\/[%\-\wа-яё]*(\.[\wа-яё]{2,})?(([\wа-яё\-\.\?\\\/\+@&#;:`'~=%!,\(\)]*)(\.[\wа-яё]{2,})?)*)*\/?)/i, emailStrongRe = /(mailto:)?([a-z0-9'\._-]+@[a-z0-9\.-]+\.[a-z0-9]{2,4})([a-яё0-9\._%+-=\?:&]*)/ig, emailAddStrongRe = /(mailto:|\s[@]|\s[+])?([a-z0-9'\._-]+@[a-z0-9\.-]+\.[a-z0-9]{2,4})([a-яё0-9\._%\+-=\?:&]*)/ig, ipStrongRe = /(((https?)|(ftps?)):\/\/([\-\wа-яё]*:?[\-\wа-яё]*@)?)(((1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])\.){3}(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9]))(:\d+)?(\/[%\-\wа-яё]*(\.[\wа-яё]{2,})?(([\wа-яё\-\.\?\\\/\+@&#;:`~=%!,\(\)]*)(\.[\wа-яё]{2,})?)*)*\/?/ig, hostnameStrongRe = /((((https?)|(ftps?)):\/\/([\-\wа-яё]*:?[\-\wа-яё]*@)?)|(([\-\wа-яё]*:?[\-\wа-яё]*@)?www\.))((([\-\wа-яё]+\.)+[\wа-яё\-]{2,}|([\-\wа-яё]+))(:\d+)?(\/[%\-\wа-яё]*(\.[\wа-яё]{2,})?(([\wа-яё\-\.\?\\\/\+@&#;:`~=%!,\(\)]*)(\.[\wа-яё]{2,})?)*)*\/?)/ig, documentSettingsType = { Paragraph : 0, Table : 1, Header : 2, TextArt : 3, Shape : 4, Image : 5, Slide : 6, Chart : 7, MailMerge : 8, Signature : 9, Pivot : 10, Cell : 11, Slicer : 12, Form : 13 }, importTextType = { DRM: 0, CSV: 1, TXT: 2, Paste: 3, Columns: 4, Data: 5 }, isMobile = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent || navigator.vendor || window.opera), me = this, checkSize = function() { var scale = {}; if ( !!window.AscCommon && !!window.AscCommon.checkDeviceScale ) { scale = window.AscCommon.checkDeviceScale(); AscCommon.correctApplicationScale(scale); } else { var str_mq_125 = "screen and (-webkit-min-device-pixel-ratio: 1.25) and (-webkit-max-device-pixel-ratio: 1.49), " + "screen and (min-resolution: 1.25dppx) and (max-resolution: 1.49dppx)"; var str_mq_150 = "screen and (-webkit-min-device-pixel-ratio: 1.5) and (-webkit-max-device-pixel-ratio: 1.74), " + "screen and (min-resolution: 1.5dppx) and (max-resolution: 1.74dppx)"; var str_mq_175 = "screen and (-webkit-min-device-pixel-ratio: 1.75) and (-webkit-max-device-pixel-ratio: 1.99), " + "screen and (min-resolution: 1.75dppx) and (max-resolution: 1.99dppx)"; var str_mq_200 = "screen and (-webkit-min-device-pixel-ratio: 2), " + "screen and (min-resolution: 2dppx), screen and (min-resolution: 192dpi)"; if ( window.matchMedia(str_mq_125).matches ) { scale.devicePixelRatio = 1.5; } else if ( window.matchMedia(str_mq_150).matches ) { scale.devicePixelRatio = 1.5; } else if ( window.matchMedia(str_mq_175).matches ) { scale.devicePixelRatio = 1.75; } else if ( window.matchMedia(str_mq_200).matches ) scale.devicePixelRatio = 2; else scale.devicePixelRatio = 1; } var $root = $(document.body); var classes = document.body.className; var clear_list = classes.replace(/pixel-ratio__[\w-]+/gi,'').trim(); if ( scale.devicePixelRatio < 1.25 ) { if ( /pixel-ratio__/.test(classes) ) { document.body.className = clear_list; } } else if ( scale.devicePixelRatio < 1.5 ) { if ( !/pixel-ratio__1_25/.test(classes) ) { document.body.className = clear_list + ' pixel-ratio__1_25'; } } else if ( scale.devicePixelRatio < 1.75 ) { if ( !/pixel-ratio__1_5/.test(classes) ) { document.body.className = clear_list + ' pixel-ratio__1_5'; } } else if ( !(scale.devicePixelRatio < 1.75) && scale.devicePixelRatio < 2 ) { if ( !/pixel-ratio__1_75/.test(classes) ) { document.body.className = clear_list + ' pixel-ratio__1_75'; } } else { $root.addClass('pixel-ratio__2'); if ( !/pixel-ratio__2/.test(classes) ) { document.body.className = clear_list + ' pixel-ratio__2'; } } me.zoom = scale.correct ? scale.zoom : 1; me.innerWidth = window.innerWidth * me.zoom; me.innerHeight = window.innerHeight * me.zoom; me.applicationPixelRatio = scale.applicationPixelRatio || scale.devicePixelRatio; }; me.zoom = 1; me.applicationPixelRatio = 1; me.innerWidth = window.innerWidth; me.innerHeight = window.innerHeight; if ( isIE ) $(document.body).addClass('ie'); else { checkSize(); $(window).on('resize', checkSize); } return { checkSize: checkSize, userAgent: userAgent, isStrict: isStrict, isIEQuirks: isIE && (!isStrict && (isIE6 || isIE7 || isIE8 || isIE9)), isOpera : isOpera, isOpera10_5 : isOpera10_5, isWebKit : isWebKit, isChrome : isChrome, isSafari : isSafari, isSafari3 : isSafari3, isSafari4 : isSafari4, isSafari5 : isSafari5, isSafari5_0 : isSafari5_0, isSafari2 : isSafari2, isIE : isIE, isIE6 : isIE6, isIE7 : isIE7, isIE7m : isIE6 || isIE7, isIE7p : isIE && !isIE6, isIE8 : isIE8, isIE8m : isIE6 || isIE7 || isIE8, isIE8p : isIE && !(isIE6 || isIE7), isIE9 : isIE9, isIE9m : isIE6 || isIE7 || isIE8 || isIE9, isIE9p : isIE && !(isIE6 || isIE7 || isIE8), isIE10 : isIE10, isIE10m : isIE6 || isIE7 || isIE8 || isIE9 || isIE10, isIE10p : isIE && !(isIE6 || isIE7 || isIE8 || isIE9), isIE11: isIE11, isIE11m : isIE6 || isIE7 || isIE8 || isIE9 || isIE10 || isIE11, isIE11p : isIE && !(isIE6 || isIE7 || isIE8 || isIE9 || isIE10), isGecko : isGecko, isGecko3 : isGecko3, isGecko4 : isGecko4, isGecko5 : isGecko5, isGecko10 : isGecko10, isFF3_0 : isFF3_0, isFF3_5 : isFF3_5, isFF3_6 : isFF3_6, isFF4 : 4 <= firefoxVersion && firefoxVersion < 5, isFF5 : 5 <= firefoxVersion && firefoxVersion < 6, isFF10 : 10 <= firefoxVersion && firefoxVersion < 11, isLinux : isLinux, isWindows : isWindows, isMac : isMac, chromeVersion: chromeVersion, firefoxVersion: firefoxVersion, ieVersion: ieVersion, operaVersion: operaVersion, safariVersion: safariVersion, webKitVersion: webKitVersion, isSecure: isSecure, emailRe: emailRe, ipRe: ipRe, hostnameRe: hostnameRe, localRe: localRe, emailStrongRe: emailStrongRe, emailAddStrongRe: emailAddStrongRe, ipStrongRe: ipStrongRe, hostnameStrongRe: hostnameStrongRe, documentSettingsType: documentSettingsType, importTextType: importTextType, zoom: function() {return me.zoom;}, applicationPixelRatio: function() {return me.applicationPixelRatio;}, topOffset: 0, innerWidth: function() {return me.innerWidth;}, innerHeight: function() {return me.innerHeight;}, croppedGeometry: function() {return {left:0, top: Common.Utils.InternalSettings.get('window-inactive-area-top'), width: me.innerWidth, height: me.innerHeight - Common.Utils.InternalSettings.get('window-inactive-area-top')}} } })(); Common.Utils = _extend_object(Common.Utils, utils); Common.Utils.ThemeColor = new(function() { return { ThemeValues: [6, 15, 7, 16, 0, 1, 2, 3, 4, 5], setColors: function(colors, standart_colors) { var i, j, item; if (standart_colors && standart_colors.length > 0) { var standartcolors = []; for (i = 0; i < standart_colors.length; i++) { item = this.getHexColor(standart_colors[i].get_r(), standart_colors[i].get_g(), standart_colors[i].get_b()); standartcolors.push(item); } this.standartcolors = standartcolors; } var effectСolors= []; for (i = 0; i < 6; i++) { for (j = 0; j < 10; j++) { var idx = i + j * 6; item = { color: this.getHexColor(colors[idx].get_r(), colors[idx].get_g(), colors[idx].get_b()), effectId: idx, effectValue: this.ThemeValues[j] }; effectСolors.push(item); } } this.effectcolors = effectСolors; }, getEffectColors: function() { return this.effectcolors; }, getStandartColors: function() { return this.standartcolors; }, getHexColor: function(r, g, b){ r = r.toString(16); g = g.toString(16); b = b.toString(16); if (r.length == 1) r = '0' + r; if (g.length == 1) g = '0' + g; if (b.length == 1) b = '0' + b; return r + g + b; }, getRgbColor: function(clr){ var color = (typeof(clr) == 'object') ? clr.color : clr; color=color.replace(/#/,''); if(color.length==3) color=color.replace(/(.)/g,'$1$1'); color=parseInt(color,16); var c = new Asc.asc_CColor(); c.put_type( (typeof(clr) == 'object' && clr.effectId !== undefined)? Asc.c_oAscColor.COLOR_TYPE_SCHEME : Asc.c_oAscColor.COLOR_TYPE_SRGB); c.put_r(color>>16); c.put_g((color&0xff00)>>8); c.put_b(color&0xff); c.put_a(0xff); if (clr.effectId !== undefined) c.put_value(clr.effectId); return c; }, colorValue2EffectId: function(clr){ if (typeof(clr) == 'object' && clr && clr.effectValue !== undefined && this.effectcolors) { for (var i = 0; i < this.effectcolors.length; i++) { if (this.effectcolors[i].effectValue===clr.effectValue && clr.color.toUpperCase()===this.effectcolors[i].color.toUpperCase()) { clr.effectId = this.effectcolors[i].effectId; break; } } } return clr; } } })(); var metrics = new(function() { var me = this; me.c_MetricUnits = { cm: 0, pt: 1, inch: 2 }; me.currentMetric = me.c_MetricUnits.pt; me.metricName = ['Cm', 'Pt', 'Inch']; me.defaultMetric = me.c_MetricUnits.cm; return { c_MetricUnits: me.c_MetricUnits, txtCm : 'cm', txtPt : 'pt', txtInch : '\"', setCurrentMetric: function(value) { me.currentMetric = value; }, getCurrentMetric: function() { return me.currentMetric; }, getCurrentMetricName: function() { return this['txt' + me.metricName[me.currentMetric]]; }, getMetricName: function(unit) { return this['txt' + me.metricName[(unit !== undefined) ? unit : 0]]; }, setDefaultMetric: function(value) { me.defaultMetric = value; }, getDefaultMetric: function() { return me.defaultMetric; }, fnRecalcToMM: function(value) { // value in pt/cm/inch. need to convert to mm if (value!==null && value!==undefined) { switch (me.currentMetric) { case me.c_MetricUnits.cm: return value * 10; case me.c_MetricUnits.pt: return value * 25.4 / 72.0; case me.c_MetricUnits.inch: return value * 25.4; } } return value; }, fnRecalcFromMM: function(value) { // value in mm. need to convert to pt/cm/inch switch (me.currentMetric) { case me.c_MetricUnits.cm: return parseFloat((value/10.).toFixed(4)); case me.c_MetricUnits.pt: return parseFloat((value * 72.0 / 25.4).toFixed(3)); case me.c_MetricUnits.inch: return parseFloat((value / 25.4).toFixed(3)); } return value; } } })(); Common.Utils.Metric = _extend_object(Common.Utils.Metric, metrics); Common.Utils.RGBColor = function(colorString) { var r, g, b; if (colorString.charAt(0) == '#') { colorString = colorString.substr(1,6); } colorString = colorString.replace(/ /g,''); colorString = colorString.toLowerCase(); var colorDefinitions = [ { re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, // example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], process: function (bits){ return [ parseInt(bits[1]), parseInt(bits[2]), parseInt(bits[3]) ]; } }, { re: /^hsb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, // example: ['hsb(123, 34, 100)'], process: function (bits){ var rgb = {}; var h = Math.round(bits[1]); var s = Math.round(bits[2] * 255 / 100); var v = Math.round(bits[3] * 255 / 100); if(s == 0) { rgb.r = rgb.g = rgb.b = v; } else { var t1 = v; var t2 = (255 - s) * v / 255; var t3 = (t1 - t2) * (h % 60) / 60; if (h == 360) h = 0; if (h < 60) {rgb.r = t1; rgb.b = t2; rgb.g = t2 + t3} else if (h < 120) {rgb.g = t1; rgb.b = t2; rgb.r = t1 - t3} else if (h < 180) {rgb.g = t1; rgb.r = t2; rgb.b = t2 + t3} else if (h < 240) {rgb.b = t1; rgb.r = t2; rgb.g = t1 - t3} else if (h < 300) {rgb.b = t1; rgb.g = t2; rgb.r = t2 + t3} else if (h < 360) {rgb.r = t1; rgb.g = t2; rgb.b = t1 - t3} else {rgb.r = 0; rgb.g = 0; rgb.b = 0} } return [ Math.round(rgb.r), Math.round(rgb.g), Math.round(rgb.b) ]; } }, { re: /^(\w{2})(\w{2})(\w{2})$/, // example: ['#00ff00', '336699'], process: function (bits){ return [ parseInt(bits[1], 16), parseInt(bits[2], 16), parseInt(bits[3], 16) ]; } }, { re: /^(\w{1})(\w{1})(\w{1})$/, // example: ['#fb0', 'f0f'], process: function (bits){ return [ parseInt(bits[1] + bits[1], 16), parseInt(bits[2] + bits[2], 16), parseInt(bits[3] + bits[3], 16) ]; } } ]; for (var i = 0; i < colorDefinitions.length; i++) { var re = colorDefinitions[i].re; var processor = colorDefinitions[i].process; var bits = re.exec(colorString); if (bits) { var channels = processor(bits); r = channels[0]; g = channels[1]; b = channels[2]; } } r = (r < 0 || isNaN(r)) ? 0 : ((r > 255) ? 255 : r); g = (g < 0 || isNaN(g)) ? 0 : ((g > 255) ? 255 : g); b = (b < 0 || isNaN(b)) ? 0 : ((b > 255) ? 255 : b); var isEqual = function(color){ return ((r == color.r) && (g == color.g) && (b == color.b)); }; var toRGB = function() { return 'rgb(' + r + ', ' + g + ', ' + b + ')'; }; var toRGBA = function(alfa) { if (alfa===undefined) alfa = 1; return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alfa + ')'; }; var toHex = function() { var _r = r.toString(16); var _g = g.toString(16); var _b = b.toString(16); if (_r.length == 1) _r = '0' + _r; if (_g.length == 1) _g = '0' + _g; if (_b.length == 1) _b = '0' + _b; return '#' + _r + _g + _b; }; var toHSB = function() { var hsb = { h: 0, s: 0, b: 0 }; var min = Math.min(r, g, b); var max = Math.max(r, g, b); var delta = max - min; hsb.b = max; hsb.s = max != 0 ? 255 * delta / max : 0; if (hsb.s != 0) { if (r == max) { hsb.h = 0 + (g - b) / delta; } else if (g == max) { hsb.h = 2 + (b - r) / delta; } else { hsb.h = 4 + (r - g) / delta; } } else { hsb.h = 0; } hsb.h *= 60; if (hsb.h < 0) { hsb.h += 360; } hsb.s *= 100 / 255; hsb.b *= 100 / 255; hsb.h = parseInt(hsb.h); hsb.s = parseInt(hsb.s); hsb.b = parseInt(hsb.b); return hsb; }; return { r : r, g : g, b : b, isEqual : isEqual, toRGB : toRGB, toRGBA : toRGBA, toHex : toHex, toHSB : toHSB } }; Common.Utils.String = new (function() { return { format: function(format) { var args = _.toArray(arguments).slice(1); if (args.length && typeof args[0] == 'object') args = args[0]; return format.replace(/\{(\d+)\}/g, function(s, i) { return args[i]; }); }, htmlEncode: function(string) { return (typeof _ !== 'undefined') ? _.escape(string) : string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string }, htmlDecode: function(string) { return _.unescape(string); }, ellipsis: function(value, len, word) { if (value && value.length > len) { if (word) { var vs = value.substr(0, len - 2), index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?')); if (index !== -1 && index >= (len - 15)) { return vs.substr(0, index) + "..."; } } return value.substr(0, len - 3) + "..."; } return value; }, platformKey: function(string, template, hookFn) { if (_.isEmpty(template)) template = ' ({0})'; if (Common.Utils.isMac) { if (_.isFunction(hookFn)) { string = hookFn.call(this, string); } return Common.Utils.String.format(template, string.replace(/\+(?=\S)/g, '').replace(/Ctrl|ctrl/g, '⌘').replace(/Alt|alt/g, '⌥').replace(/Shift|shift/g, '⇧')); } return Common.Utils.String.format(template, string); }, parseFloat: function(string) { (typeof string === 'string') && (string = string.replace(',', '.')); return parseFloat(string) }, encodeSurrogateChar: function(nUnicode) { if (nUnicode < 0x10000) { return String.fromCharCode(nUnicode); } else { nUnicode = nUnicode - 0x10000; var nLeadingChar = 0xD800 | (nUnicode >> 10); var nTrailingChar = 0xDC00 | (nUnicode & 0x3FF); return String.fromCharCode(nLeadingChar) + String.fromCharCode(nTrailingChar); } }, fixedDigits: function(num, digits, fill) { (fill===undefined) && (fill = '0'); var strfill = "", str = num.toString(); for (var i=str.length; i0) return; var editor = (window.DE ? 'Document' : window.SSE ? 'Spreadsheet' : window.PE ? 'Presentation' : 'that'); var newDiv = document.createElement("div"); newDiv.innerHTML = '
' + '
' + '
' + '
Your browser is not supported.
' + '
Sorry, ' + editor + ' Editor is currently only supported in the latest versions of the Chrome, Firefox, Safari or Internet Explorer web browsers.
' + '
' + '
' + '
' + '
'; document.body.appendChild(newDiv); $('#loading-mask').hide().remove(); $('#viewport').hide().remove(); }; Common.Utils.applyCustomization = function(config, elmap) { for (var name in config) { var $el; if (!!elmap[name]) { $el = $(elmap[name]); if ($el.length) { var item = config[name]; if (item === false || item.visible === false) { $el.hide() } else { if (!!item.text) { $el.text(item.text); } if (item.visible === false) { $el.hide(); } } } } } }; Common.Utils.applyCustomizationPlugins = function(plugins) { if (!plugins || plugins.length<1) return; var _createXMLHTTPObject = function() { var xmlhttp; if (typeof XMLHttpRequest != 'undefined') { xmlhttp = new XMLHttpRequest(); } else { try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } } return xmlhttp; }; var _getPluginCode = function(url) { if (!url) return ''; try { var xhrObj = _createXMLHTTPObject(); if (xhrObj && url) { xhrObj.open('GET', url, false); xhrObj.send(''); if (xhrObj.status == 200) eval(xhrObj.responseText); } } catch (e) {} return null; }; plugins.forEach(function(url){ if (url) _getPluginCode(url); }); }; Common.Utils.fillUserInfo = function(info, lang, defname, defid) { var _user = info || {}; _user.anonymous = !_user.id; !_user.id && (_user.id = defid); _user.fullname = !_user.name ? defname : _user.name; _user.group && (_user.fullname = (_user.group).toString() + AscCommon.UserInfoParser.getSeparator() + _user.fullname); _user.guest = !_user.name; return _user; }; Common.Utils.createXhr = function () { var xmlhttp; if (typeof XMLHttpRequest != 'undefined') { xmlhttp = new XMLHttpRequest(); } else { try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } } return xmlhttp; }; Common.Utils.getConfigJson = function (url) { if ( url ) { try { var xhrObj = Common.Utils.createXhr(); if ( xhrObj ) { xhrObj.open('GET', url, false); xhrObj.send(''); return JSON.parse(xhrObj.responseText); } } catch (e) {} } return null; }; Common.Utils.loadConfig = function(url, callback) { fetch(url, { method: 'get', headers: { 'Accept': 'application/json', }, }).then(function(response){ if ( response.ok ) return response.json(); else return 'error'; }).then(function(json){ callback(json); }).catch(function(e) { callback('error'); }); }; Common.Utils.asyncCall = function (callback, scope, args) { (new Promise(function (resolve, reject) { resolve(); })).then(function () { callback.call(scope, args); }); }; // Extend javascript String type String.prototype.strongMatch = function(regExp){ if (regExp && regExp instanceof RegExp) { var arr = this.toString().match(regExp); return !!(arr && arr.length > 0 && arr[0].length == this.length); } return false; }; Common.Utils.InternalSettings = new(function() { var settings = {}; var _get = function(name) { return settings[name]; }, _set = function(name, value) { settings[name] = value; }; return { get: _get, set: _set } }); Common.Utils.lockControls = function(causes, lock, opts, defControls) { !opts && (opts = {}); var controls = opts.array || defControls; opts.merge && (controls = _.union(defControls,controls)); function doLock(cmp, cause) { if ( cmp && cmp.options && _.contains(cmp.options.lock, cause) ) { var index = cmp.keepState.indexOf(cause); if (lock) { if (index < 0) { cmp.keepState.push(cause); } } else { if (!(index < 0)) { cmp.keepState.splice(index, 1); } } } } _.each(controls, function(item) { if (item && _.isFunction(item.setDisabled)) { !item.keepState && (item.keepState = []); if (opts.clear && opts.clear.length > 0 && item.keepState.length > 0) { item.keepState = _.difference(item.keepState, opts.clear); } _.isArray(causes) ? _.each(causes, function(c) {doLock(item, c)}) : doLock(item, causes); if (!(item.keepState.length > 0)) { item.isDisabled() && item.setDisabled(false); } else { !item.isDisabled() && item.setDisabled(true); } } }); }; Common.Utils.injectButtons = function($slots, id, iconCls, caption, lock, split, menu, toggle, dataHint, dataHintDirection, dataHintOffset, dataHintTitle) { var btnsArr = createButtonSet(); btnsArr.setDisabled(true); id = id || ("id-toolbar-" + iconCls); $slots.each(function(index, el) { var _cls = 'btn-toolbar'; /x-huge/.test(el.className) && (_cls += ' x-huge icon-top'); var button = new Common.UI.Button({ parentEl: $slots.eq(index), id: id + index, cls: _cls, iconCls: iconCls, caption: caption, split: split || false, menu: menu || false, enableToggle: toggle || false, lock: lock, disabled: true, dataHint: dataHint, dataHintDirection: dataHintDirection, dataHintOffset: dataHintOffset, dataHintTitle: dataHintTitle }); btnsArr.add(button); }); return btnsArr; }; Common.Utils.injectComponent = function ($slot, cmp) { if (cmp && $slot.length) { cmp.rendered ? $slot.append(cmp.$el) : cmp.render($slot); } }; Common.Utils.warningDocumentIsLocked = function (opts) { if ( opts.disablefunc ) opts.disablefunc(true); var app = window.DE || window.PE || window.SSE; Common.UI.warning({ msg: Common.Locale.get("warnFileLocked",{name:"Common.Translation", default: "You can't edit this file. Document is in use by another application."}), buttons: [{ value: 'view', caption: Common.Locale.get("warnFileLockedBtnView",{name:"Common.Translation", default: "Open for viewing"}) }, { value: 'edit', caption: Common.Locale.get("warnFileLockedBtnEdit",{name:"Common.Translation", default: "Create a copy"}) }], primary: 'view', callback: function(btn){ if (btn == 'edit') { if ( opts.disablefunc ) opts.disablefunc(false); app.getController('Main').api.asc_setIsReadOnly(false); } } }); }; jQuery.fn.extend({ elementById: function (id, parent) { /** * usage: $obj.findById('#id') * $().findById('#id', $obj | node) * $.fn.findById('#id', $obj | node) * * return: dom element * */ var _el = document.getElementById(id.substring(1)); if ( !_el ) { parent = parent || this; if ( parent instanceof jQuery ) { parent.each(function (i, node) { _el = node.querySelectorAll(id); if ( _el.length == 0 ) { if ( ('#' + node.id) == id ) { _el = node; return false; } } else if ( _el.length ) { _el = _el[0]; return false; } }) } else { _el = parent.querySelectorAll(id); if ( _el && _el.length ) return _el[0]; } } return _el; }, findById: function (id, parent) { var _el = $.fn.elementById.apply(this, arguments); return !!_el ? $(_el) : $(); } }); Common.Utils.InternalSettings.set('toolbar-height-tabs', 32); Common.Utils.InternalSettings.set('toolbar-height-tabs-top-title', 28); Common.Utils.InternalSettings.set('toolbar-height-controls', 67); Common.Utils.InternalSettings.set('document-title-height', 28); Common.Utils.InternalSettings.set('window-inactive-area-top', 0); Common.Utils.InternalSettings.set('toolbar-height-compact', Common.Utils.InternalSettings.get('toolbar-height-tabs')); Common.Utils.InternalSettings.set('toolbar-height-normal', Common.Utils.InternalSettings.get('toolbar-height-tabs') + Common.Utils.InternalSettings.get('toolbar-height-controls')); Common.Utils.ModalWindow = new(function() { var count = 0; return { show: function() { count++; }, close: function() { count--; }, isVisible: function() { return count>0; } } })(); Common.Utils.UserInfoParser = new(function() { var parse = false; var separator = String.fromCharCode(160); return { setParser: function(value) { parse = !!value; }, getSeparator: function() { return separator; }, getParsedName: function(username) { if (parse && username) { return username.substring(username.indexOf(separator)+1); } else return username; }, getParsedGroups: function(username) { if (parse && username) { var idx = username.indexOf(separator), groups = (idx>-1) ? username.substring(0, idx).split(',') : []; for (var i=0; i