diff --git a/public_html/js/Api.js b/public_html/js/Api.js index 63db4057..3d195b92 100644 --- a/public_html/js/Api.js +++ b/public_html/js/Api.js @@ -2,130 +2,130 @@ var App = App || {}; App.API = function(_, jQuery, promise, appState) { - var baseUrl = '/api/'; - var AJAX_UNSENT = 0; - var AJAX_OPENED = 1; - var AJAX_HEADERS_RECEIVED = 2; - var AJAX_LOADING = 3; - var AJAX_DONE = 4; + var baseUrl = '/api/'; + var AJAX_UNSENT = 0; + var AJAX_OPENED = 1; + var AJAX_HEADERS_RECEIVED = 2; + var AJAX_LOADING = 3; + var AJAX_DONE = 4; - var cache = {}; + var cache = {}; - function get(url, data) { - return request('GET', url, data); - } + function get(url, data) { + return request('GET', url, data); + } - function post(url, data) { - return request('POST', url, data); - } + function post(url, data) { + return request('POST', url, data); + } - function put(url, data) { - return request('PUT', url, data); - } + function put(url, data) { + return request('PUT', url, data); + } - function _delete(url, data) { - return request('DELETE', url, data); - } + function _delete(url, data) { + return request('DELETE', url, data); + } - function getCacheKey(method, url, data) { - return JSON.stringify({method: method, url: url, data: data}); - } + function getCacheKey(method, url, data) { + return JSON.stringify({method: method, url: url, data: data}); + } - function clearCache() { - cache = {}; - } + function clearCache() { + cache = {}; + } - function request(method, url, data) { - if (method === 'GET') { - return requestWithCache(method, url, data); - } - clearCache(); - return requestWithAjax(method, url, data); - } + function request(method, url, data) { + if (method === 'GET') { + return requestWithCache(method, url, data); + } + clearCache(); + return requestWithAjax(method, url, data); + } - function requestWithCache(method, url, data) { - var cacheKey = getCacheKey(method, url, data); - if (_.has(cache, cacheKey)) { - return promise.make(function(resolve, reject) { - resolve(cache[cacheKey]); - }); - } + function requestWithCache(method, url, data) { + var cacheKey = getCacheKey(method, url, data); + if (_.has(cache, cacheKey)) { + return promise.make(function(resolve, reject) { + resolve(cache[cacheKey]); + }); + } - return promise.make(function(resolve, reject) { - promise.wait(requestWithAjax(method, url, data)) - .then(function(response) { - setCache(method, url, data, response); - resolve(response); - }).fail(function(response) { - reject(response); - }); - }); - } + return promise.make(function(resolve, reject) { + promise.wait(requestWithAjax(method, url, data)) + .then(function(response) { + setCache(method, url, data, response); + resolve(response); + }).fail(function(response) { + reject(response); + }); + }); + } - function setCache(method, url, data, response) { - var cacheKey = getCacheKey(method, url, data); - cache[cacheKey] = response; - } + function setCache(method, url, data, response) { + var cacheKey = getCacheKey(method, url, data); + cache[cacheKey] = response; + } - function requestWithAjax(method, url, data) { - var fullUrl = baseUrl + '/' + url; - fullUrl = fullUrl.replace(/\/{2,}/, '/'); + function requestWithAjax(method, url, data) { + var fullUrl = baseUrl + '/' + url; + fullUrl = fullUrl.replace(/\/{2,}/, '/'); - var xhr = null; - var apiPromise = promise.make(function(resolve, reject) { - var options = { - headers: { - 'X-Authorization-Token': appState.get('loginToken') || '', - }, - success: function(data, textStatus, xhr) { - resolve({ - status: xhr.status, - json: stripMeta(data)}); - }, - error: function(xhr, textStatus, errorThrown) { - reject({ - status: xhr.status, - json: xhr.responseJSON ? - stripMeta(xhr.responseJSON) : - {error: errorThrown}}); - }, - type: method, - url: fullUrl, - data: data, - cache: false, - }; - if (data instanceof FormData) { - options.processData = false; - options.contentType = false; - } - xhr = jQuery.ajax(options); - }); - apiPromise.xhr = xhr; - return apiPromise; - } + var xhr = null; + var apiPromise = promise.make(function(resolve, reject) { + var options = { + headers: { + 'X-Authorization-Token': appState.get('loginToken') || '', + }, + success: function(data, textStatus, xhr) { + resolve({ + status: xhr.status, + json: stripMeta(data)}); + }, + error: function(xhr, textStatus, errorThrown) { + reject({ + status: xhr.status, + json: xhr.responseJSON ? + stripMeta(xhr.responseJSON) : + {error: errorThrown}}); + }, + type: method, + url: fullUrl, + data: data, + cache: false, + }; + if (data instanceof FormData) { + options.processData = false; + options.contentType = false; + } + xhr = jQuery.ajax(options); + }); + apiPromise.xhr = xhr; + return apiPromise; + } - function stripMeta(data) { - var result = {}; - _.each(data, function(v, k) { - if (!k.match(/^__/)) { - result[k] = v; - } - }); - return result; - } + function stripMeta(data) { + var result = {}; + _.each(data, function(v, k) { + if (!k.match(/^__/)) { + result[k] = v; + } + }); + return result; + } - return { - get: get, - post: post, - put: put, - delete: _delete, + return { + get: get, + post: post, + put: put, + delete: _delete, - AJAX_UNSENT: AJAX_UNSENT, - AJAX_OPENED: AJAX_OPENED, - AJAX_HEADERS_RECEIVED: AJAX_HEADERS_RECEIVED, - AJAX_LOADING: AJAX_LOADING, - AJAX_DONE: AJAX_DONE, - }; + AJAX_UNSENT: AJAX_UNSENT, + AJAX_OPENED: AJAX_OPENED, + AJAX_HEADERS_RECEIVED: AJAX_HEADERS_RECEIVED, + AJAX_LOADING: AJAX_LOADING, + AJAX_DONE: AJAX_DONE, + }; }; diff --git a/public_html/js/Auth.js b/public_html/js/Auth.js index 38ddc97a..468b571c 100644 --- a/public_html/js/Auth.js +++ b/public_html/js/Auth.js @@ -2,198 +2,198 @@ var App = App || {}; App.Auth = function(_, jQuery, util, api, appState, promise) { - var privileges = { - register: 'register', - listUsers: 'listUsers', - viewUsers: 'viewUsers', - viewAllAccessRanks: 'viewAllAccessRanks', - viewAllEmailAddresses: 'viewAllEmailAddresses', - changeAccessRank: 'changeAccessRank', - changeOwnAvatarStyle: 'changeOwnAvatarStyle', - changeOwnEmailAddress: 'changeOwnEmailAddress', - changeOwnName: 'changeOwnName', - changeOwnPassword: 'changeOwnPassword', - changeAllAvatarStyles: 'changeAllAvatarStyles', - changeAllEmailAddresses: 'changeAllEmailAddresses', - changeAllNames: 'changeAllNames', - changeAllPasswords: 'changeAllPasswords', - deleteOwnAccount: 'deleteOwnAccount', - deleteAllAccounts: 'deleteAllAccounts', - banUsers: 'banUsers', + var privileges = { + register: 'register', + listUsers: 'listUsers', + viewUsers: 'viewUsers', + viewAllAccessRanks: 'viewAllAccessRanks', + viewAllEmailAddresses: 'viewAllEmailAddresses', + changeAccessRank: 'changeAccessRank', + changeOwnAvatarStyle: 'changeOwnAvatarStyle', + changeOwnEmailAddress: 'changeOwnEmailAddress', + changeOwnName: 'changeOwnName', + changeOwnPassword: 'changeOwnPassword', + changeAllAvatarStyles: 'changeAllAvatarStyles', + changeAllEmailAddresses: 'changeAllEmailAddresses', + changeAllNames: 'changeAllNames', + changeAllPasswords: 'changeAllPasswords', + deleteOwnAccount: 'deleteOwnAccount', + deleteAllAccounts: 'deleteAllAccounts', + banUsers: 'banUsers', - listPosts: 'listPosts', - viewPosts: 'viewPosts', - uploadPosts: 'uploadPosts', - uploadPostsAnonymously: 'uploadPostsAnonymously', - deletePosts: 'deletePosts', - featurePosts: 'featurePosts', - changePostSafety: 'changePostSafety', - changePostSource: 'changePostSource', - changePostTags: 'changePostTags', - changePostContent: 'changePostContent', - changePostThumbnail: 'changePostThumbnail', - changePostRelations: 'changePostRelations', - changePostFlags: 'changePostFlags', + listPosts: 'listPosts', + viewPosts: 'viewPosts', + uploadPosts: 'uploadPosts', + uploadPostsAnonymously: 'uploadPostsAnonymously', + deletePosts: 'deletePosts', + featurePosts: 'featurePosts', + changePostSafety: 'changePostSafety', + changePostSource: 'changePostSource', + changePostTags: 'changePostTags', + changePostContent: 'changePostContent', + changePostThumbnail: 'changePostThumbnail', + changePostRelations: 'changePostRelations', + changePostFlags: 'changePostFlags', - addPostNotes: 'addPostNotes', - editPostNotes: 'editPostNotes', - deletePostNotes: 'deletePostNotes', + addPostNotes: 'addPostNotes', + editPostNotes: 'editPostNotes', + deletePostNotes: 'deletePostNotes', - listComments: 'listComments', - addComments: 'addComments', - editOwnComments: 'editOwnComments', - editAllComments: 'editAllComments', - deleteOwnComments: 'deleteOwnComments', - deleteAllComments: 'deleteAllComments', - deleteTags: 'deleteTags', - mergeTags: 'mergeTags', + listComments: 'listComments', + addComments: 'addComments', + editOwnComments: 'editOwnComments', + editAllComments: 'editAllComments', + deleteOwnComments: 'deleteOwnComments', + deleteAllComments: 'deleteAllComments', + deleteTags: 'deleteTags', + mergeTags: 'mergeTags', - listTags: 'listTags', - massTag: 'massTag', - changeTagName: 'changeTagName', - changeTagCategory: 'changeTagCategory', - changeTagImplications: 'changeTagImplications', - changeTagSuggestions: 'changeTagSuggestions', - banTags: 'banTags', + listTags: 'listTags', + massTag: 'massTag', + changeTagName: 'changeTagName', + changeTagCategory: 'changeTagCategory', + changeTagImplications: 'changeTagImplications', + changeTagSuggestions: 'changeTagSuggestions', + banTags: 'banTags', - viewHistory: 'viewHistory', - }; + viewHistory: 'viewHistory', + }; - function loginFromCredentials(userNameOrEmail, password, remember) { - return promise.make(function(resolve, reject) { - promise.wait(api.post('/login', {userNameOrEmail: userNameOrEmail, password: password})) - .then(function(response) { - updateAppState(response); - jQuery.cookie( - 'auth', - response.json.token.name, - remember ? { expires: 365 } : {}); - resolve(response); - }).fail(function(response) { - reject(response); - }); - }); - } + function loginFromCredentials(userNameOrEmail, password, remember) { + return promise.make(function(resolve, reject) { + promise.wait(api.post('/login', {userNameOrEmail: userNameOrEmail, password: password})) + .then(function(response) { + updateAppState(response); + jQuery.cookie( + 'auth', + response.json.token.name, + remember ? { expires: 365 } : {}); + resolve(response); + }).fail(function(response) { + reject(response); + }); + }); + } - function loginFromToken(token, isFromCookie) { - return promise.make(function(resolve, reject) { - var fd = { - token: token, - isFromCookie: isFromCookie - }; - promise.wait(api.post('/login', fd)) - .then(function(response) { - updateAppState(response); - resolve(response); - }).fail(function(response) { - reject(response); - }); - }); - } + function loginFromToken(token, isFromCookie) { + return promise.make(function(resolve, reject) { + var fd = { + token: token, + isFromCookie: isFromCookie + }; + promise.wait(api.post('/login', fd)) + .then(function(response) { + updateAppState(response); + resolve(response); + }).fail(function(response) { + reject(response); + }); + }); + } - function loginAnonymous() { - return promise.make(function(resolve, reject) { - promise.wait(api.post('/login')) - .then(function(response) { - updateAppState(response); - resolve(response); - }).fail(function(response) { - reject(response); - }); - }); - } + function loginAnonymous() { + return promise.make(function(resolve, reject) { + promise.wait(api.post('/login')) + .then(function(response) { + updateAppState(response); + resolve(response); + }).fail(function(response) { + reject(response); + }); + }); + } - function logout() { - return promise.make(function(resolve, reject) { - jQuery.removeCookie('auth'); - appState.set('loginToken', null); - return promise.wait(loginAnonymous()) - .then(resolve) - .fail(reject); - }); - } + function logout() { + return promise.make(function(resolve, reject) { + jQuery.removeCookie('auth'); + appState.set('loginToken', null); + return promise.wait(loginAnonymous()) + .then(resolve) + .fail(reject); + }); + } - function tryLoginFromCookie() { - return promise.make(function(resolve, reject) { - if (isLoggedIn()) { - resolve(); - return; - } + function tryLoginFromCookie() { + return promise.make(function(resolve, reject) { + if (isLoggedIn()) { + resolve(); + return; + } - var authCookie = jQuery.cookie('auth'); - if (!authCookie) { - reject(); - return; - } + var authCookie = jQuery.cookie('auth'); + if (!authCookie) { + reject(); + return; + } - promise.wait(loginFromToken(authCookie, true)) - .then(function(response) { - resolve(); - }).fail(function(response) { - jQuery.removeCookie('auth'); - reject(); - }); - }); - } + promise.wait(loginFromToken(authCookie, true)) + .then(function(response) { + resolve(); + }).fail(function(response) { + jQuery.removeCookie('auth'); + reject(); + }); + }); + } - function updateAppState(response) { - appState.set('privileges', response.json.privileges || []); - appState.set('loginToken', response.json.token && response.json.token.name); - appState.set('loggedIn', response.json.user && !!response.json.user.id); - appState.set('loggedInUser', response.json.user); - } + function updateAppState(response) { + appState.set('privileges', response.json.privileges || []); + appState.set('loginToken', response.json.token && response.json.token.name); + appState.set('loggedIn', response.json.user && !!response.json.user.id); + appState.set('loggedInUser', response.json.user); + } - function isLoggedIn(userName) { - if (!appState.get('loggedIn')) { - return false; - } - if (typeof(userName) !== 'undefined') { - if (getCurrentUser().name !== userName) { - return false; - } - } - return true; - } + function isLoggedIn(userName) { + if (!appState.get('loggedIn')) { + return false; + } + if (typeof(userName) !== 'undefined') { + if (getCurrentUser().name !== userName) { + return false; + } + } + return true; + } - function getCurrentUser() { - return appState.get('loggedInUser'); - } + function getCurrentUser() { + return appState.get('loggedInUser'); + } - function getCurrentPrivileges() { - return appState.get('privileges'); - } + function getCurrentPrivileges() { + return appState.get('privileges'); + } - function updateCurrentUser(user) { - if (user.id !== getCurrentUser().id) { - throw new Error('Cannot set current user to other user this way.'); - } - appState.set('loggedInUser', user); - } + function updateCurrentUser(user) { + if (user.id !== getCurrentUser().id) { + throw new Error('Cannot set current user to other user this way.'); + } + appState.set('loggedInUser', user); + } - function hasPrivilege(privilege) { - return _.contains(getCurrentPrivileges(), privilege); - } + function hasPrivilege(privilege) { + return _.contains(getCurrentPrivileges(), privilege); + } - function startObservingLoginChanges(listenerName, callback) { - appState.startObserving('loggedInUser', listenerName, callback); - } + function startObservingLoginChanges(listenerName, callback) { + appState.startObserving('loggedInUser', listenerName, callback); + } - return { - loginFromCredentials: loginFromCredentials, - loginFromToken: loginFromToken, - loginAnonymous: loginAnonymous, - tryLoginFromCookie: tryLoginFromCookie, - logout: logout, + return { + loginFromCredentials: loginFromCredentials, + loginFromToken: loginFromToken, + loginAnonymous: loginAnonymous, + tryLoginFromCookie: tryLoginFromCookie, + logout: logout, - startObservingLoginChanges: startObservingLoginChanges, - isLoggedIn: isLoggedIn, - getCurrentUser: getCurrentUser, - updateCurrentUser: updateCurrentUser, - getCurrentPrivileges: getCurrentPrivileges, - hasPrivilege: hasPrivilege, + startObservingLoginChanges: startObservingLoginChanges, + isLoggedIn: isLoggedIn, + getCurrentUser: getCurrentUser, + updateCurrentUser: updateCurrentUser, + getCurrentPrivileges: getCurrentPrivileges, + hasPrivilege: hasPrivilege, - privileges: privileges, - }; + privileges: privileges, + }; }; diff --git a/public_html/js/Bootstrap.js b/public_html/js/Bootstrap.js index 23429ade..8f5e98d7 100644 --- a/public_html/js/Bootstrap.js +++ b/public_html/js/Bootstrap.js @@ -2,29 +2,29 @@ var App = App || {}; App.Bootstrap = function(auth, router, promise, presenterManager) { - promise.wait(presenterManager.init()) - .then(function() { - promise.wait(auth.tryLoginFromCookie()) - .then(startRouting) - .fail(function(error) { - promise.wait(auth.loginAnonymous()) - .then(startRouting) - .fail(function() { - console.log(arguments); - window.alert('Fatal authentication error'); - }); - }); - }).fail(function() { - console.log(arguments); - }); + promise.wait(presenterManager.init()) + .then(function() { + promise.wait(auth.tryLoginFromCookie()) + .then(startRouting) + .fail(function(error) { + promise.wait(auth.loginAnonymous()) + .then(startRouting) + .fail(function() { + console.log(arguments); + window.alert('Fatal authentication error'); + }); + }); + }).fail(function() { + console.log(arguments); + }); - function startRouting() { - try { - router.start(); - } catch (err) { - console.log(err); - } - } + function startRouting() { + try { + router.start(); + } catch (err) { + console.log(err); + } + } }; diff --git a/public_html/js/BrowsingSettings.js b/public_html/js/BrowsingSettings.js index 79c8a881..142958d8 100644 --- a/public_html/js/BrowsingSettings.js +++ b/public_html/js/BrowsingSettings.js @@ -1,96 +1,96 @@ var App = App || {}; App.BrowsingSettings = function( - promise, - auth, - api) { + promise, + auth, + api) { - var settings = getDefaultSettings(); + var settings = getDefaultSettings(); - auth.startObservingLoginChanges('browsing-settings', loginStateChanged); + auth.startObservingLoginChanges('browsing-settings', loginStateChanged); - readFromLocalStorage(); - if (auth.isLoggedIn()) { - loginStateChanged(); - } + readFromLocalStorage(); + if (auth.isLoggedIn()) { + loginStateChanged(); + } - function setSettings(newSettings) { - settings = newSettings; - return save(); - } + function setSettings(newSettings) { + settings = newSettings; + return save(); + } - function getSettings() { - return settings; - } + function getSettings() { + return settings; + } - function getDefaultSettings() { - return { - hideDownvoted: true, - endlessScroll: false, - listPosts: { - safe: true, - sketchy: true, - unsafe: true, - }, - keyboardShortcuts: true, - }; - } + function getDefaultSettings() { + return { + hideDownvoted: true, + endlessScroll: false, + listPosts: { + safe: true, + sketchy: true, + unsafe: true, + }, + keyboardShortcuts: true, + }; + } - function loginStateChanged() { - readFromUser(auth.getCurrentUser()); - } + function loginStateChanged() { + readFromUser(auth.getCurrentUser()); + } - function readFromLocalStorage() { - readFromString(localStorage.getItem('browsingSettings')); - } + function readFromLocalStorage() { + readFromString(localStorage.getItem('browsingSettings')); + } - function readFromUser(user) { - readFromString(user.browsingSettings); - } + function readFromUser(user) { + readFromString(user.browsingSettings); + } - function readFromString(string) { - if (!string) { - return; - } + function readFromString(string) { + if (!string) { + return; + } - try { - if (typeof(string) === 'string' || string instanceof String) { - settings = JSON.parse(string); - } else { - settings = string; - } - } catch (e) { - } - } + try { + if (typeof(string) === 'string' || string instanceof String) { + settings = JSON.parse(string); + } else { + settings = string; + } + } catch (e) { + } + } - function saveToLocalStorage() { - localStorage.setItem('browsingSettings', JSON.stringify(settings)); - } + function saveToLocalStorage() { + localStorage.setItem('browsingSettings', JSON.stringify(settings)); + } - function saveToUser(user) { - var formData = { - browsingSettings: JSON.stringify(settings), - }; - return api.post('/users/' + user.name, formData); - } + function saveToUser(user) { + var formData = { + browsingSettings: JSON.stringify(settings), + }; + return api.post('/users/' + user.name, formData); + } - function save() { - return promise.make(function(resolve, reject) { - saveToLocalStorage(); - if (auth.isLoggedIn()) { - promise.wait(saveToUser(auth.getCurrentUser())) - .then(resolve) - .fail(reject); - } else { - resolve(); - } - }); - } + function save() { + return promise.make(function(resolve, reject) { + saveToLocalStorage(); + if (auth.isLoggedIn()) { + promise.wait(saveToUser(auth.getCurrentUser())) + .then(resolve) + .fail(reject); + } else { + resolve(); + } + }); + } - return { - getSettings: getSettings, - setSettings: setSettings, - }; + return { + getSettings: getSettings, + setSettings: setSettings, + }; }; diff --git a/public_html/js/Controls/AutoCompleteInput.js b/public_html/js/Controls/AutoCompleteInput.js index 0c268bd6..99aecf91 100644 --- a/public_html/js/Controls/AutoCompleteInput.js +++ b/public_html/js/Controls/AutoCompleteInput.js @@ -2,273 +2,273 @@ var App = App || {}; App.Controls = App.Controls || {}; App.Controls.AutoCompleteInput = function($input) { - var _ = App.DI.get('_'); - var jQuery = App.DI.get('jQuery'); - var tagList = App.DI.get('tagList'); + var _ = App.DI.get('_'); + var jQuery = App.DI.get('jQuery'); + var tagList = App.DI.get('tagList'); - var KEY_TAB = 9; - var KEY_RETURN = 13; - var KEY_DELETE = 46; - var KEY_ESCAPE = 27; - var KEY_UP = 38; - var KEY_DOWN = 40; + var KEY_TAB = 9; + var KEY_RETURN = 13; + var KEY_DELETE = 46; + var KEY_ESCAPE = 27; + var KEY_UP = 38; + var KEY_DOWN = 40; - var options = { - caseSensitive: false, - source: null, - maxResults: 15, - minLengthToArbitrarySearch: 3, - onApply: null, - onDelete: null, - onRender: null, - additionalFilter: null, - }; - var showTimeout = null; - var cachedSource = null; - var results = []; - var activeResult = -1; - var monitorInputHidingInterval = null; + var options = { + caseSensitive: false, + source: null, + maxResults: 15, + minLengthToArbitrarySearch: 3, + onApply: null, + onDelete: null, + onRender: null, + additionalFilter: null, + }; + var showTimeout = null; + var cachedSource = null; + var results = []; + var activeResult = -1; + var monitorInputHidingInterval = null; - if ($input.length === 0) { - throw new Error('Input element was not found'); - } - if ($input.length > 1) { - throw new Error('Cannot add autocompletion to more than one element at once'); - } - if ($input.attr('data-autocomplete')) { - throw new Error('Autocompletion was already added for this element'); - } - $input.attr('data-autocomplete', true); - $input.attr('autocomplete', 'off'); + if ($input.length === 0) { + throw new Error('Input element was not found'); + } + if ($input.length > 1) { + throw new Error('Cannot add autocompletion to more than one element at once'); + } + if ($input.attr('data-autocomplete')) { + throw new Error('Autocompletion was already added for this element'); + } + $input.attr('data-autocomplete', true); + $input.attr('autocomplete', 'off'); - var $div = jQuery('
'); - var $list = jQuery('