X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=tools%2Fhtdocs%2Fmkws.js;h=fb72ddb02df2acac3774dbadfa492013fb97b3fb;hb=93fbae933da149a1aeaf84db02fa5f08966bacaf;hp=09e5006c3f550f14e1759f87a429b3e9a7dc0ce9;hpb=16c60d02738b0a2c7e68e9332cf3878ed0ef6ba7;p=mkws-moved-to-github.git
diff --git a/tools/htdocs/mkws.js b/tools/htdocs/mkws.js
index 09e5006..fb72ddb 100644
--- a/tools/htdocs/mkws.js
+++ b/tools/htdocs/mkws.js
@@ -142,29 +142,6 @@ var mkws = {
};
-// The following PubSub code is modified from the jQuery manual:
-// https://api.jquery.com/jQuery.Callbacks/
-//
-// Use as:
-// mkws.queue("eventName").subscribe(function(param1, param2 ...) { ... });
-// mkws.queue("eventName").publish(arg1, arg2, ...);
-
-(function() {
- var queues = {};
- mkws.queue = function(id) {
- if (!queues[id]) {
- var callbacks = $.Callbacks();
- queues[id] = {
- publish: callbacks.fire,
- subscribe: callbacks.add,
- unsubscribe: callbacks.remove
- };
- }
- return queues[id];
- }
-}());
-
-
// Define empty mkws_config for simple applications that don't define it.
if (mkws_config == null || typeof mkws_config != 'object') {
var mkws_config = {};
@@ -179,10 +156,126 @@ function widget($, team, type, node) {
node: node
};
- // ### More to do here, surely: e.g. wiring into the team
- mkws.debug("made widget(team=" + team + ", type=" + type + ", node=" + node);
+ var M = mkws.M;
+
+ if (type === 'Targets') {
+ promoteTargets();
+ } else if (type === 'Stat') {
+ promoteStat();
+ } else if (type === 'Termlists') {
+ promoteTermlists();
+ } else {
+ // ### Handle other types here
+ }
+ mkws.debug("made widget(team=" + team + ", type=" + type + ", node=" + node);
return that;
+
+
+ // Functions follow for promoting the regular widget object into
+ // widgets of specific types. These could be moved outside of the
+ // widget object, or even into their own source files.
+
+ function promoteTargets() {
+ team.queue("targets").subscribe(function(data) {
+ if (node.length === 0) alert("huh?!");
+
+ var table ='
' +
+ '' + M('Target ID') + ' | ' +
+ '' + M('Hits') + ' | ' +
+ '' + M('Diags') + ' | ' +
+ '' + M('Records') + ' | ' +
+ '' + M('State') + ' | ' +
+ '
';
+
+ for (var i = 0; i < data.length; i++) {
+ table += "" + data[i].id +
+ " | " + data[i].hits +
+ " | " + data[i].diagnostic +
+ " | " + data[i].records +
+ " | " + data[i].state + " |
";
+ }
+
+ table += '
';
+ var subnode = $(node).children('.mkwsBytarget');
+ subnode.html(table);
+ });
+ }
+
+
+ function promoteStat() {
+ team.queue("stat").subscribe(function(data) {
+ if (node.length === 0) alert("huh?!");
+
+ $(node).html('' + M('Status info') + '' +
+ ' -- ' +
+ '' + M('Active clients') + ': ' + data.activeclients + '/' + data.clients + '' +
+ ' -- ' +
+ '' + M('Retrieved records') + ': ' + data.records + '/' + data.hits + '');
+ });
+ }
+
+
+ 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('' + M('Termlists') + '
');
+ 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('');
+ acc.push('
' + M(caption) + '
');
+ for (var i = 0; i < data.length && i < max; i++) {
+ acc.push('
');
+ }
+ acc.push('
');
+ }
+ });
+ }
}
@@ -197,16 +290,17 @@ 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_sort; // will be set below
+ 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()
@@ -217,15 +311,15 @@ function team($, teamName) {
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);
}
debug("start running MKWS");
- m_sort = mkws_config.sort_default;
+ m_sortOrder = mkws_config.sort_default;
m_perpage = mkws_config.perpage_default;
debug("Create main pz2 object");
@@ -249,90 +343,34 @@ function team($, teamName) {
//
// pz2.js event handlers:
//
- function onInit(teamName) {
+ function onInit() {
debug("init");
m_paz.stat();
m_paz.bytarget();
}
- function onBytarget(data, teamName) {
+ function onBytarget(data) {
debug("target");
- var node = findnode('.mkwsBytarget');
- if (node.length === 0) return;
-
- var table ='' +
- '' + M('Target ID') + ' | ' +
- '' + M('Hits') + ' | ' +
- '' + M('Diags') + ' | ' +
- '' + M('Records') + ' | ' +
- '' + M('State') + ' | ' +
- '
';
-
- for (var i = 0; i < data.length; i++) {
- table += "" + data[i].id +
- " | " + data[i].hits +
- " | " + data[i].diagnostic +
- " | " + data[i].records +
- " | " + data[i].state + " |
";
- }
-
- table += '
';
- node.html(table);
+ queue("targets").publish(data);
}
- function onStat(data, teamName) {
+ function onStat(data) {
debug("stat");
- var node = findnode('.mkwsStat');
- if (node.length === 0) return;
-
- node.html('' + M('Status info') + '' +
- ' -- ' +
- '' + M('Active clients') + ': ' + data.activeclients + '/' + data.clients + '' +
- ' -- ' +
- '' + M('Retrieved records') + ': ' + data.records + '/' + data.hits + '');
+ queue("stat").publish(data);
}
- function onTerm(data, 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('' + M('Termlists') + '
');
- 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;
+ m_totalRecordCount = data.merged;
var pager = findnode(".mkwsPager");
if (pager.length) {
@@ -349,9 +387,9 @@ function team($, teamName) {
html.push('',
renderSummary(hit),
'
');
- if (hit.recid == m_curDetRecId) {
- if (m_curDetRecData)
- html.push(renderDetails(m_curDetRecData));
+ if (hit.recid == m_currentRecordId) {
+ if (m_currentRecordData)
+ html.push(renderDetails(m_currentRecordData));
}
}
results.html(html.join(''));
@@ -365,38 +403,15 @@ function team($, teamName) {
// in case on_show was faster to redraw element
var detRecordDiv = document.getElementById('mkwsDet_' + teamName + '_' + data.recid);
if (detRecordDiv) return;
- m_curDetRecData = data;
- var recordDiv = document.getElementById('mkwsRecdiv_' + teamName + '_' + m_curDetRecData.recid);
- var html = renderDetails(m_curDetRecData);
- recordDiv.innerHTML += html;
+ 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_currentRecordData.recid);
+ var html = renderDetails(m_currentRecordData);
+ $(recordDiv).append(html);
}
- function addSingleFacet(acc, caption, data, max, pzIndex) {
- acc.push('');
- acc.push('
' + M(caption) + '
');
- for (var i = 0; i < data.length && i < max; i++) {
- acc.push('
');
- }
- acc.push('
');
- }
-
-
- 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) {
@@ -407,6 +422,60 @@ function team($, teamName) {
}
+ function drawPager (data)
+ {
+ var s = '' + M('Displaying') + ': '
+ + (data.start + 1) + ' ' + M('to') + ' ' + (data.start + data.num) +
+ ' ' + M('of') + ' ' + data.merged + ' (' + M('found') + ': '
+ + data.total + ')
';
+
+ //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 = '<< ' + M('Prev') + ' | ';
+ if (m_currentPage > 1)
+ prev = ''
+ +'<< ' + M('Prev') + ' | ';
+
+ var middle = '';
+ for(var i = firstClkbl; i <= lastClkbl; i++) {
+ var numLabel = i;
+ if(i == m_currentPage)
+ numLabel = '' + i + '';
+
+ middle += ' '
+ + numLabel + ' ';
+ }
+
+ var next = ' | ' + M('Next') + ' >>';
+ if (pages - m_currentPage > 0)
+ next = ' | '
+ + M('Next') + ' >>';
+
+ var predots = '';
+ if (firstClkbl > 1)
+ predots = '...';
+
+ var postdots = '';
+ if (lastClkbl < pages)
+ postdots = '...';
+
+ s += ''
+ + prev + predots + middle + postdots + next + '
';
+
+ return s;
+ }
+
+
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
@@ -420,7 +489,7 @@ function team($, teamName) {
}
- function newSearch(query, sort, targets)
+ function newSearch(query, sortOrder, targets)
{
debug("newSearch: " + query);
@@ -433,7 +502,7 @@ function team($, teamName) {
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;
}
@@ -444,29 +513,69 @@ function team($, teamName) {
if (!m_submitted) return false;
resetPage();
loadSelect();
- m_paz.show(0, m_perpage, m_sort);
+ m_paz.show(0, m_perpage, m_sortOrder);
return false;
}
+ function redrawNavi ()
+ {
+ var navi = findnode('.mkwsNavi');
+ if (!navi) return;
+
+ var text = "";
+ for (var i in m_filters) {
+ if (text) {
+ text += " | ";
+ }
+ var filter = m_filters[i];
+ if (filter.id) {
+ text += M('source') + ': ' + filter.name + '';
+ } else {
+ text += M(filter.field) + ': ' + filter.value + '';
+ }
+ }
+
+ navi.html(text);
+ }
+
+
function resetPage()
{
- m_curPage = 1;
- m_totalRec = 0;
+ m_currentPage = 1;
+ m_totalRecordCount = 0;
}
- function triggerSearch (query, sort, targets)
+ function loadSelect ()
+ {
+ var node = findnode('.mkwsSort');
+ if (node.length && node.val() != m_sortOrder) {
+ debug("changing m_sortOrder from " + m_sortOrder + " to " + node.val());
+ m_sortOrder = node.val();
+ }
+ node = findnode('.mkwsPerpage');
+ if (node.length && node.val() != m_perpage) {
+ debug("changing m_perpage from " + m_perpage + " to " + node.val());
+ m_perpage = node.val();
+ }
+ }
+
+
+ function triggerSearch (query, sortOrder, targets)
{
var pp2filter = "";
var pp2limit = "";
- // Re-use previous query/sort if new ones are not specified
+ // Re-use previous query/sort-order if new ones are not specified
if (query) {
m_query = query;
}
- if (sort) {
- m_sort = sort;
+ if (sortOrder) {
+ m_sortOrder = sortOrder;
}
if (targets) {
m_filters.push({ id: targets, name: targets });
@@ -499,22 +608,7 @@ function team($, teamName) {
// We can use: params.torusquery = "udb=NAME"
// Note: that won't work when running against raw pazpar2
- m_paz.search(m_query, m_perpage, m_sort, pp2filter, undefined, params);
- }
-
-
- function loadSelect ()
- {
- var node = findnode('.mkwsSort');
- if (node.length && node.val() != m_sort) {
- debug("changing m_sort from " + m_sort + " to " + node.val());
- m_sort = node.val();
- }
- node = findnode('.mkwsPerpage');
- if (node.length && node.val() != m_perpage) {
- debug("changing m_perpage from " + m_perpage + " to " + node.val());
- m_perpage = node.val();
- }
+ m_paz.search(m_query, m_perpage, m_sortOrder, pp2filter, undefined, params);
}
@@ -592,104 +686,25 @@ function team($, teamName) {
}
- function redrawNavi ()
- {
- var navi = findnode('.mkwsNavi');
- if (!navi) return;
-
- var text = "";
- for (var i in m_filters) {
- if (text) {
- text += " | ";
- }
- var filter = m_filters[i];
- if (filter.id) {
- text += M('source') + ': ' + filter.name + '';
- } else {
- text += M(filter.field) + ': ' + filter.value + '';
- }
- }
-
- navi.html(text);
- }
-
-
- function drawPager (data)
- {
- var s = '' + M('Displaying') + ': '
- + (data.start + 1) + ' ' + M('to') + ' ' + (data.start + data.num) +
- ' ' + M('of') + ' ' + data.merged + ' (' + M('found') + ': '
- + data.total + ')
';
-
- //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 = '<< ' + M('Prev') + ' | ';
- if (m_curPage > 1)
- prev = ''
- +'<< ' + M('Prev') + ' | ';
-
- var middle = '';
- for(var i = firstClkbl; i <= lastClkbl; i++) {
- var numLabel = i;
- if(i == m_curPage)
- numLabel = '' + i + '';
-
- middle += ' '
- + numLabel + ' ';
- }
-
- var next = ' | ' + M('Next') + ' >>';
- if (pages - m_curPage > 0)
- next = ' | '
- + M('Next') + ' >>';
-
- var predots = '';
- if (firstClkbl > 1)
- predots = '...';
-
- var postdots = '';
- if (lastClkbl < pages)
- postdots = '...';
-
- s += ''
- + prev + predots + middle + postdots + next + '
';
-
- return s;
- }
-
-
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--;
}
@@ -732,19 +747,19 @@ function team($, teamName) {
// 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
@@ -843,7 +858,7 @@ function team($, teamName) {
function mkwsSetLang() {
- var lang = parseQuerystring().lang || mkws_config.lang;
+ var lang = mkws.getParameterByName("lang") || mkws_config.lang;
if (!lang || !mkws.locale_lang[lang]) {
mkws_config.lang = ""
} else {
@@ -855,26 +870,51 @@ function team($, teamName) {
}
- function mkwsHtmlSwitch() {
- debug("HTML switch for team " + m_teamName);
+ /* create locale language menu */
+ function mkwsHtmlLang() {
+ var lang_default = "en";
+ var lang = mkws_config.lang || lang_default;
+ var list = [];
- var node = findnode(".mkwsSwitch");
- node.append($('' + M('Records') + ''));
- node.append($("", { text: " | " }));
- node.append($('' + M('Targets') + ''));
+ /* display a list of configured languages, or all */
+ var lang_options = mkws_config.lang_options || [];
+ var toBeIncluded = {};
+ for (var i = 0; i < lang_options.length; i++) {
+ toBeIncluded[lang_options[i]] = true;
+ }
- debug("HTML targets");
- var node = findnode(".mkwsTargets");
- node.html('\
-\
- No information available yet.\
-
');
- node.css("display", "none");
+ for (var k in mkws.locale_lang) {
+ if (toBeIncluded[k] || lang_options.length == 0)
+ list.push(k);
+ }
+
+ // add english link
+ if (lang_options.length == 0 || toBeIncluded[lang_default])
+ list.push(lang_default);
+
+ debug("Language menu for: " + list.join(", "));
+
+ /* the HTML part */
+ var data = "";
+ for(var i = 0; i < list.length; i++) {
+ var l = list[i];
+
+ if (data)
+ data += ' | ';
+
+ if (lang == l) {
+ data += ' ' + l + ' ';
+ } else {
+ data += ' ' + l + ' '
+ }
+ }
+
+ findnode(".mkwsLang").html(data);
}
function mkwsHtmlSort() {
- debug("HTML sort, m_sort = '" + m_sort + "'");
+ debug("HTML sort, m_sortOrder = '" + m_sortOrder + "'");
var sort_html = '