var fadeInSlideShow_descpanel={
	controls: [['/images/slideshow_close.png',7,7], ['/images/slideshow_restore.png',10,11], ['/images/slideshow_loading.gif',54,55]],
	fontStyle: 'normal 11px Arial', 
	slideSpeed: 200
}

//--------------------
jQuery.noConflict()
//--------------------

function fadeInSlideShow(settingArguments)
{
	this.settings = settingArguments;
	settingArguments = null;
	var settings = this.settings;
	settings.fadeDuration = settings.fadeDuration ? parseInt(settings.fadeDuration) : 500;
	settings.curImage = (settings.persist)? fadeInSlideShow.routines.getCookie("gallery-"+settings.wrapperDivId) : 0;
	settings.curImage = settings.curImage || 0;
	settings.curStep  = 0;
	settings.totalSteps = settings.images.length * (settings.displayMode.cycles > 0 ? settings.displayMode.cycles : Infinity);
	settings.fgLayer    = 0;
	settings.bgLayer    = 1;
	settings.onInit     = settings.onInit  || function(){};
	settings.onslide    = settings.onslide || function(){};
	
	// Shuffle images if necessary
	if (settings.displayMode.randomize) settings.images.sort(function() {return 0.5 - Math.random()});
	
	var preloadImages    = [];
	settings.longestDesc = "";
	for (var idx = 0; idx < settings.images.length; idx++)
	{
		preloadImages[idx]     = new Image();
		preloadImages[idx].src = settings.images[idx][0];
		if (settings.images[idx][3] && settings.images[idx][3].length > settings.longestDesc.length)
			settings.longestDesc = settings.images[idx][3];
	}
	
	var closeBtn      = fadeInSlideShow_descpanel.controls[0];
	settings.closeBtn = (settings.displayDescr == "always") ? '<img class="close" src="' + closeBtn[0] + '" style="float:right;cursor:hand;cursor:pointer;width:' + closeBtn[1] + 'px;height:' + closeBtn[2] + 'px;margin-left:2px" title="Hide Description" />' : '';
	var slideShow     = this;
	
	// Fired when DOM of page is ready
	jQuery(document).ready(function($)
	{
		var settings = slideShow.settings;
		var fullHTML = fadeInSlideShow.routines.getFullHTML(settings.images)
		settings.$wrapperdiv = $('#'+settings.wrapperDivId).css({position:'relative', visibility:'visible', background:'white', overflow:'hidden', width:settings.dimensions[0], height:settings.dimensions[1]}).empty()
		if (settings.$wrapperdiv.length==0)
		{
			alert("Error: <div> with id=\""+settings.wrapperDivId+"\" not found on page.")
			return;
		}
		settings.$galleryLayers = $('<div class="gallerylayer"></div><div class="gallerylayer"></div>')
			.css({position:'absolute', left:0, top:0, width:'100%', height:'100%', background:'white'})
			.appendTo(settings.$wrapperdiv);
		var $loadingImg = $('<img src="' + fadeInSlideShow_descpanel.controls[2][0] + '" style="position:absolute;width:' + fadeInSlideShow_descpanel.controls[2][1] + ';height:' + fadeInSlideShow_descpanel.controls[2][2] + '" />')
			.css({left:settings.dimensions[0] / 2 - fadeInSlideShow_descpanel.controls[2][1] / 2, top:settings.dimensions[1] / 2 - fadeInSlideShow_descpanel.controls[2][2]})
			.appendTo(settings.$wrapperdiv);
		var $curImage = settings.$galleryLayers.html(fullHTML).find('img').hide().eq(settings.curImage);
		if (settings.longestDesc != "" && settings.displayDescr != "none")
		{
			fadeInSlideShow.routines.addDescrPanel($, settings);
			if (settings.displayDescr == "always")
			{
				settings.$descPanel.css({top:settings.dimensions[1] - settings.panelHeight})
				settings.$descInner.click(function(e)
				{
					if (e.target.className=="close")
					{
						slideShow.showHideDescrPanel('hide')
					}
				})
				settings.$restoreBtn.click(function(e)
				{
					slideShow.showHideDescrPanel('show')
					$(this).css({visibility:'hidden'})
				})
			}
			else if (settings.displayDescr=="ondemand")
			{
				settings.$wrapperdiv.bind('mouseenter', function(){slideShow.showHideDescrPanel('show')})
				settings.$wrapperdiv.bind('mouseleave', function(){slideShow.showHideDescrPanel('hide')})
			}
		}
		settings.$wrapperdiv.bind('mouseenter', function(){settings.ismouseover=true});
		settings.$wrapperdiv.bind('mouseleave', function(){settings.ismouseover=false});
		if ($curImage.get(0).complete)
		{
			$loadingImg.hide();
			slideShow.paginateInit($);
			slideShow.showSlide(settings.curImage);
		}
		else
		{
			$loadingImg.hide();
			slideShow.paginateInit($);
			$curImage.bind('load', function(){ slideShow.showSlide(settings.curImage)} );
		}
		settings.onInit.call(slideShow);
		$(window).bind('unload', function()
		{
			if (slideShow.settings.persist) fadeInSlideShow.routines.setCookie("slideshow-"+settings.wrapperDivId, settings.curImage)
			jQuery.each(slideShow.settings, function(k)
			{
				if (slideShow.settings[k] instanceof Array)
				{
					for (var i=0; i<slideShow.settings[k].length; i++)
					{
						if (slideShow.settings[k][i].tagName == "DIV")
							slideShow.settings[k][i].innerHTML=null
						slideShow.settings[k][i]=null
					}
				}
			})
			slideShow=slideShow.settings=null
		})
	})
}

