function transform(elem, start, stop, step, accel, delay, callback1, callback2)
{
	start = (typeof start == 'undefined')? 0 : start;
	stop = (typeof stop == 'undefined')? 0 : stop;
	step = (typeof step == 'undefined')? 10 : step;
	delay = (typeof delay == 'undefined' || delay < 0)? 50 : delay;
	accel = (typeof delay == 'undefined')? 1 : accel;

	if (delay < 1) delay = 50;
	if (step == 0) step = 1;
	if (start < stop && step < 0) step = -step;
	else if (stop < start && step > 0) step = -step;

	if (Math.abs(step *accel) > 0.1) {
		step = step *accel;
	} else {
		accel = 1;
	}

	// Blendwert ändern
	if ((step > 0 && start <= stop)
		|| (step < 0 && start >= stop))
	{
		start += step;
		if (step > 0 && start > stop) start = stop;
		if (step < 0 && start < stop) start = stop;
	}

	// Erstes Callback aufrufen
	if (callback1) {
		callback1(elem, start);
	}

	if (start != stop) {
		window.setTimeout(function() { transform(elem, start, stop, step, accel, delay, callback1, callback2); } , delay);
	} else if (callback2) {
		callback2(elem);
	}
}

/* Setzt Initialwerte für das Slider-Element */

function initSlider()
{
	var sliderList;
	var sliderListWidth;
	var listElementCount = 3;
	var listElementWidth = 210;
	var listElementMargin = 22;

	sliderList = document.getElementById('slider').getElementsByTagName('ul')[0];
	if(sliderList)
	{
		listElementCount = sliderList.getElementsByTagName('li').length;

		sliderList.currentElementIndex = 0; // aktuelle Position in der Liste
		sliderList.elementWidth = listElementWidth + listElementMargin; // Breite eines Elements
		sliderList.elementCount = listElementCount; // Anzahl der Kindelemente (li), nicht nachträglich änderbar
		sliderList.shownElementCount = 3; // Anzahl gleichzeitig anzuzeigender Elemente

		sliderListWidth = listElementCount * (listElementWidth + listElementMargin);
		sliderList.style.width = String(sliderListWidth) + 'px';
	}
}

function slide(ev)
{
	var sliderButton;
	var sliderList;

	sliderList = document.getElementById('slider').getElementsByTagName('ul')[0];

	if(ev.target)
	{
		sliderButton = ev.target;
	}
	if(ev.srcElement)
	{
		sliderButton = ev.srcElement;
	}

	if(hasClass('previous', sliderButton.className))
	{
		if(sliderList.currentElementIndex > 0)
		{
			//nach links bewegen

			transform(
					sliderList,
					sliderList.currentElementIndex * sliderList.elementWidth,
					(sliderList.currentElementIndex - 1) * sliderList.elementWidth,
					60,
					0.92,
					50,
					function(elem, o)
					{
						sliderList.style['left'] = String(-1 * o) + 'px';
					}
				);
			sliderList.currentElementIndex -= 1;
		}
		else
		{
			//fake-animation links abspielen

			transform(
					sliderList,
					sliderList.currentElementIndex * sliderList.elementWidth,
					sliderList.currentElementIndex * sliderList.elementWidth - 24,
					20,
					0.92,
					50,
					function(elem, o)
					{
						sliderList.style['left'] = String(-1 * o) + 'px';
						transform(
							sliderList,
							sliderList.currentElementIndex * sliderList.elementWidth - 24,
							sliderList.currentElementIndex * sliderList.elementWidth,
							20,
							0.92,
							50,
							function(elem, o)
							{
								sliderList.style['left'] = String(-1 * o) + 'px';
								
							}
						);
					}
				);
		}
		
	}
	else if(hasClass('next', sliderButton.className))
	{
		if((sliderList.currentElementIndex + sliderList.shownElementCount) < sliderList.elementCount)
		{
			//nach rechts bewegen

			transform(
					sliderList,
					sliderList.currentElementIndex * sliderList.elementWidth,
					(sliderList.currentElementIndex + 1) * sliderList.elementWidth,
					60,
					0.92,
					50,
					function(elem, o)
					{
						sliderList.style['left'] = String(-1 * o) + 'px';
					}
				);
			sliderList.currentElementIndex += 1;
		}
		else
		{
			//fake-animation rechts abspielen

			transform(
					sliderList,
					sliderList.currentElementIndex * sliderList.elementWidth,
					sliderList.currentElementIndex * sliderList.elementWidth + 24,
					20,
					0.92,
					50,
					function(elem, o)
					{
						sliderList.style['left'] = String(-1 * o) + 'px';
						transform(
							sliderList,
							sliderList.currentElementIndex * sliderList.elementWidth + 24,
							sliderList.currentElementIndex * sliderList.elementWidth,
							20,
							0.92,
							50,
							function(elem, o)
							{
								sliderList.style['left'] = String(-1 * o) + 'px';
								
							}
						);
					}
				);
		}
	}
}

/* Initialisierungsfunktion setzt Eventhandler und div. Std-Werte */

function init()
{
	if (!document.getElementById('feature')) return;
	var sliderButtons = document.getElementById('feature').getElementsByTagName('a');

	if(document.addEventListener && sliderButtons)
	{
		for(var i = 0; i < sliderButtons.length; i++)
		{
			if(hasClass('slider', sliderButtons[i].className))
			{
				sliderButtons[i].addEventListener('click', slide, false);
			}
		}
	}
	if(document.attachEvent && sliderButtons)
	{
		for(var i = 0; i < sliderButtons.length; i++)
		{
			if(hasClass('slider', sliderButtons[i].className))
			{
				sliderButtons[i].attachEvent('onclick', slide);
			}
		}
	}

	initSlider();
}

/* Klassen-Hilfsfunktionen */

function hasClass(classname, classes)
{
	var class_strings;
	var i;

	if (!classes) classes = '';
	class_strings = classes.split(' ');
	for (i = 0; i < class_strings.length; i++)
	{
		if (class_strings[i] == classname) return(true);
	}
	return(false);
}

function removeClass(old, remove)
{
	var classes;
	var i;
	var f = null;

	if (!old) old = '';
	classes = old.split(' ');
	for (i = 0; i < classes.length; i++)
	{
		if (classes[i] == remove) f = i;
	}
	if (f != null) classes.splice(f, 1);
	return(classes.join(' '));
}

function replaceClass(old, toreplace, newclass)
{
	old = removeClass(old, toreplace);
	old = addClass(old, newclass);
	return(old);
}

function addClass(old, toadd)
{
	var classes;
	var i;
	var f = null;

	if (!old) old = '';
	classes = old.split(' ');
	for (i = 0; i < classes.length; i++)
	{
		if (classes[i] == toadd) f = i;
	}
	if (f == null) classes.push(toadd);
	return(classes.join(' '));
}

/* Init-Funktionsaufruf */

if(document.addEventListener)
{
	window.addEventListener('load', init, false);
}
if(document.attachEvent)
{
	window.attachEvent('onload', init);
}
