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

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

Prevent the magnification option from disappearing

  • 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"});
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"});
1377 var _navDiv = $("<div>", {style:"height:2em;"});
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.