No details, but bookmarkable with history.
[mkdru-moved-to-drupal.org.git] / mkdru.client.js
index 69909e1..86fcf50 100644 (file)
@@ -2,26 +2,38 @@
 var mkdru = {
   // Settings to pass to pz2.js
   usesessions: Drupal.settings.mkdru.use_sessions === '1',
-  showResponseType: 'json',
+  //   showResponseType: 'json',
   // Variables
-  curPage: 1,
-  recPerPage: 20,
-  totalRec: 0,
-  curSort: 'relevance',
-  curFilter: null,
   submitted: false,
+  pz2: null,
+  totalRec: 0,
   sourceMax: Drupal.settings.mkdru.source_max,
   subjectMax: Drupal.settings.mkdru.subject_max,
   authorMax: Drupal.settings.mkdru.author_max,
-  pz2: null,
-  pazpar2Path: Drupal.settings.mkdru.pz2_path
+  pazpar2Path: Drupal.settings.mkdru.pz2_path,
+  // State
+  defaultState: {
+    page: 1,
+    perpage: 20,
+    sort: 'relevance',
+    filter: null,
+    query:null,
+  },
+  state: {},
 };
 
 
 
+// So we can use jQuery BBQ with Drupal 6 and its 1.2.6 jQuery
+if (!$.isArray) $.isArray = function( obj ) {
+  return toString.call(obj) === "[object Array]";
+},
+
+
+
 // pz2.js event handlers:
 mkdru.pz2Init = function () {
-  if (mkdru.query) mkdru.triggerSearch();
+  if (mkdru.state.query) mkdru.triggerSearch();
   //mkdru.pz2.stat();
   //mkdru.pz2.bytarget();
 };
@@ -29,8 +41,8 @@ mkdru.pz2Init = function () {
 mkdru.pz2Show = function (data) {
   mkdru.totalRec = data.merged;
 
-  var pagerHtml = Drupal.theme('mkdruPager', data, mkdru.curPage,
-                                      Math.ceil(mkdru.totalRec / mkdru.recPerPage));
+  var pagerHtml = Drupal.theme('mkdruPager', data, mkdru.state.page,
+                                      Math.ceil(mkdru.totalRec / mkdru.state.perpage));
   $('.mkdru-pager').html(pagerHtml);
   $('.mkdru-next').bind('click', mkdru.nextPage);
   $('.mkdru-prev').bind('click', mkdru.prevPage);
@@ -42,8 +54,8 @@ mkdru.pz2Show = function (data) {
   var html = "";
   for (var i = 0; i < data.hits.length; i++) {
     html += Drupal.theme('mkdruResult', data.hits[i], 
-                         i + 1 + mkdru.recPerPage * 
-                         (mkdru.curPage - 1));
+                         i + 1 + mkdru.state.perpage * 
+                         (mkdru.state.page - 1));
   }
   $('.mkdru-result-list').html(html);
   $('.mkdru-result-title').bind('click', mkdru.requestDetail);
@@ -96,21 +108,76 @@ mkdru.pz2ByTarget = function (data) {
 };
 
 mkdru.pz2Record = function (data) {
-  clearTimeout(mkdru.pz2.recordTimer);
-//   $('.mkdru-results').hide();
-//   mkdru.pz2.stop();
-//   clearTimeout(mkdru.pz2.showTimer);  
+  clearTimeout(mkdru.pz2.showTimer);
+  $('.mkdru-results').hide();
   $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data));
   $('.mkdru-detail').bind('click', function () {$('.mkdru-detail').hide()});
   $('.mkdru-detail').show();
+  clearTimeout(mkdru.pz2.recordTimer);
+};
+
+
+
+// State and URL handling 
+
+// populate state from an object and fill in the blanks with defaults
+mkdru.stateFromObject = function (obj) {
+  for (var key in mkdru.defaultState) {
+    if (typeof(obj[key]) != "undefined") {
+      dump (key + " :: " + obj[key] + "\n");
+      mkdru.state[key] = obj[key];
+    }
+    else {
+      mkdru.state[key] = mkdru.defaultState[key];
+    }
+  }
+};
 
+// populate state from current window's hash string
+mkdru.stateFromHash = function () {
+  mkdru.stateFromObject($.deparam.fragment());
 };
 
