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

Last change on this file since 26226 was 26226, checked in by sjm84, 12 years ago

Added an option to fix the table of contents to the right side of the page

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