First attempt to create a panel based windows system

Change-Id: I2b6fb4cb147518d661dbccb3bd5f8e093b63bf55
diff --git a/dev/js/src/panel.js b/dev/js/src/panel.js
new file mode 100644
index 0000000..5aa96ad
--- /dev/null
+++ b/dev/js/src/panel.js
@@ -0,0 +1,95 @@
+/**
+ * Create a panel for a certain aspect of the system, like
+ * the result, a match, or the VC.
+ */
+define(['buttongroup', 'util'], function (buttonGroupClass) {
+
+  return {
+
+    // TODO:
+    //   Support classes
+    create : function () {
+      return Object.create(this)._init();
+    },
+
+    _init : function () {
+      // ...
+      this.views = [];
+
+      
+      /**
+       * Main action buttons for the panel,
+       * may be at the bottom (for matches)
+       * or as tabs (for the result).
+       */
+      this.actions = buttonGroupClass.create(['action', 'panel']);
+      return this;
+    },
+
+    /**
+     * The element of the panel
+     */
+    element : function () {
+      if (this._element)
+        return this._element;
+
+      // Create panel element
+      var e = document.createElement('div');
+      e.classList.add('panel');
+
+      e.appendChild(this.actions.element());
+
+      this._element = e;
+      return e;
+    },
+
+
+    /**
+     * Add a view to the panel
+     */
+    add : function (view) {
+
+      // Add view to views list
+      this.views.push(view);
+
+      // Append element to panel element
+
+      this.element().appendChild(
+        view.element()
+      );
+
+      view.panel = this;
+    },
+
+    /**
+     * Delete a closed view from panel
+     */
+    delView : function (view) {
+      for (i in this.views) {
+        if (this.views[i] === view) {
+          this.views[i] = undefined;
+        }
+      }
+    },
+
+    /**
+     * Elements before the action buttons
+     */
+    beforeActions : function (element) {
+      if (arguments.length > 0)
+        this._beforeActions = element;
+
+      return this._beforeActions;
+    },
+
+    /**
+     * Element after the action buttons
+     */
+    afterActions : function (element) {
+      if (arguments.length > 0)
+        this._afterActions = element;
+
+      return this._afterActions;
+    }
+  }
+});