/*
    Author:    Philipp Jung (mail (aat) philipp-jung. net)
    Published: 20.09.2008

    This file is part of The Fadinggallery-Javascript-Software.

    The Fadinggallery-Javascript-Software is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    The Fadinggallery-Javascrip-Software is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with The Fadinggallery-Javascript-Software.  If not, see <http://www.gnu.org/licenses/>.
*/

function SwitchVisibility()
{
	var debugmode=false;
	var interval = null;
	var activeImages = new Object(); // Pseudo-hashtable

	this.addElement=function(id, mode)
	{
		if (debugmode) { debug('addElement'); }
		this.addElementWithCallback(id, mode, "", true);
	}

	this.addElementStyleDisplay=function(id, mode, changeStyleDisplay)
	{
		if (debugmode) { debug('addElementStyleDisplay'); }
		this.addElementWithCallback(id, mode, "", changeStyleDisplay);
	}

	this.addElementWithCallback=function(id, mode, callback, changeStyleDisplay)
	{
		if (debugmode) { debug("addElementWithCallback(id: " + id + ", mode: " + mode + ", callback: " + ((callback == "")?"no":"yes") + ", changeStyleDisplay: " + changeStyleDisplay + ")"); }

		if (mode=="show" || mode=="hide")
		{
			// Only add entry if it is not defined or currently in a different mode
			if (activeImages[id] == 'undefined' || activeImages[id] == null || activeImages[id][0] != mode)
			{
				var element = document.getElementById(id);
				if (element != null)
				{
					if (mode=="show") { opacity=0; }
					else if (mode=="hide") { opacity=100; }
					setOpacity(element, opacity, changeStyleDisplay);
					element.style.visibility='visible';
					if (changeStyleDisplay) { element.style.display=''; }
					activeImages[id] = new Array(mode, opacity, callback, changeStyleDisplay);

					if (interval == null)
					{
						interval = setInterval(switchVisibility.handleInterval, 20);
					}
				}
			}
		}
	}

	this.handleInterval=function()
	{
		if (debugmode) { debug('handleInterval'); }
		
		var activeImageExist=false;
		for (var id in activeImages)
		{
			var isActive=false;
			var changeOpacityBy = 0;
			var callback="";
			var changeStyleDisplay=false;
			if (activeImages[id][0] == "show")
			{
				isActive=true;
				changeStyleDisplay = activeImages[id][3];
				if (activeImages[id][1] <= 90)
				{
					changeOpacityBy = 10;
				}
				else
				{
					// Finished
					activeImages[id][0] = ""; // reset mode
					callback=activeImages[id][2];
				}
			}
			else if (activeImages[id][0] == "hide")
			{
				isActive=true;
				changeStyleDisplay = activeImages[id][3];
				if (activeImages[id][1] >= 10)
				{
					changeOpacityBy = -10;
				}
				else
				{
					// Finished
					activeImages[id][0] = ""; // reset mode
					callback=activeImages[id][2];
				}
			}

			if (isActive)
			{
				activeImages[id][1] += changeOpacityBy;
				var element=document.getElementById(id);
				setOpacity(element, activeImages[id][1], changeStyleDisplay);
				activeImageExist=true;
				if (callback != "" && callback != "undefined" && callback != null) { callback(); }
			}
		}

		if (! activeImageExist)
		{
			clearInterval(interval);
			interval=null;
			activeImages = new Object();
		}
	}

	var setOpacity=function(element, value, changeStyleDisplay)
	{
		if (debugmode) { debug('setOpacity: ' + element + ' value: ' + value); }

		// Mozilla & Co
		if (window.sidebar)
		{
			value=value/100; // 0.5 statt 50%
			element.style.MozOpacity=value;
		}
		// IE
		else if (document.all)
		{
			element.style.filter = 'alpha(opacity=' + value + ');';
		}
		// CSS3
		else
		{
			value=value/100; // 0.5 statt 50%
			element.style.opacity=value;
		}

		if (value <= 0) { element.style.visibility="hidden"; }
		if (changeStyleDisplay && value <= 0) { element.style.display="none"; }
	}

	var debug=function(text)
	{
		document.getElementsByTagName('body')[0].appendChild(document.createTextNode(text + "; "));
		document.getElementsByTagName('body')[0].appendChild(document.createElement("br"));
	}
}
