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

Last change on this file since 32773 was 32773, checked in by ak19, 5 years ago

Minor change: optional parameter encode_percentages also introduced for makeSafeForURL, where it defaults to true this time

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