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

Last change on this file since 31416 was 31416, checked in by Georgiy Litvinov, 7 years ago

JS code for links between sections.

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