diff --git a/build.gradle b/build.gradle
index b0b32bde..59d0630c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,7 +14,7 @@ allprojects {
}
}
-subprojects {
+subprojects {
apply plugin: 'java-library'
dependencies {
diff --git a/hal-core/resource/resource/web/js/bootstrap-colorpicker.LICENSE b/hal-core/resource/resource/web/js/lib/bootstrap-colorpicker.LICENSE
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap-colorpicker.LICENSE
rename to hal-core/resource/resource/web/js/lib/bootstrap-colorpicker.LICENSE
diff --git a/hal-core/resource/resource/web/js/bootstrap-colorpicker.js b/hal-core/resource/resource/web/js/lib/bootstrap-colorpicker.js
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap-colorpicker.js
rename to hal-core/resource/resource/web/js/lib/bootstrap-colorpicker.js
diff --git a/hal-core/resource/resource/web/js/bootstrap-colorpicker.min.js b/hal-core/resource/resource/web/js/lib/bootstrap-colorpicker.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap-colorpicker.min.js
rename to hal-core/resource/resource/web/js/lib/bootstrap-colorpicker.min.js
diff --git a/hal-core/resource/resource/web/js/bootstrap-switch.LICENSE b/hal-core/resource/resource/web/js/lib/bootstrap-switch.LICENSE
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap-switch.LICENSE
rename to hal-core/resource/resource/web/js/lib/bootstrap-switch.LICENSE
diff --git a/hal-core/resource/resource/web/js/bootstrap-switch.js b/hal-core/resource/resource/web/js/lib/bootstrap-switch.js
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap-switch.js
rename to hal-core/resource/resource/web/js/lib/bootstrap-switch.js
diff --git a/hal-core/resource/resource/web/js/bootstrap-switch.min.js b/hal-core/resource/resource/web/js/lib/bootstrap-switch.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap-switch.min.js
rename to hal-core/resource/resource/web/js/lib/bootstrap-switch.min.js
diff --git a/hal-core/resource/resource/web/js/bootstrap.js b/hal-core/resource/resource/web/js/lib/bootstrap.js
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap.js
rename to hal-core/resource/resource/web/js/lib/bootstrap.js
diff --git a/hal-core/resource/resource/web/js/bootstrap.min.js b/hal-core/resource/resource/web/js/lib/bootstrap.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/bootstrap.min.js
rename to hal-core/resource/resource/web/js/lib/bootstrap.min.js
diff --git a/hal-core/resource/resource/web/js/c3.LICENSE b/hal-core/resource/resource/web/js/lib/c3.LICENSE
similarity index 100%
rename from hal-core/resource/resource/web/js/c3.LICENSE
rename to hal-core/resource/resource/web/js/lib/c3.LICENSE
diff --git a/hal-core/resource/resource/web/js/c3.js b/hal-core/resource/resource/web/js/lib/c3.js
similarity index 100%
rename from hal-core/resource/resource/web/js/c3.js
rename to hal-core/resource/resource/web/js/lib/c3.js
diff --git a/hal-core/resource/resource/web/js/c3.min.js b/hal-core/resource/resource/web/js/lib/c3.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/c3.min.js
rename to hal-core/resource/resource/web/js/lib/c3.min.js
diff --git a/hal-core/resource/resource/web/js/d3.LICENSE b/hal-core/resource/resource/web/js/lib/d3.LICENSE
similarity index 100%
rename from hal-core/resource/resource/web/js/d3.LICENSE
rename to hal-core/resource/resource/web/js/lib/d3.LICENSE
diff --git a/hal-core/resource/resource/web/js/d3.js b/hal-core/resource/resource/web/js/lib/d3.js
similarity index 100%
rename from hal-core/resource/resource/web/js/d3.js
rename to hal-core/resource/resource/web/js/lib/d3.js
diff --git a/hal-core/resource/resource/web/js/jquery-1.11.3.min.js b/hal-core/resource/resource/web/js/lib/jquery-1.11.3.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/jquery-1.11.3.min.js
rename to hal-core/resource/resource/web/js/lib/jquery-1.11.3.min.js
diff --git a/hal-core/resource/resource/web/js/jquery.filer.js b/hal-core/resource/resource/web/js/lib/jquery.filer.js
similarity index 100%
rename from hal-core/resource/resource/web/js/jquery.filer.js
rename to hal-core/resource/resource/web/js/lib/jquery.filer.js
diff --git a/hal-core/resource/resource/web/js/jquery.filer.min.js b/hal-core/resource/resource/web/js/lib/jquery.filer.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/jquery.filer.min.js
rename to hal-core/resource/resource/web/js/lib/jquery.filer.min.js
diff --git a/hal-core/resource/resource/web/js/moment.LICENSE.txt b/hal-core/resource/resource/web/js/lib/moment.LICENSE.txt
similarity index 100%
rename from hal-core/resource/resource/web/js/moment.LICENSE.txt
rename to hal-core/resource/resource/web/js/lib/moment.LICENSE.txt
diff --git a/hal-core/resource/resource/web/js/moment.js b/hal-core/resource/resource/web/js/lib/moment.js
similarity index 100%
rename from hal-core/resource/resource/web/js/moment.js
rename to hal-core/resource/resource/web/js/lib/moment.js
diff --git a/hal-core/resource/resource/web/js/svg.LICENSE b/hal-core/resource/resource/web/js/lib/svg.LICENSE
similarity index 100%
rename from hal-core/resource/resource/web/js/svg.LICENSE
rename to hal-core/resource/resource/web/js/lib/svg.LICENSE
diff --git a/hal-core/resource/resource/web/js/svg.draggable.LICENSE.txt b/hal-core/resource/resource/web/js/lib/svg.draggable.LICENSE.txt
similarity index 100%
rename from hal-core/resource/resource/web/js/svg.draggable.LICENSE.txt
rename to hal-core/resource/resource/web/js/lib/svg.draggable.LICENSE.txt
diff --git a/hal-core/resource/resource/web/js/svg.draggable.js b/hal-core/resource/resource/web/js/lib/svg.draggable.js
similarity index 100%
rename from hal-core/resource/resource/web/js/svg.draggable.js
rename to hal-core/resource/resource/web/js/lib/svg.draggable.js
diff --git a/hal-core/resource/resource/web/js/svg.draggable.min.js b/hal-core/resource/resource/web/js/lib/svg.draggable.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/svg.draggable.min.js
rename to hal-core/resource/resource/web/js/lib/svg.draggable.min.js
diff --git a/hal-core/resource/resource/web/js/svg.js b/hal-core/resource/resource/web/js/lib/svg.js
similarity index 100%
rename from hal-core/resource/resource/web/js/svg.js
rename to hal-core/resource/resource/web/js/lib/svg.js
diff --git a/hal-core/resource/resource/web/js/svg.min.js b/hal-core/resource/resource/web/js/lib/svg.min.js
similarity index 100%
rename from hal-core/resource/resource/web/js/svg.min.js
rename to hal-core/resource/resource/web/js/lib/svg.min.js
diff --git a/hal-core/resource/resource/web/js/svg.title.js b/hal-core/resource/resource/web/js/lib/svg.title.js
similarity index 100%
rename from hal-core/resource/resource/web/js/svg.title.js
rename to hal-core/resource/resource/web/js/lib/svg.title.js
diff --git a/hal-core/resource/resource/web/js/map.js b/hal-core/resource/resource/web/js/map.js
new file mode 100644
index 00000000..c970ad76
--- /dev/null
+++ b/hal-core/resource/resource/web/js/map.js
@@ -0,0 +1,188 @@
+var svg;
+var editModeEnabled = false;
+
+$(function(){
+ if (!SVG.supported) {
+ alert("Image format(SVG) not supported by your browser.");
+ return;
+ }
+
+ // ------------------------------------------
+ // Setup map
+ // ------------------------------------------
+
+ svg = SVG("map");
+
+ // Initialize events
+
+ $("#button-edit").click(function() {
+ editMode(true);
+ });
+ $("#button-save").click(function() {
+ saveMap();
+ editMode(false);
+ drawMap();
+ });
+ $("#button-cancel").click(function() {
+ editMode(false);
+ drawMap();
+ });
+
+ // Initialize background image uploader
+
+ $("#button-bg-edit").click(function() {
+ // Reset modal
+ $('#bg-file-input').parent().show();
+ if ($("#file_input").prop("jFiler") != null)
+ $("#file_input").prop("jFiler").reset();
+ $('#bg-file-progress').parent().hide();
+ $('#bgUploadModal').modal('show');
+ });
+ $('#bg-file-input').filer({
+ limit: 1,
+ extensions: ['jpg','png','svg','gif'],
+ maxSize: 3, // in MB
+ uploadFile: {
+ url: "",
+ type: 'POST',
+ enctype: 'multipart/form-data',
+ beforeSend: function(){
+ $('#bg-file-input').parent().hide();
+ $('#bg-file-progress').parent().show();
+ },
+ success: function(data, el){
+ $('#bgUploadModal').modal('hide');
+ drawMap();
+ },
+ error: function(el){
+ $("#bg-file-progress").addClass("progress-bar-danger");
+ },
+ onProgress: function(t){
+ $("#bg-file-progress").css("width", t+"%");
+ },
+ }
+ });
+
+ // ------------------------------------------
+ // Start draw loop
+ // ------------------------------------------
+
+ setInterval(function() {
+ if (editModeEnabled == false)
+ drawMap();
+ }, 3000); // 3 sec
+
+});
+
+
+function editMode(enable){
+ if (editModeEnabled == enable)
+ return;
+ editModeEnabled = enable;
+ if (editModeEnabled){
+ $(".edit-mode").show();
+ $(".view-mode").hide();
+ $("#map").css("border-color", "#6eb16e");
+ svg.select(".draggable").draggable(true);
+ }
+ else {
+ $(".edit-mode").hide();
+ $(".view-mode").show();
+ $("#map").css("border-color", "");
+ svg.select(".draggable").draggable(false);
+ }
+}
+
+function drawMap(){
+ // Get map data
+ $.getJSON("/api/map?action=getdata", function(json){
+ // Reset map
+ svg.clear();
+
+ // --------------------------------------
+ // Draw
+ // --------------------------------------
+
+ // Background
+
+ svg.image("?bgimage", "100%", "100%").x(0).y(0).addClass("bg-image");
+
+ // Rooms
+
+ if (json.rooms != null) {
+ $.each(json.rooms, function(i, room) {
+ var group = svg.group();
+
+ group.rect(room.width, room.height);
+ group.text(room.name).move(10, 10).fill('#999');
+
+ group.addClass("draggable").addClass("room")
+ .x(room.x)
+ .y(room.y)
+ .attr("room-id", room.id);
+ });
+ }
+
+ // Sensors
+
+ if (json.sensors != null) {
+ $.each(json.sensors, function(i, sensor) {
+ var group = svg.group();
+
+ group.image("/img/temperature.svg");
+ group.text(sensor.data).move(45, 15).fill('#999');
+
+ group.addClass("draggable").addClass("sensor")
+ .x(sensor.x)
+ .y(sensor.y)
+ .attr("sensor-id", sensor.id);
+ group.title(sensor.name);
+ });
+ }
+
+ // Events
+
+ if (json.event != null) {
+ $.each(json.events, function(i, event) {
+ var group = svg.group();
+
+ var img = "/img/lightbulb_off.svg";
+ if (event.data == "ON")
+ img = "/img/lightbulb_on.svg";
+ group.image(img);
+
+ group.addClass("draggable").addClass("event")
+ .x(event.x)
+ .y(event.y)
+ .attr("event-id", event.id);
+ group.title(event.name);
+ });
+ }
+ });
+}
+
+function saveMap(){
+ svg.select(".room").each(function(){
+ saveDevice(this, "room", "room-id");
+ });
+ svg.select(".sensor").each(function(){
+ saveDevice(this, "sensor", "sensor-id");
+ });
+ svg.select(".event").each(function(){
+ saveDevice(this, "event", "event-id");
+ });
+}
+function saveDevice(element, type, id){
+ $.ajax({
+ async: false,
+ dataType: "json",
+ url: "/api/map?",
+ data: {
+ action: "save",
+ id: element.attr(id),
+ type: type,
+ x: element.x(),
+ y: element.y()
+ },
+ });
+}
\ No newline at end of file
diff --git a/hal-core/resource/resource/web/main_index.tmpl b/hal-core/resource/resource/web/main_index.tmpl
index 7a52dc13..a2737b52 100644
--- a/hal-core/resource/resource/web/main_index.tmpl
+++ b/hal-core/resource/resource/web/main_index.tmpl
@@ -14,15 +14,15 @@
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/hal-core/resource/resource/web/map.tmpl b/hal-core/resource/resource/web/map.tmpl
index d60ff8bd..401501a2 100644
--- a/hal-core/resource/resource/web/map.tmpl
+++ b/hal-core/resource/resource/web/map.tmpl
@@ -42,158 +42,12 @@
-
-
-
-
+
+
+
+
-
+
diff --git a/plugins/hal-nvr/resource/resource/web/camera_detail.tmpl b/plugins/hal-nvr/resource/resource/web/camera_detail.tmpl
index 40405117..fa92c54e 100644
--- a/plugins/hal-nvr/resource/resource/web/camera_detail.tmpl
+++ b/plugins/hal-nvr/resource/resource/web/camera_detail.tmpl
@@ -52,5 +52,5 @@
-
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/plugins/hal-nvr/resource/resource/web/camera_monitor.tmpl b/plugins/hal-nvr/resource/resource/web/camera_monitor.tmpl
index a1a6e2e4..6fd717d3 100644
--- a/plugins/hal-nvr/resource/resource/web/camera_monitor.tmpl
+++ b/plugins/hal-nvr/resource/resource/web/camera_monitor.tmpl
@@ -39,6 +39,6 @@
-
-
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/plugins/hal-nvr/resource/resource/web/js/video.min.js b/plugins/hal-nvr/resource/resource/web/js/lib/video.min.js
similarity index 100%
rename from plugins/hal-nvr/resource/resource/web/js/video.min.js
rename to plugins/hal-nvr/resource/resource/web/js/lib/video.min.js
diff --git a/plugins/hal-nvr/resource/resource/web/js/videojs-http-streaming.min.js b/plugins/hal-nvr/resource/resource/web/js/lib/videojs-http-streaming.min.js
similarity index 100%
rename from plugins/hal-nvr/resource/resource/web/js/videojs-http-streaming.min.js
rename to plugins/hal-nvr/resource/resource/web/js/lib/videojs-http-streaming.min.js