From ade9ad43807698d93200280095712c62645e8d8e Mon Sep 17 00:00:00 2001
From: Eike Cochu <eike@cochu.com>
Date: Thu, 25 Feb 2016 15:24:24 +0100
Subject: [PATCH] applied jshint and js prettify

---
 vipra-ui/app/js/app.js         |  15 +-
 vipra-ui/app/js/config.js      |   5 +-
 vipra-ui/app/js/controllers.js | 741 +++++++++++++++++----------------
 vipra-ui/app/js/directives.js  |  59 ++-
 vipra-ui/app/js/factories.js   |  30 +-
 vipra-ui/app/js/filters.js     |   5 +-
 vipra-ui/app/js/helpers.js     |  25 +-
 7 files changed, 449 insertions(+), 431 deletions(-)

diff --git a/vipra-ui/app/js/app.js b/vipra-ui/app/js/app.js
index 58fa1c0a..61d949d5 100644
--- a/vipra-ui/app/js/app.js
+++ b/vipra-ui/app/js/app.js
@@ -2,8 +2,11 @@
  * Vipra Application
  * Main application file
  ******************************************************************************/
+/* globals angular, console, NProgress */
 (function() {
 
+  "use strict";
+
   var app = angular.module('vipra.app', [
     'ngResource',
     'ngSanitize',
@@ -23,7 +26,7 @@
     $urlRouterProvider.otherwise('/');
 
     // states
-    
+
     $stateProvider.state('index', {
       url: '/',
       templateUrl: 'html/index.html',
@@ -122,11 +125,11 @@
 
   }]);
 
-  app.config(['$httpProvider', function($httpProvider) {
+  var loadingTimeout;
 
-    var loadingTimeout;
+  app.config(['$httpProvider', function($httpProvider) {
 
-    $httpProvider.interceptors.push(function ($q, $injector, $rootScope) { 
+    $httpProvider.interceptors.push(function($q, $injector, $rootScope) {
       var requestIncrement = function(config) {
         $rootScope.loading.requests = ++$rootScope.loading.requests || 1;
         $rootScope.loading[config.method] = ++$rootScope.loading[config.method] || 1;
@@ -175,7 +178,7 @@
 
     $rootScope.loading = {};
 
-    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
+    $rootScope.$on('$stateChangeStart', function(event, toState) {
       console.log('changing state: ' + toState.name);
       NProgress.start();
 
@@ -187,4 +190,4 @@
 
   }]);
 
-})();
\ No newline at end of file
+})();
diff --git a/vipra-ui/app/js/config.js b/vipra-ui/app/js/config.js
index e6f400bd..07d0630b 100644
--- a/vipra-ui/app/js/config.js
+++ b/vipra-ui/app/js/config.js
@@ -1,5 +1,8 @@
+/* globals Vipra */
 (function() {
 
+  "use strict";
+
   window.Vipra = window.Vipra || {};
 
   Vipra.config = {
@@ -10,4 +13,4 @@
     pageSize: 100
   };
 
-})();
\ No newline at end of file
+})();
diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js
index 6526e52e..2813aecc 100644
--- a/vipra-ui/app/js/controllers.js
+++ b/vipra-ui/app/js/controllers.js
@@ -2,8 +2,11 @@
  * Vipra Application
  * Controllers
  ******************************************************************************/
+/* globals angular, Vipra, moment, vis, console, $, prompt */
 (function() {
 
+  "use strict";
+
   var app = angular.module('vipra.controllers', [
     'ui.router',
     'vipra.factories'
@@ -19,35 +22,36 @@
   app.controller('IndexController', ['$scope', '$location', 'ArticleFactory', 'TopicFactory', 'WordFactory', 'SearchFactory',
     function($scope, $location, ArticleFactory, TopicFactory, WordFactory, SearchFactory) {
 
-    $scope.search = $location.search().query;
+      $scope.search = $location.search().query;
 
-    ArticleFactory.query({limit:Vipra.config.latestItems, sort:'-created'}, function(data) {
-      $scope.latestArticles = data;
-    });
+      ArticleFactory.query({ limit: Vipra.config.latestItems, sort: '-created' }, function(data) {
+        $scope.latestArticles = data;
+      });
 
-    TopicFactory.query({limit:Vipra.config.latestItems, sort:'-created'}, function(data) {
-      $scope.latestTopics = data;
-    });
+      TopicFactory.query({ limit: Vipra.config.latestItems, sort: '-created' }, function(data) {
+        $scope.latestTopics = data;
+      });
 
-    WordFactory.query({limit:Vipra.config.latestItems, sort:'-created'}, function(data) {
-      $scope.latestWords = data;
-    });
+      WordFactory.query({ limit: Vipra.config.latestItems, sort: '-created' }, function(data) {
+        $scope.latestWords = data;
+      });
 
-    $scope.$watch('search', function() {
-      if($scope.search) {
-        $location.search('query', $scope.search);
-        $scope.searching = true;
-        SearchFactory.query({limit:Vipra.config.searchResults, query:$scope.search}, function(data) {
-          $scope.searching = false;
-          $scope.searchResults = data;
-        });
-      } else {
-        $location.search('query', null);
-        $scope.searchResults = [];
-      }
-    });
+      $scope.$watch('search', function() {
+        if ($scope.search) {
+          $location.search('query', $scope.search);
+          $scope.searching = true;
+          SearchFactory.query({ limit: Vipra.config.searchResults, query: $scope.search }, function(data) {
+            $scope.searching = false;
+            $scope.searchResults = data;
+          });
+        } else {
+          $location.search('query', null);
+          $scope.searchResults = [];
+        }
+      });
 
-  }]);
+    }
+  ]);
 
   /**
    * About controller
@@ -55,14 +59,15 @@
   app.controller('AboutController', ['$scope', 'InfoFactory',
     function($scope, InfoFactory) {
 
-    InfoFactory.get(function(data) {
-      $scope.info = data;
-      $scope.buildDate = Vipra.formatDateTime(moment($scope.info.app.builddate, 'YYMMDD_HHmm').toDate());
-      $scope.startTime = Vipra.formatDateTime(moment($scope.info.vm.starttime, 'x').toDate());
-      $scope.upTime = moment.duration($scope.info.vm.uptime).humanize();
-    });
+      InfoFactory.get(function(data) {
+        $scope.info = data;
+        $scope.buildDate = Vipra.formatDateTime(moment($scope.info.app.builddate, 'YYMMDD_HHmm').toDate());
+        $scope.startTime = Vipra.formatDateTime(moment($scope.info.vm.starttime, 'x').toDate());
+        $scope.upTime = moment.duration($scope.info.vm.uptime).humanize();
+      });
 
-  }]);
+    }
+  ]);
 
   /**
    * Network controller
@@ -70,190 +75,191 @@
   app.controller('NetworkController', ['$scope', '$state', '$stateParams', '$timeout', 'Store', 'ArticleFactory', 'TopicFactory', 'WordFactory',
     function($scope, $state, $stateParams, $timeout, Store, ArticleFactory, TopicFactory, WordFactory) {
 
-    var id = 0,
+      var id = 0,
         ids = {},
         edges = {};
 
-    $scope.colors = {
-      articles: '#BBC9D2',
-      topics: '#DBB234',
-      words: '#547C65'
-    };
-    $scope.nodes = new vis.DataSet();
-    $scope.edges = new vis.DataSet();
-    $scope.data = {
-      nodes: $scope.nodes,
-      edges: $scope.edges
-    };
-    $scope.type = $stateParams.type;
-    $scope.options = {
-      nodes: {
-        font: { size: 14 },
-        shape: 'dot',
-        borderWidth: 0
-      },
-      edges: {
-        color: {
-          highlight: '#f00'
-        }
-      },
-      layout: { randomSeed: 1 },
-      physics: {
-        barnesHut: {
-          springConstant: 0.008,
-          gravitationalConstant: -3500
+      $scope.colors = {
+        articles: '#BBC9D2',
+        topics: '#DBB234',
+        words: '#547C65'
+      };
+      $scope.nodes = new vis.DataSet();
+      $scope.edges = new vis.DataSet();
+      $scope.data = {
+        nodes: $scope.nodes,
+        edges: $scope.edges
+      };
+      $scope.type = $stateParams.type;
+      $scope.options = {
+        nodes: {
+          font: { size: 14 },
+          shape: 'dot',
+          borderWidth: 0
+        },
+        edges: {
+          color: {
+            highlight: '#f00'
+          }
+        },
+        layout: { randomSeed: 1 },
+        physics: {
+          barnesHut: {
+            springConstant: 0.008,
+            gravitationalConstant: -3500
+          }
         }
+      };
+
+      var factory;
+      if ($stateParams.type === 'articles')
+        factory = ArticleFactory;
+      else if ($stateParams.type === 'topics')
+        factory = TopicFactory;
+      else if ($stateParams.type === 'words')
+        factory = WordFactory;
+      else {
+        console.log('unknown network type');
+        return;
       }
-    };
-
-    var factory;
-    if($stateParams.type === 'articles')
-      factory = ArticleFactory;
-    else if($stateParams.type === 'topics')
-      factory = TopicFactory;
-    else if($stateParams.type === 'words')
-      factory = WordFactory;
-    else {
-      console.log('unknown network type');
-      return;
-    }
 
-    // get root node
-    factory.get({id: $stateParams.id}, function(data) {
-      // add root node
-      if($stateParams.type === 'articles')
-        $scope.nodes.add([articleNode(data)]);
-      else if($stateParams.type === 'topics')
-        $scope.nodes.add([topicNode(data)]);
-      else if($stateParams.type === 'words')
-        $scope.nodes.add([wordNode(data)]);
-      ids[data.id] = id;
-
-      // create graph
-      var container = document.getElementById("visgraph");
-      $scope.graph = new vis.Network(container, $scope.data, $scope.options);
-      $scope.graph.on('selectNode', $scope.select);
-      $scope.graph.on('doubleClick', $scope.open);
-    });
-
-    var newNode = function(title, type, show, dbid, color, shape) {
-      ids[dbid] = ++id;
-      return {
-        id: id,
-        title: title,
-        label: title.multiline(5),
-        type: type,
-        show: show,
-        dbid: dbid,
-        shape: shape || 'dot',
-        color: {
-          background: color,
-          highlight: { background: color }
+      // get root node
+      factory.get({ id: $stateParams.id }, function(data) {
+        // add root node
+        if ($stateParams.type === 'articles')
+          $scope.nodes.add([articleNode(data)]);
+        else if ($stateParams.type === 'topics')
+          $scope.nodes.add([topicNode(data)]);
+        else if ($stateParams.type === 'words')
+          $scope.nodes.add([wordNode(data)]);
+        ids[data.id] = id;
+
+        // create graph
+        var container = document.getElementById("visgraph");
+        $scope.graph = new vis.Network(container, $scope.data, $scope.options);
+        $scope.graph.on('selectNode', $scope.select);
+        $scope.graph.on('doubleClick', $scope.open);
+      });
+
+      var newNode = function(title, type, show, dbid, color, shape) {
+        ids[dbid] = ++id;
+        return {
+          id: id,
+          title: title,
+          label: title.multiline(5),
+          type: type,
+          show: show,
+          dbid: dbid,
+          shape: shape || 'dot',
+          color: {
+            background: color,
+            highlight: { background: color }
+          }
+        };
+      };
+
+      var topicNode = function(topic) {
+        topic = topic.topic || topic;
+        return newNode(topic.name, 'topic', 'topics.show', topic.id, $scope.colors.topics, 'triangle');
+      };
+
+      var articleNode = function(article) {
+        return newNode(article.title, 'article', 'articles.show', article.id, $scope.colors.articles, 'square');
+      };
+
+      var wordNode = function(word) {
+        return newNode(word.id, 'word', 'words.show', word.id, $scope.colors.words);
+      };
+
+      var edgeExists = function(idA, idB) {
+        if (idB < idA) {
+          var tmp = idA;
+          idA = idB;
+          idB = tmp;
         }
+        return edges.hasOwnProperty(idA + '-' + idB);
       };
-    };
-
-    var topicNode = function(topic) {
-      topic = topic.topic || topic;
-      return newNode(topic.name, 'topic', 'topics.show', topic.id, $scope.colors.topics, 'triangle');
-    };
-
-    var articleNode = function(article) {
-      return newNode(article.title, 'article', 'articles.show', article.id, $scope.colors.articles, 'square');
-    };
-
-    var wordNode = function(word) {
-      return newNode(word.id, 'word', 'words.show', word.id, $scope.colors.words);
-    };
-
-    var edgeExists = function(idA, idB) {
-      if(idB < idA) {
-        var tmp = idA;
-        idA = idB;
-        idB = tmp;
-      }
-      return edges.hasOwnProperty(idA + '-' + idB);
-    };
-
-    var addEdge = function(idA, idB) {
-      if(idB < idA) {
-        var tmp = idA;
-        idA = idB;
-        idB = tmp;
-      }
-      edges[idA + '-' + idB] = 1;
-    };
 
-    // construct new nodes
-    var constructor = function(result, node, nodeFunction) {
-      if(result) {
-        var newNodes = [],
+      var addEdge = function(idA, idB) {
+        if (idB < idA) {
+          var tmp = idA;
+          idA = idB;
+          idB = tmp;
+        }
+        edges[idA + '-' + idB] = 1;
+      };
+
+      // construct new nodes
+      var constructor = function(result, node, nodeFunction) {
+        if (result) {
+          var newNodes = [],
             newEdges = [];
-        for(var i = 0; i < result.length; i++) {
-          var current = result[i];
-          if(ids.hasOwnProperty(current.id)) {
-            if(edgeExists(ids[current.id], node.id))
-              continue;
-            newEdges.push({from:ids[current.id], to:node.id});
-            addEdge(ids[current.id], node.id);
-          } else {
-            newNodes.push(nodeFunction(current));
-            newEdges.push({from:id, to:node.id});
-            addEdge(id, node.id);
+          for (var i = 0; i < result.length; i++) {
+            var current = result[i];
+            if (ids.hasOwnProperty(current.id)) {
+              if (edgeExists(ids[current.id], node.id))
+                continue;
+              newEdges.push({ from: ids[current.id], to: node.id });
+              addEdge(ids[current.id], node.id);
+            } else {
+              newNodes.push(nodeFunction(current));
+              newEdges.push({ from: id, to: node.id });
+              addEdge(id, node.id);
+            }
           }
+          if (newNodes.length)
+            $scope.nodes.add(newNodes);
+          if (newEdges.length)
+            $scope.edges.add(newEdges);
         }
-        if(newNodes.length)
-          $scope.nodes.add(newNodes);
-        if(newEdges.length)
-          $scope.edges.add(newEdges);
-      }
-    };
-    
-    // on node select
-    var selectTimeout;
-    $scope.select = function(props) {
-      $timeout.cancel(selectTimeout);
-      selectTimeout = $timeout(function() {
-        var node = $scope.nodes.get(props.nodes[0]);
-        if(node) {
-          if(node.type === 'article' && $scope.shown.topics) {
-            // node is article, load article to get topics
-            ArticleFactory.get({id:node.dbid}, function(data) {
-              if(data.topics) {
-                for(var i = 0; i < data.topics.length; i++)
-                  data.topics[i] = data.topics[i].topic;
-                constructor(data.topics, node, topicNode);
-              }
-            });
-          } else if(node.type === 'topic') {
-            // node is topic, load topic to get words and articles
-            if($scope.shown.words)
-              TopicFactory.get({id:node.dbid}, function(data) {
-                constructor(data.words, node, wordNode);
+      };
+
+      // on node select
+      var selectTimeout;
+      $scope.select = function(props) {
+        $timeout.cancel(selectTimeout);
+        selectTimeout = $timeout(function() {
+          var node = $scope.nodes.get(props.nodes[0]);
+          if (node) {
+            if (node.type === 'article' && $scope.shown.topics) {
+              // node is article, load article to get topics
+              ArticleFactory.get({ id: node.dbid }, function(data) {
+                if (data.topics) {
+                  for (var i = 0; i < data.topics.length; i++)
+                    data.topics[i] = data.topics[i].topic;
+                  constructor(data.topics, node, topicNode);
+                }
               });
-            if($scope.shown.articles)
-              TopicFactory.articles({id:node.dbid}, function(data) {
-                constructor(data, node, articleNode);
+            } else if (node.type === 'topic') {
+              // node is topic, load topic to get words and articles
+              if ($scope.shown.words)
+                TopicFactory.get({ id: node.dbid }, function(data) {
+                  constructor(data.words, node, wordNode);
+                });
+              if ($scope.shown.articles)
+                TopicFactory.articles({ id: node.dbid }, function(data) {
+                  constructor(data, node, articleNode);
+                });
+            } else if (node.type === 'word' && $scope.shown.topics) {
+              // node is word, load word to get topics
+              WordFactory.topics({ id: node.dbid }, function(data) {
+                constructor(data, node, topicNode);
               });
-          } else if(node.type === 'word' && $scope.shown.topics) {
-            // node is word, load word to get topics
-            WordFactory.topics({id:node.dbid}, function(data) {
-              constructor(data, node, topicNode);
-            });
+            }
+            $scope.nodes.update(node);
           }
-          $scope.nodes.update(node);
-        }
-      }, 500);
-    };
+        }, 500);
+      };
 
-    // on node open
-    $scope.open = function(props) {
-      $timeout.cancel(selectTimeout);
-      var node = $scope.nodes.get(props.nodes[0]);
-      $state.transitionTo(node.show, {id:node.dbid});
-    };
+      // on node open
+      $scope.open = function(props) {
+        $timeout.cancel(selectTimeout);
+        var node = $scope.nodes.get(props.nodes[0]);
+        $state.transitionTo(node.show, { id: node.dbid });
+      };
 
-  }]);
+    }
+  ]);
 
   /****************************************************************************
    * Article Controllers
@@ -262,71 +268,73 @@
   /**
    * Article Index route
    */
-  app.controller('ArticlesIndexController', ['$scope', '$state', '$location', 'ArticleFactory', 'Store',
-    function($scope, $state, $location, ArticleFactory, Store) {
-
-    $scope.page = Math.max($location.search().page || 1, 1);
-    $scope.limit = Vipra.config.pageSize;
-
-    $scope.$watchGroup(['page','sort','order'], function() {
-      ArticleFactory.query({
-        skip: ($scope.page-1)*$scope.limit,
-        limit: $scope.limit,
-        sort: $scope.order+$scope.sort
-      }, function(data, headers) {
-        $scope.articles = data;
-        $scope.articlesTotal = headers("V-Total");
-        $scope.maxPage = Math.ceil($scope.articlesTotal / $scope.limit);
+  app.controller('ArticlesIndexController', ['$scope', '$state', '$location', 'ArticleFactory',
+    function($scope, $state, $location, ArticleFactory) {
+
+      $scope.page = Math.max($location.search().page || 1, 1);
+      $scope.limit = Vipra.config.pageSize;
+
+      $scope.$watchGroup(['page', 'sort', 'order'], function() {
+        ArticleFactory.query({
+          skip: ($scope.page - 1) * $scope.limit,
+          limit: $scope.limit,
+          sort: $scope.order + $scope.sort
+        }, function(data, headers) {
+          $scope.articles = data;
+          $scope.articlesTotal = headers("V-Total");
+          $scope.maxPage = Math.ceil($scope.articlesTotal / $scope.limit);
+        });
       });
-    });
 
-  }]);
+    }
+  ]);
 
   /**
    * Article Show route
    */
   app.controller('ArticlesShowController', ['$scope', '$stateParams', 'ArticleFactory',
-    function($scope, $stateParams, ArticleFactory, testService) {
+    function($scope, $stateParams, ArticleFactory) {
 
-    $scope.topicSort = $scope.topicSort || 'share';
-    $scope.topicSortRev = typeof $scope.topicSortRev === 'undefined' ? true : $scope.topicSortRev;
+      $scope.topicSort = $scope.topicSort || 'share';
+      $scope.topicSortRev = typeof $scope.topicSortRev === 'undefined' ? true : $scope.topicSortRev;
 
-    ArticleFactory.get({id: $stateParams.id}, function(data) {
-      $scope.article = data;
-      $scope.article.text = Vipra.createInitial($scope.article.text);
-      $scope.articleDate = Vipra.formatDate($scope.article.date);
-      $scope.articleCreated = Vipra.formatDateTime($scope.article.created);
-      $scope.articleModified = Vipra.formatDateTime($scope.article.modified);
+      ArticleFactory.get({ id: $stateParams.id }, function(data) {
+        $scope.article = data;
+        $scope.article.text = Vipra.createInitial($scope.article.text);
+        $scope.articleDate = Vipra.formatDate($scope.article.date);
+        $scope.articleCreated = Vipra.formatDateTime($scope.article.created);
+        $scope.articleModified = Vipra.formatDateTime($scope.article.modified);
 
-      // calculate percentage share
-      if($scope.article.topics) {
-        var topicShareSeries = [],
+        // calculate percentage share
+        if ($scope.article.topics) {
+          var topicShareSeries = [],
             topics = $scope.article.topics;
-        for(var i = 0; i < topics.length; i++) {
-          topicShareSeries.push({name: topics[i].topic.name.ellipsize(20), y: topics[i].share});
-        }
-
-        // highcharts data
-        var topicShare = {
-          chart: { type: 'pie' },
-          credits: { enabled: false },
-          plotOptions: {
-            pie: { allowPointSelect: true }
-          },
-          title: { text: '' },
-          tooltip: { pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>' },
-          series: [{
-            name: 'Topic Share',
-            colorByPoint: true,
-            data: topicShareSeries
-          }]
-        };
+          for (var i = 0; i < topics.length; i++) {
+            topicShareSeries.push({ name: topics[i].topic.name.ellipsize(20), y: topics[i].share });
+          }
 
-        $scope.topicShare = topicShare;
-      }
-    });
+          // highcharts data
+          var topicShare = {
+            chart: { type: 'pie' },
+            credits: { enabled: false },
+            plotOptions: {
+              pie: { allowPointSelect: true }
+            },
+            title: { text: '' },
+            tooltip: { pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>' },
+            series: [{
+              name: 'Topic Share',
+              colorByPoint: true,
+              data: topicShareSeries
+            }]
+          };
+
+          $scope.topicShare = topicShare;
+        }
+      });
 
-  }]);
+    }
+  ]);
 
   /****************************************************************************
    * Topic Controllers
@@ -338,70 +346,72 @@
   app.controller('TopicsIndexController', ['$scope', '$location', 'Store', 'TopicFactory',
     function($scope, $location, Store, TopicFactory) {
 
-    $scope.page = Math.max($location.search().page || 1, 1);
-    $scope.limit = Vipra.config.pageSize;
-    $scope.sort = Store('sorttopics') || 'name';
-    $scope.order = Store('ordertopics') || '+';
-
-    $scope.$watchGroup(['page','sort','order'], function() {
-      TopicFactory.query({
-        skip: ($scope.page-1)*$scope.limit,
-        limit: $scope.limit,
-        sort: $scope.order+$scope.sort
-      }, function(data, headers) {
-        $scope.topics = data;
-        $scope.topicsTotal = headers("V-Total");
-        $scope.maxPage = Math.ceil($scope.topicsTotal / $scope.limit);
+      $scope.page = Math.max($location.search().page || 1, 1);
+      $scope.limit = Vipra.config.pageSize;
+      $scope.sort = Store('sorttopics') || 'name';
+      $scope.order = Store('ordertopics') || '+';
+
+      $scope.$watchGroup(['page', 'sort', 'order'], function() {
+        TopicFactory.query({
+          skip: ($scope.page - 1) * $scope.limit,
+          limit: $scope.limit,
+          sort: $scope.order + $scope.sort
+        }, function(data, headers) {
+          $scope.topics = data;
+          $scope.topicsTotal = headers("V-Total");
+          $scope.maxPage = Math.ceil($scope.topicsTotal / $scope.limit);
+        });
       });
-    });
 
-  }]);
+    }
+  ]);
 
   /**
    * Topic Show route
    */
-  app.controller('TopicsShowController', ['$scope', '$stateParams', '$timeout', 'TopicFactory', 'WebSocketService',
-    function($scope, $stateParams, $timeout, TopicFactory, WebSocketService) {
-
-    $scope.wordSort = $scope.wordSort || 'likeliness';
-    $scope.wordSortRev = typeof $scope.wordSortRev === 'undefined' ? true : $scope.wordSortRev;
-
-    TopicFactory.get({id: $stateParams.id}, function(data) {
-      $scope.topic = data;
-      $scope.topicCreated = Vipra.formatDateTime($scope.topic.created);
-      $scope.topicModified = Vipra.formatDateTime($scope.topic.modified);
-    });
-
-    $scope.startRename = function() {
-      $scope.origName = $scope.topic.name;
-      $scope.isRename = true;
-      $timeout(function() {
-        $('#topicName').select();
-      }, 0);
-    };
-
-    $scope.endRename = function(save) {
-      delete $scope.renameErrors;
-      if(save) {
-        TopicFactory.update({id:$scope.topic.id}, $scope.topic, function(data) {
-          $scope.topic = data;
+  app.controller('TopicsShowController', ['$scope', '$stateParams', '$timeout', 'TopicFactory',
+    function($scope, $stateParams, $timeout, TopicFactory) {
+
+      $scope.wordSort = $scope.wordSort || 'likeliness';
+      $scope.wordSortRev = typeof $scope.wordSortRev === 'undefined' ? true : $scope.wordSortRev;
+
+      TopicFactory.get({ id: $stateParams.id }, function(data) {
+        $scope.topic = data;
+        $scope.topicCreated = Vipra.formatDateTime($scope.topic.created);
+        $scope.topicModified = Vipra.formatDateTime($scope.topic.modified);
+      });
+
+      $scope.startRename = function() {
+        $scope.origName = $scope.topic.name;
+        $scope.isRename = true;
+        $timeout(function() {
+          $('#topicName').select();
+        }, 0);
+      };
+
+      $scope.endRename = function(save) {
+        delete $scope.renameErrors;
+        if (save) {
+          TopicFactory.update({ id: $scope.topic.id }, $scope.topic, function(data) {
+            $scope.topic = data;
+            $scope.isRename = false;
+          }, function(errors) {
+            $scope.renameErrors = Vipra.getErrors(errors);
+          });
+        } else {
           $scope.isRename = false;
-        }, function(errors) {
-          $scope.renameErrors = Vipra.getErrors(errors);
-        });
-      } else {
-        $scope.isRename = false;
-        $scope.topic.name = $scope.origName;
-      }
-    };
+          $scope.topic.name = $scope.origName;
+        }
+      };
 
-    $scope.keyup = function($event) {
-      if($event.which === 13 || $event.which === 27) {
-        $scope.endRename($event.which === 13);
-        $event.preventDefault();
-      }
-    };
-  }]);
+      $scope.keyup = function($event) {
+        if ($event.which === 13 || $event.which === 27) {
+          $scope.endRename($event.which === 13);
+          $event.preventDefault();
+        }
+      };
+    }
+  ]);
 
   /**
    * Topic Show Articles route
@@ -409,35 +419,26 @@
   app.controller('TopicsArticlesController', ['$scope', '$stateParams', '$location', 'Store', 'TopicFactory',
     function($scope, $stateParams, $location, Store, TopicFactory) {
 
-    $scope.page = Math.max($location.search().page || 1, 1);
-    $scope.limit = Vipra.config.pageSize;
-    $scope.sort = Store('sortarticles') || 'title';
-    $scope.order = Store('orderarticles') || '+';
-
-    $scope.$watchGroup(['page','sort','order'], function() {
-      TopicFactory.articles({
-        id: $stateParams.id,
-        skip: ($scope.page-1)*$scope.limit,
-        limit: $scope.limit,
-        sort: $scope.order+$scope.sort
-      }, function(data, headers) {
-        $scope.articles = data;
-        $scope.articlesTotal = headers("V-Total");
-        $scope.maxPage = Math.ceil($scope.articlesTotal / $scope.limit);
+      $scope.page = Math.max($location.search().page || 1, 1);
+      $scope.limit = Vipra.config.pageSize;
+      $scope.sort = Store('sortarticles') || 'title';
+      $scope.order = Store('orderarticles') || '+';
+
+      $scope.$watchGroup(['page', 'sort', 'order'], function() {
+        TopicFactory.articles({
+          id: $stateParams.id,
+          skip: ($scope.page - 1) * $scope.limit,
+          limit: $scope.limit,
+          sort: $scope.order + $scope.sort
+        }, function(data, headers) {
+          $scope.articles = data;
+          $scope.articlesTotal = headers("V-Total");
+          $scope.maxPage = Math.ceil($scope.articlesTotal / $scope.limit);
+        });
       });
-    });
-
-  }]);
-
-  /**
-   * Topic Show Similar route
-   */
-  app.controller('TopicsSimilarController', ['$scope', '$stateParams', 'TopicFactory',
-    function($scope, $stateParams,  TopicFactory) {
 
-    $scope.typeLabel = $stateParams.type.substring(3);
-
-  }]);
+    }
+  ]);
 
   /****************************************************************************
    * Word Controllers
@@ -449,25 +450,25 @@
   app.controller('WordsIndexController', ['$scope', '$state', '$location', 'Store', 'WordFactory',
     function($scope, $state, $location, Store, WordFactory) {
 
-    $scope.page = Math.max($location.search().page || 1, 1);
-    $scope.limit = 300;
-    $scope.sort = Store('sortwords') || 'id';
-    $scope.order = Store('orderwords') || '+';
-
-    $scope.$watchGroup(['page','sort','order'], function() {
-      WordFactory.query({
-        skip: ($scope.page-1)*$scope.limit,
-        limit: $scope.limit,
-        sort: $scope.sort,
-        sort: $scope.order+$scope.sort
-      }, function(data, headers) {
-        $scope.words = data;
-        $scope.wordsTotal = headers("V-Total");
-        $scope.maxPage = Math.ceil($scope.wordsTotal / $scope.limit);
+      $scope.page = Math.max($location.search().page || 1, 1);
+      $scope.limit = 300;
+      $scope.sort = Store('sortwords') || 'id';
+      $scope.order = Store('orderwords') || '+';
+
+      $scope.$watchGroup(['page', 'sort', 'order'], function() {
+        WordFactory.query({
+          skip: ($scope.page - 1) * $scope.limit,
+          limit: $scope.limit,
+          sort: $scope.order + $scope.sort
+        }, function(data, headers) {
+          $scope.words = data;
+          $scope.wordsTotal = headers("V-Total");
+          $scope.maxPage = Math.ceil($scope.wordsTotal / $scope.limit);
+        });
       });
-    });
 
-  }]);
+    }
+  ]);
 
   /**
    * Word Show route
@@ -475,16 +476,17 @@
   app.controller('WordsShowController', ['$scope', '$stateParams', 'WordFactory',
     function($scope, $stateParams, WordFactory) {
 
-    WordFactory.get({id: $stateParams.id}, function(data) {
-      $scope.word = data;
-      $scope.wordCreated = Vipra.formatDateTime($scope.word.created);
-    });
+      WordFactory.get({ id: $stateParams.id }, function(data) {
+        $scope.word = data;
+        $scope.wordCreated = Vipra.formatDateTime($scope.word.created);
+      });
 
-    WordFactory.topics({id: $stateParams.id}, function(data) {
-      $scope.topics = data;
-    });
+      WordFactory.topics({ id: $stateParams.id }, function(data) {
+        $scope.topics = data;
+      });
 
-  }]);
+    }
+  ]);
 
   /****************************************************************************
    * Directive Controllers
@@ -496,16 +498,16 @@
   app.controller('PaginationController', ['$scope',
     function($scope) {
 
-      if(!$scope.page)
+      if (!$scope.page)
         $scope.page = 1;
 
       $scope.calculatePages = function() {
         var pages = [],
-            max   = Math.ceil($scope.total/$scope.limit*1.0),
-            pad   = 4,
-            start = Math.max($scope.page - pad, 1),
-            end   = Math.min(Math.max($scope.page + pad, start + pad * 2), max);
-        for(var i = start; i <= end; i++) {
+          max = Math.ceil($scope.total / $scope.limit * 1.0),
+          pad = 4,
+          start = Math.max($scope.page - pad, 1),
+          end = Math.min(Math.max($scope.page + pad, start + pad * 2), max);
+        for (var i = start; i <= end; i++) {
           pages.push(i);
         }
         $scope.pages = pages;
@@ -513,7 +515,7 @@
       };
 
       $scope.$watchGroup(['total', 'page', 'limit'], function(newVal, oldVal) {
-        if(!angular.equals(newVal, oldVal)) {
+        if (!angular.equals(newVal, oldVal)) {
           $scope.calculatePages();
         }
       });
@@ -522,14 +524,15 @@
 
       $scope.changePage = function(page) {
         $scope.page = page;
-        window.scrollTo(0,0);
+        window.scrollTo(0, 0);
       };
 
       $scope.toPage = function() {
         var page = prompt("Enter a page number (between 1 and " + $scope.maxPage + ")");
-        if(page > 0 && page <= $scope.maxPage)
+        if (page > 0 && page <= $scope.maxPage)
           $scope.changePage(page);
       };
-   }]);
+    }
+  ]);
 
-})();
\ No newline at end of file
+})();
diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js
index 6493dbce..23f4deae 100644
--- a/vipra-ui/app/js/directives.js
+++ b/vipra-ui/app/js/directives.js
@@ -2,8 +2,11 @@
  * Vipra Application
  * Directives
  ******************************************************************************/
+/* globals angular, $, console, Vipra */
 (function() {
 
+  "use strict";
+
   var app = angular.module('vipra.directives', [
     'ui.router'
   ]);
@@ -17,7 +20,7 @@
       replace: true,
       transclude: true,
       template: '<a class="topic-link" ui-sref="topics.show({id:topic.id})"><span ng-bind="topic.name"></span><ng-transclude/></a>'
-    }
+    };
   });
 
   app.directive('articleLink', function() {
@@ -29,7 +32,7 @@
       replace: true,
       transclude: true,
       template: '<a class="article-link" ui-sref="articles.show({id:article.id})"><span ng-bind="article.title"></span><ng-transclude/></a>'
-    }
+    };
   });
 
   app.directive('pagination', function() {
@@ -54,7 +57,7 @@
       },
       link: function($scope, $element) {
         $scope.$watch('highcharts', function(newVal) {
-          if(!newVal) return;
+          if (!newVal) return;
 
           $element.highcharts($scope.highcharts);
         });
@@ -72,12 +75,12 @@
       template: '<a class="hide-link" href="#" ng-bind="text" ng-click="change($event)"></a>',
       link: function($scope) {
         var target = $($scope.target);
-        if(!target.length) return;
+        if (!target.length) return;
         var store = $scope.store !== 'false';
         var name = 'hidelink-' + $scope.target;
-        if(store) {
+        if (store) {
           var visible = Store(name);
-          if(visible !== null && typeof visible !== 'undefined')
+          if (visible !== null && typeof visible !== 'undefined')
             target.toggle(visible);
         }
 
@@ -90,7 +93,7 @@
           var visible = !target.is(':visible');
           setText(visible);
           target.slideToggle();
-          if(store)
+          if (store)
             Store(name, visible);
         };
 
@@ -106,7 +109,7 @@
           $($attrs.target).slideToggle();
         });
       }
-    }
+    };
   });
 
   app.directive('ngModelStore', ['Store', function(Store) {
@@ -114,15 +117,15 @@
       restrict: 'A',
       require: 'ngModel',
       link: function($scope, $elem, $attrs, $ctrl) {
-        if(!$attrs.ngModelStore) {
+        if (!$attrs.ngModelStore) {
           console.log("no store key given");
           return;
         }
         var value = Store($attrs.ngModelStore);
-        if(value != null) {
+        if (value !== null) {
           $ctrl.$setViewValue(value);
           $ctrl.$render();
-        } else if($attrs.ngModelDefault) {
+        } else if ($attrs.ngModelDefault) {
           $ctrl.$setViewValue($scope.$eval($attrs.ngModelDefault));
           $ctrl.$render();
         }
@@ -145,7 +148,7 @@
       link: function($scope) {
         $scope.dropdownId = Vipra.randomId();
         $scope.align = 'dropdown-menu-left';
-        if($scope.align === 'right')
+        if ($scope.align === 'right')
           $scope.align = 'dropdown-menu-right';
       }
     };
@@ -161,7 +164,7 @@
       replace: true,
       templateUrl: 'html/directives/alert.html',
       link: function($scope) {
-        if(!$scope.type) {
+        if (!$scope.type) {
           console.log('no alert type given');
           return;
         }
@@ -169,7 +172,7 @@
         $scope.dismissible = $scope.dismissible !== 'false';
 
         var classes = 'alert alert-' + $scope.type;
-        if($scope.dismissible)
+        if ($scope.dismissible)
           classes += ' alert-dismissible';
         $scope.classes = classes;
       }
@@ -182,10 +185,7 @@
         ngModel: '='
       },
       restrict: 'E',
-      templateUrl: 'html/directives/checkbox.html',
-      link: function($scope) {
-
-      }
+      templateUrl: 'html/directives/checkbox.html'
     };
   });
 
@@ -201,12 +201,12 @@
       transclude: true,
       template: '<span ng-click="click()"><ng-transclude/><span ng-show="sortType == sortBy" class="caret" ng-class="{\'caret-up\':sortReverse}"></span></span>',
       link: function($scope, $elem, $attrs) {
-        if(!$attrs.sortBy) {
+        if (!$attrs.sortBy) {
           console.log('no sort by key given');
           return;
         }
         var value = Store($scope.storeKey);
-        if(value) {
+        if (value) {
           value = value.split(',');
           $scope.sortType = value[0];
           $scope.sortReverse = value[1] === 'true';
@@ -227,17 +227,16 @@
         ngModel: '=',
         values: '='
       },
-      require: 'ngModel',
       template: '<span ng-bind-html="label" ng-click="next()"></span>',
-      link: function($scope, $elem, $attrs, $ctrl) {
+      link: function($scope) {
         var hasObjects = false;
-        if($scope.values && $scope.values.length)
+        if ($scope.values && $scope.values.length)
           hasObjects = angular.isObject($scope.values[0]);
 
         var index = function() {
-          if(hasObjects) {
-            for(var i = 0; i < $scope.values.length; i++) {
-              if($scope.values[i].value == $scope.ngModel)
+          if (hasObjects) {
+            for (var i = 0; i < $scope.values.length; i++) {
+              if ($scope.values[i].value == $scope.ngModel)
                 return i;
             }
             return 0;
@@ -247,8 +246,8 @@
         };
 
         var select = function(i) {
-          if(i < 0 || i >= $scope.values.length) return;
-          if(hasObjects) {
+          if (i < 0 || i >= $scope.values.length) return;
+          if (hasObjects) {
             $scope.ngModel = $scope.values[i].value;
             $scope.label = $scope.values[i].label;
           } else {
@@ -257,7 +256,7 @@
         };
 
         $scope.next = function() {
-          select((index() + 1) % $scope.values.length)
+          select((index() + 1) % $scope.values.length);
         };
 
         $scope.$watch('ngModel', function() {
@@ -267,4 +266,4 @@
     };
   });
 
-})();
\ No newline at end of file
+})();
diff --git a/vipra-ui/app/js/factories.js b/vipra-ui/app/js/factories.js
index a88b88b9..0e754c75 100644
--- a/vipra-ui/app/js/factories.js
+++ b/vipra-ui/app/js/factories.js
@@ -2,8 +2,11 @@
  * Vipra Application
  * Factories
  ******************************************************************************/
+/* globals angular, Vipra */
 (function() {
 
+  "use strict";
+
   var app = angular.module('vipra.factories', []);
 
   app.factory('ArticleFactory', ['$resource', function($resource) {
@@ -36,11 +39,11 @@
     return function(key, value) {
       key += '-' + $state.current.name;
       var lsSupport = false;
-      
+
       // Check for native support
       if (localStorage)
         lsSupport = true;
-      
+
       // If value is detected, set new or modify store
       if (typeof value !== "undefined" && value !== null) {
         // Convert object values to JSON
@@ -52,23 +55,24 @@
         else
           createCookie(key, value, 30);
       }
-      
+
       // No value supplied, return value
       if (typeof value === "undefined") {
+        var data;
         if (lsSupport)
           data = localStorage.getItem(key);
         else
           data = readCookie(key);
-        
+
         try {
           data = JSON.parse(data);
-        } catch(e) {
+        } catch (e) {
           data = data;
         }
-        
+
         return data;
       }
-      
+
       // Null specified, remove store
       if (value === null) {
         if (lsSupport)
@@ -76,7 +80,7 @@
         else
           createCookie(key, '', -1);
       }
-      
+
       // Creates new cookie or removes cookie with negative expiration
       function createCookie(key, value, exp) {
         var date = new Date();
@@ -84,7 +88,7 @@
         var expires = "; expires=" + date.toGMTString();
         document.cookie = key + "=" + value + expires + "; path=/";
       }
-      
+
       // Returns contents of cookie
       function readCookie(key) {
         var nameEQ = key + "=";
@@ -101,11 +105,11 @@
 
   app.service('WebSocketService', ['$websocket', '$state', function($websocket, $state) {
     var socket = $websocket(Vipra.config.websocketUrl),
-        callback = null;
+      callback = null;
 
     socket.onMessage(function(message) {
       var data = JSON.parse(message.data);
-      if(callback)
+      if (callback)
         callback(data);
     });
 
@@ -117,7 +121,7 @@
       callback = fn;
     };
 
-    this.send(1, {state: $state.current.name});
+    this.send(1, { state: $state.current.name });
   }]);
 
-})();
\ No newline at end of file
+})();
diff --git a/vipra-ui/app/js/filters.js b/vipra-ui/app/js/filters.js
index b4a1b8ae..ecf60ee7 100644
--- a/vipra-ui/app/js/filters.js
+++ b/vipra-ui/app/js/filters.js
@@ -2,8 +2,11 @@
  * Vipra Application
  * Filters
  ******************************************************************************/
+/* globals angular, Vipra */
 (function() {
 
+  "use strict";
+
   var app = angular.module('vipra.filters', []);
 
   app.filter('toPercent', function() {
@@ -18,4 +21,4 @@
     return Vipra.formatDateTime;
   });
 
-})();
\ No newline at end of file
+})();
diff --git a/vipra-ui/app/js/helpers.js b/vipra-ui/app/js/helpers.js
index 4bcc959e..b8362ea0 100644
--- a/vipra-ui/app/js/helpers.js
+++ b/vipra-ui/app/js/helpers.js
@@ -2,8 +2,11 @@
  * Vipra Application
  * Helpers & Polyfills
  ******************************************************************************/
+/* globals Vipra */
 (function() {
 
+  "use strict";
+
   window.Vipra = window.Vipra || {};
 
   /**
@@ -20,7 +23,7 @@
   };
 
   Vipra.toPercent = function(input) {
-    if(typeof input !== 'number')
+    if (typeof input !== 'number')
       input = parseInt(input, 10);
     return Math.round(input * 100);
   };
@@ -35,39 +38,39 @@
 
   Vipra.getErrors = function(errors) {
     var html = [];
-    if(errors && errors.length) {
-      for(var i = 0; i < errors.length; i++)
+    if (errors && errors.length) {
+      for (var i = 0; i < errors.length; i++)
         html.push('<strong>' + errors[i].title + '</strong>: ' + errors[i].detail);
     }
     return html.join('<br>');
-  }
+  };
 
   /**
    * Polyfills
    */
 
-  if(typeof String.prototype.ellipsize === 'undefined')
+  if (typeof String.prototype.ellipsize === 'undefined')
     String.prototype.ellipsize = function(max) {
       max = max || 20;
-      if(this.length > max) {
+      if (this.length > max) {
         return this.substring(0, max) + '...';
       }
       return this;
     };
 
-  if(typeof String.prototype.multiline === 'undefined')
+  if (typeof String.prototype.multiline === 'undefined')
     String.prototype.multiline = function(max) {
       return this.split(new RegExp("((?:\\w+ ){" + max + "})", "g")).filter(Boolean).join("\n");
     };
 
-  if(typeof String.prototype.startsWith === 'undefined')
+  if (typeof String.prototype.startsWith === 'undefined')
     String.prototype.startsWith = function(start) {
       return this.lastIndexOf(start, 0) === 0;
     };
 
-  if(typeof window.console === 'undefined')
+  if (typeof window.console === 'undefined')
     window.console = {
-      log: function () {}
+      log: function() {}
     };
 
-})();
\ No newline at end of file
+})();
-- 
GitLab