GUI: adding LoadingService module.

Change-Id: I73f479965416a2e48506854c6b4ea543e6a37ad5
diff --git a/web/gui/src/main/webapp/app/fw/layer/loading.js b/web/gui/src/main/webapp/app/fw/layer/loading.js
new file mode 100644
index 0000000..7691f09
--- /dev/null
+++ b/web/gui/src/main/webapp/app/fw/layer/loading.js
@@ -0,0 +1,86 @@
+/*
+ *  Copyright 2015 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.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Loading Service
+
+ Provides a mechanism to start/stop the loading animation, center screen.
+ */
+(function () {
+    'use strict';
+
+    // injected references
+    var $log, $timeout, ts;
+
+    // constants
+    var id = 'loading-anim',
+        dir = 'data/img/loading/',
+        pfx = '/load-',
+        speed = 100;
+
+    // internal state
+    var div,
+        img,
+        th,
+        idx,
+        task;
+
+    function fname(i) {
+        var z = i > 9 ? '' : '0';
+        return dir + th + pfx + z + i + '.png';
+    }
+
+    function nextFrame() {
+        idx = idx === 16 ? 1 : idx + 1;
+        img.attr('src', fname(idx));
+        task = $timeout(nextFrame, speed);
+    }
+
+    // start displaying 'loading...' animation (idempotent)
+    function start() {
+        th = ts.theme();
+        div = d3.select('#'+id);
+        if (div.empty()) {
+            div = d3.select('body').append('div').attr('id', id);
+            img = div.append('img').attr('src', fname(1));
+            idx = 1;
+            task = $timeout(nextFrame, speed);
+        }
+    }
+
+    // stop displaying 'loading...' animation (idempotent)
+    function stop() {
+        if (task) {
+            $timeout.cancel(task);
+            task = null;
+        }
+        d3.select('#'+id).remove();
+    }
+
+    angular.module('onosLayer')
+        .factory('LoadingService', ['$log', '$timeout', 'ThemeService',
+        function (_$log_, _$timeout_, _ts_) {
+            $log = _$log_;
+            $timeout = _$timeout_;
+            ts = _ts_;
+
+            return {
+                start: start,
+                stop: stop
+            };
+        }]);
+
+}());
\ No newline at end of file