More explicit logging for widget-creation
[mkws-moved-to-github.git] / tools / htdocs / mkws.js
index e1bcd06..c506ccf 100644 (file)
@@ -160,13 +160,24 @@ function widget($, team, type, node) {
 
     if (type === 'Targets') {
        promoteTargets();
+       team.debug("made targets widget(node=" + node + ")");
     } else if (type === 'Stat') {
        promoteStat();
+       team.debug("made stat widget(node=" + node + ")");
+    } else if (type === 'Termlists') {
+       promoteTermlists();
+       team.debug("made termlists widget(node=" + node + ")");
+    } else if (type === 'Pager') {
+       promotePager();
+       team.debug("made pager widget(node=" + node + ")");
+    } else if (type === 'Records') {
+       promoteRecords();
+       team.debug("made records widget(node=" + node + ")");
     } else {
        // ### Handle other types here
+       team.debug("made unencapsulated widget(type=" + type + ", node=" + node + ")");
     }
 
-    mkws.debug("made widget(team=" + team + ", type=" + type + ", node=" + node);
     return that;
 
 
@@ -212,6 +223,157 @@ function widget($, team, type, node) {
                '<span class="records">' + M('Retrieved records') + ': ' + data.records + '/' + data.hits + '</span>');
        });
     }
+
+
+    function promoteTermlists() {
+       team.queue("termlists").subscribe(function(data) {
+           mkws.debug("in termlist consumer");
+           if (!node) {
+               alert("termlists event when there are no termlists");
+               return;
+           }
+
+           // no facets: this should never happen
+           if (!mkws_config.facets || mkws_config.facets.length == 0) {
+               alert("onTerm called even though we have no facets: " + $.toJSON(data));
+               $(node).hide();
+               return;
+           }
+
+           // display if we first got results
+           $(node).show();
+
+           var acc = [];
+           acc.push('<div class="title">' + M('Termlists') + '</div>');
+           var facets = mkws_config.facets;
+
+           for (var i = 0; i < facets.length; i++) {
+               if (facets[i] == "xtargets") {
+                   addSingleFacet(acc, "Sources",  data.xtargets, 16, null);
+               } else if (facets[i] == "subject") {
+                   addSingleFacet(acc, "Subjects", data.subject,  10, "subject");
+               } else if (facets[i] == "author") {
+                   addSingleFacet(acc, "Authors",  data.author,   10, "author");
+               } else {
+                   alert("bad facet configuration: '" + facets[i] + "'");
+               }
+           }
+
+           $(node).html(acc.join(''));
+
+           function addSingleFacet(acc, caption, data, max, pzIndex) {
+               acc.push('<div class="facet mkwsFacet' + caption + ' mkwsTeam_' + team.name() + '">');
+               acc.push('<div class="termtitle">' + M(caption) + '</div>');
+               for (var i = 0; i < data.length && i < max; i++) {
+                   acc.push('<div class="term">');
+                   acc.push('<a href="#" ');
+                   var action = '';
+                   if (!pzIndex) {
+                       // Special case: target selection
+                       acc.push('target_id='+data[i].id+' ');
+                       if (!team.targetFiltered(data[i].id)) {
+                           action = 'mkws.limitTarget(\'' + team.name() + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
+                       }
+                   } else {
+                       action = 'mkws.limitQuery(\'' + team.name() + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)';
+                   }
+                   acc.push('onclick="' + action + ';return false;">' + data[i].name + '</a>'
+                            + ' <span>' + data[i].freq + '</span>');
+                   acc.push('</div>');
+               }
+               acc.push('</div>');
+           }
+       });
+    }
+
+
+    function promotePager() {
+       team.queue("pager").subscribe(function(data) {
+           $(node).html(drawPager(data))
+
+           function drawPager(data) {
+               var s = '<div style="float: right">' + M('Displaying') + ': '
+                   + (data.start + 1) + ' ' + M('to') + ' ' + (data.start + data.num) +
+                   ' ' + M('of') + ' ' + data.merged + ' (' + M('found') + ': '
+                   + data.total + ')</div>';
+
+               //client indexes pages from 1 but pz2 from 0
+               var onsides = 6;
+               var pages = Math.ceil(team.totalRecordCount() / team.perpage());
+               var currentPage = team.currentPage();
+
+               var firstClkbl = (currentPage - onsides > 0)
+                   ? currentPage - onsides
+                   : 1;
+
+               var lastClkbl = firstClkbl + 2*onsides < pages
+                   ? firstClkbl + 2*onsides
+                   : pages;
+
+               var prev = '<span class="mkwsPrev">&#60;&#60; ' + M('Prev') + '</span><b> | </b>';
+               if (currentPage > 1)
+                   prev = '<a href="#" class="mkwsPrev" onclick="mkws.pagerPrev(\'' + team.name() + '\');">'
+                   +'&#60;&#60; ' + M('Prev') + '</a><b> | </b>';
+
+               var middle = '';
+               for(var i = firstClkbl; i <= lastClkbl; i++) {
+                   var numLabel = i;
+                   if(i == currentPage)
+                       numLabel = '<b>' + i + '</b>';
+
+                   middle += '<a href="#" onclick="mkws.showPage(\'' + team.name() + '\', ' + i + ')"> '
+                       + numLabel + ' </a>';
+               }
+
+               var next = '<b> | </b><span class="mkwsNext">' + M('Next') + ' &#62;&#62;</span>';
+               if (pages - currentPage > 0)
+                   next = '<b> | </b><a href="#" class="mkwsNext" onclick="mkws.pagerNext(\'' + team.name() + '\')">'
+                   + M('Next') + ' &#62;&#62;</a>';
+
+               var predots = '';
+               if (firstClkbl > 1)
+                   predots = '...';
+
+               var postdots = '';
+               if (lastClkbl < pages)
+                   postdots = '...';
+
+               s += '<div style="float: clear">'
+                   + prev + predots + middle + postdots + next + '</div>';
+
+               return s;
+           }
+       });
+    }                       
+
+
+    function promoteRecords() {
+       team.queue("records").subscribe(function(data) {
+           var html = [];
+           for (var i = 0; i < data.hits.length; i++) {
+               var hit = data.hits[i];
+               html.push('<div class="record" id="mkwsRecdiv_' + team.name() + '_' + hit.recid + '" >',
+                         renderSummary(hit),
+                         '</div>');
+               // ### At some point, we may be able to move the
+               // m_currentRecordId and m_currentRecordData members
+               // from the team object into this widget.
+               if (hit.recid == team.currentRecordId()) {
+                   if (team.currentRecordData())
+                       html.push(renderDetails(team.currentRecordData()));
+               }
+           }
+           $(node).html(html.join(''));
+
+           function renderSummary(hit)
+           {
+               var template = team.loadTemplate("Summary");
+               hit._id = "mkwsRec_" + hit.recid;
+               hit._onclick = "mkws.showDetails('" + team.name() + "', this.id);return false;"
+               return template(hit);
+           }
+       });
+    }
 }
 
 
