var accordion = function()
{
	var timer = sp = 5;
	var inAction = false;
	
	function slider(containerIdParam)
	{
		this.containerId = containerIdParam; 
		this.arrayData = new Array();
	}
	
	slider.prototype.init = function(definitionListParam, itemOpenedParam, itemOpenedClassParam)
	{
		var definitionList;
		var definitionTermArray;
		var definitionDataArray;
		var arrayLength;
		var i; 
		
		definitionList = document.getElementById(definitionListParam); 
		
		this.itemOpenedClass = itemOpenedClassParam? itemOpenedClassParam : '';
		
		definitionTermArray = definitionList.getElementsByTagName('dt'); 
		definitionDataArray = definitionList.getElementsByTagName('dd'); 
		
		this.arrayLength = definitionTermArray.length;
		for(i = 0; i < this.arrayLength; i++)
		{
			var definitionTerm = definitionTermArray[i]; 
			this.arrayData[i] = definitionTerm; 
			definitionTerm.onmouseover = new Function(this.containerId + '.behaviour(this)'); 
			if(itemOpenedParam == i)
			{
				definitionTerm.className = this.itemOpenedClass;
			}
		}
		
		arrayLength = definitionDataArray.length;
		for(i = 0; i < arrayLength; i++)
		{
			var definitionTerm = definitionDataArray[i]; 
			definitionTerm.definitionTermHeight = definitionTerm.offsetHeight; 
			if(itemOpenedParam != i)
			{
				definitionTerm.style.height = 0; 
				definitionTerm.style.display = 'none';
			}
		}
	}
	
	slider.prototype.behaviour = function(definitionTermParam)
	{
		if(definitionTermParam.className != this.itemOpenedClass && !inAction)
		{
			inAction = true;
			
			for(var i = 0; i < this.arrayLength; i++)
			{
				var definitionTerm = this.arrayData[i];
				var definitionTermSibling = definitionTerm.nextSibling; 
				
				definitionTermSibling = definitionTermSibling.nodeType != 1? definitionTermSibling.nextSibling : definitionTermSibling; 
				
				clearInterval(definitionTermSibling.timer);
				
				if(definitionTerm == definitionTermParam && definitionTermSibling.style.display == 'none')
				{	
					definitionTermSibling.style.display = ''; 
					setupTimer(definitionTermSibling, 1); 
					definitionTerm.className = this.itemOpenedClass;
				}
				else if(definitionTermSibling.style.display == '')
				{
					setupTimer(definitionTermSibling, -1); 
					definitionTerm.className = '';
				}
			}
		}
	}
	
	function setupTimer(definitionTermSibling, value)
	{
		definitionTermSibling.timer = setInterval(function() { slide(definitionTermSibling, value) }, timer);
	}
	
	function slide(definitionTermSibling, value)
	{
		var currentHeight = definitionTermSibling.offsetHeight;
		var finalHeight = definitionTermSibling.definitionTermHeight;
		var d = value == 1? finalHeight - currentHeight : currentHeight; 
		
		definitionTermSibling.style.height = currentHeight + (Math.ceil(d / sp) * value) + 'px';
		if(!isNaN(currentHeight / finalHeight))
		{
			definitionTermSibling.style.opacity = currentHeight / finalHeight; 
			definitionTermSibling.style.filter= 'alpha(opacity=' + currentHeight * 100 / finalHeight + ')';
		}
		
		if(value == 1 && currentHeight >= finalHeight)
		{
			clearInterval(definitionTermSibling.timer);
			
			inAction = false;
		}
		else if(value != 1 && currentHeight == 1)
		{
			definitionTermSibling.style.display = 'none'; 
			clearInterval(definitionTermSibling.timer);
			
			inAction = false;
		}
	}
	
	return{slider : slider}
}();
