ONOS-3747: Delayed start refactored into LoadingService.

Change-Id: I07d3c3ffdfe6b207aa21e7b9e470b037a3cffb9b
diff --git a/web/gui/src/main/webapp/app/fw/layer/loading.js b/web/gui/src/main/webapp/app/fw/layer/loading.js
index 7691f09..81bdaf4 100644
--- a/web/gui/src/main/webapp/app/fw/layer/loading.js
+++ b/web/gui/src/main/webapp/app/fw/layer/loading.js
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2015 Open Networking Laboratory
+ *  Copyright 2015,2016 Open Networking Laboratory
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -29,14 +29,16 @@
     var id = 'loading-anim',
         dir = 'data/img/loading/',
         pfx = '/load-',
-        speed = 100;
+        speed = 100,
+        waitDelay = 500;
 
     // internal state
     var div,
         img,
         th,
         idx,
-        task;
+        task,
+        wait;
 
     function fname(i) {
         var z = i > 9 ? '' : '0';
@@ -50,7 +52,7 @@
     }
 
     // start displaying 'loading...' animation (idempotent)
-    function start() {
+    function startAnim() {
         th = ts.theme();
         div = d3.select('#'+id);
         if (div.empty()) {
@@ -62,7 +64,7 @@
     }
 
     // stop displaying 'loading...' animation (idempotent)
-    function stop() {
+    function stopAnim() {
         if (task) {
             $timeout.cancel(task);
             task = null;
@@ -70,6 +72,25 @@
         d3.select('#'+id).remove();
     }
 
+    // schedule function to start animation in the future
+    function start() {
+        wait = $timeout(startAnim, waitDelay);
+    }
+
+    // cancel future start, if any; stop the animation
+    function stop() {
+        if (wait) {
+            $timeout.cancel(wait);
+            wait = null;
+        }
+        stopAnim();
+    }
+
+    // return true if start() has been called but not stop()
+    function waiting() {
+        return !!wait;
+    }
+
     angular.module('onosLayer')
         .factory('LoadingService', ['$log', '$timeout', 'ThemeService',
         function (_$log_, _$timeout_, _ts_) {
@@ -79,7 +100,8 @@
 
             return {
                 start: start,
-                stop: stop
+                stop: stop,
+                waiting: waiting
             };
         }]);
 
diff --git a/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js b/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js
index c7e585e..2d8a510 100644
--- a/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js
+++ b/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2015,2016 Open Networking Laboratory
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,8 +24,7 @@
     var $log, $interval, $timeout, fs, wss, ls;
 
     // constants
-    var refreshInterval = 2000,
-        tardyWait = 500;
+    var refreshInterval = 2000;
 
     // example params to buildTable:
     // {
@@ -49,8 +48,7 @@
             onResp = fs.isF(o.respCb),
             idKey = o.idKey || 'id',
             oldTableData = [],
-            refreshPromise,
-            tardyPromise;
+            refreshPromise;
 
         o.scope.tableData = [];
         o.scope.changedData = [];
@@ -61,7 +59,6 @@
         // === websocket functions --------------------
         // response
         function respCb(data) {
-            cancelTardy();
             ls.stop();
             o.scope.tableData = data[root];
             o.scope.annots = data.annots;
@@ -85,24 +82,12 @@
         handlers[resp] = respCb;
         wss.bindHandlers(handlers);
 
-        // handle "loading..." animation
-        function scheduleTardy() {
-            tardyPromise = $timeout(ls.start, tardyWait);
-        }
-
-        function cancelTardy() {
-            if (tardyPromise) {
-                $timeout.cancel(tardyPromise);
-                tardyPromise = null;
-            }
-        }
-
         // request
         function sortCb(params) {
             var p = angular.extend({}, params, o.query);
             if (wss.isConnected()) {
                 wss.sendEvent(req, p);
-                scheduleTardy();
+                ls.start();
             }
         }
         o.scope.sortCallback = sortCb;
@@ -118,7 +103,7 @@
 
         // === autoRefresh functions ------------------
         function fetchDataIfNotWaiting() {
-            if (!tardyPromise) {
+            if (!ls.waiting()) {
                 if (fs.debugOn('widget')) {
                     $log.debug('Refreshing ' + root + ' page');
                 }
@@ -147,7 +132,7 @@
         o.scope.$on('$destroy', function () {
             wss.unbindHandlers(handlers);
             stopRefresh();
-            cancelTardy();
+            ls.stop();
         });
 
         sortCb(o.scope.sortParams);