@@ -226,7 +388,6 @@ function widget($, team, type, node) {
 function team($, teamName) {
     var that = {};
     var m_teamName = teamName;
-    that.name = function() { return m_teamName; }
     var m_submitted = false;
     var m_query; // initially undefined
     var m_sortOrder; // will be set below
@@ -244,6 +405,12 @@ function team($, teamName) {
     var m_paz; // will be initialised below
     var m_template = {};
 
+    that.name = function() { return m_teamName; }
+    that.perpage = function() { return m_perpage; }
+    that.totalRecordCount = function() { return m_totalRecordCount; }
+    that.currentPage = function() { return m_currentPage; }
+    that.currentRecordId = function() { return m_currentRecordId; }
+    that.currentRecordData = function() { return m_currentRecordData; }
 
     var debug = function (s) {
        var now = $.now();
@@ -252,6 +419,7 @@ function team($, teamName) {
 
        mkws.debug(m_teamName + ": " + timestamp + s);
     }
+    that.debug = debug;
 
     debug("start running MKWS");
 
@@ -300,64 +468,15 @@ function team($, teamName) {
 
     function onTerm(data) {
        debug("term");
-       var node = findnode(".mkwsTermlists");
-       if (node.length == 0) return;
-
-       // no facets: this should never happen
-       if (!mkws_config.facets || mkws_config.facets.length == 0) {
-           alert("onTerm called even though we have no facets: " + $.toJSON(data));
-           node.hide();
-           return;
-       }
-
-       // display if we first got results
-       node.show();
-
-       var acc = [];
-       acc.push('<div class="title">' + M('Termlists') + '</div>');
-       var facets = mkws_config.facets;
-
-       for(var i = 0; i < facets.length; i++) {
-           if (facets[i] == "xtargets") {
-               addSingleFacet(acc, "Sources",  data.xtargets, 16, null);
-           } else if (facets[i] == "subject") {
-               addSingleFacet(acc, "Subjects", data.subject,  10, "subject");
-           } else if (facets[i] == "author") {
-               addSingleFacet(acc, "Authors",  data.author,   10, "author");
-           } else {
-               alert("bad facet configuration: '" + facets[i] + "'");
-           }
-       }
-
-       node.html(acc.join(''));
+       queue("termlists").publish(data);
     }
 
 
     function onShow(data, teamName) {
        debug("show");
        m_totalRecordCount = data.merged;
-
-       var pager = findnode(".mkwsPager");
-       if (pager.length) {
-           pager.html(drawPager(data))
-       }
-
-       var results = findnode(".mkwsRecords");
-       if (!results.length)
-           return;
-
-       var html = [];
-       for (var i = 0; i < data.hits.length; i++) {
-            var hit = data.hits[i];
-           html.push('<div class="record" id="mkwsRecdiv_' + teamName + '_' + hit.recid + '" >',
-                     renderSummary(hit),
-                     '</div>');
-           if (hit.recid == m_currentRecordId) {
-               if (m_currentRecordData)
-                   html.push(renderDetails(m_currentRecordData));
-           }
-       }
-       results.html(html.join(''));
+       queue("pager").publish(data);
+       queue("records").publish(data);
     }
 
 
@@ -376,31 +495,7 @@ function team($, teamName) {
     }
 
 
-    function addSingleFacet(acc, caption, data, max, pzIndex) {
-       acc.push('<div class="facet mkwsFacet' + caption + ' mkwsTeam_' + m_teamName + '">');
-       acc.push('<div class="termtitle">' + M(caption) + '</div>');
-       for (var i = 0; i < data.length && i < max; i++) {
-           acc.push('<div class="term">');
-            acc.push('<a href="#" ');
-           var action = '';
-           if (!pzIndex) {
-               // Special case: target selection
-               acc.push('target_id='+data[i].id+' ');
-               if (!targetFiltered(data[i].id)) {
-                   action = 'mkws.limitTarget(\'' + m_teamName + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
-               }
-           } else {
-               action = 'mkws.limitQuery(\'' + m_teamName + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)';
-           }
-           acc.push('onclick="' + action + ';return false;">' + data[i].name + '</a>'
-                    + ' <span>' + data[i].freq + '</span>');
-           acc.push('</div>');
-       }
-       acc.push('</div>');
-    }
-
-
-    function targetFiltered(id) {
+    that.targetFiltered = function(id) {
        for (var i = 0; i < m_filters.length; i++) {
            if (m_filters[i].id === id ||
                m_filters[i].id === 'pz:id=' + id) {
@@ -411,60 +506,6 @@ function team($, teamName) {
     }
 
 
-    function drawPager (data)
-    {
-       var s = '<div style="float: right">' + M('Displaying') + ': '
-           + (data.start + 1) + ' ' + M('to') + ' ' + (data.start + data.num) +
-           ' ' + M('of') + ' ' + data.merged + ' (' + M('found') + ': '
-           + data.total + ')</div>';
-
-       //client indexes pages from 1 but pz2 from 0
-       var onsides = 6;
-       var pages = Math.ceil(m_totalRecordCount / m_perpage);
-
-       var firstClkbl = (m_currentPage - onsides > 0)
-            ? m_currentPage - onsides
-            : 1;
-
-       var lastClkbl = firstClkbl + 2*onsides < pages
-            ? firstClkbl + 2*onsides
-            : pages;
-
-       var prev = '<span class="mkwsPrev">&#60;&#60; ' + M('Prev') + '</span><b> | </b>';
-       if (m_currentPage > 1)
-            prev = '<a href="#" class="mkwsPrev" onclick="mkws.pagerPrev(\'' + m_teamName + '\');">'
-            +'&#60;&#60; ' + M('Prev') + '</a><b> | </b>';
-
-       var middle = '';
-       for(var i = firstClkbl; i <= lastClkbl; i++) {
-            var numLabel = i;
-            if(i == m_currentPage)
-               numLabel = '<b>' + i + '</b>';
-
-            middle += '<a href="#" onclick="mkws.showPage(\'' + m_teamName + '\', ' + i + ')"> '
-               + numLabel + ' </a>';
-       }
-
-       var next = '<b> | </b><span class="mkwsNext">' + M('Next') + ' &#62;&#62;</span>';
-       if (pages - m_currentPage > 0)
-            next = '<b> | </b><a href="#" class="mkwsNext" onclick="mkws.pagerNext(\'' + m_teamName + '\')">'
-            + M('Next') + ' &#62;&#62;</a>';
-
-       var predots = '';
-       if (firstClkbl > 1)
-            predots = '...';
-
-       var postdots = '';
-       if (lastClkbl < pages)
-            postdots = '...';
-
-       s += '<div style="float: clear">'
-            + prev + predots + middle + postdots + next + '</div>';
-
-       return s;
-    }
-
-
     ////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////
 
@@ -559,7 +600,7 @@ function team($, teamName) {
        var pp2filter = "";
        var pp2limit = "";
 
-       // Re-use previous query/sort-order if new ones are not specified
+       // Continue to use previous query/sort-order unless new ones are specified
        if (query) {
            m_query = query;
        }
@@ -1027,15 +1068,6 @@ function team($, teamName) {
     }
 
 
-    function renderSummary(hit)
-    {
-       var template = loadTemplate("Summary");
-       hit._id = "mkwsRec_" + hit.recid;
-       hit._onclick = "mkws.showDetails('" + m_teamName + "', this.id);return false;"
-       return template(hit);
-    }
-
-
     function renderDetails(data, marker)
     {
        var template = loadTemplate("Record");
@@ -1067,6 +1099,7 @@ function team($, teamName) {
 
        return template;
     }
+    that.loadTemplate = loadTemplate;
 
 
     // The following PubSub code is modified from the jQuery manual:
@@ -1464,7 +1497,7 @@ function team($, teamName) {
            }
        });
 
-       // Find all nodes with an class, and determine their team from
+       // Find all nodes with an MKWS class, and determine their team from
        // the mkwsTeam_* class. Make all team objects.
        var then = $.now();
        $('[class^="mkws"],[class*=" mkws"]').each(function () {