X-Git-Url: http://git.indexdata.com/?p=mkws-moved-to-github.git;a=blobdiff_plain;f=tools%2Fhtdocs%2Fmkws.js;h=1292b5f675f8fac8760b9199794739ccd632a034;hp=64ff66b46599033f28c9bf980e01420b46e255bd;hb=098b75175b5a1e665a3c11f8e09b49169a8ddeb5;hpb=8e78d0045dc5281b24adf7f2452a32bf5adc43e5 diff --git a/tools/htdocs/mkws.js b/tools/htdocs/mkws.js index 64ff66b..1292b5f 100644 --- a/tools/htdocs/mkws.js +++ b/tools/htdocs/mkws.js @@ -65,20 +65,19 @@ Handlebars.registerHelper('commaList', function(items, options) { }); +Handlebars.registerHelper('index1', function(obj) { + return obj.data.index + 1; +}); -// Some functions are visible to be called from outside code, namely -// generated HTML: that.switchView(), showDetails(), limitTarget(), -// limitQuery(), delimitTarget(), delimitQuery(), pagerPrev(), -// pagerNext(), showPage(). Also mkws.M() is made available for the -// Handlebars helper 'translate' -// Set up global mkws object. Contains a hash of team objects, -// indexed by windowid. +// Set up global mkws object. Contains truly global state such as SP +// authentication, and a hash of team objects, indexed by windowid. +// var mkws = { authenticated: false, - debug_function: undefined, // will be set during initialisation - debug_level: undefined, // will be initialised from mkws_config + debug_level: 1, // Will be overridden from mkws_config, but + // initial value allows jQuery popup to use logging. paz: undefined, // will be set up during initialisation teams: {}, locale_lang: { @@ -143,22 +142,67 @@ 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 = {}; } -// wrapper for jQuery lib +// Factory function for widget objects. +function widget($, team, type, node) { + var that = { + team: team, + type: type, + node: node + }; + + // ### More to do here, surely: e.g. wiring into the team + mkws.debug("made widget(team=" + team + ", type=" + type + ", node=" + node); + + return that; +} + + +// Factory function for team objects. As much as possible, this uses +// only member variables (prefixed "m_") and inner functions with +// private scope. Some functions are visibl as member-functions to be +// called from outside code -- specifically, from generated +// HTML. These functions are that.switchView(), showDetails(), +// limitTarget(), limitQuery(), delimitTarget(), delimitQuery(), +// pagerPrev(), pagerNext(), showPage(). +// function team($, teamName) { var that = {}; var m_teamName = teamName; var m_submitted = false; var m_query; // initially undefined - var m_sort = 'relevance'; + var m_sort; // will be set below + var m_perpage; // will be set below var m_filters = []; var m_totalRec = 0; - var m_recPerPage = 20; var m_curPage = 1; var m_curDetRecId = ''; var m_curDetRecData = null; @@ -168,35 +212,17 @@ function team($, teamName) { "last": $.now() }; var m_paz; // will be initialised below + var m_template = {}; - // if (console && console.log) // disabled, will fail in IE8 - // console.log("run team(" + (teamName ? teamName : "") + ")"); - - - // Needs to be defined inside team() so it can see m_debug_time - // ### member access won't work: there is only one instance of this function - mkws.debug_function = function (string) { - if (!mkws.debug_level) - return; - - if (typeof console === "undefined" || typeof console.log === "undefined") { /* ARGH!!! old IE */ - return; - } - + 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; - // you need to disable use strict at the top of the file!!! - if (mkws.debug_level >= 3) { - console.log(timestamp + arguments.callee.caller); - } else if (mkws.debug_level >= 2) { - console.log(timestamp + ">>> called from function " + arguments.callee.caller.name + ' <<<'); - } - console.log(m_teamName + ": " + timestamp + string); + mkws.debug(m_teamName + ": " + timestamp + s); } - var debug = mkws.debug_function; // local alias + debug("start running MKWS"); m_sort = mkws_config.sort_default; @@ -242,7 +268,7 @@ function team($, teamName) { "onrecord": my_onrecord }); if (!isNaN(parseInt(mkws_config.perpage_default))) { - m_recPerPage = parseInt(mkws_config.perpage_default); + m_perpage = parseInt(mkws_config.perpage_default); } @@ -265,13 +291,14 @@ function team($, teamName) { pager.html(drawPager(data)) } - // navi var results = $(".mkwsRecords.mkwsTeam_" + m_teamName); + if (!results.length) + return; var html = []; for (var i = 0; i < data.hits.length; i++) { var hit = data.hits[i]; - html.push('
', + html.push('
', renderSummary(hit), '
'); if (hit.recid == m_curDetRecId) { @@ -347,11 +374,13 @@ function team($, teamName) { for (var i = 0; i < data.length && i < max; i++) { acc.push('
'); acc.push('' + prev = '' +'<< ' + M('Prev') + ' | '; var middle = ''; @@ -665,13 +690,13 @@ function team($, teamName) { if(i == m_curPage) numLabel = '' + i + ''; - middle += ' ' + middle += ' ' + numLabel + ' '; } - var next = ' | ' + M('Next') + ' >>'; + var next = ' | ' + M('Next') + ' >>'; if (pages - m_curPage > 0) - next = ' | ' + next = ' | ' + M('Next') + ' >>'; var predots = ''; @@ -689,7 +714,7 @@ function team($, teamName) { } - mkws.showPage = function (pageNum) + that.showPage = function (pageNum) { m_curPage = pageNum; m_paz.showPage(m_curPage - 1); @@ -697,15 +722,15 @@ function team($, teamName) { // simple paging functions - mkws.pagerNext = function () { - if (m_totalRec - m_recPerPage*m_curPage > 0) { + that.pagerNext = function () { + if (m_totalRec - m_perpage*m_curPage > 0) { m_paz.showNext(); m_curPage++; } } - mkws.pagerPrev = function () { + that.pagerPrev = function () { if (m_paz.showPrev() != false) m_curPage--; } @@ -751,7 +776,7 @@ function team($, teamName) { m_curDetRecId = recId; // remove current detailed view if any - var detRecordDiv = document.getElementById('mkwsDet_'+oldRecId); + var detRecordDiv = document.getElementById('mkwsDet_' + m_teamName + '_' + oldRecId); // lovin DOM! if (detRecordDiv) detRecordDiv.parentNode.removeChild(detRecordDiv); @@ -772,23 +797,29 @@ function team($, teamName) { { var template = loadTemplate("Record"); var details = template(data); - return '
' + details + '
'; + return '
' + details + '
'; } function loadTemplate(name) { - var template = mkws['template' + name]; + var template = m_template[name]; if (template === undefined) { - var source = $("#mkwsTemplate" + name).html(); + // Fall back to generic template if there is no team-specific one + var node = $(".mkwsTemplate_" + name + ".mkwsTeam_" + m_teamName) + if (!node.length) { + node = $(".mkwsTemplate_" + name + ".mkwsTeam_ALL") + } + + var source = node.html(); if (!source) { source = defaultTemplate(name); } template = Handlebars.compile(source); debug("compiled template '" + name + "'"); - mkws['template' + name] = template; + m_template[name] = template; } return template; @@ -826,10 +857,10 @@ function team($, teamName) { {{/if}}\ {{#if md-electronic-url}}\ \ - {{translate "URL"}}\ + {{translate "Links"}}\ \ {{#each md-electronic-url}}\ - {{this}}
\ + Link{{index1}}\ {{/each}}\ \ \ @@ -840,7 +871,8 @@ function team($, teamName) { \ {{#first location having="md-subject"}}\ {{#if md-subject}}\ - {{md-subject}}\ + {{#commaList md-subject}}\ + {{this}}{{/commaList}}\ {{/if}}\ {{/first}}\ \ @@ -884,19 +916,14 @@ function team($, teamName) { if (mkws_config.show_lang) mkws_html_lang(); - // For some reason, doing this programmatically results in - // document.mkwsSearchForm.mkwsQuery being undefined, hence the raw HTML. debug("HTML search form"); - // ### There is only one match here by design: fix not to bother looping - $('.mkwsSearch.mkwsTeam_' + m_teamName).each(function (i, obj) { - var node = this; - mkws.handle_node_with_team(node, function(tname) { - $(node).html('\ + mkws.handle_node_with_team($('.mkwsSearch.mkwsTeam_' + m_teamName), + function(tname) { + this.html('\
\ - \ - \ + \ + \
'); - }); }); debug("HTML records"); @@ -914,13 +941,13 @@ function team($, teamName) { \ \ \ \ \ \ @@ -948,6 +975,7 @@ function team($, teamName) { mkws_html_switch(); + // ### Should not be in the team code, since window size is global if (mkws_config.responsive_design_width) { // Responsive web design - change layout on the fly based on // current screen width. Required for mobile devices. @@ -956,12 +984,21 @@ function team($, teamName) { $(document).ready(function() { mkws.resize_page() }); } - domReady(); + var node; + node = $('.mkwsSearchForm.mkwsTeam_' + m_teamName); + if (node.length) + node.submit(onFormSubmitEventHandler); + node = $('.mkwsSort.mkwsTeam_' + m_teamName); + if (node.length) + node.change(onSelectDdChange); + node = $('.mkwsPerpage.mkwsTeam_' + m_teamName); + if (node.length) + node.change(onSelectDdChange); // on first page, hide the termlist $(document).ready(function() { $(".mkwsTermlists.mkwsTeam_" + m_teamName).hide(); }); var motd = $(".mkwsMOTD.mkwsTeam_" + m_teamName); - var container = $(".mkwsMOTDContainer.mkwsTeam_" + m_teamName); + var container = $(".mkwsMOTDContainer.mkwsTeam_" + m_teamName); if (motd.length && container.length) { // Move the MOTD from the provided element down into the container motd.appendTo(container); @@ -1015,7 +1052,7 @@ function team($, teamName) { function mkws_html_sort() { debug("HTML sort, m_sort = '" + m_sort + "'"); - var sort_html = ''; for(var i = 0; i < mkws_config.sort_options.length; i++) { var opt = mkws_config.sort_options[i]; @@ -1035,14 +1072,14 @@ function team($, teamName) { function mkws_html_perpage() { - debug("HTML perpage"); - var perpage_html = ''; for(var i = 0; i < mkws_config.perpage_options.length; i++) { var key = mkws_config.perpage_options[i]; perpage_html += '
\ -
\ +
\
\ -
\ -
\ -
\ -
\ +
\ +
\ +
\ +
\
\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
'; - - var popup = '\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ -
' - - if (config && config.layout == 'div') { - debug("jquery plugin layout: div"); - document.write(div); - } else if (config && config.layout == 'popup') { - debug("jquery plugin layout: popup with id: " + id_popup); - document.write(popup); - $(document).ready(function() { init_popup(config); }); - } else { - debug("jquery plugin layout: table"); - document.write(table); - } + // you need to disable use strict at the top of the file!!! + if (mkws.debug_level >= 3) { + console.log(arguments.callee.caller); + } else if (mkws.debug_level >= 2) { + console.log(">>> called from function " + arguments.callee.caller.name + ' <<<'); } - }); -}; - - -// wrapper to call team() after page load -(function (j) { - function log(s) { - if (typeof console === "undefined" || typeof console.log === "undefined") { /* ARGH!!! old IE */ - return; - } - console.log(s); + console.log(string); } - - // enable before page load, so we could call it before mkws() runs - _mkws_jquery_plugin(j); + var debug = mkws.debug; mkws.handle_node_with_team = function(node, callback) { - var classes = node.className; + // First branch for DOM objects; second branch for jQuery objects + var classes = node.className || node.attr('class'); + if (!classes) { + // For some reason, if we try to proceed when classes is + // undefined, we don't get an error message, but this + // function and its callers, up several stack level, + // silently return. What a crock. + mkws.debug("handle_node_with_team() called on node with no classes"); + return; + } var list = classes.split(/\s+/) - var tname; + var teamName, type; + for (var i = 0; i < list.length; i++) { var cname = list[i]; if (cname.match(/^mkwsTeam_/)) { - tname = cname.replace(/^mkwsTeam_/, ''); + teamName = cname.replace(/^mkwsTeam_/, ''); + } else if (cname.match(/^mkws/)) { + type = cname.replace(/^mkws/, ''); } } - callback(tname); + callback.call(node, teamName, type); } @@ -1304,7 +1265,7 @@ function _mkws_jquery_plugin ($) { if ($(window).width() <= width && parent.hasClass("mkwsTermlistContainer1")) { - log("changing from wide to narrow: " + $(window).width()); + debug("changing from wide to narrow: " + $(window).width()); $(".mkwsTermlistContainer1").hide(); $(".mkwsTermlistContainer2").show(); for (var tname in mkws.teams) { @@ -1315,7 +1276,7 @@ function _mkws_jquery_plugin ($) { } } else if ($(window).width() > width && parent.hasClass("mkwsTermlistContainer2")) { - log("changing from narrow to wide: " + $(window).width()); + debug("changing from narrow to wide: " + $(window).width()); $(".mkwsTermlistContainer1").show(); $(".mkwsTermlistContainer2").hide(); for (var tname in mkws.teams) { @@ -1352,6 +1313,18 @@ function _mkws_jquery_plugin ($) { mkws.teams[tname].delimitQuery(field, value); } + mkws.showPage = function (tname, pageNum) { + mkws.teams[tname].showPage(pageNum); + } + + mkws.pagerPrev = function (tname) { + mkws.teams[tname].pagerPrev(); + } + + mkws.pagerNext = function (tname) { + mkws.teams[tname].pagerNext(); + } + function default_mkws_config() { /* default mkws config */ @@ -1404,11 +1377,11 @@ function _mkws_jquery_plugin ($) { * for the site. */ function authenticate_session(auth_url, auth_domain, pp2_url) { - log("Run service proxy auth URL: " + auth_url); + debug("Run service proxy auth URL: " + auth_url); if (!auth_domain) { auth_domain = pp2_url.replace(/^(https?:)?\/\/(.*?)\/.*/, '$2'); - log("guessed auth_domain '" + auth_domain + "' from pp2_url '" + pp2_url + "'"); + debug("guessed auth_domain '" + auth_domain + "' from pp2_url '" + pp2_url + "'"); } var request = new pzHttpRequest(auth_url, function(err) { @@ -1427,7 +1400,7 @@ function _mkws_jquery_plugin ($) { return; } - log("Service proxy auth successfully done"); + debug("Service proxy auth successfully done"); mkws.authenticated = true; run_auto_searches(); }); @@ -1435,45 +1408,29 @@ function _mkws_jquery_plugin ($) { function run_auto_searches() { - log("running auto searches"); + debug("running auto searches"); for (var teamName in mkws.teams) { - // ### should check mkwsTermlist as well, for facet-only teams - var node = $('.mkwsRecords.mkwsTeam_' + teamName); - var query = node.attr('autosearch'); - log("teamName '" + teamName + "', node=" + node + ", class='" + node.className + "', query=" + query); - - if (query) { - var sort = node.attr('sort'); - var targets = node.attr('targets'); - var s = "running auto search: '" + query + "'"; - if (teamName) s += " [teamName '" + teamName + "']"; - if (sort) s += " sorted by '" + sort + "'"; - if (targets) s += " in targets '" + targets + "'"; - log(s); - var team = mkws.teams[teamName]; - log($.toJSON(team)); - team.newSearch(query, sort, targets, teamName); - } + mkws.teams[teamName].run_auto_search(); } } $(document).ready(function() { - log("on load ready"); + debug("on load ready"); default_mkws_config(); // Backwards compatibility: set new magic class names on any // elements that have the old magic IDs. var ids = [ "Switch", "Lang", "Search", "Pager", "Navi", "Results", "Records", "Targets", "Ranking", - "Termlists", "Stat" ]; + "Termlists", "Stat", "MOTD" ]; for (var i = 0; i < ids.length; i++) { var id = 'mkws' + ids[i]; var node = $('#' + id); if (node.attr('id')) { node.addClass(id); - log("added magic class to '" + node.attr('id') + "'"); + debug("added magic class to '" + node.attr('id') + "'"); } } @@ -1481,22 +1438,26 @@ function _mkws_jquery_plugin ($) { // specified, set the team to AUTO. $('[class^="mkws"],[class*=" mkws"]').each(function () { if (!this.className.match(/mkwsTeam_/)) { - log("adding AUTO team to node with class '" + this.className + "'"); + debug("adding AUTO team to node with class '" + this.className + "'"); $(this).addClass('mkwsTeam_AUTO'); } }); // Find all nodes with an class, and determine their team from // the mkwsTeam_* class. Make all team objects. + var then = $.now(); $('[class^="mkws"],[class*=" mkws"]').each(function () { - var node = this; - mkws.handle_node_with_team(node, function(tname) { + mkws.handle_node_with_team(this, function(tname, type) { if (!mkws.teams[tname]) { mkws.teams[tname] = team(j, tname); - log("Made MKWS team '" + tname + "'"); + debug("Made MKWS team '" + tname + "'"); } + var myTeam = mkws.teams[tname]; + var myWidget = widget(j, myTeam, type, this); }); }); + var now = $.now(); + debug("Walking MKWS nodes took " + (now-then) + " ms"); if (mkws_config.use_service_proxy) { authenticate_session(mkws_config.service_proxy_auth,