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

Last change on this file since 31531 was 31531, checked in by kjdon, 7 years ago

expand and contract doc links are now outside the toc and generated in the page so that google can see them. link to get tableofcontents data now uses ec=1 instead of ed=1 - we don't need the text content of each section just to make toc

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