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

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

Added wait cursor property while getting sections

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