Merge branch 'master' into templateallthemarkup
authorJason Skomorowski <jason@indexdata.com>
Mon, 18 Aug 2014 13:19:57 +0000 (09:19 -0400)
committerJason Skomorowski <jason@indexdata.com>
Mon, 18 Aug 2014 13:19:57 +0000 (09:19 -0400)
1  2 
examples/htdocs/jasmine-local-popup.html
src/mkws-core.js
src/mkws-team.js

@@@ -24,7 -24,6 +24,7 @@@
      <script type="text/javascript" src="src/mkws-widget-categories.js"></script>
      <script type="text/javascript" src="src/mkws-widget-log.js"></script>
      <script type="text/javascript" src="src/mkws-widget-record.js"></script>
 +    <script type="text/javascript" src="src/mkws-templates.js"></script>
      <script type="text/javascript" src="src/mkws-widget-reference.js"></script>
      <script type="text/javascript" src="src/mkws-widget-builder.js"></script>
  
@@@ -57,7 -56,7 +57,7 @@@
      var jasmine_config = {
        search_query: "netbsd",
        expected_hits: 10,
-       active_clients: 12,
+       active_clients: 13,
        check_motd: false,
        check_sortby: true,
        show_record_url: true
diff --combined src/mkws-core.js
  window.mkws = {
    $: $, // Our own local copy of the jQuery object
    authenticated: false,
+   active: false,
    log_level: 1, // Will be overridden from mkws.config, but
                  // initial value allows jQuery popup to use logging.
    teams: {},
    widgetType2function: {},
 +  defaultTemplates: {},
  
    locale_lang: {
      "de": {
@@@ -182,7 -182,6 +183,7 @@@ mkws.setMkwsConfig = function(overrides
      facets: ["xtargets", "subject", "author"], /* display facets, in this order, [] for none */
      responsive_design_width: undefined, /* a page with less pixel width considered as narrow */
      log_level: 1,     /* log level for development: 0..2 */
 +    template_vars: {}, /* values that may be exposed to templates */
  
      dummy: "dummy"
    };
@@@ -206,6 -205,110 +207,6 @@@ mkws.objectInheritingFrom = function(o
  }
  
  
 -mkws.defaultTemplate = function(name) {
 -  if (name === 'Record') {
 -    return '\
 -<table>\
 -  <tr>\
 -    <th>{{mkws-translate "Title"}}</th>\
 -    <td>\
 -      {{md-title}}\
 -      {{#if md-title-remainder}}\
 -        ({{md-title-remainder}})\
 -      {{/if}}\
 -      {{#if md-title-responsibility}}\
 -        <i>{{md-title-responsibility}}</i>\
 -      {{/if}}\
 -    </td>\
 -  </tr>\
 -  {{#if md-date}}\
 -  <tr>\
 -    <th>{{mkws-translate "Date"}}</th>\
 -    <td>{{md-date}}</td>\
 -  </tr>\
 -  {{/if}}\
 -  {{#if md-author}}\
 -  <tr>\
 -    <th>{{mkws-translate "Author"}}</th>\
 -    <td>{{md-author}}</td>\
 -  </tr>\
 -  {{/if}}\
 -  {{#if md-electronic-url}}\
 -  <tr>\
 -    <th>{{mkws-translate "Links"}}</th>\
 -    <td>\
 -      {{#each md-electronic-url}}\
 -        <a href="{{this}}">Link{{mkws-index1}}</a>\
 -      {{/each}}\
 -    </td>\
 -  </tr>\
 -  {{/if}}\
 -  {{#mkws-if-any location having="md-subject"}}\
 -  <tr>\
 -    <th>{{mkws-translate "Subject"}}</th>\
 -    <td>\
 -      {{#mkws-first location having="md-subject"}}\
 -        {{#if md-subject}}\
 -          {{#mkws-commaList md-subject}}\
 -            {{this}}{{/mkws-commaList}}\
 -        {{/if}}\
 -      {{/mkws-first}}\
 -    </td>\
 -  </tr>\
 -  {{/mkws-if-any}}\
 -  <tr>\
 -    <th>{{mkws-translate "Locations"}}</th>\
 -    <td>\
 -      {{#mkws-commaList location}}\
 -        {{mkws-attr "@name"}}{{/mkws-commaList}}\
 -    </td>\
 -  </tr>\
 -</table>\
 -';
 -  } else if (name === "Summary") {
 -    return '\
 -<a href="#" id="{{_id}}" onclick="{{_onclick}}">\
 -  <b>{{md-title}}</b>\
 -</a>\
 -{{#if md-title-remainder}}\
 -  <span>{{md-title-remainder}}</span>\
 -{{/if}}\
 -{{#if md-title-responsibility}}\
 -  <span><i>{{md-title-responsibility}}</i></span>\
 -{{/if}}\
 -{{#if md-date}}, {{md-date}}\
 -{{#if location}}\
 -, {{#mkws-first location}}{{mkws-attr "@name"}}{{/mkws-first}}\
 -{{/if}}\
 -{{#if md-medium}}\
 -<span>, {{md-medium}}</span>\
 -{{/if}}\
 -{{/if}}\
 -';
 -  } else if (name === "Image") {
 -    return '\
 -      <a href="#" id="{{_id}}" onclick="{{_onclick}}">\
 -        {{#mkws-first md-thumburl}}\
 -          <img src="{{this}}" alt="{{../md-title}}"/>\
 -        {{/mkws-first}}\
 -        <br/>\
 -      </a>\
 -';
 -  } else if (name === 'Facet') {
 -    return '\
 -<a href="#"\
 -{{#if fn}}\
 -onclick="mkws.{{fn}}(\'{{team}}\', \'{{field}}\', \'{{term}}\');return false;"\
 -{{/if}}\
 ->{{term}}</a>\
 -<span>{{count}}</span>\
 -';
 -  }
 -
 -  return null;
 -};
 -
 -
  // The following functions are dispatchers for team methods that
  // are called from the UI using a team-name rather than implicit
  // context.
@@@ -418,7 -521,11 +419,11 @@@ mkws.pagerNext = function(tname) 
  
  
    function makeWidgetsWithin(level, node) {
-     node.find(selectorForAllWidgets()).each(function() {
+     if (node) var widgetNodes = node.find(selectorForAllWidgets());
+     else widgetNodes = $(selectorForAllWidgets());
+     // Return false if we parse no widgets
+     if (widgetNodes.length < 1) return false;
+     widgetNodes.each(function() {
        handleNodeWithTeam(this, function(tname, type) {
          var myTeam = mkws.teams[tname];
          if (!myTeam) {
          }
        });
      });
+     return true;
    }
  
  
-   function init(rootsel) {
-     mkws.autoHasAuto = false;
-     if (!rootsel) var rootsel = ':root';
-     var saved_config;
-     if (typeof mkws_config === 'undefined') {
-       log("setting empty config");
-       saved_config = {};
-     } else {
-       log("using config: " + $.toJSON(mkws_config));
-       saved_config = mkws_config;
-     }
-     mkws.setMkwsConfig(saved_config);
-     for (var key in mkws.config) {
-       if (mkws.config.hasOwnProperty(key)) {
-         if (key.match(/^language_/)) {
-           var lang = key.replace(/^language_/, "");
-           // Copy custom languages into list
-           mkws.locale_lang[lang] = mkws.config[key];
-           log("added locally configured language '" + lang + "'");
-         }
-       }
-     }
-     var lang = mkws.getParameterByName("lang") || mkws.config.lang;
-     if (!lang || !mkws.locale_lang[lang]) {
-       mkws.config.lang = ""
-     } else {
-       mkws.config.lang = lang;
-     }
-     log("using language: " + (mkws.config.lang ? mkws.config.lang : "none"));
-     if (mkws.config.query_width < 5 || mkws.config.query_width > 150) {
-       log("reset query width to " + mkws.config.query_width);
-       mkws.config.query_width = 50;
-     }
-     // protocol independent link for pazpar2: "//mkws/sp" -> "https://mkws/sp"
-     if (mkws.config.pazpar2_url.match(/^\/\//)) {
-       mkws.config.pazpar2_url = document.location.protocol + mkws.config.pazpar2_url;
-       log("adjusted protocol independent link to " + mkws.config.pazpar2_url);
-     }
-     if (mkws.config.responsive_design_width) {
-       // Responsive web design - change layout on the fly based on
-       // current screen width. Required for mobile devices.
-       $(window).resize(resizePage);
-       // initial check after page load
-       $(document).ready(resizePage);
-     }
+   // This function should have no side effects if run again on an operating session, even if 
+   // the element/selector passed causes existing widgets to be reparsed: 
+   //
+   // * configuration is not regenerated
+   // * authentication is not performed again
+   // * autosearches are not re-run
+   mkws.init = function(message, rootsel) {
+     if (message) mkws.log(message);
  
+     // TODO: Let's remove this soon
      // Backwards compatibility: set new magic class names on any
      // elements that have the old magic IDs.
      var ids = [ "Switch", "Lang", "Search", "Pager", "Navi",
        }
      }
  
+     // MKWS is not active until init() has been run against an object with widget nodes.
+     // We only set initial configuration when MKWS is first activated.
+     if (!mkws.isActive) {
+       var widgetSelector = selectorForAllWidgets();
+       if ($(widgetSelector).length < 1) {
+         mkws.log("no widgets found");
+         return;
+       }
+       // Initial configuration
+       mkws.autoHasAuto = false;
+       var saved_config;
+       if (typeof mkws_config === 'undefined') {
+         log("setting empty config");
+         saved_config = {};
+       } else {
+         log("using config: " + $.toJSON(mkws_config));
+         saved_config = mkws_config;
+       }
+       mkws.setMkwsConfig(saved_config);
+       for (var key in mkws.config) {
+         if (mkws.config.hasOwnProperty(key)) {
+           if (key.match(/^language_/)) {
+             var lang = key.replace(/^language_/, "");
+             // Copy custom languages into list
+             mkws.locale_lang[lang] = mkws.config[key];
+             log("added locally configured language '" + lang + "'");
+           }
+         }
+       }
+       var lang = mkws.getParameterByName("lang") || mkws.config.lang;
+       if (!lang || !mkws.locale_lang[lang]) {
+         mkws.config.lang = ""
+       } else {
+         mkws.config.lang = lang;
+       }
+       log("using language: " + (mkws.config.lang ? mkws.config.lang : "none"));
+       if (mkws.config.query_width < 5 || mkws.config.query_width > 150) {
+         log("reset query width to " + mkws.config.query_width);
+         mkws.config.query_width = 50;
+       }
+       // protocol independent link for pazpar2: "//mkws/sp" -> "https://mkws/sp"
+       if (mkws.config.pazpar2_url.match(/^\/\//)) {
+         mkws.config.pazpar2_url = document.location.protocol + mkws.config.pazpar2_url;
+         log("adjusted protocol independent link to " + mkws.config.pazpar2_url);
+       }
+       if (mkws.config.responsive_design_width) {
+         // Responsive web design - change layout on the fly based on
+         // current screen width. Required for mobile devices.
+         $(window).resize(resizePage);
+         // initial check after page load
+         $(document).ready(resizePage);
+       }
+     }
      var then = $.now();
-     makeWidgetsWithin(1, $(rootsel));
+     // If we've made no widgets, return without starting an SP session
+     // or marking MKWS active.
+     if (makeWidgetsWithin(1, rootsel) === false) return false;
      var now = $.now();
  
      log("walking MKWS nodes took " + (now-then) + " ms");
        }
      */
  
-     if (mkws.config.use_service_proxy) {
+     if (mkws.config.use_service_proxy && !mkws.authenticated) {
        authenticateSession(mkws.config.service_proxy_auth,
                            mkws.config.service_proxy_auth_domain,
                            mkws.config.pazpar2_url);
      } else {
-       // raw pp2
+       // raw pp2 or we have a session already open
        runAutoSearches();
      }
+     
+     mkws.isActive = true;
+     return true;
    };
    $(document).ready(function() {
-     var widgetSelector = selectorForAllWidgets();
-     if (widgetSelector && $(widgetSelector).length !== 0) init();
+     mkws.init();
    });
  })(mkws.$);
diff --combined src/mkws-team.js
@@@ -293,7 -293,7 +293,7 @@@ function team($, teamName) 
      if (maxrecs) params.maxrecs = maxrecs;
      if (torusquery) {
        if (!mkws.config.use_service_proxy)
-         alert("can't narrow search by torusquery when Service Proxy is not in use");
+         alert("can't narrow search by torusquery when not authenticated");
        params.torusquery = torusquery;
      }
  
  
    function loadTemplate(name, fallbackString) {
      var template = m_template[name];
 -
 -    if (template === undefined) {
 -      // Fall back to generic template if there is no team-specific one
 +    if (template === undefined && Handlebars.compile) {
        var source;
        var node = $(".mkwsTemplate_" + name + " .mkwsTeam_" + that.name());
        if (node && node.length < 1) {
          node = $(".mkwsTemplate_" + name);
        }
 -      if (node) {
 -        source = node.html();
 -      }
 -
 -      // If the template is not defined in HTML, check the following
 -      // in order: template registered in the team by a widget;
 -      // fallback string provided on this invocation; global default.
 -      if (!source) {
 -        source = m_templateText[name];
 -      }
 -      if (!source) {
 -        source = fallbackString;
 -      }
 -      if (!source) {
 -        source = mkws.defaultTemplate(name);
 +      if (node) source = node.html();
 +      if (!source) source = m_templateText[name];
 +      if (source) {
 +        template = Handlebars.compile(source);
 +        log("compiled template '" + name + "'");
        }
 -
 -      if (!source) return null;
 -      template = Handlebars.compile(source);
 -      log("compiled template '" + name + "'");
 +    }
 +    //if (template === undefined) template = mkws_templatesbyteam[m_teamName][name];
 +    if (template === undefined && Handlebars.templates) {
 +      template = Handlebars.templates[name];
 +    }
 +    if (template === undefined && mkws.defaultTemplates) {
 +      template = mkws.defaultTemplates[name];
 +    }
 +    if (template) {
        m_template[name] = template;
 +      return template;
      }
 -
 -    return template;
 +    else {
 +      mkws.log("No MKWS template for " + name);
 +      return null;
 +    }  
    }
    that.loadTemplate = loadTemplate;