diff --git a/dashboard-ui/bower_components/emby-apiclient/.bower.json b/dashboard-ui/bower_components/emby-apiclient/.bower.json index 5e0ef141d..af80dd825 100644 --- a/dashboard-ui/bower_components/emby-apiclient/.bower.json +++ b/dashboard-ui/bower_components/emby-apiclient/.bower.json @@ -11,19 +11,19 @@ "license": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript/blob/master/LICENSE", "homepage": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript", "dependencies": { - "cryptojslib": "cryptojslib#^3.1.2" + "cryptojslib": "cryptojslib#^3.1.2", + "requirejs": "requirejs#^2.1.22" }, "devDependencies": {}, "ignore": [], - "version": "1.0.3", - "_release": "1.0.3", + "version": "1.0.16", + "_release": "1.0.16", "_resolution": { "type": "version", - "tag": "1.0.3", - "commit": "8e6266950e05e2d032d62340cb7307a3d19a23ec" + "tag": "1.0.16", + "commit": "a454b78f6e617aef9359736c57f38ac40fcc8d61" }, "_source": "git://github.com/MediaBrowser/Emby.ApiClient.Javascript.git", "_target": "~1.0.3", - "_originalSource": "emby-apiclient", - "_direct": true + "_originalSource": "emby-apiclient" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-apiclient/apiclient.js b/dashboard-ui/bower_components/emby-apiclient/apiclient.js index e5dd53f13..93f946120 100644 --- a/dashboard-ui/bower_components/emby-apiclient/apiclient.js +++ b/dashboard-ui/bower_components/emby-apiclient/apiclient.js @@ -1,8 +1,4 @@ -(function (globalScope, JSON, WebSocket, setTimeout, devicePixelRatio, FileReader) { - - if (!globalScope.MediaBrowser) { - globalScope.MediaBrowser = {}; - } +define(['events'], function (Events) { /** * Creates a new api client instance @@ -10,17 +6,17 @@ * @param {String} clientName s * @param {String} applicationVersion */ - globalScope.MediaBrowser.ApiClient = function (logger, serverAddress, clientName, applicationVersion, deviceName, deviceId) { + return function (serverAddress, clientName, applicationVersion, deviceName, deviceId, devicePixelRatio) { if (!serverAddress) { throw new Error("Must supply a serverAddress"); } - logger.log('ApiClient serverAddress: ' + serverAddress); - logger.log('ApiClient clientName: ' + clientName); - logger.log('ApiClient applicationVersion: ' + applicationVersion); - logger.log('ApiClient deviceName: ' + deviceName); - logger.log('ApiClient deviceId: ' + deviceId); + console.log('ApiClient serverAddress: ' + serverAddress); + console.log('ApiClient clientName: ' + clientName); + console.log('ApiClient applicationVersion: ' + applicationVersion); + console.log('ApiClient deviceName: ' + deviceName); + console.log('ApiClient deviceId: ' + deviceId); var self = this; var webSocket; @@ -267,7 +263,7 @@ } if (self.enableAutomaticNetworking === false || request.type != "GET") { - logger.log('Requesting url without automatic networking: ' + request.url); + console.log('Requesting url without automatic networking: ' + request.url); return getFetchPromise(request).then(function (response) { @@ -337,7 +333,7 @@ connectionMode = switchConnectionMode(connectionMode); var url = MediaBrowser.ServerInfo.getServerAddress(self.serverInfo(), connectionMode); - logger.log("Attempting reconnection to " + url); + console.log("Attempting reconnection to " + url); var timeout = connectionMode == MediaBrowser.ConnectionMode.Local ? 7000 : 15000; @@ -351,7 +347,7 @@ }, timeout).then(function () { - logger.log("Reconnect succeeded to " + url); + console.log("Reconnect succeeded to " + url); self.serverInfo().LastConnectionMode = connectionMode; self.serverAddress(url); @@ -360,7 +356,7 @@ }, function () { - logger.log("Reconnect attempt failed to " + url); + console.log("Reconnect attempt failed to " + url); if (currentRetryCount < 5) { @@ -388,7 +384,7 @@ self.fetchWithFailover = function (request, enableReconnection) { - logger.log("Requesting " + request.url); + console.log("Requesting " + request.url); request.timeout = 30000; @@ -408,32 +404,32 @@ }, function (error) { - logger.log("Request failed to " + request.url); + console.log("Request failed to " + request.url); // http://api.jquery.com/jQuery.ajax/ if (enableReconnection) { - logger.log("Attempting reconnection"); + console.log("Attempting reconnection"); var previousServerAddress = self.serverAddress(); return tryReconnect().then(function () { - logger.log("Reconnect succeesed"); + console.log("Reconnect succeesed"); request.url = request.url.replace(previousServerAddress, self.serverAddress()); return self.fetchWithFailover(request, false); }, function (innerError) { - logger.log("Reconnect failed"); + console.log("Reconnect failed"); onFetchFail(request.url, {}); throw innerError; }); } else { - logger.log("Reporting request failure"); + console.log("Reporting request failure"); onFetchFail(request.url, {}); throw error; @@ -496,7 +492,7 @@ throw new Error('connectionMode cannot be null'); } - logger.log('Begin updateServerInfo. connectionMode: ' + connectionMode); + console.log('Begin updateServerInfo. connectionMode: ' + connectionMode); self.serverInfo(server); @@ -505,7 +501,7 @@ if (!serverUrl) { throw new Error('serverUrl cannot be null. serverInfo: ' + JSON.stringify(server)); } - logger.log('Setting server address to ' + serverUrl); + console.log('Setting server address to ' + serverUrl); self.serverAddress(serverUrl); }; @@ -536,7 +532,7 @@ webSocket.onopen = function () { - logger.log('web socket connection opened'); + console.log('web socket connection opened'); setTimeout(function () { Events.trigger(self, 'websocketopen'); }, 0); @@ -578,7 +574,7 @@ self.sendWebSocketMessage = function (name, data) { - logger.log('Sending web socket message: ' + name); + console.log('Sending web socket message: ' + name); var msg = { MessageType: name }; @@ -3412,5 +3408,4 @@ return self.getJSON(url); }; }; - -})(window, window.JSON, window.WebSocket, window.setTimeout, window.devicePixelRatio, window.FileReader); \ No newline at end of file +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-apiclient/bower.json b/dashboard-ui/bower_components/emby-apiclient/bower.json index 19687d037..e16e0a715 100644 --- a/dashboard-ui/bower_components/emby-apiclient/bower.json +++ b/dashboard-ui/bower_components/emby-apiclient/bower.json @@ -11,7 +11,8 @@ "license": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript/blob/master/LICENSE", "homepage": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript", "dependencies": { - "cryptojslib": "cryptojslib#^3.1.2" + "cryptojslib": "cryptojslib#^3.1.2", + "requirejs": "requirejs#^2.1.22" }, "devDependencies": { diff --git a/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js b/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js index 555ebcb5d..b8e686a6b 100644 --- a/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js +++ b/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js @@ -1,10 +1,6 @@ -(function (globalScope) { +define(['events', 'apiclient'], function (Events, apiClientFactory) { - if (!globalScope.MediaBrowser) { - globalScope.MediaBrowser = {}; - } - - globalScope.MediaBrowser.ConnectionState = { + var ConnectionState = { Unavailable: 0, ServerSelection: 1, ServerSignIn: 2, @@ -12,22 +8,22 @@ ConnectSignIn: 4 }; - globalScope.MediaBrowser.ConnectionMode = { + var ConnectionMode = { Local: 0, Remote: 1, Manual: 2 }; - globalScope.MediaBrowser.ServerInfo = { + var ServerInfo = { getServerAddress: function (server, mode) { switch (mode) { - case MediaBrowser.ConnectionMode.Local: + case ConnectionMode.Local: return server.LocalAddress; - case MediaBrowser.ConnectionMode.Manual: + case ConnectionMode.Manual: return server.ManualAddress; - case MediaBrowser.ConnectionMode.Remote: + case ConnectionMode.Remote: return server.RemoteAddress; default: return server.ManualAddress || server.LocalAddress || server.RemoteAddress; @@ -35,9 +31,9 @@ } }; - globalScope.MediaBrowser.ConnectionManager = function (logger, credentialProvider, appName, appVersion, deviceName, deviceId, capabilities) { + var ConnectionManager = function (credentialProvider, appName, appVersion, deviceName, deviceId, capabilities, devicePixelRatio) { - logger.log('Begin MediaBrowser.ConnectionManager constructor'); + console.log('Begin ConnectionManager constructor'); var self = this; var apiClients = []; @@ -55,7 +51,7 @@ function resolveFailure(resolve) { resolve({ - State: MediaBrowser.ConnectionState.Unavailable, + State: ConnectionState.Unavailable, ConnectUser: self.connectUser() }); } @@ -122,7 +118,7 @@ function fetchWithTimeout(url, options, timeoutMs) { - logger.log('fetchWithTimeout: timeoutMs: ' + timeoutMs + ', url: ' + url); + console.log('fetchWithTimeout: timeoutMs: ' + timeoutMs + ', url: ' + url); return new Promise(function (resolve, reject) { @@ -131,14 +127,14 @@ fetch(url, options).then(function (response) { clearTimeout(timeout); - logger.log('fetchWithTimeout: succeeded connecting to url: ' + url); + console.log('fetchWithTimeout: succeeded connecting to url: ' + url); resolve(response); }, function (error) { clearTimeout(timeout); - logger.log('fetchWithTimeout: timed out connecting to url: ' + url); + console.log('fetchWithTimeout: timed out connecting to url: ' + url); reject(); }); @@ -168,11 +164,11 @@ request.headers = request.headers || {}; - logger.log('ConnectionManager requesting url: ' + request.url); + console.log('ConnectionManager requesting url: ' + request.url); return getFetchPromise(request).then(function (response) { - logger.log('ConnectionManager response status: ' + response.status + ', url: ' + request.url); + console.log('ConnectionManager response status: ' + response.status + ', url: ' + request.url); if (response.status < 400) { @@ -187,7 +183,7 @@ }, function (err) { - logger.log('ConnectionManager request failed to url: ' + request.url); + console.log('ConnectionManager request failed to url: ' + request.url); throw err; }); } @@ -196,7 +192,7 @@ url = getEmbyServerUrl(url, "system/info/public"); - logger.log('tryConnect url: ' + url); + console.log('tryConnect url: ' + url); return ajax({ @@ -296,8 +292,8 @@ var existingServer = existingServers.length ? existingServers[0] : {}; existingServer.DateLastAccessed = new Date().getTime(); - existingServer.LastConnectionMode = MediaBrowser.ConnectionMode.Manual; - if (existingServer.LastConnectionMode == MediaBrowser.ConnectionMode.Local) { + existingServer.LastConnectionMode = ConnectionMode.Manual; + if (existingServer.LastConnectionMode == ConnectionMode.Local) { existingServer.DateLastLocalConnection = new Date().getTime(); } existingServer.ManualAddress = apiClient.serverAddress(); @@ -332,7 +328,7 @@ self.clearData = function () { - logger.log('connection manager clearing data'); + console.log('connection manager clearing data'); connectUser = null; var credentials = credentialProvider.credentials(); @@ -354,9 +350,9 @@ if (!apiClient) { - var url = MediaBrowser.ServerInfo.getServerAddress(server, connectionMode); + var url = ServerInfo.getServerAddress(server, connectionMode); - apiClient = new MediaBrowser.ApiClient(logger, url, appName, appVersion, deviceName, deviceId); + apiClient = new apiClientFactory(url, appName, appVersion, deviceName, deviceId, devicePixelRatio); apiClients.push(apiClient); @@ -369,7 +365,7 @@ Events.trigger(self, 'apiclientcreated', [apiClient]); } - logger.log('returning instance from getOrAddApiClient'); + console.log('returning instance from getOrAddApiClient'); return apiClient; } @@ -402,7 +398,7 @@ if (options.updateDateLastAccessed !== false) { server.DateLastAccessed = new Date().getTime(); - if (server.LastConnectionMode == MediaBrowser.ConnectionMode.Local) { + if (server.LastConnectionMode == ConnectionMode.Local) { server.DateLastLocalConnection = new Date().getTime(); } } @@ -438,14 +434,14 @@ function afterConnected(apiClient, options) { options = options || {}; - if (options.reportCapabilities !== false) { apiClient.reportCapabilities(capabilities); } if (options.enableWebSocket !== false) { - if (!apiClient.isWebSocketOpenOrConnecting && apiClient.isWebSocketSupported()) { - logger.log('calling apiClient.openWebSocket'); + if (!apiClient.isWebSocketOpenOrConnecting() && apiClient.isWebSocketSupported()) { + + console.log('calling apiClient.openWebSocket'); apiClient.openWebSocket(); } @@ -516,7 +512,7 @@ throw new Error("credentials.ConnectUserId cannot be null"); } - var url = MediaBrowser.ServerInfo.getServerAddress(server, connectionMode); + var url = ServerInfo.getServerAddress(server, connectionMode); url = getEmbyServerUrl(url, "Connect/Exchange?format=json&ConnectUserId=" + credentials.ConnectUserId); @@ -547,7 +543,7 @@ return new Promise(function (resolve, reject) { - var url = MediaBrowser.ServerInfo.getServerAddress(server, connectionMode); + var url = ServerInfo.getServerAddress(server, connectionMode); ajax({ @@ -675,7 +671,7 @@ self.logout = function () { - Logger.log('begin connectionManager loguot'); + console.log('begin connectionManager loguot'); var promises = []; for (var i = 0, length = apiClients.length; i < length; i++) { @@ -743,7 +739,7 @@ function getConnectServers(credentials) { - logger.log('Begin getConnectServers'); + console.log('Begin getConnectServers'); return new Promise(function (resolve, reject) { @@ -801,7 +797,7 @@ self.getAvailableServers = function () { - logger.log('Begin getAvailableServers'); + console.log('Begin getAvailableServers'); // Clone the array var credentials = credentialProvider.credentials(); @@ -863,7 +859,7 @@ DateLastLocalConnection: new Date().getTime() }; - info.LastConnectionMode = info.ManualAddress ? MediaBrowser.ConnectionMode.Manual : MediaBrowser.ConnectionMode.Local; + info.LastConnectionMode = info.ManualAddress ? ConnectionMode.Manual : ConnectionMode.Local; return info; }); @@ -897,7 +893,7 @@ self.connect = function () { - logger.log('Begin connect'); + console.log('Begin connect'); return new Promise(function (resolve, reject) { @@ -918,7 +914,7 @@ self.connectToServers = function (servers) { - logger.log('Begin connectToServers, with ' + servers.length + ' servers'); + console.log('Begin connectToServers, with ' + servers.length + ' servers'); return new Promise(function (resolve, reject) { @@ -926,14 +922,14 @@ self.connectToServer(servers[0]).then(function (result) { - if (result.State == MediaBrowser.ConnectionState.Unavailable) { + if (result.State == ConnectionState.Unavailable) { result.State = result.ConnectUser == null ? - MediaBrowser.ConnectionState.ConnectSignIn : - MediaBrowser.ConnectionState.ServerSelection; + ConnectionState.ConnectSignIn : + ConnectionState.ServerSelection; } - logger.log('resolving connectToServers with result.State: ' + result.State); + console.log('resolving connectToServers with result.State: ' + result.State); resolve(result); }); @@ -945,14 +941,14 @@ if (firstServer) { self.connectToServer(firstServer).then(function (result) { - if (result.State == MediaBrowser.ConnectionState.SignedIn) { + if (result.State == ConnectionState.SignedIn) { resolve(result); } else { resolve({ Servers: servers, - State: (!servers.length && !self.connectUser()) ? MediaBrowser.ConnectionState.ConnectSignIn : MediaBrowser.ConnectionState.ServerSelection, + State: (!servers.length && !self.connectUser()) ? ConnectionState.ConnectSignIn : ConnectionState.ServerSelection, ConnectUser: self.connectUser() }); } @@ -962,7 +958,7 @@ resolve({ Servers: servers, - State: (!servers.length && !self.connectUser()) ? MediaBrowser.ConnectionState.ConnectSignIn : MediaBrowser.ConnectionState.ServerSelection, + State: (!servers.length && !self.connectUser()) ? ConnectionState.ConnectSignIn : ConnectionState.ServerSelection, ConnectUser: self.connectUser() }); } @@ -992,9 +988,9 @@ if (server.LastConnectionMode != null) { //tests.push(server.LastConnectionMode); } - if (tests.indexOf(MediaBrowser.ConnectionMode.Manual) == -1) { tests.push(MediaBrowser.ConnectionMode.Manual); } - if (tests.indexOf(MediaBrowser.ConnectionMode.Local) == -1) { tests.push(MediaBrowser.ConnectionMode.Local); } - if (tests.indexOf(MediaBrowser.ConnectionMode.Remote) == -1) { tests.push(MediaBrowser.ConnectionMode.Remote); } + if (tests.indexOf(ConnectionMode.Manual) == -1) { tests.push(ConnectionMode.Manual); } + if (tests.indexOf(ConnectionMode.Local) == -1) { tests.push(ConnectionMode.Local); } + if (tests.indexOf(ConnectionMode.Remote) == -1) { tests.push(ConnectionMode.Remote); } beginWakeServer(server); @@ -1014,24 +1010,24 @@ if (index >= tests.length) { - logger.log('Tested all connection modes. Failing server connection.'); + console.log('Tested all connection modes. Failing server connection.'); resolveFailure(resolve); return; } var mode = tests[index]; - var address = MediaBrowser.ServerInfo.getServerAddress(server, mode); + var address = ServerInfo.getServerAddress(server, mode); var enableRetry = false; var skipTest = false; var timeout = defaultTimeout; - if (mode == MediaBrowser.ConnectionMode.Local) { + if (mode == ConnectionMode.Local) { enableRetry = true; timeout = 8000; } - else if (mode == MediaBrowser.ConnectionMode.Manual) { + else if (mode == ConnectionMode.Manual) { if (stringEqualsIgnoreCase(address, server.LocalAddress) || stringEqualsIgnoreCase(address, server.RemoteAddress)) { @@ -1044,16 +1040,16 @@ return; } - logger.log('testing connection mode ' + mode + ' with server ' + server.Name); + console.log('testing connection mode ' + mode + ' with server ' + server.Name); tryConnect(address, timeout).then(function (result) { - logger.log('calling onSuccessfulConnection with connection mode ' + mode + ' with server ' + server.Name); + console.log('calling onSuccessfulConnection with connection mode ' + mode + ' with server ' + server.Name); onSuccessfulConnection(server, result, mode, options, resolve); }, function () { - logger.log('test failed for connection mode ' + mode + ' with server ' + server.Name); + console.log('test failed for connection mode ' + mode + ' with server ' + server.Name); if (enableRetry) { @@ -1117,7 +1113,7 @@ if (options.updateDateLastAccessed !== false) { server.DateLastAccessed = new Date().getTime(); - if (server.LastConnectionMode == MediaBrowser.ConnectionMode.Local) { + if (server.LastConnectionMode == ConnectionMode.Local) { server.DateLastLocalConnection = new Date().getTime(); } } @@ -1130,13 +1126,13 @@ result.ApiClient = getOrAddApiClient(server, connectionMode); result.State = server.AccessToken ? - MediaBrowser.ConnectionState.SignedIn : - MediaBrowser.ConnectionState.ServerSignIn; + ConnectionState.SignedIn : + ConnectionState.ServerSignIn; result.Servers.push(server); result.ApiClient.updateServerInfo(server, connectionMode); - if (result.State == MediaBrowser.ConnectionState.SignedIn) { + if (result.State == ConnectionState.SignedIn) { afterConnected(result.ApiClient, options); } @@ -1173,17 +1169,17 @@ address = normalizeAddress(address); function onFail() { - logger.log('connectToAddress ' + address + ' failed'); + console.log('connectToAddress ' + address + ' failed'); resolveFailure(resolve); } tryConnect(address, defaultTimeout).then(function (publicInfo) { - logger.log('connectToAddress ' + address + ' succeeded'); + console.log('connectToAddress ' + address + ' succeeded'); var server = { ManualAddress: address, - LastConnectionMode: MediaBrowser.ConnectionMode.Manual + LastConnectionMode: ConnectionMode.Manual }; updateServerInfo(server, publicInfo); @@ -1207,9 +1203,9 @@ return; } - require(['connectservice', 'cryptojs-md5'], function () { + require(['connectservice', 'cryptojs-md5'], function (connectservice) { - var md5 = self.getConnectPasswordHash(password); + var md5 = getConnectPasswordHash(connectservice, password); ajax({ type: "POST", @@ -1267,9 +1263,9 @@ return; } - require(['connectservice', 'cryptojs-md5'], function () { + require(['connectservice', 'cryptojs-md5'], function (connectservice) { - var md5 = self.getConnectPasswordHash(password); + var md5 = getConnectPasswordHash(connectservice, password); ajax({ type: "POST", @@ -1306,12 +1302,12 @@ }); }; - self.getConnectPasswordHash = function (password) { + function getConnectPasswordHash(connectService, password) { - password = globalScope.MediaBrowser.ConnectService.cleanPassword(password); + password = connectService.cleanPassword(password); return CryptoJS.MD5(password).toString(); - }; + } self.getApiClient = function (item) { @@ -1511,4 +1507,10 @@ return self; }; -})(window, window.Logger); \ No newline at end of file + return { + ConnectionState: ConnectionState, + ConnectionMode: ConnectionMode, + ServerInfo: ServerInfo, + ConnectionManager: ConnectionManager + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-apiclient/connectservice.js b/dashboard-ui/bower_components/emby-apiclient/connectservice.js index e27ff5e2b..f08f6df20 100644 --- a/dashboard-ui/bower_components/emby-apiclient/connectservice.js +++ b/dashboard-ui/bower_components/emby-apiclient/connectservice.js @@ -1,15 +1,6 @@ -(function (globalScope) { +define([], function () { - if (!globalScope.MediaBrowser) { - globalScope.MediaBrowser = {}; - } - - function replaceAll(str, find, replace) { - - return str.split(find).join(replace); - } - - var connectService = { + return { cleanPassword: function (password) { @@ -26,9 +17,5 @@ return password; } - }; - - globalScope.MediaBrowser.ConnectService = connectService; - -})(window); \ No newline at end of file +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-apiclient/credentials.js b/dashboard-ui/bower_components/emby-apiclient/credentials.js index 82abd6e6a..38a05c029 100644 --- a/dashboard-ui/bower_components/emby-apiclient/credentials.js +++ b/dashboard-ui/bower_components/emby-apiclient/credentials.js @@ -1,10 +1,6 @@ -(function (globalScope, JSON) { +define(['events'], function (Events) { - if (!globalScope.MediaBrowser) { - globalScope.MediaBrowser = {}; - } - - globalScope.MediaBrowser.CredentialProvider = function (key) { + return function (key) { var self = this; var credentials = null; @@ -16,7 +12,7 @@ var json = appStorage.getItem(key) || '{}'; - Logger.log('credentials initialized with: ' + json); + console.log('credentials initialized with: ' + json); credentials = JSON.parse(json); credentials.Servers = credentials.Servers || []; } @@ -127,5 +123,4 @@ } }; }; - -})(window, window.JSON); \ No newline at end of file +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-apiclient/events.js b/dashboard-ui/bower_components/emby-apiclient/events.js index 6d99c8d26..39ed006f5 100644 --- a/dashboard-ui/bower_components/emby-apiclient/events.js +++ b/dashboard-ui/bower_components/emby-apiclient/events.js @@ -1,20 +1,61 @@ -(function (globalScope) { +define([], function () { - globalScope.Events = { + function getCallbacks(obj, name) { - on: function (obj, eventName, selector, fn) { + if (!obj) { + throw new Error("obj cannot be null!"); + } - jQuery(obj).on(eventName, selector, fn); + obj._callbacks = obj._callbacks || {}; + + var list = obj._callbacks[name]; + + if (!list) { + obj._callbacks[name] = []; + list = obj._callbacks[name]; + } + + return list; + } + + return { + + on: function (obj, eventName, fn) { + + var list = getCallbacks(obj, eventName); + + list.push(fn); }, - off: function (obj, eventName, selector, fn) { + off: function (obj, eventName, fn) { - jQuery(obj).off(eventName, selector, fn); + var list = getCallbacks(obj, eventName); + + var i = list.indexOf(fn); + if (i != -1) { + list.splice(i, 1); + } }, - trigger: function (obj, eventName, params) { - jQuery(obj).trigger(eventName, params); + trigger: function (obj, eventName) { + + var eventObject = { + type: eventName + }; + + var eventArgs = []; + eventArgs.push(eventObject); + + var additionalArgs = arguments[2] || []; + for (var i = 0, length = additionalArgs.length; i < length; i++) { + eventArgs.push(additionalArgs[i]); + } + + var callbacks = getCallbacks(obj, eventName).slice(0); + + callbacks.forEach(function (c) { + c.apply(obj, eventArgs); + }); } }; - -})(window); \ No newline at end of file +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-apiclient/logger.js b/dashboard-ui/bower_components/emby-apiclient/logger.js deleted file mode 100644 index ee3cc720a..000000000 --- a/dashboard-ui/bower_components/emby-apiclient/logger.js +++ /dev/null @@ -1,6 +0,0 @@ -var Logger = { - - log: function (str) { - console.log(str); - } -}; \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js b/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js index f546e924d..9fa5d2ca7 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/contentuploader.js @@ -21,7 +21,7 @@ photos = getFilesToUpload(photos, uploadHistory); - Logger.log('Found ' + photos.length + ' files to upload'); + console.log('Found ' + photos.length + ' files to upload'); uploadNext(photos, 0, server, apiClient, deferred); @@ -91,16 +91,16 @@ api_key: apiClient.accessToken() }); - Logger.log('Uploading file to ' + url); + console.log('Uploading file to ' + url); new MediaBrowser.FileUpload().upload(file, name, url).then(function () { - Logger.log('File upload succeeded'); + console.log('File upload succeeded'); deferred.resolve(); }, function () { - Logger.log('File upload failed'); + console.log('File upload failed'); deferred.reject(); }); }); diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js b/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js index 10ba77464..5ee7a511f 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/mediasync.js @@ -34,7 +34,7 @@ function reportOfflineActions(apiClient, serverInfo) { - Logger.log('Begin reportOfflineActions'); + console.log('Begin reportOfflineActions'); var deferred = DeferredBuilder.Deferred(); @@ -65,7 +65,7 @@ function syncData(apiClient, serverInfo, syncUserItemAccess) { - Logger.log('Begin syncData'); + console.log('Begin syncData'); var deferred = DeferredBuilder.Deferred(); @@ -93,7 +93,7 @@ function afterSyncData(apiClient, serverInfo, enableSyncUserItemAccess, syncDataResult, deferred) { - Logger.log('Begin afterSyncData'); + console.log('Begin afterSyncData'); removeLocalItems(syncDataResult, serverInfo.Id).then(function (result) { @@ -115,7 +115,7 @@ function removeLocalItems(syncDataResult, serverId) { - Logger.log('Begin removeLocalItems'); + console.log('Begin removeLocalItems'); var deferred = DeferredBuilder.Deferred(); @@ -144,7 +144,7 @@ function removeLocalItem(itemId, serverId) { - Logger.log('Begin removeLocalItem'); + console.log('Begin removeLocalItem'); var deferred = DeferredBuilder.Deferred(); @@ -162,7 +162,7 @@ function getNewMedia(apiClient, serverInfo, options) { - Logger.log('Begin getNewMedia'); + console.log('Begin getNewMedia'); var deferred = DeferredBuilder.Deferred(); @@ -199,7 +199,7 @@ function getNewItem(jobItem, apiClient, serverInfo, options) { - Logger.log('Begin getNewItem'); + console.log('Begin getNewItem'); var deferred = DeferredBuilder.Deferred(); @@ -239,7 +239,7 @@ function downloadMedia(apiClient, jobItem, localItem, options) { - Logger.log('Begin downloadMedia'); + console.log('Begin downloadMedia'); var deferred = DeferredBuilder.Deferred(); require(['localassetmanager'], function () { @@ -250,7 +250,7 @@ var localPath = localItem.LocalPath; - Logger.log('Downloading media. Url: ' + url + '. Local path: ' + localPath); + console.log('Downloading media. Url: ' + url + '. Local path: ' + localPath); options = options || {}; @@ -275,7 +275,7 @@ function getImages(apiClient, jobItem, localItem) { - Logger.log('Begin getImages'); + console.log('Begin getImages'); var deferred = DeferredBuilder.Deferred(); getNextImage(0, apiClient, localItem, deferred); @@ -285,7 +285,7 @@ function getNextImage(index, apiClient, localItem, deferred) { - Logger.log('Begin getNextImage'); + console.log('Begin getNextImage'); if (index >= 4) { deferred.resolve(); @@ -347,7 +347,7 @@ function downloadImage(apiClient, serverId, itemId, imageTag, imageType) { - Logger.log('Begin downloadImage'); + console.log('Begin downloadImage'); var deferred = DeferredBuilder.Deferred(); require(['localassetmanager'], function () { @@ -379,13 +379,13 @@ function getSubtitles(apiClient, jobItem, localItem) { - Logger.log('Begin getSubtitles'); + console.log('Begin getSubtitles'); var deferred = DeferredBuilder.Deferred(); require(['localassetmanager'], function () { if (!jobItem.Item.MediaSources.length) { - logger.Error("Cannot download subtitles because video has no media source info."); + console.log("Cannot download subtitles because video has no media source info."); deferred.resolve(); return; } @@ -423,7 +423,7 @@ function getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) { - Logger.log('Begin getItemSubtitle'); + console.log('Begin getItemSubtitle'); var deferred = DeferredBuilder.Deferred(); var subtitleStream = mediaSource.MediaStreams.filter(function (m) { @@ -433,7 +433,7 @@ if (!subtitleStream) { // We shouldn't get in here, but let's just be safe anyway - Logger.log("Cannot download subtitles because matching stream info wasn't found."); + console.log("Cannot download subtitles because matching stream info wasn't found."); deferred.reject(); return; } @@ -459,7 +459,7 @@ } function syncUserItemAccess(syncDataResult, serverId) { - Logger.log('Begin syncUserItemAccess'); + console.log('Begin syncUserItemAccess'); var deferred = DeferredBuilder.Deferred(); @@ -492,7 +492,7 @@ } function syncUserAccessForItem(itemId, syncDataResult) { - Logger.log('Begin syncUserAccessForItem'); + console.log('Begin syncUserAccessForItem'); var deferred = DeferredBuilder.Deferred(); diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js b/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js index 4521ce898..9f49af4f1 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/multiserversync.js @@ -6,38 +6,37 @@ self.sync = function (options) { - var deferred = DeferredBuilder.Deferred(); + return new Promise(function (resolve, reject) { - var servers = connectionManager.getSavedServers(); + var servers = connectionManager.getSavedServers(); - syncNext(servers, 0, options, deferred); - - return deferred.promise(); + syncNext(servers, 0, options, resolve, reject); + }); }; - function syncNext(servers, index, options, deferred) { + function syncNext(servers, index, options, resolve, reject) { var length = servers.length; if (index >= length) { - deferred.resolve(); + resolve(); return; } var server = servers[index]; - Logger.log("Creating ServerSync to server: " + server.Id); + console.log("Creating ServerSync to server: " + server.Id); require(['serversync'], function () { new MediaBrowser.ServerSync(connectionManager).sync(server, options).then(function () { - syncNext(servers, index + 1, options, deferred); + syncNext(servers, index + 1, options, resolve, reject); }, function () { - syncNext(servers, index + 1, options, deferred); + syncNext(servers, index + 1, options, resolve, reject); }); }); } diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js b/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js index 2ae3b810b..b77c8e512 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/offlineusersync.js @@ -6,62 +6,51 @@ self.sync = function (apiClient, server) { - var deferred = DeferredBuilder.Deferred(); + return new Promise(function (resolve, reject) { - var users = server.Users || []; - syncNext(users, 0, deferred, apiClient, server); - - return deferred.promise(); + var users = server.Users || []; + syncNext(users, 0, resolve, reject, apiClient, server); + }); }; - function syncNext(users, index, deferred, apiClient, server) { + function syncNext(users, index, resolve, reject, apiClient, server) { var length = users.length; if (index >= length) { - deferred.resolve(); + resolve(); return; } - syncUser(users[index], apiClient).then(function () { + var onFinish = function() { + syncNext(users, index + 1, resolve, reject, apiClient, server); + }; - syncNext(users, index + 1, deferred, apiClient, server); - }, function () { - syncNext(users, index + 1, deferred, apiClient, server); - }); + syncUser(users[index], apiClient).then(onFinish, onFinish); } function syncUser(user, apiClient) { - var deferred = DeferredBuilder.Deferred(); + return new Promise(function (resolve, reject) { - apiClient.getOfflineUser(user.Id).then(function (result) { + apiClient.getOfflineUser(user.Id).then(function (result) { - require(['localassetmanager'], function () { + require(['localassetmanager'], function () { - LocalAssetManager.saveOfflineUser(result).then(function () { - deferred.resolve(); - }, function () { - deferred.resolve(); + LocalAssetManager.saveOfflineUser(result).then(resolve, resolve); }); - }); - }, function () { + }, function () { - // TODO: We should only delete if there's a 401 response + // TODO: We should only delete if there's a 401 response - require(['localassetmanager'], function () { + require(['localassetmanager'], function () { - LocalAssetManager.deleteOfflineUser(user.Id).then(function () { - deferred.resolve(); - }, function () { - deferred.resolve(); + LocalAssetManager.deleteOfflineUser(user.Id).then(resolve, resolve); }); }); }); - - return deferred.promise(); } } diff --git a/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js b/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js index ae4234a2f..e90de0cbb 100644 --- a/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js +++ b/dashboard-ui/bower_components/emby-apiclient/sync/serversync.js @@ -6,13 +6,13 @@ self.sync = function (server, options) { - var deferred = DeferredBuilder.Deferred(); - if (!server.AccessToken && !server.ExchangeToken) { - Logger.log('Skipping sync to server ' + server.Id + ' because there is no saved authentication information.'); - deferred.resolve(); - return deferred.promise(); + console.log('Skipping sync to server ' + server.Id + ' because there is no saved authentication information.'); + return new Promise(function (resolve, reject) { + + resolve(); + }); } var connectionOptions = { @@ -21,31 +21,25 @@ reportCapabilities: false }; - connectionManager.connectToServer(server, connectionOptions).then(function (result) { + return connectionManager.connectToServer(server, connectionOptions).then(function (result) { if (result.State == MediaBrowser.ConnectionState.SignedIn) { - performSync(server, options, deferred); + return performSync(server, options); } else { - Logger.log('Unable to connect to server id: ' + server.Id); - deferred.reject(); + console.log('Unable to connect to server id: ' + server.Id); + return Promise.reject(); } - }, function () { + }, function (err) { - Logger.log('Unable to connect to server id: ' + server.Id); - deferred.reject(); + console.log('Unable to connect to server id: ' + server.Id); + throw err; }); - - return deferred.promise(); }; - function performSync(server, options, deferred) { + function performSync(server, options) { - Logger.log("Creating ContentUploader to server: " + server.Id); - - var nextAction = function () { - syncOfflineUsers(server, options, deferred); - }; + console.log("Creating ContentUploader to server: " + server.Id); options = options || {}; @@ -56,70 +50,77 @@ } if (!uploadPhotos) { - nextAction(); - return; + return syncOfflineUsers(server, options); } - require(['contentuploader'], function () { + return new Promise(function (resolve, reject) { - new MediaBrowser.ContentUploader(connectionManager).uploadImages(server).then(function () { + require(['contentuploader'], function () { - Logger.log("ContentUploaded succeeded to server: " + server.Id); + new MediaBrowser.ContentUploader(connectionManager).uploadImages(server).then(function () { - nextAction(); + console.log("ContentUploaded succeeded to server: " + server.Id); - }, function () { + syncOfflineUsers(server, options).then(resolve, reject); - Logger.log("ContentUploaded failed to server: " + server.Id); + }, function () { - nextAction(); + console.log("ContentUploaded failed to server: " + server.Id); + + syncOfflineUsers(server, options).then(resolve, reject); + }); }); }); } - function syncOfflineUsers(server, options, deferred) { + function syncOfflineUsers(server, options) { if (options.syncOfflineUsers === false) { - syncMedia(server, options, deferred); - return; + return syncMedia(server, options); } - require(['offlineusersync'], function () { + return new Promise(function (resolve, reject) { - var apiClient = connectionManager.getApiClient(server.Id); + require(['offlineusersync'], function () { - new MediaBrowser.OfflineUserSync().sync(apiClient, server).then(function () { + var apiClient = connectionManager.getApiClient(server.Id); - Logger.log("OfflineUserSync succeeded to server: " + server.Id); + new MediaBrowser.OfflineUserSync().sync(apiClient, server).then(function () { - syncMedia(server, options, deferred); + console.log("OfflineUserSync succeeded to server: " + server.Id); - }, function () { + syncMedia(server, options).then(resolve, reject); - Logger.log("OfflineUserSync failed to server: " + server.Id); + }, function () { - deferred.reject(); + console.log("OfflineUserSync failed to server: " + server.Id); + + reject(); + }); }); }); } - function syncMedia(server, options, deferred) { + function syncMedia(server, options) { - require(['mediasync'], function () { + return new Promise(function (resolve, reject) { - var apiClient = connectionManager.getApiClient(server.Id); + require(['mediasync'], function () { - new MediaBrowser.MediaSync().sync(apiClient, server, options).then(function () { + var apiClient = connectionManager.getApiClient(server.Id); - Logger.log("MediaSync succeeded to server: " + server.Id); + new MediaBrowser.MediaSync().sync(apiClient, server, options).then(function () { - deferred.resolve(); + console.log("MediaSync succeeded to server: " + server.Id); - }, function () { + resolve(); - Logger.log("MediaSync failed to server: " + server.Id); + }, function () { - deferred.reject(); + console.log("MediaSync failed to server: " + server.Id); + + reject(); + }); }); }); } diff --git a/dashboard-ui/bower_components/hammerjs/.bower.json b/dashboard-ui/bower_components/hammerjs/.bower.json index 90e8a70c7..977f64211 100644 --- a/dashboard-ui/bower_components/hammerjs/.bower.json +++ b/dashboard-ui/bower_components/hammerjs/.bower.json @@ -1,20 +1,19 @@ { "name": "hammerjs", - "version": "2.0.4", "main": "hammer.js", "ignore": [ "tests", "src" ], "homepage": "https://github.com/hammerjs/hammer.js", - "_release": "2.0.4", + "version": "2.0.5", + "_release": "2.0.5", "_resolution": { "type": "version", - "tag": "2.0.4", - "commit": "7fc11efb37d6f2334ce957e26e9cf53690e10fa5" + "tag": "v2.0.5", + "commit": "4ac915029353faf7cbe3ac9252d84a2621772f85" }, "_source": "git://github.com/hammerjs/hammer.js.git", "_target": "~2.0.4", - "_originalSource": "hammer.js", - "_direct": true + "_originalSource": "hammer.js" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/hammerjs/.jscsrc b/dashboard-ui/bower_components/hammerjs/.jscsrc index e0c480f41..168677b82 100644 --- a/dashboard-ui/bower_components/hammerjs/.jscsrc +++ b/dashboard-ui/bower_components/hammerjs/.jscsrc @@ -1,8 +1,95 @@ { - "preset": "google", - "excludeFiles": [ - "*.js", - "tests/**/assets", - "node_modules/**" - ] -} + "excludeFiles": [ + "*.js", + "tests/**/assets", + "node_modules/**" + ], + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do", + "try", + "catch" + ], + "requireOperatorBeforeLineBreak": true, + "requireCamelCaseOrUpperCaseIdentifiers": true, + "maximumLineLength": { + "value": 120, + "allowComments": true, + "allowRegex": true + }, + "validateIndentation": 4, + "validateQuoteMarks": "'", + "disallowMultipleLineStrings": true, + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "disallowSpaceAfterPrefixUnaryOperators": true, + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "return", + "try", + "catch" + ], + "requireSpaceBeforeBinaryOperators": [ + "=", + "+=", + "-=", + "*=", + "/=", + "%=", + "<<=", + ">>=", + ">>>=", + "&=", + "|=", + "^=", + "+=", + "+", + "-", + "*", + "/", + "%", + "<<", + ">>", + ">>>", + "&", + "|", + "^", + "&&", + "||", + "===", + "==", + ">=", + "<=", + "<", + ">", + "!=", + "!==" + ], + "requireSpaceAfterBinaryOperators": true, + "requireSpacesInConditionalExpression": true, + "requireSpaceBeforeBlockStatements": true, + "requireLineFeedAtFileEnd": true, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInAnonymousFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInsideObjectBrackets": "all", + "disallowSpacesInsideArrayBrackets": "all", + "disallowSpacesInsideParentheses": true, + "validateJSDoc": { + "checkParamNames": true, + "requireParamTypes": true + }, + "disallowMultipleLineBreaks": true, + "disallowNewlineBeforeBlockStatements": true +} \ No newline at end of file diff --git a/dashboard-ui/bower_components/hammerjs/.travis.yml b/dashboard-ui/bower_components/hammerjs/.travis.yml index a6e6c3e72..308d9a6e8 100644 --- a/dashboard-ui/bower_components/hammerjs/.travis.yml +++ b/dashboard-ui/bower_components/hammerjs/.travis.yml @@ -2,6 +2,8 @@ language: node_js node_js: - "0.10" +sudo: false + before_script: - npm install -g grunt-cli diff --git a/dashboard-ui/bower_components/hammerjs/Gruntfile.coffee b/dashboard-ui/bower_components/hammerjs/Gruntfile.coffee index 9998e2075..d14d6ec58 100644 --- a/dashboard-ui/bower_components/hammerjs/Gruntfile.coffee +++ b/dashboard-ui/bower_components/hammerjs/Gruntfile.coffee @@ -19,7 +19,7 @@ module.exports = (grunt) -> concat: build: src: [ - 'src/hammer.prefix' + 'src/hammer.prefix.js' 'src/utils.js' 'src/input.js' 'src/input/*.js' @@ -29,7 +29,7 @@ module.exports = (grunt) -> 'src/hammer.js' 'src/manager.js' 'src/expose.js' - 'src/hammer.suffix'] + 'src/hammer.suffix.js'] dest: 'hammer.js' uglify: @@ -80,8 +80,9 @@ module.exports = (grunt) -> jscs: src: [ - 'src/**/*.js' - 'tests/unit/*.js' + 'src/**/*.js', + '!src/hammer.prefix.js', + '!src/hammer.suffix.js' ] options: config: "./.jscsrc" @@ -113,7 +114,7 @@ module.exports = (grunt) -> grunt.loadNpmTasks 'grunt-contrib-connect' grunt.loadNpmTasks 'grunt-string-replace' grunt.loadNpmTasks 'grunt-banner' - grunt.loadNpmTasks 'grunt-jscs-checker' + grunt.loadNpmTasks 'grunt-jscs' # Default task(s) grunt.registerTask 'default', ['connect', 'watch'] diff --git a/dashboard-ui/bower_components/hammerjs/bower.json b/dashboard-ui/bower_components/hammerjs/bower.json index 61bb63154..632c16e5e 100644 --- a/dashboard-ui/bower_components/hammerjs/bower.json +++ b/dashboard-ui/bower_components/hammerjs/bower.json @@ -1,6 +1,5 @@ { "name": "hammerjs", - "version": "2.0.4", "main": "hammer.js", "ignore": [ "tests", diff --git a/dashboard-ui/bower_components/hammerjs/hammer.js b/dashboard-ui/bower_components/hammerjs/hammer.js index 522668899..7acc5eec2 100644 --- a/dashboard-ui/bower_components/hammerjs/hammer.js +++ b/dashboard-ui/bower_components/hammerjs/hammer.js @@ -1,12 +1,12 @@ -/*! Hammer.JS - v2.0.4 - 2014-09-28 +/*! Hammer.JS - v2.0.4 - 2015-12-22 * http://hammerjs.github.io/ * - * Copyright (c) 2014 Jorik Tangelder; - * Licensed under the MIT license */ + * Copyright (c) 2015 Jorik Tangelder; + * Licensed under the license */ (function(window, document, exportName, undefined) { 'use strict'; -var VENDOR_PREFIXES = ['', 'webkit', 'moz', 'MS', 'ms', 'o']; +var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o']; var TEST_ELEMENT = document.createElement('div'); var TYPE_FUNCTION = 'function'; @@ -320,8 +320,8 @@ function uniqueId() { * @returns {DocumentView|Window} */ function getWindowForElement(element) { - var doc = element.ownerDocument; - return (doc.defaultView || doc.parentWindow); + var doc = element.ownerDocument || element; + return (doc.defaultView || doc.parentWindow || window); } var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; @@ -500,9 +500,17 @@ function computeInputData(manager, input) { computeDeltaXY(session, input); input.offsetDirection = getDirection(input.deltaX, input.deltaY); + var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY); + input.overallVelocityX = overallVelocity.x; + input.overallVelocityY = overallVelocity.y; + input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y; + input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; + input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length > + session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers); + computeIntervalInputData(session, input); // find the correct target @@ -546,8 +554,8 @@ function computeIntervalInputData(session, input) { velocity, velocityX, velocityY, direction; if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { - var deltaX = last.deltaX - input.deltaX; - var deltaY = last.deltaY - input.deltaY; + var deltaX = input.deltaX - last.deltaX; + var deltaY = input.deltaY - last.deltaY; var v = getVelocity(deltaTime, deltaX, deltaY); velocityX = v.x; @@ -652,9 +660,9 @@ function getDirection(x, y) { } if (abs(x) >= abs(y)) { - return x > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; } - return y > 0 ? DIRECTION_UP : DIRECTION_DOWN; + return y < 0 ? DIRECTION_UP : DIRECTION_DOWN; } /** @@ -697,7 +705,7 @@ function getAngle(p1, p2, props) { * @return {Number} rotation */ function getRotation(start, end) { - return getAngle(end[1], end[0], PROPS_CLIENT_XY) - getAngle(start[1], start[0], PROPS_CLIENT_XY); + return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY); } /** @@ -790,7 +798,7 @@ var POINTER_ELEMENT_EVENTS = 'pointerdown'; var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive -if (window.MSPointerEvent) { +if (window.MSPointerEvent && !window.PointerEvent) { POINTER_ELEMENT_EVENTS = 'MSPointerDown'; POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; } @@ -1114,7 +1122,7 @@ TouchAction.prototype = { value = this.compute(); } - if (NATIVE_TOUCH_ACTION) { + if (NATIVE_TOUCH_ACTION && this.manager.element.style) { this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; } this.actions = value.toLowerCase().trim(); @@ -1165,6 +1173,23 @@ TouchAction.prototype = { var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); + if (hasNone) { + //do not prevent defaults if this is a tap gesture + + var isTapPointer = input.pointers.length === 1; + var isTapMovement = input.distance < 2; + var isTapTouchTime = input.deltaTime < 250; + + if (isTapPointer && isTapMovement && isTapTouchTime) { + return; + } + } + + if (hasPanX && hasPanY) { + // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent + return; + } + if (hasNone || (hasPanY && direction & DIRECTION_HORIZONTAL) || (hasPanX && direction & DIRECTION_VERTICAL)) { @@ -1196,9 +1221,12 @@ function cleanTouchActions(actions) { var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); - // pan-x and pan-y can be combined + // if both pan-x and pan-y are set (different recognizers + // for different directions, e.g. horizontal pan but vertical swipe?) + // we need none (as otherwise with pan-x pan-y combined none of these + // recognizers will work, since the browser would handle all panning if (hasPanX && hasPanY) { - return TOUCH_ACTION_PAN_X + ' ' + TOUCH_ACTION_PAN_Y; + return TOUCH_ACTION_NONE; } // pan-x OR pan-y @@ -1256,10 +1284,13 @@ var STATE_FAILED = 32; * @param {Object} options */ function Recognizer(options) { + // make sure, options are copied over to a new object to prevent leaking it outside + options = extend({}, options || {}); + this.id = uniqueId(); this.manager = null; - this.options = merge(options || {}, this.defaults); + this.options = merge(options, this.defaults); // default is enable true this.options.enable = ifUndefined(this.options.enable, true); @@ -1387,20 +1418,24 @@ Recognizer.prototype = { var self = this; var state = this.state; - function emit(withState) { - self.manager.emit(self.options.event + (withState ? stateStr(state) : ''), input); + function emit(event) { + self.manager.emit(event, input); } // 'panstart' and 'panmove' if (state < STATE_ENDED) { - emit(true); + emit(self.options.event + stateStr(state)); } - emit(); // simple 'eventName' events + emit(self.options.event); // simple 'eventName' events + + if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...) + emit(input.additionalEvent); + } // panend and pancancel if (state >= STATE_ENDED) { - emit(true); + emit(self.options.event + stateStr(state)); } }, @@ -1665,14 +1700,15 @@ inherit(PanRecognizer, AttrRecognizer, { }, emit: function(input) { + this.pX = input.deltaX; this.pY = input.deltaY; var direction = directionStr(input.direction); - if (direction) { - this.manager.emit(this.options.event + direction, input); - } + if (direction) { + input.additionalEvent = this.options.event + direction; + } this._super.emit.call(this, input); } }); @@ -1708,11 +1744,11 @@ inherit(PinchRecognizer, AttrRecognizer, { }, emit: function(input) { - this._super.emit.call(this, input); if (input.scale !== 1) { var inOut = input.scale < 1 ? 'in' : 'out'; - this.manager.emit(this.options.event + inOut, input); + input.additionalEvent = this.options.event + inOut; } + this._super.emit.call(this, input); } }); @@ -1737,8 +1773,8 @@ inherit(PressRecognizer, Recognizer, { defaults: { event: 'press', pointers: 1, - time: 500, // minimal time of the pointer to be pressed - threshold: 5 // a minimal movement is ok, but keep it low + time: 251, // minimal time of the pointer to be pressed + threshold: 9 // a minimal movement is ok, but keep it low }, getTouchAction: function() { @@ -1836,7 +1872,7 @@ inherit(SwipeRecognizer, AttrRecognizer, { defaults: { event: 'swipe', threshold: 10, - velocity: 0.65, + velocity: 0.3, direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL, pointers: 1 }, @@ -1850,21 +1886,22 @@ inherit(SwipeRecognizer, AttrRecognizer, { var velocity; if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) { - velocity = input.velocity; + velocity = input.overallVelocity; } else if (direction & DIRECTION_HORIZONTAL) { - velocity = input.velocityX; + velocity = input.overallVelocityX; } else if (direction & DIRECTION_VERTICAL) { - velocity = input.velocityY; + velocity = input.overallVelocityY; } return this._super.attrTest.call(this, input) && - direction & input.direction && + direction & input.offsetDirection && input.distance > this.options.threshold && + input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END; }, emit: function(input) { - var direction = directionStr(input.direction); + var direction = directionStr(input.offsetDirection); if (direction) { this.manager.emit(this.options.event + direction, input); } @@ -1907,7 +1944,7 @@ inherit(TapRecognizer, Recognizer, { taps: 1, interval: 300, // max time between the multi-tap taps time: 250, // max time of the pointer to be down (like finger on the screen) - threshold: 2, // a minimal movement is ok, but keep it low + threshold: 9, // a minimal movement is ok, but keep it low posThreshold: 10 // a multi-tap can be a bit off the initial position }, @@ -1981,7 +2018,7 @@ inherit(TapRecognizer, Recognizer, { }, emit: function() { - if (this.state == STATE_RECOGNIZED ) { + if (this.state == STATE_RECOGNIZED) { this._input.tapCount = this.count; this.manager.emit(this.options.event, this._input); } @@ -1989,7 +2026,7 @@ inherit(TapRecognizer, Recognizer, { }); /** - * Simple way to create an manager with a default set of recognizers. + * Simple way to create a manager with a default set of recognizers. * @param {HTMLElement} element * @param {Object} [options] * @constructor @@ -2055,12 +2092,12 @@ Hammer.defaults = { */ preset: [ // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...] - [RotateRecognizer, { enable: false }], - [PinchRecognizer, { enable: false }, ['rotate']], - [SwipeRecognizer,{ direction: DIRECTION_HORIZONTAL }], - [PanRecognizer, { direction: DIRECTION_HORIZONTAL }, ['swipe']], + [RotateRecognizer, {enable: false}], + [PinchRecognizer, {enable: false}, ['rotate']], + [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}], + [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']], [TapRecognizer], - [TapRecognizer, { event: 'doubletap', taps: 2 }, ['tap']], + [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']], [PressRecognizer] ], @@ -2127,9 +2164,9 @@ var FORCED_STOP = 2; * @constructor */ function Manager(element, options) { - options = options || {}; + var newOptions = options ? extend({}, options) : {}; + this.options = merge(newOptions, Hammer.defaults); - this.options = merge(options, Hammer.defaults); this.options.inputTarget = this.options.inputTarget || element; this.handlers = {}; @@ -2142,7 +2179,7 @@ function Manager(element, options) { toggleCssProps(this, true); - each(options.recognizers, function(item) { + each(this.options.recognizers, function(item) { var recognizer = this.add(new (item[0])(item[1])); item[2] && recognizer.recognizeWith(item[2]); item[3] && recognizer.requireFailure(item[3]); @@ -2290,11 +2327,19 @@ Manager.prototype = { return this; } - var recognizers = this.recognizers; recognizer = this.get(recognizer); - recognizers.splice(inArray(recognizers, recognizer), 1); - this.touchAction.update(); + // let's make sure this recognizer exists + if (recognizer) { + var recognizers = this.recognizers; + var index = inArray(recognizers, recognizer); + + if (index !== -1) { + recognizers.splice(index, 1); + this.touchAction.update(); + } + } + return this; }, @@ -2325,7 +2370,7 @@ Manager.prototype = { if (!handler) { delete handlers[event]; } else { - handlers[event].splice(inArray(handlers[event], handler), 1); + handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1); } }); return this; @@ -2381,6 +2426,9 @@ Manager.prototype = { */ function toggleCssProps(manager, add) { var element = manager.element; + if (!element.style) { + return; + } each(manager.options.cssProps, function(value, name) { element.style[prefixed(element.style, name)] = add ? value : ''; }); @@ -2450,7 +2498,12 @@ extend(Hammer, { prefixed: prefixed }); -if (typeof define == TYPE_FUNCTION && define.amd) { +// this prevents errors when Hammer is loaded in the presence of an AMD +// style loader but by script tag, not by the loader. +var freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line +freeGlobal.Hammer = Hammer; + +if (typeof define === 'function' && define.amd) { define(function() { return Hammer; }); diff --git a/dashboard-ui/bower_components/hammerjs/hammer.min.js b/dashboard-ui/bower_components/hammerjs/hammer.min.js index 2071fb1f0..9b0d605ea 100644 --- a/dashboard-ui/bower_components/hammerjs/hammer.min.js +++ b/dashboard-ui/bower_components/hammerjs/hammer.min.js @@ -1,7 +1,7 @@ -/*! Hammer.JS - v2.0.4 - 2014-09-28 +/*! Hammer.JS - v2.0.4 - 2015-12-22 * http://hammerjs.github.io/ * - * Copyright (c) 2014 Jorik Tangelder; - * Licensed under the MIT license */ -!function(a,b,c,d){"use strict";function e(a,b,c){return setTimeout(k(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e-1}function r(a){return a.trim().split(/\s+/g)}function s(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;dc[b]}):d.sort()),d}function v(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g1&&!c.firstMultiple?c.firstMultiple=E(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=F(d);b.timeStamp=nb(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=J(h,i),b.distance=I(h,i),C(c,b),b.offsetDirection=H(b.deltaX,b.deltaY),b.scale=g?L(g.pointers,d):1,b.rotation=g?K(g.pointers,d):0,D(c,b);var j=a.element;p(b.srcEvent.target,j)&&(j=b.srcEvent.target),b.target=j}function C(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};(b.eventType===yb||f.eventType===Ab)&&(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function D(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Bb&&(i>xb||h.velocity===d)){var j=h.deltaX-b.deltaX,k=h.deltaY-b.deltaY,l=G(i,j,k);e=l.x,f=l.y,c=mb(l.x)>mb(l.y)?l.x:l.y,g=H(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function E(a){for(var b=[],c=0;ce;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:lb(c/b),y:lb(d/b)}}function G(a,b,c){return{x:b/a||0,y:c/a||0}}function H(a,b){return a===b?Cb:mb(a)>=mb(b)?a>0?Db:Eb:b>0?Fb:Gb}function I(a,b,c){c||(c=Kb);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function J(a,b,c){c||(c=Kb);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function K(a,b){return J(b[1],b[0],Lb)-J(a[1],a[0],Lb)}function L(a,b){return I(b[0],b[1],Lb)/I(a[0],a[1],Lb)}function M(){this.evEl=Nb,this.evWin=Ob,this.allow=!0,this.pressed=!1,y.apply(this,arguments)}function N(){this.evEl=Rb,this.evWin=Sb,y.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function O(){this.evTarget=Ub,this.evWin=Vb,this.started=!1,y.apply(this,arguments)}function P(a,b){var c=t(a.touches),d=t(a.changedTouches);return b&(Ab|Bb)&&(c=u(c.concat(d),"identifier",!0)),[c,d]}function Q(){this.evTarget=Xb,this.targetIds={},y.apply(this,arguments)}function R(a,b){var c=t(a.touches),d=this.targetIds;if(b&(yb|zb)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=t(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return p(a.target,i)}),b===yb)for(e=0;eh&&(b.push(a),h=b.length-1):e&(Ab|Bb)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Tb={touchstart:yb,touchmove:zb,touchend:Ab,touchcancel:Bb},Ub="touchstart",Vb="touchstart touchmove touchend touchcancel";j(O,y,{handler:function(a){var b=Tb[a.type];if(b===yb&&(this.started=!0),this.started){var c=P.call(this,a,b);b&(Ab|Bb)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:tb,srcEvent:a})}}});var Wb={touchstart:yb,touchmove:zb,touchend:Ab,touchcancel:Bb},Xb="touchstart touchmove touchend touchcancel";j(Q,y,{handler:function(a){var b=Wb[a.type],c=R.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:tb,srcEvent:a})}}),j(S,y,{handler:function(a,b,c){var d=c.pointerType==tb,e=c.pointerType==vb;if(d)this.mouse.allow=!1;else if(e&&!this.mouse.allow)return;b&(Ab|Bb)&&(this.mouse.allow=!0),this.callback(a,b,c)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Yb=v(jb.style,"touchAction"),Zb=Yb!==d,$b="compute",_b="auto",ac="manipulation",bc="none",cc="pan-x",dc="pan-y";T.prototype={set:function(a){a==$b&&(a=this.compute()),Zb&&(this.manager.element.style[Yb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){l(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),U(a.join(" "))},preventDefaults:function(a){if(!Zb){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=q(d,bc),f=q(d,dc),g=q(d,cc);return e||f&&c&Hb||g&&c&Ib?this.preventSrc(b):void 0}},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var ec=1,fc=2,gc=4,hc=8,ic=hc,jc=16,kc=32;V.prototype={defaults:{},set:function(a){return h(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,"recognizeWith",this))return this;var b=this.simultaneous;return a=Y(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,"dropRecognizeWith",this)?this:(a=Y(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,"requireFailure",this))return this;var b=this.requireFail;return a=Y(a,this),-1===s(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,"dropRequireFailure",this))return this;a=Y(a,this);var b=s(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(c.options.event+(b?W(d):""),a)}var c=this,d=this.state;hc>d&&b(!0),b(),d>=hc&&b(!0)},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=kc)},canEmit:function(){for(var a=0;af?Db:Eb,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Cb:0>g?Fb:Gb,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return Z.prototype.attrTest.call(this,a)&&(this.state&fc||!(this.state&fc)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=X(a.direction);b&&this.manager.emit(this.options.event+b,a),this._super.emit.call(this,a)}}),j(_,Z,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[bc]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&fc)},emit:function(a){if(this._super.emit.call(this,a),1!==a.scale){var b=a.scale<1?"in":"out";this.manager.emit(this.options.event+b,a)}}}),j(ab,V,{defaults:{event:"press",pointers:1,time:500,threshold:5},getTouchAction:function(){return[_b]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distanceb.time;if(this._input=a,!d||!c||a.eventType&(Ab|Bb)&&!f)this.reset();else if(a.eventType&yb)this.reset(),this._timer=e(function(){this.state=ic,this.tryEmit()},b.time,this);else if(a.eventType&Ab)return ic;return kc},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===ic&&(a&&a.eventType&Ab?this.manager.emit(this.options.event+"up",a):(this._input.timeStamp=nb(),this.manager.emit(this.options.event,this._input)))}}),j(bb,Z,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[bc]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&fc)}}),j(cb,Z,{defaults:{event:"swipe",threshold:10,velocity:.65,direction:Hb|Ib,pointers:1},getTouchAction:function(){return $.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Hb|Ib)?b=a.velocity:c&Hb?b=a.velocityX:c&Ib&&(b=a.velocityY),this._super.attrTest.call(this,a)&&c&a.direction&&a.distance>this.options.threshold&&mb(b)>this.options.velocity&&a.eventType&Ab},emit:function(a){var b=X(a.direction);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),j(db,V,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[ac]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance-1}function r(a){return a.trim().split(/\s+/g)}function s(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;dc[b]}):d.sort()),d}function v(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g1&&!c.firstMultiple?c.firstMultiple=E(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=F(d);b.timeStamp=nb(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=J(h,i),b.distance=I(h,i),C(c,b),b.offsetDirection=H(b.deltaX,b.deltaY);var j=G(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=mb(j.x)>mb(j.y)?j.x:j.y,b.scale=g?L(g.pointers,d):1,b.rotation=g?K(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,D(c,b);var k=a.element;p(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function C(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};(b.eventType===yb||f.eventType===Ab)&&(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function D(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Bb&&(i>xb||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=G(i,j,k);e=l.x,f=l.y,c=mb(l.x)>mb(l.y)?l.x:l.y,g=H(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function E(a){for(var b=[],c=0;ce;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:lb(c/b),y:lb(d/b)}}function G(a,b,c){return{x:b/a||0,y:c/a||0}}function H(a,b){return a===b?Cb:mb(a)>=mb(b)?0>a?Db:Eb:0>b?Fb:Gb}function I(a,b,c){c||(c=Kb);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function J(a,b,c){c||(c=Kb);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function K(a,b){return J(b[1],b[0],Lb)+J(a[1],a[0],Lb)}function L(a,b){return I(b[0],b[1],Lb)/I(a[0],a[1],Lb)}function M(){this.evEl=Nb,this.evWin=Ob,this.allow=!0,this.pressed=!1,y.apply(this,arguments)}function N(){this.evEl=Rb,this.evWin=Sb,y.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function O(){this.evTarget=Ub,this.evWin=Vb,this.started=!1,y.apply(this,arguments)}function P(a,b){var c=t(a.touches),d=t(a.changedTouches);return b&(Ab|Bb)&&(c=u(c.concat(d),"identifier",!0)),[c,d]}function Q(){this.evTarget=Xb,this.targetIds={},y.apply(this,arguments)}function R(a,b){var c=t(a.touches),d=this.targetIds;if(b&(yb|zb)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=t(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return p(a.target,i)}),b===yb)for(e=0;eh&&(b.push(a),h=b.length-1):e&(Ab|Bb)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Tb={touchstart:yb,touchmove:zb,touchend:Ab,touchcancel:Bb},Ub="touchstart",Vb="touchstart touchmove touchend touchcancel";j(O,y,{handler:function(a){var b=Tb[a.type];if(b===yb&&(this.started=!0),this.started){var c=P.call(this,a,b);b&(Ab|Bb)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:tb,srcEvent:a})}}});var Wb={touchstart:yb,touchmove:zb,touchend:Ab,touchcancel:Bb},Xb="touchstart touchmove touchend touchcancel";j(Q,y,{handler:function(a){var b=Wb[a.type],c=R.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:tb,srcEvent:a})}}),j(S,y,{handler:function(a,b,c){var d=c.pointerType==tb,e=c.pointerType==vb;if(d)this.mouse.allow=!1;else if(e&&!this.mouse.allow)return;b&(Ab|Bb)&&(this.mouse.allow=!0),this.callback(a,b,c)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Yb=v(jb.style,"touchAction"),Zb=Yb!==d,$b="compute",_b="auto",ac="manipulation",bc="none",cc="pan-x",dc="pan-y";T.prototype={set:function(a){a==$b&&(a=this.compute()),Zb&&this.manager.element.style&&(this.manager.element.style[Yb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){l(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),U(a.join(" "))},preventDefaults:function(a){if(!Zb){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=q(d,bc),f=q(d,dc),g=q(d,cc);if(e){var h=1===a.pointers.length,i=a.distance<2,j=a.deltaTime<250;if(h&&i&&j)return}if(!g||!f)return e||f&&c&Hb||g&&c&Ib?this.preventSrc(b):void 0}},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var ec=1,fc=2,gc=4,hc=8,ic=hc,jc=16,kc=32;V.prototype={defaults:{},set:function(a){return h(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,"recognizeWith",this))return this;var b=this.simultaneous;return a=Y(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,"dropRecognizeWith",this)?this:(a=Y(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,"requireFailure",this))return this;var b=this.requireFail;return a=Y(a,this),-1===s(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,"dropRequireFailure",this))return this;a=Y(a,this);var b=s(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(b,a)}var c=this,d=this.state;hc>d&&b(c.options.event+W(d)),b(c.options.event),a.additionalEvent&&b(a.additionalEvent),d>=hc&&b(c.options.event+W(d))},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=kc)},canEmit:function(){for(var a=0;af?Db:Eb,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Cb:0>g?Fb:Gb,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return Z.prototype.attrTest.call(this,a)&&(this.state&fc||!(this.state&fc)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=X(a.direction);b&&(a.additionalEvent=this.options.event+b),this._super.emit.call(this,a)}}),j(_,Z,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[bc]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&fc)},emit:function(a){if(1!==a.scale){var b=a.scale<1?"in":"out";a.additionalEvent=this.options.event+b}this._super.emit.call(this,a)}}),j(ab,V,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[_b]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distanceb.time;if(this._input=a,!d||!c||a.eventType&(Ab|Bb)&&!f)this.reset();else if(a.eventType&yb)this.reset(),this._timer=e(function(){this.state=ic,this.tryEmit()},b.time,this);else if(a.eventType&Ab)return ic;return kc},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===ic&&(a&&a.eventType&Ab?this.manager.emit(this.options.event+"up",a):(this._input.timeStamp=nb(),this.manager.emit(this.options.event,this._input)))}}),j(bb,Z,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[bc]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&fc)}}),j(cb,Z,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Hb|Ib,pointers:1},getTouchAction:function(){return $.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Hb|Ib)?b=a.overallVelocity:c&Hb?b=a.overallVelocityX:c&Ib&&(b=a.overallVelocityY),this._super.attrTest.call(this,a)&&c&a.offsetDirection&&a.distance>this.options.threshold&&a.maxPointers==this.options.pointers&&mb(b)>this.options.velocity&&a.eventType&Ab},emit:function(a){var b=X(a.offsetDirection);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),j(db,V,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ac]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance - + +