/******
@name proculous multieffect slideshow
@version 1.0
@author Dominik Kressler
@requirements prototypejs 1.6.1, scriptaculous 1.8.2 (effects.js)
*******/
var Interval;
var slideRound = 0;
var resetSliceI = 0;
var indexCounter = 2147483647;
var set = new Object();
var slider = Class.create(
{
	Name:"proculous multieffect slideshow",
	Version:"1.0",
	initialize:function(set)
	{
		set.instance = getUniqueId();
		set.target=(set.target)?$(set.target):$("slider");
		set.delay=(set.delay)?parseInt(set.delay):5;
		set.slices=(set.slices)?parseInt(set.slices):8;
		if(set.slices>16)set.slices=16;
		set.direction=(set.direction)?set.direction:"vertical";
		set.speed=(set.speed)?set.speed/10:0.1;
		set.effectType=(set.effectType)?set.effectType:"moveToBottom";
		set.slidePath=(set.slidePath)?set.slidePath:"images/slider/";
		set.effects = (set.effects)?set.effects:Array("moveToBottom", "moveToTop", "jalousie", "fader", "moveToLeft", "moveToRight", "curtain");
		
		if(set.target.childElements().length>0)
		{
			set.target.childElements().each(function(child)
			{
				child.remove();
			});
			Element.insert(set.target, '<div id="'+set.instance+'proLoader">Bilder werden geladen</div>');
		}
		set.sliderWidth=set.target.getWidth();
		set.sliderHeight=set.target.getHeight();
		set.sliceWidth=Math.round(set.sliderWidth/set.slices);
		bgPosition=0;
		index=set.slideImages.length;
		var preload_image_object=new Image();
		for(sliceContainerCount=0;sliceContainerCount<set.slideImages.length;sliceContainerCount++)
		{
			indexCounter=indexCounter-1;
			Element.insert(set.target, '<div class="sliceContainer" id="'+set.instance+'sliceContainer'+sliceContainerCount+'" style="z-index:'+indexCounter+';display:none;"></div>');
			for(var i=0;i<set.slices;i++)
			{
				preload_image_object.src=set.slidePath+set.slideImages[sliceContainerCount];
				Element.insert(set.instance+'sliceContainer'+sliceContainerCount, '<div class="slice" id="'+set.instance+'slice'+sliceContainerCount+'.'+i+'" style="width:'+set.sliceWidth+'px; height: '+set.sliderHeight+'px; left:'+bgPosition+'px; background-position:-'+bgPosition+'px 0; background-image:url('+set.slidePath+set.slideImages[sliceContainerCount]+');"></div>');
				if(i!=set.slices-1)bgPosition+=set.sliceWidth;
				else bgPosition=0;
			}
			index--;
		}		
		if(index==0)
		{
			if($(set.instance+'proLoader'))$(set.instance+'proLoader').remove();
			$$('.sliceContainer').each(function(elm){elm.appear({duration:0.5});});
			Interval=window.setInterval(function(){autoSlide(set);}, set.delay*1000);
		}
	}
});
var autoSlide=function(set)
{
	if(slideRound<set.target.childElements().length)
	{
		items = $(set.instance+'sliceContainer'+slideRound).childElements();
		if(set.effectType=="random")
		{
			set.randmomEffects=shuffle(set.effects);
			set.currentEffect=set.randmomEffects[0];
		}else set.currentEffect=set.effectType;
		if(set.currentEffect=="curtain")
		{
			var items1 = [];
			var items2 = [];
			items1=items1.concat(items);
			items2=items2.concat(items);
			items1 = items1.splice(items1.length/2);
			items2 = items2.splice(0,items2.length-items1.length);
			items2.reverse();
		}
		switch(set.currentEffect)
		{
			case "jalousie":
				Effect.multiple(items,Effect.Morph,{speed:set.speed,style:'width:0',afterFinish:function(){resetSlices(set,items);}});
			break;
			case "moveToBottom":
				Effect.multiple(items,Effect.Move,{speed:set.speed,y:set.sliderHeight,afterFinish:function(){resetSlices(set,items);}});
			break;
			case "moveToTop":
				Effect.multiple(items,Effect.Move,{speed:set.speed,y:set.sliderHeight*-1,afterFinish:function(){resetSlices(set,items);}});
			break;	
			case "fader":
				Effect.multiple(items,Effect.Fade,{speed:set.speed,from:1,to:0,afterFinish:function(){resetSlices(set,items);}});
			break;
			case "moveToLeft":
				Effect.multiple(items,Effect.Move,{speed:set.speed,x:set.sliceWidth*-1,mode:"absolute",afterFinish:function(){resetSlices(set,items);}});
			break;
			case "moveToRight":
				Effect.multiple(items,Effect.Move,{speed:set.speed,x:set.sliderWidth,mode:"absolute",afterFinish:function(){resetSlices(set,items);}});
			break;
			case "curtain":
				Effect.multiple(items1,Effect.Move,{speed:set.speed,x:set.sliderWidth,mode:"absolute",afterFinish:function(){resetSlices(set,items);}});
				Effect.multiple(items2,Effect.Move,{speed:set.speed,x:set.sliceWidth*-1,mode:"absolute",afterFinish:function(){resetSlices(set,items);}});
			break;
		}
		slideRound+=1;
	} else slideRound=0;
}
var resetSlices=function(set,items)
{
	resetSliceI+=1;
	if(resetSliceI==set.slices)
	{
		items.each(function(i,index)
		{
			i.setStyle({'top':'0px','display':'block','width':set.sliceWidth+'px','left':set.sliceWidth*index+'px'});
		});
		indexcontainer=items[0].up('.sliceContainer');
		indexCounter=indexCounter-1;
		indexcontainer.style.zIndex = indexCounter;
		resetSliceI=0;
	}
}
var shuffle=function(o){
	for(var j, x, i=o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
	return o;
};
var o=function(s){console.log(s);}
var getUniqueId = function()
{
     var dateObject = new Date();
     var uniqueId = dateObject.getFullYear() + '' + dateObject.getMonth() + '' + dateObject.getDate() + '' + dateObject.getTime();
     return uniqueId;
};