+// set current window's hash string from state
+mkdru.hashFromState = function () {
+  var alteredState = {};
+  for (var key in mkdru.defaultState) {
+    if (mkdru.state[key] != mkdru.defaultState[key]) {
+      alteredState[key] = mkdru.state[key];
+    }
+  }
+  $.bbq.pushState(alteredState);
+};
+
+// update mkdru_form theme's ui to match state
+mkdru.uiFromState = function () {
+  for (var key in mkdru.state) {
+    switch(key) {
+    case 'query':
+      $('.mkdru-search input:text').attr('value', mkdru.state[key]);
+      break;
+    case 'perpage':
+      $('.mkdru-perpage').attr('value', mkdru.state[key]);
+      break;
+    case 'sort':
+      $('.mkdru-sort').attr('value', mkdru.state[key]);
+      break;
+    }
+  }
+};
+
+mkdru.hashChange = function () {
+  dump("Submidded? " + mkdru.submitted + "\n");
+};
+
+
+
 // UI functions:
 mkdru.submitQuery = function () {
-  mkdru.query = $('.mkdru-search input:text').attr('value');
+  mkdru.state.query = $('.mkdru-search input:text').attr('value');
   mkdru.resetPage();
   mkdru.pollDropDowns();
+  mkdru.hashFromState();
   mkdru.search();
   mkdru.submitted = true;
   return false;
@@ -122,16 +189,17 @@ mkdru.triggerSearch = function () {
 };
 
 mkdru.search = function () {
-  mkdru.pz2.search(mkdru.query, mkdru.recPerPage, mkdru.curSort,
-      mkdru.curFilter);
+  $('.mkdru-detail').hide();
+  mkdru.pz2.search(mkdru.state.query, mkdru.state.perpage, mkdru.state.sort,
+      mkdru.state.filter);
 };
 
 mkdru.pollDropDowns = function () {
-  mkdru.recPerPage = $('.mkdru-perpage').attr('value');
-  mkdru.curSort = $('.mkdru-sort').attr('value');
+  mkdru.state.perpage = $('.mkdru-perpage').attr('value');
+  mkdru.state.sort = $('.mkdru-sort').attr('value');
   if (!mkdru.submitted) return false;
   mkdru.resetPage();
-  mkdru.pz2.show(0, mkdru.recPerPage, mkdru.curSort);
+  mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
   return false;
 };
 
@@ -148,7 +216,7 @@ mkdru.limitTarget = function (id, name) {
         'Source: <a class="crossout" href="#" onclick="delimitTarget();return false;">'
         + name + '</a>';
   navi.innerHTML += '<hr/>';
-  mkdru.curFilter = 'pz:id=' + id;
+  mkdru.state.filter = 'pz:id=' + id;
   mkdru.resetPage();
   mkdru.pollDropDowns();
   mkdru.search();
@@ -156,12 +224,12 @@ mkdru.limitTarget = function (id, name) {
 };
 
 mkdru.resetPage = function () {
-  mkdru.curPage = 1;
+  mkdru.state.page = 1;
   mkdru.totalRec = 0;
 };
 
 mkdru.showPage = function (pageNum) {
-  mkdru.curPage = pageNum;
+  mkdru.state.page = pageNum;
   mkdru.pz2.showPage(pageNum-1);
 };
 
@@ -170,26 +238,30 @@ mkdru.requestDetail = function (e) {
 };
 
 mkdru.nextPage = function () {
-  if (mkdru.totalRec - mkdru.recPerPage * mkdru.curPage > 0) {
+  if (mkdru.totalRec - mkdru.state.perpage * mkdru.state.page > 0) {
     mkdru.pz2.showNext();
-    mkdru.curPage++;
+    mkdru.state.page++;
   }
 };
 
 mkdru.prevPage = function () {
   if (mkdru.pz2.showPrev() != false) {
-    mkdru.curPage--;
+    mkdru.state.page--;
   }
 };
 
 
+
 // wait until the DOM is ready, bind events
 // and instantiate pz2 library
 $(document).ready(function () {
+  $(window).bind( 'hashchange', mkdru.hashChange);
   $('.mkdru-search').bind('submit', mkdru.submitQuery);
   $('.mkdru-search input:text').attr('value', '');
   $('.mkdru-perpage').bind('change', function () { mkdru.pollDropDowns() });
   $('.mkdru-sort').bind('change', function () { mkdru.pollDropDowns() });
+
+  dump("NEW PZ2!\n");
   mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
               "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
               "pazpar2path": mkdru.pazpar2path,
@@ -202,10 +274,21 @@ $(document).ready(function () {
               "showResponseType": mkdru.showResponseType,
               "onrecord": mkdru.pz2Record,
               "autoInit": false } );
-  mkdru.query = Drupal.settings.mkdru.query;
+
+  // initialise state to hash string or defaults
+  mkdru.stateFromHash();
+  // and update UI to match
+  mkdru.uiFromState();
+  dump("QUERY:" + mkdru.state.query + "\n");
+  
+  // ting thing
+  if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
+    mkdru.state.query = Drupal.settings.mkdru.query
+  }
+
   if (mkdru.usesessions) {
     mkdru.pz2.init();
-  } else if (mkdru.query) {
+  } else if (mkdru.state.query) {
     mkdru.triggerSearch(); 
   }
 });