/******
@name proculous multieffect slideshow
@version 1.1
@author Dominik Kressler
@requirements prototypejs 1.7, scriptaculous 1.8.2 (effects.js)

@using third party tools for easing
Based on Easing Equations v2.0
(c) 2003 Robert Penner, all rights reserved.
This work is subject to the terms in http://www.robertpenner.com/easing_terms_of_use.html
Adapted for Scriptaculous by Ken Snyder (kendsnyder ~at~ gmail ~dot~ com) June 2006
*******/

if(typeof(Prototype) == "undefined")
    throw "proculous multieffect slideshow requires PrototypeJS to be loaded.";

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.target=(set.target)?$(set.target):$("slider");
		set.slices=(set.slices)?parseInt(set.slices):8;
		if(set.slices>16)set.slices=16;
		set.direction=(set.direction)?set.direction:"vertical";
		set.speed=(!isNaN(set.speed))?set.speed/10:0.1;
		set.delay=(set.delay)?((parseInt(set.delay)+set.speed)*set.slices):5;
		set.effectType=(set.effectType)?set.effectType:"random";
		set.slidePath=(set.slidePath)?set.slidePath:"images/slider/";
		set.effects=(set.effects)?set.effects:Array("moveToBottom", "moveToTop", "jalousie", "fader", "moveToLeft", "moveToRight", "curtain", "dropOut", "puff", "shrink");
		set.transition=(set.transition)?set.transition:Effect.Transitions.linear;
		if(set.target.childElements().length>0)
		{
			set.target.childElements().each(function(child)
			{
				child.remove();
			});
			Element.insert(set.target, '<div id="proLoader">Bilder werden geladen</div>');
		}
		set.sliderWidth=set.target.getWidth();
		set.sliderHeight=set.target.getHeight();
		set.sliceWidth=Math.round(set.sliderWidth/set.slices);
		set.imagesLoaded=0;
		bgPosition=0;
		index=set.slideImages.length;
		var preload_image_object=new Image();
		preload_image_object.onLoad=slider.imagesLoaded(set);
				
		for(sliceContainerCount=0;sliceContainerCount<set.slideImages.length;sliceContainerCount++)
		{
			indexCounter=indexCounter-1;
			Element.insert(set.target, '<div class="sliceContainer" id="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('sliceContainer'+sliceContainerCount, '<div class="slice" id="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 && set.imagesLoaded==1)
		{
			$('proLoader').remove();
			$$('.sliceContainer').each(function(elm){elm.appear({duration:0.5});});
			Interval=window.setInterval(function(){slider.autoSlide(set);}, set.delay*1000);
		}
	}
});
slider.imagesLoaded=function(set){set.imagesLoaded++;}
/*
Based on Easing Equations v2.0
(c) 2003 Robert Penner, all rights reserved.
This work is subject to the terms in http://www.robertpenner.com/easing_terms_of_use.html
Adapted for Scriptaculous by Ken Snyder (kendsnyder ~at~ gmail ~dot~ com) June 2006
*/
Effect.Transitions.bounce=function(pos)
{
	if (pos < (1/2.75)){return (7.5625*pos*pos);} 
	else if (pos < (2/2.75)){ 
	return (7.5625*(pos-=(1.5/2.75))*pos + .75);}
	else if (pos < (2.5/2.75)){
	return (7.5625*(pos-=(2.25/2.75))*pos + .9375);
	}else{return (7.5625*(pos-=(2.625/2.75))*pos + .984375);}
};
/* END TRANSITIONS */
slider.autoSlide=function(set)
{
	if(slideRound==set.target.childElements().length)
	{
		
	slideRound=0;
	}	
		items = $('sliceContainer'+slideRound).childElements();
		if(set.effectType=="random")
		{
			set.randomEffects=shuffle(set.effects);
			set.currentEffect=set.randomEffects[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":
				new Effect.multiple(items,Effect.Morph,{speed:set.speed,style:'width:0',transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "moveToBottom":
				new Effect.multiple(items,Effect.Move,{speed:set.speed,y:set.sliderHeight,transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "moveToTop":
				new Effect.multiple(items,Effect.Move,{delay:set.speed/2,speed:set.speed,y:set.sliderHeight*-1,transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;	
			case "fader":
				new Effect.multiple(items,Effect.Fade,{speed:set.speed,from:1,to:0,transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "moveToLeft":
				new Effect.multiple(items,Effect.Move,{speed:set.speed,x:set.sliceWidth*-1,mode:"absolute",transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "moveToRight":
				new Effect.multiple(items,Effect.Move,{speed:set.speed,x:set.sliderWidth,mode:"absolute",transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "curtain":
				new Effect.multiple(items1,Effect.Move,{speed:set.speed,x:set.sliderWidth,mode:"absolute",transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
				new Effect.multiple(items2,Effect.Move,{speed:set.speed,x:set.sliceWidth*-1,mode:"absolute",transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "dropOut":
				new Effect.multiple(items,Effect.DropOut,{speed:set.speed,x:set.sliderWidth,mode:"absolute",transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "puff":
				new Effect.multiple(items,Effect.Puff,{speed:set.speed,x:set.sliderWidth,mode:"absolute",transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
			case "shrink":
				new Effect.multiple(items,Effect.Shrink,{speed:set.speed,x:set.sliderWidth,mode:"absolute",transition:set.transition,afterFinish:function(){slider.resetSlices(set,items);}});
			break;
		}
slideRound+=1
}
slider.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);}
