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

Last change on this file since 32127 was 32072, checked in by kjdon, 6 years ago

as we are now no longer including <gsf:metadata='all' in the xslt, we need to make sure Thumb metadata is loaded for teh document_scripts javascript. It doesn't work putting it into the inline template as this is processed after all the metadata is gotten for the page

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