Changed how files are removed from localStorage
This commit is contained in:
		
							parent
							
								
									14ec21101b
								
							
						
					
					
						commit
						3b30813e3d
					
				@ -12,12 +12,10 @@
 | 
				
			|||||||
    "ejs": "~0.8.4"
 | 
					    "ejs": "~0.8.4"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "grunt": "~0.4.1",
 | 
					 | 
				
			||||||
    "grunt-contrib-requirejs": "~0.4.1",
 | 
					    "grunt-contrib-requirejs": "~0.4.1",
 | 
				
			||||||
    "grunt-contrib-less": "~0.7.0",
 | 
					    "grunt-contrib-less": "~0.7.0",
 | 
				
			||||||
    "grunt-string-replace": "~0.2.4",
 | 
					    "grunt-string-replace": "~0.2.4",
 | 
				
			||||||
    "grunt-contrib-copy": "~0.4.1",
 | 
					    "grunt-contrib-copy": "~0.4.1",
 | 
				
			||||||
    "bower": "~1.2.5",
 | 
					 | 
				
			||||||
    "grunt-bower-requirejs": "~0.7.1",
 | 
					    "grunt-bower-requirejs": "~0.7.1",
 | 
				
			||||||
    "grunt-bower-task": "~0.3.1",
 | 
					    "grunt-bower-task": "~0.3.1",
 | 
				
			||||||
    "grunt-bump": "0.0.11",
 | 
					    "grunt-bump": "0.0.11",
 | 
				
			||||||
 | 
				
			|||||||
