moved to new added content layout
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 22 Jun 2006 18:16:37 +0000 (18:16 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 22 Jun 2006 18:16:37 +0000 (18:16 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@4705 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/WWW/AddedContent.pm
Open-ILS/src/perlmods/OpenILS/WWW/AddedContent/Syndetic.pm
Open-ILS/web/opac/common/js/RemoteRequest.js
Open-ILS/web/opac/common/js/added_content.js
Open-ILS/web/opac/skin/default/js/rdetail.js
Open-ILS/web/opac/skin/default/xml/rdetail/rdetail_extras.xml

index 73303dd..18aec2a 100644 (file)
@@ -60,6 +60,7 @@ sub handler {
        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);
 
index 9a8c23a..bd992a9 100644 (file)
@@ -4,6 +4,8 @@ use LWP::UserAgent;
 use OpenSRF::Utils::Logger qw/$logger/;
 use OpenSRF::Utils::SettingsParser;
 use JSON;
+use OpenSRF::EX qw/:try/;
+
 
 
 sub new {
@@ -27,50 +29,158 @@ sub userid {
 
 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);
@@ -79,26 +189,32 @@ sub handle_json {
        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;
 }
index abafcf8..30e2f9b 100644 (file)
@@ -116,7 +116,12 @@ RemoteRequest.prototype.abort = function() {
 
 /* constructs our XMLHTTPRequest object */
 RemoteRequest.prototype.buildXMLRequest = function() {
+       this.xmlhttp = buildXMLRequest();
+       return true;
+}
 
+
+function buildXMLRequest() {
        var x;
        try { 
                x = new ActiveXObject("Msxml2.XMLHTTP"); 
@@ -135,8 +140,7 @@ RemoteRequest.prototype.buildXMLRequest = function() {
                return null;
        }
 
-       this.xmlhttp = x;
-       return true;
+       return x;
 }
 
 
index 5bc352e..aefa404 100644 (file)
@@ -3,6 +3,50 @@
 * 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);
+}
+
+
index b7e7dd9..e4111d0 100644 (file)
@@ -140,7 +140,6 @@ function buildunAPISpan (span, type, id) {
         );
 }
 
-var rdeatilMarcFetched = false;
 function rdetailViewMarc(r,id) {
        hideMe($('rdetail_extras_loading'));
        $('rdetail_view_marc_box').innerHTML = r.getResultObject();
@@ -258,15 +257,16 @@ function _rdetailDraw(r) {
        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 ) {
@@ -331,16 +331,14 @@ function rdetailAddToBookbag() {
 }
 
 
-
-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'));
@@ -350,10 +348,11 @@ function rdetailShowExtra(type, args) {
        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": 
@@ -364,28 +363,23 @@ function rdetailShowExtra(type, args) {
                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": 
@@ -394,7 +388,7 @@ function rdetailShowExtra(type, args) {
                        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;
@@ -465,19 +459,28 @@ function rdetailShowCNBrowse( cn, loc, depth, fromOnclick ) {
        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'));
@@ -498,6 +501,7 @@ function rdetailShowReviews(r) {
        }
 }
 
+
 function rdetailShowTOC(r) {
        hideMe($('rdetail_extras_loading'));
        var resp = r.getResultObject();
@@ -518,7 +522,7 @@ function rdetailBuildInfoRows() {
        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() ) {
@@ -554,7 +558,6 @@ function _rdetailRows(node) {
        
                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()) {
@@ -578,19 +581,11 @@ function _rdetailRows(node) {
 }
 
 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 */
@@ -598,7 +593,6 @@ var localCNFound = false;
 var ctr = 0;
 function _rdetailBuildInfoRows(r) {
 
-       /* XXX */
        removeChildren(copyRowParent);
 
        _rdetailRows();
@@ -718,15 +712,7 @@ function rdetailSetPath(org, local) {
        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);
 }
 
index d3f9374..4d96e71 100644 (file)
                                        <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>