Merge branch 'master' of ssh://git.indexdata.com:222/home/git/pub/mkws
authorWolfram Schneider <wosch@indexdata.dk>
Mon, 20 Oct 2014 12:05:09 +0000 (14:05 +0200)
committerWolfram Schneider <wosch@indexdata.dk>
Mon, 20 Oct 2014 12:05:09 +0000 (14:05 +0200)
21 files changed:
examples/htdocs/mike.html
examples/htdocs/mike2.html
src/mkws-core.js
src/mkws-popup.js
src/mkws-team.js
src/mkws-widget-authname.js
src/mkws-widget-builder.js
src/mkws-widget-categories.js
src/mkws-widget-log.js
src/mkws-widget-main.js
src/mkws-widget-record.js
src/mkws-widget-reference.js
src/mkws-widget-termlists.js
src/mkws.templates/Progress.handlebars
src/mkws.templates/Search.handlebars
test/widgets/Makefile
test/widgets/url.demos [new file with mode: 0644]
test/widgets/url.koha [new file with mode: 0644]
test/widgets/url.mike [new file with mode: 0644]
test/widgets/url.txt [deleted file]
tools/htdocs/mkws.css

index 69a070a..d6f52d6 100644 (file)
@@ -7,7 +7,7 @@
         sp_auth_credentials: "mkwstest/mkwstest"
       }
     </script>
-    <link rel="stylesheet" type="text/css" href="//mkws.indexdata.com/mkws.css" />
+    <link rel="stylesheet" type="text/css" href="tools/htdocs/mkws.css" />
     <script type="text/javascript" src="tools/htdocs/jquery-1.10.0.min.js"></script>
     <script type="text/javascript" src="tools/htdocs/jquery.json-2.4.js"></script>
     <script type="text/javascript" src="tools/htdocs/handlebars-v2.0.0.js"></script>
index 21d95f9..99aa581 100644 (file)
@@ -7,7 +7,7 @@
         sp_auth_credentials: "mkwstest/mkwstest"
       }
     </script>
-    <link rel="stylesheet" type="text/css" href="//mkws.indexdata.com/mkws.css" />
+    <link rel="stylesheet" type="text/css" href="tools/htdocs/mkws.css" />
     <script type="text/javascript" src="tools/htdocs/jquery-1.10.0.min.js"></script>
     <script type="text/javascript" src="tools/htdocs/jquery.json-2.4.js"></script>
     <script type="text/javascript" src="tools/htdocs/handlebars-v2.0.0.js"></script>
@@ -28,7 +28,7 @@
     <script type="text/javascript" src="src/mkws-templates.js"></script>
   </head>
   <body>
-    <div class="mkws-authname"></div>
+    <div class="mkws-auth-name"></div>
     <div class="mkws-switch"></div>
     <div class="mkws-lang"></div>
     <div class="mkws-progress"></div>
