my $path = $r->path_info;
child_init() unless $handler; # why isn't apache doing this for us?
+ return Apache2::Const::NOT_FOUND unless $handler;
my( undef, $data, $format, $key ) = split(/\//, $r->path_info);
use OpenSRF::Utils::Logger qw/$logger/;
use OpenSRF::Utils::SettingsParser;
use JSON;
+use OpenSRF::EX qw/:try/;
+
sub new {
sub toc_html {
my( $self, $key ) = @_;
- return $self->handle_html(
+ return $self->send_html(
$self->fetch_content('toc.html', $key));
}
sub toc_xml {
my( $self, $key ) = @_;
- return $self->handle_xml(
+ return $self->send_xml(
$self->fetch_content('toc.xml', $key));
}
sub toc_json {
my( $self, $key ) = @_;
- return $self->handle_json(
+ return $self->send_json(
$self->fetch_content('toc.xml', $key));
}
+# --------------------------------------------------------------------------
+
+sub anotes_html {
+ my( $self, $key ) = @_;
+ return $self->send_html(
+ $self->fetch_content('anotes.html', $key));
+}
+
+sub anotes_xml {
+ my( $self, $key ) = @_;
+ return $self->send_xml(
+ $self->fetch_content('anotes.xml', $key));
+}
+
+sub anotes_json {
+ my( $self, $key ) = @_;
+ return $self->send_json(
+ $self->fetch_content('anotes.xml', $key));
+}
+
# --------------------------------------------------------------------------
sub excerpt_html {
my( $self, $key ) = @_;
- return $self->handle_html(
+ return $self->send_html(
$self->fetch_content('dbchapter.html', $key));
}
sub excerpt_xml {
my( $self, $key ) = @_;
- return $self->handle_xml(
+ return $self->send_xml(
$self->fetch_content('dbchapter.xml', $key));
}
sub excerpt_json {
my( $self, $key ) = @_;
- return $self->handle_json(
+ return $self->send_json(
$self->fetch_content('dbchapter.xml', $key));
}
+# --------------------------------------------------------------------------
+
+sub reviews_html {
+ my( $self, $key ) = @_;
+
+ my %reviews;
+
+ $reviews{ljreview} = $self->fetch_content('ljreview.html', $key);
+ $reviews{pwreview} = $self->fetch_content('pwreview.html', $key);
+ $reviews{slreview} = $self->fetch_content('slreview.html', $key);
+ $reviews{chreview} = $self->fetch_content('chreview.html', $key);
+ $reviews{blreview} = $self->fetch_content('blreview.html', $key);
+ $reviews{hbreview} = $self->fetch_content('hbreview.html', $key);
+ $reviews{kirkreview} = $self->fetch_content('kirkreview.html', $key);
+
+ for(keys %reviews) {
+ if( ! $self->data_exists($reviews{$_}) ) {
+ delete $reviews{$_};
+ next;
+ }
+ $reviews{$_} =~ s/<!.*?>//og; # Strip any doctype declarations
+ }
+
+ return 0 if scalar(keys %reviews) == 0;
+
+ #my $html = "<div>";
+ my $html;
+ $html .= $reviews{$_} for keys %reviews;
+ #$html .= "</div>";
+
+ return $self->send_html($html);
+}
+
+# we have to aggregate the reviews
+sub reviews_xml {
+ my( $self, $key ) = @_;
+ my %reviews;
+
+ $reviews{ljreview} = $self->fetch_content('ljreview.xml', $key);
+ $reviews{pwreview} = $self->fetch_content('pwreview.xml', $key);
+ $reviews{slreview} = $self->fetch_content('slreview.xml', $key);
+ $reviews{chreview} = $self->fetch_content('chreview.xml', $key);
+ $reviews{blreview} = $self->fetch_content('blreview.xml', $key);
+ $reviews{hbreview} = $self->fetch_content('hbreview.xml', $key);
+ $reviews{kirkreview} = $self->fetch_content('kirkreview.xml', $key);
+
+ for(keys %reviews) {
+ if( ! $self->data_exists($reviews{$_}) ) {
+ delete $reviews{$_};
+ next;
+ }
+ # Strip the xml and doctype declarations
+ $reviews{$_} =~ s/<\?xml.*?>//og;
+ $reviews{$_} =~ s/<!.*?>//og;
+ }
+
+ return 0 if scalar(keys %reviews) == 0;
+
+ my $xml = "<reviews>";
+ $xml .= $reviews{$_} for keys %reviews;
+ $xml .= "</reviews>";
+
+ return $self->send_xml($xml);
+}
+
+
+sub reviews_json {
+ my( $self, $key ) = @_;
+ return $self->send_json(
+ $self->fetch_content('dbchapter.xml', $key));
+}
# --------------------------------------------------------------------------
-sub handle_json {
+
+sub data_exists {
+ my( $self, $data ) = @_;
+ return 0 if $data =~ m/<title>error<\/title>/iog;
+ return 1;
+}
+
+
+sub send_json {
my( $self, $xml ) = @_;
- return 0 if $xml =~ m/<title>error<\/title>/og;
- my $doc = XML::LibXML->new->parse_string($xml);
+ return 0 unless $self->data_exists($xml);
+ my $doc;
+
+ try {
+ $doc = XML::LibXML->new->parse_string($xml);
+ } catch Error with {
+ my $err = shift;
+ $logger->error("added content XML parser error: $err\n\n$xml");
+ $doc = undef;
+ };
+
return 0 unless $doc;
my $perl = OpenSRF::Utils::SettingsParser::XML2perl($doc->documentElement);
my $json = JSON->perl2JSON($perl);
return 1;
}
-sub handle_xml {
+sub send_xml {
my( $self, $xml ) = @_;
- return 0 if $xml =~ m/<title>error<\/title>/og;
+ return 0 unless $self->data_exists($xml);
print "Content-Type: application/xml\n\n";
print $xml;
return 1;
}
-
-sub handle_html {
+sub send_html {
my( $self, $content ) = @_;
- return 0 if $content =~ m/<title>error<\/title>/og;
-
- # Strip images because they lead to broken links
- $content =~ s#<img.*?>.*?</img>##iog;
- $content =~ s#<img.*?/>##iog;
- $content =~ s#<img.*?>##iog; # - it may not be valid xml
+ return 0 unless $self->data_exists($content);
+
+ # Hide anything that might contain a link since it will be broken
+ my $HTML = <<" HTML";
+ <div>
+ <style type='text/css'>
+ div.ac input, div.ac a[href],div.ac img, div.ac button { display: none; visibility: hidden }
+ </style>
+ <div class='ac'>
+ $content
+ </div>
+ </div>
+ HTML
print "Content-type: text/html\n\n";
- print $content;
+ print $HTML;
return 1;
}
/* constructs our XMLHTTPRequest object */
RemoteRequest.prototype.buildXMLRequest = function() {
+ this.xmlhttp = buildXMLRequest();
+ return true;
+}
+
+function buildXMLRequest() {
var x;
try {
x = new ActiveXObject("Msxml2.XMLHTTP");
return null;
}
- this.xmlhttp = x;
- return true;
+ return x;
}
* Ideally, this should point to some type of added content service.
* The example below uses Amazon... *use at own risk*
*/
+
function buildISBNSrc(isbn) {
- return "http://images.amazon.com/images/P/" + isbn + ".01._SCMZZZZZZZ_.jpg";
+ //return "http://images.amazon.com/images/P/" + isbn + ".01._SCMZZZZZZZ_.jpg";
+ //return '../../../../jackets/'+isbn;
+ return '../../../../extras/jacket/'+isbn;
}
+
+
+
+function acMakeURL(type, key) {
+ return '../../../../extras/ac/' + type + '/html/' + key;
+}
+
+
+function acCollectData( key, callback ) {
+ var context = { key : key, callback: callback, data : {} };
+ acCollectItem(context, 'reviews');
+ acCollectItem(context, 'toc');
+ acCollectItem(context, 'excerpt');
+ acCollectItem(context, 'anotes');
+}
+
+function acCheckDone(context) {
+ if( context.data.reviews && context.data.reviews.done &&
+ context.data.toc && context.data.toc.done &&
+ context.data.excerpt && context.data.excerpt.done &&
+ context.data.anotes && context.data.anotes.done ) {
+
+ if(context.callback) context.callback(context.data);
+ }
+}
+
+function acCollectItem(context, type) {
+ var req = buildXMLRequest();
+ req.open('GET', acMakeURL(type, context.key), true);
+ req.onreadystatechange = function() {
+ if( req.readyState == 4 ) {
+ context.data[type] = { done : true }
+ if( req.status != 404 )
+ context.data[type].html = req.responseText;
+ acCheckDone(context);
+ }
+ }
+ req.send(null);
+}
+
+
);
}
-var rdeatilMarcFetched = false;
function rdetailViewMarc(r,id) {
hideMe($('rdetail_extras_loading'));
$('rdetail_view_marc_box').innerHTML = r.getResultObject();
breq.callback( rdetailCheckDeleted );
breq.send();
- var req = new Request(FETCH_ACONT_SUMMARY, cleanISBN(record.isbn()));
- req.callback(rdetailHandleAddedContent);
- req.send();
-
resultBuildCaches( [ record ] );
resultDrawSubjects();
resultDrawSeries();
+
+ /* grab added content */
+ acCollectData(cleanISBN(record.isbn()), rdetailhandleAC);
}
+
+
function rdetailCheckDeleted(r) {
var br = r.getResultObject()[0];
if( br.deleted() == 1 ) {
}
-
-var rdetailTocFetched = false;
-var rdetailReviewFetched = false;
-var rdetailMarcFetched = false;
-
+var rdetailMarcFetched = false;
function rdetailShowExtra(type, args) {
hideMe($('rdetail_copy_info_div'));
hideMe($('rdetail_reviews_div'));
hideMe($('rdetail_toc_div'));
+ hideMe($('rdetail_anotes_div'));
+ hideMe($('rdetail_excerpt_div'));
hideMe($('rdetail_marc_div'));
hideMe($('cn_browse'));
hideMe($('rdetail_cn_browse_div'));
removeCSSClass($('rdetail_viewcn_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');
+ removeCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected');
removeCSSClass($('rdetail_annotation_link'), 'rdetail_extras_selected');
removeCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected');
- var req;
switch(type) {
case "copyinfo":
case "reviews":
addCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected');
unHideMe($('rdetail_reviews_div'));
- if(rdetailReviewFetched) break;
- unHideMe($('rdetail_extras_loading'));
- rdetailReviewFetched = true;
- req = new Request(FETCH_REVIEWS, cleanISBN(record.isbn()));
- req.callback(rdetailShowReviews);
- req.send();
break;
+
+ case "excerpt":
+ addCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected');
+ unHideMe($('rdetail_excerpt_div'));
+ break;
+
+ case "anotes":
+ addCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected');
+ unHideMe($('rdetail_anotes_div'));
+ break;
+
+
case "toc":
addCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected');
unHideMe($('rdetail_toc_div'));
- if(rdetailTocFetched) break;
- unHideMe($('rdetail_extras_loading'));
- rdetailTocFetched = true;
- if(localTOC) {
- hideMe($('rdetail_extras_loading'));
- $('rdetail_toc_div').innerHTML = record.toc().replace(/--/g, "<br/>");
- } else {
- req = new Request(FETCH_TOC, cleanISBN(record.isbn()));
- req.callback(rdetailShowTOC);
- req.send();
- }
break;
case "marc":
if(rdetailMarcFetched) return;
unHideMe($('rdetail_extras_loading'));
rdetailMarcFetched = true;
- req = new Request( FETCH_MARC_HTML, record.doc_id() );
+ var req = new Request( FETCH_MARC_HTML, record.doc_id() );
req.callback(rdetailViewMarc);
req.send();
break;
cnBrowseGo(cn, loc, depth);
}
-function rdetailHandleAddedContent(r) {
- var resp = r.getResultObject();
- if( resp.Review == 'true' ) unHideMe($('rdetail_reviews_link'));
- if( resp.TOC == 'true' ) {
+function rdetailhandleAC(data) {
+
+ if( data.reviews.html ) {
+ $('rdetail_review_container').innerHTML = data.reviews.html;
+ unHideMe($('rdetail_reviews_link'));
+ }
+
+ if( data.toc.html ) {
+ $('rdetail_toc_div').innerHTML = data.toc.html;
unHideMe($('rdetail_toc_link'));
- } else {
- if( record.toc() ) {
- localTOC = true;
- unHideMe($('rdetail_toc_link'));
- }
}
-}
+ if( data.excerpt.html ) {
+ $('rdetail_excerpt_div').innerHTML = data.excerpt.html;
+ unHideMe($('rdetail_excerpt_link'));
+ }
+
+ if( data.anotes.html ) {
+ $('rdetail_anotes_div').innerHTML = data.anotes.html;
+ unHideMe($('rdetail_anotes_link'));
+ }
+}
function rdetailShowReviews(r) {
hideMe($('rdetail_extras_loading'));
}
}
+
function rdetailShowTOC(r) {
hideMe($('rdetail_extras_loading'));
var resp = r.getResultObject();
req.send();
}
-/* pre-allocate the copy info table with all org units in correct order */
+/* pre-allocate the copy info table with all the appropriate org units in correct order */
function _rdetailRows(node) {
if( rdetailShowLocal && getLocation() != globalOrgTree.id() ) {
var p = libtd.getElementsByTagName('a')[0];
libtd.insertBefore(text(node.name()), p);
- //libtd.appendChild(text(node.name()));
libtd.setAttribute("style", "padding-left: " + ((findOrgDepth(node) - 1) * 9) + "px;");
if(!findOrgType(node.ou_type()).can_have_vols()) {
}
function rdetailCNPrint(orgid, cn) {
- /*
- var arr = cpdBuildPrintWindow( record, orgid);
- var win = arr[0];
- var div = arr[1];
- */
var div = cpdBuildPrintWindow( record, orgid);
var template = div.removeChild($n(div, 'cnrow'));
var rowNode = $("cp_info_" + orgid);
cpdStylePopupWindow(div);
openWindow(div.innerHTML);
- /*
- win.document.body.innerHTML = div.innerHTML;
- */
}
/* walk through the copy info and build rows where necessary */
var ctr = 0;
function _rdetailBuildInfoRows(r) {
- /* XXX */
removeChildren(copyRowParent);
_rdetailRows();
if( findOrgDepth(org) == 0 ) return;
var row = $("cp_info_" + org.id());
row.setAttribute("hasinfo", "1");
- /*
- if(local) {
- unHideMe(row);
- row.setAttribute("local", "1");
- }
- */
- /* XXX */
unHideMe(row);
-
rdetailSetPath(findOrgUnit(org.parent_ou()), local);
}
<a href='javascript:rdetailShowExtra("toc");'
class='classic_link'>Table of Contents</a>
</td>
+
+ <td id='rdetail_excerpt_link' class='hide_me rdetail_extras_td'
+ style='padding-right: 15px; padding-left: 15px;' >
+ <a href='javascript:rdetailShowExtra("excerpt");'
+ class='classic_link'>Excerpt</a>
+ </td>
+
+ <td id='rdetail_anotes_link' class='hide_me rdetail_extras_td'
+ style='padding-right: 15px; padding-left: 15px;' >
+ <a href='javascript:rdetailShowExtra("anotes");'
+ class='classic_link'>Author Notes</a>
+ </td>
+
+
<td id='rdetail_annotation_link' class='hide_me rdetail_extras_td'
style='padding-right: 15px; padding-left: 15px;' >
<a href='javascript:rdetailShowExtra("annotation");'
<!--#include virtual="rdetail_copyinfo.xml"-->
<div id='rdetail_reviews_div' class='rdetail_extras_div hide_me'>
+ <div id='rdetail_review_container'/>
+ <!--
<div id='rdetail_review_template' style='width: 100%;'>
<div name='review_header' style='width: 100%; padding: 15px; border: 1px solid #E0E0E0;'> </div>
<div name='review_text' style='width: 100%; padding: 15px; border: 1px solid #E0E0E0;'> </div>
</div>
+ -->
</div>
<div id='rdetail_toc_div' class='rdetail_extras_div hide_me'> </div>
+ <div id='rdetail_excerpt_div' class='rdetail_extras_div hide_me'> </div>
+
+ <div id='rdetail_anotes_div' class='rdetail_extras_div hide_me'> </div>
+
<div id='rdetail_marc_div' class='rdetail_extras_div hide_me'>
<div id='rdetail_view_marc_box'> </div>
</div>