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

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