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

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

Changed the slideshow to use more of the screen and reverting the page width change

  • Property svn:executable set to *
File size: 39.0 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
896 checkFunction();
897 setInterval(checkFunction, 1000);
898 }
899
900 //***********
901 //CONSTRUCTOR
902 //***********
903
904 for(var i = 0; i < _links.length; i++)
905 {
906 var col = document.createElement("TD");
907 _linkRow.appendChild(col);
908 col.setAttribute("class", "pageSliderCol");
909 _links[i].cell = col;
910
911 var link = document.createElement("A");
912 col.appendChild(link);
913 _links[i].link = link;
914 var href = _links[i].getAttribute("href");
915 link.setAttribute("href", href.replace(/\)/, ", 0, true)"));
916
917 if(!_linkCellMap[href])
918 {
919 _linkCellMap[href] = new Array();
920 }
921 _linkCellMap[href].push(_links[i]);
922
923 var image = document.createElement("IMG");
924 link.appendChild(image);
925 image.setAttribute("src", gs.imageURLs.loading);
926 _links[i].image = image;
927
928 var title = _links[i].innerHTML;
929 if(title.search(/^[^ ]+ [^ ]+$/) != -1)
930 {
931 var section = title.replace(/^([^ ]+) [^ ]+$/, "$1");
932 var page = title.replace(/^[^ ]+ ([^ ]+)$/, "$1");
933 if(page.search(/^[0-9]+$/) != -1)
934 {
935 title = page;
936 }
937 }
938 _titles.push([title, _links[i]]);
939
940 var text = document.createTextNode(title);
941 col.appendChild(text);
942 }
943
944 setUpFilterBox();
945 startCheckFunction();
946}
947
948/***********************
949* HIGHLIGHTING SCRIPTS *
950***********************/
951function swapHighlight()
952{
953 var hlCheckbox = document.getElementById("highlightOption");
954
955 var from;
956 var to;
957 if(hlCheckbox.checked)
958 {
959 from = "noTermHighlight";
960 to = "termHighlight";
961 }
962 else
963 {
964 from = "termHighlight";
965 to = "noTermHighlight";
966 }
967
968 var spans = document.getElementsByTagName("span");
969 for(var i = 0; i < spans.length; i++)
970 {
971 var currentSpan = spans[i];
972 if(currentSpan.getAttribute("class") == from)
973 {
974 currentSpan.setAttribute("class", to);
975 }
976 }
977}
978
979/**************************
980* REALISTIC BOOKS SCRIPTS *
981**************************/
982
983function bookInit()
984{
985 loadBook();
986 hideText();
987 showBook();
988 swapLinkJavascript(false);
989}
990
991function hideText()
992{
993 var textDiv = document.getElementById("gs-document-text");
994 textDiv.style.visibility = "hidden";
995}
996
997function showText()
998{
999 var textDiv = document.getElementById("gs-document-text");
1000 textDiv.style.visibility = "visible";
1001}
1002
1003function hideBook()
1004{
1005 var bookDiv = document.getElementById("bookdiv");
1006 bookDiv.style.visibility = "hidden";
1007 bookDiv.style.height = "0px";
1008
1009 var bookObject = document.getElementById("bookObject");
1010 bookObject.style.visibility = "hidden";
1011 bookObject.style.height = "0px";
1012
1013 var bookEmbed = document.getElementById("bookEmbed");
1014 bookEmbed.style.visibility = "hidden";
1015 bookEmbed.style.height = "0px";
1016}
1017
1018function showBook()
1019{
1020 var bookDiv = document.getElementById("bookdiv");
1021 bookDiv.style.visibility = "visible";
1022 bookDiv.style.height = "600px";
1023
1024 var bookObject = document.getElementById("bookObject");
1025 bookObject.style.visibility = "visible";
1026 bookObject.style.height = "600px";
1027
1028 var bookEmbed = document.getElementById("bookEmbed");
1029 bookEmbed.style.visibility = "visible";
1030 bookEmbed.style.height = "600px";
1031}
1032
1033function swapLinkJavascript(rbOn)
1034{
1035 var option = document.getElementById("rbOption");
1036 if(rbOn)
1037 {
1038 option.setAttribute("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1039 }
1040 else
1041 {
1042 option.setAttribute("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1043 }
1044}
1045
1046//Helper function to create param elements
1047function createParam(name, value)
1048{
1049 var param = document.createElement("PARAM");
1050 param.setAttribute("name", name);
1051 param.setAttribute("value", value);
1052 return param;
1053}
1054
1055function loadBook()
1056{
1057 var doc_url = document.URL;
1058 doc_url = doc_url.replace(/(&|\?)book=[a-z]+/gi,'');
1059 doc_url += '&book=flashxml';
1060
1061 var img_cover = gs.collectionMetadata.httpPath + '/index/assoc/' + gs.documentMetadata.assocfilepath + '/cover.jpg';
1062
1063 var flash_plug_html = ""
1064 flash_plug_html += '<OBJECT align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" \n';
1065 flash_plug_html += ' height="600px" id="bookObject" swLiveConnect="true" \n';
1066 flash_plug_html += ' codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" \n';
1067 flash_plug_html += ' width="70%">\n';
1068 flash_plug_html += ' <PARAM name="allowScriptAccess" value="always" />\n';
1069 flash_plug_html += ' <PARAM name="movie" value="Book.swf';
1070 flash_plug_html += '?src_image=' + escape(img_cover);
1071 flash_plug_html += '&doc_url=' + escape(doc_url);
1072 flash_plug_html += '" />\n';
1073 flash_plug_html += ' <PARAM name="quality" value="high" />\n';
1074 flash_plug_html += ' <PARAM name="bgcolor" value="#FFFFFF" />\n';
1075 flash_plug_html += ' <EMBED align="middle" \n';
1076 flash_plug_html += ' allowScriptAccess="always" swLiveConnect="true" \n';
1077 flash_plug_html += ' bgcolor="#FFFFFF" height="600px" name="Book" \n';
1078 flash_plug_html += ' pluginspage="http://www.macromedia.com/go/getflashplayer" \n';
1079 flash_plug_html += ' quality="high" id="bookEmbed"\n';
1080 flash_plug_html += ' src="Book.swf';
1081 flash_plug_html += '?src_image=' + escape(img_cover);
1082 flash_plug_html += '&doc_url=' + escape(doc_url);
1083 flash_plug_html += '"\n';
1084 flash_plug_html += ' type="application/x-shockwave-flash" width="70%" />\n';
1085 flash_plug_html += '</OBJECT>\n';
1086 var flash_div = document.getElementById("bookdiv");
1087 flash_div.innerHTML = flash_plug_html;
1088}
1089
1090function addEditMetadataLink(cell)
1091{
1092 var id = cell.getAttribute("id").substring(6);
1093 var metaTable = document.getElementById("meta" + id);
1094
1095 var row = cell.parentNode;
1096 var newCell = document.createElement("TD");
1097 newCell.setAttribute("style", "font-size:0.7em; padding:0px 10px");
1098 newCell.setAttribute("class", "editMetadataButton");
1099
1100 var linkSpan = document.createElement("SPAN");
1101 linkSpan.setAttribute("class", "ui-state-default ui-corner-all");
1102 linkSpan.setAttribute("style", "padding: 2px; float:left;");
1103
1104 var linkLabel = document.createElement("SPAN");
1105 linkLabel.innerHTML = "edit metadata";
1106 newCell.linkLabel = linkLabel;
1107 var linkIcon = document.createElement("SPAN");
1108 linkIcon.setAttribute("class", "ui-icon ui-icon-folder-collapsed");
1109 newCell.linkIcon = linkIcon;
1110
1111 var uList = document.createElement("UL");
1112 var labelItem = document.createElement("LI");
1113 var iconItem = document.createElement("LI");
1114 uList.appendChild(iconItem);
1115 uList.appendChild(labelItem);
1116 labelItem.appendChild(linkLabel);
1117 iconItem.appendChild(linkIcon);
1118
1119 uList.setAttribute("style", "outline: 0 none; margin:0px; padding:0px;");
1120 labelItem.setAttribute("style", "float:left; list-style:none outside none;");
1121 iconItem.setAttribute("style", "float:left; list-style:none outside none;");
1122
1123 var newLink = document.createElement("A");
1124 newLink.setAttribute("href", "javascript:;");
1125 newLink.onclick = function()
1126 {
1127 if(metaTable.style.display == "none")
1128 {
1129 linkLabel.innerHTML = "hide metadata";
1130 linkIcon.setAttribute("class", "ui-icon ui-icon-folder-open");
1131 metaTable.style.display = "block";
1132 metaTable.metaNameField.style.display = "inline";
1133 metaTable.addRowButton.style.display = "inline";
1134 }
1135 else
1136 {
1137 linkLabel.innerHTML = "edit metadata";
1138 linkIcon.setAttribute("class", "ui-icon ui-icon-folder-collapsed");
1139 metaTable.style.display = "none";
1140 metaTable.metaNameField.style.display = "none";
1141 metaTable.addRowButton.style.display = "none";
1142 }
1143 }
1144 newLink.appendChild(uList);
1145 linkSpan.appendChild(newLink);
1146 newCell.appendChild(linkSpan);
1147 row.appendChild(newCell);
1148
1149 addFunctionalityToTable(metaTable);
1150 metaTable.metaNameField.style.display = "none";
1151 metaTable.addRowButton.style.display = "none";
1152}
1153
1154function setEditingFeaturesVisible(visible)
1155{
1156 if(visible)
1157 {
1158 document.getElementById("editContentButton").innerHTML = "Hide editor";
1159 }
1160 else
1161 {
1162 document.getElementById("editContentButton").innerHTML = "Edit content";
1163 }
1164
1165 var saveButton = document.getElementById("saveButton");
1166 var metadataListLabel = document.getElementById("metadataListLabel");
1167 var metadataList = document.getElementById("metadataSetList");
1168
1169 var visibility = (visible ? "" : "none");
1170 saveButton.style.display = visibility;
1171 metadataListLabel.style.display = visibility;
1172 metadataList.style.display = visibility;
1173
1174 var buttons = gs.functions.getElementsByClassName("editMetadataButton");
1175
1176 for(var i = 0; i < buttons.length; i++)
1177 {
1178 buttons[i].style.display = visibility;
1179 buttons[i].linkLabel.innerHTML = "edit metadata";
1180 buttons[i].linkIcon.setAttribute("class", "ui-icon ui-icon-folder-collapsed");
1181 }
1182
1183 var tables = document.getElementsByTagName("TABLE");
1184 for(var i = 0; i < tables.length; i++)
1185 {
1186 var currentTable = tables[i];
1187 if(currentTable.getAttribute("id") && currentTable.getAttribute("id").search(/^meta/) != -1)
1188 {
1189 currentTable.style.display = "none";
1190 currentTable.metaNameField.style.display = "none";
1191 currentTable.addRowButton.style.display = "none";
1192 }
1193 }
1194}
1195
1196function readyPageForEditing()
1197{
1198 if(document.getElementById("metadataSetList"))
1199 {
1200 var setList = document.getElementById("metadataSetList");
1201 if(!setList.style.display || setList.style.display == "")
1202 {
1203 setEditingFeaturesVisible(false);
1204 }
1205 else
1206 {
1207 setEditingFeaturesVisible(true);
1208 }
1209 return;
1210 }
1211
1212 document.getElementById("editContentButton").innerHTML = "Hide Editor";
1213
1214 var textDivs = gs.functions.getElementsByClassName("sectionText");
1215 for(var i = 0; i < textDivs.length; i++)
1216 {
1217 de.doc.registerEditSection(textDivs[i]);
1218 }
1219
1220 var editBar = document.getElementById("editBarLeft");
1221 var saveButton = document.createElement("BUTTON");
1222 saveButton.onclick = save;
1223 saveButton.innerHTML = "Save changes";
1224 saveButton.setAttribute("id", "saveButton");
1225 editBar.appendChild(saveButton);
1226
1227 var visibleMetadataList = document.createElement("SELECT");
1228 var allOption = document.createElement("OPTION");
1229 allOption.innerHTML = "All";
1230 visibleMetadataList.appendChild(allOption);
1231 visibleMetadataList.setAttribute("id", "metadataSetList");
1232 var metadataListLabel = document.createElement("SPAN");
1233 metadataListLabel.setAttribute("id", "metadataListLabel");
1234 metadataListLabel.setAttribute("style", "margin-left:20px;");
1235 metadataListLabel.innerHTML = "Visible metadata: ";
1236 editBar.appendChild(metadataListLabel);
1237 editBar.appendChild(visibleMetadataList);
1238 visibleMetadataList.onchange = onVisibleMetadataSetChange;
1239
1240 var statusBarDiv = document.createElement("DIV");
1241 editBar.appendChild(statusBarDiv);
1242 _statusBar = new StatusBar(statusBarDiv);
1243
1244 var titleDivs = gs.functions.getElementsByClassName("sectionTitle");
1245 for(var i = 0; i < titleDivs.length; i++)
1246 {
1247 addEditMetadataLink(titleDivs[i]);
1248 }
1249
1250 _baseURL = gs.xsltParams.library_name;
1251}
1252
1253function floatMenu(enabled)
1254{
1255 var menu = $(".tableOfContentsContainer");
1256 if(enabled)
1257 {
1258 menu.data("position", menu.css("position"));
1259 menu.data("width", menu.css("width"));
1260 menu.data("right", menu.css("right"));
1261 menu.data("top", menu.css("top"));
1262 menu.data("max-height", menu.css("max-height"));
1263 menu.data("overflow", menu.css("overflow"));
1264 menu.data("z-index", menu.css("z-index"));
1265
1266 menu.css("position", "fixed");
1267 menu.css("width", "300px");
1268 menu.css("right", "0px");
1269 menu.css("top", "100px");
1270 menu.css("max-height", "600px");
1271 menu.css("overflow", "auto");
1272 menu.css("z-index", "200");
1273
1274 $("#unfloatTOCButton").show();
1275 }
1276 else
1277 {
1278 menu.css("position", menu.data("position"));
1279 menu.css("width", menu.data("width"));
1280 menu.css("right", menu.data("right"));
1281 menu.css("top", menu.data("top"));
1282 menu.css("max-height", menu.data("max-height"));
1283 menu.css("overflow", menu.data("overflow"));
1284 menu.css("z-index", menu.data("z-index"));
1285
1286 $("#unfloatTOCButton").hide();
1287 $("#floatTOCToggle").attr("checked", false);
1288 }
1289}
1290
1291function showSlideShow()
1292{
1293 $("#ssOption").attr('checked', false);
1294 if(!($("#gs-slideshow").length))
1295 {
1296 var slideshowDiv = $("<div>", {id:"gs-slideshow"});
1297 var loadingImage = $("<img>", {src:gs.imageURLs.loading});
1298 slideshowDiv.append(loadingImage);
1299
1300 $.blockUI({message: $(slideshowDiv), css:{top: "5%", left: "5%", width: "90%", height: "90%", overflow: "auto", cursor: "auto"}});
1301
1302 retrieveImagesForSlideShow(function(imageIDArray)
1303 {
1304 loadingImage.hide();
1305 if(imageIDArray && imageIDArray.length > 0)
1306 {
1307 var imageURLs = new Array();
1308 for(var i = 0; i < imageIDArray.length; i++)
1309 {
1310 if(imageIDArray[i].source && imageIDArray[i].source.search(/.*\.(gif|jpg|jpeg|png)$/) != -1)
1311 {
1312 imageURLs.push(gs.collectionMetadata.httpPath + "/index/assoc/" + gs.documentMetadata.assocfilepath + "/" + imageIDArray[i].source);
1313 }
1314 }
1315 new SlideShowWidget(slideshowDiv, imageURLs, imageIDArray);
1316 }
1317 });
1318 }
1319 else
1320 {
1321 $("#gs-slideshow").show();
1322 }
1323
1324 if($("#zoomOptions").length)
1325 {
1326 $("#zoomOptions").hide();
1327 }
1328}
1329
1330function retrieveImagesForSlideShow(callback)
1331{
1332 var template = "";
1333 template += '<xsl:template match="/">';
1334 template += '<images>[';
1335 template += '<xsl:for-each select="//documentNode">';
1336 template += '<xsl:text disable-output-escaping="yes">{"source":"</xsl:text><gsf:metadata name="Source"/><xsl:text disable-output-escaping="yes">",</xsl:text>';
1337 template += '<xsl:text disable-output-escaping="yes">"id":"</xsl:text><xsl:value-of select="@nodeID"/><xsl:text disable-output-escaping="yes">"}</xsl:text>';
1338 template += '<xsl:if test="position() != count(//documentNode)">,</xsl:if>';
1339 template += '</xsl:for-each>';
1340 template += ']</images>';
1341 template += '</xsl:template>';
1342
1343 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + gs.cgiParams.d + "?ed=1&ilt=" + template.replace(" ", "%20");
1344
1345 $.ajax(
1346 {
1347 url:url,
1348 success: function(data)
1349 {
1350 var startIndex = data.indexOf(">", data.indexOf(">") + 1) + 1;
1351 var endIndex = data.lastIndexOf("<");
1352 var arrayString = data.substring(startIndex, endIndex);
1353 var imageIDArray = eval(arrayString);
1354
1355 callback(imageIDArray);
1356 }
1357 });
1358}
1359
1360function SlideShowWidget(mainDiv, images, idArray)
1361{
1362 var _inTransition = false;
1363 var _images = new Array();
1364 var _mainDiv = mainDiv;
1365 var _imageDiv = $("<div>", {id:"ssImageDiv"});
1366 var _navDiv = $("<div>", {style:"height:2em;"});
1367 var _nextButton = $("<img>", {src:gs.imageURLs.next, style:"float:right; cursor:pointer;"});
1368 var _prevButton = $("<img>", {src:gs.imageURLs.prev, style:"float:left; cursor:pointer; display:none;"});
1369 var _closeLink = $("<a href=\"javascript:$.unblockUI()\">Close Slideshow</a>");
1370 var _clearDiv = $("<div>", {style:"clear:both;"});
1371 var _currentIndex = 0;
1372
1373 _navDiv.append(_nextButton);
1374 _navDiv.append(_closeLink);
1375 _navDiv.append(_prevButton);
1376 _navDiv.append(_clearDiv);
1377 _mainDiv.append(_navDiv);
1378 _mainDiv.append(_imageDiv);
1379
1380 for(var i = 0; i < images.length; i++)
1381 {
1382 _images.push($("<img>", {src:images[i], "class":"slideshowImage"}));
1383 }
1384
1385 if(_images.length < 2)
1386 {
1387 _nextButton.css("display", "none");
1388 }
1389
1390 _imageDiv.append(_images[0]);
1391
1392 this.nextImage = function()
1393 {
1394 if(!_inTransition)
1395 {
1396 _inTransition = true;
1397 if((_currentIndex + 1) < _images.length)
1398 {
1399 _prevButton.css("display", "");
1400 if(_currentIndex + 1 == _images.length - 1)
1401 {
1402 _nextButton.css("display", "none");
1403 }
1404
1405 _imageDiv.fadeOut(500, function()
1406 {
1407 _imageDiv.empty();
1408 _imageDiv.append(_images[_currentIndex + 1]);
1409 _currentIndex++;
1410 _imageDiv.fadeIn(500, function()
1411 {
1412 _inTransition = false;
1413 });
1414 });
1415 }
1416 else
1417 {
1418 _inTransition = false;
1419 }
1420 }
1421 }
1422
1423 this.prevImage = function()
1424 {
1425 if(!_inTransition)
1426 {
1427 _inTransition = true;
1428 if((_currentIndex - 1) >= 0)
1429 {
1430 _nextButton.css("display", "");
1431 if(_currentIndex - 1 == 0)
1432 {
1433 _prevButton.css("display", "none");
1434 }
1435
1436 _imageDiv.fadeOut(500, function()
1437 {
1438 _imageDiv.empty();
1439 _imageDiv.append(_images[_currentIndex - 1]);
1440 _currentIndex--;
1441 _imageDiv.fadeIn(500, function()
1442 {
1443 _inTransition = false;
1444 });
1445 });
1446 }
1447 else
1448 {
1449 _inTransition = false;
1450 }
1451 }
1452 }
1453
1454 var getRootFilenameFromURL = function(url)
1455 {
1456 var urlSegments = url.split("/");
1457 var filename = urlSegments[urlSegments.length - 1];
1458 return filename.replace(/_thumb\..*$/, "");
1459 }
1460
1461 var setLink = function(currentLink, index)
1462 {
1463 $(currentLink).click(function()
1464 {
1465 _inTransition = true;
1466 _currentIndex = index;
1467 _imageDiv.fadeOut(500, function()
1468 {
1469 _imageDiv.empty();
1470 _imageDiv.append(_images[_currentIndex]);
1471 _imageDiv.fadeIn(500, function()
1472 {
1473 _inTransition = false;
1474 });
1475 });
1476 });
1477 }
1478
1479 var sliderLinks = $(".pageSliderCol a");
1480 for(var i = 0; i < sliderLinks.length; i++)
1481 {
1482 var currentLink = sliderLinks[i];
1483 var id = $(currentLink).attr("href").split("'")[1];
1484
1485 for(var j = 0; j < idArray.length; j++)
1486 {
1487 if(idArray[j].id == id)
1488 {
1489 var image = idArray[j].source;
1490
1491 for(var l = 0; l < images.length; l++)
1492 {
1493 var filename = getRootFilenameFromURL(images[l]);
1494 if (filename == image)
1495 {
1496 setLink(currentLink, l);
1497 break;
1498 }
1499 }
1500
1501 break;
1502 }
1503 }
1504 }
1505
1506 _nextButton.click(this.nextImage);
1507 _prevButton.click(this.prevImage);
1508}
Note: See TracBrowser for help on using the repository browser.