}
# --------------------------------------------------------------------------
-# PINES Customization - Removed calls for toc, anotes, excerpt, reviews.
-# Also removed checks for summary xml and json, only left html.
+
+sub toc_html {
+ my( $self, $key ) = @_;
+ return $self->send_html(
+ $self->fetch_content('toc.html', $key));
+}
+
+sub toc_xml {
+ my( $self, $key ) = @_;
+ return $self->send_xml(
+ $self->fetch_content('toc.xml', $key));
+}
+
+sub toc_json {
+ my( $self, $key ) = @_;
+ 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->send_html(
+ $self->fetch_content('dbchapter.html', $key));
+}
+
+sub excerpt_xml {
+ my( $self, $key ) = @_;
+ return $self->send_xml(
+ $self->fetch_content('dbchapter.xml', $key));
+}
+
+sub excerpt_json {
+ my( $self, $key ) = @_;
+ 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); # Library Journal
+ $reviews{pwreview} = $self->fetch_content('pwreview.html', $key); # Publishers Weekly
+ $reviews{sljreview} = $self->fetch_content('sljreview.html', $key); # School Library Journal
+ $reviews{chreview} = $self->fetch_content('chreview.html', $key); # CHOICE Review
+ $reviews{blreview} = $self->fetch_content('blreview.html', $key); # Booklist Review
+ $reviews{hbreview} = $self->fetch_content('hbreview.html', $key); # Horn Book Review
+ $reviews{kireview} = $self->fetch_content('kireview.html', $key); # Kirkus Reviews
+ #$reviews{abreview} = $self->fetch_content('abreview.html', $key); # Bookseller+Publisher
+ #$reviews{criticasreview} = $self->fetch_content('criticasreview.html', $key); # Criticas
+ $reviews{nyreview} = $self->fetch_content('nyreview.html', $key); # New York Times
+ #$reviews{gdnreview} = $self->fetch_content('gdnreview.html', $key); # Guardian Review
+ #$reviews{doodysreview} = $self->fetch_content('doodysreview.html', $key); # Doody's Reviews
+
+ 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{sljreview} = $self->fetch_content('sljreview.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{kireview} = $self->fetch_content('kireview.xml', $key);
+ #$reviews{abreview} = $self->fetch_content('abreview.xml', $key);
+ #$reviews{criticasreview} = $self->fetch_content('criticasreview.xml', $key);
+ $reviews{nyreview} = $self->fetch_content('nyreview.xml', $key);
+ #$reviews{gdnreview} = $self->fetch_content('gdnreview.xml', $key);
+ #$reviews{doodysreview} = $self->fetch_content('doodysreview.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 summary_html {
$self->fetch_content('summary.html', $key));
}
+sub summary_xml {
+ my( $self, $key ) = @_;
+ return $self->send_xml(
+ $self->fetch_content('summary.xml', $key));
+}
+
+sub summary_json {
+ my( $self, $key ) = @_;
+ return $self->send_json(
+ $self->fetch_content('summary.xml', $key));
+}
+
# --------------------------------------------------------------------------
sub data_exists {
return 1;
}
-# --------------------------------------------------------------------------
-# PINES Customization - Removed send_json and send_xml, just left send_html and send_img.
-# --------------------------------------------------------------------------
+
+sub send_json {
+ my( $self, $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 = OpenSRF::Utils::JSON->perl2JSON($perl);
+ return { content_type => 'text/plain', content => $json };
+}
+
+sub send_xml {
+ my( $self, $xml ) = @_;
+ return 0 unless $self->data_exists($xml);
+ return { content_type => 'application/xml', content => $xml };
+}
sub send_html {
my( $self, $content ) = @_;
-<!-- PINES CUSTOMIZATION: Use complete Syndetic content in modal pop-up instead of screenscraped from page -->
-[% IF attrs.isbn_clean || attrs.upc || attrs.issn %]
- <style>
- /* The Syndetics Modal Stylesheet */
- .smodal {
- display: none; /* Hidden by default */
- position: fixed; /* Stay in place */
- z-index: 1; /* Sit on top */
- padding-top: 30px; /* Location of the box */
- left: 0;
- top: 0;
- width: 100%; /* Full width */
- height: 100%; /* Full height */
- overflow: auto; /* Enable scroll if needed */
- background-color: rgb(0,0,0); /* Fallback color */
- background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
- }
-
- /* Modal Content */
- .smodal-content {
- background-color: #fefefe;
- margin: auto;
- padding: 0px;
- border: 1px solid #888;
- width: 80%;
- }
-
- /* Iframe Content */
- .smodal-iframe {
- margin: auto;
- padding:0px;
- border: 0px;
- width: 100%;
- height: 600px;
- }
-
- /* Launch Button */
- .smodal-button {
- margin: 20px;
- }
-
- /* The Close Button */
- .close {
- color: #aaaaaa;
- float: right;
- font-size: 28px;
- font-weight: bold;
- }
-
- .close:hover,
- .close:focus {
- color: #000;
- text-decoration: none;
- cursor: pointer;
- }
-
- /* Responsive design for phones */
- @media only screen and (max-width: 1200px) {
-
- #sBtn {
- display:none;
- }
- }
- </style>
-
-
- <div class='rdetail_extras_div'>
- <button class="smodal-button" id="sBtn">See Summary, Reviews, and More from Syndetics</button>
- <div id="sModal" class="smodal">
- <div class="smodal-content">
- <span class="close">×</span>
- <iframe class="smodal-iframe" src="[%- ENV.OILS_SYNDETICS_URL -%]?isbn=[%- attrs.isbn_clean -%]/index.html&client=[%- ENV.OILS_SYNDETICS_ID -%]&type=rn12&close=no&popup=no&upc=[%- attrs.upc -%]&issn=[%- attrs.issn -%]">
- <p>[% l("This browser does not support this type of content.") %]</p>
- </iframe>
- </div>
- </div>
-
+<div class='rdetail_extras_div'>
+
+[%
+ ac_types = {
+ reviews => l('Reviews'),
+ anotes => l('Author Notes'),
+ toc => l('Table of Contents'),
+ excerpt => l('Excerpt'),
+ summary => l('Summary')
+ };
+
+ selected_type = CGI.param('ac');
+
+ # For each type of added content, render the link if it's known to have
+ # content, do not render the link if it's known to not have content. If
+ # the content status is unknown, render the link, but hide the link via CSS
+ # if dojo is enabled. If dojo is not enabled, render and display the link.
+%]
+
+ <div id='ac_tab_wrapper'>
+ [%
+ all_hidden = 1;
+ FOR type IN ac_types.keys;
+ tab_class = 'ac_tab';
+ SET tab_class = tab_class _ ' ac_tab_selected' IF type == selected_type;
+ IF ctx.added_content.$type.status != '2'; # no content
+ all_hidden = 0;
+ IF ctx.added_content.$type.status == '3' AND want_dojo; # status unknown
+ tab_class = tab_class _ ' hidden';
+ END %]
+ <div class="[% tab_class %]" id="ac:[% type %]">
+ <a href="[% mkurl('', {ac => type}) _ '#addedcontent' %]" rel="nofollow" vocab="">[% ac_types.$type %]</a>
+ </div>
+ [% END;
+ END;
+ %]
</div>
- <script>
- // Get the Syndetics modal
- var modal = document.getElementById('sModal');
-
- // Get the button that opens the modal
- var btn = document.getElementById("sBtn");
-
- // Get the <span> element that closes the modal
- var span = document.getElementsByClassName("close")[0];
-
- // When the user clicks the button, open the modal
- btn.onclick = function() {
- modal.style.display = "block";
- }
+ <div id='ac_content'>
+ <hr/>
+ [%
+ IF selected_type;
+ content = ctx.added_content.$selected_type.content;
+ IF content;
+ content;
+ ELSE;
+ l('No Content Available');
+ END;
+ ELSIF all_hidden;
+ l('No Content Available');
+ END;
+ %]
+ </div>
+</div>
- // When the user clicks on <span> (x), close the modal
- span.onclick = function() {
- modal.style.display = "none";
- }
- // When the user clicks anywhere outside of the modal, close it
- window.onclick = function(event) {
- if (event.target == modal) {
- modal.style.display = "none";
- }
- }
- </script>
-[% END %]
\ No newline at end of file
END;
# if no added content is available, hide the main tab.
- IF ctx.added_content.summary.status != '2'; # not available
+ # if any content is available, use the first tab as the default display tab.
+ default_ac = '';
+ IF !tab_is_active('addedcontent');
hide_ac = 1;
- ELSE;
- IF !attrs.isbn_clean && !attrs.upc && !attrs.issn;
- hide_ac = 1;
- ELSE;
- hide_ac = 0;
+ FOR type IN ctx.added_content.keys;
+ IF ctx.added_content.$type.status != '2'; # not available
+ hide_ac = 0;
+ END;
+ IF ctx.added_content.$type.status == '1';
+ SET default_ac = type UNLESS default_ac;
+ END;
END;
END;
<div class="rdetail_extras">
<div class="rdetail_extras_hr"></div>
<div class="rdetail_extras_link">
- [%
- IF tab_is_active(name) OR name == 'awards' OR name == 'addedcontent';
+ [%
+ IF tab_is_active(name);
href = mkurl('', {}, ['expand', 'ac']);
- arrow = arrow_down;
+ arrow = arrow_down;
+ ELSIF name == 'awards';
+ href = mkurl('', {}, ['expand', 'ac']);
+ arrow = arrow_down;
ELSE;
- href = mkurl('', {expand => name}) _ '#' _ name;
- arrow = arrow_right;
+ IF name == 'addedcontent' AND default_ac;
+ href = mkurl('', {expand => name, ac => default_ac}) _ '#' _ name;
+ ELSE;
+ IF name == 'addedcontent' AND default_ac;
+ href = mkurl('', {expand => name, ac => default_ac}) _ '#' _ name;
+ ELSIF name == 'awards';
+ href = mkurl('', {}, ['expand', 'ac']);
+ ELSE;
+ href = mkurl('', {expand => name}) _ '#' _ name;
+ END;
+ arrow = arrow_right;
+ END;
END;
%]
<a name='[% name %]' href='[% href %]' class="rdetail_extras_lbl" rel="nofollow" vocab="">[% arrow %] [% extra.label | html %]</a>
</div>
</div>
<div class='rdetail_extras_div'>
- [% IF tab_is_active(name) OR name == 'awards' OR name == 'addedcontent';
+ [% IF tab_is_active(name) OR name == 'awards';
IF name == 'marchtml';
ctx.marchtml;
ELSE;