diff --git a/src/main/webapp/WEB-INF/wro.xml b/src/main/webapp/WEB-INF/wro.xml
index 079d1a74..68736c3b 100644
--- a/src/main/webapp/WEB-INF/wro.xml
+++ b/src/main/webapp/WEB-INF/wro.xml
@@ -37,17 +37,16 @@
webjar:ui-select2.js
webjar:ui-bootstrap-tpls.min.js
webjar:ng-infinite-scroll.min.js
- /vendor/angular-loading-bar/loading-bar.0.4.0.min.js
webjar:ng-grid.min.js
webjar:ng-grid.min.css
+ /vendor/angular-loading-bar/loading-bar.0.4.0.min.js
+ /vendor/angular-loading-bar/loading-bar.min.css
+
/vendor/zocial/*.css
/vendor/readabilicons/css/*.css
-
- /vendor/angular-loading-bar/loading-bar.min.css
-
diff --git a/src/main/webapp/vendor/angular-loading-bar/loading-bar.0.4.0.min.js b/src/main/webapp/vendor/angular-loading-bar/loading-bar.0.4.0.min.js
index 42d85076..ed1193ab 100644
--- a/src/main/webapp/vendor/angular-loading-bar/loading-bar.0.4.0.min.js
+++ b/src/main/webapp/vendor/angular-loading-bar/loading-bar.0.4.0.min.js
@@ -4,4 +4,297 @@
* Copyright (c) 2014 Wes Cruver
* License: MIT
*/
-!function(){"use strict";angular.module("angular-loading-bar",["chieffancypants.loadingBar"]),angular.module("chieffancypants.loadingBar",[]).config(["$httpProvider",function(a){var b=["$q","$cacheFactory","$timeout","$rootScope","cfpLoadingBar",function(b,c,d,e,f){function g(){d.cancel(i),f.complete(),k=0,j=0}function h(b){var d,e=a.defaults;if("GET"!==b.method||b.cache===!1)return b.cached=!1,!1;d=b.cache===!0&&void 0===e.cache?c.get("$http"):void 0!==e.cache?e.cache:b.cache;var f=void 0!==d?void 0!==d.get(b.url):!1;return void 0!==b.cached&&f!==b.cached?b.cached:(b.cached=f,f)}var i,j=0,k=0,l=f.latencyThreshold;return{request:function(a){return a.ignoreLoadingBar||h(a)||(e.$broadcast("cfpLoadingBar:loading",{url:a.url}),0===j&&(i=d(function(){f.start()},l)),j++,f.set(k/j)),a},response:function(a){return h(a.config)||(k++,e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url}),k>=j?g():f.set(k/j)),a},responseError:function(a){return h(a.config)||(k++,e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url}),k>=j?g():f.set(k/j)),b.reject(a)}}}];a.interceptors.push(b)}]).provider("cfpLoadingBar",function(){this.includeSpinner=!0,this.includeBar=!0,this.latencyThreshold=100,this.startSize=.02,this.parentSelector="body",this.$get=["$document","$timeout","$animate","$rootScope",function(a,b,c,d){function e(){b.cancel(k),q||(d.$broadcast("cfpLoadingBar:started"),q=!0,t&&c.enter(n,m),s&&c.enter(p,m),f(u))}function f(a){if(q){var c=100*a+"%";o.css("width",c),r=a,b.cancel(j),j=b(function(){g()},250)}}function g(){if(!(h()>=1)){var a=0,b=h();a=b>=0&&.25>b?(3*Math.random()+3)/100:b>=.25&&.65>b?3*Math.random()/100:b>=.65&&.9>b?2*Math.random()/100:b>=.9&&.99>b?.005:0;var c=h()+a;f(c)}}function h(){return r}function i(){d.$broadcast("cfpLoadingBar:completed"),f(1),k=b(function(){c.leave(n,function(){r=0,q=!1}),c.leave(p)},500)}var j,k,l=this.parentSelector,m=a.find(l),n=angular.element(''),o=n.find("div").eq(0),p=angular.element(''),q=!1,r=0,s=this.includeSpinner,t=this.includeBar,u=this.startSize;return{start:e,set:f,status:h,inc:g,complete:i,includeSpinner:this.includeSpinner,latencyThreshold:this.latencyThreshold,parentSelector:this.parentSelector,startSize:this.startSize}}]})}();
\ No newline at end of file
+/*
+ * angular-loading-bar
+ *
+ * intercepts XHR requests and creates a loading bar.
+ * Based on the excellent nprogress work by rstacruz (more info in readme)
+ *
+ * (c) 2013 Wes Cruver
+ * License: MIT
+ */
+
+
+(function() {
+
+'use strict';
+
+// Alias the loading bar so it can be included using a simpler
+// (and maybe more professional) module name:
+angular.module('angular-loading-bar', ['chieffancypants.loadingBar']);
+
+
+/**
+ * loadingBarInterceptor service
+ *
+ * Registers itself as an Angular interceptor and listens for XHR requests.
+ */
+angular.module('chieffancypants.loadingBar', [])
+ .config(['$httpProvider', function ($httpProvider) {
+
+ var interceptor = ['$q', '$cacheFactory', '$timeout', '$rootScope', 'cfpLoadingBar', function ($q, $cacheFactory, $timeout, $rootScope, cfpLoadingBar) {
+
+ /**
+ * The total number of requests made
+ */
+ var reqsTotal = 0;
+
+ /**
+ * The number of requests completed (either successfully or not)
+ */
+ var reqsCompleted = 0;
+
+ /**
+ * The amount of time spent fetching before showing the loading bar
+ */
+ var latencyThreshold = cfpLoadingBar.latencyThreshold;
+
+ /**
+ * $timeout handle for latencyThreshold
+ */
+ var startTimeout;
+
+
+ /**
+ * calls cfpLoadingBar.complete() which removes the
+ * loading bar from the DOM.
+ */
+ function setComplete() {
+ $timeout.cancel(startTimeout);
+ cfpLoadingBar.complete();
+ reqsCompleted = 0;
+ reqsTotal = 0;
+ }
+
+ /**
+ * Determine if the response has already been cached
+ * @param {Object} config the config option from the request
+ * @return {Boolean} retrns true if cached, otherwise false
+ */
+ function isCached(config) {
+ var cache;
+ var defaults = $httpProvider.defaults;
+
+ if (config.method !== 'GET' || config.cache === false) {
+ config.cached = false;
+ return false;
+ }
+
+ if (config.cache === true && defaults.cache === undefined) {
+ cache = $cacheFactory.get('$http');
+ } else if (defaults.cache !== undefined) {
+ cache = defaults.cache;
+ } else {
+ cache = config.cache;
+ }
+
+ var cached = cache !== undefined ?
+ cache.get(config.url) !== undefined : false;
+
+ if (config.cached !== undefined && cached !== config.cached) {
+ return config.cached;
+ }
+ config.cached = cached;
+ return cached;
+ }
+
+
+ return {
+ 'request': function(config) {
+ // Check to make sure this request hasn't already been cached and that
+ // the requester didn't explicitly ask us to ignore this request:
+ if (!config.ignoreLoadingBar && !isCached(config)) {
+ $rootScope.$broadcast('cfpLoadingBar:loading', {url: config.url});
+ if (reqsTotal === 0) {
+ startTimeout = $timeout(function() {
+ cfpLoadingBar.start();
+ }, latencyThreshold);
+ }
+ reqsTotal++;
+ cfpLoadingBar.set(reqsCompleted / reqsTotal);
+ }
+ return config;
+ },
+
+ 'response': function(response) {
+ if (response.config && !isCached(response.config)) {
+ reqsCompleted++;
+ $rootScope.$broadcast('cfpLoadingBar:loaded', {url: response.config.url});
+ if (reqsCompleted >= reqsTotal) {
+ setComplete();
+ } else {
+ cfpLoadingBar.set(reqsCompleted / reqsTotal);
+ }
+ }
+ return response;
+ },
+
+ 'responseError': function(rejection) {
+ if (!isCached(rejection.config)) {
+ reqsCompleted++;
+ $rootScope.$broadcast('cfpLoadingBar:loaded', {url: rejection.config.url});
+ if (reqsCompleted >= reqsTotal) {
+ setComplete();
+ } else {
+ cfpLoadingBar.set(reqsCompleted / reqsTotal);
+ }
+ }
+ return $q.reject(rejection);
+ }
+ };
+ }];
+
+ $httpProvider.interceptors.push(interceptor);
+ }])
+
+
+ /**
+ * Loading Bar
+ *
+ * This service handles adding and removing the actual element in the DOM.
+ * Generally, best practices for DOM manipulation is to take place in a
+ * directive, but because the element itself is injected in the DOM only upon
+ * XHR requests, and it's likely needed on every view, the best option is to
+ * use a service.
+ */
+ .provider('cfpLoadingBar', function() {
+
+ this.includeSpinner = true;
+ this.includeBar = true;
+ this.latencyThreshold = 100;
+ this.startSize = 0.02;
+ this.parentSelector = 'body';
+
+ this.$get = ['$document', '$timeout', '$animate', '$rootScope', function ($document, $timeout, $animate, $rootScope) {
+
+ var $parentSelector = this.parentSelector,
+ $parent = $document.find($parentSelector),
+ loadingBarContainer = angular.element(''),
+ loadingBar = loadingBarContainer.find('div').eq(0),
+ spinner = angular.element('');
+
+ var incTimeout,
+ completeTimeout,
+ started = false,
+ status = 0;
+
+ var includeSpinner = this.includeSpinner;
+ var includeBar = this.includeBar;
+ var startSize = this.startSize;
+
+ /**
+ * Inserts the loading bar element into the dom, and sets it to 2%
+ */
+ function _start() {
+ $timeout.cancel(completeTimeout);
+
+ // do not continually broadcast the started event:
+ if (started) {
+ return;
+ }
+
+ $rootScope.$broadcast('cfpLoadingBar:started');
+ started = true;
+
+ if (includeBar) {
+ $animate.enter(loadingBarContainer, $parent);
+ }
+
+ if (includeSpinner) {
+ $animate.enter(spinner, $parent);
+ }
+
+ _set(startSize);
+ }
+
+ /**
+ * Set the loading bar's width to a certain percent.
+ *
+ * @param n any value between 0 and 1
+ */
+ function _set(n) {
+ if (!started) {
+ return;
+ }
+ var pct = (n * 100) + '%';
+ loadingBar.css('width', pct);
+ status = n;
+
+ // increment loadingbar to give the illusion that there is always
+ // progress but make sure to cancel the previous timeouts so we don't
+ // have multiple incs running at the same time.
+ $timeout.cancel(incTimeout);
+ incTimeout = $timeout(function() {
+ _inc();
+ }, 250);
+ }
+
+ /**
+ * Increments the loading bar by a random amount
+ * but slows down as it progresses
+ */
+ function _inc() {
+ if (_status() >= 1) {
+ return;
+ }
+
+ var rnd = 0;
+
+ // TODO: do this mathmatically instead of through conditions
+
+ var stat = _status();
+ if (stat >= 0 && stat < 0.25) {
+ // Start out between 3 - 6% increments
+ rnd = (Math.random() * (5 - 3 + 1) + 3) / 100;
+ } else if (stat >= 0.25 && stat < 0.65) {
+ // increment between 0 - 3%
+ rnd = (Math.random() * 3) / 100;
+ } else if (stat >= 0.65 && stat < 0.9) {
+ // increment between 0 - 2%
+ rnd = (Math.random() * 2) / 100;
+ } else if (stat >= 0.9 && stat < 0.99) {
+ // finally, increment it .5 %
+ rnd = 0.005;
+ } else {
+ // after 99%, don't increment:
+ rnd = 0;
+ }
+
+ var pct = _status() + rnd;
+ _set(pct);
+ }
+
+ function _status() {
+ return status;
+ }
+
+ function _complete() {
+ $rootScope.$broadcast('cfpLoadingBar:completed');
+ _set(1);
+
+ // Attempt to aggregate any start/complete calls within 500ms:
+ completeTimeout = $timeout(function() {
+ $animate.leave(loadingBarContainer, function() {
+ status = 0;
+ started = false;
+ });
+ $animate.leave(spinner);
+ }, 500);
+ }
+
+ return {
+ start : _start,
+ set : _set,
+ status : _status,
+ inc : _inc,
+ complete : _complete,
+ includeSpinner : this.includeSpinner,
+ latencyThreshold : this.latencyThreshold,
+ parentSelector : this.parentSelector,
+ startSize : this.startSize
+ };
+
+
+ }]; //
+ }); // wtf javascript. srsly
+})(); //