source: main/trunk/greenstone3/web/interfaces/default/js/document_scripts.js@ 35171

Last change on this file since 35171 was 35171, checked in by kjdon, 3 years ago

when we are doing search term highlighting, and we want it in the section titles, need to make sure that p.s argument is added, otherwise the ajax calls don't know that they should be doing search term highlighting

  • Property svn:executable set to *
File size: 37.9 KB
Line 
1/** Javascript file for viewing documents */
2
3/** NOTE, this file uses inline templates which look for httpPath, assocfilepath, Source, Thumb, Title metadata. These need to be added into any xsl file that uses this javascript (using <gsf:metadata name="xx" hidden="true"/> if they are not already being collected. */
4
5var _imageZoomEnabled = false;
6// Choose which types of filtering you want: sectionnum, or sectiontitle or both
7var _filter_on_types = ["sectiontitle", "sectionnum"];
8
9// are titles numeric match?
10var _filter_title_numeric = false;
11
12var _linkCellMap = new Array();
13var _onCells = new Array();
14
15var curHLNum = null;
16
17/*Array to store init states of metadata fields and text*/
18var editableInitStates = new Array();
19/*Array to store last states of metadata fields and text*/
20var editableLastStates = new Array();
21
22// REDEFINING map-scripts::_scrollThroughDefault to be FALSE for document view
23_scrollThroughDefault = false; // TODO: should this even be there in doc view? And if so, what should it scroll through, all markers/shapes in coll or only those in doc?
24
25/********************
26* EXPANSION SCRIPTS *
27********************/
28
29
30function getTextForSection(sectionID, callback)
31{
32 if(!callback)
33 {
34 console.log("Cannot get text as the callback function is not defined");
35 }
36
37 var template = "";
38 template += '<xsl:template match="/">';
39 template += '<text>';
40 template += '<xsl:for-each select="/page/pageResponse/document//documentNode[@nodeID = \'' + sectionID + '\']">';
41 template += '<xsl:call-template name="sectionContent"/>';
42 template += '</xsl:for-each>';
43 template += '</text>';
44 template += '</xsl:template>';
45
46 template = makeURLComponentSafe(template);
47
48 var hlCheckBox = document.getElementById("highlightOption");
49
50 var hl = "";
51 if(hlCheckBox)
52 {
53 if(hlCheckBox.checked)
54 {
55 hl = "on";
56 }
57 else
58 {
59 hl = "off";
60 }
61 }
62
63 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + sectionID + "?ed=1&hl=" + hl + "&ilt=" + template;
64 if (gs.cgiParams.p_s && gs.cgiParams.p_s.length > 0) {
65 url += "&p.s=" + gs.cgiParams.p_s;
66 }
67 if (gs.cgiParams.ck && gs.cgiParams.ck.length > 0) {
68 url += "&ck=" + gs.cgiParams.ck;
69 }
70
71
72
73 $.ajax(url)
74 .success(function(response)
75 {
76 if(response)
77 {
78 var textStart = response.indexOf(">", response.indexOf(">") + 1) + 1;
79 var textEnd = response.lastIndexOf("<");
80
81 if(textStart == 0 || textEnd == -1 || textEnd <= textStart)
82 {
83 callback("");
84 }
85
86 var text = response.substring(textStart, textEnd);
87 callback(text);
88 }
89 else
90 {
91 callback(null);
92 }
93 })
94 .error(function()
95 {
96 callback(null);
97 });
98}
99
100function getSubSectionsForSection(sectionID, callback)
101{
102 if(!callback)
103 {
104 console.log("Cannot get sub sections as the callback function is not defined");
105 }
106
107 var template = "";
108 template += '<xsl:template match="/">';
109 template += '<sections>';
110 template += '<xsl:for-each select="/page/pageResponse/document//documentNode[@nodeID = \'' + sectionID + '\']/documentNode">';
111 template += '<xsl:call-template name="wrapDocumentNodes"/>';
112 template += '</xsl:for-each>';
113 template += '</sections>';
114 template += '</xsl:template>';
115
116 template = makeURLComponentSafe(template);
117 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + sectionID + "?ilt=" + template;
118
119 if (gs.cgiParams.p_s && gs.cgiParams.p_s.length > 0) {
120 url += "&p.s=" + gs.cgiParams.p_s;
121 }
122
123 if(gs.documentMetadata.docType == "paged")
124 {
125 url += "&dt=hierarchy";
126 }
127
128 $.ajax(url)
129 .success(function(response)
130 {
131 if(response)
132 {
133 var sectionsStart = response.indexOf(">", response.indexOf(">") + 1) + 1;
134 var sectionsEnd = response.lastIndexOf("<");
135
136 if(sectionsStart == 0 || sectionsEnd == -1 || sectionsEnd <= sectionsStart)
137 {
138 callback(" ");
139 return;
140 }
141 else {
142 var sections = response.substring(sectionsStart, sectionsEnd);
143 callback(sections);
144 }
145 }
146 else
147 {
148 callback(null);
149 }
150 })
151 .error(function()
152 {
153 callback(null);
154 });
155}
156
157
158function toggleSection(sectionID, callback, tocDisabled)
159{
160 var docElem = gs.jqGet("doc" + sectionID);
161 var tocElem = gs.jqGet("toc" + sectionID);
162
163 var tocToggleElem = gs.jqGet("ttoggle" + sectionID);
164 var docToggleElem = gs.jqGet("dtoggle" + sectionID);
165
166 if(docElem.css("display") == "none")
167 {
168 if(tocToggleElem.length && !tocDisabled)
169 {
170 tocToggleElem.attr("src", gs.imageURLs.collapse);
171 }
172
173 if(tocElem.length && !tocDisabled)
174 {
175 tocElem.css("display", "block");
176 }
177
178 if(docElem.hasClass("noText"))
179 {
180 getTextForSection(sectionID, function(text)
181 {
182 if(text)
183 {
184 var nodeID = sectionID.replace(/\./g, "_");
185 if(text.search("wrap" + nodeID) != -1)
186 {
187 $("#zoomOptions").css("display", "");
188 $("#pagedImageOptions").css("display", "");
189 }
190 getSubSectionsForSection(sectionID, function(sections)
191 {
192 if(sections)
193 {
194 var textElem = gs.jqGet("doc" + sectionID);
195 textElem.html(text + sections);
196
197 docElem.removeClass("noText");
198 docElem.css("display", "block");
199 docToggleElem.attr("src", gs.imageURLs.collapse);
200
201 if(callback)
202 {
203 callback(true);
204 }
205
206 if(gs.jqGet("viewSelection").length)
207 {
208 changeView();
209 }
210 }
211 else
212 {
213 docToggleElem.attr("src", gs.imageURLs.expand);
214 if(callback)
215 {
216 callback(false);
217 }
218 }
219 });
220 }
221 else
222 {
223 docToggleElem.attr("src", gs.imageURLs.expand);
224 if(callback)
225 {
226 callback(false);
227 }
228 }
229 });
230
231 docToggleElem.attr("src", gs.imageURLs.loading);
232 }
233 else
234 {
235 docToggleElem.attr("src", gs.imageURLs.collapse);
236 docElem.css("display", "block");
237
238 if(callback)
239 {
240 callback(true);
241 }
242 }
243 }
244 else
245 {
246 docElem.css("display", "none");
247
248 //Use the page image if this is a leaf node and the chapter image if it not
249 docToggleElem.attr("src", gs.imageURLs.expand);
250
251 if(tocToggleElem.length)
252 {
253 tocToggleElem.attr("src", gs.imageURLs.expand);
254 }
255
256 if(tocElem.length)
257 {
258 tocElem.css("display", "none");
259 }
260
261 if(callback)
262 {
263 callback(true);
264 }
265 }
266}
267
268function scrollToTop()
269{
270 $('html, body').stop().animate({scrollTop: 0}, 1000);
271}
272
273function scrollNextHightlight()
274{
275 if (curHLNum == null)
276 {
277 curHLNum = 0;
278 } else
279 {
280 curHLNum++;
281 }
282 var hlNode = $("span[class$='ermHighlight']:eq(" + curHLNum + ")");
283 if (hlNode.length == 0)
284 {
285 curHLNum = 0;
286 hlNode = $("span[class$='ermHighlight']:eq(" + curHLNum + ")");
287 }
288 if (hlNode.length != 0)
289 {
290 var topVal = $(hlNode).offset().top - 50;
291 $('html, body').stop().animate({scrollTop: topVal}, 1000);
292 }
293}
294
295function scrollPrevHightlight()
296{
297 if (curHLNum == null)
298 {
299 curHLNum = $("span[class$='ermHighlight']").length - 1;
300 } else
301 {
302 curHLNum--;
303 }
304 var hlNode = $("span[class$='ermHighlight']:eq(" + curHLNum + ")");
305 if (hlNode.length == 0)
306 {
307 curHLNum = $("span[class$='ermHighlight']").length - 1;
308 hlNode = $("span[class$='ermHighlight']:eq(" + curHLNum + ")");
309 }
310 if (hlNode.length != 0)
311 {
312 var topVal = $(hlNode).offset().top - 50;
313 $('html, body').stop().animate({scrollTop: topVal}, 1000);
314 }
315}
316
317function focusSection(sectionID, level, tocDisabled)
318{
319 expandAndExecute(sectionID, level, tocDisabled, function()
320 {
321 var topVal = $(document.getElementById("doc" + sectionID)).offset().top - 50;
322 $('html, body').stop().animate({scrollTop: topVal}, 1000);
323 });
324}
325function focusAnchor(sectionID, level, tocDisabled, anchor)
326{
327 expandAndExecute(sectionID, level, tocDisabled, function()
328 {
329 var target = document.getElementById(anchor);
330 if (!target){
331 target = document.getElementsByName(anchor)[0];
332 }
333 var topVal = $(target).offset().top - 50;
334 $('html, body').stop().animate({scrollTop: topVal}, 1000);
335 window.location.hash = anchor;
336 });
337}
338function expandAndExecute(sectionID, level, tocDisabled, executeAfter)
339{
340 if(!level)
341 {
342 level = 0;
343 }
344 var parts = sectionID.split(".");
345 if(level >= parts.length)
346 {
347 if (executeAfter) {
348 executeAfter();
349 }
350 document.getElementById("gs_content").style.cursor = "default";
351 return;
352 }
353
354 var idToExpand = "";
355 for(var i = 0; i < level + 1; i++)
356 {
357 if(i > 0)
358 {
359 idToExpand += ".";
360 }
361
362 idToExpand += parts[i];
363 }
364
365 if(!isSectionExpanded(idToExpand))
366 {
367 document.getElementById("gs_content").style.cursor = "progress";
368 toggleSection(idToExpand, function(success)
369 {
370 if(success)
371 {
372 expandAndExecute(sectionID, level + 1, tocDisabled, executeAfter);
373 }
374 }, tocDisabled);
375 }
376 else
377 {
378 expandAndExecute(sectionID, level + 1, tocDisabled, executeAfter);
379 }
380}
381function expandOrCollapseAll(expand)
382{
383 var divs = $("div");
384 var startCounter = 0;
385 var endCounter = 0;
386
387 for(var i = 0; i < divs.length; i++)
388 {
389 if($(divs[i]).attr("id") && $(divs[i]).attr("id").search(/^doc/) != -1)
390 {
391 var id = $(divs[i]).attr("id").replace(/^doc(.*)/, "$1");
392 if(isSectionExpanded(id) != expand)
393 {
394 //Don't collapse the top level
395 if(!expand && id.indexOf(".") == -1)
396 {
397 continue;
398 }
399 startCounter++;
400
401 var toggleFunction = function(tid)
402 {
403 toggleSection(tid, function(success)
404 {
405 if(success)
406 {
407 endCounter++;
408 }
409 else
410 {
411 setTimeout(function(){toggleFunction(tid)}, 500);
412 }
413 });
414 }
415 toggleFunction(id);
416 }
417 }
418 }
419
420 if(startCounter != 0)
421 {
422 var checkFunction = function()
423 {
424 if(startCounter == endCounter)
425 {
426 expandOrCollapseAll(expand);
427 }
428 else
429 {
430 setTimeout(checkFunction, 500);
431 }
432 }
433 checkFunction();
434 }
435}
436
437function loadTopLevelPage(callbackFunction, customURL)
438{
439 var url;
440 if(customURL)
441 {
442 url = customURL;
443 }
444 else
445 {
446 url = gs.xsltParams.library_name + "?a=d&c=" + gs.cgiParams.c + "&excerptid=gs-document";
447 if(gs.cgiParams.d && gs.cgiParams.d.length > 0)
448 {
449 url += "&d=" + gs.cgiParams.d.replace(/([^.]*)\..*/, "$1");
450 // in case we are doing search term highlighting, want p.s here too (e/g/ p.s=TextQuery)
451 if (gs.cgiParams.p_s && gs.cgiParams.p_s.length > 0) {
452 url += "&p.s=" + gs.cgiParams.p_s;
453 }
454
455 }
456 else if(gs.cgiParams.href && gs.cgiParams.href.length > 0)
457 {
458 url += "&d=&alb=1&rl=1&href=" + gs.cgiParams.href;
459 }
460 }
461
462 $.ajax(url)
463 .success(function(response)
464 {
465 if(response)
466 {
467 var targetElem = $("#gs-document");
468 var docStart = response.indexOf(">") + 1;
469 var docEnd = response.lastIndexOf("<");
470 var doc = response.substring(docStart, docEnd);
471
472 targetElem.html(doc);
473
474 if(callbackFunction)
475 {
476 callbackFunction();
477 }
478 }
479 })
480 .error(function()
481 {
482 setTimeout(function(){loadTopLevelPage(callbackFunction, customURL);}, 1000);
483 });
484}
485
486function retrieveFullTableOfContentsSuccess(newTOCElem)
487{
488 var tocStart = newTOCElem.indexOf(">") + 1;
489 var tocEnd = newTOCElem.lastIndexOf("<");
490
491 var newTOC = newTOCElem.substring(tocStart, tocEnd);
492
493 //Add the "Expand document"/"Collapse document" links
494 //newTOC = "<table style=\"width:100%; text-align:center;\"><tr><td><a href=\"javascript:expandOrCollapseAll(true);\">"+gs.text.doc.expand_doc+"</a></td><td><a href=\"javascript:expandOrCollapseAll(false);\">"+gs.text.doc.collapse_doc+"</a></td></tr></table>" + newTOC;
495 //newTOC = "<table style=\"width:100%; text-align:center;\"><tr><td><a href=\""+window.location.href+"?ed=1\">"+gs.text.doc.expand_doc+"</a></td><td><a href=\""+window.location.href+"?ed=0\">"+gs.text.doc.collapse_doc+"</a></td></tr></table>" + newTOC;
496
497 //Collapse the TOC
498 newTOC = newTOC.replace(/display:block/g, "display:none");
499 newTOC = newTOC.replace(/display:none/, "display:block");
500 newTOC = newTOC.replace(/images\/collapse/g, "images/expand");
501
502 var tocElem = $("#tableOfContents");
503 tocElem.html(newTOC);
504
505 gs.variables.tocLoaded = true;
506}
507
508function retrieveFullTableOfContentsSuccessClientSideXSLT(newTOCElem)
509{
510 $('#client-side-xslt-ajax').remove();
511 retrieveFullTableOfContentsSuccess(newTOCElem)
512}
513
514function retrieveFullTableOfContents()
515{
516 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "?excerptid=tableOfContents&ec=1";
517 if(gs.cgiParams.d && gs.cgiParams.d.length > 0)
518 {
519 url += "&a=d&d=" + gs.cgiParams.d;
520 }
521 else if(gs.cgiParams.href && gs.cgiParams.href.length > 0)
522 {
523 url += "&a=d&d=&alb=1&rl=1&href=" + gs.cgiParams.href;
524 }
525 // later on we want this arg p.s so we can keep search term highlighting for expand document link
526 if (gs.cgiParams.p_s && gs.cgiParams.p_s.length > 0) {
527 url += "&p.s=" + gs.cgiParams.p_s;
528 }
529 if (gs.cgiParams.ck && gs.cgiParams.ck.length > 0) {
530 url += "&ck=" + gs.cgiParams.ck;
531 }
532
533 if (gs.xsltParams.use_client_side_xslt == "true") { // note xsltParams are of type string, so test needs to be in quotes
534 url += "&callback=retrieveFullTableOfContentsSuccessClientSideXSLT"; // used in client-side-xslt.js, in combination with 'excerptid'
535 $('<iframe src="'+url+'" id="client-side-xslt-ajax" tabindex="-1" style="position: absolute; width: 0px; height: 0px; border: none;"></iframe>').appendTo('body');
536 }
537 else {
538 $.ajax(url)
539 .success(retrieveFullTableOfContentsSuccess)
540 .error(function() {
541 setTimeout(retrieveFullTableOfContents, 1000);
542 });
543 }
544}
545
546function isSectionExpanded(sectionID)
547{
548 var docElem = gs.jqGet("doc" + sectionID);
549
550 if(docElem.css("display") === "block")
551 {
552 return true;
553 }
554 return false;
555}
556
557function minimizeSidebar()
558{
559 var toc = $("#contentsArea");
560 var maxLink = $("#sidebarMaximizeButton");
561 var minLink = $("#sidebarMinimizeButton");
562
563 if(toc.length)
564 {
565 toc.css("display", "none");
566 }
567
568 maxLink.css("display", "block");
569 minLink.css("display", "none");
570}
571
572function maximizeSidebar()
573{
574 var coverImage = $("#coverImage");
575 var toc = $("#contentsArea");
576 var maxLink = $("#sidebarMaximizeButton");
577 var minLink = $("#sidebarMinimizeButton");
578
579 if(coverImage.length)
580 {
581 coverImage.css("display", "block");
582 }
583
584 if(toc.length)
585 {
586 toc.css("display", "block");
587 }
588
589 maxLink.css("display", "none");
590 minLink.css("display", "block");
591}
592
593function extractFilteredPagesToOwnDocument()
594{
595 var oids = new Array();
596 var filtered = $(".pageSliderCol:visible a").each(function()
597 {
598 var hrefString = $(this).attr("href");
599 var oidStart = hrefString.indexOf(".") + 1;
600 var oidFinish = hrefString.indexOf("'", oidStart + 1);
601
602 oids.push(hrefString.substring(oidStart, oidFinish));
603 });
604
605 var sectionString = "[";
606 for(var i = 0; i < oids.length; i++)
607 {
608 sectionString += "\"" + oids[i] + "\"";
609 if(i < oids.length - 1)
610 {
611 sectionString += ",";
612 }
613 }
614 sectionString += "]";
615
616 var url = "cgi-bin/document-extract.pl?a=extract-archives-doc&c=" + gs.cgiParams.c + "&d=" + gs.cgiParams.d + "&json-sections=" + sectionString + "&site=" + gs.xsltParams.site_name;// + "&json-metadata=[{"metaname":"dc.Title","metavalue":"All Black Rugy Success","metamode":"accumulate"]"
617 $("#extractDocButton").attr("disabled", "disabled").html("Extracting document...");
618 $.ajax(url)
619 .success(function(response)
620 {
621 $("#extractDocButton").html("Building collection...");
622 gs.functions.buildCollections([gs.cgiParams.c], function()
623 {
624 $("#extractDocButton").removeAttr("disabled").html("Extract these pages to document");
625 });
626 })
627 .error(function()
628 {
629 $("#extractDocButton").removeAttr("disabled").html("Extract these pages to document");
630 });
631}
632
633/**********************
634* PAGED-IMAGE SCRIPTS *
635**********************/
636
637function changeView()
638{
639 var viewList = $("#viewSelection");
640 var currentVal = viewList.val();
641
642 var view;
643 if(currentVal == "Image view")
644 {
645 setImageVisible(true);
646 setTextVisible(false);
647 view = "image";
648 }
649 else if(currentVal == "Text view")
650 {
651 setImageVisible(false);
652 setTextVisible(true);
653 view = "text";
654 }
655 else
656 {
657 setImageVisible(true);
658 setTextVisible(true);
659 view = "";
660 }
661
662 var url = gs.xsltParams.library_name + "?a=d&view=" + view + "&c=" + gs.cgiParams.c;
663 $.ajax(url);
664}
665
666function setImageVisible(visible)
667{
668 $("div").each(function()
669 {
670 if($(this).attr("id") && $(this).attr("id").search(/^image/) != -1)
671 {
672 $(this).css("display", (visible ? "block" : "none"));
673 }
674 });
675}
676
677function setTextVisible(visible)
678{
679 $("div").each(function()
680 {
681 if($(this).attr("id") && $(this).attr("id").search(/^text/) != -1)
682 {
683 $(this).css("display", (visible ? "block" : "none"));
684 }
685 });
686}
687
688function retrieveTableOfContentsAndTitles()
689{
690 var ilt = "";
691 ilt += '<xsl:template match="/">';
692 ilt += '<xsl:for-each select="/page/pageResponse/document/documentNode">';
693 ilt += '<xsl:call-template name="documentNodeTOC"/>';
694 ilt += '</xsl:for-each>';
695 ilt += '</xsl:template>';
696
697 ilt = makeURLComponentSafe(ilt);
698
699 var url = gs.xsltParams.library_name + "?a=d&ec=1&c=" + gs.cgiParams.c + "&d=" + gs.cgiParams.d + "&ilt=" + ilt;
700
701 if (gs.cgiParams.p_s && gs.cgiParams.p_s.length > 0) {
702 url += "&p.s=" + gs.cgiParams.p_s;
703 }
704
705 $.ajax(url)
706 .success(function(response)
707 {
708 var tableOfContents = $("#tableOfContents");
709 tableOfContents.append(response);
710 replaceLinksWithSlider();
711
712 var loading = $("#tocLoadingImage");
713 loading.remove();
714 })
715 .error(function()
716 {
717 setTimeout(function(){retrieveTableOfContentsAndTitles();}, 1000);
718 });
719}
720
721
722function replaceLinksWithSlider()
723{
724 var tableOfContents = $("#tableOfContents");
725 var leafSections = new Array();
726 var liElems = tableOfContents.find("li").each(function()
727 {
728 var section = $(this);
729 var add = true;
730 for(var j = 0; j < leafSections.length; j++)
731 {
732 if(leafSections[j] == undefined){continue;}
733
734 var leaf = $(leafSections[j]);
735 if(leaf.attr("id").search(section.attr("id")) != -1)
736 {
737 add = false;
738 }
739
740 if(section.attr("id").search(leaf.attr("id")) != -1)
741 {
742 delete leafSections[j];
743 }
744 }
745
746 if(add)
747 {
748 leafSections.push(section);
749 }
750 });
751
752 for(var i = 0 ; i < leafSections.length; i++)
753 {
754 if(leafSections[i] == undefined){continue;}
755
756 leafSections[i].css("display", "none");
757 var links = leafSections[i].find("a");
758
759 var widget = new SliderWidget(links);
760 leafSections[i].before(widget.getElem());
761 }
762
763 //Disable all TOC toggles
764 var imgs = $("img").each(function()
765 {
766 var currentImage = $(this);
767 if(currentImage.attr("id") && currentImage.attr("id").search(/^ttoggle/) != -1)
768 {
769 currentImage.attr("onclick", "");
770 currentImage.click(function()
771 {
772 var sliderDiv = currentImage.parents("table").first().next();
773 if(sliderDiv.is(":visible"))
774 {
775 sliderDiv.hide();
776 }
777 else
778 {
779 sliderDiv.show();
780 }
781 });
782 }
783 else if(currentImage.attr("id") && currentImage.attr("id").search(/^dtoggle/) != -1)
784 {
785 currentImage.attr("onclick", currentImage.attr("onclick").replace(/\)/, ", null, true)"));
786 }
787 });
788}
789
790
791function SliderWidget(_links)
792{
793 //****************
794 //MEMBER VARIABLES
795 //****************
796
797 //The container for the widget
798 var _mainDiv = $("<div>");
799 _mainDiv.attr("class", "ui-widget-content pageSlider");
800
801 //The table of images
802 var _linkTable = $("<table>");
803 _mainDiv.append(_linkTable);
804
805 //The image row of the table
806 var _linkRow = $("<tr>");
807 _linkTable.append(_linkRow);
808
809 //The list of titles we can search through
810 var _titles = new Array();
811
812 //Keep track of the slider position
813 var _prevScroll = 0;
814
815 //****************
816 //PUBLIC FUNCTIONS
817 //****************
818
819 //Function that returns the widget element
820 this.getElem = function()
821 {
822 return _mainDiv;
823 }
824
825 //*****************
826 //PRIVATE FUNCTIONS
827 //*****************
828
829 // _filter_on_types can be "sectionnum", "sectiontitle"
830 var setUpFilterButtons = function() {
831
832 var button_div = $("#filterOnButtons");
833 button_div.onclick = doFiltering;
834 button_div.html("radio");
835 if (_filter_on_types.length == 0) {
836 _filter_on_types = ["sectionnum", "sectiontitle"];
837 }
838 else if (_filter_on_types.length == 1) {
839 if (_filter_on_types[0] == "sectionnum") {
840 button_div.html("(<input type='radio' name='filterOn' value='num' checked>"+gs.text.doc.filter.pagenum+"</input>)");
841 } else {
842 button_div.html("(<input type='radio' name='filterOn' value='title' checked>"+gs.text.doc.filter.title+"</input>)");
843 }
844 } else {
845 // should be both options
846 button_div.html("<input type='radio' name='filterOn' value='num' checked>"+gs.text.doc.filter.pagenum+"</input><input type='radio' name='filterOn' value='title'>"+gs.text.doc.filter.title+"</input>");
847 }
848}
849
850 var doFiltering = function () {
851 if (typeof _titles == "undefined") {
852 return;
853 }
854
855 var filter_string = $("#filterText").val();
856 var filter_type = $('input[name="filterOn"]:checked').val();
857
858 var index = 2; // section num
859 var numeric_match = true;
860 if (filter_type == "title") {
861 index = 3;
862 if (_filter_title_numeric != true) {
863 numeric_match = false;
864 }
865
866 }
867 var values = filter_string.split(",");
868
869 var matchingTitles = new Array();
870
871 for (var l = 0; l < values.length; l++)
872 {
873 var currentValue = values[l].replace(/^ +/g, "").replace(/ +$/g, "");
874 if (numeric_match) {
875 var isRange = (currentValue.search(/^\d+-\d+$/) != -1);
876 if (isRange) {
877 var firstNumber = Number(currentValue.replace(/(\d+)-\d+/, "$1"));
878 var secondNumber = Number(currentValue.replace(/\d+-(\d+)/, "$1"));
879 if(firstNumber <= secondNumber)
880 {
881 for(var i = firstNumber; i <= secondNumber; i++)
882 {
883 var numString = i + "";
884 for(var j = 0; j < _titles.length; j++) {
885 var currentTitle = _titles[j];
886 if(currentTitle[index] == numString) {
887 matchingTitles.push(currentTitle);
888 break; // assume no titles are the same
889 }
890 }
891 }
892 }
893 } // if isRange
894 else {
895 for(var j = 0; j < _titles.length; j++) {
896 if (_titles[j][index]==currentValue) {
897 matchingTitles.push(_titles[j]);
898 break; // assume no titles are the same
899 }
900 }
901
902 }
903
904 } else { // not numeric match.
905 // need to do a search
906 for(var i = 0; i < _titles.length; i++)
907 {
908 var currentTitle = _titles[i];
909 if(currentTitle[index].toLowerCase().search(currentValue.toLowerCase().replace(/\./g, "\\.")) != -1)
910 {
911 matchingTitles.push(currentTitle);
912 }
913 }
914 }
915 } // for each value from filter string
916
917 // set all to hide...
918 for(var i = 0; i < _titles.length; i++)
919 {
920 $(_titles[i][1].cell).css("display", "none");
921 }
922
923 // .. then display the matching ones
924 for(var i = 0; i < matchingTitles.length; i++)
925 {
926 $(matchingTitles[i][1].cell).css("display", "table-cell");
927 }
928 } // end doFiltering() function
929
930 var setUpFilterBox = function()
931 {
932 var filter = $("#filterText");
933
934 filter.keyup(function()
935 {
936 doFiltering();
937 });
938 }
939
940 var getImage = function(page, attemptNumber)
941 {
942 var href = page.getAttribute("href");
943 var startHREF = href.indexOf("'") + 1;
944 var endHREF = href.indexOf("'", startHREF);
945 var nodeID = href.substring(startHREF, endHREF);
946 href = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + nodeID;
947
948 var template = '';
949 template += '<xsl:template match="/">';
950 template += '<html>';
951 template += '<img>';
952 template += '<xsl:attribute name="src">';
953 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/collection/metadataList/metadata[@name = 'httpPath']\"/>";
954 template += '<xsl:text>/index/assoc/</xsl:text>';
955 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/metadataList/metadata[@name = 'assocfilepath']\"/>";
956 template += '<xsl:text>/</xsl:text>';
957 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document//documentNode[@nodeID = '" + nodeID + "']/metadataList/metadata[@name = 'Thumb']\"/>";
958 template += '</xsl:attribute>';
959 template += '</img>';
960 template += '<p>';
961 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/documentNode/metadataList/metadata[@name = 'Title']\"/>";
962 template += '</p>';
963 template += '</html>';
964 template += '</xsl:template>';
965 template = makeURLComponentSafe(template);
966 var url = href + "?noText=1&ilt=" + template;
967
968 $.ajax(url)
969 .success(function(text)
970 {
971 var hrefStart = text.indexOf("src=\"") + 5;
972 if(hrefStart == -1)
973 {
974 page.isLoading = false;
975 page.noImage = true;
976 $(page.image).attr("src", gs.imageURLs.blank);
977 return;
978 }
979 var hrefEnd = text.indexOf("\"", hrefStart);
980 var href = text.substring(hrefStart, hrefEnd);
981
982 var image = $("<img>");
983 image.load(function()
984 {
985 $(page.link).html("");
986 $(page.link).append(image);
987 page.isLoading = false;
988 page.imageLoaded = true;
989 });
990 image.error(function()
991 {
992 if(!attemptNumber || attemptNumber < 3)
993 {
994 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
995 }
996 else
997 {
998 page.isLoading = false;
999 page.noImage = true;
1000 image.attr("src", gs.imageURLs.blank);
1001 }
1002 });
1003 image.attr("src", href);
1004
1005 var titleStart = text.indexOf("<p>") + 3;
1006 var titleEnd = text.indexOf("</p>");
1007 var title = text.substring(titleStart, titleEnd);
1008 })
1009 .error(function()
1010 {
1011 page.failed = true;
1012 if(!attemptNumber || attemptNumber < 3)
1013 {
1014 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
1015 }
1016 else
1017 {
1018 var image = $("<img>", {"src": gs.imageURLs.blank});
1019 $(page.link).html("");
1020 $(page.link).append(image);
1021 page.isLoading = false;
1022 page.noImage = true;
1023 }
1024 });
1025 }
1026
1027 var startCheckFunction = function()
1028 {
1029 var checkFunction = function(forced)
1030 {
1031 //Don't bother checking if we haven't scrolled very far
1032 if(Math.abs(_mainDiv.scrollLeft() - _prevScroll) > 100 || forced)
1033 {
1034 _prevScroll = _mainDiv.scrollLeft();
1035 _checking = true;
1036 var widgetLeft = _mainDiv.offset().left;
1037 var widgetRight = widgetLeft + _mainDiv.width();
1038
1039 var visiblePages = new Array();
1040 for(var i = 0; i < _links.length; i++)
1041 {
1042 var current = _links[i].cell;
1043 var currentLeft = current.offset().left;
1044 var currentRight = currentLeft + current.width();
1045
1046 if(currentRight > widgetLeft && currentLeft < widgetRight)
1047 {
1048 visiblePages.push(_links[i]);
1049 }
1050 }
1051
1052 for(var i = 0; i < visiblePages.length; i++)
1053 {
1054 var page = visiblePages[i];
1055 if(!page || page.imageLoaded || page.noImage || page.isLoading)
1056 {
1057 continue;
1058 }
1059
1060 page.isLoading = true;
1061 getImage(page);
1062 }
1063 _checking = false;
1064 }
1065 }
1066
1067 setTimeout(checkFunction, 250);
1068 setInterval(function(){checkFunction(true)}, 2000);
1069 _mainDiv.scroll(checkFunction);
1070 }
1071
1072 //***********
1073 //CONSTRUCTOR
1074 //***********
1075
1076 for(var i = 0; i < _links.length; i++)
1077 {
1078 var col = $("<td>");
1079 _linkRow.append(col);
1080 col.addClass("pageSliderCol");
1081 _links[i].cell = col;
1082
1083 var link = $("<a>");
1084 col.append(link);
1085 _links[i].link = link;
1086 var href = $(_links[i]).attr("href");
1087 link.attr("href", href.replace(/\)/, ", 0, true)"));
1088
1089 if(!_linkCellMap[href])
1090 {
1091 _linkCellMap[href] = new Array();
1092 }
1093 _linkCellMap[href].push(_links[i]);
1094
1095 var loadingText = $("<p>Loading image</p>");
1096 link.append(loadingText);
1097
1098 var image = $("<img>");
1099 link.append(image);
1100 image.attr("src", gs.imageURLs.loading);
1101 _links[i].image = image;
1102
1103 var title = $(_links[i]).html();
1104 var t_section = "";
1105 var t_title = "";
1106 if (title.search(/tocSectionNumber/) != -1)
1107 {
1108 var matching_regex = /<span class=\"tocSectionNumber\">([0-9]+)<\/span>[\s\S]*<span class=\"tocSectionTitle\">(.+)<\/span>$/mg;
1109 var matches_array = matching_regex.exec(title);
1110 if (matches_array != null && matches_array.length == 3) {
1111 t_section = matches_array[1];
1112 t_title = matches_array[2];
1113 }
1114 }
1115
1116 _titles.push([title, _links[i], t_section, t_title]);
1117
1118 col.append($("<br>"));
1119 col.append(title);
1120 }
1121
1122 setUpFilterBox();
1123 setUpFilterButtons();
1124 startCheckFunction();
1125 }
1126
1127/***********************
1128* HIGHLIGHTING SCRIPTS *
1129***********************/
1130function swapHighlight(imageClicked)
1131{
1132 var hlCheckbox = $("#highlightOption");
1133 if(imageClicked)
1134 {
1135 // toggle the state of the checkbox
1136 $(hlCheckbox).prop("checked", !$(hlCheckbox).prop("checked"));
1137 }
1138 var from;
1139 var to;
1140 if(hlCheckbox.prop("checked"))
1141 {
1142 from = "noTermHighlight";
1143 to = "termHighlight";
1144 }
1145 else
1146 {
1147 from = "termHighlight";
1148 to = "noTermHighlight";
1149 }
1150
1151 var spans = $("span").each(function()
1152 {
1153 if($(this).hasClass(from))
1154 {
1155 $(this).removeClass(from);
1156 $(this).addClass(to);
1157 }
1158 });
1159}
1160
1161/**************************
1162* REALISTIC BOOKS SCRIPTS *
1163**************************/
1164
1165function bookInit()
1166{
1167 loadBook();
1168 hideText();
1169 showBook();
1170 swapLinkJavascript(false);
1171}
1172
1173function hideText()
1174{
1175 $("#gs-document-text").css("visibility", "hidden");
1176}
1177
1178function showText()
1179{
1180 $("#gs-document-text").css("visibility", "visible");
1181}
1182
1183function hideBook()
1184{
1185 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "hidden", "height": "0px"});
1186}
1187
1188function showBook()
1189{
1190 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "visible", "height": "600px"});
1191}
1192
1193function swapLinkJavascript(rbOn)
1194{
1195 var option = $("#rbOption");
1196 var optionImage = $("#rbOptionImage");
1197
1198 if(rbOn)
1199 {
1200 option.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1201 optionImage.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1202 $(option).prop("checked", false);
1203 }
1204 else
1205 {
1206 option.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1207 optionImage.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1208 $(option).prop("checked", true);
1209 }
1210}
1211
1212function loadBook()
1213{
1214 var doc_url = document.URL;
1215 doc_url = doc_url.replace(/(&|\?)book=[a-z]+/gi,'');
1216 doc_url += '&book=flashxml';
1217
1218 var img_cover = gs.collectionMetadata.httpPath + '/index/assoc/' + gs.documentMetadata.assocfilepath + '/cover.jpg';
1219
1220 var flash_plug_html = ""
1221 flash_plug_html += '<OBJECT align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" \n';
1222 flash_plug_html += ' height="600px" id="bookObject" swLiveConnect="true" \n';
1223 flash_plug_html += ' codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" \n';
1224 flash_plug_html += ' width="70%">\n';
1225 flash_plug_html += ' <PARAM name="allowScriptAccess" value="always" />\n';
1226 flash_plug_html += ' <PARAM name="movie" value="Book.swf';
1227 flash_plug_html += '?src_image=' + escape(img_cover);
1228 flash_plug_html += '&doc_url=' + escape(doc_url);
1229 flash_plug_html += '" />\n';
1230 flash_plug_html += ' <PARAM name="quality" value="high" />\n';
1231 flash_plug_html += ' <PARAM name="bgcolor" value="#FFFFFF" />\n';
1232 flash_plug_html += ' <EMBED align="middle" \n';
1233 flash_plug_html += ' allowScriptAccess="always" swLiveConnect="true" \n';
1234 flash_plug_html += ' bgcolor="#FFFFFF" height="600px" name="Book" \n';
1235 flash_plug_html += ' pluginspage="http://www.macromedia.com/go/getflashplayer" \n';
1236 flash_plug_html += ' quality="high" id="bookEmbed"\n';
1237 flash_plug_html += ' src="Book.swf';
1238 flash_plug_html += '?src_image=' + escape(img_cover);
1239 flash_plug_html += '&doc_url=' + escape(doc_url);
1240 flash_plug_html += '"\n';
1241 flash_plug_html += ' type="application/x-shockwave-flash" width="70%" />\n';
1242 flash_plug_html += '</OBJECT>\n';
1243 $("#bookdiv").html(flash_plug_html);
1244}
1245
1246
1247
1248
1249/********************
1250* SLIDESHOW SCRIPTS *
1251********************/
1252
1253function showSlideShow()
1254{
1255 if(!($("#gs-slideshow").length))
1256 {
1257 var slideshowDiv = $("<div>", {id:"gs-slideshow", style:"height:100%;"});
1258 var loadingImage = $("<img>", {src:gs.imageURLs.loading});
1259 slideshowDiv.append(loadingImage);
1260
1261 $.blockUI({message: $(slideshowDiv), css:{top: "5%", left: "5%", width: "90%", height: "90%", overflow: "auto", cursor: "auto"}});
1262
1263 retrieveImagesForSlideShow(function(imageIDArray)
1264 {
1265 loadingImage.hide();
1266 if(imageIDArray && imageIDArray.length > 0)
1267 {
1268 var imageURLs = new Array();
1269 for(var i = 0; i < imageIDArray.length; i++)
1270 {
1271 if(imageIDArray[i].source && imageIDArray[i].source.search(/.*\.(gif|jpg|jpeg|png)$/) != -1)
1272 {
1273 imageURLs.push(gs.collectionMetadata.httpPath + "/index/assoc/" + gs.documentMetadata.assocfilepath + "/" + imageIDArray[i].source);
1274 }
1275 }
1276 new SlideShowWidget(slideshowDiv, imageURLs, imageIDArray);
1277 }
1278 });
1279 }
1280 else
1281 {
1282 $("#gs-slideshow").show();
1283 }
1284}
1285
1286function retrieveImagesForSlideShow(callback)
1287{
1288 var template = "";
1289 template += '<xsl:template match="/">';
1290 template += '<images>[';
1291 template += '<xsl:for-each select="//documentNode">';
1292 template += '<xsl:text disable-output-escaping="yes">{"source":"</xsl:text><gsf:metadata name="Source"/><xsl:text disable-output-escaping="yes">",</xsl:text>';
1293 template += '<xsl:text disable-output-escaping="yes">"id":"</xsl:text><xsl:value-of select="@nodeID"/><xsl:text disable-output-escaping="yes">"}</xsl:text>';
1294 template += '<xsl:if test="position() != count(//documentNode)">,</xsl:if>';
1295 template += '</xsl:for-each>';
1296 template += ']</images>';
1297 template += '</xsl:template>';
1298 template = makeURLComponentSafe(template);
1299 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + gs.cgiParams.d + "?ed=1&ilt=" + template;
1300
1301 $.ajax(
1302 {
1303 url:url,
1304 success: function(data)
1305 {
1306 var startIndex = data.indexOf(">", data.indexOf(">") + 1) + 1;
1307 var endIndex = data.lastIndexOf("<");
1308 var arrayString = data.substring(startIndex, endIndex);
1309 var imageIDArray = eval(arrayString);
1310
1311 callback(imageIDArray);
1312 }
1313 });
1314}
1315
1316function SlideShowWidget(mainDiv, images, idArray)
1317{
1318 var _inTransition = false;
1319 var _images = new Array();
1320 var _mainDiv = mainDiv;
1321 var _imageDiv = $("<div>", {id:"ssImageDiv", style:"height:95%; overflow:auto;"});
1322 var _navDiv = $("<div>", {style:"height:5%;"});
1323 var _nextButton = $("<img>", {src:gs.imageURLs.next, style:"float:right; cursor:pointer;"});
1324 var _prevButton = $("<img>", {src:gs.imageURLs.prev, style:"float:left; cursor:pointer; display:none;"});
1325 var _closeLink = $("<a href=\"javascript:$.unblockUI()\">Close Slideshow</a>");
1326 var _clearDiv = $("<div>", {style:"clear:both;"});
1327 var _currentIndex = 0;
1328
1329 _navDiv.append(_nextButton);
1330 _navDiv.append(_closeLink);
1331 _navDiv.append(_prevButton);
1332 _navDiv.append(_clearDiv);
1333 _mainDiv.append(_navDiv);
1334 _mainDiv.append(_imageDiv);
1335
1336 for(var i = 0; i < images.length; i++)
1337 {
1338 _images.push($("<img>", {src:images[i], "class":"slideshowImage"}));
1339 }
1340
1341 if(_images.length < 2)
1342 {
1343 _nextButton.css("display", "none");
1344 }
1345
1346 _imageDiv.append(_images[0]);
1347
1348 this.nextImage = function()
1349 {
1350 if(!_inTransition)
1351 {
1352 _inTransition = true;
1353 if((_currentIndex + 1) < _images.length)
1354 {
1355 _prevButton.css("display", "");
1356 if(_currentIndex + 1 == _images.length - 1)
1357 {
1358 _nextButton.css("display", "none");
1359 }
1360
1361 _imageDiv.fadeOut(500, function()
1362 {
1363 _imageDiv.empty();
1364 _imageDiv.append(_images[_currentIndex + 1]);
1365 _currentIndex++;
1366 _imageDiv.fadeIn(500, function()
1367 {
1368 _inTransition = false;
1369 });
1370 });
1371 }
1372 else
1373 {
1374 _inTransition = false;
1375 }
1376 }
1377 }
1378
1379 this.prevImage = function()
1380 {
1381 if(!_inTransition)
1382 {
1383 _inTransition = true;
1384 if((_currentIndex - 1) >= 0)
1385 {
1386 _nextButton.css("display", "");
1387 if(_currentIndex - 1 == 0)
1388 {
1389 _prevButton.css("display", "none");
1390 }
1391
1392 _imageDiv.fadeOut(500, function()
1393 {
1394 _imageDiv.empty();
1395 _imageDiv.append(_images[_currentIndex - 1]);
1396 _currentIndex--;
1397 _imageDiv.fadeIn(500, function()
1398 {
1399 _inTransition = false;
1400 });
1401 });
1402 }
1403 else
1404 {
1405 _inTransition = false;
1406 }
1407 }
1408 }
1409
1410 var getRootFilenameFromURL = function(url)
1411 {
1412 var urlSegments = url.split("/");
1413 var filename = urlSegments[urlSegments.length - 1];
1414 return filename.replace(/_thumb\..*$/, "");
1415 }
1416
1417 var setLink = function(currentLink, index)
1418 {
1419 $(currentLink).click(function()
1420 {
1421 _inTransition = true;
1422 _currentIndex = index;
1423 _imageDiv.fadeOut(500, function()
1424 {
1425 _imageDiv.empty();
1426 _imageDiv.append(_images[_currentIndex]);
1427 _imageDiv.fadeIn(500, function()
1428 {
1429 _inTransition = false;
1430 });
1431 });
1432 });
1433 }
1434
1435 var sliderLinks = $(".pageSliderCol a");
1436 for(var i = 0; i < sliderLinks.length; i++)
1437 {
1438 var currentLink = sliderLinks[i];
1439 var id = $(currentLink).attr("href").split("'")[1];
1440
1441 for(var j = 0; j < idArray.length; j++)
1442 {
1443 if(idArray[j].id == id)
1444 {
1445 var image = idArray[j].source;
1446
1447 for(var l = 0; l < images.length; l++)
1448 {
1449 var filename = getRootFilenameFromURL(images[l]);
1450 if (filename == image)
1451 {
1452 setLink(currentLink, l);
1453 break;
1454 }
1455 }
1456
1457 break;
1458 }
1459 }
1460 }
1461
1462 _nextButton.click(this.nextImage);
1463 _prevButton.click(this.prevImage);
1464}
Note: See TracBrowser for help on using the repository browser.