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

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

removing hard coded text fragments from xsl/js files

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