Index: trunk/as3/com/jeroenwijering/views/ExternalView.as
===================================================================
--- trunk/as3/com/jeroenwijering/views/ExternalView.as (revision 1)
+++ trunk/as3/com/jeroenwijering/views/ExternalView.as (revision 3)
@@ -1,4 +1,4 @@
 /**
-* Interface for javascript interaction.
+* Interface for javascript interaction and IDE tracing.
 **/
 package com.jeroenwijering.views {
@@ -63,4 +63,5 @@
 			ExternalInterface.addCallback("addViewListener", addViewListener);
 			ExternalInterface.addCallback("sendEvent", view.sendEvent);
+			playerReady();
 		}
 	};
@@ -96,4 +97,5 @@
 		if(!dat) { dat = new Object(); }
 	 	dat.id = ExternalInterface.objectID;
+		dat.client = view.config['client'];
 		dat.version = view.config['version'];
 		for each (var itm in listeners) {
@@ -105,13 +107,36 @@
 
 
-	/** Return the config and javascript objects to callers. **/
-	public function getConfig():Object { return view.config; };
-	public function getPlaylist():Array { return view.playlist; };
+	/** Return the config and playlist objects to javascript. **/
+	public function getConfig():Object { 
+		return view.config; 
+	};
+	public function getPlaylist():Array {
+		return view.playlist;
+	};
+
+
+	/** Send a call to javascript that the player is ready. **/
+	private function playerReady() {
+		var dat = {
+			id:ExternalInterface.objectID,
+			client:view.config['client'],
+			version:view.config['version']
+		};
+		try { 
+			ExternalInterface.call("playerReady",dat);
+		} catch (err:Error) {}
+	};
 
 
 	/** Forward events to tracer and subscribers. **/
-	private function setController(evt:ControllerEvent) { forward('CONTROLLER',evt.type,evt.data); };
-	private function setModel(evt:ModelEvent) { forward('MODEL',evt.type,evt.data); };
-	private function setView(evt:ViewEvent) { forward('VIEW',evt.type,evt.data); };
+	private function setController(evt:ControllerEvent) {
+		forward('CONTROLLER',evt.type,evt.data);
+	};
+	private function setModel(evt:ModelEvent) {
+		forward('MODEL',evt.type,evt.data);
+	};
+	private function setView(evt:ViewEvent) {
+		forward('VIEW',evt.type,evt.data);
+	};
 
 
Index: trunk/as3/com/jeroenwijering/views/PlaylistButton.as
===================================================================
--- trunk/as3/com/jeroenwijering/views/PlaylistButton.as (revision 1)
+++ trunk/as3/com/jeroenwijering/views/PlaylistButton.as (revision 3)
@@ -35,5 +35,5 @@
 		buttonsize = back.width;
 		view = vie;
-		if(view) { 
+		if(view) {
 			resize(wid);
 			setElements(); 
Index: trunk/as3/com/jeroenwijering/views/RightclickView.as
===================================================================
--- trunk/as3/com/jeroenwijering/views/RightclickView.as (revision 1)
+++ trunk/as3/com/jeroenwijering/views/RightclickView.as (revision 3)
@@ -29,8 +29,9 @@
 		view.skin.contextMenu = context;
 		addItem('Toggle Playback Quality',qualityHandler);
-		if(view.config['fullscreen'] == true  && view.skin.stage.displayState != null) {
+		addItem('Toggle Captions Display',captionHandler);
+		if(view.config['fullscreen'] == true && view.skin.stage.displayState!=null) {
 			addItem('Toggle Fullscreen Mode',fullscreenHandler);
 		}
-		if(view.config['abouttext']) { 
+		if(view.config['abouttext']) {
 			addItem(view.config['abouttext'],aboutHandler);
 		} else {
@@ -61,4 +62,10 @@
 
 
+	/** Toggle the fullscreen mode. **/
+	private function captionHandler(evt:ContextMenuEvent) {
+		view.sendEvent('caption');
+	};
+
+
 	/** jump to the about page. **/
 	private function aboutHandler(evt:ContextMenuEvent) {
Index: trunk/as3/com/jeroenwijering/views/ControlbarView.as
===================================================================
--- trunk/as3/com/jeroenwijering/views/ControlbarView.as (revision 2)
+++ trunk/as3/com/jeroenwijering/views/ControlbarView.as (revision 3)
@@ -296,5 +296,5 @@
 		switch(evt.data.newstate) { 
 			case ModelStates.PLAYING:
-				if(view.config['controlbar'] == 'above') {
+				if(view.config['controlbar'] == 'over') {
 					hiding = setTimeout(moveTimeout,1000);
 					view.skin.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
@@ -305,5 +305,5 @@
 				break;
 			default: 
-				if(view.config['controlbar'] == 'above') {
+				if(view.config['controlbar'] == 'over') {
 					clearTimeout(hiding);
 					bar.visible = true;
Index: trunk/as3/com/jeroenwijering/views/DisplayView.as
===================================================================
--- trunk/as3/com/jeroenwijering/views/DisplayView.as (revision 1)
+++ trunk/as3/com/jeroenwijering/views/DisplayView.as (revision 3)
@@ -36,5 +36,4 @@
 		'bufferIcon',
 		'linkIcon',
-		'fullscreenIcon',
 		'muteIcon'
 	);
@@ -45,5 +44,4 @@
 		view = vie;
 		view.addControllerListener(ControllerEvent.ERROR,errorHandler);
-		view.addControllerListener(ControllerEvent.ITEM,itemHandler);
 		view.addControllerListener(ControllerEvent.MUTE,muteHandler);
 		view.addControllerListener(ControllerEvent.RESIZE,resizeHandler);
@@ -64,9 +62,5 @@
 	/** Receive buffer updates. **/
 	private function bufferHandler(evt:ModelEvent) {
-		if(evt.data.percentage == 0) {
-			display.bufferIcon.txt.text = "";
-		} else { 
-			display.bufferIcon.txt.text = Strings.zero(evt.data.percentage);
-		}
+		display.bufferIcon.txt.text = Strings.zero(evt.data.percentage);
 	};
 
@@ -87,24 +81,13 @@
 
 
-	/** Show a mute icon if playing. **/
-	private function itemHandler(evt:ControllerEvent) {
-		if(view.config['texts'] == true) {
-			display.texts.title.text = view.playlist[evt.data.index]['title'];
-			display.texts.author.text = view.playlist[evt.data.index]['author'];
-		} else {
-			display.texts.visible = false;
-		}
-	};
-
-
-	/** Logo loaded; now position it **/
+	/** Logo loaded; now position it. **/
 	private function logoHandler(evt:Event) {
 		if(margins[0] > margins[2]) { 
-			display.logo.x = display.back.width - margins[2] - display.logo.width;
+			display.logo.x = display.back.width- margins[2]-display.logo.width;
 		} else {
 			display.logo.x = margins[0];
 		}
 		if(margins[1] > margins[3]) {
-			display.logo.y = display.back.height - margins[3] - display.logo.height;
+			display.logo.y = display.back.height- margins[3]-display.logo.height;
 		} else {
 			display.logo.y = margins[1];
@@ -129,9 +112,6 @@
 		var wid = evt.data.width;
 		var hei = evt.data.height;
-		display.back.width = display.mediaMask.width = wid;
-		display.back.height = display.mediaMask.height =  hei;
-		if(view.config['texts']) { 
-			display.texts.back.width = display.texts.title.width = display.texts.author.width = wid;
-		}
+		display.back.width = display.masker.width = wid;
+		display.back.height = display.masker.height =  hei;
 		for(var i in ICONS) {
 			display[ICONS[i]].x = Math.round(wid/2);
@@ -161,6 +141,6 @@
 			display.logo.x,
 			display.logo.y,
-			display.back.width - display.logo.x - display.logo.width,
-			display.back.height - display.logo.y - display.logo.height
+			display.back.width-display.logo.x-display.logo.width,
+			display.back.height-display.logo.y-display.logo.height
 		);
 		loader = new Loader();
@@ -183,12 +163,5 @@
 			setIcon('bufferIcon');
 		} else {
-			if(view.config['playlist'] == 'above') {
-				setIcon();
-				return;
-			}
 			switch(view.config.displayclick) {
-				case 'fullscreen':
-					setIcon('fullscreenIcon');
-					break;
 				case 'play':
 					setIcon('playIcon');
Index: trunk/as3/com/jeroenwijering/views/KeyboardView.as
===================================================================
--- trunk/as3/com/jeroenwijering/views/KeyboardView.as (revision 1)
+++ trunk/as3/com/jeroenwijering/views/KeyboardView.as (revision 3)
@@ -26,4 +26,5 @@
 	/** Process keyboard events. **/
 	private function keyHandler(evt:KeyboardEvent) {
+		trace(evt.keyCode);
 		switch(evt.keyCode) {
 			case 37:
@@ -39,7 +40,4 @@
 				view.sendEvent('volume',view.config['volume']-10);
 				break;
-			case 80:
-				view.sendEvent('play');
-				break;
 			case 67:
 				view.sendEvent('caption');
@@ -54,4 +52,10 @@
 				view.sendEvent('mute');
 				break;
+			case 80:
+				view.sendEvent('play');
+				break;
+			case 81:
+				view.sendEvent('quality');
+				break;
 		}
 	};
Index: trunk/as3/com/jeroenwijering/views/PlaylistView.as
===================================================================
--- trunk/as3/com/jeroenwijering/views/PlaylistView.as (revision 1)
+++ trunk/as3/com/jeroenwijering/views/PlaylistView.as (revision 3)
@@ -7,5 +7,4 @@
 import com.jeroenwijering.events.*;
 import com.jeroenwijering.player.View;
-import com.jeroenwijering.views.PlaylistButton;
 import com.jeroenwijering.utils.Draw;
 import flash.display.MovieClip;
@@ -40,11 +39,9 @@
 		view.addControllerListener(ControllerEvent.PLAYLIST,playlistHandler);
 		view.addControllerListener(ControllerEvent.RESIZE,resizeHandler);
-		var btn = clip.scrollClip.getChildByName('button');
-		buttonsize = btn.height;
-		clip.scrollClip.removeChild(btn);
-		clip.scrollClip.mask = clip.scrollMask;
-		clip.scrollBar.buttonMode = true;
-		clip.scrollBar.mouseChildren = false;
-		clip.scrollBar.addEventListener(MouseEvent.MOUSE_DOWN,startHandler);
+		buttonsize = clip.scrollClip.getChildByName('button').height;
+		clip.list.mask = clip.scrollMask;
+		clip.slider.buttonMode = true;
+		clip.slider.mouseChildren = false;
+		clip.slider.addEventListener(MouseEvent.MOUSE_DOWN,startHandler);
 		view.skin.addEventListener(MouseEvent.MOUSE_UP,stopHandler);
 	};
@@ -71,5 +68,6 @@
 		for(var i=0; i<view.playlist.length; i++) {
 			if(clr) { 
-				var btn = new PlaylistButton(i,wid,view);
+				var btn = Draw.clone(clip.scrollClip.getChildByName('button')); 
+				// new PlaylistButton(i,wid,view);
 				clip.scrollClip.addChild(btn);
 				buttons.push(btn);