// fadeInSlideShow class definition
fadeInSlideShow.prototype = 
{
	navigate:function(keyword)
	{
		var settings = this.settings
		clearTimeout(settings.playTimer)
		if (settings.displayMode.type == "auto")
		{
			settings.displayMode.type = "manual";
			settings.displayMode.wraparound = true;
		}
		if (!isNaN(parseInt(keyword)))
		{
			this.showSlide(parseInt(keyword));
		}
		else if (/(prev)|(next)/i.test(keyword))
		{
			this.showSlide(keyword.toLowerCase());
		}
	},

	showSlide:function(keyword)
	{
		var slideShow = this
		var settings  = slideShow.settings
		if (settings.displayMode.type == "auto" && settings.ismouseover && settings.curStep <= settings.totalSteps)
		{
			settings.playTimer = setTimeout(function(){slideShow.showSlide('next')}, settings.displayMode.pause);
			return;
		}
		var totalImages = settings.images.length;
		var imgIndex    = (keyword=="next") ? (settings.curImage < totalImages-1 ? settings.curImage + 1 : 0)
			                            : (keyword=="prev") ? (settings.curImage>0? settings.curImage-1 : totalImages-1)
									: Math.min(keyword, totalImages-1);
		var $slideImg   = settings.$galleryLayers.eq(settings.bgLayer).find('img').hide().eq(imgIndex).show();
		var imgDims     = [$slideImg.width(), $slideImg.height()]
		$slideImg.css({marginLeft: (imgDims[0] > 0 && imgDims[0] < settings.dimensions[0]) ? settings.dimensions[0] / 2 - imgDims[0] / 2 : 0});
		$slideImg.css({marginTop:  (imgDims[1] > 0 && imgDims[1] < settings.dimensions[1]) ? settings.dimensions[1] / 2 - imgDims[1] / 2 : 0});
		if (settings.displayDescr == "peekaboo" && settings.longestDesc!="")
		{
			clearTimeout(settings.hideDescrTimer);
			slideShow.showHideDescrPanel('hide', 0);
		}
		settings.$galleryLayers.eq(settings.bgLayer).css({zIndex:1000, opacity:0})
			.stop().css({opacity:0}).animate({opacity:1}, settings.fadeDuration, function()
			{
				clearTimeout(settings.playTimer)
				try{
					settings.onslide.call(slideShow, settings.$galleryLayers.eq(settings.fgLayer).get(0), settings.curImage)
				}catch(e){
					alert("Fade In Slideshow error: An error has occured somwhere in your code attached to the \"onslide\" event: "+e)
				}
				if (settings.displayDescr=="peekaboo" && settings.longestDesc!=""){
					slideShow.showHideDescrPanel('show')
					settings.hideDescrTimer=setTimeout(function(){slideShow.showHideDescrPanel('hide')}, settings.displayMode.pause-fadeInSlideShow_descpanel.slideSpeed)
				}	
				settings.curStep+=1
				if (settings.displayMode.type=="auto"){
					if (settings.curStep<=settings.totalSteps || settings.displayMode.cycles==0)
						settings.playTimer = setTimeout(function(){slideShow.showSlide('next')}, settings.displayMode.pause)
				}
			});
		settings.$galleryLayers.eq(settings.fgLayer).css({zIndex:999});
		settings.fgLayer  = settings.bgLayer
		settings.bgLayer  = (settings.bgLayer==0) ? 1 : 0
		settings.curImage = imgIndex;
		
		if (settings.$descPanel)
		{
			settings.$descPanel.css({visibility:(settings.images[imgIndex][3])? 'visible' : 'hidden'});
			if (settings.images[imgIndex][3])
				settings.$descInner.empty().html(settings.closeBtn + settings.images[imgIndex][3]);
		}
		
		if (settings.displayMode.type == "manual" && !settings.displayMode.wraparound)
		{
			this.paginateControl();
		}
		
		if (settings.$status) settings.$status.html((settings.curImage + 1) + "/" + totalImages);
	},

	showHideDescrPanel:function(state, animationDuration)
	{
		var settings = this.settings
		var endPoint = (state=="show") ? settings.dimensions[1] - settings.panelHeight : this.settings.dimensions[1]
		settings.$descPanel.stop().animate({top:endPoint}, (typeof animationDuration != "undefined" ? animationDuration : fadeInSlideShow_descpanel.slideSpeed), function(){
			if (settings.displayDescr == "always" && state == "hide")
				settings.$restoreBtn.css({visibility:'visible'});
		})
	},

	paginateInit:function($)
	{
		var slideShow = this
		var settings  = this.settings
		if (settings.toggleDivId)
		{
			settings.$toggleDiv = $("#" + settings.toggleDivId)
			settings.$prev = settings.$toggleDiv.find('.prev').data('action', 'prev')
			settings.$next = settings.$toggleDiv.find('.next').data('action', 'next')
			settings.$prev.add(settings.$next).click(function(e)
			{
				var $target = $(this);
				slideShow.navigate($target.data('action'));
				e.preventDefault();
			})
			settings.$status=settings.$toggleDiv.find('.status');
		}
	},

	paginateControl:function()
	{
		var settings = this.settings
		settings.$prev.css({opacity:(settings.curImage == 0)? 0.4 : 1}).data('action', (settings.curImage==0)? 'none' : 'prev');
		settings.$next.css({opacity:(settings.curImage == settings.images.length - 1) ? 0.4 : 1}).data('action', (settings.curImage==settings.images.length-1)? 'none' : 'next');
		
		if (document.documentMode == 8) // IE8 workaround
		{
			settings.$prev.find('img:eq(0)').css({opacity:(settings.curImage==0)? 0.4 : 1})
			settings.$next.find('img:eq(0)').css({opacity:(settings.curImage==settings.images.length-1)? 0.4 : 1})
		}
	}
}

