Interpret autosearch queries of the form !path!NUMBER
[mkws-moved-to-github.git] / tools / htdocs / mkws.js
index a96fd32..0cfea64 100644 (file)
@@ -71,7 +71,8 @@ Handlebars.registerHelper('commaList', function(items, options) {
 //
 var mkws = {
     authenticated: false,
-    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: {
@@ -329,11 +330,13 @@ function team($, teamName) {
        for (var i = 0; i < data.length && i < max; i++) {
            acc.push('<div class="term">');
             acc.push('<a href="#" ');
-           var action;
+           var action = '';
            if (!pzIndex) {
                // Special case: target selection
                acc.push('target_id='+data[i].id+' ');
-               action = 'mkws.limitTarget(\'' + m_teamName + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
+               if (!target_filtered(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)';
            }
@@ -345,6 +348,17 @@ function team($, teamName) {
     }
 
 
+    function target_filtered(id) {
+       for (var i = 0; i < m_filters.length; i++) {
+           if (m_filters[i].id === id ||
+               m_filters[i].id === 'pz:id=' + id) {
+               return true;
+           }
+       }
+       return false;
+    }
+
+
     function my_onrecord(data, args, teamName) {
        debug("record: teamName=" + teamName + ", m_teamName=" + m_teamName);
        // FIXME: record is async!!
@@ -849,8 +863,6 @@ 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) {
@@ -858,8 +870,8 @@ function team($, teamName) {
            mkws.handle_node_with_team(node, function(tname) {
                $(node).html('\
 <form name="mkwsSearchForm" class="mkwsSearchForm mkwsTeam_' + tname + '" action="" >\
-  <input id="mkwsQuery" class="mkwsQuery mkwsTeam_' + tname + '" type="text" size="' + mkws_config.query_width + '" />\
-  <input id="mkwsButton" class="mkwsButton mkwsTeam_' + tname + '" type="submit" value="' + M('Search') + '" />\
+  <input class="mkwsQuery mkwsTeam_' + tname + '" type="text" size="' + mkws_config.query_width + '" />\
+  <input class="mkwsButton mkwsTeam_' + tname + '" type="submit" value="' + M('Search') + '" />\
 </form>');
            });
        });
@@ -879,13 +891,13 @@ function team($, teamName) {
 <table width="100%" border="0" cellpadding="6" cellspacing="0">\
   <tr>\
     <td class="mkwsTermlistContainer1 mkwsTeam_' + m_teamName + '" width="250" valign="top">\
-      <div id="mkwsTermlists" class="mkwsTermlists mkwsTeam_' + m_teamName + '"></div>\
+      <div class="mkwsTermlists mkwsTeam_' + m_teamName + '"></div>\
     </td>\
     <td class="mkwsMOTDContainer mkwsTeam_' + m_teamName + '" valign="top">\
-      <div id="mkwsRanking" class="mkwsRanking mkwsTeam_' + m_teamName + '"></div>\
-      <div id="mkwsPager" class="mkwsPager mkwsTeam_' + m_teamName + '"></div>\
-      <div id="mkwsNavi" class="mkwsNavi mkwsTeam_' + m_teamName + '"></div>\
-      <div id="mkwsRecords" class="mkwsRecords mkwsTeam_' + m_teamName + '"></div>\
+      <div class="mkwsRanking mkwsTeam_' + m_teamName + '"></div>\
+      <div class="mkwsPager mkwsTeam_' + m_teamName + '"></div>\
+      <div class="mkwsNavi mkwsTeam_' + m_teamName + '"></div>\
+      <div class="mkwsRecords mkwsTeam_' + m_teamName + '"></div>\
     </td>\
   </tr>\
   <tr>\
@@ -1106,141 +1118,6 @@ function team($, teamName) {
 };
 
 
-/*
- * implement jQuery plugin $.pazpar2({})
- */
-function _mkws_jquery_plugin ($) {
-    function debug (string) {
-       mkws.debug("jquery.pazpar2: " + string);
-    }
-
-    function init_popup(obj) {
-       var config = obj ? obj : {};
-
-       var height = config.height || 760;
-       var width = config.width || 880;
-       var id_button = config.id_button || "input#mkwsButton";
-       var id_popup = config.id_popup || "#mkwsPopup";
-
-       debug("popup height: " + height + ", width: " + width);
-
-       // make sure that jquery-ui was loaded afte jQuery core lib, e.g.:
-       // <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>
-       if (!$.ui) {
-           debug("Error: jquery-ui.js is missing, did you include it after jQuery core in the HTML file?");
-           return;
-       }
-
-       $(id_popup).dialog({
-           closeOnEscape: true,
-           autoOpen: false,
-           height: height,
-           width: width,
-           modal: true,
-           resizable: true,
-           buttons: {
-               Cancel: function() {
-                   $(this).dialog("close");
-               }
-           },
-           close: function() { }
-       });
-
-       $(id_button)
-           .button()
-           .click(function() {
-               $(id_popup).dialog("open");
-           });
-    };
-
-    $.extend({
-
-       // service-proxy or pazpar2
-       pazpar2: function(config) {
-           var id_popup = config.id_popup || "#mkwsPopup";
-           id_popup = id_popup.replace(/^#/, "");
-
-           // simple layout
-           var div = '\
-<div id="mkwsSwitch"></div>\
-<div id="mkwsLang"></div>\
-<div id="mkwsSearch"></div>\
-<div id="mkwsResults"></div>\
-<div id="mkwsTargets"></div>\
-<div id="mkwsStat"></div>';
-
-           // new table layout
-           var table = '\
-<style type="text/css">\
-  #mkwsTermlists div.facet {\
-  float:left;\
-  width: 30%;\
-  margin: 0.3em;\
-  }\
-  #mkwsStat {\
-  text-align: right;\
-  }\
-</style>\
-    \
-<table width="100%" border="0">\
-  <tr>\
-    <td>\
-      <div id="mkwsSwitch"></div>\
-      <div id="mkwsLang"></div>\
-      <div id="mkwsSearch"></div>\
-    </td>\
-  </tr>\
-  <tr>\
-    <td>\
-      <div style="height:500px; overflow: auto">\
-       <div id="mkwsPager"></div>\
-       <div id="mkwsNavi"></div>\
-       <div id="mkwsRecords"></div>\
-       <div id="mkwsTargets"></div>\
-       <div id="mkwsRanking"></div>\
-      </div>\
-    </td>\
-  </tr>\
-  <tr>\
-    <td>\
-      <div style="height:300px; overflow: hidden">\
-       <div id="mkwsTermlists"></div>\
-      </div>\
-    </td>\
-  </tr>\
-  <tr>\
-    <td>\
-      <div id="mkwsStat"></div>\
-    </td>\
-  </tr>\
-</table>';
-
-           var popup = '\
-<div id="mkwsSearch"></div>\
-<div id="' + id_popup + '">\
-  <div id="mkwsSwitch"></div>\
-  <div id="mkwsLang"></div>\
-  <div id="mkwsResults"></div>\
-  <div id="mkwsTargets"></div>\
-  <div id="mkwsStat"></div>\
-</div>'
-
-           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);
-           }
-       }
-    });
-};
-
-
 // wrapper to call team() after page load
 (function (j) {
     mkws.debug = function (string) {
@@ -1262,10 +1139,6 @@ function _mkws_jquery_plugin ($) {
     var debug = mkws.debug;
 
 
-    // enable before page load, so we could call it before mkws() runs
-    _mkws_jquery_plugin(j);
-
-
     mkws.handle_node_with_team = function(node, callback) {
        var classes = node.className;
        var list = classes.split(/\s+/)
@@ -1437,6 +1310,24 @@ function _mkws_jquery_plugin ($) {
            // ### should check mkwsTermlist as well, for facet-only teams
            var node = $('.mkwsRecords.mkwsTeam_' + teamName);
            var query = node.attr('autosearch');
+
+           if (query.match(/^!param!/)) {
+               var param = query.replace(/^!param!/, '');
+               query = getParameterByName(param);
+               debug("obtained query '" + query + "' from param '" + param + "'");
+               if (!query) {
+                   alert("This page has a MasterKey widget that needs a query specified by the '" + param + "' parameter");
+               }
+           } else if (query.match(/^!path!/)) {
+               var index = query.replace(/^!path!/, '');
+               var path = window.location.pathname.split('/');
+               query = path[path.length - index];
+               debug("obtained query '" + query + "' from path-component '" + index + "'");
+               if (!query) {
+                   alert("This page has a MasterKey widget that needs a query specified by the path-component " + index);
+               }
+           }
+
            debug("teamName '" + teamName + "', node=" + node + ", class='" + node.className + "', query=" + query);
 
            if (query) {
@@ -1455,6 +1346,16 @@ function _mkws_jquery_plugin ($) {
     }
 
 
+    // This function is taken from a StackOverflow answer
+    // http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript/901144#901144
+    function getParameterByName(name) {
+       name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+       var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
+           results = regex.exec(location.search);
+       return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+    }
+
+
     $(document).ready(function() {
        debug("on load ready");
        default_mkws_config();