// ---

/*

	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 : "http://www.caymanbiodiversity.com/wp-content/themes/baplarge/pictures_birds/picturespigeons/",

	images : [
	
		["apigeonintro.jpg", "Pigeons and Doves", "Generally round, fat-bodied, with short legs. Often walk with a distinctive strutting motion of the head."],	

	
		["pigeon_caribbeandove.jpg", "Caribbean Dove (White-Belly)", "<i>Leptotila jamaicansis	</i><br>Length 30-33cm (12-13\"). Uncommon breeding resident on Grand Cayman and Cayman Brac. Breeds in dry forest. Forages in shrubland and plantation edges. Our local subspecies, <i>Leptotila jamaicansis collaris</i> is endemic: found only in the Cayman Islands and nowhere else in the world.  Approachable, with a marked terrestrial habit - preferring to walk away when disturbed, rather than taking flight. Unlike most local doves, the Caribbean Dove avoids urban areas. It is most easily observed from the Mastic Trail or Queen Elizabeth II Botanic Park."],
		
		["pigeon_commongrounddove.jpg", "<a href=\"http://www.birds.cornell.edu/AllAboutBirds/BirdGuide/Common_Ground-Dove.html\" target=\"_blank\"><img src=\"http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif\" border=\"0\" align=\"right\" onMouseover=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logoclick.gif'\"  onMouseout=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif'\"></a>Common Ground-Dove (Ground Dove)", "<i>Columbina passerina		</i><br>Length 15-18cm (5.75-7\"). Common breeding resident in the Cayman Islands. Prefers coastal habitat, dry open shrubland and disturbed urban areas. Often to be seen foraging for seeds at the sides of roads. Nests in Thatch and coconut palms. Easily recognisable from its tiny stature - half the size of most other doves."],
		
		["pigeon_mourning-dove.jpg", "<a href=\"http://www.birds.cornell.edu/AllAboutBirds/BirdGuide/Mourning_Dove.html\" target=\"_blank\"><img src=\"http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif\" border=\"0\" align=\"right\" onMouseover=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logoclick.gif'\"  onMouseout=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif'\"></a>Mourning Dove", "<i>Zenaida macoura</i><br>Length 28-33cm (11-13\"). Very rare passage migrant to the Cayman Islands. Prefers disturbed habitat and pastures. Not to be confused with Zenaida Dove or White-winged Dove. Morning Dove has a long, wedge-shaped tail and a uniform wing colouration, lacking any white wing bar."],
		
		["ringedturtledove.jpg", "<a href=\"http://www.birds.cornell.edu/AllAboutBirds/BirdGuide/Ringed_Turtle-Dove.html\" target=\"_blank\"><img src=\"http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif\" border=\"0\" align=\"right\" onMouseover=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logoclick.gif'\"  onMouseout=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif'\"></a>Ringed Turtle-dove", "<i>Streptopelia risoria </i><br>Length 30cm (12\"). Introduced to Grand Cayman and Cayman Brac. A cross between the wild species of Ringneck Doves, <i>S.decaocto</i> and <i>S.roesogrisea</i>. They probably originated in northeast Africa and Arabia, and have been raised as pets for over 2,000 years. These are the doves of the Bible. Small feral populations are associated with urban areas."],
		
		["pigeon_rockdove.jpg", "<a href=\"http://www.birds.cornell.edu/AllAboutBirds/BirdGuide/Rock_Pigeon.html\" target=\"_blank\"><img src=\"http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif\" border=\"0\" align=\"right\" onMouseover=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logoclick.gif'\"  onMouseout=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif'\"></a>Rock Pigeon (Rock Dove)", "<i>Columba livia	</i><br>Length 33-36cm (13-14\"). Domestic pigeon, introduced to Grand Cayman and Cayman Brac, where small feral populations are now established. Unusual visitor (vagrant) to Little Cayman. Associated with urban environments."],
		
		["pigeon_whitecrownedpigeon.jpg", "<a href=\"http://www.birds.cornell.edu/AllAboutBirds/BirdGuide/White-crowned_Pigeon.html\" target=\"_blank\"><img src=\"http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif\" border=\"0\" align=\"right\" onMouseover=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logoclick.gif'\"  onMouseout=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif'\"></a>White-crowned Pigeon (Bald Pate)", "<i>Patagioenas leucocephala 	</i><br>Length 33-36cm (13-14\"). A resident breeder and passage migrant in the Cayman Islands. Prefers mangrove, inland and coastal woodland, and shrubland; feeding on Pepper Cinnamon, Red Birch, Fig and Black Mangrove. This is a highly mobile species, capable of flying between the three Cayman islands, and other islands in the region. Historically, flocks numbering in their thousands were not uncommon in Grand Cayman, however numbers fell significantly during the 1980s, as a result of habitat loss and pressure from over-hunting. Considered a \"game bird\" under the outdated Animals Law, the White-crowned pigeon became a fully protected species under the National Conservation Law."],
		
		["pigeon_whitewingeddove.jpg", "<a href=\"http://www.birds.cornell.edu/AllAboutBirds/BirdGuide/White-winged_Dove.html\" target=\"_blank\"><img src=\"http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif\" border=\"0\" align=\"right\" onMouseover=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logoclick.gif'\"  onMouseout=\"this.src='http://www.caymanbiodiversity.com/wp-content/themes/baplarge/logocornell.gif'\"></a>White-winged Dove (White Wing)", "<i>Zenaida asiatica	</i><br>Length 28-30cm (11-12\"). The White-winged dove is rapidly expanding its range; colonising Cuba in 1923, and the Cayman Islands in 1935. Locally, it occurs as a passage migrant and year-round resident, breeding in all three islands. Its ability to breed in all months, combined with an affiliation for urban areas and other disturbed habitats, has contributed to the White-winged dove becoming one of our commonest and most visible birds. Competes aggressively for habitat and resources with our local Zenaida Dove."],
		
		["pigeon_zenaidadove.jpg", "Zenaida Dove (Pea Dove, Big Dove)", "<i>Zenaida aurita		</i><br>Length 25-28cm (10-11\"). Increasingly uncommon breeding resident in the Cayman Islands. Currently under pressure from natural habitat loss and aggressive colonisation of urban habitat by the similar White-winged Dove. Prefers coastal woodland and shrubland, mixed woodland and buttonwood swamps. Also to be seen in urban areas. Not to be confused with White-winged Dove."]
		

				
	],

	fadeContainerId : "jas-container",

	imageContainerId : "jas-image",

	imageTextContainerId : "jas-image-text",

	previousLinkId : "previous-image",

	nextLinkId : "next-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 : 5000, // Milliseconds

	

	// JaS function parameters

	allImages : null,

	currentImages : null,

	fadeContainer : null,

	imageContainer : null,

	imageTextContainer : null,

	previousLink : null,

	nextLink : 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.previousLink = $(this.previousLinkId);

				this.previousLink.onclick = JaS.previousLinkClick;

				this.nextLink = $(this.nextLinkId);

				this.nextLink.onclick = JaS.nextLinkClick;

				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;

			}

		}

	},

	

	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();

	},

	

	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];

			//ahmad edit to render description

			if(typeof(this.currentImages[this.imageIndex][2]) == "undefined"){
                this.currentImages[this.imageIndex][2] = "";
            }

			this.imageText = "<b>" + this.currentImages[this.imageIndex][1] + "</b><br><br>" + this.currentImages[this.imageIndex][2];

			if(this.useFadingOut && (this.slideshowIsPlaying && this.useFadeForSlideshow) || (!this.slideshowIsPlaying && this.useFadeWhenNotSlideshow) && (this.useFadeAtInitialLoad && this.isInitialLoad || !this.isInitialLoad)){

				this.fadeOut();

			}

			else{

				this.displayImageCount();

				this.imageContainer.setAttribute("src", (this.imagePath + this.imageSource));

				this.setImageText();

				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();

		}

	},

	

	displayImageCount : function (){

    	if(this.imageCounter){

			this.imageCounter.innerHTML = (((this.currentImages.length > 0)? this.imageIndex : -1) + 1) + " / " + 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();

		}

	},

	

	previousImage : function (){

		if(this.imageIndex > 0){

			--this.imageIndex;

			this.setImage();

		}         

	},



	setImageText : function (){

    	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.displayImageCount();

		this.imageContainer.setAttribute("src", (this.imagePath + this.imageSource));

		this.setImageText();

		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]);

			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];

				oRegExp = new RegExp(strCurrentTag, "i");

				if(this.tags.toString().search(oRegExp) == -1){

					this.tags.push(strCurrentTag);

				}

            }

        }

		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;

	}

}

// ---


