993 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			993 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) Ascensio System SIA 2013. All rights reserved
 | 
						|
 *
 | 
						|
 * http://www.onlyoffice.com
 | 
						|
 */
 | 
						|
 | 
						|
;(function(DocsAPI, window, document, undefined) {
 | 
						|
 | 
						|
    /*
 | 
						|
 | 
						|
        # Full #
 | 
						|
 | 
						|
        config = {
 | 
						|
            type: 'desktop or mobile or embedded',
 | 
						|
            width: '100% by default',
 | 
						|
            height: '100% by default',
 | 
						|
            documentType: 'word' | 'cell' | 'slide',// deprecate 'text' | 'spreadsheet' | 'presentation',
 | 
						|
            token: <string> encrypted signature
 | 
						|
            document: {
 | 
						|
                title: 'document title',
 | 
						|
                url: 'document url'
 | 
						|
                fileType: 'document file type',
 | 
						|
                options: <advanced options>,
 | 
						|
                key: 'key',
 | 
						|
                vkey: 'vkey',
 | 
						|
                info: {
 | 
						|
                    owner: 'owner name',
 | 
						|
                    folder: 'path to document',
 | 
						|
                    uploaded: '<uploaded date>',
 | 
						|
                    sharingSettings: [
 | 
						|
                        {
 | 
						|
                            user: 'user name',
 | 
						|
                            permissions: '<permissions>',
 | 
						|
                            isLink: false
 | 
						|
                        },
 | 
						|
                        ...
 | 
						|
                    ],
 | 
						|
                    favorite: '<file is favorite>' // true/false/undefined (undefined - don't show fav. button)
 | 
						|
                },
 | 
						|
                permissions: {
 | 
						|
                    edit: <can edit>, // default = true
 | 
						|
                    download: <can download>, // default = true
 | 
						|
                    reader: <can view in readable mode>,
 | 
						|
                    review: <can review>, // default = edit
 | 
						|
                    print: <can print>, // default = true
 | 
						|
                    comment: <can comment in view mode> // default = edit,
 | 
						|
                    modifyFilter: <can add, remove and save filter in the spreadsheet> // default = true
 | 
						|
                    modifyContentControl: <can modify content controls in documenteditor> // default = true
 | 
						|
                    fillForms:  <can edit forms in view mode> // default = edit || review,
 | 
						|
                    copy: <can copy data> // default = true,
 | 
						|
                    editCommentAuthorOnly: <can edit your own comments only> // default = false
 | 
						|
                    deleteCommentAuthorOnly: <can delete your own comments only> // default = false,
 | 
						|
                    reviewGroups: ["Group1", ""] // current user can accept/reject review changes made by users from Group1 and users without a group. [] - use groups, but can't change any group's changes
 | 
						|
                    commentGroups: { // {} - use groups, but can't view/edit/delete any group's comments
 | 
						|
                         view: ["Group1", ""] // current user can view comments made by users from Group1 and users without a group.
 | 
						|
                         edit: ["Group1", ""] // current user can edit comments made by users from Group1 and users without a group.
 | 
						|
                         remove: ["Group1", ""] // current user can remove comments made by users from Group1 and users without a group.
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            },
 | 
						|
            editorConfig: {
 | 
						|
                actionLink: { // open file and scroll to data, used with onMakeActionLink or the onRequestSendNotify event
 | 
						|
                    action: {
 | 
						|
                        type: "bookmark", // or type="comment"
 | 
						|
                        data: <bookmark name> // or comment id
 | 
						|
                    }
 | 
						|
                },
 | 
						|
                mode: 'view or edit',
 | 
						|
                lang: <language code>,
 | 
						|
                location: <location>,
 | 
						|
                canCoAuthoring: <can coauthoring documents>,
 | 
						|
                canBackToFolder: <can return to folder> - deprecated. use "customization.goback" parameter,
 | 
						|
                createUrl: 'create document url', 
 | 
						|
                sharingSettingsUrl: 'document sharing settings url',
 | 
						|
                fileChoiceUrl: 'source url', // for mail merge or image from storage
 | 
						|
                callbackUrl: <url for connection between sdk and portal>,
 | 
						|
                mergeFolderUrl: 'folder for saving merged file', // must be deprecated, use saveAsUrl instead
 | 
						|
                saveAsUrl: 'folder for saving files'
 | 
						|
                licenseUrl: <url for license>,
 | 
						|
                customerId: <customer id>,
 | 
						|
                region: <regional settings> // can be 'en-us' or lang code
 | 
						|
 | 
						|
                user: {
 | 
						|
                    id: 'user id',
 | 
						|
                    name: 'user name',
 | 
						|
                    group: 'group name' // for customization.reviewPermissions parameter
 | 
						|
                },
 | 
						|
                recent: [
 | 
						|
                    {
 | 
						|
                        title: 'document title',
 | 
						|
                        url: 'document url',
 | 
						|
                        folder: 'path to document',
 | 
						|
                    },
 | 
						|
                    ...
 | 
						|
                ],
 | 
						|
                templates: [
 | 
						|
                    {
 | 
						|
                        title: 'template name', // name - is deprecated
 | 
						|
                        image: 'template icon url',
 | 
						|
                        url: 'http://...'
 | 
						|
                    },
 | 
						|
                    ...
 | 
						|
                ],
 | 
						|
                customization: {
 | 
						|
                    logo: {
 | 
						|
                        image: url,
 | 
						|
                        imageEmbedded: url,
 | 
						|
                        url: http://...
 | 
						|
                    },
 | 
						|
                    customer: {
 | 
						|
                        name: 'SuperPuper',
 | 
						|
                        address: 'New-York, 125f-25',
 | 
						|
                        mail: 'support@gmail.com',
 | 
						|
                        www: 'www.superpuper.com',
 | 
						|
                        info: 'Some info',
 | 
						|
                        logo: ''
 | 
						|
                    },
 | 
						|
                    about: true,
 | 
						|
                    feedback: {
 | 
						|
                        visible: false,
 | 
						|
                        url: http://...
 | 
						|
                    },
 | 
						|
                    goback: {
 | 
						|
                        url: 'http://...',
 | 
						|
                        text: 'Go to London',
 | 
						|
                        blank: true,
 | 
						|
                        requestClose: false // if true - goback send onRequestClose event instead opening url
 | 
						|
                    },
 | 
						|
                    reviewPermissions: {
 | 
						|
                        "Group1": ["Group2"], // users from Group1 can accept/reject review changes made by users from Group2
 | 
						|
                        "Group2": ["Group1", "Group2"] // users from Group2 can accept/reject review changes made by users from Group1 and Group2
 | 
						|
                        "Group3": [""] // users from Group3 can accept/reject review changes made by users without a group
 | 
						|
                    },
 | 
						|
                    anonymous: { // set name for anonymous user
 | 
						|
                        request: bool (default: true), // enable set name
 | 
						|
                        label: string (default: "Guest") // postfix for user name
 | 
						|
                    },
 | 
						|
                    review: {
 | 
						|
                        hideReviewDisplay: false, // hide button Review mode
 | 
						|
                        hoverMode: false, // true - show review balloons on mouse move, not on click on text
 | 
						|
                        showReviewChanges: false,
 | 
						|
                        reviewDisplay: 'original', // original for viewer, markup for editor
 | 
						|
                        trackChanges: undefined // true/false - open editor with track changes mode on/off,
 | 
						|
                    },
 | 
						|
                    chat: true,
 | 
						|
                    comments: true,
 | 
						|
                    zoom: 100,
 | 
						|
                    compactToolbar: false,
 | 
						|
                    leftMenu: true,
 | 
						|
                    rightMenu: true,
 | 
						|
                    hideRightMenu: false, // hide or show right panel on first loading
 | 
						|
                    toolbar: true,
 | 
						|
                    statusBar: true,
 | 
						|
                    autosave: true,
 | 
						|
                    forcesave: false,
 | 
						|
                    commentAuthorOnly: false, // must be deprecated. use permissions.editCommentAuthorOnly and permissions.deleteCommentAuthorOnly instead
 | 
						|
                    showReviewChanges: false, // must be deprecated. use customization.review.showReviewChanges instead
 | 
						|
                    help: true,
 | 
						|
                    compactHeader: false,
 | 
						|
                    toolbarNoTabs: false,
 | 
						|
                    toolbarHideFileName: false,
 | 
						|
                    reviewDisplay: 'original', // must be deprecated. use customization.review.reviewDisplay instead
 | 
						|
                    spellcheck: true,
 | 
						|
                    compatibleFeatures: false,
 | 
						|
                    unit: 'cm' // cm, pt, inch,
 | 
						|
                    mentionShare : true // customize tooltip for mention,
 | 
						|
                    macros: true // can run macros in document
 | 
						|
                    plugins: true // can run plugins in document
 | 
						|
                    macrosMode: 'warn' // warn about automatic macros, 'enable', 'disable', 'warn',
 | 
						|
                    trackChanges: undefined // true/false - open editor with track changes mode on/off,  // must be deprecated. use customization.review.trackChanges instead
 | 
						|
                    hideRulers: false // hide or show rulers on first loading (presentation or document editor)
 | 
						|
                    hideNotes: false // hide or show notes panel on first loading (presentation editor)
 | 
						|
                    uiTheme: 'theme-dark' // set interface theme: id or default-dark/default-light
 | 
						|
                },
 | 
						|
                 coEditing: {
 | 
						|
                     mode: 'fast', // <coauthoring mode>, 'fast' or 'strict'. if 'fast' and 'customization.autosave'=false -> set 'customization.autosave'=true
 | 
						|
                     change: true, // can change co-authoring mode
 | 
						|
                 },
 | 
						|
                plugins: {
 | 
						|
                    autostart: ['asc.{FFE1F462-1EA2-4391-990D-4CC84940B754}'],
 | 
						|
                    pluginsData: [
 | 
						|
                        "helloworld/config.json",
 | 
						|
                        "chess/config.json",
 | 
						|
                        "speech/config.json",
 | 
						|
                        "clipart/config.json",
 | 
						|
                    ]
 | 
						|
                },
 | 
						|
                wopi: { // only for wopi
 | 
						|
                    FileNameMaxLength: 250 // max filename length for rename, 250 by default
 | 
						|
                }
 | 
						|
            },
 | 
						|
            events: {
 | 
						|
                'onAppReady': <application ready callback>,
 | 
						|
                'onDocumentStateChange': <document state changed callback>
 | 
						|
                'onDocumentReady': <document ready callback>
 | 
						|
                'onRequestEditRights': <request rights for switching from view to edit>,
 | 
						|
                'onRequestHistory': <request version history>,// must call refreshHistory method
 | 
						|
                'onRequestHistoryData': <request version data>,// must call setHistoryData method
 | 
						|
                'onRequestRestore': <try to restore selected version>,
 | 
						|
                'onRequestHistoryClose': <request closing history>,
 | 
						|
                'onError': <error callback>,
 | 
						|
                'onWarning': <warning callback>,
 | 
						|
                'onInfo': <document open callback>,// send view or edit mode
 | 
						|
                'onOutdatedVersion': <outdated version callback>,// send when  previous version is opened
 | 
						|
                'onDownloadAs': <download as callback>,// send url of downloaded file as a response for downloadAs method
 | 
						|
                'onRequestSaveAs': <try to save copy of the document>,
 | 
						|
                'onCollaborativeChanges': <co-editing changes callback>,// send when other user co-edit document
 | 
						|
                'onRequestRename': <try to rename document>,
 | 
						|
                'onMetaChange': // send when meta information changed
 | 
						|
                'onRequestClose': <request close editor>,
 | 
						|
                'onMakeActionLink': <request link to document with bookmark, comment...>,// must call setActionLink method
 | 
						|
                'onRequestUsers': <request users list for mentions>,// must call setUsers method
 | 
						|
                'onRequestSendNotify': //send when user is mentioned in a comment,
 | 
						|
                'onRequestInsertImage': <try to insert image>,// must call insertImage method
 | 
						|
                'onRequestCompareFile': <request file to compare>,// must call setRevisedFile method
 | 
						|
                'onRequestSharingSettings': <request sharing settings>,// must call setSharingSettings method
 | 
						|
                'onRequestCreateNew': <try to create document>,
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        # Embedded #
 | 
						|
 | 
						|
        config = {
 | 
						|
            type: 'embedded',
 | 
						|
            width: '100% by default',
 | 
						|
            height: '100% by default',
 | 
						|
            documentType: 'word' | 'cell' | 'slide',// deprecate 'text' | 'spreadsheet' | 'presentation',
 | 
						|
            document: {
 | 
						|
                title: 'document title',
 | 
						|
                url: 'document url',
 | 
						|
                fileType: 'document file type',
 | 
						|
                key: 'key',
 | 
						|
                vkey: 'vkey'
 | 
						|
            },
 | 
						|
            editorConfig: {
 | 
						|
                licenseUrl: <url for license>,
 | 
						|
                customerId: <customer id>,
 | 
						|
                autostart: 'document',    // action for app's autostart. for presentations default value is 'player'
 | 
						|
                embedded: {
 | 
						|
                     embedUrl: 'url',
 | 
						|
                     fullscreenUrl: 'url',
 | 
						|
                     saveUrl: 'url',
 | 
						|
                     shareUrl: 'url',
 | 
						|
                     toolbarDocked: 'top or bottom'
 | 
						|
                }
 | 
						|
            },
 | 
						|
            events: {
 | 
						|
                'onAppReady': <application ready callback>,
 | 
						|
                'onBack': <back to folder callback>,
 | 
						|
                'onError': <error callback>,
 | 
						|
                'onDocumentReady': <document ready callback>,
 | 
						|
                'onWarning': <warning callback>
 | 
						|
            }
 | 
						|
        }
 | 
						|
    */
 | 
						|
 | 
						|
    // TODO: allow several instances on one page simultaneously
 | 
						|
 | 
						|
    DocsAPI.DocEditor = function(placeholderId, config) {
 | 
						|
        var _self = this,
 | 
						|
            _config = config || {};
 | 
						|
 | 
						|
        extend(_config, DocsAPI.DocEditor.defaultConfig);
 | 
						|
        _config.editorConfig.canUseHistory = _config.events && !!_config.events.onRequestHistory;
 | 
						|
        _config.editorConfig.canHistoryClose = _config.events && !!_config.events.onRequestHistoryClose;
 | 
						|
        _config.editorConfig.canHistoryRestore = _config.events && !!_config.events.onRequestRestore;
 | 
						|
        _config.editorConfig.canSendEmailAddresses = _config.events && !!_config.events.onRequestEmailAddresses;
 | 
						|
        _config.editorConfig.canRequestEditRights = _config.events && !!_config.events.onRequestEditRights;
 | 
						|
        _config.editorConfig.canRequestClose = _config.events && !!_config.events.onRequestClose;
 | 
						|
        _config.editorConfig.canRename = _config.events && !!_config.events.onRequestRename;
 | 
						|
        _config.editorConfig.canMakeActionLink = _config.events && !!_config.events.onMakeActionLink;
 | 
						|
        _config.editorConfig.canRequestUsers = _config.events && !!_config.events.onRequestUsers;
 | 
						|
        _config.editorConfig.canRequestSendNotify = _config.events && !!_config.events.onRequestSendNotify;
 | 
						|
        _config.editorConfig.mergeFolderUrl = _config.editorConfig.mergeFolderUrl || _config.editorConfig.saveAsUrl;
 | 
						|
        _config.editorConfig.canRequestSaveAs = _config.events && !!_config.events.onRequestSaveAs;
 | 
						|
        _config.editorConfig.canRequestInsertImage = _config.events && !!_config.events.onRequestInsertImage;
 | 
						|
        _config.editorConfig.canRequestMailMergeRecipients = _config.events && !!_config.events.onRequestMailMergeRecipients;
 | 
						|
        _config.editorConfig.canRequestCompareFile = _config.events && !!_config.events.onRequestCompareFile;
 | 
						|
        _config.editorConfig.canRequestSharingSettings = _config.events && !!_config.events.onRequestSharingSettings;
 | 
						|
        _config.editorConfig.canRequestCreateNew = _config.events && !!_config.events.onRequestCreateNew;
 | 
						|
        _config.frameEditorId = placeholderId;
 | 
						|
        _config.parentOrigin = window.location.origin;
 | 
						|
 | 
						|
        var onMouseUp = function (evt) {
 | 
						|
            _processMouse(evt);
 | 
						|
        };
 | 
						|
 | 
						|
        var _attachMouseEvents = function() {
 | 
						|
            if (window.addEventListener) {
 | 
						|
                window.addEventListener("mouseup", onMouseUp, false)
 | 
						|
            } else if (window.attachEvent) {
 | 
						|
                window.attachEvent("onmouseup", onMouseUp);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _detachMouseEvents = function() {
 | 
						|
            if (window.removeEventListener) {
 | 
						|
                window.removeEventListener("mouseup", onMouseUp, false)
 | 
						|
            } else if (window.detachEvent) {
 | 
						|
                window.detachEvent("onmouseup", onMouseUp);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _onAppReady = function() {
 | 
						|
            if (_config.type === 'mobile') {
 | 
						|
                document.body.onfocus = function(e) {
 | 
						|
                    setTimeout(function(){
 | 
						|
                        iframe.contentWindow.focus();
 | 
						|
 | 
						|
                        _sendCommand({
 | 
						|
                            command: 'resetFocus',
 | 
						|
                            data: {}
 | 
						|
                        })
 | 
						|
                    }, 10);
 | 
						|
                };
 | 
						|
            }
 | 
						|
 | 
						|
            _attachMouseEvents();
 | 
						|
 | 
						|
            if (_config.editorConfig) {
 | 
						|
                _init(_config.editorConfig);
 | 
						|
            }
 | 
						|
 | 
						|
            if (_config.document) {
 | 
						|
                _openDocument(_config.document);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _callLocalStorage = function(data) {
 | 
						|
            if (data.cmd == 'get') {
 | 
						|
                if (data.keys && data.keys.length) {
 | 
						|
                    var af = data.keys.split(','), re = af[0];
 | 
						|
                    for (i = 0; ++i < af.length;)
 | 
						|
                        re += '|' + af[i];
 | 
						|
 | 
						|
                    re = new RegExp(re); k = {};
 | 
						|
                    for (i in localStorage)
 | 
						|
                        if (re.test(i)) k[i] = localStorage[i];
 | 
						|
                } else {
 | 
						|
                    k = localStorage;
 | 
						|
                }
 | 
						|
 | 
						|
                _sendCommand({
 | 
						|
                    command: 'internalCommand',
 | 
						|
                    data: {
 | 
						|
                        type: 'localstorage',
 | 
						|
                        keys: k
 | 
						|
                    }
 | 
						|
                });
 | 
						|
            } else
 | 
						|
            if (data.cmd == 'set') {
 | 
						|
                var k = data.keys, i;
 | 
						|
                for (i in k) {
 | 
						|
                    localStorage.setItem(i, k[i]);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _onMessage = function(msg) {
 | 
						|
            if ( msg ) {
 | 
						|
                if ( msg.type === "onExternalPluginMessage" ) {
 | 
						|
                    _sendCommand(msg);
 | 
						|
                } else if (msg.type === "onExternalPluginMessageCallback") {
 | 
						|
                    postMessage(window.parent, msg);
 | 
						|
                } else
 | 
						|
                if ( msg.frameEditorId == placeholderId ) {
 | 
						|
                    var events = _config.events || {},
 | 
						|
                        handler = events[msg.event],
 | 
						|
                        res;
 | 
						|
 | 
						|
                    if (msg.event === 'onRequestEditRights' && !handler) {
 | 
						|
                        _applyEditRights(false, 'handler isn\'t defined');
 | 
						|
                    } else if (msg.event === 'onInternalMessage' && msg.data && msg.data.type == 'localstorage') {
 | 
						|
                        _callLocalStorage(msg.data.data);
 | 
						|
                    } else {
 | 
						|
                        if (msg.event === 'onAppReady') {
 | 
						|
                            _onAppReady();
 | 
						|
                        }
 | 
						|
 | 
						|
                        if (handler && typeof handler == "function") {
 | 
						|
                            res = handler.call(_self, {target: _self, data: msg.data});
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _checkConfigParams = function() {
 | 
						|
            if (_config.document) {
 | 
						|
                if (!_config.document.url || ((typeof _config.document.fileType !== 'string' || _config.document.fileType=='') &&
 | 
						|
                                              (typeof _config.documentType !== 'string' || _config.documentType==''))) {
 | 
						|
                    window.alert("One or more required parameter for the config object is not set");
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
 | 
						|
                var appMap = {
 | 
						|
                        'text': 'docx',
 | 
						|
                        'text-pdf': 'pdf',
 | 
						|
                        'spreadsheet': 'xlsx',
 | 
						|
                        'presentation': 'pptx',
 | 
						|
                        'word': 'docx',
 | 
						|
                        'cell': 'xlsx',
 | 
						|
                        'slide': 'pptx'
 | 
						|
                    }, app;
 | 
						|
 | 
						|
                if (_config.documentType=='text' || _config.documentType=='spreadsheet' ||_config.documentType=='presentation')
 | 
						|
                    console.warn("The \"documentType\" parameter for the config object must take one of the values word/cell/slide.");
 | 
						|
 | 
						|
                if (typeof _config.documentType === 'string' && _config.documentType != '') {
 | 
						|
                    app = appMap[_config.documentType.toLowerCase()];
 | 
						|
                    if (!app) {
 | 
						|
                        window.alert("The \"documentType\" parameter for the config object is invalid. Please correct it.");
 | 
						|
                        return false;
 | 
						|
                    } else if (typeof _config.document.fileType !== 'string' || _config.document.fileType == '') {
 | 
						|
                        _config.document.fileType = app;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                if (typeof _config.document.fileType === 'string' && _config.document.fileType != '') {
 | 
						|
                    _config.document.fileType = _config.document.fileType.toLowerCase();
 | 
						|
                    var type = /^(?:(xls|xlsx|ods|csv|xlst|xlsy|gsheet|xlsm|xlt|xltm|xltx|fods|ots)|(pps|ppsx|ppt|pptx|odp|pptt|ppty|gslides|pot|potm|potx|ppsm|pptm|fodp|otp)|(doc|docx|doct|odt|gdoc|txt|rtf|pdf|mht|htm|html|epub|djvu|xps|docm|dot|dotm|dotx|fodt|ott|fb2|xml))$/
 | 
						|
                                    .exec(_config.document.fileType);
 | 
						|
                    if (!type) {
 | 
						|
                        window.alert("The \"document.fileType\" parameter for the config object is invalid. Please correct it.");
 | 
						|
                        return false;
 | 
						|
                    } else if (typeof _config.documentType !== 'string' || _config.documentType == ''){
 | 
						|
                        if (typeof type[1] === 'string') _config.documentType = 'cell'; else
 | 
						|
                        if (typeof type[2] === 'string') _config.documentType = 'slide'; else
 | 
						|
                        if (typeof type[3] === 'string') _config.documentType = 'word';
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                var type = /^(?:(pdf|djvu|xps))$/.exec(_config.document.fileType);
 | 
						|
                if (type && typeof type[1] === 'string') {
 | 
						|
                    _config.editorConfig.canUseHistory = false;
 | 
						|
                }
 | 
						|
 | 
						|
                if (!_config.document.title || _config.document.title=='')
 | 
						|
                    _config.document.title = 'Unnamed.' + _config.document.fileType;
 | 
						|
 | 
						|
                if (!_config.document.key) {
 | 
						|
                    _config.document.key = 'xxxxxxxxxxxxxxxxxxxx'.replace(/[x]/g, function (c) {var r = Math.random() * 16 | 0; return r.toString(16);});
 | 
						|
                } else if (typeof _config.document.key !== 'string') {
 | 
						|
                    window.alert("The \"document.key\" parameter for the config object must be string. Please correct it.");
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
 | 
						|
                if (_config.editorConfig.user && _config.editorConfig.user.id && (typeof _config.editorConfig.user.id == 'number')) {
 | 
						|
                    _config.editorConfig.user.id = _config.editorConfig.user.id.toString();
 | 
						|
                    console.warn("The \"id\" parameter for the editorConfig.user object must be a string.");
 | 
						|
                }
 | 
						|
 | 
						|
                _config.document.token = _config.token;
 | 
						|
            }
 | 
						|
            
 | 
						|
            return true;
 | 
						|
        };
 | 
						|
 | 
						|
        (function() {
 | 
						|
            var result = /[\?\&]placement=(\w+)&?/.exec(window.location.search);
 | 
						|
            if (!!result && result.length) {
 | 
						|
                if (result[1] == 'desktop') {
 | 
						|
                    _config.editorConfig.targetApp = result[1];
 | 
						|
                    // _config.editorConfig.canBackToFolder = false;
 | 
						|
                    if (!_config.editorConfig.customization) _config.editorConfig.customization = {};
 | 
						|
                    _config.editorConfig.customization.about = false;
 | 
						|
                    _config.editorConfig.customization.compactHeader = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        })();
 | 
						|
 | 
						|
        var target = document.getElementById(placeholderId),
 | 
						|
            iframe;
 | 
						|
 | 
						|
        if (target && _checkConfigParams()) {
 | 
						|
            iframe = createIframe(_config);
 | 
						|
            if (iframe.src) {
 | 
						|
                var pathArray = iframe.src.split('/');
 | 
						|
                this.frameOrigin = pathArray[0] + '//' + pathArray[2];
 | 
						|
            }
 | 
						|
            target.parentNode && target.parentNode.replaceChild(iframe, target);
 | 
						|
            var _msgDispatcher = new MessageDispatcher(_onMessage, this);
 | 
						|
        }
 | 
						|
 | 
						|
        /*
 | 
						|
         cmd = {
 | 
						|
         command: 'commandName',
 | 
						|
         data: <command specific data>
 | 
						|
         }
 | 
						|
         */
 | 
						|
 | 
						|
        var _destroyEditor = function(cmd) {
 | 
						|
            var target = document.createElement("div");
 | 
						|
            target.setAttribute('id', placeholderId);
 | 
						|
 | 
						|
            if (iframe) {
 | 
						|
                _msgDispatcher && _msgDispatcher.unbindEvents();
 | 
						|
                _detachMouseEvents();
 | 
						|
                iframe.parentNode && iframe.parentNode.replaceChild(target, iframe);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _sendCommand = function(cmd) {
 | 
						|
            if (iframe && iframe.contentWindow)
 | 
						|
                postMessage(iframe.contentWindow, cmd);
 | 
						|
        };
 | 
						|
 | 
						|
        var _init = function(editorConfig) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'init',
 | 
						|
                data: {
 | 
						|
                    config: editorConfig
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _openDocument = function(doc) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'openDocument',
 | 
						|
                data: {
 | 
						|
                    doc: doc
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _showMessage = function(title, msg) {
 | 
						|
            msg = msg || title;
 | 
						|
            _sendCommand({
 | 
						|
                command: 'showMessage',
 | 
						|
                data: {
 | 
						|
                    msg: msg
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _applyEditRights = function(allowed, message) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'applyEditRights',
 | 
						|
                data: {
 | 
						|
                    allowed: allowed,
 | 
						|
                    message: message
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _processSaveResult = function(result, message) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'processSaveResult',
 | 
						|
                data: {
 | 
						|
                    result: result,
 | 
						|
                    message: message
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        // TODO: remove processRightsChange, use denyEditingRights
 | 
						|
        var _processRightsChange = function(enabled, message) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'processRightsChange',
 | 
						|
                data: {
 | 
						|
                    enabled: enabled,
 | 
						|
                    message: message
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _denyEditingRights = function(message) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'processRightsChange',
 | 
						|
                data: {
 | 
						|
                    enabled: false,
 | 
						|
                    message: message
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _refreshHistory = function(data, message) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'refreshHistory',
 | 
						|
                data: {
 | 
						|
                    data: data,
 | 
						|
                    message: message
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setHistoryData = function(data, message) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setHistoryData',
 | 
						|
                data: {
 | 
						|
                    data: data,
 | 
						|
                    message: message
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setEmailAddresses = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setEmailAddresses',
 | 
						|
                data: {
 | 
						|
                    data: data
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setActionLink = function (data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setActionLink',
 | 
						|
                data: {
 | 
						|
                    url: data
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _processMailMerge = function(enabled, message) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'processMailMerge',
 | 
						|
                data: {
 | 
						|
                    enabled: enabled,
 | 
						|
                    message: message
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _downloadAs = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'downloadAs',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setUsers = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setUsers',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _showSharingSettings = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'showSharingSettings',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setSharingSettings = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setSharingSettings',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _insertImage = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'insertImage',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setMailMergeRecipients = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setMailMergeRecipients',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setRevisedFile = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setRevisedFile',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _setFavorite = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'setFavorite',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _requestClose = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'requestClose',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _processMouse = function(evt) {
 | 
						|
            var r = iframe.getBoundingClientRect();
 | 
						|
            var data = {
 | 
						|
                type: evt.type,
 | 
						|
                x: evt.x - r.left,
 | 
						|
                y: evt.y - r.top,
 | 
						|
                event: evt
 | 
						|
            };
 | 
						|
 | 
						|
            _sendCommand({
 | 
						|
                command: 'processMouse',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _grabFocus = function(data) {
 | 
						|
            setTimeout(function(){
 | 
						|
                _sendCommand({
 | 
						|
                    command: 'grabFocus',
 | 
						|
                    data: data
 | 
						|
                });
 | 
						|
            }, 10);
 | 
						|
        };
 | 
						|
 | 
						|
        var _blurFocus = function(data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'blurFocus',
 | 
						|
                data: data
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        var _serviceCommand = function(command, data) {
 | 
						|
            _sendCommand({
 | 
						|
                command: 'internalCommand',
 | 
						|
                data: {
 | 
						|
                    command: command,
 | 
						|
                    data: data
 | 
						|
                }
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        return {
 | 
						|
            showMessage         : _showMessage,
 | 
						|
            processSaveResult   : _processSaveResult,
 | 
						|
            processRightsChange : _processRightsChange,
 | 
						|
            denyEditingRights   : _denyEditingRights,
 | 
						|
            refreshHistory      : _refreshHistory,
 | 
						|
            setHistoryData      : _setHistoryData,
 | 
						|
            setEmailAddresses   : _setEmailAddresses,
 | 
						|
            setActionLink       : _setActionLink,
 | 
						|
            processMailMerge    : _processMailMerge,
 | 
						|
            downloadAs          : _downloadAs,
 | 
						|
            serviceCommand      : _serviceCommand,
 | 
						|
            attachMouseEvents   : _attachMouseEvents,
 | 
						|
            detachMouseEvents   : _detachMouseEvents,
 | 
						|
            destroyEditor       : _destroyEditor,
 | 
						|
            setUsers            : _setUsers,
 | 
						|
            showSharingSettings : _showSharingSettings,
 | 
						|
            setSharingSettings  : _setSharingSettings,
 | 
						|
            insertImage         : _insertImage,
 | 
						|
            setMailMergeRecipients: _setMailMergeRecipients,
 | 
						|
            setRevisedFile      : _setRevisedFile,
 | 
						|
            setFavorite         : _setFavorite,
 | 
						|
            requestClose        : _requestClose,
 | 
						|
            grabFocus           : _grabFocus,
 | 
						|
            blurFocus           : _blurFocus
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
    DocsAPI.DocEditor.defaultConfig = {
 | 
						|
        type: 'desktop',
 | 
						|
        width: '100%',
 | 
						|
        height: '100%',
 | 
						|
        editorConfig: {
 | 
						|
            lang: 'en',
 | 
						|
            canCoAuthoring: true,
 | 
						|
            customization: {
 | 
						|
                about: true,
 | 
						|
                feedback: false
 | 
						|
            }
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    DocsAPI.DocEditor.version = function() {
 | 
						|
        return '{{PRODUCT_VERSION}}';
 | 
						|
    };
 | 
						|
 | 
						|
    MessageDispatcher = function(fn, scope) {
 | 
						|
        var _fn     = fn,
 | 
						|
            _scope  = scope || window,
 | 
						|
            eventFn = function(msg) {
 | 
						|
                _onMessage(msg);
 | 
						|
            };
 | 
						|
 | 
						|
        var _bindEvents = function() {
 | 
						|
            if (window.addEventListener) {
 | 
						|
                window.addEventListener("message", eventFn, false)
 | 
						|
            }
 | 
						|
            else if (window.attachEvent) {
 | 
						|
                window.attachEvent("onmessage", eventFn);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _unbindEvents = function() {
 | 
						|
            if (window.removeEventListener) {
 | 
						|
                window.removeEventListener("message", eventFn, false)
 | 
						|
            }
 | 
						|
            else if (window.detachEvent) {
 | 
						|
                window.detachEvent("onmessage", eventFn);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var _onMessage = function(msg) {
 | 
						|
            // TODO: check message origin
 | 
						|
            if (msg && window.JSON && _scope.frameOrigin==msg.origin ) {
 | 
						|
 | 
						|
                try {
 | 
						|
                    var msg = window.JSON.parse(msg.data);
 | 
						|
                    if (_fn) {
 | 
						|
                        _fn.call(_scope, msg);
 | 
						|
                    }
 | 
						|
                } catch(e) {}
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        _bindEvents.call(this);
 | 
						|
 | 
						|
        return {
 | 
						|
            unbindEvents: _unbindEvents
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    function getBasePath() {
 | 
						|
        var scripts = document.getElementsByTagName('script'),
 | 
						|
            match;
 | 
						|
 | 
						|
        for (var i = scripts.length - 1; i >= 0; i--) {
 | 
						|
            match = scripts[i].src.match(/(.*)api\/documents\/api.js/i);
 | 
						|
            if (match) {
 | 
						|
                return match[1];
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return "";
 | 
						|
    }
 | 
						|
 | 
						|
    function getExtensionPath() {
 | 
						|
        if ("undefined" == typeof(extensionParams) || null == extensionParams["url"])
 | 
						|
            return null;
 | 
						|
        return extensionParams["url"] + "apps/";
 | 
						|
    }
 | 
						|
 | 
						|
    function getAppPath(config) {
 | 
						|
        var extensionPath = getExtensionPath(),
 | 
						|
            path = extensionPath ? extensionPath : getBasePath(),
 | 
						|
            appMap = {
 | 
						|
                'text': 'documenteditor',
 | 
						|
                'text-pdf': 'documenteditor',
 | 
						|
                'spreadsheet': 'spreadsheeteditor',
 | 
						|
                'presentation': 'presentationeditor',
 | 
						|
                'word': 'documenteditor',
 | 
						|
                'cell': 'spreadsheeteditor',
 | 
						|
                'slide': 'presentationeditor'
 | 
						|
            },
 | 
						|
            app = appMap['word'];
 | 
						|
 | 
						|
        if (typeof config.documentType === 'string') {
 | 
						|
            app = appMap[config.documentType.toLowerCase()];
 | 
						|
        } else
 | 
						|
        if (!!config.document && typeof config.document.fileType === 'string') {
 | 
						|
            var type = /^(?:(xls|xlsx|ods|csv|xlst|xlsy|gsheet|xlsm|xlt|xltm|xltx|fods|ots)|(pps|ppsx|ppt|pptx|odp|pptt|ppty|gslides|pot|potm|potx|ppsm|pptm|fodp|otp))$/
 | 
						|
                            .exec(config.document.fileType);
 | 
						|
            if (type) {
 | 
						|
                if (typeof type[1] === 'string') app = appMap['cell']; else
 | 
						|
                if (typeof type[2] === 'string') app = appMap['slide'];
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        var userAgent = navigator.userAgent.toLowerCase(),
 | 
						|
            check = function(regex){ return regex.test(userAgent); },
 | 
						|
            isIE = !check(/opera/) && (check(/msie/) || check(/trident/) || check(/edge/)),
 | 
						|
            isChrome = !isIE && check(/\bchrome\b/),
 | 
						|
            isSafari_mobile = !isIE && !isChrome && check(/safari/) && (navigator.maxTouchPoints>0),
 | 
						|
            path_type = "main";
 | 
						|
 | 
						|
        path += app + "/";
 | 
						|
        path_type = (config.type === "mobile" || isSafari_mobile)
 | 
						|
            ? "mobile"
 | 
						|
            : ((app=='documenteditor') && config.document && config.document.permissions && (config.document.permissions.fillForms===true) &&
 | 
						|
                                         (config.document.permissions.edit === false) && (config.document.permissions.review !== true) && (config.editorConfig.mode !== 'view'))
 | 
						|
            ? "forms" : (config.type === "embedded") ? "embed"
 | 
						|
            : "main";
 | 
						|
 | 
						|
        path += path_type;
 | 
						|
        var index = "/index.html";
 | 
						|
        if (config.editorConfig && path_type!=="forms") {
 | 
						|
            var customization = config.editorConfig.customization;
 | 
						|
            if ( typeof(customization) == 'object' && ( customization.toolbarNoTabs ||
 | 
						|
                                                        (config.editorConfig.targetApp!=='desktop') && (customization.loaderName || customization.loaderLogo))) {
 | 
						|
                index = "/index_loader.html";
 | 
						|
            } else if (config.editorConfig.mode == 'editdiagram' || config.editorConfig.mode == 'editmerge')
 | 
						|
                index = "/index_internal.html";
 | 
						|
 | 
						|
        }
 | 
						|
        path += index;
 | 
						|
        return path;
 | 
						|
    }
 | 
						|
 | 
						|
    function getAppParameters(config) {
 | 
						|
        var params = "?_dc=0";
 | 
						|
 | 
						|
        if (config.editorConfig && config.editorConfig.lang)
 | 
						|
            params += "&lang=" + config.editorConfig.lang;
 | 
						|
 | 
						|
        if (config.editorConfig && config.editorConfig.targetApp!=='desktop') {
 | 
						|
            if ( (typeof(config.editorConfig.customization) == 'object') && config.editorConfig.customization.loaderName) {
 | 
						|
                if (config.editorConfig.customization.loaderName !== 'none') params += "&customer=" + encodeURIComponent(config.editorConfig.customization.loaderName);
 | 
						|
            } else
 | 
						|
                params += "&customer={{APP_CUSTOMER_NAME}}";
 | 
						|
            if ( (typeof(config.editorConfig.customization) == 'object') && config.editorConfig.customization.loaderLogo) {
 | 
						|
                if (config.editorConfig.customization.loaderLogo !== '') params += "&logo=" + encodeURIComponent(config.editorConfig.customization.loaderLogo);
 | 
						|
            } else if ( (typeof(config.editorConfig.customization) == 'object') && config.editorConfig.customization.logo) {
 | 
						|
                if (config.type=='embedded' && config.editorConfig.customization.logo.imageEmbedded)
 | 
						|
                    params += "&headerlogo=" + encodeURIComponent(config.editorConfig.customization.logo.imageEmbedded);
 | 
						|
                else if (config.type!='embedded' && config.editorConfig.customization.logo.image)
 | 
						|
                    params += "&headerlogo=" + encodeURIComponent(config.editorConfig.customization.logo.image);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (config.editorConfig && (config.editorConfig.mode == 'editdiagram' || config.editorConfig.mode == 'editmerge'))
 | 
						|
            params += "&internal=true";
 | 
						|
 | 
						|
        if (config.frameEditorId)
 | 
						|
            params += "&frameEditorId=" + config.frameEditorId;
 | 
						|
 | 
						|
        if (config.editorConfig && config.editorConfig.mode == 'view' ||
 | 
						|
            config.document && config.document.permissions && (config.document.permissions.edit === false && !config.document.permissions.review ))
 | 
						|
            params += "&mode=view";
 | 
						|
 | 
						|
        if (config.editorConfig && config.editorConfig.customization && !!config.editorConfig.customization.compactHeader)
 | 
						|
            params += "&compact=true";
 | 
						|
 | 
						|
        if (config.editorConfig && config.editorConfig.customization && (config.editorConfig.customization.toolbar===false))
 | 
						|
            params += "&toolbar=false";
 | 
						|
        else if (config.document && config.document.permissions && (config.document.permissions.edit === false && config.document.permissions.fillForms ))
 | 
						|
            params += "&toolbar=true";
 | 
						|
 | 
						|
        if (config.parentOrigin)
 | 
						|
            params += "&parentOrigin=" + config.parentOrigin;
 | 
						|
 | 
						|
        if (config.editorConfig && config.editorConfig.customization && config.editorConfig.customization.uiTheme )
 | 
						|
            params += "&uitheme=" + config.editorConfig.customization.uiTheme;
 | 
						|
 | 
						|
        return params;
 | 
						|
    }
 | 
						|
 | 
						|
    function createIframe(config) {
 | 
						|
        var iframe = document.createElement("iframe");
 | 
						|
 | 
						|
        iframe.src = getAppPath(config) + getAppParameters(config);
 | 
						|
        iframe.width = config.width;
 | 
						|
        iframe.height = config.height;
 | 
						|
        iframe.align = "top";
 | 
						|
        iframe.frameBorder = 0;
 | 
						|
        iframe.name = "frameEditor";
 | 
						|
        iframe.allowFullscreen = true;
 | 
						|
        iframe.setAttribute("allowfullscreen",""); // for IE11
 | 
						|
        iframe.setAttribute("onmousewheel",""); // for Safari on Mac
 | 
						|
        iframe.setAttribute("allow", "autoplay; camera; microphone; display-capture");
 | 
						|
        
 | 
						|
		if (config.type == "mobile")
 | 
						|
		{
 | 
						|
			iframe.style.position = "fixed";
 | 
						|
            iframe.style.overflow = "hidden";
 | 
						|
            document.body.style.overscrollBehaviorY = "contain";
 | 
						|
		}
 | 
						|
        return iframe;
 | 
						|
    }
 | 
						|
 | 
						|
    function postMessage(wnd, msg) {
 | 
						|
        if (wnd && wnd.postMessage && window.JSON) {
 | 
						|
            // TODO: specify explicit origin
 | 
						|
            wnd.postMessage(window.JSON.stringify(msg), "*");
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    function extend(dest, src) {
 | 
						|
        for (var prop in src) {
 | 
						|
            if (src.hasOwnProperty(prop)) {
 | 
						|
                if (typeof dest[prop] === 'undefined') {
 | 
						|
                    dest[prop] = src[prop];
 | 
						|
                } else
 | 
						|
                if (typeof dest[prop] === 'object' &&
 | 
						|
                        typeof src[prop] === 'object') {
 | 
						|
                    extend(dest[prop], src[prop])
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return dest;
 | 
						|
    }
 | 
						|
 | 
						|
})(window.DocsAPI = window.DocsAPI || {}, window, document);
 | 
						|
 |