// ---
/*
	JaS is developed by Robert Nyman, http://www.robertnyman.com
	For more information, please see http://www.robertnyman.com/jas
	
	Insert link: <a target=_blank href='http://myurl.dk'>Link text</a>
	Note: Use single quotes (') around the url to avoid conflicts with double quotes(") in script filelist format
*/
var JaS = {
	// Customization parameters
	imagePath : "",
	images : [	
["intro_dummy.gif","Belastningen ved at være arbejdsløs består ikke kun i mangel på arbejde. Omgivelsernes hån og ringeagt er måske det allerværste. Der er kun ringe forståelse for det faktum, at ledige stillinger ofte slet ikke henvender sig til personer med dine kvalifikationer. Er man ufaglært, er det en ringe trøst, at der er ledige stillinger som ingeniør, sygeplejerske, controller eller speciallæge... "],
["form_welcome.gif","Ny velkomstform som er tilføjet ved udgivelsen af version 7.1 for at give mig en mulighed for at viderebringe vigtige meddelelser til brugere. I dette tilfælde for eksempel at det er nødvendigt, at genoprette alle brugere efter denne opdatering. Årsagen er forskellige ændringer i koden i forbindelse med implementering af den automatiske jobsøgnings funktion."],

["form_bekraeft_active.gif","Hoved-vinduet for CheckJobnet med forskellige oplysninger om status for bekræft og jobsøgning funktionerne. Bemærk at auto-bekræft er aktiv mens den automatiske jobsøgning er stoppet. Den lille CJ ikon nederst til højre på formen anvendes til af skjule brugerfladen, uden af lukke programmet"],
["form_both_active.gif","Hoved-vinduet for CheckJobnet med begge funktioner aktive. Tidspunktet for sidste bekræft og jobsøgning kan vises i øverste linie af hver sektion. Tidspunktet for næste bekræft og jobsøgning vises på linien nedenunder. Læg mærke til, at tidspunktet for næste begivenhed varierer afhængigt af et tilfældigt antal minutter, der er lagt til eller trukket fra."],

/*["form_checkjobnet_psw.gif","Hoved-vinduet for CheckJobnet viser her med en P-ikon, at en eller flere brugeres adgangskode er nær ved at udløbe. Ifølge oplysninger på Arbejdsmarkeds-<br>styrelsens hjemmeside skal du skifte din adgangskode til jobnet.dk hver tredie måned."],
["form_checkjobnet_aktiv.gif","Hoved-vinduet for CheckJobnet når overvågningen er aktiv. Bemærk den lille CJ-ikon nederst til højre, som du kan anvende til at skjule hoved-vinduet <i>uden</i> at standse overvågningen. Slukker du for din pc, mens overvågningen er aktiv, starter CheckJobnet automatisk, når du tænder din pc igen. Besøg på jobnet.dk kan naturligvis <i>ikke</i> gennemføres, hvis din pc er slukket."],
["form_checkjobnet_aktiv.gif","Hoved-vinduet for CheckJobnet når overvågningen er aktiv. Bemærk den lille CJ-ikon nederst til højre, som du kan anvende til at skjule hoved-vinduet <i>uden</i> at standse overvågningen. Slukker du for din pc, mens overvågningen er aktiv, starter CheckJobnet automatisk, når du tænder din pc igen. Besøg på jobnet.dk kan naturligvis <i>ikke</i> gennemføres, hvis din pc er slukket."],
["form_cjminiform.gif","Når CheckJobnet er aktiv og kører i baggrunden, vil du se en lille form/ikon i øverste venstre hjørne af din computerskærm. Klikker du på notesbog-ikonen åbner logfilen, mens et klik andetsteds på miniformen åbner CheckJobnets hoved-form."],*/

["menu_program.gif","Program-menu med adgang til brugeradministration, opdateringer og skjul og afbryd programmet. Slukker du for din pc, mens bekræft og/eller jobsøgning er aktive, starter CheckJobnet automatisk, når du tænder din pc igen. Besøg på jobnet.dk kan naturligvis <i>ikke</i> gennemføres, hvis din pc er slukket."],
["menu_bekraeft.gif","Bekræft-menu med adgang til test, straks-bekræft, start af den automatiske bekræftfunktion samt indstillinger for bekræftfunktionen. Du kan ikke skjule brugerfladen, når overvågningen er stoppet. Derfor er den lille CJ-ikon på hoved-vinduet skjult, indtil du starter overvågningen."],
["menu_soeg_job.gif","Søg Job-menuen indeholder de samme menupunkter som bekræft menuen. Bemærk at jobsøgning funktionen er afbrudt, når intervallet under Indstillinger sættes til 0 dage."],
["menu_logfil.gif","Logfil-menuen indeholder menupunkter til logfilerne for bekræft og jobsøgning funktionerne. En ny, tom logfil oprettes med menupunktet Start Ny Logfil. Den gamle logfil gemmes automatisk i mappen $DATA$.checkjobnet på dit C-drev."],
["menu_hjaelp.gif","Hjælp-menuen indeholder en række hjælpemuligheder. Læg specielt mærke til menupunktet: Revisionshistorie, som beskriver rettelser til programmet."],
["menu_debat.gif","Debat-menuen indeholder links til forskellige websites, der er relevante for ledige."],
["form_download.gif","Hvis din kopi af CheckJobnet er forældet, kan du her hente den nyeste version ved at klikke på Hent og Installér Update."],

["form_useradmin.gif","Her kan du oprette nye brugere samt redigere listen der indeholder aktive brugere. Husk at klikke på Gem Data når du har indtastet brugeroplysningerne."],
["form_userlist.gif","Liste over aktive og inaktive brugere. Du kan tillige importere brugere fra en tab-afgrænset liste. Der kan oprette op til 100 brugere. Det er meget vigtigt, at brugernavn, adgangskode og email adresse for hver bruger er korrekt. Er oplysningerne forkerte, vil CheckJobnet forsøge at gennemføre besøget to gange. Derefter slettes brugeren fra CheckJobnet."],

["form_settings_confirm.gif","På Opsætning formen sættes intervallet for bekræft funktionen. Intervallet skifter automatisk mellem timer og dage. Husk at det valgte interval justeres med et tilfældigt antal minutter som lægges til eller trækkes fra det valgte interval. Du kan også her vælge, hvordan det vises på din skærm, om CheckJobnet er aktiv."],
["form_settings_search.gif","Opsætning formen indeholder også indstillingerne for jobsøgning funktionen. Du kan vælge at afsende 1-8 ansøgninger per gang med et interval mellem 1 og 7 dage. Også her justeres intervallet med et tilfældigt antal minutter. Der kan vælges mellem heltid, deltid eller alle stillinger. Sættes intervallængden til 0 er funktionen afbrudt. Du kan også her vælge, hvordan det vises på din skærm, om CheckJobnet er aktiv."],

["form_password.gif","Hvis din adgangskode er ved at udløbe, kan du ændre den ved at anvende denne form. Du kan finde både den gamle og den nye adgangskode i Logfilen. Husk at bruge den <i>nye kode</i>, hvis du senere vil logge ind på jobnet.dk manuelt."],

["form_internetsettings.gif","This form is intended for the expert user. In case the program is hosted on a different webserver it is necessary to alter the url's to the auxilliary files used by CheckJobnet. Please note that the change must be implemented for <i>each</i> user <i>after</i> the program is installed."],

["form_kalender.gif","En simpel kalender, som gør det lidt nemmere at holde rede på dine besøg på www.jobnet.dk. Den røde markering viser dags dato, mens den blågrå klat angiver tidspunktet for sidste besøg. Bemærk at tidspunktet for Sidste/Næste besøg gælder for <i>samtlige</i> brugere, du har oprettet."],
["msg_user_delete.gif","Hvis besøget på jobnet.dk <i>for den samme bruger</i> gentagende gange mislykkes, tyder det på, at brugernavn og/eller adgangskode er forkert. CheckJobnet sletter automatisk brugeren fra brugerlisten efter to forgæves forsøg på at logge på."],
["msg_psw_change.gif","Hvis du vil skifte din adgangskode på jobnet.dk fra CheckJobnet, vises denne advarsel <i>inden</i> adgangskoden bliver skiftet. Det er naturligvis en god ide at kontrollere, om den nye adgangskode er korrekt registreret i CheckJobnets brugerliste."],
["logfil.gif","Sådan ser Logfilen ud. Den indeholder for- og efternavn og dato for hvert besøg på www.jobnet.dk. Desuden findes dit CV-nummer, dine IP-adresser, det nøjagtige klokkeslet for besøget samt hvilke sider der er besøgt."],
["vejledning.gif","En opdateret, kortfattet vejledning til CheckJobnet. Læs også her sidste nyt om Arbejdsmarkedsstyrelsens seneste påfund. Du kan opdatere Vejledningen ved at genstarte CheckJobnet."],
["licensaftale.gif","Licensaftalen bør læses omhyggeligt <i>inden</i> programmet anvendes. Du bærer selv det fulde ansvar, hvis du benytter CheckJobnet til din kommunikation med jobnet.dk. Du kan opdatere Licensaftalen ved at genstarte CheckJobnet."],
["tortur.jpg","Dette middelalderlige torturinstrument bliver vel Claus Hjorts næste middel til at stresse ledige. Efter nogle uger i gabestokken er de nok så stressede, at de overgår til sygedagpenge - og så er problemet løst: De er ikke ledige længere..."],
["chf_manipulation.gif","CheckJobnets forsidebillede er en computermanipulation. Claus Hjort har kun ét ansigt, når han viser sig offentligt. Jeg håber, at billedet vil glæde en mester i manipulation som Claus Hjort. Det offentlige billede er hentet fra Folketingets hjemmeside."],
["installation.jpg","Kort installationsvejledning - hvis du ikke gider læse hele teksten på CheckJobnet websitet."]
],
	fadewrapperId : "jas-wrapper",
	imagewrapperId : "jas-image",
	imageTextwrapperId : "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",
	thumbnailwrapperId: "jas-thumbnails",
	tagswrapperId: "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	
	
	// JaS function parameters
	allImages : null,
	currentImages : null,
	fadewrapper : null,
	imagewrapper : null,
	imageTextwrapper : null,
	previousLink : null,
	nextLink : null,
	dimBackgroundOverlay : null,
	dimBackgroundLink : null,
	noDimBackgroundLink : null,
	dimmingActivated : false,
	imageCounter : null,
	startSlideShowLink : null,
	stopSlideShowLink : null,
	thumbnailwrapper : null,
	thumbnailCollection : [],
	currentThumbnailSelected : null,
	tagswrapper : 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.fadewrapper = $(this.fadewrapperId);
			this.imagewrapper = $(this.imagewrapperId);
			this.slideshowIsSupported = this.fadewrapper && this.imagewrapper;
			if(this.slideshowIsSupported){
				this.allImages = this.images;
				this.currentImages = this.images;
				if(this.useImageText){
					this.imageTextwrapper = $(this.imageTextwrapperId);
					if(!this.imageTextwrapper){
						this.useImageText = false;
					}
				}
				this.hasOpacitySupport = typeof this.fadewrapper.style.filter != "undefined" || typeof this.fadewrapper.style.opacity != "undefined";
				this.useMSFilter = typeof this.fadewrapper.style.filter != "undefined";
				this.useMSCurrentStyle = typeof this.fadewrapper.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.thumbnailwrapper = $(this.thumbnailwrapperId);
				if(this.useThumbnails && this.thumbnailwrapper){
					this.createThumbnails();
				}
				
				this.tagswrapper = $(this.tagswrapperId);
				if(this.useTags && this.tagswrapper){
					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.imagewrapper.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.displayImageCount();
				this.imagewrapper.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.imagewrapper.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 (){
		this.imageTextwrapper.setAttribute("alt", this.imageText);
    	if(this.useImageText && typeof this.imageText == "string"){
			this.imageTextwrapper.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.imagewrapper.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.fadewrapper.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.fadeLevel * 100) + ")";
		}
		else{
			this.fadewrapper.style.opacity = this.fadeLevel;
		}
	},
	
	setFadeParams : function (bFadingIn, intStartLevel, intEndLevel){
		this.fadingIn = bFadingIn;
		this.fadeLevel = intStartLevel;
		this.fadeEndLevel = intEndLevel;
	},
	
	createThumbnails : function (){
		this.thumbnailwrapper.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]);	disables display of title on mouseOver event swr 20.0407
			oThumbnail.onclick = JaS.thumbnailClick;
			this.thumbnailCollection.push(oThumbnail);
			oListItem.appendChild(oThumbnail);
			oThumbnailsList.appendChild(oListItem);			
        }
		this.thumbnailwrapper.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.tagswrapper.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;
	}
}
// ---