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

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

The "Close slideshow" button will now remain at the top of the box even when the image is scrolled down

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