index 3a4fa5b..56e7f28 100644 (file)
@@ -286,6 +286,23 @@ mkws.log("Using window.name '" + window.name + "'");
 // wrapper to provide local copy of the jQuery object.
 (function($) {
   var log = mkws.log;
+  var _old2new = { // Maps old-style widget names to new-style
+    'Authname': 'auth-name',
+    'ConsoleBuilder': 'console-builder',
+    'Coverart': 'cover-art',
+    'GoogleImage': 'google-image',
+    'MOTD': 'motd',
+    'MOTDContainer': 'motd-container',
+    'Perpage': 'per-page',
+    'SearchForm': 'search-form',
+  };
+  // Annoyingly, there is no built-in way to invert a hash
+  var _new2old = {};
+  for (var key in _old2new) {
+    if(_old2new.hasOwnProperty(key)) {
+      _new2old[_old2new[key]] = key;
+    }
+  }
 
   function handleNodeWithTeam(node, callback) {
     // First branch for DOM objects; second branch for jQuery objects
@@ -303,10 +320,19 @@ mkws.log("Using window.name '" + window.name + "'");
 
     for (var i = 0; i < list.length; i++) {
       var cname = list[i];
-      if (cname.match(/^mkwsTeam_/)) {
+      if (cname.match(/^mkws-team-/)) {
+        // New-style teamnames of the form mkws-team-xyz
+        teamName = cname.replace(/^mkws-team-/, '');
+      } else if (cname.match(/^mkwsTeam_/)) {
+        // Old-style teamnames of the form mkwsTeam_xyz
         teamName = cname.replace(/^mkwsTeam_/, '');
+      } else if (cname.match(/^mkws-/)) {
+        // New-style names of the from mkws-foo-bar
+        type = cname.replace(/^mkws-/, '');
       } else if (cname.match(/^mkws/)) {
-        type = cname.replace(/^mkws/, '');
+        // Old-style names of the form mkwsFooBar
+        var tmp = cname.replace(/^mkws/, '');
+        type = _old2new[tmp] || tmp.toLowerCase();
       }
     }
 
@@ -353,8 +379,8 @@ mkws.log("Using window.name '" + window.name + "'");
       for (var tname in mkws.teams) {
         var team = mkws.teams[tname];
         team.visitWidgets(function(t, w) {
-          var w1 = team.widget(t + "-Container-" + from);
-          var w2 = team.widget(t + "-Container-" + to);
+          var w1 = team.widget(t + "-container-" + from);
+          var w2 = team.widget(t + "-container-" + to);
           if (w1) {
             w1.node.hide();
           }
@@ -443,9 +469,14 @@ mkws.log("Using window.name '" + window.name + "'");
       var s = "";
       for (var type in mkws.widgetType2function) {
        if (s) s += ',';
-       s += '.mkws' + type;
-       s += ',.mkws' + type + "-Container-wide";
-       s += ',.mkws' + type + "-Container-narrow";
+       s += '.mkws-' + type;
+       s += ',.mkws-' + type + "-container-wide";
+       s += ',.mkws-' + type + "-container-narrow";
+        // Annoyingly, we also need to recognise old-style names
+        var oldtype = _new2old[type] || type.charAt(0).toUpperCase() + type.slice(1);
+       s += ',.mkws' + oldtype;
+       s += ',.mkws' + oldtype + "-Container-wide";
+       s += ',.mkws' + oldtype + "-Container-narrow";
       }
       return s;
     }
index 7496a07..97156c0 100644 (file)
@@ -4,7 +4,7 @@
 
 //"use strict";
 // $(document).ready(function () {
-mkws.registerWidgetType('Popup', function() {
+mkws.registerWidgetType('popup', function() {
     var $ = mkws.$;
     var debug = mkws.log;
     debug("init popup window");
index 0879add..2cc27c0 100644 (file)
@@ -340,10 +340,10 @@ mkws.makeTeam = function($, teamName) {
 
   // switching view between targets and records
   function switchView(view) {
-    var targets = widgetNode('Targets');
-    var results = widgetNode('Results') || widgetNode('Records');
-    var blanket = widgetNode('Blanket');
-    var motd    = widgetNode('MOTD');
+    var targets = widgetNode('targets');
+    var results = widgetNode('results') || widgetNode('records');
+    var blanket = widgetNode('blanket');
+    var motd    = widgetNode('motd');
 
     switch(view) {
     case 'targets':
index b1e0b1f..b96dad2 100644 (file)
@@ -1,4 +1,4 @@
-mkws.registerWidgetType('Authname', function() {
+mkws.registerWidgetType('auth-name', function() {
   var that = this;
 
   this.team.queue("authenticated").subscribe(function(authName) {
index 6468e86..aae9a81 100644 (file)
@@ -1,4 +1,4 @@
-mkws.registerWidgetType('Builder', function() {
+mkws.registerWidgetType('builder', function() {
   var that = this;
   var team = this.team;
 
@@ -8,9 +8,9 @@ mkws.registerWidgetType('Builder', function() {
   });
   this.node.append(button);
   button.click(function() {
-    var   query = team.widget('Query').value();
-    var    sort = team.widget('Sort').value();
-    var perpage = team.widget('Perpage').value();
+    var   query = team.widget('query').value();
+    var    sort = team.widget('sort').value();
+    var perpage = team.widget('per-page').value();
 
     var html = ('<div class="mkwsRecords" ' +
                 'autosearch="' + query + '" ' +
@@ -21,8 +21,8 @@ mkws.registerWidgetType('Builder', function() {
   });
 });
 
-mkws.registerWidgetType('ConsoleBuilder', function() {
-  mkws.promotionFunction('Builder').call(this);
+mkws.registerWidgetType('console-builder', function() {
+  mkws.promotionFunction('builder').call(this);
   this.callback = function(s) {
     console.log("generated widget: " + s);
   }
index 6982db8..90df81e 100644 (file)
@@ -1,4 +1,4 @@
-mkws.registerWidgetType('Categories', function() {
+mkws.registerWidgetType('categories', function() {
   var that = this;
 
   if (!mkws.authenticated) {
index 4ea6cd8..b520e35 100644 (file)
@@ -1,4 +1,4 @@
-mkws.registerWidgetType('Log', function() {
+mkws.registerWidgetType('log', function() {
   var that = this;
 
   this.team.queue("log").subscribe(function(teamName, timestamp, message) {
index e01675f..ef4b3c7 100644 (file)
@@ -5,7 +5,7 @@
 // source files.
 
 
-mkws.registerWidgetType('Targets', function() {
+mkws.registerWidgetType('targets', function() {
   if (!this.config.show_switch) return;
   var that = this;
 
@@ -33,7 +33,7 @@ mkws.registerWidgetType('Targets', function() {
 });
 
 
-mkws.registerWidgetType('Stat', function() {
+mkws.registerWidgetType('stat', function() {
   var that = this;
   this.team.queue("stat").subscribe(function(data) {
     var template = that.team.loadTemplate(that.config.template || "Stat");
@@ -42,7 +42,7 @@ mkws.registerWidgetType('Stat', function() {
 });
 
 
-mkws.registerWidgetType('Pager', function() {
+mkws.registerWidgetType('pager', function() {
   var that = this;
   var M = mkws.M;
 
@@ -88,7 +88,7 @@ mkws.registerWidgetType('Pager', function() {
   });
 });
 
-mkws.registerWidgetType('Details', function() {
+mkws.registerWidgetType('details', function() {
   var that = this;
   var recid = that.node.attr("data-mkws-recid");
   if (this.team.gotRecords()) { 
@@ -108,7 +108,7 @@ mkws.registerWidgetType('Details', function() {
   that.autosearch();
 });
 
-mkws.registerWidgetType('Records', function() {
+mkws.registerWidgetType('records', function() {
   var that = this;
   var team = this.team;
 
@@ -138,7 +138,7 @@ mkws.registerWidgetType('Records', function() {
 });
 
 
-mkws.registerWidgetType('Navi', function() {
+mkws.registerWidgetType('navi', function() {
   var that = this;
   var teamName = this.team.name();
 
@@ -171,7 +171,7 @@ mkws.registerWidgetType('Navi', function() {
 // It seems this and the Perpage widget doen't need to subscribe to
 // anything, since they produce events rather than consuming them.
 //
-mkws.registerWidgetType('Sort', function() {
+mkws.registerWidgetType('sort', function() {
   var that = this;
 
   this.node.change(function() {
@@ -184,7 +184,7 @@ mkws.registerWidgetType('Sort', function() {
 });
 
 
-mkws.registerWidgetType('Perpage', function() {
+mkws.registerWidgetType('per-page', function() {
   var that = this;
 
   this.node.change(function() {
@@ -197,7 +197,7 @@ mkws.registerWidgetType('Perpage', function() {
 });
 
 
-mkws.registerWidgetType('Done', function() {
+mkws.registerWidgetType('done', function() {
   var that = this;
   this.team.queue("complete").subscribe(function(n) {
     var template = that.team.loadTemplate(that.config.template || "Done");
@@ -206,7 +206,7 @@ mkws.registerWidgetType('Done', function() {
 });
 
 
-mkws.registerWidgetType('Switch', function() {
+mkws.registerWidgetType('switch', function() {
   if (!this.config.show_switch) return;
   var tname = this.team.name();
   var output = {};
@@ -218,7 +218,7 @@ mkws.registerWidgetType('Switch', function() {
 });
 
 
-mkws.registerWidgetType('Search', function() {
+mkws.registerWidgetType('search', function() {
   var output = {};
   output.team = this.team.name();
   output.queryWidth = this.config.query_width;
@@ -227,24 +227,24 @@ mkws.registerWidgetType('Search', function() {
 });
 
 
-mkws.registerWidgetType('SearchForm', function() {
+mkws.registerWidgetType('search-form', function() {
   var team = this.team;
   this.node.submit(function() {
-    var val = team.widget('Query').value();
+    var val = team.widget('query').value();
     team.newSearch(val);
     return false;
   });
 });
 
 
-mkws.registerWidgetType('Results', function() {
+mkws.registerWidgetType('results', function() {
   var template = this.team.loadTemplate(this.config.template || "Results");
   this.node.html(template({team: this.team.name()}));
   this.autosearch();
 });
 
 
-mkws.registerWidgetType('Ranking', function() {
+mkws.registerWidgetType('ranking', function() {
   var output = {};
   output.perPage = [];
   output.sort = [];
@@ -277,7 +277,7 @@ mkws.registerWidgetType('Ranking', function() {
 });
 
 
-mkws.registerWidgetType('Lang', function() {
+mkws.registerWidgetType('lang', function() {
   // dynamic URL or static page? /path/foo?query=test
   /* create locale language menu */
   if (!this.config.show_lang) return;
@@ -339,8 +339,8 @@ mkws.registerWidgetType('Lang', function() {
 });
 
 
-mkws.registerWidgetType('MOTD', function() {
-  var container = this.team.widget('MOTDContainer');
+mkws.registerWidgetType('motd', function() {
+  var container = this.team.widget('motd-container');
   if (container) {
     // Move the MOTD from the provided element down into the container
     this.node.appendTo(container.node);
@@ -352,7 +352,7 @@ mkws.registerWidgetType('MOTD', function() {
 // is copied up into its team, allowing it to affect other widgets in
 // the team.
 //
-mkws.registerWidgetType('Config', function() {
+mkws.registerWidgetType('config', function() {
   var c = this.config;
   for (var name in c) {
     if (c.hasOwnProperty(name)) {
@@ -363,7 +363,7 @@ mkws.registerWidgetType('Config', function() {
 });
 
 
-mkws.registerWidgetType('Progress', function() {
+mkws.registerWidgetType('progress', function() {
   var that = this;
   this.node.hide();
   this.team.queue("stat").subscribe(function(data) {
@@ -382,9 +382,9 @@ mkws.registerWidgetType('Progress', function() {
 // no actual functionality. We register these to prevent ignorable
 // warnings when they occur.
 
-mkws.registerWidgetType('Query', function() {});
-mkws.registerWidgetType('MOTDContainer', function() {});
-mkws.registerWidgetType('Button', function() {});
+mkws.registerWidgetType('query', function() {});
+mkws.registerWidgetType('motd-container', function() {});
+mkws.registerWidgetType('button', function() {});
 
 
 })(mkws.$); // jQuery wrapper
index 6623842..1d77e40 100644 (file)
@@ -1,5 +1,5 @@
 // A widget for one record
-mkws.registerWidgetType('Record', function() {
+mkws.registerWidgetType('record', function() {
   if (!this.config.maxrecs) this.config.maxrecs = 1;
   var that = this;
   var team = this.team;
@@ -11,22 +11,22 @@ mkws.registerWidgetType('Record', function() {
   that.autosearch();
 });
 
-mkws.registerWidgetType('Image', function() {
-  mkws.promotionFunction('Records').call(this);
+mkws.registerWidgetType('image', function() {
+  mkws.promotionFunction('records').call(this);
   if (!this.config.template) this.config.template = 'Image';
 });
 
-mkws.registerWidgetType('GoogleImage', function() {
-  mkws.promotionFunction('Image').call(this);
+mkws.registerWidgetType('google-image', function() {
+  mkws.promotionFunction('image').call(this);
   if (!this.config.target) this.config.target = 'Google_Images';
 });
 
-mkws.registerWidgetType('Lolcat', function() {
-  mkws.promotionFunction('GoogleImage').call(this);
+mkws.registerWidgetType('lolcat', function() {
+  mkws.promotionFunction('google-image').call(this);
   if (!this.config.autosearch) this.config.autosearch = 'kitteh';
 });
 
-mkws.registerWidgetType('Coverart', function() {
-  mkws.promotionFunction('Image').call(this);
+mkws.registerWidgetType('cover-art', function() {
+  mkws.promotionFunction('image').call(this);
   if (!this.config.target) this.config.target = 'AmazonBooks';
 });
index c8d41be..2993a60 100644 (file)
@@ -1,5 +1,5 @@
-mkws.registerWidgetType('Reference', function() {
-  mkws.promotionFunction('Record').call(this);
+mkws.registerWidgetType('reference', function() {
+  mkws.promotionFunction('record').call(this);
   if (!this.config.target) this.config.target = 'wikimedia_wikipedia_single_result';
   if (!this.config.template) this.config.template = 'Reference';
   this.config.template_vars.paragraphs = this.config.paragraphs || 0;
index 4052251..2e684f6 100644 (file)
@@ -1,4 +1,4 @@
-mkws.registerWidgetType('Termlists', function() {
+mkws.registerWidgetType('termlists', function() {
   // Initially hide the termlists; display when we get results
   var that = this;
   var team = this.team;
@@ -15,7 +15,7 @@ mkws.registerWidgetType('Termlists', function() {
 });
 
 
-mkws.registerWidgetType('Facet', function() {
+mkws.registerWidgetType('facet', function() {
   var facetConfig = {
     xtargets: [ "Sources",  16, false ],
     subject:  [ "Subjects", 10, true ],
index 1b08a2c..cb78cae 100644 (file)
@@ -4,8 +4,8 @@ Progress
 done - number of targets complete
 waiting - number of targets waiting
 }}
-<span class="mkwsDone">{{#mkws-repeat done}}&#x2588;{{/mkws-repeat}}</span>
+<span class="mkws-done mkwsDone">{{#mkws-repeat done}}&#x2588;{{/mkws-repeat}}</span>
 {{~#if waiting~}}
-<span class="mkwsWaiting">{{#mkws-repeat waiting}}&#x2588;{{/mkws-repeat}}</span>
+<span class="mkws-waiting mkwsWaiting">{{#mkws-repeat waiting}}&#x2588;{{/mkws-repeat}}</span>
 {{~/if~}}
 
index 5530013..182b852 100644 (file)
@@ -4,8 +4,8 @@ Search form
 team - MKWS team
 queryWidth - configured width for search box
 }}
-<form name="mkwsSearchForm" class="mkwsSearchForm mkwsTeam_{{team}}" action="">
-  <input class="mkwsQuery mkwsTeam_{{team}}" type="text" size="{{queryWidth}}">
-  <input class="mkwsButton mkwsTeam_{{team}}" type="submit" value="{{{mkws-translate "Search"}}}">
+<form name="mkws-search-form" class="mkws-search-form mkws-team-{{team}}" action="">
+  <input class="mkws-query mkwsQuery mkws-team-{{team}}" type="text" size="{{queryWidth}}">
+  <input class="mkws-button mkwsButton mkws-team-{{team}}" type="submit" value="{{{mkws-translate "Search"}}}">
 </form>
 
index 70a19c0..94ff158 100644 (file)
@@ -7,7 +7,9 @@ SCREENSHOT_WIDTH_HEIGHT=        1000 1200
 PERL_SCRIPTS=  ../bin/bomb.pl
 PROG=  ../phantom/screenshot.js
 MD5=   $(shell which md5 md5sum)
-TIMEOUT=5
+TESTS= koha demos mike # koha.url
+TIMEOUT=4
+PREFIX=        test
 
 PHANTOMJS_URL= http://cph.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi
 PHANTOMJS_URL= http://www.indexdata.com/
@@ -15,31 +17,40 @@ PHANTOMJS_URL=      http://www.indexdata.com/
 all: help
 
 clean:
-       rm -f mkws-error.png mkws-error.html 
-       rm -f ${IMAGES}/*.png ${IMAGES}/*.png.tmp
-       rm -f ${IMAGES}/index.html
+       rm -f index-*.html
+       rm -f ${IMAGES}/*.png
 
 distclean: clean
+       rm -f ${IMAGES}/*.png.tmp
 
 test: check
 
 screenshot:
-       file=$$(echo "${PHANTOMJS_URL}" | perl -npe 's,(\W),-,g'); \
+       file=${PREFIX}.$$(echo "${PHANTOMJS_URL}" | perl -npe 's,(\W),-,g; s/-$$//;'); \
          ${PHANTOMJS} ${PROG} ${PHANTOMJS_URL} ${IMAGES}/tmp.$$file.png ${SCREENSHOT_WIDTH_HEIGHT} ${TIMEOUT}; \
          mv -f  ${IMAGES}/tmp.$$file.png  ${IMAGES}/$$file.png
 
-screenshots: clean
-       for i in $$(cat url.txt); do \
-         ${MAKE} PHANTOMJS_URL="$$i" TIMEOUT=4 screenshot; \
-       done; wait
-       ${MAKE} index
+screenshots: clean estimate-time
+       for t in ${TESTS}; do \
+           for i in $$(cat url.$$t); do \
+               ${MAKE} PHANTOMJS_URL="$$i" TIMEOUT=4 PREFIX=$$t screenshot; \
+           done; \
+           ${MAKE} PREFIX=$$t index; \
+       done
+
+estimate-time:
+       @wc -l url.* | tail -n1 | awk '{print "Estimeate run time: " $$1 * (1 + '${TIMEOUT}'), "seconds" }'
+       @echo ""
 
 index:
-       cd ${IMAGES}; ls -tr *.png | perl -ne 'chomp; print qq{<h2>$$_</h2><img src="$$_"/><br/><br/><p/>\n}' > index.html
+       ( cd ${IMAGES}; ls -tr ${PREFIX}.*.png | perl -ne 'chomp; print qq{<h2>$$_</h2><img src="'${IMAGES}/'$$_"/><br/><br/><p/>\n}' ) > index-${PREFIX}.html
 
 help:
        @echo "make [ all | clean | distclean ]"
        @echo "     [ screenshots ]"
        @echo "     [ screenshot | index ]"
        @echo ""
+       @echo "Examples: "
+       @echo ""
+       @echo "make TESTS=mike screenshots"
 
diff --git a/test/widgets/url.demos b/test/widgets/url.demos
new file mode 100644 (file)
index 0000000..56db882
--- /dev/null
@@ -0,0 +1,5 @@
+http://example.indexdata.com/simple.html
+http://example.indexdata.com/minimal.html
+http://example.indexdata.com/language.html
+http://example.indexdata.com/mobile.html
+http://example.indexdata.com/lowlevel.html
diff --git a/test/widgets/url.koha b/test/widgets/url.koha
new file mode 100644 (file)
index 0000000..c5b8207
--- /dev/null
@@ -0,0 +1,7 @@
+http://cph.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi
+http://demo.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi
+http://demo.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi2
+http://boston.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi
+http://example.indexdata.com/topic.html?q=sushi
+http://example.indexdata.com/simple.html
+
diff --git a/test/widgets/url.mike b/test/widgets/url.mike
new file mode 100644 (file)
index 0000000..b865087
--- /dev/null
@@ -0,0 +1,2 @@
+http://zthes.z3950.org/
+http://sagp.miketaylor.org.uk/
diff --git a/test/widgets/url.txt b/test/widgets/url.txt
deleted file mode 100644 (file)
index c5b8207..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-http://cph.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi
-http://demo.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi
-http://demo.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi2
-http://boston.koha.indexdata.com/cgi-bin/koha/opac-search.pl?q=sushi
-http://example.indexdata.com/topic.html?q=sushi
-http://example.indexdata.com/simple.html
-
index cb5f2e7..db7bffa 100644 (file)
@@ -1,87 +1,87 @@
-.mkwsLang,
-.mkwsSwitch,
-.mkwsSearch,
-.mkwsTermlists,
-.mkwsFacet,
-.mkwsRanking,
-.mkwsPager,
-.mkwsNavi,
-.mkwsRecords,
-.mkwsRecord,
-.mkwsTargets,
-.mkwsStat,
-.mkwsMOTD {
+.mkwsLang, .mkws-lang,
+.mkwsSwitch, .mkws-switch,
+.mkwsSearch, .mkws-search,
+.mkwsTermlists, .mkws-termlists,
+.mkwsFacet, .mkws-facet,
+.mkwsRanking, .mkws-ranking,
+.mkwsPager, .mkws-pager,
+.mkwsNavi, .mkws-navi,
+.mkwsRecords, .mkws-records,
+.mkwsRecord, .mkws-record,
+.mkwsTargets, .mkws-targets,
+.mkwsStat, .mkws-stat,
+.mkwsMOTD, .mkws-motd {
     font-family: Gill Sans, "Gillius ADF", Gillius, GilliusADF, Verdana, Sans-Serif;
 }
 
-.mkwsLang {
+.mkwsLang, .mkws-lang {
     float: left;
     padding-left: 1em;
     padding-top: 0.4em;
 }
 
-.mkwsLang a {
+.mkwsLang a, .mkws-lang a {
     background: #d0e0ff;
     padding: 1px 4px;
 }
 
-.mkwsLang span {
+.mkwsLang span, .mkws-lang span {
     border: solid 1px #d0e0ff;
     padding: 0px 3px;
 }
 
-.mkwsSearch {
+.mkwsSearch, .mkws-search {
     float: right;
 }
 
-.mkwsSwitch {
+.mkwsSwitch, .mkws-switch {
     float: right;
     padding-left: 1em;
     padding-top: 0.4em;
 }
 
-.mkwsTargets {
+.mkwsTargets, .mkws-targets {
     background-color: #fafafa;
 }
 
-.mkwsStat {
+.mkwsStat, .mkws-stat {
     margin-top: 10px;
     border-top: 1px solid  #156a16;
     padding-top: 5px;
     font-size: small;
 }
 
-.mkwsStat:before {
+.mkwsStat:before, .mkws-stat:before {
     content: "Status info";
     font-weight: bold;
 }
 
-.mkwsSwitch a,
-.mkwsLang a,
-.mkwsFacet a,
-.mkwsRanking a,
-.mkwsPager a,
-.mkwsNavi a,
-.mkwsRecords a,
-.mkwsRecord a {
+.mkwsSwitch a, .mkws-switch a,
+.mkwsLang a, .mkws-lang a,
+.mkwsFacet a, .mkws-facet a,
+.mkwsRanking a, .mkws-ranking a,
+.mkwsPager a, .mkws-pager a,
+.mkwsNavi a, .mkws-navi a,
+.mkwsRecords a, .mkws-records a,
+.mkwsRecord a, .mkws-record a {
     color: #005701;
     text-decoration: none;
 }
 
-.mkwsSwitch a:hover,
-.mkwsLang a:hover,
-.mkwsFacet a:hover,
-.mkwsPager a:hover,
-.mkwsRecords a:hover,
-.mkwsRecord a:hover {
+.mkwsSwitch a:hover, .mkws-switch a:hover,
+.mkwsLang a:hover, .mkws-lang a:hover,
+.mkwsFacet a:hover, .mkws-facet a:hover,
+.mkwsPager a:hover, .mkws-pager a:hover,
+.mkwsRecords a:hover, .mkws-records a:hover,
+.mkwsRecord a:hover, .mkws-record a:hover {
     text-decoration: underline;
 }
 
-.mkwsNavi a.mkwsRemovable:hover {
+.mkwsNavi a.mkwsRemovable:hover, .mkws-navi a.mkws-removable:hover {
     text-decoration: line-through;
 }
 
-.mkwsSearch input.mkwsButton {
+.mkwsSearch input.mkwsButton, .mkws-search input.mkws-button {
     border: 3px outset #132194;
     background-color: #132194;
     padding: 2px;
     cursor: pointer;
 }
 
-.mkwsSearch input.mkwsQuery {
+.mkwsSearch input.mkwsQuery, .mkws-search input.mkws-query {
     border: 2px inset #e0f0ff;
     padding: 3px;
     font-size: 12px;
     background: #f0f8ff;
 }
 
-.mkwsTermlistsTitle {
+.mkwsTermlistsTitle, .mkws-termlists-title {
     font-size: large;
     font-weight: bold;
     text-transform: uppercase;
 }
 
-.mkwsTermlists {
+.mkwsTermlists, .mkws-termlists {
     background: #d0e0ff;
     padding: 0.7em;
     font-size: small;
     -webkit-border-top-right-radius: 10px;
 }
 
-.mkwsTermlists.active {
+.mkwsTermlists.active, .mkws-termlists.active {
     display: block;
 }
 
-.mkwsFacet {
+.mkwsFacet, .mkws-facet {
     background: #e0f0ff;
     padding: 0.7em;
     margin-top: 0.7em;
     -webkit-border-top-right-radius: 10px;
 }
 
-.mkwsTerm {
+.mkwsTerm, .mkws-term {
     clear: both;
 }
 
-.mkwsTerm span {
+.mkwsTerm span, .mkws-term span {
     float: right;
 }
 
-.mkwsFacetTitle {
+.mkwsFacetTitle, .mkws-facet-title {
     font-weight: bold;
 }
 
-.mkwsSummary {
+.mkwsSummary, .mkws-summary {
     padding: 5px;
 }
 
-.mkwsDetails {
+.mkwsDetails, .mkws-details {
     border: 1px solid #404040;
     background: #e8e8e8;
     color: black;
     -webkit-border-top-right-radius: 10px;
 }
 
-.mkwsDetails th {
+.mkwsDetails th, .mkws-details th {
     text-align: right;
     vertical-align: top;
     padding-right: 0.6em;
 }
 
-.mkwsDetails th:after {
+.mkwsDetails th:after, .mkws-details th:after {
     content: ":";
 }
 
-.mkwsPager {
+.mkwsPager, .mkws-pager {
     background: #e0e0e0;
     padding: 0.3em;
 }
 
-.mkwsTargets table thead tr td {
+.mkwsTargets table thead tr td, .mkws-targets table thead tr td {
     background-color: #132194;
     color: white;
     font-weight: bold;
     padding: 0.2em 0.5em;
 }
 
-.mkwsTargets table tbody tr:nth-child(odd) {
+.mkwsTargets table tbody tr:nth-child(odd), .mkws-targets table tbody tr:nth-child(odd) {
     background-color: #e0f0ff;
 }
 
-.mkwsTargets table tbody tr:nth-child(even) {
+.mkwsTargets table tbody tr:nth-child(even), .mkws-targets table tbody tr:nth-child(even) {
     background-color: #d0e0ff;
 }
 
-.mkwsTargets table tbody tr td {
+.mkwsTargets table tbody tr td, .mkws-targets table tbody tr td {
     padding: 0.2em 0.5em;
 }
 
-.mkwsCurrentPage {
+.mkwsCurrentPage, .mkws-current-page {
     padding: 0.1em 0.5em;
     background: #508751;
     color: white;
 }
 
-.mkwsProgress {
+.mkwsProgress, .mkws-progress {
     border: 1px solid #c0c0c0;
     float: left;
     margin-left: 2em;
     padding: 0 0.3em;
 }
 
-.mkwsProgress .mkwsDone { color: #005701 }
-.mkwsProgress .mkwsWaiting { color: #c0c0c0 }
+.mkwsProgress .mkwsDone, .mkws-progress .mkws-done { color: #005701 }
+.mkwsProgress .mkwsWaiting, .mkws-progress .mkws-waiting { color: #c0c0c0 }
 
-.mkwsResults table {
+.mkwsResults table, .mkws-results table {
   display: inline-table /* only for Firefox! */
 }