added callbacks to handle major events
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 15 Aug 2005 21:18:39 +0000 (21:18 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 15 Aug 2005 21:18:39 +0000 (21:18 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@1658 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/javascript/lib/js/opac/config.js
Open-ILS/src/javascript/lib/js/opac/init.js
Open-ILS/src/javascript/lib/js/opac/mresult.js
Open-ILS/src/javascript/lib/js/opac/result_common.js
Open-ILS/src/javascript/lib/js/opac/rresult.js

index 4c0f82c..70d72c4 100644 (file)
@@ -121,6 +121,7 @@ config.css.result.nav_active                = "nav_link_active";
 config.ids.result.top_div                      = "result_table_div";
 config.ids.result.nav_links            = "search_nav_links";
 config.ids.result.info                         = "result_info_div";
+config.css.result.cc_cell_even = "copy_count_cell_even";
 
 config.names.result.item_jacket        = "item_jacket";
 config.names.result.item_title = "item_title";
@@ -217,5 +218,34 @@ var LOGIN_DELETE                           = "open-ils.auth:open-ils.auth.session.delete";
 
 
 
+/* ---------------------------------------------------------------------------- */
+/* event callback functions. Other functions may be appended to these vars to
+       for added functionality.  */
+
+function runEvent(evt, a, b, c, d, e, f, g) { /* if we need more args than 7, we'll add them ;) */
+       for( var i in evt ) evt[i](a, b, c, d, e, f, g);        
+}
+
+
+G.evt                          = {};
+G.evt.xul              = {};
+G.evt.mresult  = {};
+G.evt.rresult  = {};
+G.evt.result   = {};
+
+
+G.evt.mresult.idsReceived                      = []; /* f(ids) */
+G.evt.rresult.idsReceived                      = []; /* f(ids) */
+
+G.evt.result.hitCountReceived          = [];   /* f() : display hit info, pagination, etc. */
+G.evt.result.recordReceived            = []; /* f(mvr, pagePosition, isMr) : display the record*/
+G.evt.result.copyCountsReceived        = [];   /* f(mvr, pagePosition, copyCountInfo) : display copy counts*/
+G.evt.result.allRecordsReceived        = [];   /* f(mvrsArray) : add other page stuff, sidebars, etc.*/
+
+
+
+
+
+
 
 
index 0091c67..21b841e 100644 (file)
@@ -1,5 +1,6 @@
 
 function init() {
+
        window.onunload = unload;
 
        loadUIObjects();
@@ -14,7 +15,7 @@ function init() {
        }
 }
 
-/* free whatever memory we can */
+/* free whatever memory we can so IE doesn't die a slow dumb death */
 function unload() {
        _tree_killer();
        clearUIObjects();
@@ -24,62 +25,6 @@ function unload() {
 }
 
 
-/* set up the colors in the sidebar 
-       Disables/Enables certain components based on various state data */
-function initSideBar() {
-
-       for( var p in G.ui.sidebar ) 
-               removeCSSClass(p, config.css.color_2);
-
-       var page = findCurrentPage();
-       unHideMe(G.ui.sidebar[page]);
-       addCSSClass(G.ui.sidebar[page], config.css.color_2);
-
-       /* if we're logged in, show it and replace the Login link with the Logout link */
-       if(grabUser()) {
-               G.ui.sidebar.username_dest.appendChild(text(G.user.usrname()));
-               unHideMe(G.ui.sidebar.logoutbox);
-               unHideMe(G.ui.sidebar.logged_in_as);
-               hideMe(G.ui.sidebar.loginbox);
-       }
-
-       if(G.ui.sidebar.login) G.ui.sidebar.login.onclick = initLogin;
-       if(G.ui.sidebar.logout) G.ui.sidebar.logout.onclick = doLogout; 
-
-}
-
-/* sets up the login ui components */
-var loginBoxVisible = false;
-function initLogin() {
-
-       var loginDance = function() {
-               if(doLogin()) {
-                       showCanvas();
-                       G.ui.sidebar.username_dest.appendChild(text(G.user.usrname()));
-                       unHideMe(G.ui.sidebar.logoutbox);
-                       unHideMe(G.ui.sidebar.logged_in_as);
-                       hideMe(G.ui.sidebar.loginbox);
-               }
-       }
-
-       G.ui.login.button.onclick = loginDance;
-       G.ui.login.username.onkeydown = 
-               function(evt) {if(userPressedEnter(evt)) loginDance();};
-       G.ui.login.password.onkeydown = 
-               function(evt) {if(userPressedEnter(evt)) loginDance();};
-
-       if(loginBoxVisible) {
-               showCanvas();
-       } else {
-               swapCanvas(G.ui.login.box);
-               G.ui.login.username.focus();
-       }
-       loginBoxVisible = !loginBoxVisible;
-       G.ui.login.cancel.onclick = showCanvas;
-}
-
-
-
 /* sets all of the params values */
 var TERM,  STYPE,  LOCATION,  DEPTH,  FORM, OFFSET,  COUNT,  
         HITCOUNT,  RANKS, SEARCHBAR_EXTRAS;
index b61034a..a79872d 100644 (file)
@@ -4,6 +4,8 @@ var table;
 var rowtemplate;
 var idsCookie = new cookieObject("ids", 1, "/", COOKIE_IDS);
 
+G.evt.mresult.idsReceived.push(mresultSetRecords, mresultCollectRecords); 
+
 function mresultUnload() { removeChildren(table); table = null;}
 
 function mresultDoSearch() {
@@ -11,14 +13,14 @@ function mresultDoSearch() {
        table = G.ui.result.main_table;
 
        hideMe(G.ui.result.row_template);
-       while( table.parentNode.rows.length <= getDisplayCount() )  /* add an extra so IE and safari won't complain */
+       while( table.parentNode.rows.length <= getDisplayCount() )  /* add an extra row so IE and safari won't complain */
                hideMe(table.appendChild(G.ui.result.row_template.cloneNode(true)));
 
        if(getOffset() == 0 || getHitCount() == null ) {
        //      mresultGetCount(); 
                mresultCollectIds(FETCH_MRIDS_FULL); 
        } else { 
-               resultSetInfo();
+               runEvent(G.evt.result.hitCountReceived);
                mresultCollectIds(FETCH_MRIDS);
        }
 }
@@ -33,17 +35,17 @@ function mresultGetCount() {
 
 function mresultHandleCount(r) {
        HITCOUNT = parseInt(r.getResultObject());
-       resultSetInfo(); 
+       runEvent(G.evt.result.hitCountReceived);
 }
 
 
 /* performs the actual search */
 function mresultCollectIds(method) {
 
-
        if(getOffset() == 0) {
                idsCookie.put(COOKIE_IDS,"");
                idsCookie.write();
+
        } else {
                var c = JSON2js(idsCookie.get(COOKIE_IDS));
                if(c && c.recs) { records = c.recs; ranks = c.ranks; } 
@@ -57,8 +59,9 @@ function mresultCollectIds(method) {
        } else {
 
                var req = new Request(method, getStype(), getTerm(), 
-                       getLocation(), getDepth(), getDisplayCount() * 20, getOffset(), getForm() );
+                       getLocation(), getDepth(), getDisplayCount() * 10, getOffset(), getForm() );
                req.callback(mresultHandleMRIds);
+               /* idsRetrieved */
                req.send();
        }
 }
@@ -68,11 +71,9 @@ function mresultHandleMRIds(r) {
 
        if(res.count != null) {
                HITCOUNT = res.count;
-               resultSetInfo();
+               runEvent(G.evt.result.hitCountReceived);
        } 
-
-       mresultSetRecords(res.ids);
-       mresultCollectRecords(); 
+       runEvent(G.evt.mresult.idsReceived, res.ids);
 }
 
 function mresultSetRecords(idstruct) {
@@ -86,13 +87,6 @@ function mresultSetRecords(idstruct) {
        idsCookie.write();
 }
 
-function mresultHandleMods(r) {
-       var rec = r.getResultObject();
-       resultDisplayRecord(rec, rowtemplate, r.userdata, true);
-       resultCollectCopyCounts(rec, FETCH_MR_COPY_COUNTS);
-}
-
-
 function mresultCollectRecords() {
        var i = 0;
        for( var x = getOffset(); x!= getDisplayCount() + getOffset(); x++ ) {
@@ -104,4 +98,11 @@ function mresultCollectRecords() {
        }
 }
 
+function mresultHandleMods(r) {
+       var rec = r.getResultObject();
+       var pagePosition = r.userdata;
+       runEvent(G.evt.result.recordReceived, rec, pagePosition, true);
+       resultCollectCopyCounts(rec, pagePosition, FETCH_MR_COPY_COUNTS);
+}
+
 
index 2e4649d..e12c006 100644 (file)
@@ -1,8 +1,18 @@
 var subjectCache = {};
 var authorCache = {};
 var seriesCache = {};
+
 var recordsHandled = 0;
+var recordsCache = [];
+
+/* set up the event handlers */
+G.evt.result.hitCountReceived.push(resultSetHitInfo, resultPaginate);
+G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
+G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
+G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects, resultDrawAuthors, resultDrawSeries);
 
+
+/* returns the last 'index' postion ocurring in this page */
 function resultFinalPageIndex() {
        if(getHitCount() < (getOffset() + getDisplayCount())) 
                return getHitCount() - 1;
@@ -11,7 +21,7 @@ function resultFinalPageIndex() {
 
 /* set the search result info, number of hits, which results we're 
        displaying, links to the next/prev pages, etc. */
-function resultSetInfo() { 
+function resultSetHitInfo() { 
        var c;  
        if( getDisplayCount() > (getHitCount() - getOffset()))  c = getHitCount();
        else c = getDisplayCount() + getOffset();
@@ -20,8 +30,16 @@ function resultSetInfo() {
        if(pages % 1) pages = parseInt(pages) + 1;
 
        G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
-       G.ui.result.num_pages.appendChild(text(pages + ")"));
+       G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
+
+       G.ui.result.offset_start.appendChild(text(getOffset() + 1));
+       G.ui.result.offset_end.appendChild(text(c));
+       G.ui.result.result_count.appendChild(text(getHitCount()));
+       unHideMe(G.ui.result.info);
+}
+
 
+function resultPaginate() {
        var o = getOffset();
 
        if( !((o + getDisplayCount()) >= getHitCount()) ) {
@@ -47,22 +65,16 @@ function resultSetInfo() {
                G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); 
                addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
        }
-
-       G.ui.result.offset_start.appendChild(text(o + 1));
-       G.ui.result.offset_end.appendChild(text(c));
-       G.ui.result.result_count.appendChild(text(getHitCount()));
-       unHideMe(G.ui.result.info);
-
 }
 
 
-/* display the record info in the record display table 
-       'pos' is the zero based position the record should have in the
-       display table */
-function resultDisplayRecord(rec, rowtemplate, pos, is_mr) {
+/* display the record info in the record display table 'pos' is the 
+               zero based position the record should have in the display table */
+function resultDisplayRecord(rec, pos, is_mr) {
 
-       if(rec == null) rec = new mvr(); /* so the page won't die */
+       if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
        recordsHandled++;
+       recordsCache.push(rec);
 
        /* hide the 'now loading...' message */
        hideMe(G.ui.common.loading);
@@ -79,56 +91,37 @@ function resultDisplayRecord(rec, rowtemplate, pos, is_mr) {
        else  buildTitleDetailLink(rec, title_link); 
        buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
 
-       /* grab subjects, authors, and series from the record */
-       for( var s in rec.subject() ) 
-               subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
-       authorCache[rec.author()] = 1;
-       for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
-
-       if(resultPageIsDone() && !subjectsAreDrawn) {
-               subjectsAreDrawn = true;
-               resultDrawSubjects();
-               resultDrawAuthors();
-               resultDrawSeries();
-       }
-
-
-       var countsrow = findNodeByName(r, config.names.result.counts_row);
-
-       /* adjust the width according to how many org counts are added */
        findNodeByName(r, "result_table_title_cell").width = 
-               resultAddCopyCounts(countsrow, rec) + "%";
+               100 - (orgNodeTrail(findOrgUnit(getLocation())).length * 8) + "%";
 
        unHideMe(r);
 
+       if(resultPageIsDone()) 
+               runEvent(G.evt.result.allRecordsReceived, recordsCache);
 }
 
-var subjectsAreDrawn = false;
 function resultPageIsDone(pos) {
        return (recordsHandled == getDisplayCount() 
                || recordsHandled + getOffset() == getHitCount());
 }
 
-
 /* -------------------------------------------------------------------- */
-/* dynamically add the copy count rows based on the org type 
-       'countsrow' is the row into which we will add TD's to hold
-       the copy counts 
+/* dynamically add the copy count rows based on the org type 'countsrow' 
+       is the row into which we will add TD's to hold the copy counts 
        This code generates copy count cells with an id of
-       'copy_count_cell_<depth>_<record_id>' for later insertion of copy counts
-       return the percent width left over after the each count is added. 
-       if 3 counts are added, returns 100 - (cell.width * 3) */
-function resultAddCopyCounts(countsrow, rec) {
+       'copy_count_cell_<depth>_<pagePosition>'  */
+function resultAddCopyCounts(rec, pagePosition) {
 
+       var r = table.rows[pagePosition];
+       var countsrow = findNodeByName(r, config.names.result.counts_row );
        var ccell = findNodeByName(countsrow, config.names.result.count_cell);
 
-
        var nodes = orgNodeTrail(findOrgUnit(getLocation()));
        var node = nodes[0];
        var type = findOrgType(node.ou_type());
-       ccell.id = "copy_count_cell_" + type.depth() + "_" + rec.doc_id();
+       ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
        ccell.title = type.opac_label();
-       addCSSClass(ccell, "copy_count_cell_even");
+       addCSSClass(ccell, config.css.result.cc_cell_even);
 
        var lastcell = ccell;
 
@@ -150,43 +143,55 @@ function resultAddCopyCounts(countsrow, rec) {
                        var node = nodes[x++];
                        var type = findOrgType(node.ou_type());
        
-                       ccell.id = "copy_count_cell_" + type.depth() + "_" + rec.doc_id();
+                       ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
                        ccell.title = type.opac_label();
                        countsrow.insertBefore(ccell, lastcell);
                        lastcell = ccell;
                }
        }
-
-       return 100 - (nodes.length * 8);
 }
 
 /* collect copy counts for a record using method 'methodName' */
-function resultCollectCopyCounts(rec, methodName) {
+function resultCollectCopyCounts(rec, pagePosition, methodName) {
        if(rec == null || rec.doc_id() == null) return;
        var req = new Request(methodName, getLocation(), rec.doc_id() );
-       req.request.userdata = rec;
+       req.request.userdata = [ rec, pagePosition ];
        req.callback(resultHandleCopyCounts);
        req.send();
 }
 
 function resultHandleCopyCounts(r) {
-       resultDisplayCopyCounts(r.userdata, r.getResultObject()); 
+       runEvent(G.evt.result.copyCountsReceived, r.userdata[0], r.userdata[1], r.getResultObject()); 
 }
 
 
 /* display the collected copy counts */
-function resultDisplayCopyCounts(rec, copy_counts) {
+function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
        if(copy_counts == null || rec == null) return;
        var i = 0;
        while(copy_counts[i] != null) {
-               var cell = getId("copy_count_cell_" + i +"_" + rec.doc_id());
+               var cell = getId("copy_count_cell_" + i +"_" + pagePosition);
                cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
                i++;
        }
 }
 
+
+/* captures extraneous info from each record */
+function resultBuildCaches(records) {
+       for( var r in records ) {
+               var rec = records[r];
+               for( var s in rec.subject() ) 
+                       subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
+               authorCache[rec.author()] = 1;
+               for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
+       }
+}
+
+
 function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
 function resultDrawSubjects() {
+
        var subjs = [];
        for( var s in subjectCache )
                subjs.push( { sub : s, count : subjectCache[s] } );
index d24755b..b047181 100644 (file)
@@ -2,6 +2,8 @@ var records = new Array();
 var table;
 var rowtemplate;
 
+G.evt.rresult.idsReceived.push(rresultCollectRecords); 
+
 function rresultUnload() { removeChildren(table); table = null;}
 
 function rresultDoSearch() {
@@ -22,8 +24,8 @@ function rresultCollectIds() {
 function rresultHandleRIds(r) {
        var res = r.getResultObject();
        HITCOUNT = parseInt(res.count);
-       resultSetInfo();
-       rresultCollectRecords(res.ids);
+       runEvent(G.evt.result.hitCountReceived);
+       runEvent(G.evt.rresult.idsReceived, res.ids);
 }
 
 function rresultCollectRecords(ids) {
@@ -39,7 +41,7 @@ function rresultCollectRecords(ids) {
 
 function rresultHandleMods(r) {
        var rec = r.getResultObject();
-       resultDisplayRecord(rec, rowtemplate, r.userdata, false);
-       resultCollectCopyCounts(rec, FETCH_R_COPY_COUNTS);
+       runEvent(G.evt.result.recordReceived, rec, r.userdata, false);
+       resultCollectCopyCounts(rec, r.userdata, FETCH_R_COPY_COUNTS);
 }