@ -106,7 +106,6 @@ define([
 | 
				
			|||||||
    FileDescriptor.prototype.removeSyncLocation = function(syncAttributes) {
 | 
					    FileDescriptor.prototype.removeSyncLocation = function(syncAttributes) {
 | 
				
			||||||
        utils.removeIndexFromArray(this.fileIndex + ".sync", syncAttributes.syncIndex);
 | 
					        utils.removeIndexFromArray(this.fileIndex + ".sync", syncAttributes.syncIndex);
 | 
				
			||||||
        delete this.syncLocations[syncAttributes.syncIndex];
 | 
					        delete this.syncLocations[syncAttributes.syncIndex];
 | 
				
			||||||
        storage.removeItem(syncAttributes.syncIndex);
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FileDescriptor.prototype.addPublishLocation = function(publishAttributes) {
 | 
					    FileDescriptor.prototype.addPublishLocation = function(publishAttributes) {
 | 
				
			||||||
@ -118,7 +117,6 @@ define([
 | 
				
			|||||||
    FileDescriptor.prototype.removePublishLocation = function(publishAttributes) {
 | 
					    FileDescriptor.prototype.removePublishLocation = function(publishAttributes) {
 | 
				
			||||||
        utils.removeIndexFromArray(this.fileIndex + ".publish", publishAttributes.publishIndex);
 | 
					        utils.removeIndexFromArray(this.fileIndex + ".publish", publishAttributes.publishIndex);
 | 
				
			||||||
        delete this.publishLocations[publishAttributes.publishIndex];
 | 
					        delete this.publishLocations[publishAttributes.publishIndex];
 | 
				
			||||||
        storage.removeItem(publishAttributes.publishIndex);
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FileDescriptor.prototype.composeTitle = function() {
 | 
					    FileDescriptor.prototype.composeTitle = function() {
 | 
				
			||||||
 | 
				
			|||||||
@ -49,15 +49,25 @@ define([
 | 
				
			|||||||
        return content;
 | 
					        return content;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Provider.prototype.parseSerializedContent = function(content) {
 | 
					    Provider.prototype.parseContent = function(content) {
 | 
				
			||||||
 | 
					        if(!_.isString(content)) {
 | 
				
			||||||
 | 
					            // Real time content is already an object
 | 
				
			||||||
 | 
					            return {
 | 
				
			||||||
 | 
					                content: content.content,
 | 
				
			||||||
 | 
					                discussionList: content.discussionList,
 | 
				
			||||||
 | 
					                discussionListJSON: JSON.stringify(content.discussionList)
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        var discussionList;
 | 
				
			||||||
        var discussionListJSON = '{}';
 | 
					        var discussionListJSON = '{}';
 | 
				
			||||||
        var discussionExtractor = /<!--se_discussion_list:([\s\S]+)-->$/.exec(content);
 | 
					        var discussionExtractor = /<!--se_discussion_list:([\s\S]+)-->$/.exec(content);
 | 
				
			||||||
        if(discussionExtractor && this.parseDiscussionList(discussionExtractor[1])) {
 | 
					        if(discussionExtractor && (discussionList = this.parseDiscussionList(discussionExtractor[1]))) {
 | 
				
			||||||
            content = content.substring(0, discussionExtractor.index);
 | 
					            content = content.substring(0, discussionExtractor.index);
 | 
				
			||||||
            discussionListJSON = discussionExtractor[1];
 | 
					            discussionListJSON = discussionExtractor[1];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            content: content,
 | 
					            content: content,
 | 
				
			||||||
 | 
					            discussionList: discussionList || {},
 | 
				
			||||||
            discussionListJSON: discussionListJSON
 | 
					            discussionListJSON: discussionListJSON
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
				
			|||||||
@ -376,7 +376,7 @@ define([
 | 
				
			|||||||
                    // Create discussion index
 | 
					                    // Create discussion index
 | 
				
			||||||
                    var discussionIndex;
 | 
					                    var discussionIndex;
 | 
				
			||||||
                    do {
 | 
					                    do {
 | 
				
			||||||
                        discussionIndex = utils.randomString() + utils.randomString(); // Increased size to prevent collision
 | 
					                        discussionIndex = utils.randomString();
 | 
				
			||||||
                    } while(_.has(discussionList, discussionIndex));
 | 
					                    } while(_.has(discussionList, discussionIndex));
 | 
				
			||||||
                    discussion.discussionIndex = discussionIndex;
 | 
					                    discussion.discussionIndex = discussionIndex;
 | 
				
			||||||
                    discussionList[discussionIndex] = discussion;
 | 
					                    discussionList[discussionIndex] = discussion;
 | 
				
			||||||
 | 
				
			|||||||
@ -106,8 +106,6 @@ define([
 | 
				
			|||||||
        // Delete folders
 | 
					        // Delete folders
 | 
				
			||||||
        _.each(selectedFolderList, function(folderDesc) {
 | 
					        _.each(selectedFolderList, function(folderDesc) {
 | 
				
			||||||
            utils.removeIndexFromArray("folder.list", folderDesc.folderIndex);
 | 
					            utils.removeIndexFromArray("folder.list", folderDesc.folderIndex);
 | 
				
			||||||
            storage.removeItem(folderDesc.folderIndex + ".name");
 | 
					 | 
				
			||||||
            storage.removeItem(folderDesc.folderIndex + ".files");
 | 
					 | 
				
			||||||
            delete folderList[folderDesc.folderIndex];
 | 
					            delete folderList[folderDesc.folderIndex];
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        eventMgr.onFoldersChanged();
 | 
					        eventMgr.onFoldersChanged();
 | 
				
			||||||
 | 
				
			|||||||
@ -110,6 +110,8 @@ define([
 | 
				
			|||||||
        utils.removeIndexFromArray("file.list", fileDesc.fileIndex);
 | 
					        utils.removeIndexFromArray("file.list", fileDesc.fileIndex);
 | 
				
			||||||
        delete fileSystem[fileDesc.fileIndex];
 | 
					        delete fileSystem[fileDesc.fileIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Don't bother with fields in localStorage, they will be removed on next page load
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(fileMgr.currentFile === fileDesc) {
 | 
					        if(fileMgr.currentFile === fileDesc) {
 | 
				
			||||||
            // Unset the current fileDesc
 | 
					            // Unset the current fileDesc
 | 
				
			||||||
            fileMgr.currentFile = undefined;
 | 
					            fileMgr.currentFile = undefined;
 | 
				
			||||||
@ -117,27 +119,6 @@ define([
 | 
				
			|||||||
            fileMgr.selectFile();
 | 
					            fileMgr.selectFile();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Remove synchronized locations from storage
 | 
					 | 
				
			||||||
        _.each(fileDesc.syncLocations, function(syncAttributes) {
 | 
					 | 
				
			||||||
            storage.removeItem(syncAttributes.syncIndex);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Remove publish locations from storage
 | 
					 | 
				
			||||||
        _.each(fileDesc.publishLocations, function(publishAttributes) {
 | 
					 | 
				
			||||||
            storage.removeItem(publishAttributes.publishIndex);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".title");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".content");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".sync");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".publish");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".selectTime");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".editorStart");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".editorEnd");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".editorScrollTop");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".previewScrollTop");
 | 
					 | 
				
			||||||
        storage.removeItem(fileDesc.fileIndex + ".discussionList");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        eventMgr.onFileDeleted(fileDesc);
 | 
					        eventMgr.onFileDeleted(fileDesc);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -148,12 +129,6 @@ define([
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get syncAttributes from syncIndex
 | 
					 | 
				
			||||||
    fileMgr.getSyncAttributes = function(syncIndex) {
 | 
					 | 
				
			||||||
        var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
 | 
					 | 
				
			||||||
        return fileDesc && fileDesc.syncLocations[syncIndex];
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Get the file descriptor associated to a publishIndex
 | 
					    // Get the file descriptor associated to a publishIndex
 | 
				
			||||||
    fileMgr.getFileFromPublishIndex = function(publishIndex) {
 | 
					    fileMgr.getFileFromPublishIndex = function(publishIndex) {
 | 
				
			||||||
        return _.find(fileSystem, function(fileDesc) {
 | 
					        return _.find(fileSystem, function(fileDesc) {
 | 
				
			||||||
 | 
				
			|||||||
@ -3,13 +3,21 @@ define([
 | 
				
			|||||||
    "utils",
 | 
					    "utils",
 | 
				
			||||||
    "classes/FileDescriptor",
 | 
					    "classes/FileDescriptor",
 | 
				
			||||||
    "storage",
 | 
					    "storage",
 | 
				
			||||||
], function(_, utils, FileDescriptor) {
 | 
					], function(_, utils, FileDescriptor, storage) {
 | 
				
			||||||
    var fileSystem = {};
 | 
					    var fileSystem = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Retrieve file descriptors from localStorage
 | 
					    // Retrieve file descriptors from localStorage
 | 
				
			||||||
    _.each(utils.retrieveIndexArray("file.list"), function(fileIndex) {
 | 
					    utils.retrieveIndexArray("file.list").forEach(function(fileIndex) {
 | 
				
			||||||
        fileSystem[fileIndex] = new FileDescriptor(fileIndex);
 | 
					        fileSystem[fileIndex] = new FileDescriptor(fileIndex);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Clean fields from deleted files in local storage
 | 
				
			||||||
 | 
					    Object.keys(storage).forEach(function(key) {
 | 
				
			||||||
 | 
					        var match = key.match(/(file\.\S+?)\.\S+/);
 | 
				
			||||||
 | 
					        if(match && !fileSystem.hasOwnProperty(match[1])) {
 | 
				
			||||||
 | 
					            storage.removeItem(key);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return fileSystem;
 | 
					    return fileSystem;
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@ -1,15 +1,24 @@
 | 
				
			|||||||
define([
 | 
					define([
 | 
				
			||||||
    "underscore",
 | 
					    "underscore",
 | 
				
			||||||
    "utils",
 | 
					    "utils",
 | 
				
			||||||
 | 
					    "storage",
 | 
				
			||||||
    "classes/FolderDescriptor",
 | 
					    "classes/FolderDescriptor",
 | 
				
			||||||
    "storage",
 | 
					    "storage",
 | 
				
			||||||
], function(_, utils, FolderDescriptor) {
 | 
					], function(_, utils, storage, FolderDescriptor) {
 | 
				
			||||||
    var folderList = {};
 | 
					    var folderList = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Retrieve folder descriptors from localStorage
 | 
					    // Retrieve folder descriptors from localStorage
 | 
				
			||||||
    _.each(utils.retrieveIndexArray("folder.list"), function(folderIndex) {
 | 
					    utils.retrieveIndexArray("folder.list").forEach(function(folderIndex) {
 | 
				
			||||||
        folderList[folderIndex] = new FolderDescriptor(folderIndex);
 | 
					        folderList[folderIndex] = new FolderDescriptor(folderIndex);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Clean fields from deleted folders in local storage
 | 
				
			||||||
 | 
					    Object.keys(storage).forEach(function(key) {
 | 
				
			||||||
 | 
					        var match = key.match(/(folder\.\S+?)\.\S+/);
 | 
				
			||||||
 | 
					        if(match && !folderList.hasOwnProperty(match[1])) {
 | 
				
			||||||
 | 
					            storage.removeItem(key);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return folderList;
 | 
					    return folderList;
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@ -542,13 +542,11 @@ define([
 | 
				
			|||||||
                    task.chain(recursiveDownloadContent);
 | 
					                    task.chain(recursiveDownloadContent);
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                var url = file.downloadUrl;
 | 
				
			||||||
                // if file is a real time document
 | 
					                // if file is a real time document
 | 
				
			||||||
                if(file.mimeType.indexOf("application/vnd.google-apps.drive-sdk") === 0) {
 | 
					                if(file.mimeType.indexOf("application/vnd.google-apps.drive-sdk") === 0) {
 | 
				
			||||||
                    file.content = "";
 | 
					 | 
				
			||||||
                    file.isRealtime = true;
 | 
					                    file.isRealtime = true;
 | 
				
			||||||
                    objects.shift();
 | 
					                    url = 'https://www.googleapis.com/drive/v2/files/' + file.id + '/realtime';
 | 
				
			||||||
                    task.chain(recursiveDownloadContent);
 | 
					 | 
				
			||||||
                    return;
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                var headers = {};
 | 
					                var headers = {};
 | 
				
			||||||
                var authorizationMgr = authorizationMgrMap[accountId];
 | 
					                var authorizationMgr = authorizationMgrMap[accountId];
 | 
				
			||||||
@ -556,12 +554,12 @@ define([
 | 
				
			|||||||
                    headers.Authorization = "Bearer " + authorizationMgr.token.access_token;
 | 
					                    headers.Authorization = "Bearer " + authorizationMgr.token.access_token;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                $.ajax({
 | 
					                $.ajax({
 | 
				
			||||||
                    url: file.downloadUrl,
 | 
					                    url: url,
 | 
				
			||||||
                    headers: headers,
 | 
					                    headers: headers,
 | 
				
			||||||
                    data: {
 | 
					                    data: {
 | 
				
			||||||
                        key: constants.GOOGLE_API_KEY
 | 
					                        key: constants.GOOGLE_API_KEY
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                    dataType: "text",
 | 
					                    dataType: file.isRealtime ? 'json' : 'text',
 | 
				
			||||||
                    timeout: constants.AJAX_TIMEOUT
 | 
					                    timeout: constants.AJAX_TIMEOUT
 | 
				
			||||||
                }).done(function(data) {
 | 
					                }).done(function(data) {
 | 
				
			||||||
                    file.content = data;
 | 
					                    file.content = data;
 | 
				
			||||||
 | 
				
			|||||||
@ -43,7 +43,7 @@ requirejs.config({
 | 
				
			|||||||
        'bootstrap-tour': 'bower-libs/bootstrap-tour/build/js/bootstrap-tour',
 | 
					        'bootstrap-tour': 'bower-libs/bootstrap-tour/build/js/bootstrap-tour',
 | 
				
			||||||
        css_browser_selector: 'bower-libs/css_browser_selector/css_browser_selector',
 | 
					        css_browser_selector: 'bower-libs/css_browser_selector/css_browser_selector',
 | 
				
			||||||
        'pagedown-extra': 'bower-libs/pagedown-extra/Markdown.Extra',
 | 
					        'pagedown-extra': 'bower-libs/pagedown-extra/Markdown.Extra',
 | 
				
			||||||
        pagedown: 'bower-libs/stackedit-pagedown/Markdown.Editor',
 | 
					        pagedown: 'libs/Markdown.Editor',
 | 
				
			||||||
        'require-css': 'bower-libs/require-css/css',
 | 
					        'require-css': 'bower-libs/require-css/css',
 | 
				
			||||||
        xregexp: 'bower-libs/xregexp/xregexp-all',
 | 
					        xregexp: 'bower-libs/xregexp/xregexp-all',
 | 
				
			||||||
        yaml: 'bower-libs/yaml.js',
 | 
					        yaml: 'bower-libs/yaml.js',
 | 
				
			||||||
@ -161,10 +161,10 @@ requirejs.config({
 | 
				
			|||||||
            'jquery'
 | 
					            'jquery'
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        pagedown: [
 | 
					        pagedown: [
 | 
				
			||||||
            'bower-libs/stackedit-pagedown/Markdown.Converter'
 | 
					            'libs/Markdown.Converter'
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        'pagedown-extra': [
 | 
					        'pagedown-extra': [
 | 
				
			||||||
            'bower-libs/stackedit-pagedown/Markdown.Converter'
 | 
					            'libs/Markdown.Converter'
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
@ -61,7 +61,7 @@ define([
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                var fileDescList = [];
 | 
					                var fileDescList = [];
 | 
				
			||||||
                _.each(result, function(file) {
 | 
					                _.each(result, function(file) {
 | 
				
			||||||
                    var parsedContent = dropboxProvider.parseSerializedContent(file.content);
 | 
					                    var parsedContent = dropboxProvider.parseContent(file.content);
 | 
				
			||||||
                    var syncAttributes = createSyncAttributes(file.path, file.versionTag, parsedContent.content, parsedContent.discussionListJSON);
 | 
					                    var syncAttributes = createSyncAttributes(file.path, file.versionTag, parsedContent.content, parsedContent.discussionListJSON);
 | 
				
			||||||
                    var syncLocations = {};
 | 
					                    var syncLocations = {};
 | 
				
			||||||
                    syncLocations[syncAttributes.syncIndex] = syncAttributes;
 | 
					                    syncLocations[syncAttributes.syncIndex] = syncAttributes;
 | 
				
			||||||
@ -152,11 +152,13 @@ define([
 | 
				
			|||||||
            var interestingChanges = [];
 | 
					            var interestingChanges = [];
 | 
				
			||||||
            _.each(changes, function(change) {
 | 
					            _.each(changes, function(change) {
 | 
				
			||||||
                var syncIndex = createSyncIndex(change.path);
 | 
					                var syncIndex = createSyncIndex(change.path);
 | 
				
			||||||
                var syncAttributes = fileMgr.getSyncAttributes(syncIndex);
 | 
					                var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
 | 
				
			||||||
                if(syncAttributes === undefined) {
 | 
					                var syncAttributes = fileDesc && fileDesc.syncLocations[syncIndex];
 | 
				
			||||||
 | 
					                if(!syncAttributes) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                // Store syncAttributes to avoid 2 times searching
 | 
					                // Store fileDesc and syncAttributes references to avoid 2 times search
 | 
				
			||||||
 | 
					                change.fileDesc = fileDesc;
 | 
				
			||||||
                change.syncAttributes = syncAttributes;
 | 
					                change.syncAttributes = syncAttributes;
 | 
				
			||||||
                // Delete
 | 
					                // Delete
 | 
				
			||||||
                if(change.wasRemoved === true) {
 | 
					                if(change.wasRemoved === true) {
 | 
				
			||||||
@ -179,13 +181,8 @@ define([
 | 
				
			|||||||
                        return callback();
 | 
					                        return callback();
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    var change = changes.pop();
 | 
					                    var change = changes.pop();
 | 
				
			||||||
 | 
					                    var fileDesc = change.fileDesc;
 | 
				
			||||||
                    var syncAttributes = change.syncAttributes;
 | 
					                    var syncAttributes = change.syncAttributes;
 | 
				
			||||||
                    var syncIndex = syncAttributes.syncIndex;
 | 
					 | 
				
			||||||
                    var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
 | 
					 | 
				
			||||||
                    // No file corresponding (file may have been deleted locally)
 | 
					 | 
				
			||||||
                    if(fileDesc === undefined) {
 | 
					 | 
				
			||||||
                        return;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    // File deleted
 | 
					                    // File deleted
 | 
				
			||||||
                    if(change.wasRemoved === true) {
 | 
					                    if(change.wasRemoved === true) {
 | 
				
			||||||
                        eventMgr.onError('"' + fileDesc.title + '" has been removed from Dropbox.');
 | 
					                        eventMgr.onError('"' + fileDesc.title + '" has been removed from Dropbox.');
 | 
				
			||||||
@ -193,10 +190,10 @@ define([
 | 
				
			|||||||
                        return eventMgr.onSyncRemoved(fileDesc, syncAttributes);
 | 
					                        return eventMgr.onSyncRemoved(fileDesc, syncAttributes);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    var file = change.stat;
 | 
					                    var file = change.stat;
 | 
				
			||||||
                    var parsedContent = dropboxProvider.parseSerializedContent(file.content);
 | 
					                    var parsedContent = dropboxProvider.parseContent(file.content);
 | 
				
			||||||
                    var remoteContent = parsedContent.content;
 | 
					                    var remoteContent = parsedContent.content;
 | 
				
			||||||
                    var remoteDiscussionListJSON = parsedContent.discussionListJSON;
 | 
					                    var remoteDiscussionListJSON = parsedContent.discussionListJSON;
 | 
				
			||||||
                    var remoteDiscussionList = JSON.parse(remoteDiscussionListJSON);
 | 
					                    var remoteDiscussionList = parsedContent.discussionList;
 | 
				
			||||||
                    var remoteCRC = dropboxProvider.syncMerge(fileDesc, syncAttributes, remoteContent, fileDesc.title, remoteDiscussionList, remoteDiscussionListJSON);
 | 
					                    var remoteCRC = dropboxProvider.syncMerge(fileDesc, syncAttributes, remoteContent, fileDesc.title, remoteDiscussionList, remoteDiscussionListJSON);
 | 
				
			||||||
                    // Update syncAttributes
 | 
					                    // Update syncAttributes
 | 
				
			||||||
                    syncAttributes.version = file.versionTag;
 | 
					                    syncAttributes.version = file.versionTag;
 | 
				
			||||||
 | 
				
			|||||||
@ -62,7 +62,7 @@ define([
 | 
				
			|||||||
                    var fileDescList = [];
 | 
					                    var fileDescList = [];
 | 
				
			||||||
                    var fileDesc;
 | 
					                    var fileDesc;
 | 
				
			||||||
                    _.each(result, function(file) {
 | 
					                    _.each(result, function(file) {
 | 
				
			||||||
                        var parsedContent = gdriveProvider.parseSerializedContent(file.content);
 | 
					                        var parsedContent = gdriveProvider.parseContent(file.content);
 | 
				
			||||||
                        var syncAttributes = createSyncAttributes(file.id, file.etag, parsedContent.content, file.title, parsedContent.discussionListJSON);
 | 
					                        var syncAttributes = createSyncAttributes(file.id, file.etag, parsedContent.content, file.title, parsedContent.discussionListJSON);
 | 
				
			||||||
                        syncAttributes.isRealtime = file.isRealtime;
 | 
					                        syncAttributes.isRealtime = file.isRealtime;
 | 
				
			||||||
                        var syncLocations = {};
 | 
					                        var syncLocations = {};
 | 
				
			||||||
@ -188,11 +188,13 @@ define([
 | 
				
			|||||||
                var interestingChanges = [];
 | 
					                var interestingChanges = [];
 | 
				
			||||||
                _.each(changes, function(change) {
 | 
					                _.each(changes, function(change) {
 | 
				
			||||||
                    var syncIndex = createSyncIndex(change.fileId);
 | 
					                    var syncIndex = createSyncIndex(change.fileId);
 | 
				
			||||||
                    var syncAttributes = fileMgr.getSyncAttributes(syncIndex);
 | 
					                    var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
 | 
				
			||||||
                    if(syncAttributes === undefined) {
 | 
					                    var syncAttributes = fileDesc && fileDesc.syncLocations[syncIndex];
 | 
				
			||||||
 | 
					                    if(!syncAttributes) {
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    // Store syncAttributes to avoid 2 times searching
 | 
					                    // Store fileDesc and syncAttributes references to avoid 2 times search
 | 
				
			||||||
 | 
					                    change.fileDesc = fileDesc;
 | 
				
			||||||
                    change.syncAttributes = syncAttributes;
 | 
					                    change.syncAttributes = syncAttributes;
 | 
				
			||||||
                    // Delete
 | 
					                    // Delete
 | 
				
			||||||
                    if(change.deleted === true) {
 | 
					                    if(change.deleted === true) {
 | 
				
			||||||
@ -215,13 +217,8 @@ define([
 | 
				
			|||||||
                            return callback();
 | 
					                            return callback();
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        var change = changes.pop();
 | 
					                        var change = changes.pop();
 | 
				
			||||||
 | 
					                        var fileDesc = change.fileDesc;
 | 
				
			||||||
                        var syncAttributes = change.syncAttributes;
 | 
					                        var syncAttributes = change.syncAttributes;
 | 
				
			||||||
                        var syncIndex = syncAttributes.syncIndex;
 | 
					 | 
				
			||||||
                        var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
 | 
					 | 
				
			||||||
                        // No file corresponding (file may have been deleted locally)
 | 
					 | 
				
			||||||
                        if(fileDesc === undefined) {
 | 
					 | 
				
			||||||
                            return;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        // File deleted
 | 
					                        // File deleted
 | 
				
			||||||
                        if(change.deleted === true) {
 | 
					                        if(change.deleted === true) {
 | 
				
			||||||
                            eventMgr.onError('"' + fileDesc.title + '" has been removed from ' + providerName + '.');
 | 
					                            eventMgr.onError('"' + fileDesc.title + '" has been removed from ' + providerName + '.');
 | 
				
			||||||
@ -233,11 +230,11 @@ define([
 | 
				
			|||||||
                            return;
 | 
					                            return;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        var file = change.file;
 | 
					                        var file = change.file;
 | 
				
			||||||
                        var parsedContent = gdriveProvider.parseSerializedContent(file.content);
 | 
					                        var parsedContent = gdriveProvider.parseContent(file.content);
 | 
				
			||||||
                        var remoteContent = parsedContent.content;
 | 
					                        var remoteContent = parsedContent.content;
 | 
				
			||||||
                        var remoteTitle = file.title;
 | 
					                        var remoteTitle = file.title;
 | 
				
			||||||
                        var remoteDiscussionListJSON = parsedContent.discussionListJSON;
 | 
					                        var remoteDiscussionListJSON = parsedContent.discussionListJSON;
 | 
				
			||||||
                        var remoteDiscussionList = JSON.parse(remoteDiscussionListJSON);
 | 
					                        var remoteDiscussionList = parsedContent.discussionList;
 | 
				
			||||||
                        var remoteCRC = gdriveProvider.syncMerge(fileDesc, syncAttributes, remoteContent, remoteTitle, remoteDiscussionList, remoteDiscussionListJSON);
 | 
					                        var remoteCRC = gdriveProvider.syncMerge(fileDesc, syncAttributes, remoteContent, remoteTitle, remoteDiscussionList, remoteDiscussionListJSON);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        // Update syncAttributes
 | 
					                        // Update syncAttributes
 | 
				
			||||||
@ -291,8 +288,8 @@ define([
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Realtime closure
 | 
					        // Realtime closure
 | 
				
			||||||
 | 
					        var realtimeContext;
 | 
				
			||||||
        (function() {
 | 
					        (function() {
 | 
				
			||||||
            var realtimeContext;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            function toRealtimeDiscussion(context, discussion) {
 | 
					            function toRealtimeDiscussion(context, discussion) {
 | 
				
			||||||
                var realtimeCommentList = context.model.createList();
 | 
					                var realtimeCommentList = context.model.createList();
 | 
				
			||||||
@ -430,7 +427,7 @@ define([
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            function updateCRCs() {
 | 
					            function updateStatus() {
 | 
				
			||||||
                var context = realtimeContext;
 | 
					                var context = realtimeContext;
 | 
				
			||||||
                if(!context) {
 | 
					                if(!context) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
@ -487,7 +484,7 @@ define([
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    // For local changes, CRCs are updated on "save success" event
 | 
					                    // For local changes, CRCs are updated on "save success" event
 | 
				
			||||||
                    if(context.isServerChange) {
 | 
					                    if(context.isServerChange) {
 | 
				
			||||||
                        updateCRCs();
 | 
					                        updateStatus();
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else {
 | 
					                    else {
 | 
				
			||||||
                        context.model.endCompoundOperation();
 | 
					                        context.model.endCompoundOperation();
 | 
				
			||||||
@ -570,7 +567,7 @@ define([
 | 
				
			|||||||
                    // Also listen to "save success" event
 | 
					                    // Also listen to "save success" event
 | 
				
			||||||
                    doc.addEventListener(gapi.drive.realtime.EventType.DOCUMENT_SAVE_STATE_CHANGED, function(evt) {
 | 
					                    doc.addEventListener(gapi.drive.realtime.EventType.DOCUMENT_SAVE_STATE_CHANGED, function(evt) {
 | 
				
			||||||
                        if(evt.isPending === false && evt.isSaving === false) {
 | 
					                        if(evt.isPending === false && evt.isSaving === false) {
 | 
				
			||||||
                            updateCRCs();
 | 
					                            updateStatus();
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -35,29 +35,40 @@ define([
 | 
				
			|||||||
    }).compact().object().value();
 | 
					    }).compact().object().value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Retrieve publish locations from storage
 | 
					    // Retrieve publish locations from storage
 | 
				
			||||||
    _.each(fileSystem, function(fileDesc) {
 | 
					    (function() {
 | 
				
			||||||
        _.each(utils.retrieveIndexArray(fileDesc.fileIndex + ".publish"), function(publishIndex) {
 | 
					        var publishIndexMap = {};
 | 
				
			||||||
            try {
 | 
					        _.each(fileSystem, function(fileDesc) {
 | 
				
			||||||
                var publishAttributes = JSON.parse(storage[publishIndex]);
 | 
					            utils.retrieveIndexArray(fileDesc.fileIndex + ".publish").forEach(function(publishIndex) {
 | 
				
			||||||
                // Store publishIndex
 | 
					                try {
 | 
				
			||||||
                publishAttributes.publishIndex = publishIndex;
 | 
					                    var publishAttributes = JSON.parse(storage[publishIndex]);
 | 
				
			||||||
                // Replace provider ID by provider module in attributes
 | 
					                    // Store publishIndex
 | 
				
			||||||
                var provider = providerMap[publishAttributes.provider];
 | 
					                    publishAttributes.publishIndex = publishIndex;
 | 
				
			||||||
                if(!provider) {
 | 
					                    // Replace provider ID by provider module in attributes
 | 
				
			||||||
                    throw new Error("Invalid provider ID: " + publishAttributes.provider);
 | 
					                    var provider = providerMap[publishAttributes.provider];
 | 
				
			||||||
 | 
					                    if(!provider) {
 | 
				
			||||||
 | 
					                        throw new Error("Invalid provider ID: " + publishAttributes.provider);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    publishAttributes.provider = provider;
 | 
				
			||||||
 | 
					                    fileDesc.publishLocations[publishIndex] = publishAttributes;
 | 
				
			||||||
 | 
					                    publishIndexMap[publishIndex] = publishAttributes;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                publishAttributes.provider = provider;
 | 
					                catch(e) {
 | 
				
			||||||
                fileDesc.publishLocations[publishIndex] = publishAttributes;
 | 
					                    // storage can be corrupted
 | 
				
			||||||
            }
 | 
					                    eventMgr.onError(e);
 | 
				
			||||||
            catch(e) {
 | 
					                    // Remove publish location
 | 
				
			||||||
                // storage can be corrupted
 | 
					                    utils.removeIndexFromArray(fileDesc.fileIndex + ".publish", publishIndex);
 | 
				
			||||||
                eventMgr.onError(e);
 | 
					                }
 | 
				
			||||||
                // Remove publish location
 | 
					            });
 | 
				
			||||||
                utils.removeIndexFromArray(fileDesc.fileIndex + ".publish", publishIndex);
 | 
					        });
 | 
				
			||||||
                storage.removeItem(publishIndex);
 | 
					
 | 
				
			||||||
 | 
					        // Clean fields from deleted files in local storage
 | 
				
			||||||
 | 
					        Object.keys(storage).forEach(function(key) {
 | 
				
			||||||
 | 
					            var match = key.match(/(publish\.\S+?)\.\S+/);
 | 
				
			||||||
 | 
					            if(match && !publishIndexMap.hasOwnProperty(match[1])) {
 | 
				
			||||||
 | 
					                storage.removeItem(key);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Apply template to the current document
 | 
					    // Apply template to the current document
 | 
				
			||||||
    publisher.applyTemplate = function(fileDesc, publishAttributes, html) {
 | 
					    publisher.applyTemplate = function(fileDesc, publishAttributes, html) {
 | 
				
			||||||
 | 
				
			|||||||
@ -134,29 +134,7 @@ define([
 | 
				
			|||||||
        version = "v7";
 | 
					        version = "v7";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(version == "v7") {
 | 
					    if(version == "v7" || version == "v8" || version == "v9") {
 | 
				
			||||||
        _.each(_.keys(localStorage), function(key) {
 | 
					 | 
				
			||||||
            var matchResult = key.match(/(file\.\S+\.)\S+/);
 | 
					 | 
				
			||||||
            if(matchResult) {
 | 
					 | 
				
			||||||
                if(!_.has(localStorage, matchResult[1] + 'title')) {
 | 
					 | 
				
			||||||
                    localStorage.removeItem(key);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        version = "v8";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(version == "v8") {
 | 
					 | 
				
			||||||
        _.each(_.keys(localStorage), function(key) {
 | 
					 | 
				
			||||||
            var matchResult = key.match(/file\.\S+\.(editorEnd|editorStart)/);
 | 
					 | 
				
			||||||
            if(matchResult) {
 | 
					 | 
				
			||||||
                localStorage.removeItem(key);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        version = "v9";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(version == "v9") {
 | 
					 | 
				
			||||||
        if(_.has(localStorage, 'settings')) {
 | 
					        if(_.has(localStorage, 'settings')) {
 | 
				
			||||||
            settings = JSON.parse(localStorage.settings);
 | 
					            settings = JSON.parse(localStorage.settings);
 | 
				
			||||||
            delete settings.editorFontFamily;
 | 
					            delete settings.editorFontFamily;
 | 
				
			||||||
@ -235,26 +213,9 @@ define([
 | 
				
			|||||||
        version = "v16";
 | 
					        version = "v16";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(version == "v16") {
 | 
					    if(version == "v16" || version == "v17") {
 | 
				
			||||||
        _.each(_.keys(localStorage), function(key) {
 | 
					 | 
				
			||||||
            var matchResult = key.match(/(file\.\S+\.)\S+/);
 | 
					 | 
				
			||||||
            if(matchResult) {
 | 
					 | 
				
			||||||
                if(!_.has(localStorage, matchResult[1] + 'title')) {
 | 
					 | 
				
			||||||
                    localStorage.removeItem(key);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        version = "v17";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(version == "v17") {
 | 
					 | 
				
			||||||
        localStorage.removeItem('focusMode');
 | 
					        localStorage.removeItem('focusMode');
 | 
				
			||||||
        localStorage.removeItem('mode');
 | 
					        localStorage.removeItem('mode');
 | 
				
			||||||
        _.each(_.keys(localStorage), function(key) {
 | 
					 | 
				
			||||||
            if(key.match(/file\.\S+\.editorSelectRange/)) {
 | 
					 | 
				
			||||||
                localStorage.removeItem(key);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        version = "v18";
 | 
					        version = "v18";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -24,29 +24,40 @@ define([
 | 
				
			|||||||
    }).compact().object().value();
 | 
					    }).compact().object().value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Retrieve sync locations from storage
 | 
					    // Retrieve sync locations from storage
 | 
				
			||||||
    _.each(fileSystem, function(fileDesc) {
 | 
					    (function() {
 | 
				
			||||||
        _.each(utils.retrieveIndexArray(fileDesc.fileIndex + ".sync"), function(syncIndex) {
 | 
					        var syncIndexMap = {};
 | 
				
			||||||
            try {
 | 
					        _.each(fileSystem, function(fileDesc) {
 | 
				
			||||||
                var syncAttributes = JSON.parse(storage[syncIndex]);
 | 
					            utils.retrieveIndexArray(fileDesc.fileIndex + ".sync").forEach(function(syncIndex) {
 | 
				
			||||||
                // Store syncIndex
 | 
					                try {
 | 
				
			||||||
                syncAttributes.syncIndex = syncIndex;
 | 
					                    var syncAttributes = JSON.parse(storage[syncIndex]);
 | 
				
			||||||
                // Replace provider ID by provider module in attributes
 | 
					                    // Store syncIndex
 | 
				
			||||||
                var provider = providerMap[syncAttributes.provider];
 | 
					                    syncAttributes.syncIndex = syncIndex;
 | 
				
			||||||
                if(!provider) {
 | 
					                    // Replace provider ID by provider module in attributes
 | 
				
			||||||
                    throw new Error("Invalid provider ID: " + syncAttributes.provider);
 | 
					                    var provider = providerMap[syncAttributes.provider];
 | 
				
			||||||
 | 
					                    if(!provider) {
 | 
				
			||||||
 | 
					                        throw new Error("Invalid provider ID: " + syncAttributes.provider);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    syncAttributes.provider = provider;
 | 
				
			||||||
 | 
					                    fileDesc.syncLocations[syncIndex] = syncAttributes;
 | 
				
			||||||
 | 
					                    syncIndexMap[syncIndex] = syncAttributes;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                syncAttributes.provider = provider;
 | 
					                catch(e) {
 | 
				
			||||||
                fileDesc.syncLocations[syncIndex] = syncAttributes;
 | 
					                    // storage can be corrupted
 | 
				
			||||||
            }
 | 
					                    eventMgr.onError(e);
 | 
				
			||||||
            catch(e) {
 | 
					                    // Remove sync location
 | 
				
			||||||
                // storage can be corrupted
 | 
					                    utils.removeIndexFromArray(fileDesc.fileIndex + ".sync", syncIndex);
 | 
				
			||||||
                eventMgr.onError(e);
 | 
					                }
 | 
				
			||||||
                // Remove sync location
 | 
					            });
 | 
				
			||||||
                utils.removeIndexFromArray(fileDesc.fileIndex + ".sync", syncIndex);
 | 
					        });
 | 
				
			||||||
                storage.removeItem(syncIndex);
 | 
					
 | 
				
			||||||
 | 
					        // Clean fields from deleted files in local storage
 | 
				
			||||||
 | 
					        Object.keys(storage).forEach(function(key) {
 | 
				
			||||||
 | 
					            var match = key.match(/(sync\.\S+?)\.\S+/);
 | 
				
			||||||
 | 
					            if(match && !syncIndexMap.hasOwnProperty(match[1])) {
 | 
				
			||||||
 | 
					                storage.removeItem(key);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // AutoSync configuration
 | 
					    // AutoSync configuration
 | 
				
			||||||
    _.each(providerMap, function(provider) {
 | 
					    _.each(providerMap, function(provider) {
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,18 @@ define([
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Generates a 24 chars length random string (should be enough to prevent collisions)
 | 
				
			||||||
 | 
					    utils.randomString = (function() {
 | 
				
			||||||
 | 
					        var max = Math.pow(36, 6);
 | 
				
			||||||
 | 
					        function s6() {
 | 
				
			||||||
 | 
					            // Linear [0-9a-z]{6} random string
 | 
				
			||||||
 | 
					            return ('000000' + (Math.random() * max | 0).toString(36)).slice(-6);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return function() {
 | 
				
			||||||
 | 
					            return [s6(), s6(), s6(), s6()].join('');
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Return a parameter from the URL
 | 
					    // Return a parameter from the URL
 | 
				
			||||||
    utils.getURLParameter = function(name) {
 | 
					    utils.getURLParameter = function(name) {
 | 
				
			||||||
        // Parameter can be either a search parameter (&name=...) or a hash fragment parameter (#!name=...)
 | 
					        // Parameter can be either a search parameter (&name=...) or a hash fragment parameter (#!name=...)
 | 
				
			||||||
@ -326,14 +338,9 @@ define([
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Generates a random string
 | 
					 | 
				
			||||||
    utils.randomString = function() {
 | 
					 | 
				
			||||||
        return _.random(4294967296).toString(36);
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Time shared by others modules
 | 
					    // Time shared by others modules
 | 
				
			||||||
    utils.updateCurrentTime = function() {
 | 
					    utils.updateCurrentTime = function() {
 | 
				
			||||||
        utils.currentTime = new Date().getTime();
 | 
					        utils.currentTime = Date.now();
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    utils.updateCurrentTime();
 | 
					    utils.updateCurrentTime();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user