Index: example/data.xml
===================================================================
--- example/data.xml	(revision 339)
+++ example/data.xml	(working copy)
@@ -19,6 +19,16 @@
 	<visiblePlanes>7</visiblePlanes>
 	
 	<!-- ---------------------------------------------------------------------------
+	    Start index (use "center" for middle index)
+	---------------------------------------------------------------------------- -->
+	<startIndex>0</startIndex>
+	
+	<!-- ---------------------------------------------------------------------------
+	    Rotation on/off
+	---------------------------------------------------------------------------- -->
+	<rotation>false</rotation>
+	
+	<!-- ---------------------------------------------------------------------------
 	    Number of cover images to preload before showing the coverflow
 	---------------------------------------------------------------------------- -->
 	<preloadAmount>11</preloadAmount>
Index: src/ch/liip/yacc/core/YetAnotherCoverflowClone.as
===================================================================
--- src/ch/liip/yacc/core/YetAnotherCoverflowClone.as	(revision 339)
+++ src/ch/liip/yacc/core/YetAnotherCoverflowClone.as	(working copy)
@@ -1,700 +1,706 @@
-
-import netTrekLIBs.events.types.Event;
-import netTrekLIBs.utils.Delegate;
-
-// Papervision 3D Classes
-import org.papervision3d.cameras.Camera3D;
-import org.papervision3d.scenes.MovieScene3D;
-import org.papervision3d.core.proto.MaterialObject3D;
-import org.papervision3d.objects.Plane;
-
-// Tweener
-import caurina.transitions.Tweener;
-
-// Filters
-import flash.filters.DropShadowFilter;
-import flash.filters.GlowFilter;
-
-// External Interface
-import flash.external.*;
-
-// Coverflow Classes
-import ch.liip.yacc.io.ClipHandler;
-import ch.liip.yacc.io.BitmapLoader;
-import ch.liip.yacc.io.XMLoader;
-import ch.liip.yacc.io.data.objects.SettingsData;
-import ch.liip.yacc.components.ScrollBar;
-
-/**
- * @author Sandro Ducceschi [Liip AG, Switzerland]
- */
-
-class ch.liip.yacc.core.YetAnotherCoverflowClone extends ClipHandler 
-{	
-	//-----//------------------------ properties
-    private static var ROTATE_LEFT:String = "left";
-    private static var ROTATE_RIGHT:String = "right";
-	public var CLASS_NAME:String = "YACC()";
-	private var __settings:SettingsData;
-	private var __container:MovieClip;
-	private var __instance:MovieClip;
-	private var __scene:MovieScene3D;
-	private var __camera:Camera3D;
-	private var __bitmaps:BitmapLoader;
-	private var __xml:XMLoader;
-	private var scrollbar:ScrollBar;
-	private var planesPerSide:Number;
-	private var plane_angle:Number = 0;
-	private var plane_x:Number = 0;
-	private var plane_z:Number = 0;
-	private var easing:String;
-	private var speed:Number;
-	private var __rotation:String;
-	private var __current:Number;
-	private var __target:Number;
-	private var __last:Number;
-	private var __poster:Array = [];
-	private var __reflection:Array = [];
-	private var toolTip:MovieClip;
-	private var tf:TextField;
-	private var tf_prop:TextFormat;
-	private var planeClicked:Boolean = false;	
-	private var loaderClip:MovieClip;
-	private var blockClicks:Boolean = false;
-	private var clickStep: Number;
-	//-----//------------------------ -----------------   -     -     -
-	
-	//---------------------------------------------------------------------------------------------------------------------------
-	// CONSTRUCTOR
-	//---------------------------------------------------------------------------------------------------------------------------
-	public function YetAnotherCoverflowClone(instance:MovieClip) 
-	{
-		__instance = instance;
-		super.init();
-	}
-	//---------------------------------------------------------------------------------------------------------------------------
-	//  INITIALIZE
-	//---------------------------------------------------------------------------------------------------------------------------
-	private function init():Void 
-	{
-		log("initializing");
-		
-		// show a simple loader from a movieclip instance in the swf library
-		loaderClip = __instance.attachMovie("loader", "loader_anim", __instance.getNextHighestDepth());	
-		loaderClip._x = Math.round(Stage.width/2);
-		loaderClip._y = Math.round(Stage.height/2);
-		loaderClip.onEnterFrame = function():Void
-		{ 
-			this._rotation += 20; 
-		};
-		// load the actual data 
-		__xml = new XMLoader();
-		__xml.addEventListener(XMLoader.EVENT_LOADED,setConfiguration,this);
-		__xml.loadXML(_root.xml);
-	}
-	
-	private function setConfiguration():Void 
-	{
-		__settings = __xml.settings;
-		planesPerSide = (!(__settings.visiblePlanes % 2)) ? __settings.visiblePlanes/2 : (__settings.visiblePlanes-1)/2;
-		loadImages();
-	}
-	
-	private function loadImages():Void  
-	{
-		__bitmaps = new BitmapLoader(__settings.preloadAmount, true);
-		__bitmaps.addEventListener(BitmapLoader.PRELOAD_COMPLETE,createChildren,this);
-		__bitmaps.addEventListener(BitmapLoader.LOADING_COMPLETE, createChildren, this);
-		__bitmaps.load( __xml.imageArray );
-	}
-
-	private function createChildren():Void
-	{
-		log("creating children");
-		//remove the loading listeners
-		__bitmaps.removeEventListener(BitmapLoader.PRELOAD_COMPLETE, createChildren, this);
-		__bitmaps.removeEventListener(BitmapLoader.LOADING_COMPLETE, createChildren, this);
-		
-		//check how many planes there will be
-		if(__xml.titleArray.length > __settings.visiblePlanes)
-		{
-			__settings.visiblePlanes++;
-		}
-		else if(__xml.titleArray.length == __settings.visiblePlanes)
-		{
-		}
-		else 
-		{
-			__settings.visiblePlanes = __xml.titleArray.length;
-		}
-		
-		// Create the Container that holds the Scene
-		__container = __instance.createEmptyMovieClip("holder", __instance.getNextHighestDepth());
-		__container._x = Math.round(Stage.width/2);
-		__container._y = Math.round(Stage.height/2);
-		__container.__scene = __scene = new MovieScene3D( __container );
-		
-		// Create camera
-		__container.__camera = __camera = new Camera3D();
-		__camera.z = -100;
-		__camera.zoom = 1;
-		__camera.focus = 1;
-		
-		// add a ScrollBar (thanks michel! ;) )
-		scrollbar = ScrollBar(__instance.attachMovie( "ScrollBar", "scroller", __instance.getNextHighestDepth(), {theme:"custom", steps: __xml.titleArray.length-1, length:300, _x: 20, _y: 20} ));
-		scrollbar._rotation = - 90;
-		scrollbar._y = Stage.height;
-		scrollbar._x = Math.round(Stage.width/2 - scrollbar._width/2);
-		scrollbar.addEventListener(Event.CHANGING,onScrollChanging,this);
-		scrollbar.addEventListener(Event.CHANGED,onScrollChanged,this);
-		scrollbar.addEventListener(ScrollBar.PRECISE_OVER,onPreciseOver,this);
-		scrollbar.addEventListener(ScrollBar.PRECISE_OUT,onPreciseOut,this);
-		draw();
-	}
-	
-	private function draw():Void 
-	{
-		var initProps:Object;
-		
-		log("drawing planes");
-		for(var i : Number = 0; i<__settings.visiblePlanes; i++)
-		{
-			initProps = {x: plane_x, z: plane_z, rotation: plane_angle};
-			var plane:Plane = drawPoster(i, initProps);
-						
-			// increment plane coords
-			plane_x += __settings.horizontalSpacing; plane_z += __settings.depthSpacing; plane_angle -= __settings.degreeSteps;
-		}
-		
-		log("drawing reflections");
-		plane_angle = 0; plane_x = 0; plane_z = 0;
-		for(var j : Number = 0; j<__settings.visiblePlanes; j++)
-		{
-			initProps = {x: plane_x, z: plane_z, rotation: plane_angle};
-			var reflection : Plane = drawReflection(j, initProps);
-			
-			// increment plane coords
-			plane_x += __settings.horizontalSpacing; plane_z -= __settings.depthSpacing; plane_angle += __settings.degreeSteps;
-		}
-		
-		log("pushing planes to the scene");
-		for(var k : Number = 0; k<__poster.length; k++)
-		{
-			__scene.push(__poster[k]);
-			addPosterExtras(__poster[k]);
-			__scene.push(__reflection[k]);
-			
-			if(k > planesPerSide)
-			{
-				__poster[k].container._alpha = 0;
-				__reflection[k].container._alpha = 0;
-			}
-		}
-		
-		log("rendering scene");
-		__scene.renderCamera(__camera);
-		__scene.container._alpha = 0;
-		__current = 0; 
-		__target = 0; 
-		__last = 0;
-		tween();
-	}
-
-	private function tween():Void
-	{
-		// remove the "loader"
-		loaderClip.removeMovieClip();
-
-		log("tweening scene");
-		updateScene();
-		
-		__camera.x = -50;
-		__camera.y = -100;
-		Tweener.addTween(__camera, {focus: 300, time:2, transition:"easeInOutCubic"});
-		Tweener.addTween(__camera, {z: -20, time:3, transition:"easeInOutCubic"});
-		Tweener.addTween(__camera, {x: 0, time:2, transition:"easeInOutCubic"});
-		Tweener.addTween(__camera, {y: 0, time:2, transition:"easeInOutCubic"});
-		Tweener.addTween(__scene.container, {_alpha: 100, time:3, transition:"easeInOutCubic", onComplete: Delegate.create(this,coverFlowReady)});
-	}
-	
-	private function coverFlowReady():Void
-	{
-		addExternalCallBacks();
-		if(__settings.initialCompleteCall)
-		{
-			ExternalInterface.call(__xml.onAnimEndFunc, __xml.onAnimEndData[__current]);
-		}
-		log("Coverflow Ready for Action");
-		destroySceneUpdate();
-	}
-	
-	//---------------------------------------------------------------------------------------------------------------------------
-	//  METHODS
-	//---------------------------------------------------------------------------------------------------------------------------
-	private function drawPoster(index:Number,initObj:Object):Plane
-	{
-		// draw the plane
-		var plane : Plane = new Plane( MaterialObject3D(__bitmaps.materialArray[index]),1,1);	
-		
-		plane.x = initObj.x;
-		plane.y = 0;
-		plane.z = initObj.z;
-		plane.scaleX = __bitmaps.bitmapSizes[index].width * __settings.defaultScale;
-		plane.scaleY = __bitmaps.bitmapSizes[index].height * __settings.defaultScale;
-		plane.rotationX = 0;
-		plane.rotationY = initObj.rotation;
-		plane.rotationZ = 0;
-		plane.extra = {title: __xml.titleArray[index], id: index};
-		__poster.push( plane );
-		return plane;
-	}
-	
-	private function addPosterExtras(plane:Plane):Void
-	{ 
-		// add event
-		plane.container.onPress = Delegate.create(this,planeClick,plane.extra.id);
-
-		// add a neat dropshadow
-		var filterArray : Array = new Array();
-		var sColor= "0x"+__settings.shadowColor;
-		var hColor= "0x"+__settings.highlightColor;
-		filterArray.push(new DropShadowFilter(0, 0, sColor, __settings.shadowAlpha, __settings.shadowSize, __settings.shadowSize, __settings.shadowStrength, 1, false,false));
-		filterArray.push(new GlowFilter(hColor, 0, __settings.highlightSize, __settings.highlightSize, __settings.highlightStrength, 1, false, false));
-		plane.container.filters = filterArray;
-	}
-	
-	private function drawReflection(index:Number,initObj:Object):Plane
-	{
-		// draw the reflection for a poster
-		var reflection : Plane = new Plane( MaterialObject3D(__bitmaps.mirrorMaterialArray[index]),1,1);
-		reflection.x = initObj.x;
-		reflection.y = __bitmaps.mirrorMaterialArray[index].bitmap.height+2;
-		reflection.z = -initObj.z;
-		reflection.scaleX = __bitmaps.bitmapMirrorSizes[index].width * __settings.defaultScale;
-		reflection.scaleY = __bitmaps.bitmapMirrorSizes[index].height * __settings.defaultScale;
-		reflection.rotationX = 180;
-		reflection.rotationY = initObj.rotation;
-		reflection.rotationZ = 0;
-		__reflection.push( reflection );
-		return reflection;
-	}
-
-	private function reArrange(target_id:Number):Void
-	{
-		if(Tweener.isTweening(__poster[__poster.length-1]))
-		{
-			if(target_id != __last)
-			{
-				__target = target_id;
-				scrollbar.currentStep = __target;
-			}
-		}
-		else
-		{
-			__last = __target = target_id;
-			scrollbar.currentStep = __target;
-			
-			if (__last > __current)
-			{
-				easing = (__current+1 == __last) ? "easeInOutSine" : "easeInQuad";
-				__current = __last;
-				__rotation = ROTATE_LEFT;
-				shiftPlanes();
-			}
-			if (__last < __current)  
-			{
-				easing = (__current-1 == __last) ? "easeInOutSine" : "easeInQuad";
-				__current = __last;
-				__rotation = ROTATE_RIGHT;
-				shiftPlanes();
-			}
-		}
-	}
-	
-	private function shiftPlanes():Void
-	{
-		var poster : Plane;
-		var mirror : Plane;
-		var newid : Number;
-		
-		for(var i:Number = 0; i<__settings.visiblePlanes; i++)
-		{
-			poster = __poster[i];
-			mirror = __reflection[i];
-			
-			if(poster.x == -((planesPerSide+1)*__settings.horizontalSpacing) && poster.container._alpha == 0 && __rotation == ROTATE_LEFT)
-			{
-				newid = poster.extra.id+(__settings.visiblePlanes+1);
-				poster.x = -poster.x;
-				poster.rotationY = -poster.rotationY;
-				poster.container._alpha = 0;
-				poster.extra.id = newid;
-				poster.extra.title = __xml.titleArray[newid];
-				poster.material = __bitmaps.materialArray[newid];
-				poster.scaleX = __bitmaps.bitmapSizes[newid].width * __settings.defaultScale;
-				poster.scaleY = __bitmaps.bitmapSizes[newid].height * __settings.defaultScale;
-				
-				poster.container.onPress = Delegate.create(this,planeClick,newid);			
-				
-				mirror.x = -mirror.x;
-				mirror.rotationY = -mirror.rotationY;
-				mirror.material = __bitmaps.mirrorMaterialArray[newid];
-				mirror.scaleX = __bitmaps.bitmapMirrorSizes[newid].width * __settings.defaultScale;
-				mirror.scaleY = __bitmaps.bitmapMirrorSizes[newid].height * __settings.defaultScale;
-				
-				mirror.container._alpha = 0;
-				break;
-			}
-			
-			if(poster.x == ((planesPerSide+1)*__settings.horizontalSpacing) && poster.container._alpha == 0 && __rotation == ROTATE_RIGHT)
-			{
-				newid = poster.extra.id-(__settings.visiblePlanes+1);
-				poster.x = -poster.x;
-				poster.rotationY = -poster.rotationY;
-				poster.container._alpha = 0;
-				poster.extra.id = newid;
-				poster.extra.title = __xml.titleArray[newid];
-				poster.material = __bitmaps.materialArray[newid];	
-				poster.scaleX = __bitmaps.bitmapSizes[newid].width * __settings.defaultScale;
-				poster.scaleY = __bitmaps.bitmapSizes[newid].height * __settings.defaultScale;
-				
-				poster.container.onPress = Delegate.create(this,planeClick,newid);		
-				
-				mirror.x = -mirror.x;
-				mirror.rotationY = -mirror.rotationY;
-				mirror.material = __bitmaps.mirrorMaterialArray[newid];
-				mirror.scaleX = __bitmaps.bitmapMirrorSizes[newid].width * __settings.defaultScale;
-				mirror.scaleY = __bitmaps.bitmapMirrorSizes[newid].height * __settings.defaultScale;
-				mirror.container._alpha = 0;
-				break;
-			}
-		}
-		rotatePlanes();
-	}
-	
-	private function checkPosition():Void
-	{
-		var poster : Plane;
-		var target_reached : Boolean = false;
-		var current : Number;
-
-		for(var i : Number = 0; i<__xml.titleArray.length; i++)
-		{
-			poster = __poster[i];
-			if(poster.x == 0)
-			{
-				current = parseInt(poster.extra.id);
-			}
-			
-			if(poster.x == 0 && current == __target)
-			{
-				clickStep = scrollbar.currentStep;
-				blockClicks = true;
-				target_reached = true;
-				var filters : Array  = poster.container.filters;
-				Tweener.addTween(filters[1],{alpha: 1, time:speed, transition:"easeInOutSine" });
-				Tweener.addTween(filters[0],{alpha: 0, time:speed, transition:"easeInOutSine", onUpdate: Delegate.create(this,reFilter,poster,filters) });
-				
-				Tweener.addTween(poster,{scaleX: ( ( poster.scaleX / __settings.defaultScale ) * __settings.highlightScale ) , time:speed, transition:"easeInOutSine"});
-				Tweener.addTween(poster,{scaleY: ( ( poster.scaleY / __settings.defaultScale ) * __settings.highlightScale ), time:speed, transition:"easeInOutSine", onComplete: Delegate.create(this,destroySceneUpdate)});
-				break;
-			}
-			
-			// ERROR CATCHER
-			if(poster.x == 0 && current == 0 || poster.x == 0 && current == __xml.titleArray.length-1)
-			{
-				target_reached = true;
-			}
-		}
-		
-		if (!target_reached)
-		{
-			if ( __target > current)
-			{
-				__rotation = ROTATE_LEFT;
-			}
-			else if (__target < __current)
-			{
-				__rotation = ROTATE_RIGHT;
-			}
-			__last = __target;
-			easing = ((current+1 == __target) || (current-1 == __target)) ? "easeOutQuad" : "linear" ;
-			shiftPlanes();
-		}
-		else
-		{
-			__current = current;
-			__last = __target;
-			ExternalInterface.call(__xml.onAnimEndFunc, __xml.onAnimEndData[__current]);
-		}
-	}
-	
-	private function rotatePlanes():Void
-	{
-		updateScene();		
-		for(var i : Number = 0; i<__settings.visiblePlanes; i++)
-		{
-			var poster:Plane = __poster[i];
-			var reflection:Plane = __reflection[i];
-			var posterX:Number;
-			var posterZ:Number;
-			var posterRot:Number;
-			var reflectX:Number;
-			var reflectZ:Number;
-			var reflectRot:Number;
-			
-			speed = (easing == "linear") ? __settings.easingTime/1.6 : __settings.easingTime;
-			if(poster.container.filters[1].alpha == 1)
-			{
-				var filters : Array  = poster.container.filters;
-				Tweener.addTween(filters[1],{alpha: 0, time:speed, transition:"easeInOutSine" });
-				Tweener.addTween(filters[0],{alpha: 1, time:speed, transition:"easeInOutSine", onUpdate: Delegate.create(this,reFilter,poster,filters)});
-				
-				Tweener.addTween(poster,{scaleX: ( ( poster.scaleX / __settings.highlightScale ) * __settings.defaultScale ), time:speed, transition:"easeInOutSine"});
-				Tweener.addTween(poster,{scaleY: ( ( poster.scaleY / __settings.highlightScale ) * __settings.defaultScale ), time:speed, transition:"easeInOutSine"});
-			}
-			
-			if(__rotation == ROTATE_LEFT)
-			{
-				
-				if(poster.x > -( planesPerSide * __settings.horizontalSpacing ) && poster.x < (((planesPerSide+1) * __settings.horizontalSpacing )+10) )
-				{
-					Tweener.addTween(poster.container,{_alpha: 100, time: speed, transition: easing});
-					Tweener.addTween(reflection.container,{_alpha: 100, time: speed, transition: easing});
-				}
-				else
-				{
-					Tweener.addTween(poster.container,{_alpha: 0, time: speed, transition: easing});
-					Tweener.addTween(reflection.container,{_alpha: 0, time: speed, transition: easing});
-				}
-				
-				if(poster.x > 0)
-				{
-					posterX = poster.x-__settings.horizontalSpacing;
-					posterZ = poster.z-__settings.depthSpacing;
-					posterRot = poster.rotationY+__settings.degreeSteps;
-					
-					reflectX = reflection.x-__settings.horizontalSpacing;
-					reflectZ = reflection.z-__settings.depthSpacing;
-					reflectRot = reflection.rotationY-__settings.degreeSteps;
-				}
-				else
-				{
-					posterX = poster.x-__settings.horizontalSpacing;
-					posterZ = poster.z+__settings.depthSpacing;
-					posterRot = poster.rotationY+__settings.degreeSteps;
-						
-					reflectX = reflection.x-__settings.horizontalSpacing;
-					reflectZ = reflection.z+__settings.depthSpacing;
-					reflectRot = reflection.rotationY-__settings.degreeSteps;
-				}
-			}
-			else
-			{
-				if(poster.x > -(((planesPerSide+1) * __settings.horizontalSpacing )+10) && poster.x < ( planesPerSide * __settings.horizontalSpacing ))
-				{
-					Tweener.addTween(poster.container,{_alpha: 100, time: speed, transition: easing});
-					Tweener.addTween(reflection.container,{_alpha: 100, time: speed, transition: easing});
-				}
-				else
-				{
-					Tweener.addTween(poster.container,{_alpha: 0, time: speed, transition: easing});
-					Tweener.addTween(reflection.container,{_alpha: 0, time: speed, transition: easing});
-				}
-				
-				if(poster.x < 0)
-				{
-					posterX = poster.x+__settings.horizontalSpacing;
-					posterZ = poster.z-__settings.depthSpacing;
-					posterRot = poster.rotationY-__settings.degreeSteps;
-					
-					reflectX = reflection.x+__settings.horizontalSpacing;
-					reflectZ = reflection.z-__settings.depthSpacing;
-					reflectRot = reflection.rotationY+__settings.degreeSteps;
-					
-				}
-				else 
-				{
-					posterX = poster.x+__settings.horizontalSpacing;
-					posterZ = poster.z+__settings.depthSpacing;
-					posterRot = poster.rotationY-__settings.degreeSteps;
-					
-					reflectX = reflection.x+__settings.horizontalSpacing;
-					reflectZ = reflection.z+__settings.depthSpacing;
-					reflectRot = reflection.rotationY+__settings.degreeSteps;
-				}
-			}
-			
-			if(i == __settings.visiblePlanes-1)
-			{
-				Tweener.addTween(poster,{x: posterX, z: posterZ, rotationY: posterRot, time: speed, transition: easing});
-				Tweener.addTween(reflection,{x: reflectX, z: reflectZ, rotationY: reflectRot, time: speed, transition: easing,onComplete:Delegate.create(this,checkPosition)});
-			}
-			else
-			{
-				Tweener.addTween(poster,{x: posterX, z: posterZ, rotationY: posterRot, time: speed, transition: easing});
-				Tweener.addTween(reflection,{x: reflectX, z: reflectZ, rotationY: reflectRot, time: speed, transition: easing});
-			}
-		}
-	}
-	
-	private function reFilter(plane:Plane,filter:Array):Void
-	{
-		plane.container.filters = filter;
-	}
-	
-	private function showTooltip(state:Boolean,index:Number):Void
-	{
-		if(state)
-		{
-			if(toolTip != undefined)
-			{
-				toolTip.removeMovieClip();
-			}
-			toolTip = __instance.createEmptyMovieClip("tooltip",__instance.getNextHighestDepth());
-			tf = toolTip.createTextField("tooltip", 1, _root._xmouse, _root._ymouse-30, 50, 16);    
-			tf.border = true;
-			tf.borderColor = 0x888888;
-			tf.background = true;
-			tf.html = true;
-			tf.backgroundColor = 0xFFFFFF;
-			tf.selectable = false;
-			tf.autoSize = true;
-			tf.multiline = true;
-			tf.wordWrap = false;
-			tf.htmlText = __xml.titleArray[index];
-			
-			tf_prop = new TextFormat();
-			tf_prop.bold = false;
-			tf_prop.size = 10;
-			tf_prop.font = "Arial";
-			tf_prop.align = "center";
-			tf.setTextFormat(tf_prop);
-			tf._x = Math.round(_root._xmouse - tf._width/2);
-		}
-		else
-		{
-			toolTip.removeMovieClip();
-		}
-	}
-
-	private function hideToolTip():Void
-	{
-		toolTip.removeMovieClip();
-	}
-
-	/**
-	 * Sets up all the Javascript to AS Calls
-	 */
-	private function addExternalCallBacks():Void
-	{
-		//expects a Number Parameter in order to animate the coverflow to the specified index
-		ExternalInterface.addCallback(__settings.jsCallName_gotoIndex, null, Delegate.create(this,reArrange));
-		ExternalInterface.addCallback(__settings.jsCallName_retrieveTitles, null, Delegate.create(this,retrieveTitles));
-		ExternalInterface.addCallback(__settings.jsCallName_retrieveImages, null, Delegate.create(this,retrieveImages));
-		ExternalInterface.addCallback(__settings.jsCallName_retrieveIndex, null, Delegate.create(this,retrieveIndex));
-		ExternalInterface.addCallback(__settings.jsCallName_retrieveXML,null,Delegate.create(this,retrieveXML));
-	}
-	
-
-	//---------------------------------------------------------------------------------------------------------------------------
-	//  EVENT HANDLING
-	//---------------------------------------------------------------------------------------------------------------------------
-	private function retrieveXML():Void
-	{
-		ExternalInterface.call(__settings.jsCallName_retrieveXML, __xml.source.toString());
-	}
-	
-	private function retrieveTitles():Void
-	{
-		ExternalInterface.call(__settings.jsCallName_retrieveTitles, __xml.titleArray);
-	}
-	
-	private function retrieveImages():Void
-	{
-		ExternalInterface.call(__settings.jsCallName_retrieveImages, __xml.imageArray);
-	}
-	
-	private function retrieveIndex(index:Number):Void 
-	{
-		ExternalInterface.call(__settings.jsCallName_retrieveIndex, __xml.jsRetrieveElement[index]);
-	}
-	
-	private function planeClick(target_id:Number):Void
-	{
-		planeClicked = true;
-		if(__last == target_id)
-		{
-			ExternalInterface.call(__xml.onClickFunc, __xml.onClickData[target_id]);
-		}
-		else
-		{
-			ExternalInterface.call(__xml.onAnimStartFunc, __xml.onAnimStartData[__last]);
-			reArrange( target_id );
-		}
-	}
-	
-	private function onScrollChanging (e:Object):Void
-	{
-		var currentIndex : Number = Math.round(e.data.projection*(__xml.titleArray.length-1));
-		showTooltip(true,currentIndex);
-		if(__last != currentIndex)
-		{
-			ExternalInterface.call(__xml.onAnimStartFunc, __xml.onAnimStartData[__last]);
-			reArrange(currentIndex);
-		}
-	}
-	
-	private function onScrollChanged(e:Object):Void
-	{
-		if(blockClicks)
-		{
-			scrollbar.currentStep = clickStep;
-		}
-		else
-		{
-			hideToolTip();
-			var currentIndex : Number = Math.round(e.data.projection*(__xml.titleArray.length-1));
-			if(__last != currentIndex)
-			{			
-				ExternalInterface.call(__xml.onAnimStartFunc, __xml.onAnimStartData[__last]);
-				reArrange(currentIndex);
-			}
-		}
-	}
-	
-	private function onPreciseOver(e:Object):Void
-	{
-		showTooltip(true,e.data.id);
-	}
-	
-	private function onPreciseOut():Void
-	{
-		hideToolTip();	
-	}
-	
-	// VERY IMPORTANT, without this there will be no update off the scene,animation, everything :D
-	private function updateScene():Void
-	{
-		__container.onEnterFrame = Delegate.create( this, update );
-	}
-	
-	private function destroySceneUpdate():Void
-	{
-		if(planeClicked)
-		{
-			planeClicked = false;
-			blockClicks = false;
-		}
-		else
-		{
-			blockClicks = false;
-			delete __container.onEnterFrame;
-		}
-	}
-	
-	private function update():Void
-	{
-		__scene.renderCamera( __camera );
-	}
+﻿
+import netTrekLIBs.events.types.Event;
+import netTrekLIBs.utils.Delegate;
+
+// Papervision 3D Classes
+import org.papervision3d.cameras.Camera3D;
+import org.papervision3d.scenes.MovieScene3D;
+import org.papervision3d.core.proto.MaterialObject3D;
+import org.papervision3d.objects.Plane;
+
+// Tweener
+import caurina.transitions.Tweener;
+
+// Filters
+import flash.filters.DropShadowFilter;
+import flash.filters.GlowFilter;
+
+// External Interface
+import flash.external.*;
+
+// Coverflow Classes
+import ch.liip.yacc.io.ClipHandler;
+import ch.liip.yacc.io.BitmapLoader;
+import ch.liip.yacc.io.XMLoader;
+import ch.liip.yacc.io.data.objects.SettingsData;
+import ch.liip.yacc.components.ScrollBar;
+
+/**
+ * @author Sandro Ducceschi [Liip AG, Switzerland]
+ */
+
+class ch.liip.yacc.core.YetAnotherCoverflowClone extends ClipHandler 
+{	
+	//-----//------------------------ properties
+    private static var ROTATE_LEFT:String = "left";
+    private static var ROTATE_RIGHT:String = "right";
+	public var CLASS_NAME:String = "YACC()";
+	private var __settings:SettingsData;
+	private var __container:MovieClip;
+	private var __instance:MovieClip;
+	private var __scene:MovieScene3D;
+	private var __camera:Camera3D;
+	private var __bitmaps:BitmapLoader;
+	private var __xml:XMLoader;
+	private var scrollbar:ScrollBar;
+	private var planesPerSide:Number;
+	private var plane_angle:Number = 0;
+	private var plane_x:Number = 0;
+	private var plane_z:Number = 0;
+	private var easing:String;
+	private var speed:Number;
+	private var __rotation:String;
+	private var __current:Number;
+	private var __target:Number;
+	private var __last:Number;
+	private var __poster:Array = [];
+	private var __reflection:Array = [];
+	private var toolTip:MovieClip;
+	private var tf:TextField;
+	private var tf_prop:TextFormat;
+	private var planeClicked:Boolean = false;	
+	private var loaderClip:MovieClip;
+	private var blockClicks:Boolean = false;
+	private var clickStep: Number;
+	//-----//------------------------ -----------------   -     -     -
+	
+	//---------------------------------------------------------------------------------------------------------------------------
+	// CONSTRUCTOR
+	//---------------------------------------------------------------------------------------------------------------------------
+	public function YetAnotherCoverflowClone(instance:MovieClip) 
+	{
+		__instance = instance;
+		super.init();
+	}
+	//---------------------------------------------------------------------------------------------------------------------------
+	//  INITIALIZE
+	//---------------------------------------------------------------------------------------------------------------------------
+	private function init():Void 
+	{
+		log("initializing");
+		
+		// show a simple loader from a movieclip instance in the swf library
+		loaderClip = __instance.attachMovie("loader", "loader_anim", __instance.getNextHighestDepth());	
+		loaderClip._x = Math.round(Stage.width/2);
+		loaderClip._y = Math.round(Stage.height/2);
+		loaderClip.onEnterFrame = function():Void
+		{ 
+			this._rotation += 20; 
+		};
+		// load the actual data 
+		__xml = new XMLoader();
+		__xml.addEventListener(XMLoader.EVENT_LOADED,setConfiguration,this);
+		__xml.loadXML(_root.xml);
+	}
+	
+	private function setConfiguration():Void 
+	{
+		__settings = __xml.settings;
+		planesPerSide = (!(__settings.visiblePlanes % 2)) ? __settings.visiblePlanes/2 : (__settings.visiblePlanes-1)/2;
+		loadImages();
+	}
+	
+	private function loadImages():Void  
+	{
+		__bitmaps = new BitmapLoader(__settings.preloadAmount, true);
+		__bitmaps.addEventListener(BitmapLoader.PRELOAD_COMPLETE,createChildren,this);
+		__bitmaps.addEventListener(BitmapLoader.LOADING_COMPLETE, createChildren, this);
+		__bitmaps.load( __xml.imageArray );
+	}
+
+	private function createChildren():Void
+	{
+		log("creating children");
+		//remove the loading listeners
+		__bitmaps.removeEventListener(BitmapLoader.PRELOAD_COMPLETE, createChildren, this);
+		__bitmaps.removeEventListener(BitmapLoader.LOADING_COMPLETE, createChildren, this);
+		
+		//check how many planes there will be
+		if(__xml.titleArray.length > __settings.visiblePlanes)
+		{
+			__settings.visiblePlanes++;
+		}
+		else if(__xml.titleArray.length == __settings.visiblePlanes)
+		{
+		}
+		else 
+		{
+			__settings.visiblePlanes = __xml.titleArray.length;
+		}
+		
+		// Create the Container that holds the Scene
+		__container = __instance.createEmptyMovieClip("holder", __instance.getNextHighestDepth());
+		__container._x = Math.round(Stage.width/2);
+		__container._y = Math.round(Stage.height/2);
+		__container.__scene = __scene = new MovieScene3D( __container );
+		
+		// Create camera
+		__container.__camera = __camera = new Camera3D();
+		__camera.z = -100;
+		__camera.zoom = 1;
+		__camera.focus = 1;
+		
+		// add a ScrollBar (thanks michel! ;) )
+		scrollbar = ScrollBar(__instance.attachMovie( "ScrollBar", "scroller", __instance.getNextHighestDepth(), {theme:"custom", steps: __xml.titleArray.length-1, length:300, _x: 20, _y: 20} ));
+		scrollbar._rotation = - 90;
+		scrollbar._y = Stage.height;
+		scrollbar._x = Math.round(Stage.width/2 - scrollbar._width/2);
+		scrollbar.addEventListener(Event.CHANGING,onScrollChanging,this);
+		scrollbar.addEventListener(Event.CHANGED,onScrollChanged,this);
+		scrollbar.addEventListener(ScrollBar.PRECISE_OVER,onPreciseOver,this);
+		scrollbar.addEventListener(ScrollBar.PRECISE_OUT,onPreciseOut,this);
+		draw();
+	}
+	
+	private function draw():Void 
+	{
+		var initProps:Object;
+		var current = __settings.startIndex;
+		var start = null;
+		if (!__settings.rotation) {
+			if ((current + planesPerSide) > (__xml.titleArray.length-1))
+				start = Math.max((__xml.titleArray.length-1)-__settings.visiblePlanes, 0);
+			else if ((current - planesPerSide) < 0)
+				start = 0;
+		}
+		if (start === null) {
+			start = current - planesPerSide;
+		}
+
+		log("drawing planes");
+		for(var i=start; i<(start+__settings.visiblePlanes); i++)
+		{
+			plane_x = (i-current)*__settings.horizontalSpacing; plane_z = Math.abs(i-current)*__settings.depthSpacing; plane_angle = -1*(i-current)*__settings.degreeSteps;
+
+			initProps = {x: plane_x, z: plane_z, rotation: plane_angle};
+			var p = i;
+			if (p < 0) p = __xml.titleArray.length + p;
+			else if (p > (__xml.titleArray.length - 1)) p = p - (__xml.titleArray.length - 1);
+			var plane:Plane = drawPoster(p, initProps);
+		}
+		
+		log("drawing reflections");
+		for(var j=start; j<(start+__settings.visiblePlanes); j++)
+		{
+			plane_x = (j-current)*__settings.horizontalSpacing; plane_z = -1*Math.abs(j-current)*__settings.depthSpacing; plane_angle = (j-current)*__settings.degreeSteps;
+
+			initProps = {x: plane_x, z: plane_z, rotation: plane_angle};
+			
+			var r = j;
+			if (r < 0) r = __xml.titleArray.length + r;
+			else if (r > (__xml.titleArray.length - 1)) r = r - (__xml.titleArray.length - 1);
+			var reflection : Plane = drawReflection(r, initProps);
+		}
+		
+		log("pushing planes to the scene");
+		for(var k : Number = 0; k<__poster.length; k++)
+		{
+			__scene.push(__poster[k]);
+			addPosterExtras(__poster[k]);
+			__scene.push(__reflection[k]);
+			
+			if(Math.abs(__poster[k].x/__settings.horizontalSpacing) > planesPerSide)
+			{
+				__poster[k].container._alpha = 0;
+				__reflection[k].container._alpha = 0;
+			}
+		}
+		
+		log("rendering scene");
+		__scene.renderCamera(__camera);
+		__scene.container._alpha = 0;
+		__current = current; 
+		__target = current; 
+		__last = current;
+		tween();
+	}
+
+	private function tween():Void
+	{
+		// remove the "loader"
+		loaderClip.removeMovieClip();
+
+		log("tweening scene");
+		updateScene();
+		
+		__camera.x = -50;
+		__camera.y = -100;
+		Tweener.addTween(__camera, {focus: 300, time:2, transition:"easeInOutCubic"});
+		Tweener.addTween(__camera, {z: -20, time:3, transition:"easeInOutCubic"});
+		Tweener.addTween(__camera, {x: 0, time:2, transition:"easeInOutCubic"});
+		Tweener.addTween(__camera, {y: 0, time:2, transition:"easeInOutCubic"});
+		Tweener.addTween(__scene.container, {_alpha: 100, time:3, transition:"easeInOutCubic", onComplete: Delegate.create(this,coverFlowReady)});
+	}
+	
+	private function coverFlowReady():Void
+	{
+		addExternalCallBacks();
+		if(__settings.initialCompleteCall)
+		{
+			ExternalInterface.call(__xml.onAnimEndFunc, __xml.onAnimEndData[__current]);
+		}
+		
+		speed = (easing == "linear") ? __settings.easingTime / 1.6 : __settings.easingTime;
+		checkPosition();
+	}
+	
+	//---------------------------------------------------------------------------------------------------------------------------
+	//  METHODS
+	//---------------------------------------------------------------------------------------------------------------------------
+	private function drawPoster(index:Number,initObj:Object):Plane
+	{
+		// draw the plane
+		var plane : Plane = new Plane( MaterialObject3D(__bitmaps.materialArray[index]),1,1);	
+		
+		plane.x = initObj.x;
+		plane.y = 0;
+		plane.z = initObj.z;
+		plane.scaleX = __bitmaps.bitmapSizes[index].width * __settings.defaultScale;
+		plane.scaleY = __bitmaps.bitmapSizes[index].height * __settings.defaultScale;
+		plane.rotationX = 0;
+		plane.rotationY = initObj.rotation;
+		plane.rotationZ = 0;
+		plane.extra = {title: __xml.titleArray[index], id: index};
+		__poster.push( plane );
+		return plane;
+	}
+	
+	private function addPosterExtras(plane:Plane):Void
+	{ 
+		// add event
+		plane.container.onPress = Delegate.create(this,planeClick,plane.extra.id);
+
+		// add a neat dropshadow
+		var filterArray : Array = new Array();
+		var sColor= "0x"+__settings.shadowColor;
+		var hColor= "0x"+__settings.highlightColor;
+		filterArray.push(new DropShadowFilter(0, 0, sColor, __settings.shadowAlpha, __settings.shadowSize, __settings.shadowSize, __settings.shadowStrength, 1, false,false));
+		filterArray.push(new GlowFilter(hColor, 0, __settings.highlightSize, __settings.highlightSize, __settings.highlightStrength, 1, false, false));
+		plane.container.filters = filterArray;
+	}
+	
+	private function drawReflection(index:Number,initObj:Object):Plane
+	{
+		// draw the reflection for a poster
+		var reflection : Plane = new Plane( MaterialObject3D(__bitmaps.mirrorMaterialArray[index]),1,1);
+		reflection.x = initObj.x;
+		reflection.y = __bitmaps.mirrorMaterialArray[index].bitmap.height+2;
+		reflection.z = -initObj.z;
+		reflection.scaleX = __bitmaps.bitmapMirrorSizes[index].width * __settings.defaultScale;
+		reflection.scaleY = __bitmaps.bitmapMirrorSizes[index].height * __settings.defaultScale;
+		reflection.rotationX = 180;
+		reflection.rotationY = initObj.rotation;
+		reflection.rotationZ = 0;
+		__reflection.push( reflection );
+		return reflection;
+	}
+
+	private function reArrange(target_id:Number):Void
+	{
+		if(Tweener.getTweens(__poster[(__poster.length - 1)]).join('').indexOf('x') > -1)
+		{
+			if(target_id != __last)
+			{
+				__target = target_id;
+				scrollbar.currentStep = __target;
+			}
+		}
+		else
+		{
+			var dir = target_id - __last;
+			if (Math.abs(dir) > planesPerSide)
+				dir = -1 * dir;
+			
+			__last = __target = target_id;
+			scrollbar.currentStep = __target;
+			
+			if (dir > 0)
+			{
+				easing = (__current+1 == __last) ? "easeInOutSine" : "easeInQuad";
+				__current = __last;
+				__rotation = ROTATE_LEFT;
+				shiftPlanes();
+			}
+			else if (dir < 0)  
+			{
+				easing = (__current-1 == __last) ? "easeInOutSine" : "easeInQuad";
+				__current = __last;
+				__rotation = ROTATE_RIGHT;
+				shiftPlanes();
+			}
+		}
+	}
+	
+	private function shiftPlanes():Void
+	{
+		var poster : Plane;
+		var mirror : Plane;
+		var newid : Number;
+		
+		for(var i:Number = 0; i<__settings.visiblePlanes; i++)
+		{
+			poster = __poster[i];
+			mirror = __reflection[i];
+
+			if(poster.x == -((planesPerSide+1)*__settings.horizontalSpacing) && poster.container._alpha == 0 && __rotation == ROTATE_LEFT)
+			{
+				poster.x = -poster.x;
+				poster.rotationY = -poster.rotationY;
+				
+				newid = poster.extra.id + __settings.visiblePlanes;
+				if (__settings.rotation && __xml.titleArray[newid] == undefined)
+					newid = newid - __xml.titleArray.length;
+
+				poster.container._alpha = 0;
+				poster.extra.id = newid;
+				poster.extra.title = __xml.titleArray[newid];
+				poster.material = __bitmaps.materialArray[newid];
+				poster.scaleX = __bitmaps.bitmapSizes[newid].width * __settings.defaultScale;
+				poster.scaleY = __bitmaps.bitmapSizes[newid].height * __settings.defaultScale;
+				
+				poster.container.onPress = Delegate.create(this,planeClick,newid);			
+				
+				mirror.x = -mirror.x;
+				mirror.rotationY = -mirror.rotationY;
+				mirror.material = __bitmaps.mirrorMaterialArray[newid];
+				mirror.scaleX = __bitmaps.bitmapMirrorSizes[newid].width * __settings.defaultScale;
+				mirror.scaleY = __bitmaps.bitmapMirrorSizes[newid].height * __settings.defaultScale;
+				
+				mirror.container._alpha = 0;
+				break;
+			}
+			
+			if(poster.x == ((planesPerSide+1)*__settings.horizontalSpacing) && poster.container._alpha == 0 && __rotation == ROTATE_RIGHT)
+			{
+				poster.x = -poster.x;
+				poster.rotationY = -poster.rotationY;
+				
+				newid = poster.extra.id - __settings.visiblePlanes;
+				if (__settings.rotation && __xml.titleArray[newid] == undefined)
+					newid = __xml.titleArray.length + newid;
+				
+				poster.container._alpha = 0;
+				poster.extra.id = newid;
+				poster.extra.title = __xml.titleArray[newid];
+				poster.material = __bitmaps.materialArray[newid];	
+				poster.scaleX = __bitmaps.bitmapSizes[newid].width * __settings.defaultScale;
+				poster.scaleY = __bitmaps.bitmapSizes[newid].height * __settings.defaultScale;
+				
+				poster.container.onPress = Delegate.create(this,planeClick,newid);		
+				
+				mirror.x = -mirror.x;
+				mirror.rotationY = -mirror.rotationY;
+				mirror.material = __bitmaps.mirrorMaterialArray[newid];
+				mirror.scaleX = __bitmaps.bitmapMirrorSizes[newid].width * __settings.defaultScale;
+				mirror.scaleY = __bitmaps.bitmapMirrorSizes[newid].height * __settings.defaultScale;
+				mirror.container._alpha = 0;
+				break;
+			}
+		}
+		rotatePlanes();
+	}
+	
+	private function checkPosition():Void
+	{
+		var poster : Plane;
+		var target_reached : Boolean = false;
+		var current : Number;
+
+		for(var i : Number = 0; i<__poster.length; i++)
+		{
+			poster = __poster[i];
+			if(poster.x == 0)
+			{
+				current = parseInt(poster.extra.id);
+			}
+			
+			if(poster.x == 0 && current == __target)
+			{
+				clickStep = scrollbar.currentStep;
+				blockClicks = true;
+				target_reached = true;
+				var filters : Array  = poster.container.filters;
+				Tweener.addTween(filters[1],{alpha: 1, time:speed, transition:"easeInOutSine" });
+				Tweener.addTween(filters[0],{alpha: 0, time:speed, transition:"easeInOutSine", onUpdate: Delegate.create(this,reFilter,poster,filters) });
+				
+				Tweener.addTween(poster,{scaleX: ( ( poster.scaleX / __settings.defaultScale ) * __settings.highlightScale ) , time:speed, transition:"easeInOutSine"});
+				Tweener.addTween(poster,{scaleY: ( ( poster.scaleY / __settings.defaultScale ) * __settings.highlightScale ), time:speed, transition:"easeInOutSine", onComplete: Delegate.create(this,destroySceneUpdate)});
+				break;
+			}
+			
+			// ERROR CATCHER
+			if(!__settings.rotation && (poster.x == 0 && current == 0 || poster.x == 0 && current == __xml.titleArray.length-1))
+			{
+				target_reached = true;
+			}
+		}
+		
+		if (!target_reached)
+		{
+			var dir = __target - __last;
+			if (dir) {
+				if (Math.abs(dir) > planesPerSide)
+					dir = -1 * dir;
+				
+				if ( dir > 0 )
+				{
+					__rotation = ROTATE_LEFT;
+				}
+				else if ( dir < 0 )
+				{
+					__rotation = ROTATE_RIGHT;
+				}
+			}
+			__last = __target;
+			easing = ((current+1 == __target) || (current-1 == __target)) ? "easeOutQuad" : "linear" ;
+			shiftPlanes();
+		}
+		else
+		{
+			__current = current;
+			__last = __target;
+			ExternalInterface.call(__xml.onAnimEndFunc, __xml.onAnimEndData[__current]);
+		}
+	}
+	
+	private function rotatePlanes():Void
+	{
+		updateScene();		
+		for(var i : Number = 0; i<__settings.visiblePlanes; i++)
+		{
+			var poster:Plane = __poster[i];
+			var reflection:Plane = __reflection[i];
+			var posterX:Number;
+			var posterZ:Number;
+			var posterRot:Number;
+			var reflectX:Number;
+			var reflectZ:Number;
+			var reflectRot:Number;
+			
+			var curPos:Number;
+			var newPos:Number;
+			
+			speed = (easing == "linear") ? __settings.easingTime/1.6 : __settings.easingTime;
+			curPos = Math.round(poster.x / __settings.horizontalSpacing);
+			
+			if(poster.container.filters[1].alpha == 1)
+			{
+				var filters : Array  = poster.container.filters;
+				Tweener.addTween(filters[1],{alpha: 0, time:speed, transition:"easeInOutSine" });
+				Tweener.addTween(filters[0],{alpha: 1, time:speed, transition:"easeInOutSine", onUpdate: Delegate.create(this,reFilter,poster,filters)});
+				
+				Tweener.addTween(poster,{scaleX: ( ( poster.scaleX / __settings.highlightScale ) * __settings.defaultScale ), time:speed, transition:"easeInOutSine"});
+				Tweener.addTween(poster,{scaleY: ( ( poster.scaleY / __settings.highlightScale ) * __settings.defaultScale ), time:speed, transition:"easeInOutSine"});
+			}
+			
+			if(__rotation == ROTATE_LEFT)
+			{
+				if (__settings.rotation && Math.abs(curPos - 1) > planesPerSide && ((Math.abs(curPos - 1) - planesPerSide) > 1 || (planesPerSide * 2 + 1) == __settings.visiblePlanes)) {
+					newPos = __settings.visiblePlanes - ((curPos - 1) * -1);
+				}
+				else {
+					newPos = curPos - 1;
+				}
+			}
+			else
+			{
+				if (__settings.rotation && Math.abs(curPos + 1) > planesPerSide && ((Math.abs(curPos + 1) - planesPerSide) > 1 || (planesPerSide * 2 + 1) == __settings.visiblePlanes)) {
+					newPos = -1*(__settings.visiblePlanes - (curPos + 1));
+				}
+				else {
+					newPos = curPos + 1;
+				}
+			}
+
+			posterX = newPos * __settings.horizontalSpacing;
+			posterZ = Math.abs(newPos) * __settings.depthSpacing;
+			posterRot = -1 * newPos * __settings.degreeSteps;
+			
+			reflectX = newPos * __settings.horizontalSpacing;
+			reflectZ = Math.abs(newPos) * __settings.depthSpacing;
+			reflectRot = newPos * __settings.degreeSteps;
+			
+			if(Math.abs(newPos) <= planesPerSide)
+			{
+				Tweener.addTween(poster.container,{_alpha: 100, time: speed, transition: easing});
+				Tweener.addTween(reflection.container,{_alpha: 100, time: speed, transition: easing});
+			}
+			else
+			{
+				Tweener.addTween(poster.container,{_alpha: 0, time: speed, transition: easing});
+				Tweener.addTween(reflection.container,{_alpha: 0, time: speed, transition: easing});
+			}
+				
+			if(i == __settings.visiblePlanes-1)
+			{
+				Tweener.addTween(poster,{x: posterX, z: posterZ, rotationY: posterRot, time: speed, transition: easing});
+				Tweener.addTween(reflection,{x: reflectX, z: reflectZ, rotationY: reflectRot, time: speed, transition: easing,onComplete:Delegate.create(this,checkPosition)});
+			}
+			else
+			{
+				Tweener.addTween(poster,{x: posterX, z: posterZ, rotationY: posterRot, time: speed, transition: easing});
+				Tweener.addTween(reflection,{x: reflectX, z: reflectZ, rotationY: reflectRot, time: speed, transition: easing});
+			}
+		}
+	}
+	
+	private function reFilter(plane:Plane,filter:Array):Void
+	{
+		plane.container.filters = filter;
+	}
+	
+	private function showTooltip(state:Boolean,index:Number):Void
+	{
+		if(state)
+		{
+			if(toolTip != undefined)
+			{
+				toolTip.removeMovieClip();
+			}
+			toolTip = __instance.createEmptyMovieClip("tooltip",__instance.getNextHighestDepth());
+			tf = toolTip.createTextField("tooltip", 1, _root._xmouse, _root._ymouse-30, 50, 16);    
+			tf.border = true;
+			tf.borderColor = 0x888888;
+			tf.background = true;
+			tf.html = true;
+			tf.backgroundColor = 0xFFFFFF;
+			tf.selectable = false;
+			tf.autoSize = true;
+			tf.multiline = true;
+			tf.wordWrap = false;
+			tf.htmlText = __xml.titleArray[index];
+			
+			tf_prop = new TextFormat();
+			tf_prop.bold = false;
+			tf_prop.size = 10;
+			tf_prop.font = "Arial";
+			tf_prop.align = "center";
+			tf.setTextFormat(tf_prop);
+			tf._x = Math.round(_root._xmouse - tf._width/2);
+		}
+		else
+		{
+			toolTip.removeMovieClip();
+		}
+	}
+
+	private function hideToolTip():Void
+	{
+		toolTip.removeMovieClip();
+	}
+
+	/**
+	 * Sets up all the Javascript to AS Calls
+	 */
+	private function addExternalCallBacks():Void
+	{
+		//expects a Number Parameter in order to animate the coverflow to the specified index
+		ExternalInterface.addCallback(__settings.jsCallName_gotoIndex, null, Delegate.create(this,reArrange));
+		ExternalInterface.addCallback(__settings.jsCallName_retrieveTitles, null, Delegate.create(this,retrieveTitles));
+		ExternalInterface.addCallback(__settings.jsCallName_retrieveImages, null, Delegate.create(this,retrieveImages));
+		ExternalInterface.addCallback(__settings.jsCallName_retrieveIndex, null, Delegate.create(this,retrieveIndex));
+		ExternalInterface.addCallback(__settings.jsCallName_retrieveXML,null,Delegate.create(this,retrieveXML));
+	}
+	
+
+	//---------------------------------------------------------------------------------------------------------------------------
+	//  EVENT HANDLING
+	//---------------------------------------------------------------------------------------------------------------------------
+	private function retrieveXML():Void
+	{
+		ExternalInterface.call(__settings.jsCallName_retrieveXML, __xml.source.toString());
+	}
+	
+	private function retrieveTitles():Void
+	{
+		ExternalInterface.call(__settings.jsCallName_retrieveTitles, __xml.titleArray);
+	}
+	
+	private function retrieveImages():Void
+	{
+		ExternalInterface.call(__settings.jsCallName_retrieveImages, __xml.imageArray);
+	}
+	
+	private function retrieveIndex(index:Number):Void 
+	{
+		ExternalInterface.call(__settings.jsCallName_retrieveIndex, __xml.jsRetrieveElement[index]);
+	}
+	
+	private function planeClick(target_id:Number):Void
+	{
+		planeClicked = true;
+		if(__last == target_id)
+		{
+			ExternalInterface.call(__xml.onClickFunc, __xml.onClickData[target_id]);
+		}
+		else
+		{
+			ExternalInterface.call(__xml.onAnimStartFunc, __xml.onAnimStartData[__last]);
+			reArrange( target_id );
+		}
+	}
+	
+	private function onScrollChanging (e:Object):Void
+	{
+		var currentIndex : Number = Math.round(e.data.projection*(__xml.titleArray.length-1));
+		showTooltip(true,currentIndex);
+		if(__last != currentIndex)
+		{
+			ExternalInterface.call(__xml.onAnimStartFunc, __xml.onAnimStartData[__last]);
+			reArrange(currentIndex);
+		}
+	}
+	
+	private function onScrollChanged(e:Object):Void
+	{
+		if(blockClicks)
+		{
+			scrollbar.currentStep = clickStep;
+		}
+		else
+		{
+			hideToolTip();
+			var currentIndex : Number = Math.round(e.data.projection*(__xml.titleArray.length-1));
+			if(__last != currentIndex)
+			{			
+				ExternalInterface.call(__xml.onAnimStartFunc, __xml.onAnimStartData[__last]);
+				reArrange(currentIndex);
+			}
+		}
+	}
+	
+	private function onPreciseOver(e:Object):Void
+	{
+		showTooltip(true,e.data.id);
+	}
+	
+	private function onPreciseOut():Void
+	{
+		hideToolTip();	
+	}
+	
+	// VERY IMPORTANT, without this there will be no update off the scene,animation, everything :D
+	private function updateScene():Void
+	{
+		__container.onEnterFrame = Delegate.create( this, update );
+	}
+	
+	private function destroySceneUpdate():Void
+	{
+		if(planeClicked)
+		{
+			planeClicked = false;
+			blockClicks = false;
+		}
+		else
+		{
+			blockClicks = false;
+			delete __container.onEnterFrame;
+		}
+	}
+	
+	private function update():Void
+	{
+		__scene.renderCamera( __camera );
+	}
 }
\ No newline at end of file
Index: src/ch/liip/yacc/io/data/objects/SettingsData.as
===================================================================
--- src/ch/liip/yacc/io/data/objects/SettingsData.as	(revision 339)
+++ src/ch/liip/yacc/io/data/objects/SettingsData.as	(working copy)
@@ -1,254 +1,276 @@
-
-/**
- * @author Sandro Ducceschi [Liip AG, Switzerland]
- */
+﻿
+/**
+ * @author Sandro Ducceschi [Liip AG, Switzerland]
+ */
  
-class ch.liip.yacc.io.data.objects.SettingsData 
-{
-	//-----//------------------------ properties	
-	private var _visiblePlanes:Number;
-	private var _hSpacing:Number;
-	private var _dSpacing:Number;
-	private var _degreeSteps:Number;
-	private var _easingTime:Number;
-	private var _defaultScale:Number;
-	private var _highlightScale:Number;
-	private var _shadowAlpha:Number;
-	private var _shadowColor:Number;
-	private var _shadowSize:Number;
-	private var _shadowStrength:Number;
-	private var _highlightColor:Number;
-	private var _highlightStrength:Number;
-	private var _highlightSize:Number;
-	private var _initialCompleteCall:Boolean;
-	private var _preloadAmount:Number;
-	private var _retrieveXMLCall:String;
-	private var _retrieveImagesCall:String;
-	private var _retrieveTitlesCall:String;
-	private var _retrieveIndexCall:String
-	private var _gotoIndexCall:String;
-	//-----//------------------------ -----------------   -     -     -
-	
-	//---------------------------------------------------------------------------------------------------------------------------
-	// CONSTRUCTOR
-	//---------------------------------------------------------------------------------------------------------------------------
-	public function SettingsData()
-	{
-	}
-	//---------------------------------------------------------------------------------------------------------------------------
-	// METHODS
-	//---------------------------------------------------------------------------------------------------------------------------
-	
-	//---------------------------------------------------------------------------------------------------------------------------
-	// GETTER/SETTER
-	//---------------------------------------------------------------------------------------------------------------------------	
-	public function get visiblePlanes():Number
-	{
-		return _visiblePlanes;
-	}
-
-	public function set visiblePlanes(planes:Number):Void 
-	{
-		_visiblePlanes = planes;
-	}
-	
-	public function get preloadAmount():Number
-	{
-		return _preloadAmount;
-	}
-
-	public function set preloadAmount(amount:Number):Void 
-	{
-		_preloadAmount = amount;
-	}
-	
-	public function get horizontalSpacing():Number
-	{
-		return _hSpacing;
-	}
-	
-	public function set horizontalSpacing(amount:Number):Void 
-	{
-		_hSpacing = amount;
-	}
-	
-	public function get depthSpacing():Number
-	{
-		return _dSpacing;
-	}
-	
-	public function set depthSpacing(amount:Number):Void 
-	{
-		_dSpacing = amount;
-	}
-	
-	public function get degreeSteps():Number
-	{
-		return _degreeSteps;
-	}
-	
-	public function set degreeSteps(amount:Number):Void 
-	{
-		_degreeSteps = amount;
-	}
-	
-	public function get easingTime():Number
-	{
-		return _easingTime;
-	}
-	
-	public function set easingTime(amount:Number):Void 
-	{
-		_easingTime = amount;
-	}
-	
-	public function get defaultScale():Number
-	{
-		return _defaultScale;
-	}
-	
-	public function set defaultScale(amount:Number):Void 
-	{
-		_defaultScale = amount;
-	}
-	
-	public function get highlightScale():Number
-	{
-		return _highlightScale;
-	}
-	
-	public function set highlightScale(amount:Number):Void 
-	{
-		_highlightScale = amount;
-	}
-	
-	public function get shadowAlpha():Number
-	{
-		return _shadowAlpha;
-	}
-	
-	public function set shadowAlpha(amount:Number):Void 
-	{
-		_shadowAlpha = amount;
-	}
-	
-	public function get shadowColor():Number
-	{
-		return _shadowColor;
-	}
-	
-	public function set shadowColor(amount:Number):Void 
-	{
-		_shadowColor = amount;
-	}
-	
-	public function get shadowSize():Number
-	{
-		return _shadowSize;
-	}
-	
-	public function set shadowSize(amount:Number):Void 
-	{
-		_shadowSize = amount;
-	}
-	
-	public function get shadowStrength():Number
-	{
-		return _shadowStrength;
-	}
-	
-	public function set shadowStrength(amount:Number):Void 
-	{
-		_shadowStrength = amount;
-	}
-	
-	public function get highlightColor():Number
-	{
-		return _highlightColor;
-	}
-	
-	public function set highlightColor(amount:Number):Void 
-	{
-		_highlightColor = amount;
-	}
-	
-	public function get highlightStrength():Number
-	{
-		return _highlightStrength;
-	}
-	
-	public function set highlightStrength(amount:Number):Void 
-	{
-		_highlightStrength = amount;
-	}
-	
-	public function get highlightSize():Number
-	{
-		return _highlightSize;
-	}
-	
-	public function set highlightSize(amount:Number):Void 
-	{
-		_highlightSize = amount;
-	}
-
-	public function get initialCompleteCall():Boolean
-	{
-		return _initialCompleteCall;
-	}
-
-	public function set initialCompleteCall(bool:Boolean):Void 
-	{
-		_initialCompleteCall = bool;
-	}
-
-	public function get jsCallName_retrieveXML():String
-	{
-		return _retrieveXMLCall;
-	}
-
-	public function set jsCallName_retrieveXML(name:String):Void 
-	{
-		_retrieveXMLCall = name;
-	}
-	
-	public function get jsCallName_retrieveImages():String
-	{
-		return _retrieveImagesCall;
-	}
-
-	public function set jsCallName_retrieveImages(name:String):Void 
-	{
-		_retrieveImagesCall = name;
-	}
-	
-	public function get jsCallName_retrieveTitles():String
-	{
-		return _retrieveTitlesCall;
-	}
-
-	public function set jsCallName_retrieveTitles(name:String):Void 
-	{
-		_retrieveTitlesCall = name;
-	}
-	
-	public function get jsCallName_retrieveIndex():String
-	{
-		return _retrieveIndexCall;
-	}
-
-	public function set jsCallName_retrieveIndex(name:String):Void 
-	{
-		_retrieveIndexCall = name;
-	}
-	
-	public function get jsCallName_gotoIndex():String
-	{
-		return _gotoIndexCall;
-	}
-	
-	public function set jsCallName_gotoIndex(name:String):Void 
-	{
-		_gotoIndexCall = name;
+class ch.liip.yacc.io.data.objects.SettingsData 
+{
+	//-----//------------------------ properties	
+	private var _visiblePlanes:Number;
+	private var _hSpacing:Number;
+	private var _dSpacing:Number;
+	private var _degreeSteps:Number;
+	private var _easingTime:Number;
+	private var _defaultScale:Number;
+	private var _highlightScale:Number;
+	private var _shadowAlpha:Number;
+	private var _shadowColor:Number;
+	private var _shadowSize:Number;
+	private var _shadowStrength:Number;
+	private var _highlightColor:Number;
+	private var _highlightStrength:Number;
+	private var _highlightSize:Number;
+	private var _initialCompleteCall:Boolean;
+	private var _preloadAmount:Number;
+	private var _retrieveXMLCall:String;
+	private var _retrieveImagesCall:String;
+	private var _retrieveTitlesCall:String;
+	private var _retrieveIndexCall:String
+	private var _gotoIndexCall:String;
+	private var _startIndex:Number;
+	private var _rotation:Boolean;
+	//-----//------------------------ -----------------   -     -     -
+	
+	//---------------------------------------------------------------------------------------------------------------------------
+	// CONSTRUCTOR
+	//---------------------------------------------------------------------------------------------------------------------------
+	public function SettingsData()
+	{
 	}
+	//---------------------------------------------------------------------------------------------------------------------------
+	// METHODS
+	//---------------------------------------------------------------------------------------------------------------------------
+	
+	//---------------------------------------------------------------------------------------------------------------------------
+	// GETTER/SETTER
+	//---------------------------------------------------------------------------------------------------------------------------	
+	public function get visiblePlanes():Number
+	{
+		return _visiblePlanes;
+	}
+
+	public function set visiblePlanes(planes:Number):Void 
+	{
+		_visiblePlanes = planes;
+	}
+	
+	public function get preloadAmount():Number
+	{
+		return _preloadAmount;
+	}
+
+	public function set preloadAmount(amount:Number):Void 
+	{
+		_preloadAmount = amount;
+	}
+	
+	public function get horizontalSpacing():Number
+	{
+		return _hSpacing;
+	}
+	
+	public function set horizontalSpacing(amount:Number):Void 
+	{
+		_hSpacing = amount;
+	}
+	
+	public function get depthSpacing():Number
+	{
+		return _dSpacing;
+	}
+	
+	public function set depthSpacing(amount:Number):Void 
+	{
+		_dSpacing = amount;
+	}
+	
+	public function get degreeSteps():Number
+	{
+		return _degreeSteps;
+	}
+	
+	public function set degreeSteps(amount:Number):Void 
+	{
+		_degreeSteps = amount;
+	}
+	
+	public function get easingTime():Number
+	{
+		return _easingTime;
+	}
+	
+	public function set easingTime(amount:Number):Void 
+	{
+		_easingTime = amount;
+	}
+	
+	public function get defaultScale():Number
+	{
+		return _defaultScale;
+	}
+	
+	public function set defaultScale(amount:Number):Void 
+	{
+		_defaultScale = amount;
+	}
+	
+	public function get highlightScale():Number
+	{
+		return _highlightScale;
+	}
+	
+	public function set highlightScale(amount:Number):Void 
+	{
+		_highlightScale = amount;
+	}
+	
+	public function get shadowAlpha():Number
+	{
+		return _shadowAlpha;
+	}
+	
+	public function set shadowAlpha(amount:Number):Void 
+	{
+		_shadowAlpha = amount;
+	}
+	
+	public function get shadowColor():Number
+	{
+		return _shadowColor;
+	}
+	
+	public function set shadowColor(amount:Number):Void 
+	{
+		_shadowColor = amount;
+	}
+	
+	public function get shadowSize():Number
+	{
+		return _shadowSize;
+	}
+	
+	public function set shadowSize(amount:Number):Void 
+	{
+		_shadowSize = amount;
+	}
+	
+	public function get shadowStrength():Number
+	{
+		return _shadowStrength;
+	}
+	
+	public function set shadowStrength(amount:Number):Void 
+	{
+		_shadowStrength = amount;
+	}
+	
+	public function get highlightColor():Number
+	{
+		return _highlightColor;
+	}
+	
+	public function set highlightColor(amount:Number):Void 
+	{
+		_highlightColor = amount;
+	}
+	
+	public function get highlightStrength():Number
+	{
+		return _highlightStrength;
+	}
+	
+	public function set highlightStrength(amount:Number):Void 
+	{
+		_highlightStrength = amount;
+	}
+	
+	public function get highlightSize():Number
+	{
+		return _highlightSize;
+	}
+	
+	public function set highlightSize(amount:Number):Void 
+	{
+		_highlightSize = amount;
+	}
+
+	public function get initialCompleteCall():Boolean
+	{
+		return _initialCompleteCall;
+	}
+
+	public function set initialCompleteCall(bool:Boolean):Void 
+	{
+		_initialCompleteCall = bool;
+	}
+
+	public function get jsCallName_retrieveXML():String
+	{
+		return _retrieveXMLCall;
+	}
+
+	public function set jsCallName_retrieveXML(name:String):Void 
+	{
+		_retrieveXMLCall = name;
+	}
+	
+	public function get jsCallName_retrieveImages():String
+	{
+		return _retrieveImagesCall;
+	}
+
+	public function set jsCallName_retrieveImages(name:String):Void 
+	{
+		_retrieveImagesCall = name;
+	}
+	
+	public function get jsCallName_retrieveTitles():String
+	{
+		return _retrieveTitlesCall;
+	}
+
+	public function set jsCallName_retrieveTitles(name:String):Void 
+	{
+		_retrieveTitlesCall = name;
+	}
+	
+	public function get jsCallName_retrieveIndex():String
+	{
+		return _retrieveIndexCall;
+	}
+
+	public function set jsCallName_retrieveIndex(name:String):Void 
+	{
+		_retrieveIndexCall = name;
+	}
+	
+	public function get jsCallName_gotoIndex():String
+	{
+		return _gotoIndexCall;
+	}
+	
+	public function set jsCallName_gotoIndex(name:String):Void 
+	{
+		_gotoIndexCall = name;
+	}
+	
+	public function get startIndex():Number
+	{
+		return _startIndex;
+	}
+	
+	public function set startIndex(startIndex:Number):Number
+	{
+		_startIndex = startIndex;
+	}
+	
+	public function get rotation()
+	{
+		return _rotation;
+	}
+	
+	public function set rotation(r:Boolean)
+	{
+		_rotation = r;
+	}
 }
\ No newline at end of file
Index: src/ch/liip/yacc/io/XMLoader.as
===================================================================
--- src/ch/liip/yacc/io/XMLoader.as	(revision 339)
+++ src/ch/liip/yacc/io/XMLoader.as	(working copy)
@@ -1,366 +1,370 @@
-import netTrekLIBs.events.types.Event;
-import netTrekLIBs.utils.Delegate;
-
-import it.sephiroth.XML2Object;
-
-import ch.liip.yacc.io.ClipHandler;
-import ch.liip.yacc.io.data.objects.SettingsData;
-
-/**
- * @author Sandro Ducceschi [Liip AG, Switzerland]
- */
- 
-class ch.liip.yacc.io.XMLoader extends ClipHandler 
-{
-    //-----//------------------------ properties
-    
-	public static var EVENT_LOADED:String  = "xml_loaded";
-    public var CLASS_NAME:String = "XMLoader()";
-    
-	private var __xml:XML;
-	private var __xmlSource:XML;
-	private var __file:String;
-	private var __images:Array;
-	private var __titles:Array;
-	private var __settings : SettingsData;
-	private var __defaultPic:String;
-	private var __animStart:String;
-	private var __animStartParams:Array;
-	private var __animStartData:Array;
-	private var __animEnd:String;
-	private var __animEndParams:Array;
-	private var __animEndData:Array;
-	private var __onClick:String;
-	private var __onClickParams:Array;
-	private var __onClickData:Array;
-	private var __jsRetrieveElementParams:Array;
-	private var __jsRetrieveElementData:Array;
-	//-----//------------------------ -----------------   -     -     -
-	
-	//---------------------------------------------------------------------------------------------------------------------------
-	// CONSTRUCTOR
-	//---------------------------------------------------------------------------------------------------------------------------
-	public function XMLoader()
-	{
-		super.init();
-	}
-	
-	//---------------------------------------------------------------------------------------------------------------------------
-	// INITIALIZE
-	//---------------------------------------------------------------------------------------------------------------------------
-	private function init():Void
-	{
-		log("initializing");
-	}
-	
-	//---------------------------------------------------------------------------------------------------------------------------
-	// METHODS
-	//---------------------------------------------------------------------------------------------------------------------------
-	public function loadXML(file:String):Void
-	{
-		if(file == undefined)
-		{
-			log("no xml passed");
-		}
-		else
-		{
-			__xml = new XML();
-			__xml.load(file);
-			__xml.onLoad = Delegate.create(this,processXML);
-		}
-	}
-	
-	private function processXML():Void
-	{
-		var xml_loader:XML2Object = new XML2Object();
-		var xmlObj:Object = xml_loader.parseXML(__xml);
-		__xmlSource = __xml;
-
-		//populate the defaultImage Information
-		__defaultPic = xmlObj.yacc.defaultImage.data;
-		
-		// parse and set the Configuration
-		__settings = new SettingsData();
-		__settings.visiblePlanes = parseFloat(xmlObj.yacc.visiblePlanes.data);
-		__settings.horizontalSpacing = parseFloat(xmlObj.yacc.horizontalSpacing.data);
-		__settings.depthSpacing = parseFloat(xmlObj.yacc.depthSpacing.data);
-		__settings.degreeSteps = parseFloat(xmlObj.yacc.degreeSteps.data);
-		__settings.easingTime = parseFloat(xmlObj.yacc.easingTime.data);
-		__settings.defaultScale = parseFloat(xmlObj.yacc.defaultScale.data);
-		__settings.highlightScale = parseFloat(xmlObj.yacc.highlightScale.data);
-		__settings.shadowAlpha = parseFloat(xmlObj.yacc.shadowAlpha.data);
-    	__settings.shadowColor = xmlObj.yacc.shadowColor.data.substr(1);
-    	__settings.shadowSize = parseFloat(xmlObj.yacc.shadowSize.data);
-    	__settings.shadowStrength = parseFloat(xmlObj.yacc.shadowStrength.data);
-    	__settings.highlightColor = xmlObj.yacc.highlightColor.data.substr(1);
-    	__settings.highlightStrength = parseFloat(xmlObj.yacc.highlightStrength.data);
-    	__settings.highlightSize = parseFloat(xmlObj.yacc.highlightSize.data);
-    	__settings.initialCompleteCall = (xmlObj.yacc.initialCompleteCall.data == "false") ? false : true;
-    	__settings.preloadAmount = parseFloat(xmlObj.yacc._preloadAmount.data);
-    	__settings.jsCallName_gotoIndex = xmlObj.yacc.jsGotoCover.name.data;
-    	__settings.jsCallName_retrieveImages = xmlObj.yacc.jsRetrieveImagesArray.name.data;
-    	__settings.jsCallName_retrieveTitles = xmlObj.yacc.jsRetrieveTitlesArray.name.data;
-		__settings.jsCallName_retrieveXML = xmlObj.yacc.jsRetrieveXML.name.data;	
-		__settings.jsCallName_retrieveIndex = xmlObj.yacc.jsRetrieveElement.name.data;	
-
-		// create the jsCallName_retrieveIndex Array ---------------------------------------
-		var jsRetrieveElement:Object = xmlObj.yacc.jsRetrieveElement;
-		__animStart = jsRetrieveElement.name.data;
-		//log("jsAnimationStart Function: "+__animStart);
-		__jsRetrieveElementParams = [];
-			
-			// create it's parameters
-			if(jsRetrieveElement.param.length == undefined)
-			{
-				__jsRetrieveElementParams.push(jsRetrieveElement.param.data);
-			}
-			else 
-			{
-				for(var i = 0; i<jsRetrieveElement.param.length; i++)
-				{
-					__jsRetrieveElementParams.push(jsRetrieveElement.param[i].data);
-				}
-			}
-			//log("jsRetrieveElementsParams: "+__animStartParams);
-		// ----------------------------------------------------------------------------
-		
-		// create the jsAnimationStart Function Parameter Array--------------------------
-		var jsAnimationInit : Object = xmlObj.yacc.jsAnimationInit;
-		__animStart = jsAnimationInit.name.data;
-		//log("jsAnimationStart Function: "+__animStart);
-		__animStartParams = [];
-			
-			// create it's parameters
-			if(jsAnimationInit.param.length == undefined)
-			{
-				__animStartParams.push(jsAnimationInit.param.data);
-			}
-			else 
-			{
-				for(var i = 0; i<jsAnimationInit.param.length; i++)
-				{
-					__animStartParams.push(jsAnimationInit.param[i].data);
-				}
-			}
-			//log("jsAnimationInit Params: "+__animStartParams);
-		// ----------------------------------------------------------------------------
-
-		// create the jsAnimationEnd Function Parameter Array--------------------------
-		var jsAnimationComplete : Object = xmlObj.yacc.jsAnimationComplete;
-		__animEnd = jsAnimationComplete.name.data;
-		//log("jsAnimationEnd Function: "+__animEnd);
-		__animEndParams = [];
-			
-			// create it's parameters
-			if(jsAnimationComplete.param.length == undefined)
-			{
-				__animEndParams.push(jsAnimationComplete.param.data);
-			}
-			else 
-			{
-				for(var i:Number = 0; i<jsAnimationComplete.param.length; i++) 
-				{
-					__animEndParams.push(jsAnimationComplete.param[i].data);
-				}
-			}
-			//log("jsAnimationComplete Params: "+__animEndParams);
-		// ----------------------------------------------------------------------------
-		
-		// create the jsOnClick Function Parameter Array-------------------------------
-		var jsOnClick : Object = xmlObj.yacc.jsOnClick;
-		__onClick = jsOnClick.name.data;
-		//log("jsOnClick Function: "+__onClick);
-		__onClickParams = [];
-			
-			// create it's parameters
-			if(jsOnClick.param.length == undefined)
-			{
-				__onClickParams.push(jsOnClick.param.data);
-			}
-			else
-			{
-				for(var i:Number = 0; i<jsOnClick.param.length; i++)
-				{
-					__onClickParams.push(jsOnClick.param[i].data);
-				}
-			}
-			//log("jsOnClick Params: "+__onClickParams);
-		// ----------------------------------------------------------------------------
-		
-		// get the cover images and movie title
-		var covers:Object = xmlObj.yacc.covers.cover;
-		var obj:Object = {};
-		
-		__images = [];
-		__titles = [];
-		__onClickData = [];
-		__animStartData = [];
-		__animEndData = [];
-		__jsRetrieveElementData = [];
-		
-		if(covers.title.data != undefined)
-		{
-			if(covers.image.data == undefined)
-			{
-				__images.push(__defaultPic);
-			}
-			else 
-			{
-				__images.push(covers.image.data);
-		 	};
-		 	__titles.push(covers.title.data);
-		 	
-		 	// generate __jsRetrieveElement Calls Data Array---------------------------
-		 	obj = {};
-		 	for(var a:Number = 0;a < __jsRetrieveElementParams.length; a++)
-		 	{
-		 		obj[__jsRetrieveElementParams[a]] = covers[__jsRetrieveElementParams[a]].data;
-		 	}
-		 	__jsRetrieveElementData.push(obj);
-		 	//-------------------------------------------------------------------------
-		 	
-		 	// generate onAnimStart Calls Data Array-----------------------------------
-		 	obj = {};
-		 	for(var b:Number = 0;b < __animStartParams.length; b++)
-		 	{
-		 		obj[__animStartParams[b]] = covers[__animStartParams[b]].data;
-		 	}
-		 	__animStartData.push(obj);
-		 	//------------------------------------------------------------------------
-		 	
-		 	// generate onAnimEnd Calls Data Array------------------------------------
-		 	obj = {};
-		 	for(var c:Number = 0;c < __animEndParams.length; c++)
-		 	{
-		 		obj[__animEndParams[c]] =  covers[__animEndParams[c]].data;
-		 	}
-			__animEndData.push(obj);
-		 	//----------------------------------------------------------------------
-		 	
-		 	// generate onClick Calls Data Array------------------------------------
-		 	obj = {};
-		 	for(var a:Number = 0; a < __onClickParams.length; a++)
-		 	{
-		 		obj[__onClickParams[a]] = covers[__onClickParams[a]].data;
-		 	}
-		 	__onClickData.push(obj);
-		 	//----------------------------------------------------------------------
-		}
-		else 
-		{
-			for(var i in covers)
-			{
-				if(covers[i].image.data == undefined)
-				{
-					__images.push(__defaultPic);
-				}
-				else 
-				{
-					__images.push(covers[i].image.data);
-			 	};
-			 	__titles.push(covers[i].title.data);
-			 	
-			 	// generate __jsRetrieveElement Calls Data Array---------------------------
-			 	obj = {};
-			 	for(var a:Number = 0;a < __jsRetrieveElementParams.length; a++)
-			 	{
-			 		obj[__jsRetrieveElementParams[a]] = covers[i][__jsRetrieveElementParams[a]].data;
-			 	}
-			 	__jsRetrieveElementData.push(obj);
-			 	//-------------------------------------------------------------------------
-			 	
-			 	// generate onAnimStart Calls Data Array-----------------------------------
-			 	obj = {};
-			 	for(var b:Number = 0;b < __animStartParams.length; b++)
-			 	{
-			 		obj[__animStartParams[b]] = covers[i][__animStartParams[b]].data;
-			 	}
-			 	__animStartData.push(obj);
-			 	//-------------------------------------------------------------------------
-			 	
-			 	// generate onAnimEnd Calls Data Array-------------------------------------
-			 	obj = {};
-			 	for(var c:Number = 0;c < __animEndParams.length; c++)
-			 	{
-			 		obj[__animEndParams[c]] =  covers[i][__animEndParams[c]].data;
-			 	}
-				__animEndData.push(obj);
-			 	//------------------------------------------------------------------------
-			 	
-			 	// generate onClick Calls Data Array--------------------------------------
-			 	obj = {};
-			 	for(var a:Number = 0; a < __onClickParams.length; a++)
-			 	{
-			 		obj[__onClickParams[a]] = covers[i][__onClickParams[a]].data;
-			 	}
-			 	__onClickData.push(obj);
-			 	//----------------------------------------------------------------------
-			}
-			__titles.reverse();
-			__images.reverse();
-			__onClickData.reverse();
-			__animEndData.reverse();
-			__animStartData.reverse();
-			__jsRetrieveElementData.reverse();
-		}
-		log("XML loaded");
-		dispatchEvent(new Event(EVENT_LOADED,this,null,null));
-	}
-	//---------------------------------------------------------------------------------------------------------------------------
-	// GETTER/SETTER
-	//---------------------------------------------------------------------------------------------------------------------------
-	public function get settings() : SettingsData 
-	{
-		return __settings;
-	}
-
-	public function get onClickFunc():String
-	{
-		return __onClick;
-	}
-
-	public function get onAnimStartFunc():String
-	{
-		return __animStart;
-	}
-	
-	public function get onAnimEndFunc():String
-	{
-		return __animEnd;
-	}
-
-	public function get onClickData():Array
-	{
-		return __onClickData;
-	}
-	
-	public function get jsRetrieveElement():Array
-	{
-		return __jsRetrieveElementData;
-	}
-
-	public function get onAnimStartData():Array
-	{
-		return __animStartData;
-	}
-
-	public function get onAnimEndData():Array
-	{
-		return __animEndData;
-	}
-
-	public function get imageArray():Array
-	{
-		return __images;
-	}
-	
-	public function get titleArray():Array
-	{
-		return __titles;
-	}
-	
-	public function get source():XML
-	{
-		return __xmlSource;
-	}
+﻿import netTrekLIBs.events.types.Event;
+import netTrekLIBs.utils.Delegate;
+
+import it.sephiroth.XML2Object;
+
+import ch.liip.yacc.io.ClipHandler;
+import ch.liip.yacc.io.data.objects.SettingsData;
+
+/**
+ * @author Sandro Ducceschi [Liip AG, Switzerland]
+ */
+ 
+class ch.liip.yacc.io.XMLoader extends ClipHandler 
+{
+    //-----//------------------------ properties
+    
+	public static var EVENT_LOADED:String  = "xml_loaded";
+    public var CLASS_NAME:String = "XMLoader()";
+    
+	private var __xml:XML;
+	private var __xmlSource:XML;
+	private var __file:String;
+	private var __images:Array;
+	private var __titles:Array;
+	private var __settings : SettingsData;
+	private var __defaultPic:String;
+	private var __animStart:String;
+	private var __animStartParams:Array;
+	private var __animStartData:Array;
+	private var __animEnd:String;
+	private var __animEndParams:Array;
+	private var __animEndData:Array;
+	private var __onClick:String;
+	private var __onClickParams:Array;
+	private var __onClickData:Array;
+	private var __jsRetrieveElementParams:Array;
+	private var __jsRetrieveElementData:Array;
+	//-----//------------------------ -----------------   -     -     -
+	
+	//---------------------------------------------------------------------------------------------------------------------------
+	// CONSTRUCTOR
+	//---------------------------------------------------------------------------------------------------------------------------
+	public function XMLoader()
+	{
+		super.init();
+	}
+	
+	//---------------------------------------------------------------------------------------------------------------------------
+	// INITIALIZE
+	//---------------------------------------------------------------------------------------------------------------------------
+	private function init():Void
+	{
+		log("initializing");
+	}
+	
+	//---------------------------------------------------------------------------------------------------------------------------
+	// METHODS
+	//---------------------------------------------------------------------------------------------------------------------------
+	public function loadXML(file:String):Void
+	{
+		if(file == undefined)
+		{
+			log("no xml passed");
+		}
+		else
+		{
+			__xml = new XML();
+			__xml.load(file);
+			__xml.onLoad = Delegate.create(this,processXML);
+		}
+	}
+	
+	private function processXML():Void
+	{
+		var xml_loader:XML2Object = new XML2Object();
+		var xmlObj:Object = xml_loader.parseXML(__xml);
+		__xmlSource = __xml;
+
+		//populate the defaultImage Information
+		__defaultPic = xmlObj.yacc.defaultImage.data;
+		
+		// parse and set the Configuration
+		__settings = new SettingsData();
+		__settings.visiblePlanes = parseFloat(xmlObj.yacc.visiblePlanes.data);
+		__settings.horizontalSpacing = parseFloat(xmlObj.yacc.horizontalSpacing.data);
+		__settings.depthSpacing = parseFloat(xmlObj.yacc.depthSpacing.data);
+		__settings.degreeSteps = parseFloat(xmlObj.yacc.degreeSteps.data);
+		__settings.easingTime = parseFloat(xmlObj.yacc.easingTime.data);
+		__settings.defaultScale = parseFloat(xmlObj.yacc.defaultScale.data);
+		__settings.highlightScale = parseFloat(xmlObj.yacc.highlightScale.data);
+		__settings.shadowAlpha = parseFloat(xmlObj.yacc.shadowAlpha.data);
+    	__settings.shadowColor = xmlObj.yacc.shadowColor.data.substr(1);
+    	__settings.shadowSize = parseFloat(xmlObj.yacc.shadowSize.data);
+    	__settings.shadowStrength = parseFloat(xmlObj.yacc.shadowStrength.data);
+    	__settings.highlightColor = xmlObj.yacc.highlightColor.data.substr(1);
+    	__settings.highlightStrength = parseFloat(xmlObj.yacc.highlightStrength.data);
+    	__settings.highlightSize = parseFloat(xmlObj.yacc.highlightSize.data);
+    	__settings.initialCompleteCall = (xmlObj.yacc.initialCompleteCall.data == "false") ? false : true;
+    	__settings.preloadAmount = parseFloat(xmlObj.yacc._preloadAmount.data);
+    	__settings.jsCallName_gotoIndex = xmlObj.yacc.jsGotoCover.name.data;
+    	__settings.jsCallName_retrieveImages = xmlObj.yacc.jsRetrieveImagesArray.name.data;
+    	__settings.jsCallName_retrieveTitles = xmlObj.yacc.jsRetrieveTitlesArray.name.data;
+		__settings.jsCallName_retrieveXML = xmlObj.yacc.jsRetrieveXML.name.data;	
+		__settings.jsCallName_retrieveIndex = xmlObj.yacc.jsRetrieveElement.name.data;	
+		
+		var maxIdx = (xmlObj.yacc.covers.cover.length - 1);
+		__settings.startIndex = (xmlObj.yacc.startIndex.data == 'center' ? Math.floor((__settings.visiblePlanes-1)/2) : Math.max(0, Math.min(parseInt(xmlObj.yacc.startIndex.data), maxIdx)));
+		__settings.rotation = (xmlObj.yacc.rotation.data == "false") ? false : true;
+
+		// create the jsCallName_retrieveIndex Array ---------------------------------------
+		var jsRetrieveElement:Object = xmlObj.yacc.jsRetrieveElement;
+		__animStart = jsRetrieveElement.name.data;
+		//log("jsAnimationStart Function: "+__animStart);
+		__jsRetrieveElementParams = [];
+			
+			// create it's parameters
+			if(jsRetrieveElement.param.length == undefined)
+			{
+				__jsRetrieveElementParams.push(jsRetrieveElement.param.data);
+			}
+			else 
+			{
+				for(var i = 0; i<jsRetrieveElement.param.length; i++)
+				{
+					__jsRetrieveElementParams.push(jsRetrieveElement.param[i].data);
+				}
+			}
+			//log("jsRetrieveElementsParams: "+__animStartParams);
+		// ----------------------------------------------------------------------------
+		
+		// create the jsAnimationStart Function Parameter Array--------------------------
+		var jsAnimationInit : Object = xmlObj.yacc.jsAnimationInit;
+		__animStart = jsAnimationInit.name.data;
+		//log("jsAnimationStart Function: "+__animStart);
+		__animStartParams = [];
+			
+			// create it's parameters
+			if(jsAnimationInit.param.length == undefined)
+			{
+				__animStartParams.push(jsAnimationInit.param.data);
+			}
+			else 
+			{
+				for(var i = 0; i<jsAnimationInit.param.length; i++)
+				{
+					__animStartParams.push(jsAnimationInit.param[i].data);
+				}
+			}
+			//log("jsAnimationInit Params: "+__animStartParams);
+		// ----------------------------------------------------------------------------
+
+		// create the jsAnimationEnd Function Parameter Array--------------------------
+		var jsAnimationComplete : Object = xmlObj.yacc.jsAnimationComplete;
+		__animEnd = jsAnimationComplete.name.data;
+		//log("jsAnimationEnd Function: "+__animEnd);
+		__animEndParams = [];
+			
+			// create it's parameters
+			if(jsAnimationComplete.param.length == undefined)
+			{
+				__animEndParams.push(jsAnimationComplete.param.data);
+			}
+			else 
+			{
+				for(var i:Number = 0; i<jsAnimationComplete.param.length; i++) 
+				{
+					__animEndParams.push(jsAnimationComplete.param[i].data);
+				}
+			}
+			//log("jsAnimationComplete Params: "+__animEndParams);
+		// ----------------------------------------------------------------------------
+		
+		// create the jsOnClick Function Parameter Array-------------------------------
+		var jsOnClick : Object = xmlObj.yacc.jsOnClick;
+		__onClick = jsOnClick.name.data;
+		//log("jsOnClick Function: "+__onClick);
+		__onClickParams = [];
+			
+			// create it's parameters
+			if(jsOnClick.param.length == undefined)
+			{
+				__onClickParams.push(jsOnClick.param.data);
+			}
+			else
+			{
+				for(var i:Number = 0; i<jsOnClick.param.length; i++)
+				{
+					__onClickParams.push(jsOnClick.param[i].data);
+				}
+			}
+			//log("jsOnClick Params: "+__onClickParams);
+		// ----------------------------------------------------------------------------
+		
+		// get the cover images and movie title
+		var covers:Object = xmlObj.yacc.covers.cover;
+		var obj:Object = {};
+		
+		__images = [];
+		__titles = [];
+		__onClickData = [];
+		__animStartData = [];
+		__animEndData = [];
+		__jsRetrieveElementData = [];
+		
+		if(covers.title.data != undefined)
+		{
+			if(covers.image.data == undefined)
+			{
+				__images.push(__defaultPic);
+			}
+			else 
+			{
+				__images.push(covers.image.data);
+		 	};
+		 	__titles.push(covers.title.data);
+		 	
+		 	// generate __jsRetrieveElement Calls Data Array---------------------------
+		 	obj = {};
+		 	for(var a:Number = 0;a < __jsRetrieveElementParams.length; a++)
+		 	{
+		 		obj[__jsRetrieveElementParams[a]] = covers[__jsRetrieveElementParams[a]].data;
+		 	}
+		 	__jsRetrieveElementData.push(obj);
+		 	//-------------------------------------------------------------------------
+		 	
+		 	// generate onAnimStart Calls Data Array-----------------------------------
+		 	obj = {};
+		 	for(var b:Number = 0;b < __animStartParams.length; b++)
+		 	{
+		 		obj[__animStartParams[b]] = covers[__animStartParams[b]].data;
+		 	}
+		 	__animStartData.push(obj);
+		 	//------------------------------------------------------------------------
+		 	
+		 	// generate onAnimEnd Calls Data Array------------------------------------
+		 	obj = {};
+		 	for(var c:Number = 0;c < __animEndParams.length; c++)
+		 	{
+		 		obj[__animEndParams[c]] =  covers[__animEndParams[c]].data;
+		 	}
+			__animEndData.push(obj);
+		 	//----------------------------------------------------------------------
+		 	
+		 	// generate onClick Calls Data Array------------------------------------
+		 	obj = {};
+		 	for(var a:Number = 0; a < __onClickParams.length; a++)
+		 	{
+		 		obj[__onClickParams[a]] = covers[__onClickParams[a]].data;
+		 	}
+		 	__onClickData.push(obj);
+		 	//----------------------------------------------------------------------
+		}
+		else 
+		{
+			for(var i in covers)
+			{
+				if(covers[i].image.data == undefined)
+				{
+					__images.push(__defaultPic);
+				}
+				else 
+				{
+					__images.push(covers[i].image.data);
+			 	};
+			 	__titles.push(covers[i].title.data);
+			 	
+			 	// generate __jsRetrieveElement Calls Data Array---------------------------
+			 	obj = {};
+			 	for(var a:Number = 0;a < __jsRetrieveElementParams.length; a++)
+			 	{
+			 		obj[__jsRetrieveElementParams[a]] = covers[i][__jsRetrieveElementParams[a]].data;
+			 	}
+			 	__jsRetrieveElementData.push(obj);
+			 	//-------------------------------------------------------------------------
+			 	
+			 	// generate onAnimStart Calls Data Array-----------------------------------
+			 	obj = {};
+			 	for(var b:Number = 0;b < __animStartParams.length; b++)
+			 	{
+			 		obj[__animStartParams[b]] = covers[i][__animStartParams[b]].data;
+			 	}
+			 	__animStartData.push(obj);
+			 	//-------------------------------------------------------------------------
+			 	
+			 	// generate onAnimEnd Calls Data Array-------------------------------------
+			 	obj = {};
+			 	for(var c:Number = 0;c < __animEndParams.length; c++)
+			 	{
+			 		obj[__animEndParams[c]] =  covers[i][__animEndParams[c]].data;
+			 	}
+				__animEndData.push(obj);
+			 	//------------------------------------------------------------------------
+			 	
+			 	// generate onClick Calls Data Array--------------------------------------
+			 	obj = {};
+			 	for(var a:Number = 0; a < __onClickParams.length; a++)
+			 	{
+			 		obj[__onClickParams[a]] = covers[i][__onClickParams[a]].data;
+			 	}
+			 	__onClickData.push(obj);
+			 	//----------------------------------------------------------------------
+			}
+			__titles.reverse();
+			__images.reverse();
+			__onClickData.reverse();
+			__animEndData.reverse();
+			__animStartData.reverse();
+			__jsRetrieveElementData.reverse();
+		}
+		log("XML loaded");
+		dispatchEvent(new Event(EVENT_LOADED,this,null,null));
+	}
+	//---------------------------------------------------------------------------------------------------------------------------
+	// GETTER/SETTER
+	//---------------------------------------------------------------------------------------------------------------------------
+	public function get settings() : SettingsData 
+	{
+		return __settings;
+	}
+
+	public function get onClickFunc():String
+	{
+		return __onClick;
+	}
+
+	public function get onAnimStartFunc():String
+	{
+		return __animStart;
+	}
+	
+	public function get onAnimEndFunc():String
+	{
+		return __animEnd;
+	}
+
+	public function get onClickData():Array
+	{
+		return __onClickData;
+	}
+	
+	public function get jsRetrieveElement():Array
+	{
+		return __jsRetrieveElementData;
+	}
+
+	public function get onAnimStartData():Array
+	{
+		return __animStartData;
+	}
+
+	public function get onAnimEndData():Array
+	{
+		return __animEndData;
+	}
+
+	public function get imageArray():Array
+	{
+		return __images;
+	}
+	
+	public function get titleArray():Array
+	{
+		return __titles;
+	}
+	
+	public function get source():XML
+	{
+		return __xmlSource;
+	}
 }
\ No newline at end of file

