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

Last change on this file since 30764 was 30764, checked in by davidb, 8 years ago

Tidy up on where to place the 'expand contents' tables for paged-image docs

  • Property svn:executable set to *
File size: 47.8 KB
Line 
1var _imageZoomEnabled = false;
2// Choose which types of filtering you want: sectionnum, or sectiontitle.
3var _filter_on_types = ["sectiontitle", "sectionnum"];
4// the text strings for the two radio buttons
5var _filter_on_num_text = "pagenum";
6var _filter_on_title_text = "title";
7// are titles numeric match?
8var _filter_title_numeric = false;
9
10var _linkCellMap = new Array();
11var _onCells = new Array();
12
13/* some vars for document editing */
14/* if true, will look through all the metadata for the document, and add each namespace into the list of metadata sets. If set to false, will only add in the ones defined in setStaticMetadataSets function (defined below) - override this function to make a custom list of sets */
15var dynamic_metadata_set_list = true;
16/* if true, will make the editing controls stay visible even on page scrolling */
17var keep_editing_controls_visible = true;
18/* Here you can choose which save buttons you like. Choose from 'save', 'rebuild', 'saveandrebuild' */
19var save_and_rebuild_buttons = ["saveandrebuild"];
20
21var save_button_text = "Save changes";
22var rebuild_button_text = "Rebuild";
23var save_and_rebuild_button_text = "Save and Rebuild";
24
25/*Array to store init states of metadata fields and text*/
26var editableInitStates = new Array();
27/*Array to store last states of metadata fields and text*/
28var editableLastStates = new Array();
29
30/* What kind of metadata element selection do we provide?
31 plain: just a text input box
32 fixedlist: a drop down menu with a fixed list of options (provided by the availableMetadataElements list)
33 autocomplete: a text input box with a list of suggestions to choose from (provided by the availableMetadataElements list). Allows additional input other than the fixed list
34*/
35var new_metadata_field_input_type = "plain";
36/* Metadata elements to be used in the fixedlist/autocomplete options above */
37var availableMetadataElements = ["dc.Title", "dc.Subject"];
38/********************
39* EXPANSION SCRIPTS *
40********************/
41
42function getTextForSection(sectionID, callback)
43{
44 if(!callback)
45 {
46 console.log("Cannot get text as the callback function is not defined");
47 }
48
49 var template = "";
50 template += '<xsl:template match="/">';
51 template += '<text>';
52 template += '<xsl:for-each select="/page/pageResponse/document//documentNode[@nodeID = \'' + sectionID + '\']">';
53 template += '<xsl:call-template name="sectionContent"/>';
54 template += '</xsl:for-each>';
55 template += '</text>';
56 template += '</xsl:template>';
57
58 var hlCheckBox = document.getElementById("highlightOption");
59
60 var hl = "";
61 if(hlCheckBox)
62 {
63 if(hlCheckBox.checked)
64 {
65 hl = "on";
66 }
67 else
68 {
69 hl = "off";
70 }
71 }
72
73 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + sectionID + "?hl=" + hl + "&p.s=TextQuery&ilt=" + template.replace(" ", "%20");
74
75 $.ajax(url)
76 .success(function(response)
77 {
78 if(response)
79 {
80 var textStart = response.indexOf(">", response.indexOf(">") + 1) + 1;
81 var textEnd = response.lastIndexOf("<");
82
83 if(textStart == 0 || textEnd == -1 || textEnd <= textStart)
84 {
85 callback("");
86 }
87
88 var text = response.substring(textStart, textEnd);
89 callback(text);
90 }
91 else
92 {
93 callback(null);
94 }
95 })
96 .error(function()
97 {
98 callback(null);
99 });
100}
101
102function getSubSectionsForSection(sectionID, callback)
103{
104 if(!callback)
105 {
106 console.log("Cannot get sub sections as the callback function is not defined");
107 }
108
109 var template = "";
110 template += '<xsl:template match="/">';
111 template += '<sections>';
112 template += '<xsl:for-each select="/page/pageResponse/document//documentNode[@nodeID = \'' + sectionID + '\']/documentNode">';
113 template += '<xsl:call-template name="wrapDocumentNodes"/>';
114 template += '</xsl:for-each>';
115 template += '</sections>';
116 template += '</xsl:template>';
117
118 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + sectionID + "?ilt=" + template.replace(" ", "%20");
119
120 if(gs.documentMetadata.docType == "paged")
121 {
122 url += "&dt=hierarchy";
123 }
124
125 $.ajax(url)
126 .success(function(response)
127 {
128 if(response)
129 {
130 var sectionsStart = response.indexOf(">", response.indexOf(">") + 1) + 1;
131 var sectionsEnd = response.lastIndexOf("<");
132
133 if(sectionsStart == 0 || sectionsEnd == -1 || sectionsEnd <= sectionsStart)
134 {
135 callback(" ");
136 return;
137 }
138
139 var sections = response.substring(sectionsStart, sectionsEnd);
140 callback(sections);
141 }
142 else
143 {
144 callback(null);
145 }
146 })
147 .error(function()
148 {
149 callback(null);
150 });
151}
152
153function toggleSection(sectionID, callback, tocDisabled)
154{
155 var docElem = gs.jqGet("doc" + sectionID);
156 var tocElem = gs.jqGet("toc" + sectionID);
157
158 var tocToggleElem = gs.jqGet("ttoggle" + sectionID);
159 var docToggleElem = gs.jqGet("dtoggle" + sectionID);
160
161 if(docElem.css("display") == "none")
162 {
163 if(tocToggleElem.length && !tocDisabled)
164 {
165 tocToggleElem.attr("src", gs.imageURLs.collapse);
166 }
167
168 if(tocElem.length && !tocDisabled)
169 {
170 tocElem.css("display", "block");
171 }
172
173 if(docElem.hasClass("noText"))
174 {
175 getTextForSection(sectionID, function(text)
176 {
177 if(text)
178 {
179 var nodeID = sectionID.replace(/\./g, "_");
180 if(text.search("wrap" + nodeID) != -1)
181 {
182 $("#zoomOptions").css("display", "");
183 $("#pagedImageOptions").css("display", "");
184 }
185 getSubSectionsForSection(sectionID, function(sections)
186 {
187 if(sections)
188 {
189 var textElem = gs.jqGet("doc" + sectionID);
190 textElem.html(text + sections);
191
192 docElem.removeClass("noText");
193 docElem.css("display", "block");
194 docToggleElem.attr("src", gs.imageURLs.collapse);
195
196 if(callback)
197 {
198 callback(true);
199 }
200
201 if(gs.jqGet("viewSelection").length)
202 {
203 changeView();
204 }
205 }
206 else
207 {
208 docToggleElem.attr("src", gs.imageURLs.expand);
209 if(callback)
210 {
211 callback(false);
212 }
213 }
214 });
215 }
216 else
217 {
218 docToggleElem.attr("src", gs.imageURLs.expand);
219 if(callback)
220 {
221 callback(false);
222 }
223 }
224 });
225
226 docToggleElem.attr("src", gs.imageURLs.loading);
227 }
228 else
229 {
230 docToggleElem.attr("src", gs.imageURLs.collapse);
231 docElem.css("display", "block");
232
233 if(callback)
234 {
235 callback(true);
236 }
237 }
238 }
239 else
240 {
241 docElem.css("display", "none");
242
243 //Use the page image if this is a leaf node and the chapter image if it not
244 docToggleElem.attr("src", gs.imageURLs.expand);
245
246 if(tocToggleElem.length)
247 {
248 tocToggleElem.attr("src", gs.imageURLs.expand);
249 }
250
251 if(tocElem.length)
252 {
253 tocElem.css("display", "none");
254 }
255
256 if(callback)
257 {
258 callback(true);
259 }
260 }
261}
262
263function scrollToTop()
264{
265 $('html, body').stop().animate({scrollTop: 0}, 1000);
266}
267
268function focusSection(sectionID, level, tocDisabled)
269{
270 if(!level)
271 {
272 level = 0;
273 }
274 var parts = sectionID.split(".");
275 if(level >= parts.length)
276 {
277 var topVal = $(document.getElementById("doc" + sectionID)).offset().top - 50;
278 $('html, body').stop().animate({scrollTop: topVal}, 1000);
279 return;
280 }
281
282 var idToExpand = "";
283 for(var i = 0; i < level + 1; i++)
284 {
285 if(i > 0)
286 {
287 idToExpand += ".";
288 }
289
290 idToExpand += parts[i];
291 }
292
293 if(!isSectionExpanded(idToExpand))
294 {
295 toggleSection(idToExpand, function(success)
296 {
297 if(success)
298 {
299 focusSection(sectionID, level + 1, tocDisabled);
300 }
301 }, tocDisabled);
302 }
303 else
304 {
305 focusSection(sectionID, level + 1, tocDisabled);
306 }
307}
308
309function expandOrCollapseAll(expand)
310{
311 var divs = $("div");
312 var startCounter = 0;
313 var endCounter = 0;
314
315 for(var i = 0; i < divs.length; i++)
316 {
317 if($(divs[i]).attr("id") && $(divs[i]).attr("id").search(/^doc/) != -1)
318 {
319 var id = $(divs[i]).attr("id").replace(/^doc(.*)/, "$1");
320 if(isSectionExpanded(id) != expand)
321 {
322 //Don't collapse the top level
323 if(!expand && id.indexOf(".") == -1)
324 {
325 continue;
326 }
327 startCounter++;
328
329 var toggleFunction = function(tid)
330 {
331 toggleSection(tid, function(success)
332 {
333 if(success)
334 {
335 endCounter++;
336 }
337 else
338 {
339 setTimeout(function(){toggleFunction(tid)}, 500);
340 }
341 });
342 }
343 toggleFunction(id);
344 }
345 }
346 }
347
348 if(startCounter != 0)
349 {
350 var checkFunction = function()
351 {
352 if(startCounter == endCounter)
353 {
354 expandOrCollapseAll(expand);
355 }
356 else
357 {
358 setTimeout(checkFunction, 500);
359 }
360 }
361 checkFunction();
362 }
363}
364
365function loadTopLevelPage(callbackFunction, customURL)
366{
367 var url;
368 if(customURL)
369 {
370 url = customURL;
371 }
372 else
373 {
374 url = gs.xsltParams.library_name + "?a=d&c=" + gs.cgiParams.c + "&excerptid=gs-document";
375 if(gs.cgiParams.d && gs.cgiParams.d.length > 0)
376 {
377 url += "&d=" + gs.cgiParams.d.replace(/([^.]*)\..*/, "$1");
378 }
379 else if(gs.cgiParams.href && gs.cgiParams.href.length > 0)
380 {
381 url += "&d=&alb=1&rl=1&href=" + gs.cgiParams.href;
382 }
383 }
384
385 $.ajax(url)
386 .success(function(response)
387 {
388 if(response)
389 {
390 var targetElem = $("#gs-document");
391 var docStart = response.indexOf(">") + 1;
392 var docEnd = response.lastIndexOf("<");
393 var doc = response.substring(docStart, docEnd);
394
395 targetElem.html(doc);
396
397 if(callbackFunction)
398 {
399 callbackFunction();
400 }
401 }
402 })
403 .error(function()
404 {
405 setTimeout(function(){loadTopLevelPage(callbackFunction, customURL);}, 1000);
406 });
407}
408
409function retrieveFullTableOfContentsSuccess(newTOCElem)
410{
411 var tocStart = newTOCElem.indexOf(">") + 1;
412 var tocEnd = newTOCElem.lastIndexOf("<");
413
414 var newTOC = newTOCElem.substring(tocStart, tocEnd);
415
416 //Add the "Expand document"/"Collapse document" links
417 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;
418
419 //Collapse the TOC
420 newTOC = newTOC.replace(/display:block/g, "display:none");
421 newTOC = newTOC.replace(/display:none/, "display:block");
422 newTOC = newTOC.replace(/images\/collapse/g, "images/expand");
423
424 var tocElem = $("#tableOfContents");
425 tocElem.html(newTOC);
426
427 gs.variables.tocLoaded = true;
428}
429
430function retrieveFullTableOfContentsSuccessClientSideXSLT(newTOCElem)
431{
432 $('#client-side-xslt-ajax').remove();
433 retrieveFullTableOfContentsSuccess(newTOCElem)
434}
435
436function retrieveFullTableOfContents()
437{
438 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "?excerptid=tableOfContents&ed=1";
439 if(gs.cgiParams.d && gs.cgiParams.d.length > 0)
440 {
441 url += "&a=d&d=" + gs.cgiParams.d;
442 }
443 else if(gs.cgiParams.href && gs.cgiParams.href.length > 0)
444 {
445 url += "&a=d&d=&alb=1&rl=1&href=" + gs.cgiParams.href;
446 }
447
448 if (gs.xsltParams.use_client_side_xslt == "true") { // note xsltParams are of type string, so test needs to be in quotes
449 url += "&callback=retrieveFullTableOfContentsSuccessClientSideXSLT"; // used in client-side-xslt.js, in combination with 'excerptid'
450 $('<iframe src="'+url+'" id="client-side-xslt-ajax" tabindex="-1" style="position: absolute; width: 0px; height: 0px; border: none;"></iframe>').appendTo('body');
451 }
452 else {
453 $.ajax(url)
454 .success(retrieveFullTableOfContentsSuccess)
455 .error(function() {
456 setTimeout(retrieveFullTableOfContents, 1000);
457 });
458 }
459}
460
461function isSectionExpanded(sectionID)
462{
463 var docElem = gs.jqGet("doc" + sectionID);
464 if(docElem.css("display") == "block")
465 {
466 return true;
467 }
468 return false;
469}
470
471function minimizeSidebar()
472{
473 var toc = $("#contentsArea");
474 var maxLink = $("#sidebarMaximizeButton");
475 var minLink = $("#sidebarMinimizeButton");
476
477 if(toc.length)
478 {
479 toc.css("display", "none");
480 }
481
482 maxLink.css("display", "block");
483 minLink.css("display", "none");
484}
485
486function maximizeSidebar()
487{
488 var coverImage = $("#coverImage");
489 var toc = $("#contentsArea");
490 var maxLink = $("#sidebarMaximizeButton");
491 var minLink = $("#sidebarMinimizeButton");
492
493 if(coverImage.length)
494 {
495 coverImage.css("display", "block");
496 }
497
498 if(toc.length)
499 {
500 toc.css("display", "block");
501 }
502
503 maxLink.css("display", "none");
504 minLink.css("display", "block");
505}
506
507function extractFilteredPagesToOwnDocument()
508{
509 var oids = new Array();
510 var filtered = $(".pageSliderCol:visible a").each(function()
511 {
512 var hrefString = $(this).attr("href");
513 var oidStart = hrefString.indexOf(".") + 1;
514 var oidFinish = hrefString.indexOf("'", oidStart + 1);
515
516 oids.push(hrefString.substring(oidStart, oidFinish));
517 });
518
519 var sectionString = "[";
520 for(var i = 0; i < oids.length; i++)
521 {
522 sectionString += "\"" + oids[i] + "\"";
523 if(i < oids.length - 1)
524 {
525 sectionString += ",";
526 }
527 }
528 sectionString += "]";
529
530 var url = "cgi-bin/document-extract.pl?a=extract-archives-doc&c=" + gs.cgiParams.c + "&d=" + gs.cgiParams.d + "&json-sections=" + sectionString + "&site=" + gs.xsltParams.site_name;// + "&json-metadata=[{"metaname":"dc.Title","metavalue":"All Black Rugy Success","metamode":"accumulate"]"
531 $("#extractDocButton").attr("disabled", "disabled").html("Exracting document...");
532 $.ajax(url)
533 .success(function(response)
534 {
535 $("#extractDocButton").html("Building collection...");
536 gs.functions.buildCollections([gs.cgiParams.c], function()
537 {
538 $("#extractDocButton").removeAttr("disabled").html("Extract these pages to document");
539 });
540 })
541 .error(function()
542 {
543 $("#extractDocButton").removeAttr("disabled").html("Extract these pages to document");
544 });
545}
546
547/**********************
548* PAGED-IMAGE SCRIPTS *
549**********************/
550
551function changeView()
552{
553 var viewList = $("#viewSelection");
554 var currentVal = viewList.val();
555
556 var view;
557 if(currentVal == "Image view")
558 {
559 setImageVisible(true);
560 setTextVisible(false);
561 view = "image";
562 }
563 else if(currentVal == "Text view")
564 {
565 setImageVisible(false);
566 setTextVisible(true);
567 view = "text";
568 }
569 else
570 {
571 setImageVisible(true);
572 setTextVisible(true);
573 view = "";
574 }
575
576 var url = gs.xsltParams.library_name + "?a=d&view=" + view + "&c=" + gs.cgiParams.c;
577 $.ajax(url);
578}
579
580function setImageVisible(visible)
581{
582 $("div").each(function()
583 {
584 if($(this).attr("id") && $(this).attr("id").search(/^image/) != -1)
585 {
586 $(this).css("display", (visible ? "block" : "none"));
587 }
588 });
589}
590
591function setTextVisible(visible)
592{
593 $("div").each(function()
594 {
595 if($(this).attr("id") && $(this).attr("id").search(/^text/) != -1)
596 {
597 $(this).css("display", (visible ? "block" : "none"));
598 }
599 });
600}
601
602function retrieveTableOfContentsAndTitles()
603{
604 var ilt = "";
605 ilt += '<xsl:template match="/">';
606 ilt += '<xsl:for-each select="/page/pageResponse/document/documentNode">';
607 ilt += '<xsl:call-template name="documentNodeTOC"/>';
608 ilt += '</xsl:for-each>';
609 ilt += '</xsl:template>';
610
611 var url = gs.xsltParams.library_name + "?a=d&ed=1&c=" + gs.cgiParams.c + "&d=" + gs.cgiParams.d + "&ilt=" + ilt.replace(/ /g, "%20");
612
613 $.ajax(url)
614 .success(function(response)
615 {
616 $("#tableOfContents").html(response);
617 replaceLinksWithSlider();
618 addExpandContractButtons();
619 var loading = $("#tocLoadingImage");
620 loading.remove();
621 })
622 .error(function()
623 {
624 setTimeout(function(){retrieveTableOfContentsAndTitles();}, 1000);
625 });
626}
627
628function addExpandContractButtons()
629{
630 var tableOfContents = $("#tableOfContents");
631 var table = "<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>" ;
632
633 tableOfContents.prepend(table);
634
635}
636function replaceLinksWithSlider()
637{
638 var tableOfContents = $("#tableOfContents");
639 var leafSections = new Array();
640 var liElems = tableOfContents.find("li").each(function()
641 {
642 var section = $(this);
643 var add = true;
644 for(var j = 0; j < leafSections.length; j++)
645 {
646 if(leafSections[j] == undefined){continue;}
647
648 var leaf = $(leafSections[j]);
649 if(leaf.attr("id").search(section.attr("id")) != -1)
650 {
651 add = false;
652 }
653
654 if(section.attr("id").search(leaf.attr("id")) != -1)
655 {
656 delete leafSections[j];
657 }
658 }
659
660 if(add)
661 {
662 leafSections.push(section);
663 }
664 });
665
666 for(var i = 0 ; i < leafSections.length; i++)
667 {
668 if(leafSections[i] == undefined){continue;}
669
670 leafSections[i].css("display", "none");
671 var links = leafSections[i].find("a");
672
673 var widget = new SliderWidget(links);
674 leafSections[i].before(widget.getElem());
675 }
676
677 //Disable all TOC toggles
678 var imgs = $("img").each(function()
679 {
680 var currentImage = $(this);
681 if(currentImage.attr("id") && currentImage.attr("id").search(/^ttoggle/) != -1)
682 {
683 currentImage.attr("onclick", "");
684 currentImage.click(function()
685 {
686 var sliderDiv = currentImage.parents("table").first().next();
687 if(sliderDiv.is(":visible"))
688 {
689 sliderDiv.hide();
690 }
691 else
692 {
693 sliderDiv.show();
694 }
695 });
696 }
697 else if(currentImage.attr("id") && currentImage.attr("id").search(/^dtoggle/) != -1)
698 {
699 currentImage.attr("onclick", currentImage.attr("onclick").replace(/\)/, ", null, true)"));
700 }
701 });
702}
703
704
705function SliderWidget(_links)
706{
707 //****************
708 //MEMBER VARIABLES
709 //****************
710
711 //The container for the widget
712 var _mainDiv = $("<div>");
713 _mainDiv.attr("class", "ui-widget-content pageSlider");
714
715 //The table of images
716 var _linkTable = $("<table>");
717 _mainDiv.append(_linkTable);
718
719 //The image row of the table
720 var _linkRow = $("<tr>");
721 _linkTable.append(_linkRow);
722
723 //The list of titles we can search through
724 var _titles = new Array();
725
726 //Keep track of the slider position
727 var _prevScroll = 0;
728
729 //****************
730 //PUBLIC FUNCTIONS
731 //****************
732
733 //Function that returns the widget element
734 this.getElem = function()
735 {
736 return _mainDiv;
737 }
738
739 //*****************
740 //PRIVATE FUNCTIONS
741 //*****************
742
743 // _filter_on_types can be "sectionnum", "sectiontitle"
744 var setUpFilterButtons = function() {
745
746 var button_div = $("#filterOnButtons");
747 button_div.onclick = doFiltering;
748 button_div.html("radio");
749 if (_filter_on_types.length == 0) {
750 _filter_on_types = ["sectionnum", "sectiontitle"];
751 }
752 else if (_filter_on_types.length == 1) {
753 if (_filter_on_types[0] == "sectionnum") {
754 button_div.html("(<input type='radio' name='filterOn' value='num' checked>"+_filter_on_num_text+"</input>)");
755 } else {
756 button_div.html("(<input type='radio' name='filterOn' value='title' checked>"+_filter_on_title_text+"</input>)");
757 }
758 } else {
759 // should be both options
760 button_div.html("<input type='radio' name='filterOn' value='num' checked>"+_filter_on_num_text+"</input><input type='radio' name='filterOn' value='title'>"+_filter_on_title_text+"</input>");
761 }
762}
763
764 var doFiltering = function () {
765 if (typeof _titles == "undefined") {
766 return;
767 }
768
769 var filter_string = $("#filterText").val();
770 var filter_type = $('input[name="filterOn"]:checked').val();
771
772 var index = 2; // section num
773 var numeric_match = true;
774 if (filter_type == "title") {
775 index = 3;
776 if (_filter_title_numeric != true) {
777 numeric_match = false;
778 }
779
780 }
781 var values = filter_string.split(",");
782
783 var matchingTitles = new Array();
784
785 for (var l = 0; l < values.length; l++)
786 {
787 var currentValue = values[l].replace(/^ +/g, "").replace(/ +$/g, "");
788 if (numeric_match) {
789 var isRange = (currentValue.search(/\d+-\d+/) != -1);
790 if (isRange) {
791 var firstNumber = currentValue.replace(/(\d+)-\d+/, "$1");
792 var secondNumber = currentValue.replace(/\d+-(\d+)/, "$1");
793
794 if(firstNumber <= secondNumber)
795 {
796 for(var i = firstNumber; i <= secondNumber; i++)
797 {
798 var numString = i + "";
799 for(var j = 0; j < _titles.length; j++) {
800
801 var currentTitle = _titles[j];
802 if(currentTitle[index] == numString) {
803 matchingTitles.push(currentTitle);
804 }
805 }
806 }
807 }
808 } // if isRange
809 else {
810 for(var j = 0; j < _titles.length; j++) {
811 if (_titles[j][index]==currentValue) {
812 matchingTitles.push(_titles[j]);
813 }
814 }
815
816 }
817
818 } else { // not numeric match.
819 // need to do a search
820 for(var i = 0; i < _titles.length; i++)
821 {
822 var currentTitle = _titles[i];
823 if(currentTitle[index].toLowerCase().search(currentValue.toLowerCase().replace(/\./g, "\\.")) != -1)
824 {
825 matchingTitles.push(currentTitle);
826 }
827 }
828 }
829 } // for each value from filter string
830
831 // set all to hide...
832 for(var i = 0; i < _titles.length; i++)
833 {
834 $(_titles[i][1].cell).css("display", "none");
835 }
836
837 // .. then display the matching ones
838 for(var i = 0; i < matchingTitles.length; i++)
839 {
840 $(matchingTitles[i][1].cell).css("display", "table-cell");
841 }
842}
843
844 var setUpFilterBox = function()
845 {
846 var filter = $("#filterText");
847
848 filter.keyup(function()
849 {
850 doFiltering();
851 });
852 }
853
854 var getImage = function(page, attemptNumber)
855 {
856 var href = page.getAttribute("href");
857 var startHREF = href.indexOf("'") + 1;
858 var endHREF = href.indexOf("'", startHREF);
859 var nodeID = href.substring(startHREF, endHREF);
860 href = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + nodeID;
861
862 var template = '';
863 template += '<xsl:template match="/">';
864 template += '<gsf:metadata name=\"Thumb\"/>';
865 template += '<html>';
866 template += '<img>';
867 template += '<xsl:attribute name="src">';
868 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/collection/metadataList/metadata[@name = 'httpPath']\"/>";
869 template += '<xsl:text>/index/assoc/</xsl:text>';
870 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/metadataList/metadata[@name = 'assocfilepath']\"/>";
871 template += '<xsl:text>/</xsl:text>';
872 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document//documentNode[@nodeID = '" + nodeID + "']/metadataList/metadata[@name = 'Thumb']\"/>";
873 template += '</xsl:attribute>';
874 template += '</img>';
875 template += '<p>';
876 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/documentNode/metadataList/metadata[@name = 'Title']\"/>";
877 template += '</p>';
878 template += '</html>';
879 template += '</xsl:template>';
880
881 var url = href + "?ilt=" + template.replace(" ", "%20");
882 $.ajax(url)
883 .success(function(text)
884 {
885 var hrefStart = text.indexOf("src=\"") + 5;
886 if(hrefStart == -1)
887 {
888 page.isLoading = false;
889 page.noImage = true;
890 $(page.image).attr("src", gs.imageURLs.blank);
891 return;
892 }
893 var hrefEnd = text.indexOf("\"", hrefStart);
894 var href = text.substring(hrefStart, hrefEnd);
895
896 var image = $("<img>");
897 image.load(function()
898 {
899 $(page.link).html("");
900 $(page.link).append(image);
901 page.isLoading = false;
902 page.imageLoaded = true;
903 });
904 image.error(function()
905 {
906 if(!attemptNumber || attemptNumber < 3)
907 {
908 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
909 }
910 else
911 {
912 page.isLoading = false;
913 page.noImage = true;
914 image.attr("src", gs.imageURLs.blank);
915 }
916 });
917 image.attr("src", href);
918
919 var titleStart = text.indexOf("<p>") + 3;
920 var titleEnd = text.indexOf("</p>");
921 var title = text.substring(titleStart, titleEnd);
922 })
923 .error(function()
924 {
925 page.failed = true;
926 if(!attemptNumber || attemptNumber < 3)
927 {
928 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
929 }
930 else
931 {
932 var image = $("<img>", {"src": gs.imageURLs.blank});
933 $(page.link).html("");
934 $(page.link).append(image);
935 page.isLoading = false;
936 page.noImage = true;
937 }
938 });
939 }
940
941 var startCheckFunction = function()
942 {
943 var checkFunction = function(forced)
944 {
945 //Don't bother checking if we haven't scrolled very far
946 if(Math.abs(_mainDiv.scrollLeft() - _prevScroll) > 100 || forced)
947 {
948 _prevScroll = _mainDiv.scrollLeft();
949 _checking = true;
950 var widgetLeft = _mainDiv.offset().left;
951 var widgetRight = widgetLeft + _mainDiv.width();
952
953 var visiblePages = new Array();
954 for(var i = 0; i < _links.length; i++)
955 {
956 var current = _links[i].cell;
957 var currentLeft = current.offset().left;
958 var currentRight = currentLeft + current.width();
959
960 if(currentRight > widgetLeft && currentLeft < widgetRight)
961 {
962 visiblePages.push(_links[i]);
963 }
964 }
965
966 for(var i = 0; i < visiblePages.length; i++)
967 {
968 var page = visiblePages[i];
969 if(!page || page.imageLoaded || page.noImage || page.isLoading)
970 {
971 continue;
972 }
973
974 page.isLoading = true;
975 getImage(page);
976 }
977 _checking = false;
978 }
979 }
980
981 setTimeout(checkFunction, 250);
982 setInterval(function(){checkFunction(true)}, 2000);
983 _mainDiv.scroll(checkFunction);
984 }
985
986 //***********
987 //CONSTRUCTOR
988 //***********
989
990 for(var i = 0; i < _links.length; i++)
991 {
992 var col = $("<td>");
993 _linkRow.append(col);
994 col.addClass("pageSliderCol");
995 _links[i].cell = col;
996
997 var link = $("<a>");
998 col.append(link);
999 _links[i].link = link;
1000 var href = $(_links[i]).attr("href");
1001 link.attr("href", href.replace(/\)/, ", 0, true)"));
1002
1003 if(!_linkCellMap[href])
1004 {
1005 _linkCellMap[href] = new Array();
1006 }
1007 _linkCellMap[href].push(_links[i]);
1008
1009 var loadingText = $("<p>Loading image</p>");
1010 link.append(loadingText);
1011
1012 var image = $("<img>");
1013 link.append(image);
1014 image.attr("src", gs.imageURLs.loading);
1015 _links[i].image = image;
1016
1017 var title = $(_links[i]).html();
1018 var t_section = "";
1019 var t_title = "";
1020 if (title.search(/tocSectionNumber/) != -1)
1021 {
1022 var matching_regex = /<span class=\"tocSectionNumber\">([0-9]+)<\/span>[\s\S]*<span class=\"tocSectionTitle\">(.+)<\/span>$/mg;
1023 var matches_array = matching_regex.exec(title);
1024 if (matches_array != null && matches_array.length == 3) {
1025 t_section = matches_array[1];
1026 t_title = matches_array[2];
1027 }
1028 }
1029
1030 _titles.push([title, _links[i], t_section, t_title]);
1031
1032 col.append($("<br>"));
1033 col.append(title);
1034 }
1035
1036 setUpFilterBox();
1037 setUpFilterButtons();
1038 startCheckFunction();
1039 }
1040
1041/***********************
1042* HIGHLIGHTING SCRIPTS *
1043***********************/
1044function swapHighlight(imageClicked)
1045{
1046 var hlCheckbox = $("#highlightOption");
1047 if(imageClicked)
1048 {
1049 // toggle the state of the checkbox
1050 $(hlCheckbox).prop("checked", !$(hlCheckbox).prop("checked"));
1051 }
1052 var from;
1053 var to;
1054 if(hlCheckbox.prop("checked"))
1055 {
1056 from = "noTermHighlight";
1057 to = "termHighlight";
1058 }
1059 else
1060 {
1061 from = "termHighlight";
1062 to = "noTermHighlight";
1063 }
1064
1065 var spans = $("span").each(function()
1066 {
1067 if($(this).hasClass(from))
1068 {
1069 $(this).removeClass(from);
1070 $(this).addClass(to);
1071 }
1072 });
1073}
1074
1075/**************************
1076* REALISTIC BOOKS SCRIPTS *
1077**************************/
1078
1079function bookInit()
1080{
1081 loadBook();
1082 hideText();
1083 showBook();
1084 swapLinkJavascript(false);
1085}
1086
1087function hideText()
1088{
1089 $("#gs-document-text").css("visibility", "hidden");
1090}
1091
1092function showText()
1093{
1094 $("#gs-document-text").css("visibility", "visible");
1095}
1096
1097function hideBook()
1098{
1099 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "hidden", "height": "0px"});
1100}
1101
1102function showBook()
1103{
1104 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "visible", "height": "600px"});
1105}
1106
1107function swapLinkJavascript(rbOn)
1108{
1109 var option = $("#rbOption");
1110 var optionImage = $("#rbOptionImage");
1111
1112 if(rbOn)
1113 {
1114 option.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1115 optionImage.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1116 $(option).prop("checked", false);
1117 }
1118 else
1119 {
1120 option.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1121 optionImage.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1122 $(option).prop("checked", true);
1123 }
1124}
1125
1126function loadBook()
1127{
1128 var doc_url = document.URL;
1129 doc_url = doc_url.replace(/(&|\?)book=[a-z]+/gi,'');
1130 doc_url += '&book=flashxml';
1131
1132 var img_cover = gs.collectionMetadata.httpPath + '/index/assoc/' + gs.documentMetadata.assocfilepath + '/cover.jpg';
1133
1134 var flash_plug_html = ""
1135 flash_plug_html += '<OBJECT align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" \n';
1136 flash_plug_html += ' height="600px" id="bookObject" swLiveConnect="true" \n';
1137 flash_plug_html += ' codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" \n';
1138 flash_plug_html += ' width="70%">\n';
1139 flash_plug_html += ' <PARAM name="allowScriptAccess" value="always" />\n';
1140 flash_plug_html += ' <PARAM name="movie" value="Book.swf';
1141 flash_plug_html += '?src_image=' + escape(img_cover);
1142 flash_plug_html += '&doc_url=' + escape(doc_url);
1143 flash_plug_html += '" />\n';
1144 flash_plug_html += ' <PARAM name="quality" value="high" />\n';
1145 flash_plug_html += ' <PARAM name="bgcolor" value="#FFFFFF" />\n';
1146 flash_plug_html += ' <EMBED align="middle" \n';
1147 flash_plug_html += ' allowScriptAccess="always" swLiveConnect="true" \n';
1148 flash_plug_html += ' bgcolor="#FFFFFF" height="600px" name="Book" \n';
1149 flash_plug_html += ' pluginspage="http://www.macromedia.com/go/getflashplayer" \n';
1150 flash_plug_html += ' quality="high" id="bookEmbed"\n';
1151 flash_plug_html += ' src="Book.swf';
1152 flash_plug_html += '?src_image=' + escape(img_cover);
1153 flash_plug_html += '&doc_url=' + escape(doc_url);
1154 flash_plug_html += '"\n';
1155 flash_plug_html += ' type="application/x-shockwave-flash" width="70%" />\n';
1156 flash_plug_html += '</OBJECT>\n';
1157 $("#bookdiv").html(flash_plug_html);
1158}
1159
1160/************************
1161* CHANGES SCRIPTS *
1162************************/
1163
1164function addCKEEditableState(evt,stateArray)
1165{
1166 // Event->Editor->CKE DOM Inline Element that editor was for->underlying jquery element
1167 element = evt.editor.element.$;
1168 nodeText = element.innerHTML;
1169 stateArray.push({
1170 editableNode : element,
1171 initHTML : nodeText
1172 });
1173
1174}
1175function addEditableState(editable,stateArray)
1176{
1177
1178 if(editable.tagName == 'TEXTAREA')
1179 {
1180 nodeText = editable.value;
1181 }
1182 else
1183 {
1184 nodeText = editable.innerHTML;
1185 }
1186
1187 stateArray.push({
1188 editableNode : editable,
1189 initHTML : nodeText
1190 });
1191
1192}
1193
1194function getLastEditableStates()
1195{
1196 editableLastStates = [];
1197 $(".sectionText").each(function(){addEditableState(this,editableLastStates);});
1198 $(".metaTableCellArea").each(function(){addEditableState(this,editableLastStates);});
1199
1200}
1201
1202function changesToUpdate()
1203{
1204 var resultArray = new Array();
1205 getLastEditableStates();
1206 for (var j in editableLastStates)
1207 {
1208 if (isNodeChanged(editableLastStates[j]))
1209 {
1210 resultArray.push(editableLastStates[j].editableNode);
1211 }
1212 }
1213 return resultArray;
1214}
1215
1216
1217function isNodeChanged(StateToCheck){
1218 for (var i in editableInitStates)
1219 {
1220 if ((StateToCheck.editableNode === editableInitStates[i].editableNode)) {
1221 if ( StateToCheck.initHTML === editableInitStates[i].initHTML )
1222 {
1223 return false;
1224 }
1225 return true;
1226 }
1227
1228 }
1229 return true;
1230}
1231/************************
1232* METADATA EDIT SCRIPTS *
1233************************/
1234
1235function addEditMetadataLink(cell)
1236{
1237 cell = $(cell);
1238 var id = cell.attr("id").substring(6);
1239 var metaTable = gs.jqGet("meta" + id);
1240
1241 var row = cell.parent();
1242 var newCell = $("<td>", {"style": "font-size:0.7em; padding:0px 10px", "class": "editMetadataButton"});
1243 var linkSpan = $("<span>", {"class": "ui-state-default ui-corner-all", "style": "padding: 2px; float:left;"});
1244
1245 var linkLabel = $("<span>edit metadata</span>");
1246 var linkIcon = $("<span>", {"class": "ui-icon ui-icon-folder-collapsed"});
1247 newCell.linkIcon = linkIcon;
1248 newCell.linkLabel = linkLabel;
1249
1250 var uList = $("<ul>", {"style": "outline: 0 none; margin:0px; padding:0px;"});
1251 var labelItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1252 var iconItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1253
1254 uList.append(iconItem);
1255 uList.append(labelItem);
1256 labelItem.append(linkLabel);
1257 iconItem.append(linkIcon);
1258
1259 var newLink = $("<a>", {"href": "javascript:;"});
1260 newLink.click(function()
1261 {
1262 if(metaTable.css("display") == "none")
1263 {
1264 linkLabel.html("hide metadata");
1265 linkIcon.attr("class", "ui-icon ui-icon-folder-open");
1266 metaTable.css("display", "block");
1267 metaTable.metaNameField.css("display", "inline");
1268 metaTable.addRowButton.css("display", "inline");
1269 }
1270 else
1271 {
1272 linkLabel.html("edit metadata");
1273 linkIcon.attr("class", "ui-icon ui-icon-folder-collapsed");
1274 metaTable.css("display", "none");
1275 metaTable.metaNameField.css("display", "none");
1276 metaTable.addRowButton.css("display", "none");
1277 }
1278 });
1279
1280 newLink.append(uList);
1281 linkSpan.append(newLink);
1282 newCell.append(linkSpan);
1283 row.append(newCell);
1284
1285 addFunctionalityToTable(metaTable);
1286 metaTable.metaNameField.css("display", "none");
1287 metaTable.addRowButton.css("display", "none");
1288}
1289
1290function setEditingFeaturesVisible(visible)
1291{
1292 if(visible)
1293 {
1294 $("#editContentButton").html("Hide editor");
1295 $("#editContentButtonDiv").attr("class", "ui-state-default ui-corner-all");
1296 }
1297 else
1298 {
1299 $("#editContentButton").html("Edit content");
1300 $("#editContentButtonDiv").attr("class", "");
1301 }
1302
1303 var visibility = (visible ? "" : "none");
1304 $("#metadataListLabel, #metadataSetList").css("display", visibility);
1305
1306 $(".editMetadataButton").each(function()
1307 {
1308 $(this).css("display", visibility);
1309 $(this.linkLabel).html("edit metadata");
1310 $(this.linkIcon).attr("class", "ui-icon ui-icon-folder-collapsed");
1311 });
1312
1313 $("table").each(function()
1314 {
1315 if($(this).attr("id") && $(this).attr("id").search(/^meta/) != -1)
1316 {
1317 $(this).css("display", "none");
1318 $(this.metaNameField).css("display", "none");
1319 $(this.addRowButton).css("display", "none");
1320 }
1321 });
1322}
1323
1324/* override this function in other interface/site/collection if you want
1325 a different set of metadata sets
1326 Use in conjunction with the dynamic_metadata_set_list variable. */
1327function setStaticMetadataSets(list) {
1328 addOptionToList(list, "All", "All");
1329}
1330
1331function readyPageForEditing()
1332{
1333 CKEDITOR.on('instanceReady', function(evt) {
1334 addCKEEditableState(evt,editableInitStates);
1335 });
1336
1337 if($("#metadataSetList").length)
1338 {
1339 var setList = $("#metadataSetList");
1340 if(!setList.css("display") || setList.css("display") == "")
1341 {
1342 setEditingFeaturesVisible(false);
1343 }
1344 else
1345 {
1346 setEditingFeaturesVisible(true);
1347 }
1348 return;
1349 }
1350
1351 $("#editContentButton").html("Hide Editor");
1352 //wait for 0.5 sec to let ckeditor up
1353 //setTimeout(function(){ $(".sectionText").each(function(){addEditableState(this,editableInitStates);}); }, 500);
1354 var editBar = $("#editBarLeft");
1355
1356 var visibleMetadataList = $("<select>", {"id": "metadataSetList", "class": "ui-state-default"});
1357 setStaticMetadataSets(visibleMetadataList);
1358
1359 var metadataListLabel = $("<span>", {"id": "metadataListLabel", "style": "margin-left:20px;"});
1360 metadataListLabel.html("Visible metadata: ");
1361 editBar.append(metadataListLabel);
1362 editBar.append(visibleMetadataList);
1363 visibleMetadataList.change(onVisibleMetadataSetChange);
1364 editBar.append("<br>");
1365 for (var i=0; i< save_and_rebuild_buttons.length; i++) {
1366 var button_type = save_and_rebuild_buttons[i];
1367 if (button_type == "save") {
1368 var saveButton = $("<button>", {"id": "saveButton", "class": "ui-state-default ui-corner-all"});
1369 saveButton.click(save);
1370 saveButton.html(save_button_text);
1371 editBar.append(saveButton);
1372 } else if(button_type == "rebuild") {
1373 var rebuildButton = $("<button>", {"id": "rebuildButton", "class": "ui-state-default ui-corner-all"});
1374 rebuildButton.click(rebuildCurrentCollection);
1375 rebuildButton.html(rebuild_button_text);
1376 editBar.append(rebuildButton);
1377 } else if (button_type == "saveandrebuild") {
1378 var saveAndRebuildButton = $("<button>", {"id": "saveAndRebuildButton", "class": "ui-state-default ui-corner-all"});
1379 saveAndRebuildButton.click(saveAndRebuild);
1380 saveAndRebuildButton.html(save_and_rebuild_button_text);
1381 editBar.append(saveAndRebuildButton);
1382
1383 }
1384 }
1385 var statusBarDiv = $("<div>");
1386 editBar.append(statusBarDiv);
1387 _statusBar = new StatusBar(statusBarDiv[0]);
1388
1389 var titleDivs = $(".sectionTitle");
1390 for(var i = 0; i < titleDivs.length; i++)
1391 {
1392 addEditMetadataLink(titleDivs[i]);
1393 }
1394
1395 _baseURL = gs.xsltParams.library_name;
1396 onVisibleMetadataSetChange(); // make sure that the selected item in the list is active
1397}
1398
1399// override the one in documentmaker_scripts_util
1400// currently not used if other one is present. need to get the js include order right
1401function enableSaveButtons(enabled) {
1402 if (enabled) {
1403 $("#saveButton, #rebuildButton, #saveAndRebuildButton").removeAttr("disabled");
1404 } else {
1405 $("#saveButton, #rebuildButton, #saveAndRebuildButton").attr("disabled", "disabled");
1406 }
1407}
1408
1409/* this is a cut down version of save() from documentmaker_scripts_util.js
1410 going back to using save, will delete this once everything working*/
1411function saveMetadataChangesOld() {
1412
1413 console.log("Saving metadata changes");
1414
1415 // get collection name
1416 var collection = gs.cgiParams.c;;
1417
1418 // get document id
1419 var docID = gs.cgiParams.d;
1420
1421 var metadataChanges = new Array();
1422 if (_deletedMetadata.length > 0) {
1423
1424 for(var i = 0; i < _deletedMetadata.length; i++) {
1425
1426 var currentRow = _deletedMetadata[i];
1427
1428 //Get metadata name
1429 var cells = currentRow.getElementsByTagName("TD");
1430 var nameCell = cells[0];
1431 var name = nameCell.innerHTML;
1432 var valueCell = cells[1];
1433 var value = valueCell.innerHTML;
1434 metadataChanges.push({type:'delete', docID:docID, name:name, value:value});
1435 removeFromParent(currentRow);
1436 }
1437 }
1438
1439 /*var changes = null;
1440 //var changes = de.Changes.getChangedEditableSections();
1441 for(var i = 0; i < changes.length; i++) {
1442
1443 var changedElem = changes[i];
1444
1445 //Get metadata name
1446 var row = changedElem.parentNode;
1447 var cells = row.getElementsByTagName("TD");
1448 var nameCell = cells[0];
1449 var name = nameCell.innerHTML;
1450 var value = changedElem.innerHTML;
1451 value = value.replace(/&nbsp;/g, " ");
1452
1453 var orig = changedElem.originalValue;
1454 if (orig) {
1455 orig = orig.replace(/&nbsp;/g, " ");
1456 }
1457 metadataChanges.push({collection:collection, docID:docID, name:name, value:value, orig:orig});
1458 changedElem.originalValue = changedElem.innerHTML;
1459
1460 }
1461*/
1462 if (metadataChanges.length ==0) {
1463 console.log ("... No changes detected. ");
1464 return;
1465 }
1466
1467 var processChangesLoop = function(index)
1468 {
1469 var change = metadataChanges[index];
1470
1471 var callbackFunction;
1472 if(index + 1 == metadataChanges.length)
1473 {
1474 callbackFunction = function(){console.log("Completed saving metadata changes. You must rebuild the collection for the changes to take effect.");};
1475 }
1476 else
1477 {
1478 callbackFunction = function(){processChangesLoop(index + 1)};
1479 }
1480 if (change.type == "delete") {
1481 gs.functions.removeArchivesMetadata(collection, gs.xsltParams.site_name, change.docID, change.name, null, change.value, function(){callbackFunction();});
1482 } else {
1483 if(change.orig)
1484 {
1485 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, change.orig, "override", function(){callbackFunction();});
1486 }
1487 else
1488 {
1489 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, null, "accumulate", function(){callbackFunction();});
1490 }
1491 }
1492 }
1493 processChangesLoop(0);
1494 /* need to clear the changes from the page */
1495 while (_deletedMetadata.length>0) {
1496 _deletedMetadata.pop();
1497 }
1498
1499}
1500
1501
1502
1503
1504
1505/***************
1506* MENU SCRIPTS *
1507***************/
1508function moveScroller() {
1509 var move = function() {
1510 var editbar = $("#editBar");
1511 var st = $(window).scrollTop();
1512 var fa = $("#float-anchor").offset().top;
1513 if(st > fa) {
1514
1515 editbar.css({
1516 position: "fixed",
1517 top: "0px",
1518 width: editbar.data("width"),
1519 //width: "30%"
1520 });
1521 } else {
1522 editbar.data("width", editbar.css("width"));
1523 editbar.css({
1524 position: "relative",
1525 top: "",
1526 width: ""
1527 });
1528 }
1529 };
1530 $(window).scroll(move);
1531 move();
1532}
1533
1534
1535function floatMenu(enabled)
1536{
1537 var menu = $(".tableOfContentsContainer");
1538 if(enabled)
1539 {
1540 menu.data("position", menu.css("position"));
1541 menu.data("width", menu.css("width"));
1542 menu.data("right", menu.css("right"));
1543 menu.data("top", menu.css("top"));
1544 menu.data("max-height", menu.css("max-height"));
1545 menu.data("overflow", menu.css("overflow"));
1546 menu.data("z-index", menu.css("z-index"));
1547
1548 menu.css("position", "fixed");
1549 menu.css("width", "300px");
1550 menu.css("right", "0px");
1551 menu.css("top", "100px");
1552 menu.css("max-height", "600px");
1553 menu.css("overflow", "auto");
1554 menu.css("z-index", "200");
1555
1556 $("#unfloatTOCButton").show();
1557 }
1558 else
1559 {
1560 menu.css("position", menu.data("position"));
1561 menu.css("width", menu.data("width"));
1562 menu.css("right", menu.data("right"));
1563 menu.css("top", menu.data("top"));
1564 menu.css("max-height", menu.data("max-height"));
1565 menu.css("overflow", menu.data("overflow"));
1566 menu.css("z-index", menu.data("z-index"));
1567
1568 $("#unfloatTOCButton").hide();
1569 $("#floatTOCToggle").prop("checked", false);
1570 }
1571
1572 var url = gs.xsltParams.library_name + "?a=d&ftoc=" + (enabled ? "1" : "0") + "&c=" + gs.cgiParams.c;
1573
1574 $.ajax(url);
1575}
1576
1577/********************
1578* SLIDESHOW SCRIPTS *
1579********************/
1580
1581function showSlideShow()
1582{
1583 if(!($("#gs-slideshow").length))
1584 {
1585 var slideshowDiv = $("<div>", {id:"gs-slideshow", style:"height:100%;"});
1586 var loadingImage = $("<img>", {src:gs.imageURLs.loading});
1587 slideshowDiv.append(loadingImage);
1588
1589 $.blockUI({message: $(slideshowDiv), css:{top: "5%", left: "5%", width: "90%", height: "90%", overflow: "auto", cursor: "auto"}});
1590
1591 retrieveImagesForSlideShow(function(imageIDArray)
1592 {
1593 loadingImage.hide();
1594 if(imageIDArray && imageIDArray.length > 0)
1595 {
1596 var imageURLs = new Array();
1597 for(var i = 0; i < imageIDArray.length; i++)
1598 {
1599 if(imageIDArray[i].source && imageIDArray[i].source.search(/.*\.(gif|jpg|jpeg|png)$/) != -1)
1600 {
1601 imageURLs.push(gs.collectionMetadata.httpPath + "/index/assoc/" + gs.documentMetadata.assocfilepath + "/" + imageIDArray[i].source);
1602 }
1603 }
1604 new SlideShowWidget(slideshowDiv, imageURLs, imageIDArray);
1605 }
1606 });
1607 }
1608 else
1609 {
1610 $("#gs-slideshow").show();
1611 }
1612}
1613
1614function retrieveImagesForSlideShow(callback)
1615{
1616 var template = "";
1617 template += '<xsl:template match="/">';
1618 template += '<images>[';
1619 template += '<xsl:for-each select="//documentNode">';
1620 template += '<xsl:text disable-output-escaping="yes">{"source":"</xsl:text><gsf:metadata name="Source"/><xsl:text disable-output-escaping="yes">",</xsl:text>';
1621 template += '<xsl:text disable-output-escaping="yes">"id":"</xsl:text><xsl:value-of select="@nodeID"/><xsl:text disable-output-escaping="yes">"}</xsl:text>';
1622 template += '<xsl:if test="position() != count(//documentNode)">,</xsl:if>';
1623 template += '</xsl:for-each>';
1624 template += ']</images>';
1625 template += '</xsl:template>';
1626
1627 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + gs.cgiParams.d + "?ed=1&ilt=" + template.replace(" ", "%20");
1628
1629 $.ajax(
1630 {
1631 url:url,
1632 success: function(data)
1633 {
1634 var startIndex = data.indexOf(">", data.indexOf(">") + 1) + 1;
1635 var endIndex = data.lastIndexOf("<");
1636 var arrayString = data.substring(startIndex, endIndex);
1637 var imageIDArray = eval(arrayString);
1638
1639 callback(imageIDArray);
1640 }
1641 });
1642}
1643
1644function SlideShowWidget(mainDiv, images, idArray)
1645{
1646 var _inTransition = false;
1647 var _images = new Array();
1648 var _mainDiv = mainDiv;
1649 var _imageDiv = $("<div>", {id:"ssImageDiv", style:"height:95%; overflow:auto;"});
1650 var _navDiv = $("<div>", {style:"height:5%;"});
1651 var _nextButton = $("<img>", {src:gs.imageURLs.next, style:"float:right; cursor:pointer;"});
1652 var _prevButton = $("<img>", {src:gs.imageURLs.prev, style:"float:left; cursor:pointer; display:none;"});
1653 var _closeLink = $("<a href=\"javascript:$.unblockUI()\">Close Slideshow</a>");
1654 var _clearDiv = $("<div>", {style:"clear:both;"});
1655 var _currentIndex = 0;
1656
1657 _navDiv.append(_nextButton);
1658 _navDiv.append(_closeLink);
1659 _navDiv.append(_prevButton);
1660 _navDiv.append(_clearDiv);
1661 _mainDiv.append(_navDiv);
1662 _mainDiv.append(_imageDiv);
1663
1664 for(var i = 0; i < images.length; i++)
1665 {
1666 _images.push($("<img>", {src:images[i], "class":"slideshowImage"}));
1667 }
1668
1669 if(_images.length < 2)
1670 {
1671 _nextButton.css("display", "none");
1672 }
1673
1674 _imageDiv.append(_images[0]);
1675
1676 this.nextImage = function()
1677 {
1678 if(!_inTransition)
1679 {
1680 _inTransition = true;
1681 if((_currentIndex + 1) < _images.length)
1682 {
1683 _prevButton.css("display", "");
1684 if(_currentIndex + 1 == _images.length - 1)
1685 {
1686 _nextButton.css("display", "none");
1687 }
1688
1689 _imageDiv.fadeOut(500, function()
1690 {
1691 _imageDiv.empty();
1692 _imageDiv.append(_images[_currentIndex + 1]);
1693 _currentIndex++;
1694 _imageDiv.fadeIn(500, function()
1695 {
1696 _inTransition = false;
1697 });
1698 });
1699 }
1700 else
1701 {
1702 _inTransition = false;
1703 }
1704 }
1705 }
1706
1707 this.prevImage = function()
1708 {
1709 if(!_inTransition)
1710 {
1711 _inTransition = true;
1712 if((_currentIndex - 1) >= 0)
1713 {
1714 _nextButton.css("display", "");
1715 if(_currentIndex - 1 == 0)
1716 {
1717 _prevButton.css("display", "none");
1718 }
1719
1720 _imageDiv.fadeOut(500, function()
1721 {
1722 _imageDiv.empty();
1723 _imageDiv.append(_images[_currentIndex - 1]);
1724 _currentIndex--;
1725 _imageDiv.fadeIn(500, function()
1726 {
1727 _inTransition = false;
1728 });
1729 });
1730 }
1731 else
1732 {
1733 _inTransition = false;
1734 }
1735 }
1736 }
1737
1738 var getRootFilenameFromURL = function(url)
1739 {
1740 var urlSegments = url.split("/");
1741 var filename = urlSegments[urlSegments.length - 1];
1742 return filename.replace(/_thumb\..*$/, "");
1743 }
1744
1745 var setLink = function(currentLink, index)
1746 {
1747 $(currentLink).click(function()
1748 {
1749 _inTransition = true;
1750 _currentIndex = index;
1751 _imageDiv.fadeOut(500, function()
1752 {
1753 _imageDiv.empty();
1754 _imageDiv.append(_images[_currentIndex]);
1755 _imageDiv.fadeIn(500, function()
1756 {
1757 _inTransition = false;
1758 });
1759 });
1760 });
1761 }
1762
1763 var sliderLinks = $(".pageSliderCol a");
1764 for(var i = 0; i < sliderLinks.length; i++)
1765 {
1766 var currentLink = sliderLinks[i];
1767 var id = $(currentLink).attr("href").split("'")[1];
1768
1769 for(var j = 0; j < idArray.length; j++)
1770 {
1771 if(idArray[j].id == id)
1772 {
1773 var image = idArray[j].source;
1774
1775 for(var l = 0; l < images.length; l++)
1776 {
1777 var filename = getRootFilenameFromURL(images[l]);
1778 if (filename == image)
1779 {
1780 setLink(currentLink, l);
1781 break;
1782 }
1783 }
1784
1785 break;
1786 }
1787 }
1788 }
1789
1790 _nextButton.click(this.nextImage);
1791 _prevButton.click(this.prevImage);
1792}
Note: See TracBrowser for help on using the repository browser.