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

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

Added base function expandAndExecute for focusSection and focusAnchor

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