summaryrefslogtreecommitdiffstats
path: root/js/build/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/build/app.js')
-rw-r--r--js/build/app.js1072
1 files changed, 560 insertions, 512 deletions
diff --git a/js/build/app.js b/js/build/app.js
index cad42c8ae..7e68fc320 100644
--- a/js/build/app.js
+++ b/js/build/app.js
@@ -1,521 +1,569 @@
-(function(angular, $, OC, oc_requesttoken, undefined){
-
-'use strict';
-
-
-var app = angular.module('News', [
- 'ngRoute',
- 'ngSanitize',
- 'ngAnimate'
- ]);
-app.config([
- '$routeProvider',
- '$provide',
- '$httpProvider',
- function ($routeProvider, $provide, $httpProvider) {
+var $__build_47_app__ = function () {
'use strict';
- var getResolve, feedType;
- feedType = {
- FEED: 0,
- FOLDER: 1,
- STARRED: 2,
- SUBSCRIPTIONS: 3,
- SHARED: 4
- };
- // constants
- $provide.constant('REFRESH_RATE', 60);
- // seconds, how often feeds and folders shoudl be refreshed
- $provide.constant('ITEM_BATCH_SIZE', 50);
- // how many items to autopage by
- $provide.constant('BASE_URL', OC.generateUrl('/apps/news'));
- $provide.constant('FEED_TYPE', feedType);
- // make sure that the CSRF header is only sent to the ownCloud domain
- $provide.factory('CSRFInterceptor', function ($q, BASE_URL) {
- return {
- request: function (config) {
- if (config.url.indexOf(BASE_URL) === 0) {
- config.headers.requesttoken = oc_requesttoken;
- }
- return config || $q.when(config);
- }
- };
- });
- $httpProvider.interceptors.push('CSRFInterceptor');
- // routing
- getResolve = function (type) {
- return {
- data: [
- '$http',
- '$route',
- '$q',
- 'BASE_URL',
- 'ITEM_BATCH_SIZE',
- function ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) {
- var parameters, deferred;
- parameters = {
- type: type,
- limit: ITEM_BATCH_SIZE
+ var __moduleName = 'build/app';
+ (function (window, document, angular, $, OC, csrfToken, undefined) {
+ 'use strict';
+ var app = angular.module('News', [
+ 'ngRoute',
+ 'ngSanitize',
+ 'ngAnimate'
+ ]);
+ app.config([
+ '$routeProvider',
+ '$provide',
+ '$httpProvider',
+ function ($routeProvider, $provide, $httpProvider) {
+ 'use strict';
+ var feedType = {
+ FEED: 0,
+ FOLDER: 1,
+ STARRED: 2,
+ SUBSCRIPTIONS: 3,
+ SHARED: 4
+ };
+ $provide.constant('REFRESH_RATE', 60);
+ $provide.constant('ITEM_BATCH_SIZE', 50);
+ $provide.constant('BASE_URL', OC.generateUrl('/apps/news'));
+ $provide.constant('FEED_TYPE', feedType);
+ $provide.factory('CSRFInterceptor', function ($q, BASE_URL) {
+ return {
+ request: function (config) {
+ if (config.url.indexOf(BASE_URL) === 0) {
+ config.headers.requesttoken = csrfToken;
+ }
+ return config || $q.when(config);
+ }
};
- if ($route.current.params.id !== undefined) {
- parameters.id = $route.current.params.id;
+ });
+ $httpProvider.interceptors.push('CSRFInterceptor');
+ var getResolve = function (type) {
+ return {
+ data: [
+ '$http',
+ '$route',
+ '$q',
+ 'BASE_URL',
+ 'ITEM_BATCH_SIZE',
+ function ($http, $route, $q, BASE_URL, ITEM_BATCH_SIZE) {
+ var parameters = {
+ type: type,
+ limit: ITEM_BATCH_SIZE
+ };
+ if ($route.current.params.id !== undefined) {
+ parameters.id = $route.current.params.id;
+ }
+ var deferred = $q.defer();
+ $http({
+ url: BASE_URL + '/items',
+ method: 'GET',
+ params: parameters
+ }).success(function (data) {
+ deferred.resolve(data);
+ });
+ return deferred.promise;
+ }
+ ]
+ };
+ };
+ $routeProvider.when('/items', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.SUBSCRIPTIONS)
+ }).when('/items/starred', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.STARRED)
+ }).when('/items/feeds/:id', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.FEED)
+ }).when('/items/folders/:id', {
+ controller: 'ContentController',
+ templateUrl: 'content.html',
+ resolve: getResolve(feedType.FOLDER)
+ }).otherwise({ redirectTo: '/items' });
+ }
+ ]);
+ app.run([
+ '$rootScope',
+ '$location',
+ '$http',
+ '$q',
+ '$interval',
+ 'Loading',
+ 'ItemResource',
+ 'FeedResource',
+ 'FolderResource',
+ 'Settings',
+ 'Publisher',
+ 'BASE_URL',
+ 'FEED_TYPE',
+ 'REFRESH_RATE',
+ function ($rootScope, $location, $http, $q, $interval, Loading, ItemResource, FeedResource, FolderResource, Settings, Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) {
+ 'use strict';
+ console.log($location);
+ Loading.setLoading('global', true);
+ Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId', 'starred');
+ Publisher.subscribe(FolderResource).toChannels('folders');
+ Publisher.subscribe(FeedResource).toChannels('feeds');
+ Publisher.subscribe(Settings).toChannels('settings');
+ var settingsDeferred = $q.defer();
+ $http.get(BASE_URL + '/settings').success(function (data) {
+ Publisher.publishAll(data);
+ settingsDeferred.resolve();
+ });
+ var activeFeedDeferred = $q.defer();
+ $http.get(BASE_URL + '/feeds/active').success(function (data) {
+ var url;
+ switch (data.type) {
+ case FEED_TYPE.FEED:
+ url = '/items/feeds/' + data.id;
+ break;
+ case FEED_TYPE.FOLDER:
+ url = '/items/folders/' + data.id;
+ break;
+ case FEED_TYPE.STARRED:
+ url = '/items/starred';
+ break;
+ default:
+ url = '/items';
}
- deferred = $q.defer();
- $http({
- url: BASE_URL + '/items',
- method: 'GET',
- params: parameters
- }).success(function (data) {
- deferred.resolve(data);
- });
- return deferred.promise;
- }
- ]
- };
- };
- $routeProvider.when('/items', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.SUBSCRIPTIONS)
- }).when('/items/starred', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.STARRED)
- }).when('/items/feeds/:id', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.FEED)
- }).when('/items/folders/:id', {
- controller: 'ContentController',
- templateUrl: 'content.html',
- resolve: getResolve(feedType.FOLDER)
- }).otherwise({ redirectTo: '/items' });
- }
-]);
-app.run([
- '$rootScope',
- '$location',
- '$http',
- '$q',
- '$interval',
- 'Loading',
- 'ItemResource',
- 'FeedResource',
- 'FolderResource',
- 'Settings',
- 'Publisher',
- 'BASE_URL',
- 'FEED_TYPE',
- 'REFRESH_RATE',
- function ($rootScope, $location, $http, $q, $interval, Loading, ItemResource, FeedResource, FolderResource, Settings, Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) {
- 'use strict';
- // show Loading screen
- Loading.setLoading('global', true);
- // listen to keys in returned queries to automatically distribute the
- // incoming values to models
- Publisher.subscribe(ItemResource).toChannels('items', 'newestItemId', 'starred');
- Publisher.subscribe(FolderResource).toChannels('folders');
- Publisher.subscribe(FeedResource).toChannels('feeds');
- Publisher.subscribe(Settings).toChannels('settings');
- // load feeds, settings and last read feed
- var settingsDeferred, activeFeedDeferred, folderDeferred, feedDeferred;
- settingsDeferred = $q.defer();
- $http.get(BASE_URL + '/settings').success(function (data) {
- Publisher.publishAll(data);
- settingsDeferred.resolve();
- });
- activeFeedDeferred = $q.defer();
- $http.get(BASE_URL + '/feeds/active').success(function (data) {
- var url;
- switch (data.type) {
- case FEED_TYPE.FEED:
- url = '/items/feeds/' + data.id;
- break;
- case FEED_TYPE.FOLDER:
- url = '/items/folders/' + data.id;
- break;
- case FEED_TYPE.STARRED:
- url = '/items/starred';
- break;
- default:
- url = '/items';
- }
- $location.path(url);
- activeFeedDeferred.resolve();
- });
- folderDeferred = $q.defer();
- $http.get(BASE_URL + '/folders').success(function (data) {
- Publisher.publishAll(data);
- folderDeferred.resolve();
- });
- feedDeferred = $q.defer();
- $http.get(BASE_URL + '/feeds').success(function (data) {
- Publisher.publishAll(data);
- feedDeferred.resolve();
- });
- // disable loading if all initial requests finished
- $q.all([
- settingsDeferred.promise,
- activeFeedDeferred.promise,
- feedDeferred.promise,
- folderDeferred.promise
- ]).then(function () {
- Loading.setLoading('global', false);
- });
- // refresh feeds and folders
- $interval(function () {
- $http.get(BASE_URL + '/feeds');
- $http.get(BASE_URL + '/folders');
- }, REFRESH_RATE * 1000);
- $rootScope.$on('$routeChangeStart', function () {
- Loading.setLoading('content', true);
- });
- $rootScope.$on('$routeChangeSuccess', function () {
- Loading.setLoading('content', false);
- });
- // in case of wrong id etc show all items
- $rootScope.$on('$routeChangeError', function () {
- $location.path('/items');
- });
- }
-]);
-app.controller('AppController', [
- 'Loading',
- 'FeedResource',
- 'FolderResource',
- function (Loading, FeedResource, FolderResource) {
- 'use strict';
- this.loading = Loading;
- this.isFirstRun = function () {
- return FeedResource.size() === 0 && FolderResource.size() === 0;
- };
- }
-]);
-app.controller('ContentController', [
- 'Publisher',
- 'FeedResource',
- 'ItemResource',
- 'data',
- function (Publisher, FeedResource, ItemResource, data) {
- 'use strict';
- // distribute data to models based on key
- Publisher.publishAll(data);
- this.getItems = function () {
- return ItemResource.getAll();
- };
- this.getFeeds = function () {
- return FeedResource.getAll();
- };
- }
-]);
-app.controller('NavigationController', function () {
- 'use strict';
- console.log('here');
-});
-app.controller('SettingsController', function () {
- 'use strict';
- console.log('here');
-});
-app.factory('FeedResource', [
- 'Resource',
- '$http',
- function (Resource, $http) {
- 'use strict';
- var FeedResource = function ($http) {
- Resource.call(this, 'url', $http);
- };
- FeedResource.prototype = Object.create(Resource.prototype);
- return new FeedResource($http);
- }
-]);
-app.factory('FolderResource', [
- 'Resource',
- '$http',
- function (Resource, $http) {
- 'use strict';
- var FolderResource = function ($http) {
- Resource.call(this, 'name', $http);
- };
- FolderResource.prototype = Object.create(Resource.prototype);
- return new FolderResource($http);
- }
-]);
-app.factory('ItemResource', [
- 'Resource',
- '$http',
- function (Resource, $http) {
- 'use strict';
- var ItemResource = function ($http) {
- Resource.call(this, 'id', $http);
- };
- ItemResource.prototype = Object.create(Resource.prototype);
- ItemResource.prototype.receive = function (value, channel) {
- switch (channel) {
- case 'newestItemId':
- this.newestItemId = value;
- break;
- case 'starred':
- this.starredCount = value;
- break;
- default:
- Resource.prototype.receive.call(this, value, channel);
- }
- };
- ItemResource.prototype.getNewestItemId = function () {
- return this.newestItemId;
- };
- ItemResource.prototype.getStarredCount = function () {
- return this.starredCount;
- };
- return new ItemResource($http);
- }
-]);
-app.service('Loading', function () {
- 'use strict';
- this.loading = {
- global: false,
- content: false,
- autopaging: false
- };
- this.setLoading = function (area, isLoading) {
- this.loading[area] = isLoading;
- };
- this.isLoading = function (area) {
- return this.loading[area];
- };
-});
-app.service('Publisher', function () {
- 'use strict';
- var self = this;
- this.channels = {};
- this.subscribe = function (object) {
- return {
- toChannels: function () {
- var counter, channel;
- for (counter = 0; counter < arguments.length; counter += 1) {
- channel = arguments[counter];
- self.channels[channel] = self.channels[channel] || [];
- self.channels[channel].push(object);
+ $location.path(url);
+ activeFeedDeferred.resolve();
+ });
+ var folderDeferred = $q.defer();
+ $http.get(BASE_URL + '/folders').success(function (data) {
+ Publisher.publishAll(data);
+ folderDeferred.resolve();
+ });
+ var feedDeferred = $q.defer();
+ $http.get(BASE_URL + '/feeds').success(function (data) {
+ Publisher.publishAll(data);
+ feedDeferred.resolve();
+ });
+ $q.all([
+ settingsDeferred.promise,
+ activeFeedDeferred.promise,
+ feedDeferred.promise,
+ folderDeferred.promise
+ ]).then(function () {
+ Loading.setLoading('global', false);
+ });
+ $interval(function () {
+ $http.get(BASE_URL + '/feeds');
+ $http.get(BASE_URL + '/folders');
+ }, REFRESH_RATE * 1000);
+ $rootScope.$on('$routeChangeStart', function () {
+ Loading.setLoading('content', true);
+ });
+ $rootScope.$on('$routeChangeSuccess', function () {
+ Loading.setLoading('content', false);
+ });
+ $rootScope.$on('$routeChangeError', function () {
+ $location.path('/items');
+ });
+ }
+ ]);
+ app.controller('AppController', [
+ 'Loading',
+ 'FeedResource',
+ 'FolderResource',
+ function (Loading, FeedResource, FolderResource) {
+ 'use strict';
+ this.loading = Loading;
+ this.isFirstRun = function () {
+ return FeedResource.size() === 0 && FolderResource.size() === 0;
+ };
}
- }
- };
- };
- this.publishAll = function (data) {
- var channel, counter;
- for (channel in data) {
- if (data.hasOwnProperty(channel) && this.channels[channel] !== undefined) {
- for (counter = 0; counter < this.channels[channel].length; counter += 1) {
- this.channels[channel][counter].receive(data[channel], channel);
+ ]);
+ app.controller('ContentController', [
+ 'Publisher',
+ 'FeedResource',
+ 'ItemResource',
+ 'data',
+ function (Publisher, FeedResource, ItemResource, data) {
+ 'use strict';
+ Publisher.publishAll(data);
+ this.getItems = function () {
+ return ItemResource.getAll();
+ };
+ this.getFeeds = function () {
+ return FeedResource.getAll();
+ };
}
- }
- }
- };
-});
-app.factory('Resource', function () {
- 'use strict';
- var Resource = function (id, http) {
- this.id = id;
- this.values = [];
- this.hashMap = {};
- this.http = http;
- };
- Resource.prototype = {
- receive: function (values) {
- var self = this;
- values.forEach(function (value) {
- self.add(value);
+ ]);
+ app.controller('NavigationController', function () {
+ 'use strict';
+ console.log('here');
});
- },
- add: function (value) {
- var key, existing;
- existing = this.hashMap[value[this.id]];
- if (existing === undefined) {
- this.values.push(value);
- this.hashMap[value[this.id]] = value;
- } else {
- // copy values from new to old object if it exists already
- for (key in value) {
- if (value.hasOwnProperty(key)) {
- existing[key] = value[key];
- }
+ app.controller('SettingsController', function () {
+ 'use strict';
+ console.log('here');
+ });
+ app.factory('FeedResource', [
+ 'Resource',
+ '$http',
+ function (Resource, $http) {
+ 'use strict';
+ var FeedResource = function FeedResource($http) {
+ $traceurRuntime.superCall(this, $FeedResource.prototype, 'constructor', [
+ 'url',
+ $http
+ ]);
+ };
+ var $FeedResource = FeedResource;
+ $traceurRuntime.createClass(FeedResource, {}, {}, Resource);
+ return new FeedResource($http);
}
- }
- },
- size: function () {
- return this.values.length;
- },
- get: function (id) {
- return this.hashMap[id];
- },
- delete: function (id) {
- // find index of object that should be deleted
- var i, deleteAtIndex;
- for (i = 0; i < this.values.length; i += 1) {
- if (this.values[i][this.id] === id) {
- deleteAtIndex = i;
- break;
+ ]);
+ app.factory('FolderResource', [
+ 'Resource',
+ '$http',
+ function (Resource, $http) {
+ 'use strict';
+ var FolderResource = function FolderResource($http) {
+ $traceurRuntime.superCall(this, $FolderResource.prototype, 'constructor', [
+ 'name',
+ $http
+ ]);
+ };
+ var $FolderResource = FolderResource;
+ $traceurRuntime.createClass(FolderResource, {}, {}, Resource);
+ return new FolderResource($http);
}
- }
- if (deleteAtIndex !== undefined) {
- this.values.splice(deleteAtIndex, 1);
- }
- if (this.hashMap[id] !== undefined) {
- delete this.hashMap[id];
- }
- },
- clear: function () {
- this.hashMap = {};
- // http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript
- // this is the fastes way to empty an array when you want to keep the
- // reference around
- while (this.values.length > 0) {
- this.values.pop();
- }
- },
- getAll: function () {
- return this.values;
- }
- };
- return Resource;
-});
-app.service('Settings', function () {
- 'use strict';
- this.settings = {};
- this.receive = function (data) {
- var key;
- for (key in data) {
- if (data.hasOwnProperty(key)) {
- this.settings[key] = data[key];
- }
- }
- };
- this.get = function (key) {
- return this.settings[key];
- };
- this.set = function (key, value) {
- this.settings[key] = value;
- };
-});
-/**
- * Code in here acts only as a click shortcut mechanism. That's why its not
- * being put into a directive since it has to be tested with protractor
- * anyways and theres no benefit from wiring it into the angular app
- */
-(function (window, document, $) {
- 'use strict';
- var noInputFocused, noModifierKey, scrollArea, scrollToItem, scrollToNextItem, scrollToPreviousItem, toggleStar, toggleUnread, expandItem, openLink, getActiveItem;
- scrollArea = $('#app-content');
- noInputFocused = function (element) {
- return !(element.is('input') && element.is('select') && element.is('textarea') && element.is('checkbox'));
- };
- noModifierKey = function (event) {
- return !(event.shiftKey || event.altKey || event.ctrlKey || event.metaKey);
- };
- scrollToItem = function (item, scrollArea) {
- scrollArea.scrollTop(item.offset().top - scrollArea.offset().top + scrollArea.scrollTop());
- };
- scrollToNextItem = function (scrollArea) {
- var items, counter, item;
- items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
- if (item.position().top > 1) {
- scrollToItem(scrollArea, item);
- return;
- }
- }
- // in case this is the last item it should still scroll below the top
- scrollArea.scrollTop(scrollArea.prop('scrollHeight'));
- };
- scrollToPreviousItem = function (scrollArea) {
- var items, item, counter, previous;
- items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
- if (item.position().top >= 0) {
- previous = item.prev();
- // if there are no items before the current one
- if (previous.length > 0) {
- scrollToItem(scrollArea, previous);
+ ]);
+ app.factory('ItemResource', [
+ 'Resource',
+ '$http',
+ function (Resource, $http) {
+ 'use strict';
+ var ItemResource = function ItemResource($http) {
+ $traceurRuntime.superCall(this, $ItemResource.prototype, 'constructor', [
+ 'id',
+ $http
+ ]);
+ };
+ var $ItemResource = ItemResource;
+ $traceurRuntime.createClass(ItemResource, {
+ receive: function (value, channel) {
+ switch (channel) {
+ case 'newestItemId':
+ this.newestItemId = value;
+ break;
+ case 'starred':
+ this.starredCount = value;
+ break;
+ default:
+ $traceurRuntime.superCall(this, $ItemResource.prototype, 'receive', [
+ value,
+ channel
+ ]);
+ }
+ },
+ getNewestItemId: function () {
+ return this.newestItemId;
+ },
+ getStarredCount: function () {
+ return this.starredCount;
+ }
+ }, {}, Resource);
+ return new ItemResource($http);
}
- return;
- }
- }
- // if there was no jump jump to the last element
- if (items.length > 0) {
- scrollToItem(scrollArea, items.last());
- }
- };
- getActiveItem = function (scrollArea) {
- var items, item, counter;
- items = scrollArea.find('.feed_item');
- for (counter = 0; counter < items.length; counter += 1) {
- item = $(items[counter]);
- // 130px of the item should be visible
- if (item.height() + item.position().top > 30) {
- return item;
- }
- }
- };
- toggleUnread = function (scrollArea) {
- var item = getActiveItem(scrollArea);
- item.find('.keep_unread').trigger('click');
- };
- toggleStar = function (scrollArea) {
- var item = getActiveItem(scrollArea);
- item.find('.item_utils .star').trigger('click');
- };
- expandItem = function (scrollArea) {
- var item = getActiveItem(scrollArea);
- item.find('.item_heading a').trigger('click');
- };
- openLink = function (scrollArea) {
- var item = getActiveItem(scrollArea).find('.item_title a');
- item.trigger('click');
- // mark read
- window.open(item.attr('href'), '_blank');
- };
- $(document).keyup(function (event) {
- var keyCode;
- keyCode = event.keyCode;
- if (noInputFocused($(':focus')) && noModifierKey(event)) {
- // j, n, right arrow
- if ([
- 74,
- 78,
- 34
- ].indexOf(keyCode) >= 0) {
- event.preventDefault();
- scrollToNextItem(scrollArea); // k, p, left arrow
- } else if ([
- 75,
- 80,
- 37
- ].indexOf(keyCode) >= 0) {
- event.preventDefault();
- scrollToPreviousItem(scrollArea); // u
- } else if ([85].indexOf(keyCode) >= 0) {
- event.preventDefault();
- toggleUnread(scrollArea); // e
- } else if ([69].indexOf(keyCode) >= 0) {
- event.preventDefault();
- expandItem(scrollArea); // s, i, l
- } else if ([
- 73,
- 83,
- 76
- ].indexOf(keyCode) >= 0) {
- event.preventDefault();
- toggleStar(scrollArea); // h
- } else if ([72].indexOf(keyCode) >= 0) {
- event.preventDefault();
- toggleStar(scrollArea);
- scrollToNextItem(scrollArea); // o
- } else if ([79].indexOf(keyCode) >= 0) {
- event.preventDefault();
- openLink(scrollArea);
- }
- }
- });
-}(window, document, jQuery));
-
-})(angular, jQuery, OC, oc_requesttoken); \ No newline at end of file
+ ]);
+ app.service('Loading', function () {
+ 'use strict';
+ var $__0 = this;
+ this.loading = {
+ global: false,
+ content: false,
+ autopaging: false
+ };
+ this.setLoading = function (area, isLoading) {
+ $traceurRuntime.setProperty($__0.loading, area, isLoading);
+ };
+ this.isLoading = function (area) {
+ return $__0.loading[$traceurRuntime.toProperty(area)];
+ };
+ });
+ app.service('Publisher', function () {
+ 'use strict';
+ var $__0 = this;
+ this.channels = {};
+ this.subscribe = function (obj) {
+ return {
+ toChannels: function () {
+ for (var channels = [], $__4 = 0; $__4 < arguments.length; $__4++)
+ $traceurRuntime.setProperty(channels, $__4, arguments[$traceurRuntime.toProperty($__4)]);
+ for (var $__2 = channels[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (channel) {
+ channel = $__3.value;
+ {
+ $traceurRuntime.setProperty($__0.channels, channel, $__0.channels[$traceurRuntime.toProperty(channel)] || []);
+ $__0.channels[$traceurRuntime.toProperty(channel)].push(obj);
+ }
+ }
+ }
+ }
+ };
+ };
+ this.publishAll = function (data) {
+ for (var $channel in data) {
+ try {
+ throw undefined;
+ } catch (channel) {
+ channel = $channel;
+ if ($__0.channels[$traceurRuntime.toProperty(channel)] !== undefined) {
+ for (var $__2 = $__0.channels[$traceurRuntime.toProperty(channel)][$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (listener) {
+ listener = $__3.value;
+ {
+ listener.receive(data[$traceurRuntime.toProperty(channel)], channel);
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+ });
+ app.factory('Resource', function () {
+ 'use strict';
+ var Resource = function Resource(id, http) {
+ this.id = id;
+ this.values = [];
+ this.hashMap = {};
+ this.http = http;
+ };
+ $traceurRuntime.createClass(Resource, {
+ receive: function (values) {
+ var $__0 = this;
+ values.forEach(function (value) {
+ $__0.add(value);
+ });
+ },
+ add: function (value) {
+ var existing = this.hashMap[$traceurRuntime.toProperty(value[$traceurRuntime.toProperty(this.id)])];
+ if (existing === undefined) {
+ this.values.push(value);
+ $traceurRuntime.setProperty(this.hashMap, value[$traceurRuntime.toProperty(this.id)], value);
+ } else {
+ for (var $key in value) {
+ try {
+ throw undefined;
+ } catch (key) {
+ key = $key;
+ if (value.hasOwnProperty(key)) {
+ $traceurRuntime.setProperty(existing, key, value[$traceurRuntime.toProperty(key)]);
+ }
+ }
+ }
+ }
+ },
+ size: function () {
+ return this.values.length;
+ },
+ get: function (id) {
+ return this.hashMap[$traceurRuntime.toProperty(id)];
+ },
+ delete: function (id) {
+ var deleteAtIndex;
+ {
+ try {
+ throw undefined;
+ } catch ($i) {
+ $i = 0;
+ for (; $i < this.values.length; $i += 1) {
+ try {
+ throw undefined;
+ } catch (i) {
+ i = $i;
+ try {
+ if (this.values[$traceurRuntime.toProperty(i)][$traceurRuntime.toProperty(this.id)] === id) {
+ deleteAtIndex = i;
+ break;
+ }
+ } finally {
+ $i = i;
+ }
+ }
+ }
+ }
+ }
+ if (deleteAtIndex !== undefined) {
+ this.values.splice(deleteAtIndex, 1);
+ }
+ if (this.hashMap[$traceurRuntime.toProperty(id)] !== undefined) {
+ delete this.hashMap[$traceurRuntime.toProperty(id)];
+ }
+ },
+ clear: function () {
+ this.hashMap = {};
+ while (this.values.length > 0) {
+ this.values.pop();
+ }
+ },
+ getAll: function () {
+ return this.values;
+ }
+ }, {});
+ return Resource;
+ });
+ app.service('Settings', function () {
+ 'use strict';
+ var $__0 = this;
+ this.settings = {};
+ this.receive = function (data) {
+ for (var $key in data) {
+ try {
+ throw undefined;
+ } catch (key) {
+ key = $key;
+ $traceurRuntime.setProperty($__0.settings, key, data[$traceurRuntime.toProperty(key)]);
+ }
+ }
+ };
+ this.get = function (key) {
+ return $__0.settings[$traceurRuntime.toProperty(key)];
+ };
+ this.set = function (key, value) {
+ $traceurRuntime.setProperty($__0.settings, key, value);
+ };
+ });
+ (function (window, document, $) {
+ 'use strict';
+ var scrollArea = $('#app-content');
+ var noInputFocused = function (element) {
+ return !(element.is('input') && element.is('select') && element.is('textarea') && element.is('checkbox'));
+ };
+ var noModifierKey = function (event) {
+ return !(event.shiftKey || event.altKey || event.ctrlKey || event.metaKey);
+ };
+ var scrollToItem = function (item, scrollArea) {
+ scrollArea.scrollTop(item.offset().top - scrollArea.offset().top + scrollArea.scrollTop());
+ };
+ var scrollToNextItem = function (scrollArea) {
+ var items = scrollArea.find('.feed_item');
+ for (var $__2 = items[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (item) {
+ item = $__3.value;
+ {
+ item = $(item);
+ if (item.position().top > 1) {
+ scrollToItem(scrollArea, item);
+ return;
+ }
+ }
+ }
+ }
+ scrollArea.scrollTop(scrollArea.prop('scrollHeight'));
+ };
+ var scrollToPreviousItem = function (scrollArea) {
+ var items = scrollArea.find('.feed_item');
+ for (var $__2 = items[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (item) {
+ item = $__3.value;
+ {
+ item = $(item);
+ if (item.position().top >= 0) {
+ try {
+ throw undefined;
+ } catch (previous) {
+ previous = item.prev();
+ if (previous.length > 0) {
+ scrollToItem(scrollArea, previous);
+ }
+ return;
+ }
+ }
+ }
+ }
+ }
+ if (items.length > 0) {
+ scrollToItem(scrollArea, items.last());
+ }
+ };
+ var getActiveItem = function (scrollArea) {
+ var items = scrollArea.find('.feed_item');
+ for (var $__2 = items[$traceurRuntime.toProperty(Symbol.iterator)](), $__3; !($__3 = $__2.next()).done;) {
+ try {
+ throw undefined;
+ } catch (item) {
+ item = $__3.value;
+ {
+ item = $(item);
+ if (item.height() + item.position().top > 30) {
+ return item;
+ }
+ }