Add new "Ranking" widget.
[mkws-moved-to-github.git] / src / mkws-widgets.js
index 087ce89..80fe222 100644 (file)
@@ -22,6 +22,10 @@ function widget($, team, type, node) {
        return '[Widget ' + team.name() + ':' + type + ']';
     };
 
+    that.value = function() {
+        return node.value;
+    }
+
     for (var i = 0; i < node.attributes.length; i++) {
        var a = node.attributes[i];
        if (a.name === 'data-mkws-config') {
@@ -79,6 +83,13 @@ widget.autosearch = function(widget) {
                if (!query) {
                    alert("This page has a MasterKey widget that needs a query specified by the path-component " + index);
                }
+            } else if (query.match(/^!var!/)) {
+               var name = query.replace(/^!var!/, '');
+               query = window[name]; // It's ridiculous that this works
+               widget.log("obtained query '" + query + "' from variable '" + name + "'");
+               if (!query) {
+                   alert("This page has a MasterKey widget that needs a query specified by the '" + name + "' variable");
+               }
            }
 
            var sortOrder = widget.config.sort;
@@ -114,6 +125,12 @@ mkws.registerWidgetType('Targets', function() {
     var that = this;
     var M = mkws.M;
 
+    $(this.node).html('\
+<div class="mkwsBytarget mkwsTeam_' + this.team.name() + '">\
+No information available yet.\
+</div>');
+    $(this.node).css("display", "none");
+
     this.team.queue("targets").subscribe(function(data) {
        var table ='<table><thead><tr>' +
            '<td>' + M('Target ID') + '</td>' +
@@ -190,7 +207,7 @@ mkws.registerWidgetType('Pager', function() {
            for(var i = firstClkbl; i <= lastClkbl; i++) {
                var numLabel = i;
                if(i == currentPage)
-                   numLabel = '<b>' + i + '</b>';
+                   numLabel = '<span class="mkwsSelected">' + i + '</span>';
 
                middle += '<a href="#" onclick="mkws.showPage(\'' + teamName + '\', ' + i + ')"> '
                    + numLabel + ' </a>';
@@ -218,6 +235,13 @@ mkws.registerWidgetType('Pager', function() {
 });
 
 
+mkws.registerWidgetType('Results', function() {
+    // Nothing to do apart from act as an autosearch trigger
+    // Contained elements do all the real work
+    widget.autosearch(this);
+});
+
+
 mkws.registerWidgetType('Records', function() {
     var that = this;
     var team = this.team;
@@ -226,6 +250,7 @@ mkws.registerWidgetType('Records', function() {
        var html = [];
        for (var i = 0; i < data.hits.length; i++) {
            var hit = data.hits[i];
+            that.team.queue("record").publish(hit);
            var divId = team.recordElementId(hit.recid[0]);
            html.push('<div class="record mkwsTeam_' + team.name() + ' ' + divId + '">', renderSummary(hit), '</div>');
            // ### At some point, we may be able to move the
@@ -259,20 +284,18 @@ mkws.registerWidgetType('Navi', function() {
        var filters = that.team.filters();
        var text = "";
 
-       for (var i in filters) {
-           if (text) {
-               text += " | ";
-           }
-           var filter = filters[i];
-           if (filter.id) {
-               text += M('source') + ': <a class="crossout" href="#" onclick="mkws.delimitTarget(\'' + teamName +
-                   "', '" + filter.id + "'" + ');return false;">' + filter.name + '</a>';
-           } else {
-               text += M(filter.field) + ': <a class="crossout" href="#" onclick="mkws.delimitQuery(\'' + teamName +
-                   "', '" + filter.field + "', '" + filter.value + "'" +
-                   ');return false;">' + filter.value + '</a>';
-           }
-       }
+       filters.visitTargets(function(id, name) {
+           if (text) text += " | ";
+           text += M('source') + ': <a class="crossout" href="#" onclick="mkws.delimitTarget(\'' + teamName +
+               "', '" + id + "'" + ');return false;">' + name + '</a>';
+       });
+
+       filters.visitFields(function(field, value) {
+           if (text) text += " | ";
+           text += M(field) + ': <a class="crossout" href="#" onclick="mkws.delimitQuery(\'' + teamName +
+               "', '" + field + "', '" + value + "'" +
+               ');return false;">' + value + '</a>';
+       });
 
        $(that.node).html(text);
     });
@@ -315,3 +338,122 @@ mkws.registerWidgetType('Done', function() {
        $(that.node).html("Search complete: found " + n + " records");
     });
 });
+
+
+mkws.registerWidgetType('Switch', function() {
+    var tname = this.team.name();
+    $(this.node).html('\
+<a href="#" onclick="mkws.switchView(\'' + tname + '\', \'records\')">Records</a><span> \
+| \
+</span><a href="#" onclick="mkws.switchView(\'' + tname + '\', \'targets\')">Targets</a>');
+});
+
+
+mkws.registerWidgetType('Search', function() {
+    var tname = this.team.name();
+    var M = mkws.M;
+
+    $(this.node).html('\
+<form name="mkwsSearchForm" class="mkwsSearchForm mkwsTeam_' + tname + '" action="" >\
+  <input class="mkwsQuery mkwsTeam_' + tname + '" type="text" size="' + this.config.query_width + '" />\
+  <input class="mkwsButton mkwsTeam_' + tname + '" type="submit" value="' + M('Search') + '" />\
+</form>');
+});
+
+
+mkws.registerWidgetType('SearchForm', function() {
+    var team = this.team;    
+    $(this.node).submit(function() {
+       var val = team.widget('Query').value();
+       team.newSearch(val);
+       return false;
+    });
+});
+
+
+mkws.registerWidgetType('Results', function() {
+    var tname = this.team.name();
+
+    $(this.node).html('\
+<table width="100%" border="0" cellpadding="6" cellspacing="0">\
+  <tr>\
+    <td class="mkwsTermlistContainer1 mkwsTeam_' + tname + '" width="250" valign="top">\
+      <div class="mkwsTermlists mkwsTeam_' + tname + '"></div>\
+    </td>\
+    <td class="mkwsMOTDContainer mkwsTeam_' + tname + '" valign="top">\
+      <div class="mkwsRanking mkwsTeam_' + tname + '"></div>\
+      <div class="mkwsPager mkwsTeam_' + tname + '"></div>\
+      <div class="mkwsNavi mkwsTeam_' + tname + '"></div>\
+      <div class="mkwsRecords mkwsTeam_' + tname + '"></div>\
+    </td>\
+  </tr>\
+  <tr>\
+    <td colspan="2">\
+      <div class="mkwsTermlistContainer2 mkwsTeam_' + tname + '"></div>\
+    </td>\
+  </tr>\
+</table>');
+});
+
+
+mkws.registerWidgetType('Ranking', function() {
+    var tname = this.team.name();
+    var that = this;
+    var M = mkws.M;
+
+    var s = '<form name="mkwsSelect" class="mkwsSelect mkwsTeam_' + tname + '" action="" >';
+    if (this.config.show_sort) {
+       s +=  M('Sort by') + ' ' + mkwsHtmlSort() + ' ';
+    }
+    if (this.config.show_perpage) {
+       s += M('and show') + ' ' + mkwsHtmlPerpage() + ' ' + M('per page') + '.';
+    }
+    s += '</form>';
+
+    $(this.node).html(s);
+
+
+    function mkwsHtmlSort() {
+        var order = that.team.sortOrder();
+
+       that.log("HTML sort, sortOrder = '" + order + "'");
+       var sort_html = '<select class="mkwsSort mkwsTeam_' + tname + '">';
+
+       for(var i = 0; i < that.config.sort_options.length; i++) {
+           var opt = that.config.sort_options[i];
+           var key = opt[0];
+           var val = opt.length == 1 ? opt[0] : opt[1];
+
+           sort_html += '<option value="' + key + '"';
+           if (order == key || order == val) {
+               sort_html += ' selected="selected"';
+           }
+           sort_html += '>' + M(val) + '</option>';
+       }
+       sort_html += '</select>';
+
+       return sort_html;
+    }
+
+    function mkwsHtmlPerpage() {
+        var perpage = that.team.perpage();
+
+       that.log("HTML perpage, perpage = " + perpage);
+       var perpage_html = '<select class="mkwsPerpage mkwsTeam_' + tname + '">';
+
+       for(var i = 0; i < that.config.perpage_options.length; i++) {
+           var key = that.config.perpage_options[i];
+
+           perpage_html += '<option value="' + key + '"';
+           if (key == perpage) {
+               perpage_html += ' selected="selected"';
+           }
+           perpage_html += '>' + key + '</option>';
+       }
+       perpage_html += '</select>';
+
+       return perpage_html;
+    }
+});
+
+