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

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

added a span round the section title too, so that you can hide the number OR hide the heading. see en:user_advanced:gs3_custom_doc_display in wiki

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