// ---
/*
	JaS is developed by Robert Nyman, http://www.robertnyman.com
	For more information, please see http://www.robertnyman.com/jas
*/
var JaS = {
	// Customization parameters
	imagePath : "Pictures/",
	images : [
	    // "Filename", "Caption", "Tag[, tag]...", "Width", "Height"
	    // Separate multiple tags by a comma
	    
	    // the first picture should always be the library, then most recent pictures
		["2006/Building.jpg",                  "The Library Building",                              "2006, Building",   320, 187],  

        /*
		["2008/WelcomeMarie01.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie02.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     299, 448],
		["2008/WelcomeMarie03.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     299, 448],
		["2008/WelcomeMarie04.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie05.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie06.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie07.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie08.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie09.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie10.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie11.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
		["2008/WelcomeMarie12.jpg",            "Welcome Marie McAndrew-Taylor, Director",           "2008, Adults",     448, 299],
        */
        
		["2007/CommunityRoom2.jpg",            "The Community Room",                                "2007, Building",   320, 213],
		["2007/TeenRoom.jpg",                  "The Teen Reading Room",                             "2007, Building",   320, 213],
		["2007/ArtGallery.jpg",                "The Art Gallery in the Lane Family Reading Room",   "2007, Building",   320, 213],

		["2006/Entry.jpg",                     "The Entry",                                         "2006, Building",   220, 240],
		["2006/ExteriorOfLaneReadingRoom.jpg", "Exterior of Lane Reading Room",                     "2006, Building",   320, 240],
		["2006/Cafe.jpg",                      "The Cafe",                                          "2006, Building",   320, 231],
		["2006/ChildrensRoom.jpg",             "The Children's Room",                               "2006, Building",   320, 205],
		["2006/Circulation.jpg",               "The Circulation Area",                              "2006, Building",   320, 269],
		["2006/CommunityRoom.jpg",             "The Community Room",                                "2006, Building",   172, 240],
		["2006/MainReadingArea.jpg",           "The Main Reading Area",                             "2006, Building",   320, 248],

		["2006/RedSoxYankeesGame.jpg",         "Spectators at Red Sox vs. Yankees Night",           "2006, Adults, Program",    320, 240],
		// ["2006/ArcticAdventures.jpg",          "Artic Adventures",                                  "2006, Children, Program", 320, 240],
		// ["2006/BoyAtComputer.jpg",             "Boy at Computer in Children's Room",                "2006, Children, Building", 180, 240],
		// ["2006/ChipAndKids.jpg",               "Chip and Kids",                                     "2006, Children, Program", 320, 240],
		["2006/CoffeeFriday.jpg",              "Coffee Friday Patrons Gather at the Cafe",          "2006, Adults", 320, 240],
		["2006/PeaceCranes.jpg",               "Peace Cranes",                                      "2006, Program", 320, 240],
		// ["2006/YouthIceCreamParty002.jpg",     "Youth Ice Cream Party, 2006",                       "2006, Children, Youth, Program", 320, 240],
		// ["2006/YouthIceCreamParty008.jpg",     "Youth Ice Cream Party, 2006",                       "2006, Children, Youth, Program", 320, 240],
		// ["2006/YouthIceCreamParty014.jpg",     "Youth Ice Cream Party, 2006",                       "2006, Children, Youth, Program", 320, 240],
		// ["2006/YouthIceCreamParty018.jpg",     "Youth Ice Cream Party, 2006",                       "2006, Children, Youth, Program", 320, 240],

        // we'll keep the staff last
	    // Current staff first / director on top (same order as Staff page)
		["../../About/SheilaMcCormick.png", "Sheila McCormick, Director (2009-Present)", "2009, Staff", 150, 150],
		["../../About/LauraWilliams.png", "Laura Williams, Head of Adult Services (????-Present)", "2007, Staff", 150, 150],
		["../../About/MoiraCranshaw.png", "Moira Cranshaw, Young Adult Coordinator (????-Present)", "2007, Staff", 150, 150],
		["../../About/KellyDanielsBaker.png", "Kelly Daniels Baker, Head of Youth Services (????-Present)", "2007, Staff", 150, 150],
		["../../About/VanessaRyder.png",       "Vanessa Ryder, Circulation Assistant (????-Present)",              "2007, Staff",      150, 150],
		["../../About/TaraHerzig.png", "Tara Herzig, Circulation Assistant (2009-Present),", "2009, Staff", 150, 150],
	    // Past staff sorted by descending end dates
		["../../About/AaronFalbel.png", "Aaron Falbel, Circulation Assistant (????-2009)", "2007, Staff", 150, 150],
		["../../About/MarieMcAndrewTaylor.png", "Marie McAndrew-Taylor, Director (2008-2009)", "2008, Staff", 150, 150],
		["../../About/SharonSharry.png", "Sharon Sharry, Director (1999-2008)", "2007, Staff", 150, 150]
	],
	fadeContainerId : "jas-container",
	imageContainerId : "jas-image",
	imageTextContainerId : "jas-image-text",
	firstLinkId : "first-image",
	previousLinkId : "previous-image",
	nextLinkId : "next-image",
	lastLinkId : "last-image",
	imageCounterId : "image-counter",
	startSlideShowId : "start-slideshow",
	stopSlideShowId : "stop-slideshow",	
	dimBackgroundOverlayId : "jas-dim-overlay",
	dimBackgroundId : "dim-background",
	noDimBackgroundId : "no-dim-background",
	thumbnailContainerId: "jas-thumbnails",
	tagsContainerId: "jas-tags",
	tagsSelectAllId: "jas-select-all-tags",
	useImageText : true,
	useThumbnails : true,
	allowDimmedBackground : true,
	automaticallyDimBackgroundWhenSlideShow : true,
	useTags : true,
	useKeyboardShortcuts : true,	
	useFadingIn : true,
	useFadingOut : true,
	useFadeWhenNotSlideshow : false,
	useFadeForSlideshow : true,
	useFadeAtInitialLoad : false,
	fadeIncrement : 0.1,	
	fadeInterval : 100, // Milliseconds	
	timeForSlideInSlideshow : 1500, // Milliseconds	
	hidePreviousNextWhenAppropriate : false,
	
	thumbnailMaxWidth : 96,
	thumbnailMaxHeight : 71,
	imageMaxWidth : 320,
	imageMaxHeight : 240,
	
	// JaS function parameters
	allImages : null,
	currentImages : null,
	fadeContainer : null,
	imageContainer : null,
	imageTextContainer : null,
	firstLink : null,
	previousLink : null,
	nextLink : null,
	lastLink : null,
	dimBackgroundOverlay : null,
	dimBackgroundLink : null,
	noDimBackgroundLink : null,
	dimmingActivated : false,
	imageCounter : null,
	startSlideShowLink : null,
	stopSlideShowLink : null,
	thumbnailContainer : null,
	thumbnailCollection : [],
	currentThumbnailSelected : null,
	tagsContainer : null,
	tagsSelectAll : null,
	tagsList : null,
	tags : [],
	tagsCheckboxes : [],
	selectAllTags : true,
	imageText : null,
	imageText : "",
	imageSource : "",
	imageIndex : 0,
	fadingIn : true,
	fadeLevel : 0,
	fadeEndLevel : 1,
	fadeTimer : null,
	hasOpacitySupport : false,
	useMSFilter : false,
	useMSCurrentStyle : false,
	slideshowIsSupported : false,
	slideshowIsPlaying : false,
	functionAfterFade : null,
	isInitialLoad : false,
	
	init : function (){
    	if($){
			this.fadeContainer = $(this.fadeContainerId);
			this.imageContainer = $(this.imageContainerId);
			this.slideshowIsSupported = this.fadeContainer && this.imageContainer;
			if(this.slideshowIsSupported){
				this.allImages = this.images;
				this.currentImages = this.images;
				if(this.useImageText){
					this.imageTextContainer = $(this.imageTextContainerId);
					if(!this.imageTextContainer){
						this.useImageText = false;
					}
				}
				this.hasOpacitySupport = typeof this.fadeContainer.style.filter != "undefined" || typeof this.fadeContainer.style.opacity != "undefined";
				this.useMSFilter = typeof this.fadeContainer.style.filter != "undefined";
				this.useMSCurrentStyle = typeof this.fadeContainer.currentStyle != "undefined";
				
				this.firstLink = $(this.firstLinkId);
				this.firstLink.onclick = JaS.firstLinkClick;
				this.previousLink = $(this.previousLinkId);
				this.previousLink.onclick = JaS.previousLinkClick;
				this.nextLink = $(this.nextLinkId);
				this.nextLink.onclick = JaS.nextLinkClick;
				this.lastLink = $(this.lastLinkId);
				this.lastLink.onclick = JaS.lastLinkClick;
				this.imageCounter = $(this.imageCounterId);
				this.startSlideShowLink = $(this.startSlideShowId);
				if(this.startSlideShowLink){
					this.startSlideShowLink.style.display = "inline";
				}
				this.startSlideShowLink.onclick = JaS.startSlideShowClick;
				this.stopSlideShowLink = $(this.stopSlideShowId);
				if(this.stopSlideShowLink){
					this.stopSlideShowLink.style.display = "none";
				}
				this.stopSlideShowLink.onclick = JaS.stopSlideshowClick;
				
				if(this.allowDimmedBackground){
					this.dimBackgroundOverlay = $(this.dimBackgroundOverlayId);
					this.dimBackgroundLink = $(this.dimBackgroundId);
					this.noDimBackgroundLink = $(this.noDimBackgroundId);
					if(this.dimBackgroundOverlay && this.dimBackgroundLink && this.noDimBackgroundLink){
						this.dimBackgroundLink.onclick = JaS.dimBackgroundClick;
						this.noDimBackgroundLink.onclick = JaS.noDimackgroundClick;
						this.noDimBackgroundLink.style.display = "none";
						this.dimmingActivated = true;
					}
				}
				
				if(this.useKeyboardShortcuts){
					document.onkeydown = JaS.documentKeyDown;
				}
				
				this.thumbnailContainer = $(this.thumbnailContainerId);
				if(this.useThumbnails && this.thumbnailContainer){
					this.createThumbnails();
				}
				
				this.tagsContainer = $(this.tagsContainerId);
				if(this.useTags && this.tagsContainer){
					this.tagsSelectAll = $(this.tagsSelectAllId);
					if(this.tagsSelectAll){
						this.tagsSelectAll.onclick = JaS.tagsSelectAllClick;
						this.createTagList();
					}
				}
				
				this.isInitialLoad = true;
				this.setImage();
				this.isInitialLoad = false;
			}
		}
	},
	
	firstLinkClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.firstImage();
	},
	
	previousLinkClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.previousImage();
	},
	
	nextLinkClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.nextImage();
	},
	
	lastLinkClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.lastImage();
	},
	
	startSlideShowClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.startSlideshow();
	},
	
	stopSlideshowClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.stopSlideshow();
	},
	
	dimBackgroundClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.dimBackground();
	},
	
	documentKeyDown : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.applyKeyboardNavigation(oEvent);
	},
	
	tagsSelectAllClick : function (oEvent){
		JaS.tagsSelectAll = this.checked;
		JaS.markAllTags();
	},
	
	noDimackgroundClick : function(oEvent){
		var oEvent = (typeof oEvent != "undefined")? oEvent : event;
		JaS.preventDefaultEventBehavior(oEvent);
		JaS.noDimBackground();
	},
	
	setImage : function (){
		if(this.currentImages.length > 0){
			this.imageContainer.style.visibility = "visible";
			this.imageSource = this.currentImages[this.imageIndex][0];
			this.imageText = this.currentImages[this.imageIndex][1];
			if(this.useFadingOut && (this.slideshowIsPlaying && this.useFadeForSlideshow) || (!this.slideshowIsPlaying && this.useFadeWhenNotSlideshow) && (this.useFadeAtInitialLoad && this.isInitialLoad || !this.isInitialLoad)){
				this.fadeOut();
			}
			else{
			    this.updateImage();
			   
				if(this.hidePreviousNextWhenAppropriate)
				{
				    this.previousLink.style.visibility = (this.imageIndex > 0)? "visible" : "hidden";
				    this.nextLink.style.visibility = (this.imageIndex < (this.currentImages.length - 1))? "visible" : "hidden";
				}
				if((this.useFadeAtInitialLoad && this.isInitialLoad || !this.isInitialLoad) && ((this.slideshowIsPlaying && this.useFadeForSlideshow) || (!this.slideshowIsPlaying && this.useFadeWhenNotSlideshow))){
					this.fadeIn();
				}
			}
			if(this.useThumbnails){
				this.markCurrentThumbnail();
			}
		}
		else{
			this.imageSource = "";
			this.imageText = "";
			this.displayImageCount();
			this.imageContainer.style.visibility = "hidden";
			this.setImageText();
		}
	},
	
	updateImage : function ()
	{
		this.displayImageCount();
		this.imageContainer.setAttribute("src", (this.imagePath + this.imageSource));
		
        var oWidth = this.currentImages[this.imageIndex][3];
        var oHeight = this.currentImages[this.imageIndex][4];
        
        if (oWidth > this.imageMaxWidth)
        {
            oHeight = oHeight * this.imageMaxWidth / oWidth;
            oWidth = this.imageMaxWidth;
        }
        if (oHeight > this.imageMaxHeight)
        {
            oWidth = oWidth * this.imageMaxHeight / oHeight;
            oHeight = this.imageMaxHeight;
        }
		this.imageContainer.setAttribute("width", oWidth);
		this.imageContainer.setAttribute("height", oHeight);

		this.setImageText();
	},
	
	displayImageCount : function (){
    	if(this.imageCounter){
			this.imageCounter.innerHTML = "Photo " + (((this.currentImages.length > 0)? this.imageIndex : -1) + 1) + " of " + this.currentImages.length;
		}
	},
	
	nextImage : function (){
		if(this.imageIndex < (this.currentImages.length - 1)){
			++this.imageIndex;
			this.setImage();
		}
		else if(this.slideshowIsPlaying){
			this.stopSlideshow();
			this.imageIndex = 0;
			this.setImage();
		}
	},
	
	lastImage : function (){
		if(this.imageIndex < (this.currentImages.length - 1)){
			this.imageIndex = this.currentImages.length - 1;
			this.setImage();
		}
		else if(this.slideshowIsPlaying){
			this.stopSlideshow();
			this.imageIndex = 0;
			this.setImage();
		}
	},
	
	firstImage : function (){
		if(this.imageIndex > 0){
			this.imageIndex = 0;
			this.setImage();
		}         
	},

	previousImage : function (){
		if(this.imageIndex > 0){
			--this.imageIndex;
			this.setImage();
		}         
	},

	setImageText : function (){
		this.imageTextContainer.setAttribute("alt", this.imageText);
    	if(this.useImageText && typeof this.imageText == "string"){
			this.imageTextContainer.innerHTML = this.imageText;
		}
	},
	
	setDimBackgroundSize : function(){
         var oDimBackground = this.dimBackgroundOverlay.style;
         var intWidth = document.body.offsetWidth;
         var intXScroll = (typeof window.pageXOffset != "undefined")? window.pageXOffset : document.body.scrollLeft;
         var intHeight = (typeof window.innerHeight != "undefined")? window.innerHeight : (document.documentElement)? document.documentElement.clientHeight : document.body.clientHeight;
         var intYScroll = (typeof window.window.pageYOffset != "undefined")? window.window.pageYOffset : (document.documentElement)? document.documentElement.scrollTop : document.documentElement.scrollTop;
         oDimBackground.width = intWidth + intXScroll + "px";
         oDimBackground.height = intHeight + intYScroll + "px";
	},
	
	dimBackground : function (){
         this.setDimBackgroundSize();
         this.dimBackgroundOverlay.style.display = "block";
		 this.noDimBackgroundLink.style.display = "inline";		
	},
	
	noDimBackground : function (fromStopSlideshow){
		this.dimBackgroundOverlay.style.display = "none";
		this.noDimBackgroundLink.style.display = "none";
		if(!fromStopSlideshow){
			this.stopSlideshow();
		}
	},
		
	startSlideshow : function (){
		if(this.currentImages.length > 0){
			this.startSlideShowLink.style.display = "none";
			this.stopSlideShowLink.style.display = "inline";
			this.slideshowIsPlaying = true;
			this.fadeTimer = setTimeout("JaS.nextImage()", JaS.timeForSlideInSlideshow);
			if(this.dimmingActivated  && this.automaticallyDimBackgroundWhenSlideShow){
				this.dimBackground();
			}
		}
	},
	
	stopSlideshow : function (){
		if(this.currentImages.length > 0){
			this.startSlideShowLink.style.display = "inline";
			this.stopSlideShowLink.style.display = "none";
			this.slideshowIsPlaying = false;
			this.setFadeParams(false, 1, 0);
			this.setFade();
			clearTimeout(this.fadeTimer);
			if(this.dimmingActivated && this.automaticallyDimBackgroundWhenSlideShow){
				this.noDimBackground(true);
			}
		}
	},
	
	fadeIn : function (){
		this.setFadeParams(true, 0, 1);
		this.functionAfterFade = null;
		this.fade();
		if(this.slideshowIsPlaying){
			this.functionAfterFade = "this.startSlideshow()";
		}
	},
	
	fadeOut : function (){
		this.setFadeParams(false, 1, 0);
		this.functionAfterFade = "this.fadeOutDone()";
		this.fade();
	},
	
	fadeOutDone : function (){
	    this.updateImage();
		if(this.useFadingIn){
			this.fadeIn();
		}
		else{
			this.fadeLevel = 1;
			this.setFade();
		}
	},
	
	fade : function (){
		if((this.fadingIn && this.fadeLevel < this.fadeEndLevel) || !this.fadingIn && this.fadeLevel > this.fadeEndLevel){
			this.fadeLevel = (this.fadingIn)? this.fadeLevel + this.fadeIncrement : this.fadeLevel - this.fadeIncrement;
			// This line is b/c of a floating point bug in JavaScript
			this.fadeLevel = Math.round(this.fadeLevel * 10) / 10;
			this.setFade();
			this.fadeTimer = setTimeout("JaS.fade()", this.fadeInterval);
		}
		else{
			clearTimeout(this.fadeTimer);
			if(this.functionAfterFade){
				eval(this.functionAfterFade);
			}
		}
	},
	
	setFade : function (){
		if(this.useMSFilter){
			this.fadeContainer.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.fadeLevel * 100) + ")";
		}
		else{
			this.fadeContainer.style.opacity = this.fadeLevel;
		}
	},
	
	setFadeParams : function (bFadingIn, intStartLevel, intEndLevel){
		this.fadingIn = bFadingIn;
		this.fadeLevel = intStartLevel;
		this.fadeEndLevel = intEndLevel;
	},
	
	createThumbnails : function (){
		this.thumbnailContainer.innerHTML = "";
		this.thumbnailCollection = [];
    	var oThumbnailsList = document.createElement("ul");
		var oListItem;
		var oThumbnail;
		var oCurrentImage;
		for(var i=0; i<this.currentImages.length; i++){
        	oCurrentImage = this.currentImages[i];
			oListItem = document.createElement("li");
			oThumbnail = document.createElement("img");
			oThumbnail.setAttribute("id", ("jas-thumbnail-" + i));
			oThumbnail.setAttribute("src", (this.imagePath + oCurrentImage[0]));
			oThumbnail.setAttribute("alt", oCurrentImage[1]);
			oThumbnail.setAttribute("title", oCurrentImage[1]);

            // fit the thumbnail into our desired size

            // We no longer load all the images to calculate their width and height.
            // They are pre-entered.
            /*             
            var myImage = new Image();
            myImage.src = (this.imagePath + oCurrentImage[0]);
            var oWidth = myImage.width;
            var oHeight = myImage.height;
            */
            var oWidth = oCurrentImage[3];
            var oHeight = oCurrentImage[4];
            
            if (oWidth > this.thumbnailMaxWidth)
            {
                oHeight = oHeight * this.thumbnailMaxWidth / oWidth;
                oWidth = this.thumbnailMaxWidth;
            }
            if (oHeight > this.thumbnailMaxHeight)
            {
                oWidth = oWidth * this.thumbnailMaxHeight / oHeight;
                oHeight = this.thumbnailMaxHeight;
            }
			oThumbnail.setAttribute("width", oWidth);
			oThumbnail.setAttribute("height", oHeight);
			oThumbnail.setAttribute("align", "center");
			oThumbnail.setAttribute("style", 
			                          "padding-left: " + ((this.thumbnailMaxWidth - oWidth) / 2) + "; "
			                        + "padding-top: " + ((this.thumbnailMaxHeight - oHeight) / 2) + "; ");

			oThumbnail.onclick = JaS.thumbnailClick;
			this.thumbnailCollection.push(oThumbnail);
			oListItem.appendChild(oThumbnail);
			oThumbnailsList.appendChild(oListItem);			
        }
		this.thumbnailContainer.appendChild(oThumbnailsList);
		if(this.thumbnailCollection.length > 0){
			this.markCurrentThumbnail();
		}
		if(this.slideshowIsPlaying){
			this.stopSlideshow();
		}
	},
	
	thumbnailClick : function (oEvent){
		JaS.imageIndex = parseInt(this.getAttribute("id").replace(/\D*(\d+)$/, "$1"), 10);
		JaS.setImage();
	},
	
	markCurrentThumbnail : function (){
		if(this.currentThumbnailSelected){
	        this.currentThumbnailSelected.className = "";
			// Sometimes, in IE, the image loses its reference to its parent
			if(this.currentThumbnailSelected.parentNode){
				this.currentThumbnailSelected.parentNode.className = "";
			}
		}
		this.currentThumbnailSelected = this.thumbnailCollection[this.imageIndex];
		this.currentThumbnailSelected.className = "selected";
		this.currentThumbnailSelected.parentNode.className = "selected-parent";
	},
	
	createTagList : function (){
		var strCurrentTag;
		var arrCurrentTag;
		var oRegExp;
		
		for(var i=0; i<this.images.length; i++){
			arrCurrentTag = this.images[i][2].replace(/\s*(,)\s*/,  "$1").split(",");
			for(var j=0; j<arrCurrentTag.length; j++){
            	strCurrentTag = arrCurrentTag[j].trim();
				oRegExp = new RegExp(strCurrentTag, "i");
				if(this.tags.toString().search(oRegExp) == -1){
					this.tags.push(strCurrentTag);
				}
            }
        }
        
        // sort the array to make our tag list more readable
        this.tags.sort();
        
		this.tagsList = document.createElement("ul");
		var oListItem;
		var oTagCheckbox;
		var oLabel;
		for(var k=0; k<this.tags.length; k++){
			oTag = this.tags[k];
			oListItem = document.createElement("li");
			oTagCheckbox = document.createElement("input");
			oTagCheckbox.setAttribute("type", "checkbox");
			oTagCheckbox.setAttribute("id", ("jas-" + oTag));
			oTagCheckbox.setAttribute("value", oTag);
			oTagCheckbox.checked = true;
			oTagCheckbox.onclick = JaS.tagCheckboxClick;
			oLabel = document.createElement("label");
			oLabel.setAttribute("for", ("jas-" + oTag));
			oLabel.innerHTML = oTag;
			this.tagsCheckboxes.push(oTagCheckbox);
			oListItem.appendChild(oTagCheckbox);
			oListItem.appendChild(oLabel);
			this.tagsList.appendChild(oListItem);
		}
		this.tagsContainer.appendChild(this.tagsList);
		// This loop is necessary since IE can only mark checkboxes as checked after they've been added to the document
		for(var l=0; l<this.tagsCheckboxes.length; l++){
			this.tagsCheckboxes[l].checked = true;		
		}
	},
	
	tagCheckboxClick : function (oEvent){
		JaS.applyTagFilter();
	},
	
	applyTagFilter : function (){
		this.currentImages = [];
		var arrCurrentTags = [];
		var oCheckbox;
		for(var i=0; i<this.tagsCheckboxes.length; i++){
        	oCheckbox = this.tagsCheckboxes[i];
			if(oCheckbox.checked){
				arrCurrentTags.push(oCheckbox.value);
			}
        }
		var oRegExp;
		var oImage;
		for(var j=0; j<this.images.length; j++){
        	oImage = this.images[j];
			for(var k=0; k<arrCurrentTags.length; k++){
				oRegExp = new RegExp(arrCurrentTags[k], "i");
				if(oImage[2].search(oRegExp) != -1){
					this.currentImages.push(oImage);
					break;
				}
			}
        }
		
		if(this.useThumbnails){
			this.createThumbnails();
		}
		this.imageIndex = 0;
		this.setImage();
	},
	
	markAllTags : function (){
		for(var i=0; i<this.tagsCheckboxes.length; i++){
			this.tagsCheckboxes[i].checked = this.tagsSelectAll;
        }
		this.applyTagFilter();
	},
	
	closeSession : function (oEvent){
		JaS = null;
		delete JaS;
	},
	
	applyKeyboardNavigation : function (oEvent){
    	var intKeyCode = oEvent.keyCode;
    	if(!oEvent.altKey){
			switch(intKeyCode){
				case 32:
					this.slideshowIsPlaying = (this.slideshowIsPlaying)? false : true;
					if(this.slideshowIsPlaying){
						this.startSlideshow();
					}
					else{
						this.stopSlideshow();
					}
					this.preventDefaultEventBehavior(oEvent);
					break;
				case 37:
				case 38:
					this.previousImage();
					this.preventDefaultEventBehavior(oEvent);
					break;
				case 39:
				case 40:
					this.nextImage();
					this.preventDefaultEventBehavior(oEvent);
					break;
			}
		}
	},
	
	preventDefaultEventBehavior : function (oEvent){
		if(oEvent){
			oEvent.returnValue = false;
			if(oEvent.preventDefault){
				oEvent.preventDefault();
			}
		}
	}
};
// ---
addEvent(window, "load", function(){JaS.init();}, false);
addEvent(window, "unload", function(){JaS.closeSession();}, false);
// ---
// Utility functions
function addEvent(oObject, strEvent, oFunction, bCapture){
	if(oObject){
		if(oObject.addEventListener){
			oObject.addEventListener(strEvent, oFunction, bCapture);
		}
		else if(window.attachEvent){
			oObject.attachEvent(("on" + strEvent), oFunction)
		}
	}
}
// ---
function $(strId){
	return document.getElementById(strId);
}
// ---
if(typeof Array.prototype.push != "function"){
	Array.prototype.push = ArrayPush;
	function ArrayPush(value){
		this[this.length] = value;
	}
}
// ---

//trim function
String.prototype.trim = function() {
    // skip leading and trailing whitespace
    // and return everything in between
    var x=this;
    x=x.replace(/^\s*(.*)/, "$1");
    x=x.replace(/(.*?)\s*$/, "$1");
    return x;
}