From: dbs Date: Wed, 13 Apr 2011 16:02:39 +0000 (+0000) Subject: Stab at 2.0 versions of rdetail.js and result_common.js X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=89d3ad1616a58dab5ec89b417e839f769b5b8c68;p=contrib%2FConifer.git Stab at 2.0 versions of rdetail.js and result_common.js git-svn-id: svn://svn.open-ils.org/ILS-Contrib/conifer/branches/rel_2_0@1345 6d9bc8c9-1ec2-4278-b937-99fde70a366f --- diff --git a/web/opac/skin/default/js/rdetail.js b/web/opac/skin/default/js/rdetail.js index 7f59e6d37f..ca22334981 100644 --- a/web/opac/skin/default/js/rdetail.js +++ b/web/opac/skin/default/js/rdetail.js @@ -1,3 +1,4 @@ + /* */ detachAllEvt('common', 'run'); @@ -12,7 +13,7 @@ var rdetailShowLocal = true; var rdetailShowCopyLocation = true; var rdetailGoogleBookPreview = true; var rdetailDisplaySerialHoldings = true; -var rdetailEnableRefWorks = false; +var rdetailEnableRefWorks = true; var rdetailRefWorksHost = 'http://refworks.scholarsportal.info'; var enableHoldsOnAvailable = false; @@ -43,6 +44,9 @@ var rdetailNext = null; var rdetailStart = null; var rdetailEnd = null; +var mfhdDetails = []; +var orgHiding = false; + /* serials are currently the only use of Dojo strings in the OPAC */ if (rdetailDisplaySerialHoldings) { dojo.require("dijit.Menu"); @@ -124,17 +128,45 @@ function rdetailDraw() { if(getLocation() == globalOrgTree.id()) hideMe(G.ui.rdetail.cp_info_all); - var req = new Request(FETCH_RMODS, getRid()); - req.callback(_rdetailDraw); - req.send(); + if(getRid()) { + + var req = new Request(FETCH_RMODS, getRid()); + req.callback(_rdetailDraw); + req.send(); + + } else { // No record ID was specified + + // If we have an ISBN in the URL, let's try to find that record + // This allows direct linking by ISBN. + // Note, this uses the first record it finds + if(getRtype() == RTYPE_ISBN) { + var req = new Request(FETCH_ADV_ISBN_RIDS, getAdvTerm() ); + req.callback( + function(r) { + var blob = r.getResultObject(); + if(blob && blob.count > 0) + RID = blob.ids[0]; + var req2 = new Request(FETCH_RMODS, getRid()); + req2.callback(_rdetailDraw); + req2.send(); + } + ); + req.send(); + } + } - if (rdetailDisplaySerialHoldings) { + + if (rdetailDisplaySerialHoldings && ( + isXUL() || !fetchOrgSettingDefault( + getLocation(), "opac.fully_compressed_serial_holdings") + ) + ) { var req = new Request(FETCH_MFHD_SUMMARY, getRid()); req.callback(_holdingsDraw); req.send(); if (isXUL()) { var here = findOrgUnit(getLocation()); - dojo.place("
", "rdetail_details_table", "after"); var mfhd_add = new dijit.Menu({style:"float: right;"}); new dijit.MenuItem({onClick:function(){ var req = new Request(CREATE_MFHD_RECORD, G.user.session, 1, here.id(), getRid()); @@ -150,6 +182,9 @@ function rdetailDraw() { G.evt.result.recordReceived = []; G.evt.result.copyCountsReceived = []; G.evt.result.allRecordsReceived = []; + + if(isXUL()) + unHideMe($('rdetail_show_orders')); } function rdetailGetPageIds() { @@ -211,11 +246,12 @@ function OpenMarcEditWindow(pcrud, rec) { dojo.require('openils.PermaCrud'); win.xulG = { - "record": {"marc": rec.marc()}, + "record": {"marc": rec.marc(), "rtype": "sre"}, "save": { "label": opac_strings.SAVE_MFHD_LABEL, "func": function(xmlString) { rec.marc(xmlString); + rec.edit_date('now'); rec.ischanged(true); pcrud.update(rec); } @@ -241,6 +277,10 @@ function _holdingsDraw(h) { dojo.forEach(holdings, _holdingsDrawMFHD); + // Populate XUL menus + if (isXUL()) { + runEvt('rdetail','MFHDDrawn'); + } } function _holdingsDrawMFHD(holdings, entryNum) { @@ -254,19 +294,19 @@ function _holdingsDrawMFHD(holdings, entryNum) { } } - var hh = holdings.holdings(); - var hch = holdings.current_holdings(); - var hs = holdings.supplements(); - var hcs = holdings.current_supplements(); - var hi = holdings.indexes(); - var hci = holdings.current_indexes(); + var hb = holdings.basic_holdings(); + var hba = holdings.basic_holdings_add(); + var hs = holdings.supplement_holdings(); + var hsa = holdings.supplement_holdings_add(); + var hi = holdings.index_holdings(); + var hia = holdings.index_holdings_add(); var ho = holdings.online(); var hm = holdings.missing(); var hinc = holdings.incomplete(); var hloc = holdings.location() || 'MFHD'; - if ( hh.length == 0 && hch.length == 0 && hs.length == 0 && - hcs.length == 0 && hi.length == 0 && hci.length == 0 && + if ( hb.length == 0 && hba.length == 0 && hs.length == 0 && + hsa.length == 0 && hi.length == 0 && hia.length == 0 && ho.length == 0 && hm.length == 0 && hinc.length == 0 ) { @@ -276,41 +316,61 @@ function _holdingsDrawMFHD(holdings, entryNum) { * record is likely empty or corrupt. This gives cataloguers a * chance to add holdings or correct the record */ - hh = 'PLACEHOLDER'; + hb = ['PLACEHOLDER']; } else { return null; } } - dojo.place("
" + - dojo.string.substitute(opac_strings.HOLDINGS_TABLE_CAPTION, [hloc]) + + // Show entryNum + 1 in staff client for better menu correlation + // Maybe this should be holdings.sre_id() instead? (which could get long after time) + var entryNumString = ''; + if (isXUL()) { + var entryNumInc = entryNum + 1; + entryNumString = ' [Entry #'+entryNumInc+'] '; + } + + var refNode; + if (entryNum > 0) { + refNode = 'rdetail_holdings_table_' + (entryNum - 1); + } else { + refNode = 'rdetail_details_table'; + } + + dojo.place("
" + + dojo.string.substitute(opac_strings.HOLDINGS_TABLE_CAPTION, [hloc]) + entryNumString + "
", "rdetail_details_table", "after" + "'>
", refNode, "after" ); - if (hh.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.HOLDINGS, hh); } - if (hch.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_HOLDINGS, hch); } - if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENTS, hs); } - if (hcs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_SUPPLEMENTS, hcs); } - if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEXES, hi); } - if (hci.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_INDEXES, hci); } + if (hb.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS, hb); } + if (hba.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS_ADD, hba); } + if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS, hs); } + if (hsa.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS_ADD, hsa); } + if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS, hi); } + if (hia.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS_ADD, hia); } if (ho.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.ONLINE_VOLUMES, ho); } if (hm.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.MISSING_VOLUMES, hm); } if (hinc.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INCOMPLETE_VOLUMES, hinc); } if (isXUL()) { + mfhdDetails.push({ 'id' : holdings.sre_id(), 'label' : hloc, 'entryNum' : entryNum, 'owning_lib' : holdings.owning_lib() }); dojo.require('openils.Event'); dojo.require('openils.PermaCrud'); var mfhd_edit = new dijit.Menu({}); - new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first"); + new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.sre_id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first"); new dijit.MenuItem({onClick:function(){ + // Avoid accidental deletion of MFHD records + if (!confirm(opac_strings.DELETE_MFHD_CONFIRM)) { + return; + } var pcrud = new openils.PermaCrud({"authtoken": G.user.session}); - var mfhd_rec = pcrud.retrieve("sre", holdings.id()); + var mfhd_rec = pcrud.retrieve("sre", holdings.sre_id()); if (mfhd_rec) { pcrud.eliminate(mfhd_rec); - alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.id()])); + alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.sre_id()])); } }, label:opac_strings.DELETE_MFHD}).placeAt(mfhd_edit, "last"); - // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last"); + // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.sre_id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last"); var mfhd_mb = new dijit.form.DropDownButton({dropDown: mfhd_edit, label:opac_strings.EDIT_MFHD_MENU, style:"float:right"}); mfhd_mb.placeAt("mfhdHoldingsCaption" + entryNum, "last"); mfhd_edit.startup(); @@ -327,9 +387,13 @@ function _rdetailDraw(r) { runEvt('rdetail', 'recordRetrieved', record.doc_id()); + var currentISBN = cleanISBN(record.isbn()); + G.ui.rdetail.title.appendChild(text(record.title())); buildSearchLink(STYPE_AUTHOR, record.author(), G.ui.rdetail.author); - G.ui.rdetail.isbn.appendChild(text(cleanISBN(record.isbn()))); + if (currentISBN) { + G.ui.rdetail.isbn.appendChild(text(currentISBN)); + } G.ui.rdetail.edition.appendChild(text(record.edition())); G.ui.rdetail.pubdate.appendChild(text(record.pubdate())); G.ui.rdetail.publisher.appendChild(text(record.publisher())); @@ -342,9 +406,9 @@ function _rdetailDraw(r) { G.ui.rdetail.abstr.appendChild(text(record.synopsis())); if (enableHoldsOnAvailable) { - unHideMe($('rdetail_place_hold')); + unHideMe($('rdetail_place_hold')); } else { - hideMe($('rdetail_place_hold')); + hideMe($('rdetail_place_hold')); rdetailCheckAvailable(); } @@ -352,7 +416,7 @@ function _rdetailDraw(r) { if(record.isbn()) { if(ENABLE_ADDED_CONTENT_ATTRIB_LINKS) { unHideMe($('rdetail.jacket_attrib_div')); - var href = $('rdetail.jacket_attrib_link').getAttribute('href') +cleanISBN(record.isbn()); + var href = $('rdetail.jacket_attrib_link').getAttribute('href') +currentISBN; $('rdetail.jacket_attrib_link').setAttribute('href', href); } rdetailCheckForGBPreview(); @@ -390,10 +454,7 @@ function _rdetailDraw(r) { displayLabel = note; } } - // IE in quirks mode doesn't render CSS styling for links where the class attribute - // comes after the href attribute, apparently; we can use Dojo to ensure the class - // attribute comes first - dojo.place('' + displayLabel + '', dojo.byId('rdetail_online')); + $('rdetail_online').appendChild(elem('a', {href:href,'class':'classic_link'}, displayLabel)); if (note && note != displayLabel) { $('rdetail_online').appendChild(elem('span', {'class':'url_note'}, ' - ' + note)); } @@ -404,7 +465,7 @@ function _rdetailDraw(r) { // Fill in our unAPI ID, if anyone cares var abbrs = document.getElementsByTagName('abbr'); var span; - for (var i = 0; i < abbrs.length; i = i + 1) { + for (var i = 0; i < abbrs.length; i++) { if (abbrs[i].getAttribute('name') == 'unapi') { span = abbrs[i]; break; @@ -436,34 +497,61 @@ function _rdetailDraw(r) { unHideMe($('rdetail_exp_refworks_span')); } - $('rdetail_img_link').setAttribute('href', buildISBNSrc(cleanISBN(record.isbn()), 'large')); - G.ui.rdetail.image.setAttribute("src", buildISBNSrc(cleanISBN(record.isbn()))); - - // Set extras before recordDrawn event to enable bookbags in barcode searches - rdetailSetExtrasSelector(); + if (currentISBN) { + $('rdetail_img_link').setAttribute('href', buildISBNSrc(currentISBN, 'large')); + G.ui.rdetail.image.setAttribute("src", buildISBNSrc(currentISBN)); + } runEvt("rdetail", "recordDrawn"); recordsCache.push(record); + rdetailSetExtrasSelector(); var breq = new Request(FETCH_BRE, [getRid()]); breq.callback( rdetailCheckDeleted ); breq.send(); - resultBuildCaches( [ record ] ); - resultDrawSubjects(); - resultDrawSeries(); + //resultBuildCaches( [ record ] ); + //resultDrawSubjects(); + //resultDrawSeries(); // grab added content - acCollectData(cleanISBN(record.isbn()), rdetailhandleAC); + + + // Proxied through Evergreen AddedContent module + if (currentISBN) { + acCollectData(currentISBN, rdetailhandleAC); + } + + // Not proxied, cross-site javascript + + // ChiliFresh + if (chilifresh && chilifresh != '(none)' && currentISBN) { + $('chilifreshReviewLink').setAttribute('id','isbn_'+currentISBN); + $('chilifreshReviewResult').setAttribute('id','chili_review_'+currentISBN); + unHideMe($('rdetail_reviews_link')); + unHideMe($('rdetail_chilifresh_reviews')); + try { + chili_init(); + } catch(E) { + console.log(E + '\n'); + hideMe($('rdetail_reviews_link')); + hideMe($('rdetail_chilifresh_reviews')); + } + } + + // Novelist + if (novelist && currentISBN) { + unHideMe($('rdetail_novelist_link')); + } } function rdetailCheckAvailable() { - var loc = getLocation(); - var rid = getRid(); - var req = new Request( 'open-ils.search:open-ils.search.biblio.record.copy_count', loc, rid ); - req.callback(rdetailEnableHold); - req.send(); + var loc = getLocation(); + var rid = getRid(); + var req = new Request( 'open-ils.search:open-ils.search.biblio.record.copy_count', loc, rid ); + req.callback(rdetailEnableHold); + req.send(); } /* @@ -472,15 +560,15 @@ function rdetailCheckAvailable() { * * none of those copies are available */ function rdetailEnableHold(r) { - var ccDepths = r.getResultObject(); - if ( - ((ccDepths[(ccDepths.length - 1)].available) > 0) || - ((ccDepths[(ccDepths.length - 1)].count) == 0) - ) { - hideMe($('rdetail_place_hold')); - } else { - unHideMe($('rdetail_place_hold')); - } + var ccDepths = r.getResultObject(); + if ( + ((ccDepths[(ccDepths.length - 1)].available) > 0) || + ((ccDepths[(ccDepths.length - 1)].count) == 0) + ) { + hideMe($('rdetail_place_hold')); + } else { + unHideMe($('rdetail_place_hold')); + } } function rdetailCheckDeleted(r) { @@ -510,7 +598,7 @@ function rdetailAddBookbags(r) { var index = 3; doSelectorActions(selector); - for( var i = 0; i != containers.length; i++ ) { + for( var i = 0; i < containers.length; i++ ) { found = true; var container = containers[i]; insertSelectorVal( selector, index++, container.name(), @@ -551,6 +639,7 @@ var rdetailMarcFetched = false; function rdetailShowExtra(type, args) { hideMe($('rdetail_copy_info_div')); + hideMe($('rdetail_summary_div')); hideMe($('rdetail_reviews_div')); hideMe($('rdetail_toc_div')); hideMe($('rdetail_anotes_div')); @@ -559,10 +648,12 @@ function rdetailShowExtra(type, args) { hideMe($('rdetail_marc_div')); hideMe($('cn_browse')); hideMe($('rdetail_cn_browse_div')); + hideMe($('rdetail_novelist_div')); hideMe($('rdetail_notes_div')); removeCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected'); removeCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_summary_link'), 'rdetail_extras_selected'); removeCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected'); removeCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected'); removeCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected'); @@ -570,6 +661,7 @@ function rdetailShowExtra(type, args) { removeCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected'); removeCSSClass($('rdetail_annotation_link'), 'rdetail_extras_selected'); removeCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected'); switch(type) { @@ -578,6 +670,11 @@ function rdetailShowExtra(type, args) { addCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected'); break; + case "summary": + addCSSClass($('rdetail_summary_link'), 'rdetail_extras_selected'); + unHideMe($('rdetail_summary_div')); + break; + case "reviews": addCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected'); unHideMe($('rdetail_reviews_div')); @@ -615,6 +712,11 @@ function rdetailShowExtra(type, args) { req.send(); break; + case "novelist": + addCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected'); + unHideMe($('rdetail_novelist_div')); + break; + case 'cn': addCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected'); unHideMe($('rdetail_cn_browse_div')); @@ -644,7 +746,7 @@ function rdetailBuildCNList() { return; } - for( var i in arr ) { + for( var i = 0; i < arr.length; i++ ) { var cn = arr[i]; var opt = new Option(cn); select.options[index++] = opt; @@ -672,6 +774,7 @@ function rdetailShowCNBrowse( cn, loc, depth, fromOnclick ) { setSelector( $('cn_browse_selector'), cn ); hideMe($('rdetail_copy_info_div')); hideMe($('rdetail_reviews_div')); + hideMe($('rdetail_summary_div')); hideMe($('rdetail_toc_div')); hideMe($('rdetail_marc_div')); unHideMe($('rdetail_cn_browse_div')); @@ -682,6 +785,11 @@ function rdetailShowCNBrowse( cn, loc, depth, fromOnclick ) { function rdetailhandleAC(data) { + if( data.summary.html ) { + $('rdetail_summary_div').innerHTML = data.summary.html; + unHideMe($('rdetail_summary_link')); + } + if( data.reviews.html ) { $('rdetail_review_container').innerHTML = data.reviews.html; unHideMe($('rdetail_reviews_link')); @@ -710,7 +818,7 @@ function rdetailShowReviews(r) { var template = par.removeChild($('rdetail_review_template')); if( res && res.length > 0 ) { unHideMe($('rdetail_reviews_link')); - for( var i = 0; i != res.length; i++ ) { + for( var i = 0; i < res.length; i++ ) { var rev = res[i]; if( rev.text && rev.info ) { var node = template.cloneNode(true); @@ -753,12 +861,15 @@ function _rdetailRows(node) { if( node ) { if( !orgIsMine(node, loc) && !orgIsMine(loc,node) ) return; } else { - for( var i = 0; i < globalOrgTree.children().length; i++ ) { - var org = findOrgUnit(globalOrgTree.children()[i]); - if( orgIsMine(org, loc) ) { - node = org; - break; - } + var kids = globalOrgTree.children(); + if (kids) { + for( var i = 0; i < kids.length; i++ ) { + var org = findOrgUnit(kids[i]); + if( orgIsMine(org, loc) ) { + node = org; + break; + } + } } } } @@ -773,6 +884,14 @@ function _rdetailRows(node) { if(!isXUL() && !isTrue(node.opac_visible())) return; + if (orgHiding) { + if (isTrue( findOrgType(node.ou_type()).can_have_vols() )) { + if ( ! orgIsMine( orgHiding.org, node, orgHiding.depth ) ) { + return; + } + } + } + var row = copyRow.cloneNode(true); row.id = "cp_info_" + node.id(); @@ -801,8 +920,11 @@ function _rdetailRows(node) { } else { node = globalOrgTree; } - for( var c in node.children() ) - _rdetailRows(node.children()[c]); + var kids = node.children(); + if (kids) { + for( var c = 0; c < kids.length; c++ ) + _rdetailRows(kids[c]); + } } function rdetailCNPrint(orgid, cn) { @@ -822,6 +944,8 @@ function _rdetailBuildInfoRows(r) { removeChildren(copyRowParent); + orgHiding = checkOrgHiding(); + _rdetailRows(); var summary = r.getResultObject(); @@ -1005,39 +1129,23 @@ function _rdetailSortStatuses(a, b) { } /** - * Check for a Google Book preview + * Check for a Google Book preview after the main page loads */ function rdetailCheckForGBPreview() { if (!rdetailGoogleBookPreview) return; - searchForGBPreview( cleanISBN(record.isbn()) ); + dojo.addOnLoad(function() { + searchForGBPreview( cleanISBN(record.isbn()) ); + }); } /** * - * @param {DOM object} query The form element containing the - * input parameters "isbns" + * @param {DOM object} isbn The form element containing the input parameters "isbns" */ function searchForGBPreview( isbn ) { - - // Delete any previous Google Booksearch JSON queries. - var GBPJsonScript = document.getElementById("GBPJsonScript"); - if (GBPJsonScript) { - GBPJsonScript.parentNode.removeChild(GBPJsonScript); - } - - // Add a script element with the src as the user's Google Booksearch query. - // JSON output is specified by including the alt=json-in-script argument - // and the callback function is also specified as a URI argument. - var GBPScriptElement = document.createElement("script"); - - GBPScriptElement.setAttribute("id", "GBPJsonScript"); - GBPScriptElement.setAttribute("src", - "http://books.google.com/books?bibkeys=" + - isbn + "&jscmd=viewapi&callback=GBPreviewCallback"); - GBPScriptElement.setAttribute("type", "text/javascript"); - - // make the request to Google booksearch - document.documentElement.firstChild.appendChild(GBPScriptElement); + dojo.require("dojo.io.script"); + dojo.io.script.get({"url": "https://www.google.com/jsapi"}); + dojo.io.script.get({"url": "http://books.google.com/books", "content": { "bibkeys": isbn, "jscmd": "viewapi", "callback": "GBPreviewCallback"}}); } /** @@ -1046,7 +1154,7 @@ function searchForGBPreview( isbn ) { * * XXX I18N of text needed * - * @param {JSON} booksInfo is the JSON object pulled from the Google books service. + * @param {JSON} GBPBookInfo is the JSON object pulled from the Google books service. */ function GBPreviewCallback(GBPBookInfo) { var GBPreviewDiv = document.getElementById("rdetail_preview_div"); @@ -1061,11 +1169,6 @@ function GBPreviewCallback(GBPBookInfo) { } if ( GBPBook.preview != "noview" ) { - if ( GBPBook.preview == 'full' ) { - setText( $('rdetail_preview_link'), $('rdetail_preview_full_text').innerHTML ); - $('rdetail_preview_link_a').title = $('rdetail_preview_title').innerHTML; - } - // Add a button below the book cover image to load the preview. GBPBadge = document.createElement( 'img' ); GBPBadge.src = 'http://books.google.com/intl/en/googlebooks/images/gbs_preview_button1.gif'; @@ -1104,3 +1207,81 @@ function rdetailGBPViewerLoadCallback() { GBPViewer.load('ISBN:' + cleanISBN(record.isbn()) ); } + +function rdetailDrawExpandedHoldings(anchor, bibid, type) { + var offsets = {"basic": 0, "index": 0, "supplement": 0}; + var limit = 10; /* XXX give user control over this? */ + var target_id = "holding_type_" + type; + var target = dojo.byId(target_id); + + anchor.innerHTML = "[-]"; + anchor.oldonclick = anchor.onclick; + anchor.onclick = function() { + anchor.onclick = anchor.oldonclick; + anchor.innerHTML = "[+]"; + dojo.empty(target); + }; + + function _load() { + dojo.empty(target); + fieldmapper.standardRequest( + ["open-ils.serial", + "open-ils.serial.received_siss.retrieve.by_bib.atomic"], { + "params": [bibid, {"offset": offsets[type], "limit": limit}], + "async": true, + "oncomplete": function(r) { + try { + if (msg = r.recv().content()) { /* sic, assignment */ + if (!msg.length) return; + offsets[type] += msg.length; + var table = dojo.create("table", null, target); + dojo.forEach( + msg, function(o) { + var tr = dojo.create("tr", null, table); + dojo.create( + "td", { + "innerHTML": o.issuance.label(), + "style": {"paddingLeft": "3em"} + }, tr + ); + + if (!o.has_units) return; + /* can't place holds if no units */ + var td = dojo.create("td", null, tr); + dojo.create( + "a", { + "href":"javascript:void(0);", + "style": {"marginLeft": "1.5em"}, + "onclick": function() { + holdsDrawEditor({ + "type": "I", + "issuance": o.issuance.id() + }); + }, + "innerHTML": "[" + + opac_strings.PLACE_HOLD + "]" + }, td + ); + } + ); + if (msg.length == limit) { + dojo.create("br", null, target); + dojo.create( + "a", { + "href": "javascript:void(0);", + "innerHTML": + "[" + opac_strings.MORE + "]", + "onclick": _load + }, target + ); + } + } + } catch (E) { + void(0); + } + } + } + ); + } + _load(); +} diff --git a/web/opac/skin/default/js/result_common.js b/web/opac/skin/default/js/result_common.js index 5553d8bbbf..11bb9208c2 100644 --- a/web/opac/skin/default/js/result_common.js +++ b/web/opac/skin/default/js/result_common.js @@ -1,3 +1,6 @@ +dojo.require('openils.BibTemplate'); +dojo.requireLocalization("openils.opac", "opac"); +var opac_strings = dojo.i18n.getLocalization("openils.opac", "opac"); var recordsHandled = 0; var recordsCache = []; @@ -7,7 +10,7 @@ var googleBooksLink = true; var enableHoldsOnAvailable = false; var enableExtraSearchesLowHits = false; var localProxyPrefix = ''; - + /* an array of the extra services to which we want to direct people, in order of priority: Properties: url: will be proxied via localProxyPrefix @@ -27,6 +30,7 @@ var externalSearchServices = [ } ]; + var resultFetchAllRecords = false; var resultCompiledSearch = null; @@ -35,9 +39,7 @@ if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) { G.evt.result.hitCountReceived.push(resultSetHitInfo); G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts); G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts); - G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects, - resultDrawAuthors, resultDrawSeries, function(){unHideMe($('result_info_2'))}, - fetchGoogleBooksLink); + G.evt.result.allRecordsReceived.push( function(){unHideMe($('result_info_2'))}, fetchGoogleBooksLink, fetchChiliFreshReviews); attachEvt('result','lowHits',resultLowHits); attachEvt('result','zeroHits',resultZeroHits); @@ -103,6 +105,8 @@ function resultCollectSearchIds( type, method, handler ) { if(getAvail()) args.available = 1; + if(getFacet()) args.facets = getFacet(); + if(getAudience()) args.audience = getAudience().split(/,/); if(getLitForm()) args.lit_form = getLitForm().split(/,/); if(getLanguage()) args.language = getLanguage().split(/,/); @@ -115,6 +119,12 @@ function resultCollectSearchIds( type, method, handler ) { _debug('Search args: ' + js2JSON(args)); _debug('Raw query: ' + getTerm()); + var atomfeed = "/opac/extras/opensearch/1.1/" + findOrgUnit(args.org_unit).shortname() + "/atom-full/" + getStype() + '?searchTerms=' + getTerm(); + if (args.facets) { atomfeed += ' ' + args.facets; } + if (sort) { atomfeed += '&searchSort=' + sort; } + if (sortdir) { atomfeed += '&searchSortDir=' + sortdir; } + dojo.create('link', {"rel":"alternate", "href":atomfeed, "type":"application/atom+xml"}, dojo.query('head')[0]); + var req = new Request(method, args, getTerm(), 1); req.callback(handler); req.send(); @@ -232,9 +242,9 @@ function resultLowHits() { resultSuggestSearchClass(); - if (enableExtraSearchesLowHits) { - resultSuggestExtraSearches(); - } + if (enableExtraSearchesLowHits) { + resultSuggestExtraSearches(); + } if(getTerm()) resultExpandSearch(); /* advanced search */ } @@ -275,14 +285,13 @@ function resultZeroHits() { showCanvas(); unHideMe($('result_low_hits')); unHideMe($('result_zero_hits_msg')); - //if(getTerm()) resultExpandSearch(); /* advanced search */ } function resultExpandSearch() { var top = findOrgDepth(globalOrgTree); - /* We don't want to expand the scope to Everywhere in Conifer, that's just confusing */ + /* We don't want to expand the scope to Everywhere in Conifer, that's just confusing */ if(getDepth() == top || getDepth() - 1 == top) return; unHideMe($('low_hits_expand_range')); var par = $('low_hits_expand_link').parentNode; @@ -489,6 +498,7 @@ function unhideGoogleBooksLink (data) { zero based position the record should have in the display table */ function resultDisplayRecord(rec, pos, is_mr) { + fieldmapper.IDL.load(['mvr']); if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */ recordsHandled++; recordsCache.push(rec); @@ -509,6 +519,27 @@ function resultDisplayRecord(rec, pos, is_mr) { } } + if (currentISBN && chilifresh && chilifresh != '(none)') { + var cfrow = $n(r, "chilifreshReview"); + if (cfrow) { + removeCSSClass( cfrow, 'hide_me' ); + } + var cflink = $n(r, "chilifreshReviewLink"); + if (cflink) { + cflink.setAttribute( + 'id', + 'isbn_' + currentISBN + ); + } + var cfdiv = $n(r, "chilifreshReviewResult"); + if (cfdiv) { + cfdiv.setAttribute( + 'id', + 'chili_review_' + currentISBN + ) + } + } + /* try { var rank = parseFloat(ranks[pos + getOffset()]); @@ -525,8 +556,9 @@ function resultDisplayRecord(rec, pos, is_mr) { var title_link = $n(r, config.names.result.item_title); var author_link = $n(r, config.names.result.item_author); + var onlyrec; if( is_mr ) { - var onlyrec = onlyrecord[ getOffset() + pos ]; + onlyrec = onlyrecord[ getOffset() + pos ]; if(onlyrec) { buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec); @@ -538,7 +570,7 @@ function resultDisplayRecord(rec, pos, is_mr) { pic.parentNode.setAttribute("href", buildOPACLink(args)); title_link.setAttribute("href", buildOPACLink(args)); title_link.appendChild(text(normalize(truncate(rec.title(), 65)))); - + } else { buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id()); @@ -550,7 +582,12 @@ function resultDisplayRecord(rec, pos, is_mr) { pic.parentNode.setAttribute("href", buildOPACLink(args)); } + unHideMe($n(r,'place_hold_span')); + $n(r,'place_hold_link').setAttribute( + 'href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"M"});'); + } else { + onlyrec = rec.doc_id(); buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id()); buildTitleDetailLink(rec, title_link); @@ -566,6 +603,7 @@ function resultDisplayRecord(rec, pos, is_mr) { $n(r,'place_hold_link').setAttribute( 'href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});'); + } buildSearchLink(STYPE_AUTHOR, rec.author(), author_link); @@ -598,6 +636,25 @@ function resultDisplayRecord(rec, pos, is_mr) { resultBuildFormatIcons( r, rec, is_mr ); + var bt_params = { + sync : false, + root : r, + subObjectLimit : 10, + org_unit : findOrgUnit(getLocation()).shortname(), + depth : getDepth() + }; + + if (!is_mr) { + bt_params = dojo.mixin( bt_params, { record : onlyrec } ); + } else { + bt_params = dojo.mixin( bt_params, { metarecord : onlyrec } ); + } + + if (findOrgType(findOrgUnit(getLocation()).ou_type()).can_have_vols()) + unHideMe($n(r,'local_callnumber_list')); + + new openils.BibTemplate( bt_params ).render(); + unHideMe(r); runEvt("result", "recordDrawn", rec.doc_id(), title_link); @@ -670,6 +727,12 @@ function fetchGoogleBooksLink () { } } +function fetchChiliFreshReviews() { + if (chilifresh && chilifresh != '(none)') { + try { chili_init(); } catch(E) { console.log(E + '\n'); } + } +} + function resultPageIsDone(pos) { return (recordsHandled == getDisplayCount() @@ -690,7 +753,17 @@ function resultAddCopyCounts(rec, pagePosition) { var ccell = $n(countsrow, config.names.result.count_cell); var nodes = orgNodeTrail(findOrgUnit(getLocation())); - var node = nodes[0]; + var start_here = 0; + var orgHiding = checkOrgHiding(); + if (orgHiding) { + for (var i = 0; i < nodes.length; i++) { + if (orgHiding.depth == findOrgDepth(nodes[i])) { + start_here = i; + } + } + } + + var node = nodes[start_here]; var type = findOrgType(node.ou_type()); ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition; ccell.title = type.opac_label(); @@ -711,10 +784,10 @@ function resultAddCopyCounts(rec, pagePosition) { resultCCHeaderApplied = true; } - if(nodes[1]) { + if(nodes[start_here+1]) { - var x = 1; - var d = findOrgDepth(nodes[1]); + var x = start_here+1; + var d = findOrgDepth(nodes[start_here+1]); var d2 = findOrgDepth(nodes[nodes.length -1]); for( var i = d; i <= d2 ; i++ ) { @@ -790,31 +863,34 @@ function resultDisplayCopyCounts(rec, pagePosition, copy_counts) { var i = 0; var metarecords = (findCurrentPage() == MRESULT); + while(copy_counts[i] != null) { var cell = $("copy_count_cell_" + i +"_" + pagePosition); - var cts = copy_counts[i]; - cell.appendChild(text(cts.available + " / " + cts.count)); - - if (!enableHoldsOnAvailable && (i == (copy_counts.length - 1))) { - var resultTBody = findParentByNodeName(cell, 'TBODY'); - if (cts.available == 0 && cts.count > 0 && !metarecords) { - dojo.query('[name="place_hold_span"]', resultTBody).removeClass('hide_me'); - } else { - dojo.query('[name="place_hold_span"]', resultTBody).addClass('hide_me'); + if (cell) { + var cts = copy_counts[i]; + cell.appendChild(text(cts.available + " / " + cts.count)); + + if (!enableHoldsOnAvailable && (i == (copy_counts.length - 1))) { + var resultTBody = findParentByNodeName(cell, 'TBODY'); + if (cts.available == 0 && cts.count > 0 && !metarecords) { + dojo.query('[name="place_hold_span"]', resultTBody).removeClass('hide_me'); + } else { + dojo.query('[name="place_hold_span"]', resultTBody).addClass('hide_me'); + } } - } - if(isXUL()) { - /* here we style opac-invisible records for xul */ - - if( cts.depth == 0 ) { - if(cts.transcendant == null && cts.unshadow == 0) { - _debug("found an opac-shadowed record: " + rec.doc_id()); - var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode; - if( cts.count == 0 ) - addCSSClass( row, 'no_copies' ); - else - addCSSClass( row, 'shadowed' ); + if(isXUL()) { + /* here we style opac-invisible records for xul */ + + if( cts.depth == 0 ) { + if(cts.transcendant == null && cts.unshadow == 0) { + _debug("found an opac-shadowed record: " + rec.doc_id()); + var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode; + if( cts.count == 0 ) + addCSSClass( row, 'no_copies' ); + else + addCSSClass( row, 'shadowed' ); + } } } } @@ -822,3 +898,4 @@ function resultDisplayCopyCounts(rec, pagePosition, copy_counts) { } } +