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

Last change on this file since 30733 was 30733, checked in by kjdon, 8 years ago

modified how the texts are added to the init states. Use ckeditor to add them, otherwise they get added, then ckeditor modifies them, then every section text will appear changed and be sent to setText

  • Property svn:executable set to *
File size: 47.3 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 var loading = $("#tocLoadingImage");
619 loading.remove();
620 })
621 .error(function()
622 {
623 setTimeout(function(){retrieveTableOfContentsAndTitles();}, 1000);
624 });
625}
626
627function replaceLinksWithSlider()
628{
629 var tableOfContents = $("#tableOfContents");
630
631 var leafSections = new Array();
632 var liElems = tableOfContents.find("li").each(function()
633 {
634 var section = $(this);
635 var add = true;
636 for(var j = 0; j < leafSections.length; j++)
637 {
638 if(leafSections[j] == undefined){continue;}
639
640 var leaf = $(leafSections[j]);
641 if(leaf.attr("id").search(section.attr("id")) != -1)
642 {
643 add = false;
644 }
645
646 if(section.attr("id").search(leaf.attr("id")) != -1)
647 {
648 delete leafSections[j];
649 }
650 }
651
652 if(add)
653 {
654 leafSections.push(section);
655 }
656 });
657
658 for(var i = 0 ; i < leafSections.length; i++)
659 {
660 if(leafSections[i] == undefined){continue;}
661
662 leafSections[i].css("display", "none");
663 var links = leafSections[i].find("a");
664
665 var widget = new SliderWidget(links);
666 leafSections[i].before(widget.getElem());
667 }
668
669 //Disable all TOC toggles
670 var imgs = $("img").each(function()
671 {
672 var currentImage = $(this);
673 if(currentImage.attr("id") && currentImage.attr("id").search(/^ttoggle/) != -1)
674 {
675 currentImage.attr("onclick", "");
676 currentImage.click(function()
677 {
678 var sliderDiv = currentImage.parents("table").first().next();
679 if(sliderDiv.is(":visible"))
680 {
681 sliderDiv.hide();
682 }
683 else
684 {
685 sliderDiv.show();
686 }
687 });
688 }
689 else if(currentImage.attr("id") && currentImage.attr("id").search(/^dtoggle/) != -1)
690 {
691 currentImage.attr("onclick", currentImage.attr("onclick").replace(/\)/, ", null, true)"));
692 }
693 });
694}
695
696
697function SliderWidget(_links)
698{
699 //****************
700 //MEMBER VARIABLES
701 //****************
702
703 //The container for the widget
704 var _mainDiv = $("<div>");
705 _mainDiv.attr("class", "ui-widget-content pageSlider");
706
707 //The table of images
708 var _linkTable = $("<table>");
709 _mainDiv.append(_linkTable);
710
711 //The image row of the table
712 var _linkRow = $("<tr>");
713 _linkTable.append(_linkRow);
714
715 //The list of titles we can search through
716 var _titles = new Array();
717
718 //Keep track of the slider position
719 var _prevScroll = 0;
720
721 //****************
722 //PUBLIC FUNCTIONS
723 //****************
724
725 //Function that returns the widget element
726 this.getElem = function()
727 {
728 return _mainDiv;
729 }
730
731 //*****************
732 //PRIVATE FUNCTIONS
733 //*****************
734
735 // _filter_on_types can be "sectionnum", "sectiontitle"
736 var setUpFilterButtons = function() {
737
738 var button_div = $("#filterOnButtons");
739 button_div.onclick = doFiltering;
740 button_div.html("radio");
741 if (_filter_on_types.length == 0) {
742 _filter_on_types = ["sectionnum", "sectiontitle"];
743 }
744 else if (_filter_on_types.length == 1) {
745 if (_filter_on_types[0] == "sectionnum") {
746 button_div.html("(<input type='radio' name='filterOn' value='num' checked>"+_filter_on_num_text+"</input>)");
747 } else {
748 button_div.html("(<input type='radio' name='filterOn' value='title' checked>"+_filter_on_title_text+"</input>)");
749 }
750 } else {
751 // should be both options
752 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>");
753 }
754}
755
756 var doFiltering = function () {
757 if (typeof _titles == "undefined") {
758 return;
759 }
760
761 var filter_string = $("#filterText").val();
762 var filter_type = $('input[name="filterOn"]:checked').val();
763
764 var index = 2; // section num
765 var numeric_match = true;
766 if (filter_type == "title") {
767 index = 3;
768 if (_filter_title_numeric != true) {
769 numeric_match = false;
770 }
771
772 }
773 var values = filter_string.split(",");
774
775 var matchingTitles = new Array();
776
777 for (var l = 0; l < values.length; l++)
778 {
779 var currentValue = values[l].replace(/^ +/g, "").replace(/ +$/g, "");
780 if (numeric_match) {
781 var isRange = (currentValue.search(/\d+-\d+/) != -1);
782 if (isRange) {
783 var firstNumber = currentValue.replace(/(\d+)-\d+/, "$1");
784 var secondNumber = currentValue.replace(/\d+-(\d+)/, "$1");
785
786 if(firstNumber <= secondNumber)
787 {
788 for(var i = firstNumber; i <= secondNumber; i++)
789 {
790 var numString = i + "";
791 for(var j = 0; j < _titles.length; j++) {
792
793 var currentTitle = _titles[j];
794 if(currentTitle[index] == numString) {
795 matchingTitles.push(currentTitle);
796 }
797 }
798 }
799 }
800 } // if isRange
801 else {
802 for(var j = 0; j < _titles.length; j++) {
803 if (_titles[j][index]==currentValue) {
804 matchingTitles.push(_titles[j]);
805 }
806 }
807
808 }
809
810 } else { // not numeric match.
811 // need to do a search
812 for(var i = 0; i < _titles.length; i++)
813 {
814 var currentTitle = _titles[i];
815 if(currentTitle[index].toLowerCase().search(currentValue.toLowerCase().replace(/\./g, "\\.")) != -1)
816 {
817 matchingTitles.push(currentTitle);
818 }
819 }
820 }
821 } // for each value from filter string
822
823 // set all to hide...
824 for(var i = 0; i < _titles.length; i++)
825 {
826 $(_titles[i][1].cell).css("display", "none");
827 }
828
829 // .. then display the matching ones
830 for(var i = 0; i < matchingTitles.length; i++)
831 {
832 $(matchingTitles[i][1].cell).css("display", "table-cell");
833 }
834}
835
836 var setUpFilterBox = function()
837 {
838 var filter = $("#filterText");
839
840 filter.keyup(function()
841 {
842 doFiltering();
843 });
844 }
845
846 var getImage = function(page, attemptNumber)
847 {
848 var href = page.getAttribute("href");
849 var startHREF = href.indexOf("'") + 1;
850 var endHREF = href.indexOf("'", startHREF);
851 var nodeID = href.substring(startHREF, endHREF);
852 href = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + nodeID;
853
854 var template = '';
855 template += '<xsl:template match="/">';
856 template += '<gsf:metadata name=\"Thumb\"/>';
857 template += '<html>';
858 template += '<img>';
859 template += '<xsl:attribute name="src">';
860 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/collection/metadataList/metadata[@name = 'httpPath']\"/>";
861 template += '<xsl:text>/index/assoc/</xsl:text>';
862 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/metadataList/metadata[@name = 'assocfilepath']\"/>";
863 template += '<xsl:text>/</xsl:text>';
864 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document//documentNode[@nodeID = '" + nodeID + "']/metadataList/metadata[@name = 'Thumb']\"/>";
865 template += '</xsl:attribute>';
866 template += '</img>';
867 template += '<p>';
868 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/documentNode/metadataList/metadata[@name = 'Title']\"/>";
869 template += '</p>';
870 template += '</html>';
871 template += '</xsl:template>';
872
873 var url = href + "?ilt=" + template.replace(" ", "%20");
874 $.ajax(url)
875 .success(function(text)
876 {
877 var hrefStart = text.indexOf("src=\"") + 5;
878 if(hrefStart == -1)
879 {
880 page.isLoading = false;
881 page.noImage = true;
882 $(page.image).attr("src", gs.imageURLs.blank);
883 return;
884 }
885 var hrefEnd = text.indexOf("\"", hrefStart);
886 var href = text.substring(hrefStart, hrefEnd);
887
888 var image = $("<img>");
889 image.load(function()
890 {
891 $(page.link).html("");
892 $(page.link).append(image);
893 page.isLoading = false;
894 page.imageLoaded = true;
895 });
896 image.error(function()
897 {
898 if(!attemptNumber || attemptNumber < 3)
899 {
900 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
901 }
902 else
903 {
904 page.isLoading = false;
905 page.noImage = true;
906 image.attr("src", gs.imageURLs.blank);
907 }
908 });
909 image.attr("src", href);
910
911 var titleStart = text.indexOf("<p>") + 3;
912 var titleEnd = text.indexOf("</p>");
913 var title = text.substring(titleStart, titleEnd);
914 })
915 .error(function()
916 {
917 page.failed = true;
918 if(!attemptNumber || attemptNumber < 3)
919 {
920 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
921 }
922 else
923 {
924 var image = $("<img>", {"src": gs.imageURLs.blank});
925 $(page.link).html("");
926 $(page.link).append(image);
927 page.isLoading = false;
928 page.noImage = true;
929 }
930 });
931 }
932
933 var startCheckFunction = function()
934 {
935 var checkFunction = function(forced)
936 {
937 //Don't bother checking if we haven't scrolled very far
938 if(Math.abs(_mainDiv.scrollLeft() - _prevScroll) > 100 || forced)
939 {
940 _prevScroll = _mainDiv.scrollLeft();
941 _checking = true;
942 var widgetLeft = _mainDiv.offset().left;
943 var widgetRight = widgetLeft + _mainDiv.width();
944
945 var visiblePages = new Array();
946 for(var i = 0; i < _links.length; i++)
947 {
948 var current = _links[i].cell;
949 var currentLeft = current.offset().left;
950 var currentRight = currentLeft + current.width();
951
952 if(currentRight > widgetLeft && currentLeft < widgetRight)
953 {
954 visiblePages.push(_links[i]);
955 }
956 }
957
958 for(var i = 0; i < visiblePages.length; i++)
959 {
960 var page = visiblePages[i];
961 if(!page || page.imageLoaded || page.noImage || page.isLoading)
962 {
963 continue;
964 }
965
966 page.isLoading = true;
967 getImage(page);
968 }
969 _checking = false;
970 }
971 }
972
973 setTimeout(checkFunction, 250);
974 setInterval(function(){checkFunction(true)}, 2000);
975 _mainDiv.scroll(checkFunction);
976 }
977
978 //***********
979 //CONSTRUCTOR
980 //***********
981
982 for(var i = 0; i < _links.length; i++)
983 {
984 var col = $("<td>");
985 _linkRow.append(col);
986 col.addClass("pageSliderCol");
987 _links[i].cell = col;
988
989 var link = $("<a>");
990 col.append(link);
991 _links[i].link = link;
992 var href = $(_links[i]).attr("href");
993 link.attr("href", href.replace(/\)/, ", 0, true)"));
994
995 if(!_linkCellMap[href])
996 {
997 _linkCellMap[href] = new Array();
998 }
999 _linkCellMap[href].push(_links[i]);
1000
1001 var loadingText = $("<p>Loading image</p>");
1002 link.append(loadingText);
1003
1004 var image = $("<img>");
1005 link.append(image);
1006 image.attr("src", gs.imageURLs.loading);
1007 _links[i].image = image;
1008
1009 var title = $(_links[i]).html();
1010 var t_section = "";
1011 var t_title = "";
1012 if (title.search(/tocSectionNumber/) != -1)
1013 {
1014 var matching_regex = /<span class=\"tocSectionNumber\">([0-9]+)<\/span>[\s\S]*<span class=\"tocSectionTitle\">(.+)<\/span>$/mg;
1015 var matches_array = matching_regex.exec(title);
1016 if (matches_array != null && matches_array.length == 3) {
1017 t_section = matches_array[1];
1018 t_title = matches_array[2];
1019 }
1020 }
1021
1022 _titles.push([title, _links[i], t_section, t_title]);
1023
1024 col.append($("<br>"));
1025 col.append(title);
1026 }
1027
1028 setUpFilterBox();
1029 setUpFilterButtons();
1030 startCheckFunction();
1031 }
1032
1033/***********************
1034* HIGHLIGHTING SCRIPTS *
1035***********************/
1036function swapHighlight(imageClicked)
1037{
1038 var hlCheckbox = $("#highlightOption");
1039 if(imageClicked)
1040 {
1041 // toggle the state of the checkbox
1042 $(hlCheckbox).prop("checked", !$(hlCheckbox).prop("checked"));
1043 }
1044 var from;
1045 var to;
1046 if(hlCheckbox.prop("checked"))
1047 {
1048 from = "noTermHighlight";
1049 to = "termHighlight";
1050 }
1051 else
1052 {
1053 from = "termHighlight";
1054 to = "noTermHighlight";
1055 }
1056
1057 var spans = $("span").each(function()
1058 {
1059 if($(this).hasClass(from))
1060 {
1061 $(this).removeClass(from);
1062 $(this).addClass(to);
1063 }
1064 });
1065}
1066
1067/**************************
1068* REALISTIC BOOKS SCRIPTS *
1069**************************/
1070
1071function bookInit()
1072{
1073 loadBook();
1074 hideText();
1075 showBook();
1076 swapLinkJavascript(false);
1077}
1078
1079function hideText()
1080{
1081 $("#gs-document-text").css("visibility", "hidden");
1082}
1083
1084function showText()
1085{
1086 $("#gs-document-text").css("visibility", "visible");
1087}
1088
1089function hideBook()
1090{
1091 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "hidden", "height": "0px"});
1092}
1093
1094function showBook()
1095{
1096 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "visible", "height": "600px"});
1097}
1098
1099function swapLinkJavascript(rbOn)
1100{
1101 var option = $("#rbOption");
1102 var optionImage = $("#rbOptionImage");
1103
1104 if(rbOn)
1105 {
1106 option.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1107 optionImage.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1108 $(option).prop("checked", false);
1109 }
1110 else
1111 {
1112 option.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1113 optionImage.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1114 $(option).prop("checked", true);
1115 }
1116}
1117
1118function loadBook()
1119{
1120 var doc_url = document.URL;
1121 doc_url = doc_url.replace(/(&|\?)book=[a-z]+/gi,'');
1122 doc_url += '&book=flashxml';
1123
1124 var img_cover = gs.collectionMetadata.httpPath + '/index/assoc/' + gs.documentMetadata.assocfilepath + '/cover.jpg';
1125
1126 var flash_plug_html = ""
1127 flash_plug_html += '<OBJECT align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" \n';
1128 flash_plug_html += ' height="600px" id="bookObject" swLiveConnect="true" \n';
1129 flash_plug_html += ' codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" \n';
1130 flash_plug_html += ' width="70%">\n';
1131 flash_plug_html += ' <PARAM name="allowScriptAccess" value="always" />\n';
1132 flash_plug_html += ' <PARAM name="movie" value="Book.swf';
1133 flash_plug_html += '?src_image=' + escape(img_cover);
1134 flash_plug_html += '&doc_url=' + escape(doc_url);
1135 flash_plug_html += '" />\n';
1136 flash_plug_html += ' <PARAM name="quality" value="high" />\n';
1137 flash_plug_html += ' <PARAM name="bgcolor" value="#FFFFFF" />\n';
1138 flash_plug_html += ' <EMBED align="middle" \n';
1139 flash_plug_html += ' allowScriptAccess="always" swLiveConnect="true" \n';
1140 flash_plug_html += ' bgcolor="#FFFFFF" height="600px" name="Book" \n';
1141 flash_plug_html += ' pluginspage="http://www.macromedia.com/go/getflashplayer" \n';
1142 flash_plug_html += ' quality="high" id="bookEmbed"\n';
1143 flash_plug_html += ' src="Book.swf';
1144 flash_plug_html += '?src_image=' + escape(img_cover);
1145 flash_plug_html += '&doc_url=' + escape(doc_url);
1146 flash_plug_html += '"\n';
1147 flash_plug_html += ' type="application/x-shockwave-flash" width="70%" />\n';
1148 flash_plug_html += '</OBJECT>\n';
1149 $("#bookdiv").html(flash_plug_html);
1150}
1151
1152/************************
1153* CHANGES SCRIPTS *
1154************************/
1155
1156function addCKEEditableState(evt,stateArray)
1157{
1158 // Event->Editor->CKE DOM Inline Element that editor was for->underlying jquery element
1159 element = evt.editor.element.$;
1160 nodeText = element.innerHTML;
1161 stateArray.push({
1162 editableNode : element,
1163 initHTML : nodeText
1164 });
1165
1166}
1167function addEditableState(editable,stateArray)
1168{
1169
1170 if(editable.tagName == 'TEXTAREA')
1171 {
1172 nodeText = editable.value;
1173 }
1174 else
1175 {
1176 nodeText = editable.innerHTML;
1177 }
1178
1179 stateArray.push({
1180 editableNode : editable,
1181 initHTML : nodeText
1182 });
1183
1184}
1185
1186function getLastEditableStates()
1187{
1188 editableLastStates = [];
1189 $(".sectionText").each(function(){addEditableState(this,editableLastStates);});
1190 $(".metaTableCellArea").each(function(){addEditableState(this,editableLastStates);});
1191
1192}
1193
1194function changesToUpdate()
1195{
1196 var resultArray = new Array();
1197 getLastEditableStates();
1198 for (var j in editableLastStates)
1199 {
1200 if (isNodeChanged(editableLastStates[j]))
1201 {
1202 resultArray.push(editableLastStates[j].editableNode);
1203 }
1204 }
1205 return resultArray;
1206}
1207
1208
1209function isNodeChanged(StateToCheck){
1210 for (var i in editableInitStates)
1211 {
1212 if ((StateToCheck.editableNode === editableInitStates[i].editableNode)) {
1213 if ( StateToCheck.initHTML === editableInitStates[i].initHTML )
1214 {
1215 return false;
1216 }
1217 return true;
1218 }
1219
1220 }
1221 return true;
1222}
1223/************************
1224* METADATA EDIT SCRIPTS *
1225************************/
1226
1227function addEditMetadataLink(cell)
1228{
1229 cell = $(cell);
1230 var id = cell.attr("id").substring(6);
1231 var metaTable = gs.jqGet("meta" + id);
1232
1233 var row = cell.parent();
1234 var newCell = $("<td>", {"style": "font-size:0.7em; padding:0px 10px", "class": "editMetadataButton"});
1235 var linkSpan = $("<span>", {"class": "ui-state-default ui-corner-all", "style": "padding: 2px; float:left;"});
1236
1237 var linkLabel = $("<span>edit metadata</span>");
1238 var linkIcon = $("<span>", {"class": "ui-icon ui-icon-folder-collapsed"});
1239 newCell.linkIcon = linkIcon;
1240 newCell.linkLabel = linkLabel;
1241
1242 var uList = $("<ul>", {"style": "outline: 0 none; margin:0px; padding:0px;"});
1243 var labelItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1244 var iconItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1245
1246 uList.append(iconItem);
1247 uList.append(labelItem);
1248 labelItem.append(linkLabel);
1249 iconItem.append(linkIcon);
1250
1251 var newLink = $("<a>", {"href": "javascript:;"});
1252 newLink.click(function()
1253 {
1254 if(metaTable.css("display") == "none")
1255 {
1256 linkLabel.html("hide metadata");
1257 linkIcon.attr("class", "ui-icon ui-icon-folder-open");
1258 metaTable.css("display", "block");
1259 metaTable.metaNameField.css("display", "inline");
1260 metaTable.addRowButton.css("display", "inline");
1261 }
1262 else
1263 {
1264 linkLabel.html("edit metadata");
1265 linkIcon.attr("class", "ui-icon ui-icon-folder-collapsed");
1266 metaTable.css("display", "none");
1267 metaTable.metaNameField.css("display", "none");
1268 metaTable.addRowButton.css("display", "none");
1269 }
1270 });
1271
1272 newLink.append(uList);
1273 linkSpan.append(newLink);
1274 newCell.append(linkSpan);
1275 row.append(newCell);
1276
1277 addFunctionalityToTable(metaTable);
1278 metaTable.metaNameField.css("display", "none");
1279 metaTable.addRowButton.css("display", "none");
1280}
1281
1282function setEditingFeaturesVisible(visible)
1283{
1284 if(visible)
1285 {
1286 $("#editContentButton").html("Hide editor");
1287 $("#editContentButtonDiv").attr("class", "ui-state-default ui-corner-all");
1288 }
1289 else
1290 {
1291 $("#editContentButton").html("Edit content");
1292 $("#editContentButtonDiv").attr("class", "");
1293 }
1294
1295 var visibility = (visible ? "" : "none");
1296 $("#metadataListLabel, #metadataSetList").css("display", visibility);
1297
1298 $(".editMetadataButton").each(function()
1299 {
1300 $(this).css("display", visibility);
1301 $(this.linkLabel).html("edit metadata");
1302 $(this.linkIcon).attr("class", "ui-icon ui-icon-folder-collapsed");
1303 });
1304
1305 $("table").each(function()
1306 {
1307 if($(this).attr("id") && $(this).attr("id").search(/^meta/) != -1)
1308 {
1309 $(this).css("display", "none");
1310 $(this.metaNameField).css("display", "none");
1311 $(this.addRowButton).css("display", "none");
1312 }
1313 });
1314}
1315
1316/* override this function in other interface/site/collection if you want
1317 a different set of metadata sets
1318 Use in conjunction with the dynamic_metadata_set_list variable. */
1319function setStaticMetadataSets(list) {
1320 addOptionToList(list, "All", "All");
1321}
1322
1323function readyPageForEditing()
1324{
1325 CKEDITOR.on('instanceReady', function(evt) {
1326 addCKEEditableState(evt,editableInitStates);
1327 });
1328
1329 if($("#metadataSetList").length)
1330 {
1331 var setList = $("#metadataSetList");
1332 if(!setList.css("display") || setList.css("display") == "")
1333 {
1334 setEditingFeaturesVisible(false);
1335 }
1336 else
1337 {
1338 setEditingFeaturesVisible(true);
1339 }
1340 return;
1341 }
1342
1343 $("#editContentButton").html("Hide Editor");
1344 //wait for 0.5 sec to let ckeditor up
1345 //setTimeout(function(){ $(".sectionText").each(function(){addEditableState(this,editableInitStates);}); }, 500);
1346 var editBar = $("#editBarLeft");
1347
1348 var visibleMetadataList = $("<select>", {"id": "metadataSetList", "class": "ui-state-default"});
1349 setStaticMetadataSets(visibleMetadataList);
1350
1351 var metadataListLabel = $("<span>", {"id": "metadataListLabel", "style": "margin-left:20px;"});
1352 metadataListLabel.html("Visible metadata: ");
1353 editBar.append(metadataListLabel);
1354 editBar.append(visibleMetadataList);
1355 visibleMetadataList.change(onVisibleMetadataSetChange);
1356 editBar.append("<br>");
1357 for (var i=0; i< save_and_rebuild_buttons.length; i++) {
1358 var button_type = save_and_rebuild_buttons[i];
1359 if (button_type == "save") {
1360 var saveButton = $("<button>", {"id": "saveButton", "class": "ui-state-default ui-corner-all"});
1361 saveButton.click(save);
1362 saveButton.html(save_button_text);
1363 editBar.append(saveButton);
1364 } else if(button_type == "rebuild") {
1365 var rebuildButton = $("<button>", {"id": "rebuildButton", "class": "ui-state-default ui-corner-all"});
1366 rebuildButton.click(rebuildCurrentCollection);
1367 rebuildButton.html(rebuild_button_text);
1368 editBar.append(rebuildButton);
1369 } else if (button_type == "saveandrebuild") {
1370 var saveAndRebuildButton = $("<button>", {"id": "saveAndRebuildButton", "class": "ui-state-default ui-corner-all"});
1371 saveAndRebuildButton.click(saveAndRebuild);
1372 saveAndRebuildButton.html(save_and_rebuild_button_text);
1373 editBar.append(saveAndRebuildButton);
1374
1375 }
1376 }
1377 var statusBarDiv = $("<div>");
1378 editBar.append(statusBarDiv);
1379 _statusBar = new StatusBar(statusBarDiv[0]);
1380
1381 var titleDivs = $(".sectionTitle");
1382 for(var i = 0; i < titleDivs.length; i++)
1383 {
1384 addEditMetadataLink(titleDivs[i]);
1385 }
1386
1387 _baseURL = gs.xsltParams.library_name;
1388 onVisibleMetadataSetChange(); // make sure that the selected item in the list is active
1389}
1390
1391// override the one in documentmaker_scripts_util
1392// currently not used if other one is present. need to get the js include order right
1393function enableSaveButtons(enabled) {
1394 if (enabled) {
1395 $("#saveButton, #rebuildButton, #saveAndRebuildButton").removeAttr("disabled");
1396 } else {
1397 $("#saveButton, #rebuildButton, #saveAndRebuildButton").attr("disabled", "disabled");
1398 }
1399}
1400
1401/* this is a cut down version of save() from documentmaker_scripts_util.js
1402 going back to using save, will delete this once everything working*/
1403function saveMetadataChangesOld() {
1404
1405 console.log("Saving metadata changes");
1406
1407 // get collection name
1408 var collection = gs.cgiParams.c;;
1409
1410 // get document id
1411 var docID = gs.cgiParams.d;
1412
1413 var metadataChanges = new Array();
1414 if (_deletedMetadata.length > 0) {
1415
1416 for(var i = 0; i < _deletedMetadata.length; i++) {
1417
1418 var currentRow = _deletedMetadata[i];
1419
1420 //Get metadata name
1421 var cells = currentRow.getElementsByTagName("TD");
1422 var nameCell = cells[0];
1423 var name = nameCell.innerHTML;
1424 var valueCell = cells[1];
1425 var value = valueCell.innerHTML;
1426 metadataChanges.push({type:'delete', docID:docID, name:name, value:value});
1427 removeFromParent(currentRow);
1428 }
1429 }
1430
1431 /*var changes = null;
1432 //var changes = de.Changes.getChangedEditableSections();
1433 for(var i = 0; i < changes.length; i++) {
1434
1435 var changedElem = changes[i];
1436
1437 //Get metadata name
1438 var row = changedElem.parentNode;
1439 var cells = row.getElementsByTagName("TD");
1440 var nameCell = cells[0];
1441 var name = nameCell.innerHTML;
1442 var value = changedElem.innerHTML;
1443 value = value.replace(/&nbsp;/g, " ");
1444
1445 var orig = changedElem.originalValue;
1446 if (orig) {
1447 orig = orig.replace(/&nbsp;/g, " ");
1448 }
1449 metadataChanges.push({collection:collection, docID:docID, name:name, value:value, orig:orig});
1450 changedElem.originalValue = changedElem.innerHTML;
1451
1452 }
1453*/
1454 if (metadataChanges.length ==0) {
1455 console.log ("... No changes detected. ");
1456 return;
1457 }
1458
1459 var processChangesLoop = function(index)
1460 {
1461 var change = metadataChanges[index];
1462
1463 var callbackFunction;
1464 if(index + 1 == metadataChanges.length)
1465 {
1466 callbackFunction = function(){console.log("Completed saving metadata changes. You must rebuild the collection for the changes to take effect.");};
1467 }
1468 else
1469 {
1470 callbackFunction = function(){processChangesLoop(index + 1)};
1471 }
1472 if (change.type == "delete") {
1473 gs.functions.removeArchivesMetadata(collection, gs.xsltParams.site_name, change.docID, change.name, null, change.value, function(){callbackFunction();});
1474 } else {
1475 if(change.orig)
1476 {
1477 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, change.orig, "override", function(){callbackFunction();});
1478 }
1479 else
1480 {
1481 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, null, "accumulate", function(){callbackFunction();});
1482 }
1483 }
1484 }
1485 processChangesLoop(0);
1486 /* need to clear the changes from the page */
1487 while (_deletedMetadata.length>0) {
1488 _deletedMetadata.pop();
1489 }
1490
1491}
1492
1493
1494
1495
1496
1497/***************
1498* MENU SCRIPTS *
1499***************/
1500function moveScroller() {
1501 var move = function() {
1502 var editbar = $("#editBar");
1503 var st = $(window).scrollTop();
1504 var fa = $("#float-anchor").offset().top;
1505 if(st > fa) {
1506
1507 editbar.css({
1508 position: "fixed",
1509 top: "0px",
1510 width: editbar.data("width"),
1511 //width: "30%"
1512 });
1513 } else {
1514 editbar.data("width", editbar.css("width"));
1515 editbar.css({
1516 position: "relative",
1517 top: "",
1518 width: ""
1519 });
1520 }
1521 };
1522 $(window).scroll(move);
1523 move();
1524}
1525
1526
1527function floatMenu(enabled)
1528{
1529 var menu = $(".tableOfContentsContainer");
1530 if(enabled)
1531 {
1532 menu.data("position", menu.css("position"));
1533 menu.data("width", menu.css("width"));
1534 menu.data("right", menu.css("right"));
1535 menu.data("top", menu.css("top"));
1536 menu.data("max-height", menu.css("max-height"));
1537 menu.data("overflow", menu.css("overflow"));
1538 menu.data("z-index", menu.css("z-index"));
1539
1540 menu.css("position", "fixed");
1541 menu.css("width", "300px");
1542 menu.css("right", "0px");
1543 menu.css("top", "100px");
1544 menu.css("max-height", "600px");
1545 menu.css("overflow", "auto");
1546 menu.css("z-index", "200");
1547
1548 $("#unfloatTOCButton").show();
1549 }
1550 else
1551 {
1552 menu.css("position", menu.data("position"));
1553 menu.css("width", menu.data("width"));
1554 menu.css("right", menu.data("right"));
1555 menu.css("top", menu.data("top"));
1556 menu.css("max-height", menu.data("max-height"));
1557 menu.css("overflow", menu.data("overflow"));
1558 menu.css("z-index", menu.data("z-index"));
1559
1560 $("#unfloatTOCButton").hide();
1561 $("#floatTOCToggle").prop("checked", false);
1562 }
1563
1564 var url = gs.xsltParams.library_name + "?a=d&ftoc=" + (enabled ? "1" : "0") + "&c=" + gs.cgiParams.c;
1565
1566 $.ajax(url);
1567}
1568
1569/********************
1570* SLIDESHOW SCRIPTS *
1571********************/
1572
1573function showSlideShow()
1574{
1575 if(!($("#gs-slideshow").length))
1576 {
1577 var slideshowDiv = $("<div>", {id:"gs-slideshow", style:"height:100%;"});
1578 var loadingImage = $("<img>", {src:gs.imageURLs.loading});
1579 slideshowDiv.append(loadingImage);
1580
1581 $.blockUI({message: $(slideshowDiv), css:{top: "5%", left: "5%", width: "90%", height: "90%", overflow: "auto", cursor: "auto"}});
1582
1583 retrieveImagesForSlideShow(function(imageIDArray)
1584 {
1585 loadingImage.hide();
1586 if(imageIDArray && imageIDArray.length > 0)
1587 {
1588 var imageURLs = new Array();
1589 for(var i = 0; i < imageIDArray.length; i++)
1590 {
1591 if(imageIDArray[i].source && imageIDArray[i].source.search(/.*\.(gif|jpg|jpeg|png)$/) != -1)
1592 {
1593 imageURLs.push(gs.collectionMetadata.httpPath + "/index/assoc/" + gs.documentMetadata.assocfilepath + "/" + imageIDArray[i].source);
1594 }
1595 }
1596 new SlideShowWidget(slideshowDiv, imageURLs, imageIDArray);
1597 }
1598 });
1599 }
1600 else
1601 {
1602 $("#gs-slideshow").show();
1603 }
1604}
1605
1606function retrieveImagesForSlideShow(callback)
1607{
1608 var template = "";
1609 template += '<xsl:template match="/">';
1610 template += '<images>[';
1611 template += '<xsl:for-each select="//documentNode">';
1612 template += '<xsl:text disable-output-escaping="yes">{"source":"</xsl:text><gsf:metadata name="Source"/><xsl:text disable-output-escaping="yes">",</xsl:text>';
1613 template += '<xsl:text disable-output-escaping="yes">"id":"</xsl:text><xsl:value-of select="@nodeID"/><xsl:text disable-output-escaping="yes">"}</xsl:text>';
1614 template += '<xsl:if test="position() != count(//documentNode)">,</xsl:if>';
1615 template += '</xsl:for-each>';
1616 template += ']</images>';
1617 template += '</xsl:template>';
1618
1619 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + gs.cgiParams.d + "?ed=1&ilt=" + template.replace(" ", "%20");
1620
1621 $.ajax(
1622 {
1623 url:url,
1624 success: function(data)
1625 {
1626 var startIndex = data.indexOf(">", data.indexOf(">") + 1) + 1;
1627 var endIndex = data.lastIndexOf("<");
1628 var arrayString = data.substring(startIndex, endIndex);
1629 var imageIDArray = eval(arrayString);
1630
1631 callback(imageIDArray);
1632 }
1633 });
1634}
1635
1636function SlideShowWidget(mainDiv, images, idArray)
1637{
1638 var _inTransition = false;
1639 var _images = new Array();
1640 var _mainDiv = mainDiv;
1641 var _imageDiv = $("<div>", {id:"ssImageDiv", style:"height:95%; overflow:auto;"});
1642 var _navDiv = $("<div>", {style:"height:5%;"});
1643 var _nextButton = $("<img>", {src:gs.imageURLs.next, style:"float:right; cursor:pointer;"});
1644 var _prevButton = $("<img>", {src:gs.imageURLs.prev, style:"float:left; cursor:pointer; display:none;"});
1645 var _closeLink = $("<a href=\"javascript:$.unblockUI()\">Close Slideshow</a>");
1646 var _clearDiv = $("<div>", {style:"clear:both;"});
1647 var _currentIndex = 0;
1648
1649 _navDiv.append(_nextButton);
1650 _navDiv.append(_closeLink);
1651 _navDiv.append(_prevButton);
1652 _navDiv.append(_clearDiv);
1653 _mainDiv.append(_navDiv);
1654 _mainDiv.append(_imageDiv);
1655
1656 for(var i = 0; i < images.length; i++)
1657 {
1658 _images.push($("<img>", {src:images[i], "class":"slideshowImage"}));
1659 }
1660
1661 if(_images.length < 2)
1662 {
1663 _nextButton.css("display", "none");
1664 }
1665
1666 _imageDiv.append(_images[0]);
1667
1668 this.nextImage = function()
1669 {
1670 if(!_inTransition)
1671 {
1672 _inTransition = true;
1673 if((_currentIndex + 1) < _images.length)
1674 {
1675 _prevButton.css("display", "");
1676 if(_currentIndex + 1 == _images.length - 1)
1677 {
1678 _nextButton.css("display", "none");
1679 }
1680
1681 _imageDiv.fadeOut(500, function()
1682 {
1683 _imageDiv.empty();
1684 _imageDiv.append(_images[_currentIndex + 1]);
1685 _currentIndex++;
1686 _imageDiv.fadeIn(500, function()
1687 {
1688 _inTransition = false;
1689 });
1690 });
1691 }
1692 else
1693 {
1694 _inTransition = false;
1695 }
1696 }
1697 }
1698
1699 this.prevImage = function()
1700 {
1701 if(!_inTransition)
1702 {
1703 _inTransition = true;
1704 if((_currentIndex - 1) >= 0)
1705 {
1706 _nextButton.css("display", "");
1707 if(_currentIndex - 1 == 0)
1708 {
1709 _prevButton.css("display", "none");
1710 }
1711
1712 _imageDiv.fadeOut(500, function()
1713 {
1714 _imageDiv.empty();
1715 _imageDiv.append(_images[_currentIndex - 1]);
1716 _currentIndex--;
1717 _imageDiv.fadeIn(500, function()
1718 {
1719 _inTransition = false;
1720 });
1721 });
1722 }
1723 else
1724 {
1725 _inTransition = false;
1726 }
1727 }
1728 }
1729
1730 var getRootFilenameFromURL = function(url)
1731 {
1732 var urlSegments = url.split("/");
1733 var filename = urlSegments[urlSegments.length - 1];
1734 return filename.replace(/_thumb\..*$/, "");
1735 }
1736
1737 var setLink = function(currentLink, index)
1738 {
1739 $(currentLink).click(function()
1740 {
1741 _inTransition = true;
1742 _currentIndex = index;
1743 _imageDiv.fadeOut(500, function()
1744 {
1745 _imageDiv.empty();
1746 _imageDiv.append(_images[_currentIndex]);
1747 _imageDiv.fadeIn(500, function()
1748 {
1749 _inTransition = false;
1750 });
1751 });
1752 });
1753 }
1754
1755 var sliderLinks = $(".pageSliderCol a");
1756 for(var i = 0; i < sliderLinks.length; i++)
1757 {
1758 var currentLink = sliderLinks[i];
1759 var id = $(currentLink).attr("href").split("'")[1];
1760
1761 for(var j = 0; j < idArray.length; j++)
1762 {
1763 if(idArray[j].id == id)
1764 {
1765 var image = idArray[j].source;
1766
1767 for(var l = 0; l < images.length; l++)
1768 {
1769 var filename = getRootFilenameFromURL(images[l]);
1770 if (filename == image)
1771 {
1772 setLink(currentLink, l);
1773 break;
1774 }
1775 }
1776
1777 break;
1778 }
1779 }
1780 }
1781
1782 _nextButton.click(this.nextImage);
1783 _prevButton.click(this.prevImage);
1784}
Note: See TracBrowser for help on using the repository browser.