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

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

we want to keep p.s arg in the expand/contract contents links so that search term highlighting still works if we have got to that document from a search.

  • Property svn:executable set to *
File size: 49.3 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("Exracting 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&ed=1&c=" + gs.cgiParams.c + "&d=" + gs.cgiParams.d + "&ilt=" + ilt.replace(/ /g, "%20");
642
643 $.ajax(url)
644 .success(function(response)
645 {
646 $("#tableOfContents").html(response);
647 replaceLinksWithSlider();
648 addExpandContractButtons();
649 var loading = $("#tocLoadingImage");
650 loading.remove();
651 })
652 .error(function()
653 {
654 setTimeout(function(){retrieveTableOfContentsAndTitles();}, 1000);
655 });
656}
657
658function addExpandContractButtons()
659{
660 var tableOfContents = $("#tableOfContents");
661 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>" ;
662
663 tableOfContents.prepend(table);
664
665}
666function replaceLinksWithSlider()
667{
668 var tableOfContents = $("#tableOfContents");
669 var leafSections = new Array();
670 var liElems = tableOfContents.find("li").each(function()
671 {
672 var section = $(this);
673 var add = true;
674 for(var j = 0; j < leafSections.length; j++)
675 {
676 if(leafSections[j] == undefined){continue;}
677
678 var leaf = $(leafSections[j]);
679 if(leaf.attr("id").search(section.attr("id")) != -1)
680 {
681 add = false;
682 }
683
684 if(section.attr("id").search(leaf.attr("id")) != -1)
685 {
686 delete leafSections[j];
687 }
688 }
689
690 if(add)
691 {
692 leafSections.push(section);
693 }
694 });
695
696 for(var i = 0 ; i < leafSections.length; i++)
697 {
698 if(leafSections[i] == undefined){continue;}
699
700 leafSections[i].css("display", "none");
701 var links = leafSections[i].find("a");
702
703 var widget = new SliderWidget(links);
704 leafSections[i].before(widget.getElem());
705 }
706
707 //Disable all TOC toggles
708 var imgs = $("img").each(function()
709 {
710 var currentImage = $(this);
711 if(currentImage.attr("id") && currentImage.attr("id").search(/^ttoggle/) != -1)
712 {
713 currentImage.attr("onclick", "");
714 currentImage.click(function()
715 {
716 var sliderDiv = currentImage.parents("table").first().next();
717 if(sliderDiv.is(":visible"))
718 {
719 sliderDiv.hide();
720 }
721 else
722 {
723 sliderDiv.show();
724 }
725 });
726 }
727 else if(currentImage.attr("id") && currentImage.attr("id").search(/^dtoggle/) != -1)
728 {
729 currentImage.attr("onclick", currentImage.attr("onclick").replace(/\)/, ", null, true)"));
730 }
731 });
732}
733
734
735function SliderWidget(_links)
736{
737 //****************
738 //MEMBER VARIABLES
739 //****************
740
741 //The container for the widget
742 var _mainDiv = $("<div>");
743 _mainDiv.attr("class", "ui-widget-content pageSlider");
744
745 //The table of images
746 var _linkTable = $("<table>");
747 _mainDiv.append(_linkTable);
748
749 //The image row of the table
750 var _linkRow = $("<tr>");
751 _linkTable.append(_linkRow);
752
753 //The list of titles we can search through
754 var _titles = new Array();
755
756 //Keep track of the slider position
757 var _prevScroll = 0;
758
759 //****************
760 //PUBLIC FUNCTIONS
761 //****************
762
763 //Function that returns the widget element
764 this.getElem = function()
765 {
766 return _mainDiv;
767 }
768
769 //*****************
770 //PRIVATE FUNCTIONS
771 //*****************
772
773 // _filter_on_types can be "sectionnum", "sectiontitle"
774 var setUpFilterButtons = function() {
775
776 var button_div = $("#filterOnButtons");
777 button_div.onclick = doFiltering;
778 button_div.html("radio");
779 if (_filter_on_types.length == 0) {
780 _filter_on_types = ["sectionnum", "sectiontitle"];
781 }
782 else if (_filter_on_types.length == 1) {
783 if (_filter_on_types[0] == "sectionnum") {
784 button_div.html("(<input type='radio' name='filterOn' value='num' checked>"+gs.text.doc.filter.pagenum+"</input>)");
785 } else {
786 button_div.html("(<input type='radio' name='filterOn' value='title' checked>"+gs.text.doc.filter.title+"</input>)");
787 }
788 } else {
789 // should be both options
790 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>");
791 }
792}
793
794 var doFiltering = function () {
795 if (typeof _titles == "undefined") {
796 return;
797 }
798
799 var filter_string = $("#filterText").val();
800 var filter_type = $('input[name="filterOn"]:checked').val();
801
802 var index = 2; // section num
803 var numeric_match = true;
804 if (filter_type == "title") {
805 index = 3;
806 if (_filter_title_numeric != true) {
807 numeric_match = false;
808 }
809
810 }
811 var values = filter_string.split(",");
812
813 var matchingTitles = new Array();
814
815 for (var l = 0; l < values.length; l++)
816 {
817 var currentValue = values[l].replace(/^ +/g, "").replace(/ +$/g, "");
818 if (numeric_match) {
819 var isRange = (currentValue.search(/\d+-\d+/) != -1);
820 if (isRange) {
821 var firstNumber = currentValue.replace(/(\d+)-\d+/, "$1");
822 var secondNumber = currentValue.replace(/\d+-(\d+)/, "$1");
823
824 if(firstNumber <= secondNumber)
825 {
826 for(var i = firstNumber; i <= secondNumber; i++)
827 {
828 var numString = i + "";
829 for(var j = 0; j < _titles.length; j++) {
830
831 var currentTitle = _titles[j];
832 if(currentTitle[index] == numString) {
833 matchingTitles.push(currentTitle);
834 }
835 }
836 }
837 }
838 } // if isRange
839 else {
840 for(var j = 0; j < _titles.length; j++) {
841 if (_titles[j][index]==currentValue) {
842 matchingTitles.push(_titles[j]);
843 }
844 }
845
846 }
847
848 } else { // not numeric match.
849 // need to do a search
850 for(var i = 0; i < _titles.length; i++)
851 {
852 var currentTitle = _titles[i];
853 if(currentTitle[index].toLowerCase().search(currentValue.toLowerCase().replace(/\./g, "\\.")) != -1)
854 {
855 matchingTitles.push(currentTitle);
856 }
857 }
858 }
859 } // for each value from filter string
860
861 // set all to hide...
862 for(var i = 0; i < _titles.length; i++)
863 {
864 $(_titles[i][1].cell).css("display", "none");
865 }
866
867 // .. then display the matching ones
868 for(var i = 0; i < matchingTitles.length; i++)
869 {
870 $(matchingTitles[i][1].cell).css("display", "table-cell");
871 }
872}
873
874 var setUpFilterBox = function()
875 {
876 var filter = $("#filterText");
877
878 filter.keyup(function()
879 {
880 doFiltering();
881 });
882 }
883
884 var getImage = function(page, attemptNumber)
885 {
886 var href = page.getAttribute("href");
887 var startHREF = href.indexOf("'") + 1;
888 var endHREF = href.indexOf("'", startHREF);
889 var nodeID = href.substring(startHREF, endHREF);
890 href = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + nodeID;
891
892 var template = '';
893 template += '<xsl:template match="/">';
894 template += '<gsf:metadata name=\"Thumb\"/>';
895 template += '<html>';
896 template += '<img>';
897 template += '<xsl:attribute name="src">';
898 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/collection/metadataList/metadata[@name = 'httpPath']\"/>";
899 template += '<xsl:text>/index/assoc/</xsl:text>';
900 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/metadataList/metadata[@name = 'assocfilepath']\"/>";
901 template += '<xsl:text>/</xsl:text>';
902 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document//documentNode[@nodeID = '" + nodeID + "']/metadataList/metadata[@name = 'Thumb']\"/>";
903 template += '</xsl:attribute>';
904 template += '</img>';
905 template += '<p>';
906 template += "<xsl:value-of disable-output-escaping=\"yes\" select=\"/page/pageResponse/document/documentNode/metadataList/metadata[@name = 'Title']\"/>";
907 template += '</p>';
908 template += '</html>';
909 template += '</xsl:template>';
910
911 var url = href + "?ilt=" + template.replace(" ", "%20");
912 $.ajax(url)
913 .success(function(text)
914 {
915 var hrefStart = text.indexOf("src=\"") + 5;
916 if(hrefStart == -1)
917 {
918 page.isLoading = false;
919 page.noImage = true;
920 $(page.image).attr("src", gs.imageURLs.blank);
921 return;
922 }
923 var hrefEnd = text.indexOf("\"", hrefStart);
924 var href = text.substring(hrefStart, hrefEnd);
925
926 var image = $("<img>");
927 image.load(function()
928 {
929 $(page.link).html("");
930 $(page.link).append(image);
931 page.isLoading = false;
932 page.imageLoaded = true;
933 });
934 image.error(function()
935 {
936 if(!attemptNumber || attemptNumber < 3)
937 {
938 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
939 }
940 else
941 {
942 page.isLoading = false;
943 page.noImage = true;
944 image.attr("src", gs.imageURLs.blank);
945 }
946 });
947 image.attr("src", href);
948
949 var titleStart = text.indexOf("<p>") + 3;
950 var titleEnd = text.indexOf("</p>");
951 var title = text.substring(titleStart, titleEnd);
952 })
953 .error(function()
954 {
955 page.failed = true;
956 if(!attemptNumber || attemptNumber < 3)
957 {
958 setTimeout(function(){getImage(page, ((!attemptNumber) ? 1 : attemptNumber + 1));}, 500);
959 }
960 else
961 {
962 var image = $("<img>", {"src": gs.imageURLs.blank});
963 $(page.link).html("");
964 $(page.link).append(image);
965 page.isLoading = false;
966 page.noImage = true;
967 }
968 });
969 }
970
971 var startCheckFunction = function()
972 {
973 var checkFunction = function(forced)
974 {
975 //Don't bother checking if we haven't scrolled very far
976 if(Math.abs(_mainDiv.scrollLeft() - _prevScroll) > 100 || forced)
977 {
978 _prevScroll = _mainDiv.scrollLeft();
979 _checking = true;
980 var widgetLeft = _mainDiv.offset().left;
981 var widgetRight = widgetLeft + _mainDiv.width();
982
983 var visiblePages = new Array();
984 for(var i = 0; i < _links.length; i++)
985 {
986 var current = _links[i].cell;
987 var currentLeft = current.offset().left;
988 var currentRight = currentLeft + current.width();
989
990 if(currentRight > widgetLeft && currentLeft < widgetRight)
991 {
992 visiblePages.push(_links[i]);
993 }
994 }
995
996 for(var i = 0; i < visiblePages.length; i++)
997 {
998 var page = visiblePages[i];
999 if(!page || page.imageLoaded || page.noImage || page.isLoading)
1000 {
1001 continue;
1002 }
1003
1004 page.isLoading = true;
1005 getImage(page);
1006 }
1007 _checking = false;
1008 }
1009 }
1010
1011 setTimeout(checkFunction, 250);
1012 setInterval(function(){checkFunction(true)}, 2000);
1013 _mainDiv.scroll(checkFunction);
1014 }
1015
1016 //***********
1017 //CONSTRUCTOR
1018 //***********
1019
1020 for(var i = 0; i < _links.length; i++)
1021 {
1022 var col = $("<td>");
1023 _linkRow.append(col);
1024 col.addClass("pageSliderCol");
1025 _links[i].cell = col;
1026
1027 var link = $("<a>");
1028 col.append(link);
1029 _links[i].link = link;
1030 var href = $(_links[i]).attr("href");
1031 link.attr("href", href.replace(/\)/, ", 0, true)"));
1032
1033 if(!_linkCellMap[href])
1034 {
1035 _linkCellMap[href] = new Array();
1036 }
1037 _linkCellMap[href].push(_links[i]);
1038
1039 var loadingText = $("<p>Loading image</p>");
1040 link.append(loadingText);
1041
1042 var image = $("<img>");
1043 link.append(image);
1044 image.attr("src", gs.imageURLs.loading);
1045 _links[i].image = image;
1046
1047 var title = $(_links[i]).html();
1048 var t_section = "";
1049 var t_title = "";
1050 if (title.search(/tocSectionNumber/) != -1)
1051 {
1052 var matching_regex = /<span class=\"tocSectionNumber\">([0-9]+)<\/span>[\s\S]*<span class=\"tocSectionTitle\">(.+)<\/span>$/mg;
1053 var matches_array = matching_regex.exec(title);
1054 if (matches_array != null && matches_array.length == 3) {
1055 t_section = matches_array[1];
1056 t_title = matches_array[2];
1057 }
1058 }
1059
1060 _titles.push([title, _links[i], t_section, t_title]);
1061
1062 col.append($("<br>"));
1063 col.append(title);
1064 }
1065
1066 setUpFilterBox();
1067 setUpFilterButtons();
1068 startCheckFunction();
1069 }
1070
1071/***********************
1072* HIGHLIGHTING SCRIPTS *
1073***********************/
1074function swapHighlight(imageClicked)
1075{
1076 var hlCheckbox = $("#highlightOption");
1077 if(imageClicked)
1078 {
1079 // toggle the state of the checkbox
1080 $(hlCheckbox).prop("checked", !$(hlCheckbox).prop("checked"));
1081 }
1082 var from;
1083 var to;
1084 if(hlCheckbox.prop("checked"))
1085 {
1086 from = "noTermHighlight";
1087 to = "termHighlight";
1088 }
1089 else
1090 {
1091 from = "termHighlight";
1092 to = "noTermHighlight";
1093 }
1094
1095 var spans = $("span").each(function()
1096 {
1097 if($(this).hasClass(from))
1098 {
1099 $(this).removeClass(from);
1100 $(this).addClass(to);
1101 }
1102 });
1103}
1104
1105/**************************
1106* REALISTIC BOOKS SCRIPTS *
1107**************************/
1108
1109function bookInit()
1110{
1111 loadBook();
1112 hideText();
1113 showBook();
1114 swapLinkJavascript(false);
1115}
1116
1117function hideText()
1118{
1119 $("#gs-document-text").css("visibility", "hidden");
1120}
1121
1122function showText()
1123{
1124 $("#gs-document-text").css("visibility", "visible");
1125}
1126
1127function hideBook()
1128{
1129 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "hidden", "height": "0px"});
1130}
1131
1132function showBook()
1133{
1134 $("#bookDiv, #bookObject, #bookEmbed").css({"visibility": "visible", "height": "600px"});
1135}
1136
1137function swapLinkJavascript(rbOn)
1138{
1139 var option = $("#rbOption");
1140 var optionImage = $("#rbOptionImage");
1141
1142 if(rbOn)
1143 {
1144 option.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1145 optionImage.attr("onclick", "hideText(); showBook(); swapLinkJavascript(false);");
1146 $(option).prop("checked", false);
1147 }
1148 else
1149 {
1150 option.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1151 optionImage.attr("onclick", "hideBook(); showText(); swapLinkJavascript(true);");
1152 $(option).prop("checked", true);
1153 }
1154}
1155
1156function loadBook()
1157{
1158 var doc_url = document.URL;
1159 doc_url = doc_url.replace(/(&|\?)book=[a-z]+/gi,'');
1160 doc_url += '&book=flashxml';
1161
1162 var img_cover = gs.collectionMetadata.httpPath + '/index/assoc/' + gs.documentMetadata.assocfilepath + '/cover.jpg';
1163
1164 var flash_plug_html = ""
1165 flash_plug_html += '<OBJECT align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" \n';
1166 flash_plug_html += ' height="600px" id="bookObject" swLiveConnect="true" \n';
1167 flash_plug_html += ' codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" \n';
1168 flash_plug_html += ' width="70%">\n';
1169 flash_plug_html += ' <PARAM name="allowScriptAccess" value="always" />\n';
1170 flash_plug_html += ' <PARAM name="movie" value="Book.swf';
1171 flash_plug_html += '?src_image=' + escape(img_cover);
1172 flash_plug_html += '&doc_url=' + escape(doc_url);
1173 flash_plug_html += '" />\n';
1174 flash_plug_html += ' <PARAM name="quality" value="high" />\n';
1175 flash_plug_html += ' <PARAM name="bgcolor" value="#FFFFFF" />\n';
1176 flash_plug_html += ' <EMBED align="middle" \n';
1177 flash_plug_html += ' allowScriptAccess="always" swLiveConnect="true" \n';
1178 flash_plug_html += ' bgcolor="#FFFFFF" height="600px" name="Book" \n';
1179 flash_plug_html += ' pluginspage="http://www.macromedia.com/go/getflashplayer" \n';
1180 flash_plug_html += ' quality="high" id="bookEmbed"\n';
1181 flash_plug_html += ' src="Book.swf';
1182 flash_plug_html += '?src_image=' + escape(img_cover);
1183 flash_plug_html += '&doc_url=' + escape(doc_url);
1184 flash_plug_html += '"\n';
1185 flash_plug_html += ' type="application/x-shockwave-flash" width="70%" />\n';
1186 flash_plug_html += '</OBJECT>\n';
1187 $("#bookdiv").html(flash_plug_html);
1188}
1189
1190/************************
1191* CHANGES SCRIPTS *
1192************************/
1193
1194function addCKEEditableState(evt,stateArray)
1195{
1196 // Event->Editor->CKE DOM Inline Element that editor was for->underlying jquery element
1197 element = evt.editor.element.$;
1198 nodeText = element.innerHTML;
1199 stateArray.push({
1200 editableNode : element,
1201 initHTML : nodeText
1202 });
1203
1204}
1205function addEditableState(editable,stateArray)
1206{
1207
1208 if(editable.tagName == 'TEXTAREA')
1209 {
1210 nodeText = editable.value;
1211 }
1212 else
1213 {
1214 nodeText = editable.innerHTML;
1215 }
1216
1217 stateArray.push({
1218 editableNode : editable,
1219 initHTML : nodeText
1220 });
1221
1222}
1223
1224function getLastEditableStates()
1225{
1226 editableLastStates = [];
1227 $(".sectionText").each(function(){addEditableState(this,editableLastStates);});
1228 $(".metaTableCellArea").each(function(){addEditableState(this,editableLastStates);});
1229
1230}
1231
1232function changesToUpdate()
1233{
1234 var resultArray = new Array();
1235 getLastEditableStates();
1236 for (var j in editableLastStates)
1237 {
1238 if (isNodeChanged(editableLastStates[j]))
1239 {
1240 resultArray.push(editableLastStates[j].editableNode);
1241 }
1242 }
1243 return resultArray;
1244}
1245
1246
1247function isNodeChanged(StateToCheck){
1248 for (var i in editableInitStates)
1249 {
1250 if ((StateToCheck.editableNode === editableInitStates[i].editableNode)) {
1251 if ( StateToCheck.initHTML === editableInitStates[i].initHTML )
1252 {
1253 return false;
1254 }
1255 return true;
1256 }
1257
1258 }
1259 return true;
1260}
1261/************************
1262* METADATA EDIT SCRIPTS *
1263************************/
1264
1265function addEditMetadataLink(cell)
1266{
1267 cell = $(cell);
1268 var id = cell.attr("id").substring(6);
1269 var metaTable = gs.jqGet("meta" + id);
1270
1271 var row = cell.parent();
1272 var newCell = $("<td>", {"style": "font-size:0.7em; padding:0px 10px", "class": "editMetadataButton"});
1273 var linkSpan = $("<span>", {"class": "ui-state-default ui-corner-all", "style": "padding: 2px; float:left;"});
1274
1275 var linkLabel = $("<span>"+gs.text.de.edit_metadata+"</span>");
1276 var linkIcon = $("<span>", {"class": "ui-icon ui-icon-folder-collapsed"});
1277 newCell.linkIcon = linkIcon;
1278 newCell.linkLabel = linkLabel;
1279
1280 var uList = $("<ul>", {"style": "outline: 0 none; margin:0px; padding:0px;"});
1281 var labelItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1282 var iconItem = $("<li>", {"style": "float:left; list-style:none outside none;"});
1283
1284 uList.append(iconItem);
1285 uList.append(labelItem);
1286 labelItem.append(linkLabel);
1287 iconItem.append(linkIcon);
1288
1289 var newLink = $("<a>", {"href": "javascript:;"});
1290 newLink.click(function()
1291 {
1292 if(metaTable.css("display") == "none")
1293 {
1294 linkLabel.html(gs.text.de.hide_metadata);
1295 linkIcon.attr("class", "ui-icon ui-icon-folder-open");
1296 metaTable.css("display", "block");
1297 metaTable.metaNameField.css("display", "inline");
1298 metaTable.addRowButton.css("display", "inline");
1299 }
1300 else
1301 {
1302 linkLabel.html(gs.text.de.edit_metadata);
1303 linkIcon.attr("class", "ui-icon ui-icon-folder-collapsed");
1304 metaTable.css("display", "none");
1305 metaTable.metaNameField.css("display", "none");
1306 metaTable.addRowButton.css("display", "none");
1307 }
1308 });
1309
1310 newLink.append(uList);
1311 linkSpan.append(newLink);
1312 newCell.append(linkSpan);
1313 row.append(newCell);
1314
1315 addFunctionalityToTable(metaTable);
1316 metaTable.metaNameField.css("display", "none");
1317 metaTable.addRowButton.css("display", "none");
1318}
1319
1320function setEditingFeaturesVisible(visible)
1321{
1322 if(visible)
1323 {
1324 $("#editContentButton").html(gs.text.de.hide_editor);
1325 $("#editContentButtonDiv").attr("class", "ui-state-default ui-corner-all");
1326 }
1327 else
1328 {
1329 $("#editContentButton").html(gs.text.de.edit_content);
1330 $("#editContentButtonDiv").attr("class", "");
1331 }
1332
1333 var visibility = (visible ? "" : "none");
1334 $("#metadataListLabel, #metadataSetList").css("display", visibility);
1335
1336 $(".editMetadataButton").each(function()
1337 {
1338 $(this).css("display", visibility);
1339 $(this.linkLabel).html(gs.text.de.edit_metadata);
1340 $(this.linkIcon).attr("class", "ui-icon ui-icon-folder-collapsed");
1341 });
1342
1343 $("table").each(function()
1344 {
1345 if($(this).attr("id") && $(this).attr("id").search(/^meta/) != -1)
1346 {
1347 $(this).css("display", "none");
1348 $(this.metaNameField).css("display", "none");
1349 $(this.addRowButton).css("display", "none");
1350 }
1351 });
1352}
1353
1354/* override this function in other interface/site/collection if you want
1355 a different set of metadata sets
1356 Use in conjunction with the dynamic_metadata_set_list variable. */
1357function setStaticMetadataSets(list) {
1358 addOptionToList(list, "All", gs.text.de.all_metadata);
1359}
1360
1361function readyPageForEditing()
1362{
1363 CKEDITOR.on('instanceReady', function(evt) {
1364 addCKEEditableState(evt,editableInitStates);
1365 });
1366
1367 if($("#metadataSetList").length)
1368 {
1369 var setList = $("#metadataSetList");
1370 if(!setList.css("display") || setList.css("display") == "")
1371 {
1372 setEditingFeaturesVisible(false);
1373 }
1374 else
1375 {
1376 setEditingFeaturesVisible(true);
1377 }
1378 return;
1379 }
1380
1381 $("#editContentButton").html(gs.text.de.hide_editor);
1382 //wait for 0.5 sec to let ckeditor up
1383 //setTimeout(function(){ $(".sectionText").each(function(){addEditableState(this,editableInitStates);}); }, 500);
1384 var editBar = $("#editBarLeft");
1385
1386 var visibleMetadataList = $("<select>", {"id": "metadataSetList", "class": "ui-state-default"});
1387 setStaticMetadataSets(visibleMetadataList);
1388
1389 var metadataListLabel = $("<span>", {"id": "metadataListLabel", "style": "margin-left:20px;"});
1390 metadataListLabel.html(gs.text.de.visible_metadata);
1391 editBar.append(metadataListLabel);
1392 editBar.append(visibleMetadataList);
1393 visibleMetadataList.change(onVisibleMetadataSetChange);
1394 editBar.append("<br>");
1395 for (var i=0; i< save_and_rebuild_buttons.length; i++) {
1396 var button_type = save_and_rebuild_buttons[i];
1397 if (button_type == "save") {
1398 var saveButton = $("<button>", {"id": "saveButton", "class": "ui-state-default ui-corner-all"});
1399 saveButton.click(save);
1400 saveButton.html(gs.text.de.save);
1401 editBar.append(saveButton);
1402 } else if(button_type == "rebuild") {
1403 var rebuildButton = $("<button>", {"id": "rebuildButton", "class": "ui-state-default ui-corner-all"});
1404 rebuildButton.click(rebuildCurrentCollection);
1405 rebuildButton.html(gs.text.de.rebuild);
1406 editBar.append(rebuildButton);
1407 } else if (button_type == "saveandrebuild") {
1408 var saveAndRebuildButton = $("<button>", {"id": "saveAndRebuildButton", "class": "ui-state-default ui-corner-all"});
1409 saveAndRebuildButton.click(saveAndRebuild);
1410 saveAndRebuildButton.html(gs.text.de.saverebuild);
1411 editBar.append(saveAndRebuildButton);
1412
1413 }
1414 }
1415 var statusBarDiv = $("<div>");
1416 editBar.append(statusBarDiv);
1417 _statusBar = new StatusBar(statusBarDiv[0]);
1418
1419 var titleDivs = $(".sectionTitle");
1420 for(var i = 0; i < titleDivs.length; i++)
1421 {
1422 addEditMetadataLink(titleDivs[i]);
1423 }
1424
1425 _baseURL = gs.xsltParams.library_name;
1426 onVisibleMetadataSetChange(); // make sure that the selected item in the list is active
1427}
1428
1429// override the one in documentmaker_scripts_util
1430// currently not used if other one is present. need to get the js include order right
1431function enableSaveButtons(enabled) {
1432 if (enabled) {
1433 $("#saveButton, #rebuildButton, #saveAndRebuildButton").removeAttr("disabled");
1434 } else {
1435 $("#saveButton, #rebuildButton, #saveAndRebuildButton").attr("disabled", "disabled");
1436 }
1437}
1438
1439/* this is a cut down version of save() from documentmaker_scripts_util.js
1440 going back to using save, will delete this once everything working*/
1441function saveMetadataChangesOld() {
1442
1443 console.log("Saving metadata changes");
1444
1445 // get collection name
1446 var collection = gs.cgiParams.c;;
1447
1448 // get document id
1449 var docID = gs.cgiParams.d;
1450
1451 var metadataChanges = new Array();
1452 if (_deletedMetadata.length > 0) {
1453
1454 for(var i = 0; i < _deletedMetadata.length; i++) {
1455
1456 var currentRow = _deletedMetadata[i];
1457
1458 //Get metadata name
1459 var cells = currentRow.getElementsByTagName("TD");
1460 var nameCell = cells[0];
1461 var name = nameCell.innerHTML;
1462 var valueCell = cells[1];
1463 var value = valueCell.innerHTML;
1464 metadataChanges.push({type:'delete', docID:docID, name:name, value:value});
1465 removeFromParent(currentRow);
1466 }
1467 }
1468
1469 /*var changes = null;
1470 //var changes = de.Changes.getChangedEditableSections();
1471 for(var i = 0; i < changes.length; i++) {
1472
1473 var changedElem = changes[i];
1474
1475 //Get metadata name
1476 var row = changedElem.parentNode;
1477 var cells = row.getElementsByTagName("TD");
1478 var nameCell = cells[0];
1479 var name = nameCell.innerHTML;
1480 var value = changedElem.innerHTML;
1481 value = value.replace(/&nbsp;/g, " ");
1482
1483 var orig = changedElem.originalValue;
1484 if (orig) {
1485 orig = orig.replace(/&nbsp;/g, " ");
1486 }
1487 metadataChanges.push({collection:collection, docID:docID, name:name, value:value, orig:orig});
1488 changedElem.originalValue = changedElem.innerHTML;
1489
1490 }
1491*/
1492 if (metadataChanges.length ==0) {
1493 console.log(gs.text.de.no_changes);
1494 return;
1495 }
1496
1497 var processChangesLoop = function(index)
1498 {
1499 var change = metadataChanges[index];
1500
1501 var callbackFunction;
1502 if(index + 1 == metadataChanges.length)
1503 {
1504 callbackFunction = function(){console.log("Completed saving metadata changes. You must rebuild the collection for the changes to take effect.");};
1505 }
1506 else
1507 {
1508 callbackFunction = function(){processChangesLoop(index + 1)};
1509 }
1510 if (change.type == "delete") {
1511 gs.functions.removeArchivesMetadata(collection, gs.xsltParams.site_name, change.docID, change.name, null, change.value, function(){callbackFunction();});
1512 } else {
1513 if(change.orig)
1514 {
1515 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, change.orig, "override", function(){callbackFunction();});
1516 }
1517 else
1518 {
1519 gs.functions.setArchivesMetadata(collection, gs.xsltParams.site_name, docID, change.name, null, change.value, null, "accumulate", function(){callbackFunction();});
1520 }
1521 }
1522 }
1523 processChangesLoop(0);
1524 /* need to clear the changes from the page */
1525 while (_deletedMetadata.length>0) {
1526 _deletedMetadata.pop();
1527 }
1528
1529}
1530
1531
1532
1533
1534
1535/***************
1536* MENU SCRIPTS *
1537***************/
1538function moveScroller() {
1539 var move = function() {
1540 var editbar = $("#editBar");
1541 var st = $(window).scrollTop();
1542 var fa = $("#float-anchor").offset().top;
1543 if(st > fa) {
1544
1545 editbar.css({
1546 position: "fixed",
1547 top: "0px",
1548 width: editbar.data("width"),
1549 //width: "30%"
1550 });
1551 } else {
1552 editbar.data("width", editbar.css("width"));
1553 editbar.css({
1554 position: "relative",
1555 top: "",
1556 width: ""
1557 });
1558 }
1559 };
1560 $(window).scroll(move);
1561 move();
1562}
1563
1564
1565function floatMenu(enabled)
1566{
1567 var menu = $(".tableOfContentsContainer");
1568 if(enabled)
1569 {
1570 menu.data("position", menu.css("position"));
1571 menu.data("width", menu.css("width"));
1572 menu.data("right", menu.css("right"));
1573 menu.data("top", menu.css("top"));
1574 menu.data("max-height", menu.css("max-height"));
1575 menu.data("overflow", menu.css("overflow"));
1576 menu.data("z-index", menu.css("z-index"));
1577
1578 menu.css("position", "fixed");
1579 menu.css("width", "300px");
1580 menu.css("right", "0px");
1581 menu.css("top", "100px");
1582 menu.css("max-height", "600px");
1583 menu.css("overflow", "auto");
1584 menu.css("z-index", "200");
1585
1586 $("#unfloatTOCButton").show();
1587 }
1588 else
1589 {
1590 menu.css("position", menu.data("position"));
1591 menu.css("width", menu.data("width"));
1592 menu.css("right", menu.data("right"));
1593 menu.css("top", menu.data("top"));
1594 menu.css("max-height", menu.data("max-height"));
1595 menu.css("overflow", menu.data("overflow"));
1596 menu.css("z-index", menu.data("z-index"));
1597
1598 $("#unfloatTOCButton").hide();
1599 $("#floatTOCToggle").prop("checked", false);
1600 }
1601
1602 var url = gs.xsltParams.library_name + "?a=d&ftoc=" + (enabled ? "1" : "0") + "&c=" + gs.cgiParams.c;
1603
1604 $.ajax(url);
1605}
1606
1607/********************
1608* SLIDESHOW SCRIPTS *
1609********************/
1610
1611function showSlideShow()
1612{
1613 if(!($("#gs-slideshow").length))
1614 {
1615 var slideshowDiv = $("<div>", {id:"gs-slideshow", style:"height:100%;"});
1616 var loadingImage = $("<img>", {src:gs.imageURLs.loading});
1617 slideshowDiv.append(loadingImage);
1618
1619 $.blockUI({message: $(slideshowDiv), css:{top: "5%", left: "5%", width: "90%", height: "90%", overflow: "auto", cursor: "auto"}});
1620
1621 retrieveImagesForSlideShow(function(imageIDArray)
1622 {
1623 loadingImage.hide();
1624 if(imageIDArray && imageIDArray.length > 0)
1625 {
1626 var imageURLs = new Array();
1627 for(var i = 0; i < imageIDArray.length; i++)
1628 {
1629 if(imageIDArray[i].source && imageIDArray[i].source.search(/.*\.(gif|jpg|jpeg|png)$/) != -1)
1630 {
1631 imageURLs.push(gs.collectionMetadata.httpPath + "/index/assoc/" + gs.documentMetadata.assocfilepath + "/" + imageIDArray[i].source);
1632 }
1633 }
1634 new SlideShowWidget(slideshowDiv, imageURLs, imageIDArray);
1635 }
1636 });
1637 }
1638 else
1639 {
1640 $("#gs-slideshow").show();
1641 }
1642}
1643
1644function retrieveImagesForSlideShow(callback)
1645{
1646 var template = "";
1647 template += '<xsl:template match="/">';
1648 template += '<images>[';
1649 template += '<xsl:for-each select="//documentNode">';
1650 template += '<xsl:text disable-output-escaping="yes">{"source":"</xsl:text><gsf:metadata name="Source"/><xsl:text disable-output-escaping="yes">",</xsl:text>';
1651 template += '<xsl:text disable-output-escaping="yes">"id":"</xsl:text><xsl:value-of select="@nodeID"/><xsl:text disable-output-escaping="yes">"}</xsl:text>';
1652 template += '<xsl:if test="position() != count(//documentNode)">,</xsl:if>';
1653 template += '</xsl:for-each>';
1654 template += ']</images>';
1655 template += '</xsl:template>';
1656
1657 var url = gs.xsltParams.library_name + "/collection/" + gs.cgiParams.c + "/document/" + gs.cgiParams.d + "?ed=1&ilt=" + template.replace(" ", "%20");
1658
1659 $.ajax(
1660 {
1661 url:url,
1662 success: function(data)
1663 {
1664 var startIndex = data.indexOf(">", data.indexOf(">") + 1) + 1;
1665 var endIndex = data.lastIndexOf("<");
1666 var arrayString = data.substring(startIndex, endIndex);
1667 var imageIDArray = eval(arrayString);
1668
1669 callback(imageIDArray);
1670 }
1671 });
1672}
1673
1674function SlideShowWidget(mainDiv, images, idArray)
1675{
1676 var _inTransition = false;
1677 var _images = new Array();
1678 var _mainDiv = mainDiv;
1679 var _imageDiv = $("<div>", {id:"ssImageDiv", style:"height:95%; overflow:auto;"});
1680 var _navDiv = $("<div>", {style:"height:5%;"});
1681 var _nextButton = $("<img>", {src:gs.imageURLs.next, style:"float:right; cursor:pointer;"});
1682 var _prevButton = $("<img>", {src:gs.imageURLs.prev, style:"float:left; cursor:pointer; display:none;"});
1683 var _closeLink = $("<a href=\"javascript:$.unblockUI()\">Close Slideshow</a>");
1684 var _clearDiv = $("<div>", {style:"clear:both;"});
1685 var _currentIndex = 0;
1686
1687 _navDiv.append(_nextButton);
1688 _navDiv.append(_closeLink);
1689 _navDiv.append(_prevButton);
1690 _navDiv.append(_clearDiv);
1691 _mainDiv.append(_navDiv);
1692 _mainDiv.append(_imageDiv);
1693
1694 for(var i = 0; i < images.length; i++)
1695 {
1696 _images.push($("<img>", {src:images[i], "class":"slideshowImage"}));
1697 }
1698
1699 if(_images.length < 2)
1700 {
1701 _nextButton.css("display", "none");
1702 }
1703
1704 _imageDiv.append(_images[0]);
1705
1706 this.nextImage = function()
1707 {
1708 if(!_inTransition)
1709 {
1710 _inTransition = true;
1711 if((_currentIndex + 1) < _images.length)
1712 {
1713 _prevButton.css("display", "");
1714 if(_currentIndex + 1 == _images.length - 1)
1715 {
1716 _nextButton.css("display", "none");
1717 }
1718
1719 _imageDiv.fadeOut(500, function()
1720 {
1721 _imageDiv.empty();
1722 _imageDiv.append(_images[_currentIndex + 1]);
1723 _currentIndex++;
1724 _imageDiv.fadeIn(500, function()
1725 {
1726 _inTransition = false;
1727 });
1728 });
1729 }
1730 else
1731 {
1732 _inTransition = false;
1733 }
1734 }
1735 }
1736
1737 this.prevImage = function()
1738 {
1739 if(!_inTransition)
1740 {
1741 _inTransition = true;
1742 if((_currentIndex - 1) >= 0)
1743 {
1744 _nextButton.css("display", "");
1745 if(_currentIndex - 1 == 0)
1746 {
1747 _prevButton.css("display", "none");
1748 }
1749
1750 _imageDiv.fadeOut(500, function()
1751 {
1752 _imageDiv.empty();
1753 _imageDiv.append(_images[_currentIndex - 1]);
1754 _currentIndex--;
1755 _imageDiv.fadeIn(500, function()
1756 {
1757 _inTransition = false;
1758 });
1759 });
1760 }
1761 else
1762 {
1763 _inTransition = false;
1764 }
1765 }
1766 }
1767
1768 var getRootFilenameFromURL = function(url)
1769 {
1770 var urlSegments = url.split("/");
1771 var filename = urlSegments[urlSegments.length - 1];
1772 return filename.replace(/_thumb\..*$/, "");
1773 }
1774
1775 var setLink = function(currentLink, index)
1776 {
1777 $(currentLink).click(function()
1778 {
1779 _inTransition = true;
1780 _currentIndex = index;
1781 _imageDiv.fadeOut(500, function()
1782 {
1783 _imageDiv.empty();
1784 _imageDiv.append(_images[_currentIndex]);
1785 _imageDiv.fadeIn(500, function()
1786 {
1787 _inTransition = false;
1788 });
1789 });
1790 });
1791 }
1792
1793 var sliderLinks = $(".pageSliderCol a");
1794 for(var i = 0; i < sliderLinks.length; i++)
1795 {
1796 var currentLink = sliderLinks[i];
1797 var id = $(currentLink).attr("href").split("'")[1];
1798
1799 for(var j = 0; j < idArray.length; j++)
1800 {
1801 if(idArray[j].id == id)
1802 {
1803 var image = idArray[j].source;
1804
1805 for(var l = 0; l < images.length; l++)
1806 {
1807 var filename = getRootFilenameFromURL(images[l]);
1808 if (filename == image)
1809 {
1810 setLink(currentLink, l);
1811 break;
1812 }
1813 }
1814
1815 break;
1816 }
1817 }
1818 }
1819
1820 _nextButton.click(this.nextImage);
1821 _prevButton.click(this.prevImage);
1822}
Note: See TracBrowser for help on using the repository browser.