promoteTargets();
} else if (type === 'Stat') {
promoteStat();
+ } else if (type === 'Termlists') {
+ promoteTermlists();
+ } else if (type === 'Pager') {
+ promotePager();
+ } else if (type === 'Records') {
+ promoteRecords();
} else {
// ### Handle other types here
}
- mkws.debug("made widget(team=" + team + ", type=" + type + ", node=" + node);
+ mkws.debug("made widget(team=" + team.name() + ", type=" + type + ", node=" + node);
return that;
'<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"><< ' + M('Prev') + '</span><b> | </b>';
+ if (currentPage > 1)
+ prev = '<a href="#" class="mkwsPrev" onclick="mkws.pagerPrev(\'' + team.name() + '\');">'
+ +'<< ' + 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') + ' >></span>';
+ if (pages - currentPage > 0)
+ next = '<b> | </b><a href="#" class="mkwsNext" onclick="mkws.pagerNext(\'' + team.name() + '\')">'
+ + M('Next') + ' >></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);
+ }
+ });
+ }
}
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
var m_perpage; // will be set below
var m_filters = [];
- var m_totalRec = 0;
- var m_curPage = 1;
- var m_curDetRecId = '';
- var m_curDetRecData = null;
- var m_debug_time = {
+ var m_totalRecordCount = 0;
+ var m_currentPage = 1;
+ var m_currentRecordId = '';
+ var m_currentRecordData = null;
+ var m_debugTime = {
// Timestamps for logging
"start": $.now(),
"last": $.now()
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();
- var timestamp = ((now - m_debug_time.start)/1000).toFixed(3) + " (+" + ((now - m_debug_time.last)/1000).toFixed(3) + ") "
- m_debug_time.last = now;
+ var timestamp = ((now - m_debugTime.start)/1000).toFixed(3) + " (+" + ((now - m_debugTime.last)/1000).toFixed(3) + ") "
+ m_debugTime.last = now;
mkws.debug(m_teamName + ": " + timestamp + s);
}
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_totalRec = 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_curDetRecId) {
- if (m_curDetRecData)
- html.push(renderDetails(m_curDetRecData));
- }
- }
- results.html(html.join(''));
+ m_totalRecordCount = data.merged;
+ queue("pager").publish(data);
+ queue("records").publish(data);
}
// in case on_show was faster to redraw element
var detRecordDiv = document.getElementById('mkwsDet_' + teamName + '_' + data.recid);
if (detRecordDiv) return;
- m_curDetRecData = data;
+ m_currentRecordData = data;
// Can't use jQuery's $('#x') syntax to find this ID, because it contains spaces.
- var recordDiv = document.getElementById('mkwsRecdiv_' + teamName + '_' + m_curDetRecData.recid);
- var html = renderDetails(m_curDetRecData);
+ var recordDiv = document.getElementById('mkwsRecdiv_' + teamName + '_' + m_currentRecordData.recid);
+ var html = renderDetails(m_currentRecordData);
$(recordDiv).append(html);
}
- 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) {
}
- 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_totalRec / m_perpage);
-
- var firstClkbl = (m_curPage - onsides > 0)
- ? m_curPage - onsides
- : 1;
-
- var lastClkbl = firstClkbl + 2*onsides < pages
- ? firstClkbl + 2*onsides
- : pages;
-
- var prev = '<span class="mkwsPrev"><< ' + M('Prev') + '</span><b> | </b>';
- if (m_curPage > 1)
- prev = '<a href="#" class="mkwsPrev" onclick="mkws.pagerPrev(\'' + m_teamName + '\');">'
- +'<< ' + M('Prev') + '</a><b> | </b>';
-
- var middle = '';
- for(var i = firstClkbl; i <= lastClkbl; i++) {
- var numLabel = i;
- if(i == m_curPage)
- numLabel = '<b>' + i + '</b>';
-
- middle += '<a href="#" onclick="mkws.showPage(\'' + m_teamName + '\', ' + i + ')"> '
- + numLabel + ' </a>';
- }
-
- var next = '<b> | </b><span class="mkwsNext">' + M('Next') + ' >></span>';
- if (pages - m_curPage > 0)
- next = '<b> | </b><a href="#" class="mkwsNext" onclick="mkws.pagerNext(\'' + m_teamName + '\')">'
- + M('Next') + ' >></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 newSearch(query, sort, targets)
+ function newSearch(query, sortOrder, targets)
{
debug("newSearch: " + query);
redrawNavi();
resetPage();
loadSelect();
- triggerSearch(query, sort, targets);
+ triggerSearch(query, sortOrder, targets);
switchView('records'); // In case it's configured to start off as hidden
m_submitted = true;
}
function resetPage()
{
- m_curPage = 1;
- m_totalRec = 0;
+ m_currentPage = 1;
+ m_totalRecordCount = 0;
}
}
- function triggerSearch (query, sort, targets)
+ function triggerSearch (query, sortOrder, targets)
{
var pp2filter = "";
var pp2limit = "";
- // Re-use previous query/sort if new ones are not specified
+ // Continue to use previous query/sort-order unless new ones are specified
if (query) {
m_query = query;
}
- if (sort) {
- m_sortOrder = sort;
+ if (sortOrder) {
+ m_sortOrder = sortOrder;
}
if (targets) {
m_filters.push({ id: targets, name: targets });
that.showPage = function (pageNum)
{
- m_curPage = pageNum;
- m_paz.showPage(m_curPage - 1);
+ m_currentPage = pageNum;
+ m_paz.showPage(m_currentPage - 1);
}
// simple paging functions
that.pagerNext = function () {
- if (m_totalRec - m_perpage*m_curPage > 0) {
+ if (m_totalRecordCount - m_perpage*m_currentPage > 0) {
m_paz.showNext();
- m_curPage++;
+ m_currentPage++;
}
}
that.pagerPrev = function () {
if (m_paz.showPrev() != false)
- m_curPage--;
+ m_currentPage--;
}
// detailed record drawing
that.showDetails = function (prefixRecId) {
var recId = prefixRecId.replace('mkwsRec_', '');
- var oldRecId = m_curDetRecId;
- m_curDetRecId = recId;
+ var oldRecordId = m_currentRecordId;
+ m_currentRecordId = recId;
// remove current detailed view if any
- var detRecordDiv = document.getElementById('mkwsDet_' + m_teamName + '_' + oldRecId);
+ var detRecordDiv = document.getElementById('mkwsDet_' + m_teamName + '_' + oldRecordId);
// lovin DOM!
if (detRecordDiv)
detRecordDiv.parentNode.removeChild(detRecordDiv);
// if the same clicked, just hide
- if (recId == oldRecId) {
- m_curDetRecId = '';
- m_curDetRecData = null;
+ if (recId == oldRecordId) {
+ m_currentRecordId = '';
+ m_currentRecordData = null;
return;
}
// request the record
debug("node=" + node + ", class='" + node.className + "', query=" + query);
- var sort = node.attr('sort');
+ var sortOrder = node.attr('sort');
var targets = node.attr('targets');
var s = "running auto search: '" + query + "'";
- if (sort) s += " sorted by '" + sort + "'";
+ if (sortOrder) s += " sorted by '" + sortOrder + "'";
if (targets) s += " in targets '" + targets + "'";
debug(s);
- newSearch(query, sort, targets);
+ newSearch(query, sortOrder, targets);
}
}
- 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");
return template;
}
+ that.loadTemplate = loadTemplate;
// The following PubSub code is modified from the jQuery manual:
}
});
- // 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 () {
mkws.teams[tname] = team(j, tname);
debug("Made MKWS team '" + tname + "'");
}
+ });
+ });
+ // Second pass: make the individual widget objects. This has
+ // to be done separately, and after the team-creation, since
+ // that sometimes makes new widget nodes (e.g. creating
+ // mkwsTermlists instead mkwsResults.
+ $('[class^="mkws"],[class*=" mkws"]').each(function () {
+ mkws.handleNodeWithTeam(this, function(tname, type) {
var myTeam = mkws.teams[tname];
var myWidget = widget(j, myTeam, type, this);
});