// fadeInSlideShow functions
fadeInSlideShow.routines = 
{
	getSlideHTML:function(imgElement)
	{
		var layerHTML = (imgElement[1]) ? '<a href="'+imgElement[1]+'" target="'+imgElement[2]+'">\n' : '';
		layerHTML += '<img src="' + imgElement[0] + '" style="border-width:0;" />\n';
		layerHTML += (imgElement[1]) ? '</a>\n' : '';
		return layerHTML
	},

	getFullHTML:function(images)
	{
		var preloadHTML = ''
		for (var i = 0; i < images.length; i++) preloadHTML += this.getSlideHTML(images[i])
		return preloadHTML;
	},

	addDescrPanel:function($, settings)
	{
		settings.$descPanel = $('<div class="fadein_slide_descr_div"></div>')
			.css({position:'absolute', visibility:'hidden', width:'100%', left:0, top:settings.dimensions[1], font:fadeInSlideShow_descpanel.fontStyle, zIndex:'1001'})
			.appendTo(settings.$wrapperdiv);
		$('<div class="descpanelbg"></div><div class="descr_panel_fg"></div>')
			.css({position:'absolute', left:0, top:0, width:settings.$descPanel.width()-8, padding:'4px'})
			.eq(0).css({background:'black', opacity:0.7}).end()
			.eq(1).css({color:'white'}).html(settings.closeBtn + settings.longestDesc).end()
			.appendTo(settings.$descPanel);
		settings.$descInner  = settings.$descPanel.find('div.descr_panel_fg')
		settings.panelHeight = settings.$descInner.outerHeight();
		settings.$descPanel.css({height:settings.panelHeight}).find('div').css({height:'100%'});
		if (settings.displayDescr=="always")
		{
			settings.$restoreBtn=$('<img class="restore" title="Restore Description" src="' + fadeInSlideShow_descpanel.controls[1][0] +'" style="position:absolute;visibility:hidden;right:0;bottom:0;z-index:1002;width:'+fadeInSlideShow_descpanel.controls[1][1]+'px;height:'+fadeInSlideShow_descpanel.controls[1][2]+'px;cursor:pointer;cursor:hand" />')
				.appendTo(settings.$wrapperdiv);
		}
	},


	getCookie:function(Name)
	{ 
		var re = new RegExp(Name+"=[^;]+", "i");
		if (document.cookie.match(re))
			return document.cookie.match(re)[0].split("=")[1];
		return null;
	},

	setCookie:function(name, value)
	{
		document.cookie = name + "=" + value + ";path=/";
	}
}
