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

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

renamed isExpanded to isSectionExpanded, as when document editing is turned on, isExpanded from documentmaker_scripts_util is overriding this function and then the clicking on a thumbnail and having the right page open up doesn't work.

  • 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 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************************/
1155function addEditableState(editable,stateArray)
1156{
1157 if(editable.tagName == 'TEXTAREA')
1158 {
1159 nodeText = editable.value;
1160 }
1161 else
1162 {
1163 nodeText = editable.innerHTML;
1164 }
1165
1166 stateArray.push({
1167 editableNode : editable,
1168 initHTML : nodeText
1169 });
1170}
1171
1172function getLastEditableStates()
1173{
1174 editableLastStates = [];
1175 $(".sectionText").each(function(){addEditableState(this,editableLastStates);});
1176 $(".metaTableCellArea").each(function(){addEditableState(this,editableLastStates);});
1177
1178}
1179
1180function changesToUpdate()
1181{
1182 var resultArray = new Array();
1183 getLastEditableStates();
1184 for (var j in editableLastStates)
1185 {
1186 if (isNodeChanged(editableLastStates[j]))
1187 {
1188 resultArray.push(editableLastStates[j].editableNode);
1189 }
1190 }
1191 return resultArray;
1192}
1193
1194function isNodeChanged(StateToCheck){
1195 for (var i in editableInitStates)
1196 {
1197 if ((StateToCheck.editableNode === editableInitStates[i].editableNode) && StateToCheck.initHTML === editableInitStates[i].initHTML )
1198 {
1199 return false;
1200 }
1201
1202 }
1203 return true;
1204}
1205/************************
1206* METADATA EDIT SCRIPTS *
1207************************/
1208
1209function addEditMetadataLink(cell)
1210{
1211 cell = $(cell);
1212 var id = cell.attr("id").substring(6);
1213 var metaTable = gs.jqGet("meta" + id);
1214
1215 var row = cell.parent();
1216 var newCell = $("<td>", {"style": "font-size:0.7em; padding:0px 10px", "class": "editMetadataButton"});
1217 var linkSpan = $("<span>", {"class": "ui-state-default ui-corner-all", "style": "padding: 2px; float:left;"});
1218
1219 var linkLabel = $("<span>edit metadata</span>");
1220 var linkIcon = $("<span>", {"class": "ui-icon ui-icon-folder-collapsed"});
1221 newCell.linkIcon = linkIcon;
1222 newCell.linkLabel = linkLabel;
1223
1224 var uList = $("<ul>", {"style": "outline: 0 none; margin:0px; padding:0px;"});
1225 var labelItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1226 var iconItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1227
1228 uList.append(iconItem);
1229 uList.append(labelItem);
1230 labelItem.append(linkLabel);
1231 iconItem.append(linkIcon);
1232
1233 var newLink = $("<a>", {"href": "javascript:;"});
1234 newLink.click(function()
1235 {
1236 if(metaTable.css("display") == "none")
1237 {
1238 linkLabel.html("hide metadata");
1239 linkIcon.attr("class", "ui-icon ui-icon-folder-open");
1240 metaTable.css("display", "block");
1241 metaTable.metaNameField.css("display", "inline");
1242 metaTable.addRowButton.css("display", "inline");
1243 }
1244 else
1245 {
1246 linkLabel.html("edit metadata");
1247 linkIcon.attr("class", "ui-icon ui-icon-folder-collapsed");
1248 metaTable.css("display", "none");
1249 metaTable.metaNameField.css("display", "none");
1250 metaTable.addRowButton.css("display", "none");
1251 }
1252 });
1253
1254 newLink.append(uList);
1255 linkSpan.append(newLink);
1256 newCell.append(linkSpan);
1257 row.append(newCell);
1258
1259 addFunctionalityToTable(metaTable);
1260 metaTable.metaNameField.css("display", "none");
1261 metaTable.addRowButton.css("display", "none");
1262}
1263
1264function setEditingFeaturesVisible(visible)
1265{
1266 if(visible)
1267 {
1268 $("#editContentButton").html("Hide editor");
1269 $("#editContentButtonDiv").attr("class", "ui-state-default ui-corner-all");
1270 }
1271 else
1272 {
1273 $("#editContentButton").html("Edit content");
1274 $("#editContentButtonDiv").attr("class", "");
1275 }
1276
1277 var visibility = (visible ? "" : "none");
1278 $("#metadataListLabel, #metadataSetList").css("display", visibility);
1279
1280 $(".editMetadataButton").each(function()
1281 {
1282 $(this).css("display", visibility);
1283 $(this.linkLabel).html("edit metadata");
1284 $(this.linkIcon).attr("class", "ui-icon ui-icon-folder-collapsed");
1285 });
1286
1287 $("table").each(function()
1288 {
1289 if($(this).attr("id") && $(this).attr("id").search(/^meta/) != -1)
1290 {
1291 $(this).css("display", "none");
1292 $(this.metaNameField).css("display", "none");
1293 $(this.addRowButton).css("display", "none");
1294 }
1295 });
1296}
1297
1298/* override this function in other interface/site/collection if you want
1299 a different set of metadata sets
1300 Use in conjunction with the dynamic_metadata_set_list variable. */
1301function setStaticMetadataSets(list) {
1302 addOptionToList(list, "All", "All");
1303}
1304
1305function readyPageForEditing()
1306{
1307
1308 if($("#metadataSetList").length)
1309 {
1310 var setList = $("#metadataSetList");
1311 if(!setList.css("display") || setList.css("display") == "")
1312 {
1313 setEditingFeaturesVisible(false);
1314 }
1315 else
1316 {
1317 setEditingFeaturesVisible(true);
1318 }
1319 return;
1320 }
1321
1322 $("#editContentButton").html("Hide Editor");
1323 //wait for 0.5 sec to let ckeditor up
1324 setTimeout(function(){ $(".sectionText").each(function(){addEditableState(this,editableInitStates);}); }, 500);
1325
1326 var editBar = $("#editBarLeft");
1327
1328 var visibleMetadataList = $("<select>", {"id": "metadataSetList", "class": "ui-state-default"});
1329 setStaticMetadataSets(visibleMetadataList);
1330
1331 var metadataListLabel = $("<span>", {"id": "metadataListLabel", "style": "margin-left:20px;"});
1332 metadataListLabel.html("Visible metadata: ");
1333 editBar.append(metadataListLabel);
1334 editBar.append(visibleMetadataList);
1335 visibleMetadataList.change(onVisibleMetadataSetChange);
1336 editBar.append("<br>");
1337 for (var i=0; i< save_and_rebuild_buttons.length; i++) {
1338 var button_type = save_and_rebuild_buttons[i];
1339 if (button_type == "save") {
1340 var saveButton = $("<button>", {"id": "saveButton", "class": "ui-state-default ui-corner-all"});
1341 saveButton.click(save);
1342 saveButton.html(save_button_text);
1343 editBar.append(saveButton);
1344 } else if(button_type == "rebuild") {
1345 var rebuildButton = $("<button>", {"id": "rebuildButton", "class": "ui-state-default ui-corner-all"});
1346 rebuildButton.click(rebuildCurrentCollection);
1347 rebuildButton.html(rebuild_button_text);
1348 editBar.append(rebuildButton);
1349 } else if (button_type == "saveandrebuild") {
1350 var saveAndRebuildButton = $("<button>", {"id": "saveAndRebuildButton", "class": "ui-state-default ui-corner-all"});
1351 saveAndRebuildButton.click(saveAndRebuild);
1352 saveAndRebuildButton.html(save_and_rebuild_button_text);
1353 editBar.append(saveAndRebuildButton);
1354
1355 }
1356 }
1357 var statusBarDiv = $("<div>");
1358 editBar.append(statusBarDiv);
1359 _statusBar = new StatusBar(statusBarDiv[0]);
1360
1361 var titleDivs = $(".sectionTitle");
1362 for(var i = 0; i < titleDivs.length; i++)
1363 {
1364 addEditMetadataLink(titleDivs[i]);
1365 }
1366
1367 _baseURL = gs.xsltParams.library_name;
1368 onVisibleMetadataSetChange(); // make sure that the selected item in the list is active
1369}
1370
1371// override the one in documentmaker_scripts_util
1372// currently not used if other one is present. need to get the js include order right
1373function enableSaveButtons(enabled) {
1374 if (enabled) {
1375 $("#saveButton, #rebuildButton, #saveAndRebuildButton").removeAttr("disabled");
1376 } else {
1377 $("#saveButton, #rebuildButton, #saveAndRebuildButton").attr("disabled", "disabled");
1378 }
1379}
1380
1381/* this is a cut down version of save() from documentmaker_scripts_util.js
1382 going back to using save, will delete this once everything working*/
1383function saveMetadataChangesOld() {
1384
1385 console.log("Saving metadata changes");
1386
1387 // get collection name
1388 var collection = gs.cgiParams.c;;
1389
1390 // get document id
1391 var docID = gs.cgiParams.d;
1392
1393 var metadataChanges = new Array();
1394 if (_deletedMetadata.length > 0) {
1395
1396 for(var i = 0; i < _deletedMetadata.length; i++) {
1397
1398 var currentRow = _deletedMetadata[i];
1399
1400 //Get metadata name
1401 var cells = currentRow.getElementsByTagName("TD");
1402 var nameCell = cells[0];
1403 var name = nameCell.innerHTML;
1404 var valueCell = cells[1];
1405 var value = valueCell.innerHTML;
1406 metadataChanges.push({type:'delete', docID:docID, name:name, value:value});
1407 removeFromParent(currentRow);
1408 }
1409 }
1410
1411 /*var changes = null;
1412 //var changes = de.Changes.getChangedEditableSections();
1413 for(var i = 0; i < changes.length; i++) {
1414
1415 var changedElem = changes[i];
1416
1417 //Get metadata name
1418 var row = changedElem.parentNode;
1419 var cells = row.getElementsByTagName("TD");
1420 var nameCell = cells[0];
1421 var name = nameCell.innerHTML;
1422 var value = changedElem.innerHTML;
1423 value = value.replace(/&nbsp;/g, " ");
1424
1425 var orig = changedElem.originalValue;
1426 if (orig) {
1427 orig = orig.replace(/&nbsp;/g, " ");
1428 }
1429 metadataChanges.push({collection:collection, docID:docID, name:name, value:value, orig:orig});
1430 changedElem.originalValue = changedElem.innerHTML;
1431
1432 }
1433*/
1434 if (metadataChanges.length ==0) {
1435 console.log ("... No changes detected. ");
1436 return;
1437 }
1438
1439 var processChangesLoop = function(index)
1440 {
1441 var change = metadataChanges[index];
1442
1443 var callbackFunction;
1444 if(index + 1 == metadataChanges.length)
1445 {
1446 callbackFunction = function(){console.log("Completed saving metadata changes. You must rebuild the collection for the changes to take effect.");};
1447 }
1448 else
1449 {
1450 callbackFunction = function(){processChangesLoop(index + 1)};
1451 }
1452 if (change.type == "delete") {
1453 gs.functions.removeArchivesMetadata(collection, gs.xsltParams.site_name, change.docID, change.name, null, change.value, function(){callbackFunction();});
1454 } else {
1455 if(change.orig)
1456 {
1457 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, change.orig, "override", function(){callbackFunction();});
1458 }
1459 else
1460 {
1461 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, null, "accumulate", function(){callbackFunction();});
1462 }
1463 }
1464 }
1465 processChangesLoop(0);
1466 /* need to clear the changes from the page */
1467 while (_deletedMetadata.length>0) {
1468 _deletedMetadata.pop();
1469 }
1470
1471}
1472
1473
1474
1475
1476
1477/***************
1478* MENU SCRIPTS *
1479***************/
1480function moveScroller() {
1481 var move = function() {
1482 var editbar = $("#editBar");
1483 var st = $(window).scrollTop();
1484 var fa = $("#float-anchor").offset().top;
1485 if(st > fa) {
1486
1487 editbar.css({
1488 position: "fixed",
1489 top: "0px",
1490 width: editbar.data("width"),
1491 //width: "30%"
1492 });
1493 } else {
1494 editbar.data("width", editbar.css("width"));
1495 editbar.css({
1496 position: "relative",
1497 top: "",
1498 width: ""
1499 });
1500 }
1501 };
1502 $(window).scroll(move);
1503 move();
1504}
1505
1506
1507function floatMenu(enabled)
1508{
1509 var menu = $(".tableOfContentsContainer");
1510 if(enabled)
1511 {
1512 menu.data("position", menu.css("position"));
1513 menu.data("width", menu.css("width"));
1514 menu.data("right", menu.css("right"));
1515 menu.data("top", menu.css("top"));
1516 menu.data("max-height", menu.css("max-height"));
1517 menu.data("overflow", menu.css("overflow"));
1518 menu.data("z-index", menu.css("z-index"));
1519
1520 menu.css("position", "fixed");
1521 menu.css("width", "300px");
1522 menu.css("right", "0px");
1523 menu.css("top", "100px");
1524 menu.css("max-height", "600px");
1525 menu.css("overflow", "auto");
1526 menu.css("z-index", "200");
1527
1528 $("#unfloatTOCButton").show();
1529 }
1530 else
1531 {
1532 menu.css("position", menu.data("position"));
1533 menu.css("width", menu.data("width"));
1534 menu.css("right", menu.data("right"));
1535 menu.css("top", menu.data("top"));
1536 menu.css("max-height", menu.data("max-height"));
1537 menu.css("overflow", menu.data("overflow"));
1538 menu.css("z-index", menu.data("z-index"));
1539
1540 $("#unfloatTOCButton").hide();
1541 $("#floatTOCToggle").prop("checked", false);
1542 }
1543
1544 var url = gs.xsltParams.library_name + "?a=d&ftoc=" + (enabled ? "1" : "0") + "&c=" + gs.cgiParams.c;
1545
1546 $.ajax(url);
1547}
1548
1549/********************
1550* SLIDESHOW SCRIPTS *
1551********************/
1552
1553function showSlideShow()
1554{
1555 if(!($("#gs-slideshow").length))
1556 {
1557 var slideshowDiv = $("<div>", {id:"gs-slideshow", style:"height:100%;"});
1558 var loadingImage = $("<img>", {src:gs.imageURLs.loading});
1559 slideshowDiv.append(loadingImage);
1560
1561 $.blockUI({message: $(slideshowDiv), css:{top: "5%", left: "5%", width: "90%", height: "90%", overflow: "auto", cursor: "auto"}});
1562
1563 retrieveImagesForSlideShow(function(imageIDArray)
1564 {
1565 loadingImage.hide();
1566 if(imageIDArray && imageIDArray.length > 0)
1567 {
1568 var imageURLs = new Array();
1569 for(var i = 0; i < imageIDArray.length; i++)
1570 {
1571 if(imageIDArray[i].source && imageIDArray[i].source.search(/.*\.(gif|jpg|jpeg|png)$/) != -1)
1572 {
1573 imageURLs.push(gs.collectionMetadata.httpPath + "/index/assoc/" + gs.documentMetadata.assocfilepath + "/" + imageIDArray[i].source);
1574 }
1575 }
1576 new SlideShowWidget(slideshowDiv, imageURLs, imageIDArray);
1577 }
1578 });
1579 }
1580 else
1581 {
1582 $("#gs-slideshow").show();
1583 }
1584}
1585
1586function retrieveImagesForSlideShow(callback)
1587{
1588 var template = "";
1589 template += '<xsl:template match="/">';
1590 template += '<images>[';
1591 template += '<xsl:for-each select="//documentNode">';
1592 template += '<xsl:text disable-output-escaping="yes">{"source":"</xsl:text><gsf:metadata name="Source"/><xsl:text disable-output-escaping="yes">",</xsl:text>';
1593 template += '<xsl:text disable-output-escaping="yes">"id":"</xsl:text><xsl:value-of select="@nodeID"/><xsl:text disable-output-escaping="yes">"}</xsl:text>';
1594 template += '<xsl:if test="position() != count(//documentNode)">,</xsl:if>';
1595 template += '</xsl:for-each>';
1596 template += ']</images>';
1597 template += '</xsl:template>';
1598
1599 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + gs.cgiParams.d + "?ed=1&ilt=" + template.replace(" ", "%20");
1600
1601 $.ajax(
1602 {
1603 url:url,
1604 success: function(data)
1605 {
1606 var startIndex = data.indexOf(">", data.indexOf(">") + 1) + 1;
1607 var endIndex = data.lastIndexOf("<");
1608 var arrayString = data.substring(startIndex, endIndex);
1609 var imageIDArray = eval(arrayString);
1610
1611 callback(imageIDArray);
1612 }
1613 });
1614}
1615
1616function SlideShowWidget(mainDiv, images, idArray)
1617{
1618 var _inTransition = false;
1619 var _images = new Array();
1620 var _mainDiv = mainDiv;
1621 var _imageDiv = $("<div>", {id:"ssImageDiv", style:"height:95%; overflow:auto;"});
1622 var _navDiv = $("<div>", {style:"height:5%;"});
1623 var _nextButton = $("<img>", {src:gs.imageURLs.next, style:"float:right; cursor:pointer;"});
1624 var _prevButton = $("<img>", {src:gs.imageURLs.prev, style:"float:left; cursor:pointer; display:none;"});
1625 var _closeLink = $("<a href=\"javascript:$.unblockUI()\">Close Slideshow</a>");
1626 var _clearDiv = $("<div>", {style:"clear:both;"});
1627 var _currentIndex = 0;
1628
1629 _navDiv.append(_nextButton);
1630 _navDiv.append(_closeLink);
1631 _navDiv.append(_prevButton);
1632 _navDiv.append(_clearDiv);
1633 _mainDiv.append(_navDiv);
1634 _mainDiv.append(_imageDiv);
1635
1636 for(var i = 0; i < images.length; i++)
1637 {
1638 _images.push($("<img>", {src:images[i], "class":"slideshowImage"}));
1639 }
1640
1641 if(_images.length < 2)
1642 {
1643 _nextButton.css("display", "none");
1644 }
1645
1646 _imageDiv.append(_images[0]);
1647
1648 this.nextImage = function()
1649 {
1650 if(!_inTransition)
1651 {
1652 _inTransition = true;
1653 if((_currentIndex + 1) < _images.length)
1654 {
1655 _prevButton.css("display", "");
1656 if(_currentIndex + 1 == _images.length - 1)
1657 {
1658 _nextButton.css("display", "none");
1659 }
1660
1661 _imageDiv.fadeOut(500, function()
1662 {
1663 _imageDiv.empty();
1664 _imageDiv.append(_images[_currentIndex + 1]);
1665 _currentIndex++;
1666 _imageDiv.fadeIn(500, function()
1667 {
1668 _inTransition = false;
1669 });
1670 });
1671 }
1672 else
1673 {
1674 _inTransition = false;
1675 }
1676 }
1677 }
1678
1679 this.prevImage = function()
1680 {
1681 if(!_inTransition)
1682 {
1683 _inTransition = true;
1684 if((_currentIndex - 1) >= 0)
1685 {
1686 _nextButton.css("display", "");
1687 if(_currentIndex - 1 == 0)
1688 {
1689 _prevButton.css("display", "none");
1690 }
1691
1692 _imageDiv.fadeOut(500, function()
1693 {
1694 _imageDiv.empty();
1695 _imageDiv.append(_images[_currentIndex - 1]);
1696 _currentIndex--;
1697 _imageDiv.fadeIn(500, function()
1698 {
1699 _inTransition = false;
1700 });
1701 });
1702 }
1703 else
1704 {
1705 _inTransition = false;
1706 }
1707 }
1708 }
1709
1710 var getRootFilenameFromURL = function(url)
1711 {
1712 var urlSegments = url.split("/");
1713 var filename = urlSegments[urlSegments.length - 1];
1714 return filename.replace(/_thumb\..*$/, "");
1715 }
1716
1717 var setLink = function(currentLink, index)
1718 {
1719 $(currentLink).click(function()
1720 {
1721 _inTransition = true;
1722 _currentIndex = index;
1723 _imageDiv.fadeOut(500, function()
1724 {
1725 _imageDiv.empty();
1726 _imageDiv.append(_images[_currentIndex]);
1727 _imageDiv.fadeIn(500, function()
1728 {
1729 _inTransition = false;
1730 });
1731 });
1732 });
1733 }
1734
1735 var sliderLinks = $(".pageSliderCol a");
1736 for(var i = 0; i < sliderLinks.length; i++)
1737 {
1738 var currentLink = sliderLinks[i];
1739 var id = $(currentLink).attr("href").split("'")[1];
1740
1741 for(var j = 0; j < idArray.length; j++)
1742 {
1743 if(idArray[j].id == id)
1744 {
1745 var image = idArray[j].source;
1746
1747 for(var l = 0; l < images.length; l++)
1748 {
1749 var filename = getRootFilenameFromURL(images[l]);
1750 if (filename == image)
1751 {
1752 setLink(currentLink, l);
1753 break;
1754 }
1755 }
1756
1757 break;
1758 }
1759 }
1760 }
1761
1762 _nextButton.click(this.nextImage);
1763 _prevButton.click(this.prevImage);
1764}
Note: See TracBrowser for help on using the repository browser.