Merge "Simplified plugin registration and improved registration checks"
diff --git a/dev/demo/plugin-server.html b/dev/demo/plugin-server.html
index d91b9e2..15a69d2 100644
--- a/dev/demo/plugin-server.html
+++ b/dev/demo/plugin-server.html
@@ -15,7 +15,7 @@
       <div id="search">
         <ol>
           <li class="active">
-            <div id="container"></div>
+            <div id="match"></div>
             <div id="buttons"></div>
           </li>
         </ol>
diff --git a/dev/demo/plugin-serverdemo.js b/dev/demo/plugin-serverdemo.js
index a6ba4a2..92c4611 100644
--- a/dev/demo/plugin-serverdemo.js
+++ b/dev/demo/plugin-serverdemo.js
@@ -15,12 +15,11 @@
       'desc' : 'Some content about cats',
       // 'about' : 'https://localhost:5678/',
       'embed' : [{
-        'buttonGroup' : 'match',
+        'panel' : 'match',
         'title' : 'Translate',
         'classes' : ['translate'],
         'onClick' : {
           'action' : 'addWidget',
-          'panel' : 'container',
           'template' : 'http://localhost:3003/demo/plugin-client.html',
         }
       }]
diff --git a/dev/js/spec/pluginSpec.js b/dev/js/spec/pluginSpec.js
index 62aa3c7..50c4982 100644
--- a/dev/js/spec/pluginSpec.js
+++ b/dev/js/spec/pluginSpec.js
@@ -17,6 +17,31 @@
       expect(div.firstChild.firstChild.tagName).toEqual("IFRAME");
       manager.destroy();
     });
+
+    it('should fail on invalid registries', function () {
+      var manager = pluginServerClass.create();
+
+      expect(
+	      function() { manager.register({}) }
+      ).toThrow(new Error("Missing name of plugin"));
+
+      expect(
+	      function() { manager.register({
+          name : 'Example',
+          embed : ''
+        })}
+      ).toThrow(new Error("Embedding of plugin is no list"));
+
+      expect(
+	      function() { manager.register({
+          name : 'Example',
+          embed : [{
+            panel : ''
+          }]
+        })}
+      ).toThrow(new Error("Panel for plugin is invalid"));
+
+    });
   });
 
   describe('KorAP.Plugin.Widget', function () {
diff --git a/dev/js/src/plugin/server.js b/dev/js/src/plugin/server.js
index 6689529..c8df357 100644
--- a/dev/js/src/plugin/server.js
+++ b/dev/js/src/plugin/server.js
@@ -15,10 +15,17 @@
   // messages to them
   var widgets = {};
   var plugins = {};
+
+  // TODO:
+  //   These should better be panels and every panel
+  //   has a buttonGroup
   var buttons = {
     match : []
   };
-
+  var panels = {
+    match : 1
+  };
+  
   // This is a counter to limit acceptable incoming messages
   // to a certain amount. For every message, this counter will
   // be decreased (down to 0), for every second this will be
@@ -52,39 +59,34 @@
      * Register a plugin described as a JSON object.
      *
      * This is work in progress.
+     *
+     * Example:
+     *
+     *   KorAP.Plugin.register({
+     *     'name' : 'CatContent',
+     *     'desc' : 'Some content about cats',
+     *     'about' : 'https://localhost:5678/',
+     *     'embed' : [{
+     *       'panel' : 'match',
+     *       'title' : loc.TRANSLATE,
+     *       'classes' : ['translate']
+     *       'onClick' : {
+     *         'action' : 'addWidget',
+     *         'template' : 'https://localhost:5678/?match={matchid}',
+     *       }
+     *     }]
+     *   });
+     *
      */
     register : function (obj) {
-
-      /* Example:
-
-         KorAP.Plugin.register({
-           'name' : 'CatContent',
-           'desc' : 'Some content about cats',
-           'about' : 'https://localhost:5678/',
-           'embed' : [{
-             'buttonGroup' : 'match',
-             'title' : loc.TRANSLATE,
-             'classes' : ['translate']
-             'onClick' : {
-               'action' : 'addWidget',
-               'panel' : 'match',
-               'template' : 'https://localhost:5678/?match={matchid}',
-             }
-           }]
-         });
-      */
-
       // TODO:
-      //   These fields need to be localized by a structure like
-      //   {
-      //     de : {
-      //       name : '..'
-      //     }
-      //     en : ...
-      //   }
-      // for display
+      //   These fields need to be localized for display by a structure like
+      //   { de : { name : '..' }, en : { .. } }
       var name = obj["name"];
 
+      if (!name)
+        throw new Error("Missing name of plugin");
+
       // Register plugin by name
       var plugin = plugins[name] = {
         name : name,
@@ -92,20 +94,31 @@
         about : obj["about"],
         widgets : []
       };
+
+      if (typeof obj["embed"] !== 'object')
+        throw new Error("Embedding of plugin is no list");
  
       // Embed all embeddings of the plugin
       for (var i in obj["embed"]) {
         var embed = obj["embed"][i];
-        var addTo = embed["buttonGroup"];
+
+        if (typeof embed !== 'object')
+          throw new Error("Embedding of plugin is no object");
+
+        var panel = embed["panel"];
+
+        if (!panel || !buttons[panel])
+          throw new Error("Panel for plugin is invalid");
+
         var onClick = embed["onClick"];
 
         // Needs to be localized as well
         var title = embed["title"];
 
         // The embedding will open a widget
-        if (onClick["action"] == "addWidget") {
+        if (!onClick["action"] || onClick["action"] == "addWidget") {
 
-          var panel = onClick["panel"];
+          var panel = document.getElementById(panel);
           var that = this;
           var cb = function (e) {
 
@@ -113,11 +126,11 @@
             var url = onClick["template"]; // that._interpolateURI(onClick["template"], this.match);
 
             // Add the widget to the panel
-            var id = that.addWidget(document.getElementById(panel), name, url);
+            var id = that.addWidget(panel, name, url);
             plugin["widgets"].push(id);
           };
 
-          buttons["match"].push([title, embed["classes"], cb]);
+          buttons[pannel].push([title, embed["classes"], cb]);
         };
       };
     },