var imageviewerEngine = function()
{
	/*
	 author:Giuseppe
	 date: 20/08/2007
	 notes:
	 This function is to fade in and out the images and linkboxes.
	 
	 Requires jQuery.

	 There's a horrible hack which requires a specific variable name when creating a "new imageviewerEngine()",
	 see the last line of "this.init()" as it stands.
	 */
	this.name = 'imageviewerEngine';
	this.currentIndex = 0;
	//initializing to [] so later on the a.length function will not fail if either the images or linkboxes are not available
	this.images = [];
	this.linkboxes = [];
	this.pairs = [];
	this.fadeClock = null;
	this.linkboxMaxHeight = 0;
	
	/*this.init = function(interval)
	{
		this.interval = interval;
		for (var i = 1; i < this.images.length; i++) 
		{
			this.initElement(this.images[i]);
		}
		for (var i = 1; i < this.linkboxes.length; i++) 
		{
			this.initElement(this.linkboxes[i]);
		}
		this.associateImagesToLinkboxes();
		this.currentIndex = 0;
		this.fadeClock = setInterval('imgEngine.fadeEngine()', this.interval);
	};*/
	this.init =function (interval, viewerName) {
        this.interval = interval;
        viewerName = viewerName ? viewerName : 'imgEngine';
        for (var i = 1; i < this.images.length; i++) {
            this.initElement(this.images[i]);
        }
        for (var i = 1; i < this.linkboxes.length; i++) {
            this.initElement(this.linkboxes[i]);
        }
        this.associateImagesToLinkboxes();
        this.currentIndex = 0;
        this.fadeClock = setInterval(viewerName+".fadeEngine()", this.interval);
    };
	
	this.doFade = function(fromIndex, toIndex)
	{
		var pairout = this.pairs[fromIndex];
		var pairin = this.pairs[toIndex];
		
		if (pairout.image != pairin.image) 
		{
			this.fadeOut(pairout.image);
		}
		if (pairout.linkbox != pairin.linkbox) 
		{
			this.fadeOut(pairout.linkbox);
		}
		
		this.fadeIn(pairin.image);
		this.fadeIn(pairin.linkbox);
		
		this.currentIndex = toIndex;
	};
	
	this.fadeEngine = function()
	{
		var outIndex = this.currentIndex;
		var inIndex = (this.currentIndex === undefined) ? 0 : (++(this.currentIndex) >= this.pairs.length) ? 0 : this.currentIndex;
		
		this.doFade(outIndex, inIndex);
	};
	
	
	this.jumpToPair = function(toIndex, pause)
	{
		if (pause) 
		{
			this.pauseEngine();
		}
		this.doFade(this.currentIndex, toIndex);
	};
	
	this.pauseEngine = function()
	{
		clearInterval(this.fadeClock);
	};
	
	this.unpauseEngine = function()
	{
		this.fadeClock = setInterval('imgEngine.fadeEngine()', this.interval);
	};
	
	this.getLinkboxMaxHeight = function()
	{
		for (var i = 0; i < this.linkboxes.length; i++) 
		{
			this.linkboxMaxHeight = Math.max(this.linkboxMaxHeight, this.linkboxes[i].offsetHeight);
		}
		return this.linkboxMaxHeight;
	};
	
	this.associateImagesToLinkboxes = function()
	{
		var maxindex = this.images.length > this.linkboxes.length ? this.images.length : this.linkboxes.length;
		
		for (var i = 0; i < maxindex; i++) 
		{
			var o = {};
			o.image = (this.images[i]) ? this.images[i] : this.images.length > 0 ? this.images[this.images.length - 1] : null;
			o.linkbox = (this.linkboxes[i]) ? this.linkboxes[i] : this.linkboxes.length > 0 ? this.linkboxes[this.linkboxes.length - 1] : null;
			this.pairs.push(o);
		}
	};
	
	this.initElement = function(el)
	{
		$(el).hide();
	};
	
	this.fadeIn = function(el)
	{
		$(el).fadeIn(3000);
	};
	
	this.fadeOut = function(el)
	{
		$(el).fadeOut(3000);
	};
};
