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

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

added empty var and some comments for new autocompletion of meta values when editing metadata

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