mkdru.removeLimits() no longer leaves dangling limit_subject
[mkdru-moved-to-drupal.org.git] / mkdru.client.js
index c73e875..5c2d0d0 100644 (file)
@@ -8,31 +8,37 @@ var mkdru = {
   totalRec: 0,
   pagerRange: 6,
   pazpar2Path: Drupal.settings.mkdru.pz2_path,
+  facetContainerSelector: Drupal.settings.mkdru.facetContainerSelector,
   // Facets
   facets: {
     source: {
+      displayName: Drupal.settings.mkdru.source_dname || "Source",
+      orderWeight: Drupal.settings.mkdru.source_weight || 1,
       pz2Name: 'xtargets',
-      max: Drupal.settings.mkdru.source_max
+      max: Drupal.settings.mkdru.source_max || 10
     },
     subject: {
+      displayName: Drupal.settings.mkdru.subject_dname || "Subject",
+      orderWeight: Drupal.settings.mkdru.source_weight || 2,
       pz2Name: 'subject',
-      max: Drupal.settings.mkdru.subject_max,
+      max: Drupal.settings.mkdru.subject_max || 10,
       multiLimit: true,
       limiter: 'su'
     },
     author: {
+      displayName: Drupal.settings.mkdru.author_dname || "Author",
+      orderWeight: Drupal.settings.mkdru.source_weight || 3,
       pz2Name: 'author',
-      max: Drupal.settings.mkdru.author_max,
+      max: Drupal.settings.mkdru.author_max || 10,
       multiLimit: false,
       limiter: 'au'
     }
   },
-  // State
+  // State; Keys limit_{facet key} will also be initialised
   defaultState: {
     page: 1,
     perpage: 20,
     sort: 'relevance',
-    filter: null,
     query:'',
     recid:null
   },
@@ -115,18 +121,49 @@ mkdru.pz2Status = function (data) {
   $('.mkdru-status').html(Drupal.theme('mkdruStatus', data.activeclients, data.clients));
 };
 
+mkdru.contains = function (hash, key, value) {
+  if (hash[key]) {
+    if (hash[key].length) {
+      for (var i=0; i<hash[key].length; i++) {
+        if (hash[key][i] === value) {
+          return true;
+        }
+      }
+    } else {
+      return hash[key] === value;
+    }
+  }
+  return false;
+}
+
 mkdru.pz2Term = function (data) {
+  // if signaled, prepare container client-side
+  if (mkdru.facetContainerSelector) {
+    $(mkdru.facetContainerSelector).html(Drupal.theme('mkdruFacetContainer',
+      data, mkdru.facets));
+  }
+  // map all facets against selected, for simple rendering 
+  var hash = $.deparam.fragment();
+  for (var key in hash) {
+    if (key.indexOf('limit') == 0) //always wrap in array
+      hash[key.substr(6)] = hash[key].split(';');
+    delete hash[key];
+  }
   for (var facet in mkdru.facets) {
-    // facet is limited
-    if (mkdru.state['limit_' + facet]) {
-      $('.mkdru-facet-' + facet).html(Drupal.theme('mkdruFacetLimit',
-                                 data[mkdru.facets[facet].pz2Name][0],
-                                 mkdru.hashAddDelOne(null, null, 'limit_' + facet)));
-    } else {
-      $('.mkdru-facet-' + facet).html(Drupal.theme('mkdruFacet',
-                                 data[mkdru.facets[facet].pz2Name],
-                                 facet, mkdru.facets[facet].max));
+    var terms = data[mkdru.facets[facet].pz2Name];
+    for (var i=0; i<terms.length; i++) {
+      var term = terms[i];
+      var value = facet == "source" ? term.id : term.name;
+      if (mkdru.contains(hash, facet, value)) { //enabled
+        term.hashQuery = mkdru.removeLimit(facet, value);
+        term.selected = true;
+      } else { //disabled
+        term.hashQuery = mkdru.addLimit(facet, value);
+        term.selected = false;
+      }
     }
+    $('.mkdru-facet-' + facet).html(
+        Drupal.theme('mkdruFacet', terms, facet, mkdru.facets[facet].max, hash));
   }
 };
 
@@ -190,21 +227,28 @@ mkdru.uiFromState = function () {
 };
 
 mkdru.hashChange = function () {
+  // do we need to restart the search?
+  var searchTrigger = false;
+  // shallow copy of state so we can see what changed.
+  var oldState = $.extend({}, mkdru.state);
   mkdru.stateFromHash();
-  // Request for details
-  if (mkdru.state.recid) {
+  // only have to compare values since all keys are initialised
+  for (key in mkdru.state) {
+    var changed = (mkdru.state[key] != oldState[key]);
+    if (key.substring(0,5) === 'limit' && changed)
+      searchTrigger = true;
+    if (key === 'page' && changed)
+      mkdru.pz2.showPage(mkdru.state.page-1);
+    if (key === 'query' && changed)
+      searchTrigger = true;
+  }
+  if (searchTrigger)
+    mkdru.search();
+  // request for record detail
+  if (mkdru.state.recid && (mkdru.state.recid != oldState.recid)) {
     mkdru.pz2.record(mkdru.state.recid);
   }
-  // Other internal link
   else {
-    // may need to run search again to limit targets
-    for (key in mkdru.state) {
-      if (key.substring(0,5) === 'limit' && mkdru.state[key]) {
-        mkdru.search();
-        break;
-      }
-    }
-    mkdru.pz2.showPage(mkdru.state.page-1);
     $('.mkdru-detail').hide();
     $('.mkdru-results').show();
   }
@@ -228,7 +272,8 @@ mkdru.addLimit = function (facet, limit) {
 mkdru.removeLimit = function (facet, limit) {
   var newHash = $.deparam.fragment();
   delete newHash['page'];
-  if (!newHash['limit_' + facet].indexOf(';') || !mkdru.facets[facet].multiLimit) { 
+  if (!newHash['limit_' + facet].indexOf(';')
+      || !mkdru.facets[facet].multiLimit) {
     delete newHash['limit_' + facet];
   }
   else {
@@ -236,7 +281,10 @@ mkdru.removeLimit = function (facet, limit) {
     for (var i = 0; i < limits.length; i++) {
       if (limits[i] == limit) {
         limits.splice(i, 1);
-        newHash['limit_' + facet] = limits.join(';');
+        if (limits.length < 1)
+          delete newHash['limit_' + facet];
+        else
+          newHash['limit_' + facet] = limits.join(';');
         break;
       }
     }
@@ -372,6 +420,8 @@ $(document).ready(function () {
   // ting thing
   if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
     mkdru.state.query = Drupal.settings.mkdru.query
+    //force the hash to contain query
+    mkdru.hashFromState();
   }
 
   //not running against SP? init, otherwise authenticate
@@ -409,4 +459,4 @@ $(document).ready(function () {
     );
   }
 });
-})(jQuery);
\ No newline at end of file
+})(jQuery);