Removed overly aggressive XSS check

Removed overly aggressive XSS check

--- src/flash/FlashMediaElement.as
+++ src/flash/FlashMediaElement.as
@@ -1,1031 +1,1031 @@
-package
-{
-	import flash.display.*;
-	import flash.events.*;
-	import flash.media.*;
-	import flash.net.*;
-	import flash.text.*;
-	import flash.system.*;
-
-	import flash.media.Video;
-	import flash.net.NetConnection;
-	import flash.net.NetStream;
-
-	import flash.geom.ColorTransform;
-
-	import flash.filters.DropShadowFilter;
-	import flash.utils.Timer;
-	import flash.external.ExternalInterface;
-	import flash.geom.Rectangle;
-
-	import htmlelements.IMediaElement;
-	import htmlelements.VideoElement;
-	import htmlelements.AudioElement;
-	import htmlelements.YouTubeElement;
-
-	public class FlashMediaElement extends MovieClip {
-
-		private var _mediaUrl:String;
-		private var _autoplay:Boolean;
-		private var _preload:String;
-		private var _debug:Boolean;
-		private var _isVideo:Boolean;
-		private var _video:DisplayObject;
-		private var _timerRate:Number;
-		private var _stageWidth:Number;
-		private var _stageHeight:Number;
-		private var _enableSmoothing:Boolean;
-		private var _allowedPluginDomain:String;
-		private var _isFullScreen:Boolean = false;
-		private var _startVolume:Number;
-		private var _controlStyle:String;
-		private var _autoHide:Boolean = true;
-		private var _streamer:String = "";
-		private var _enablePseudoStreaming:Boolean;
-		private var _pseudoStreamingStartQueryParam:String;
-
-		// native video size (from meta data)
-		private var _nativeVideoWidth:Number = 0;
-		private var _nativeVideoHeight:Number = 0;
-
-		// visual elements
-		private var _output:TextField;
-		private var _fullscreenButton:SimpleButton;
-
-		// media
-		private var _mediaElement:IMediaElement;
-
-		// connection to fullscreen
-		private var _connection:LocalConnection;
-		private var _connectionName:String;
-
-		//private var fullscreen_btn:SimpleButton;
-
-		// CONTROLS
-		private var _alwaysShowControls:Boolean;
-		private var _controlBar:MovieClip;
-		private var _controlBarBg:MovieClip;
-		private var _scrubBar:MovieClip;
-		private var _scrubTrack:MovieClip;
-		private var _scrubOverlay:MovieClip;
-		private var _scrubLoaded:MovieClip;
-		private var _hoverTime:MovieClip;
-		private var _hoverTimeText:TextField;
-		private var _playButton:SimpleButton;
-		private var _pauseButton:SimpleButton;
-		private var _duration:TextField;
-		private var _currentTime:TextField;
-		private var _fullscreenIcon:SimpleButton;
-		private var _volumeMuted:SimpleButton;
-		private var _volumeUnMuted:SimpleButton;
-		private var _scrubTrackColor:String;
-		private var _scrubBarColor:String;
-		private var _scrubLoadedColor:String;
-
-		// IDLE Timer for mouse for showing/hiding controls
-		private var _inactiveTime:int;
-        private var _timer:Timer;
-        private var _idleTime:int;
-        private var _isMouseActive:Boolean
-		private var _isOverStage:Boolean = false;
-
-		// security checkes
-		private var securityIssue:Boolean = false; // When SWF parameters contain illegal characters
-		private var directAccess:Boolean = false; // When SWF visited directly with no parameters (or when security issue detected)
-
-
-		public function FlashMediaElement() {
-
-			// show allow this player to be called from a different domain than the HTML page hosting the player
-			Security.allowDomain("*");
-
-			// check for security issues (borrowed from jPLayer)
-			checkFlashVars(loaderInfo.parameters);
-
-
-			// add debug output
-			_output = new TextField();
-			_output.textColor = 0xeeeeee;
-			_output.width = stage.stageWidth - 100;
-			_output.height = stage.stageHeight;
-			_output.multiline = true;
-			_output.wordWrap = true;
-			_output.border = false;
-			_output.filters = [new DropShadowFilter(1, 0x000000, 45, 1, 2, 2, 1)];
-
-			_output.text = "Initializing...\n";
-			addChild(_output);
-			_output.visible = securityIssue;
-
-			if (securityIssue) {
-				_output.text = "WARNING: Security issue detected. Player stopped.";
-				return;
-			}
-
-			// get parameters
-			var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
-			_mediaUrl = (params['file'] != undefined) ? String(params['file']) : "";
-			_autoplay = (params['autoplay'] != undefined) ? (String(params['autoplay']) == "true") : false;
-			_debug = (params['debug'] != undefined) ? (String(params['debug']) == "true") : false;
-			_isVideo = (params['isvideo'] != undefined) ? ((String(params['isvideo']) == "false") ? false : true  ) : true;
-			_timerRate = (params['timerrate'] != undefined) ? (parseInt(params['timerrate'], 10)) : 250;
-			_alwaysShowControls = (params['controls'] != undefined) ? (String(params['controls']) == "true") : false;
-			_enableSmoothing = (params['smoothing'] != undefined) ? (String(params['smoothing']) == "true") : false;
-			_startVolume = (params['startvolume'] != undefined) ? (parseFloat(params['startvolume'])) : 0.8;
-			_preload = (params['preload'] != undefined) ? params['preload'] : "none";
-			_controlStyle = (params['controlstyle'] != undefined) ? (String(params['controlstyle'])) : ""; // blank or "floating"
-			_autoHide = (params['autohide'] != undefined) ? (String(params['autohide'])) : true;
-			_scrubTrackColor = (params['scrubtrackcolor'] != undefined) ? (String(params['scrubtrackcolor'])) : "0x333333";
-			_scrubBarColor = (params['scrubbarcolor'] != undefined) ? (String(params['scrubbarcolor'])) : "0xefefef";
-			_scrubLoadedColor = (params['scrubloadedcolor'] != undefined) ? (String(params['scrubloadedcolor'])) : "0x3CACC8";
-			_enablePseudoStreaming = (params['pseudostreaming'] != undefined) ? (String(params['pseudostreaming']) == "true") : false;
-			_pseudoStreamingStartQueryParam = (params['pseudostreamstart'] != undefined) ? (String(params['pseudostreamstart'])) : "start";
-			_streamer = (params['flashstreamer'] != undefined) ? (String(params['flashstreamer'])) : "";
-
-			_output.visible = _debug;
-
-			if (isNaN(_timerRate))
-				_timerRate = 250;
-
-			// setup stage and player sizes/scales
-			stage.align = StageAlign.TOP_LEFT;
-			stage.scaleMode = StageScaleMode.NO_SCALE;
-			_stageWidth = stage.stageWidth;
-			_stageHeight = stage.stageHeight;
-
-			//_autoplay = true;
-			//_mediaUrl  = "http://mediafiles.dts.edu/chapel/mp4/20100609.mp4";
-			//_alwaysShowControls = true;
-			//_mediaUrl  = "../media/Parades-PastLives.mp3";
-			//_mediaUrl  = "../media/echo-hereweare.mp4";
-
-			//_mediaUrl = "http://video.ted.com/talks/podcast/AlGore_2006_480.mp4";
-			//_mediaUrl = "rtmp://stream2.france24.yacast.net/france24_live/en/f24_liveen";
-
-			//_mediaUrl = "http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0"; // hosea
-			//_mediaUrl = "http://www.youtube.com/watch?feature=player_embedded&v=m5VDDJlsD6I"; // railer with notes
-
-			//_alwaysShowControls = true;
-
-			//_debug=true;
-
-
-
-
-			// position and hide
-			_fullscreenButton = getChildByName("fullscreen_btn") as SimpleButton;
-			//_fullscreenButton.visible = false;
-			_fullscreenButton.alpha = 0;
-			_fullscreenButton.addEventListener(MouseEvent.CLICK, fullscreenClick, false);
-			_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width;
-			_fullscreenButton.y = stage.stageHeight - _fullscreenButton.height;
-
-
-			// create media element
-			if (_isVideo) {
-
-				if (_mediaUrl.indexOf("youtube.com") > -1 || _mediaUrl.indexOf("youtu.be") > -1) {
-
-					//Security.allowDomain("http://www.youtube.com");
-
-					_mediaElement = new YouTubeElement(this, _autoplay, _preload, _timerRate, _startVolume);
-					_video = (_mediaElement as YouTubeElement).player;
-
-					// these are set and then used once the player is loaded
-					(_mediaElement as YouTubeElement).initWidth = _stageWidth;
-					(_mediaElement as YouTubeElement).initHeight = _stageHeight;
-
-				} else {
-
-					_mediaElement = new VideoElement(this, _autoplay, _preload, _timerRate, _startVolume, _streamer);
-					_video = (_mediaElement as VideoElement).video;
-					_video.width = _stageWidth;
-					_video.height = _stageHeight;
-					(_video as Video).smoothing = _enableSmoothing;
-					(_mediaElement as VideoElement).setReference(this);
-					(_mediaElement as VideoElement).setPseudoStreaming(_enablePseudoStreaming);
-					(_mediaElement as VideoElement).setPseudoStreamingStartParam(_pseudoStreamingStartQueryParam);
-					//_video.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
-					addChild(_video);
-				}
-			} else {
-
-				//var player2:AudioDecoder = new com.automatastudios.audio.audiodecoder.AudioDecoder();
-				_mediaElement = new AudioElement(this, _autoplay, _preload, _timerRate, _startVolume);
-			}
-
-
-			// controls!
-			_controlBar = getChildByName("controls_mc") as MovieClip;
-			_controlBarBg = _controlBar.getChildByName("controls_bg_mc") as MovieClip;
-			_scrubTrack = _controlBar.getChildByName("scrubTrack") as MovieClip;
-			_scrubBar = _controlBar.getChildByName("scrubBar") as MovieClip;
-			_scrubOverlay = _controlBar.getChildByName("scrubOverlay") as MovieClip;
-			_scrubLoaded = _controlBar.getChildByName("scrubLoaded") as MovieClip;
-
-			_scrubOverlay.buttonMode = true;
-			_scrubOverlay.useHandCursor = true
-
-			applyColor(_scrubTrack, _scrubTrackColor);
-			applyColor(_scrubBar, _scrubBarColor);
-			applyColor(_scrubLoaded, _scrubLoadedColor);
-
-			_fullscreenIcon = _controlBar.getChildByName("fullscreenIcon") as SimpleButton;
-
-			// New fullscreenIcon for new fullscreen floating controls
-			//if(_alwaysShowControls && _controlStyle.toUpperCase()=="FLOATING") {
-				_fullscreenIcon.addEventListener(MouseEvent.CLICK, fullScreenIconClick, false);
-			//}
-
-			_volumeMuted = _controlBar.getChildByName("muted_mc") as SimpleButton;
-			_volumeUnMuted = _controlBar.getChildByName("unmuted_mc") as SimpleButton;
-
-			_volumeMuted.addEventListener(MouseEvent.CLICK, toggleVolume, false);
-			_volumeUnMuted.addEventListener(MouseEvent.CLICK, toggleVolume, false);
-
-			_playButton = _controlBar.getChildByName("play_btn") as SimpleButton;
-			_playButton.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
-				_mediaElement.play();
-			});
-			_pauseButton = _controlBar.getChildByName("pause_btn") as SimpleButton;
-			_pauseButton.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
-				_mediaElement.pause();
-			});
-			_pauseButton.visible = false;
-			_duration = _controlBar.getChildByName("duration_txt") as TextField;
-			_currentTime = _controlBar.getChildByName("currentTime_txt") as TextField;
-			_hoverTime = _controlBar.getChildByName("hoverTime") as MovieClip;
-			_hoverTimeText = _hoverTime.getChildByName("hoverTime_txt") as TextField;
-			_hoverTime.visible=false;
-			_hoverTime.y=(_hoverTime.height/2)+1;
-			_hoverTime.x=0;
-
-
-
-			// Add new timeline scrubber events
-			_scrubOverlay.addEventListener(MouseEvent.MOUSE_MOVE, scrubMove);
-			_scrubOverlay.addEventListener(MouseEvent.CLICK, scrubClick);
-			_scrubOverlay.addEventListener(MouseEvent.MOUSE_OVER, scrubOver);
-			_scrubOverlay.addEventListener(MouseEvent.MOUSE_OUT, scrubOut);
-
-			if (_autoHide) { // && _alwaysShowControls) {
-				// Add mouse activity for show/hide of controls
-				stage.addEventListener(Event.MOUSE_LEAVE, mouseActivityLeave);
-				stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseActivityMove);
-				_inactiveTime = 2500;
-				_timer = new Timer(_inactiveTime)
-				_timer.addEventListener(TimerEvent.TIMER, idleTimer);
-				_timer.start();
-				// set
-			}
-
-			if(_alwaysShowControls) {
-				if(_startVolume<=0) {
-					trace("INITIAL VOLUME: "+_startVolume+" MUTED");
-					_volumeMuted.visible=true;
-					_volumeUnMuted.visible=false;
-				} else {
-					trace("INITIAL VOLUME: "+_startVolume+" UNMUTED");
-					_volumeMuted.visible=false;
-					_volumeUnMuted.visible=true;
-				}
-			}
-
-			_controlBar.visible = _alwaysShowControls;
-
-			setControlDepth();
-
-			_output.appendText("stage: " + stage.stageWidth + "x" + stage.stageHeight + "\n");
-			_output.appendText("file: " + _mediaUrl + "\n");
-			_output.appendText("autoplay: " + _autoplay.toString() + "\n");
-			_output.appendText("preload: " + _preload.toString() + "\n");
-			_output.appendText("isvideo: " + _isVideo.toString() + "\n");
-			_output.appendText("smoothing: " + _enableSmoothing.toString() + "\n");
-			_output.appendText("timerrate: " + _timerRate.toString() + "\n");
-			_output.appendText("displayState: " +(stage.hasOwnProperty("displayState")).toString() + "\n");
-
-			// attach javascript
-			_output.appendText("ExternalInterface.available: " + ExternalInterface.available.toString() + "\n");
-			_output.appendText("ExternalInterface.objectID: " + ((ExternalInterface.objectID != null)? ExternalInterface.objectID.toString() : "null") + "\n");
-
-			if (_mediaUrl != "") {
-				_mediaElement.setSrc(_mediaUrl);
-			}
-
-			positionControls();
-
-			// Fire this once just to set the width on some dynamically sized scrub bar items;
-			_scrubBar.scaleX=0;
-			_scrubLoaded.scaleX=0;
-
-
-			if (ExternalInterface.available) { //  && !_alwaysShowControls
-
-				_output.appendText("Adding callbacks...\n");
-				try {
-					if (ExternalInterface.objectID != null && ExternalInterface.objectID.toString() != "") {
-
-						// add HTML media methods
-						ExternalInterface.addCallback("playMedia", playMedia);
-						ExternalInterface.addCallback("loadMedia", loadMedia);
-						ExternalInterface.addCallback("pauseMedia", pauseMedia);
-						ExternalInterface.addCallback("stopMedia", stopMedia);
-
-						ExternalInterface.addCallback("setSrc", setSrc);
-						ExternalInterface.addCallback("setCurrentTime", setCurrentTime);
-						ExternalInterface.addCallback("setVolume", setVolume);
-						ExternalInterface.addCallback("setMuted", setMuted);
-
-						ExternalInterface.addCallback("setFullscreen", setFullscreen);
-						ExternalInterface.addCallback("setVideoSize", setVideoSize);
-
-						ExternalInterface.addCallback("positionFullscreenButton", positionFullscreenButton);
-						ExternalInterface.addCallback("hideFullscreenButton", hideFullscreenButton);
-
-						// fire init method
-						ExternalInterface.call("mejs.MediaPluginBridge.initPlugin", ExternalInterface.objectID);
-					}
-
-					_output.appendText("Success...\n");
-
-				} catch (error:SecurityError) {
-					_output.appendText("A SecurityError occurred: " + error.message + "\n");
-				} catch (error:Error) {
-					_output.appendText("An Error occurred: " + error.message + "\n");
-				}
-
-			}
-
-			if (_preload != "none") {
-				_mediaElement.load();
-
-				if (_autoplay) {
-					_mediaElement.play();
-				}
-			} else if (_autoplay) {
-				_mediaElement.load();
-				_mediaElement.play();
-			}
-
-			// listen for resize
-			stage.addEventListener(Event.RESIZE, resizeHandler);
-
-			// send click events up to javascript
-			stage.addEventListener(MouseEvent.CLICK, stageClicked);
-
-			// resize
-			stage.addEventListener(FullScreenEvent.FULL_SCREEN, stageFullScreenChanged);
-		}
-
-		public function setControlDepth():void {
-			// put these on top
-			addChild(_output);
-			addChild(_controlBar);
-			addChild(_fullscreenButton);
-
-		}
-
-		// borrowed from jPLayer
-		// https://github.com/happyworm/jPlayer/blob/e8ca190f7f972a6a421cb95f09e138720e40ed6d/actionscript/Jplayer.as#L228
-		private function checkFlashVars(p:Object):void {
-			var i:Number = 0;
-			for each (var s:String in p) {
-				if (isIllegalChar(s)) {
-					securityIssue = true; // Illegal char found
-				}
-				i++;
-			}
-			if(i === 0 || securityIssue) {
-				directAccess = true;
-			}
-		}
-
-		private function isIllegalChar(s:String):Boolean {
-			var illegals:String = "' \" ( ) { } * + / \\ < > = document";
-			if(Boolean(s)) { // Otherwise exception if parameter null.
-				for each (var illegal:String in illegals.split(' ')) {
-					if(s.indexOf(illegal) >= 0) {
-						return true; // Illegal char found
-					}
-				}
-			}
-			return false;
-		}
-
-
-		// START: Controls and events
-		function mouseActivityMove(event:MouseEvent):void {
-
-			// if mouse is in the video area
-			if (_autoHide && (mouseX>=0 && mouseX<=stage.stageWidth) && (mouseY>=0 && mouseY<=stage.stageHeight)) {
-
-				// This could be move to a nice fade at some point...
-				_controlBar.visible = (_alwaysShowControls || _isFullScreen);
-				_isMouseActive = true;
-				_idleTime = 0;
-				_timer.reset();
-				_timer.start()
-			}
-		}
-
-		function mouseActivityLeave(event:Event):void {
-			if (_autoHide) {
-				_isOverStage = false;
-				// This could be move to a nice fade at some point...
-				_controlBar.visible = false;
-				_isMouseActive = false;
-				_idleTime = 0;
-				_timer.reset();
-				_timer.stop();
-			}
-		}
-
-		function idleTimer(event:TimerEvent):void    {
-
-			if (_autoHide) {
-				// This could be move to a nice fade at some point...
-				_controlBar.visible = false;
-				_isMouseActive = false;
-				_idleTime += _inactiveTime;
-				_idleTime = 0;
-				_timer.reset();
-				_timer.stop();
-			}
-		}
-
-
-		function scrubMove(event:MouseEvent):void {
-
-			//if (_alwaysShowControls) {
-				if (_hoverTime.visible) {
-					var seekBarPosition:Number =  ((event.localX / _scrubTrack.width) *_mediaElement.duration())*_scrubTrack.scaleX;
-					var hoverPos:Number = (seekBarPosition / _mediaElement.duration()) *_scrubTrack.scaleX;
-
-					if (_isFullScreen) {
-						_hoverTime.x=event.target.parent.mouseX;
-					} else {
-						_hoverTime.x=mouseX;
-					}
-					_hoverTime.y = _scrubBar.y - (_hoverTime.height/2);
-					_hoverTimeText.text = secondsToTimeCode(seekBarPosition);
-				}
-			//}
-			//trace(event);
-		}
-
-		function scrubOver(event:MouseEvent):void {
-			_hoverTime.y = _scrubBar.y-(_hoverTime.height/2)+1;
-			_hoverTime.visible = true;
-			trace(event);
-		}
-
-		function scrubOut(event:MouseEvent):void {
-			_hoverTime.y = _scrubBar.y+(_hoverTime.height/2)+1;
-			_hoverTime.visible = false;
-			//_hoverTime.x=0;
-			//trace(event);
-		}
-
-		function scrubClick(event:MouseEvent):void {
-			//trace(event);
-			var seekBarPosition:Number =  ((event.localX / _scrubTrack.width) *_mediaElement.duration())*_scrubTrack.scaleX;
-
-			var tmp:Number = (_mediaElement.currentTime()/_mediaElement.duration())*_scrubTrack.width;
-			var canSeekToPosition:Boolean = _scrubLoaded.scaleX > (seekBarPosition / _mediaElement.duration()) *_scrubTrack.scaleX;
-			//var canSeekToPosition:Boolean = true;
-
-			/*
-			amountLoaded = ns.bytesLoaded / ns.bytesTotal;
-			loader.loadbar._width = amountLoaded * 208.9;
-			loader.scrub._x = ns.time / duration * 208.9;
-			*/
-
-			trace("seekBarPosition:"+seekBarPosition, "CanSeekToPosition: "+canSeekToPosition);
-
-			if (seekBarPosition>0 && seekBarPosition<_mediaElement.duration() && canSeekToPosition) {
-					_mediaElement.setCurrentTime(seekBarPosition);
-			}
-		}
-
-		function toggleVolume(event:MouseEvent):void {
-			trace(event.currentTarget.name);
-			switch(event.currentTarget.name) {
-				case "muted_mc":
-					setMuted(false);
-					break;
-				case "unmuted_mc":
-					setMuted(true);
-					break;
-			}
-		}
-
-		function toggleVolumeIcons(volume:Number) {
-			if(volume<=0) {
-				_volumeMuted.visible = true;
-				_volumeUnMuted.visible = false;
-			} else {
-				_volumeMuted.visible = false;
-				_volumeUnMuted.visible = true;
-			}
-		}
-
-		public function positionControls(forced:Boolean=false) {
-
-
-			if ( _controlStyle.toUpperCase() == "FLOATING" && _isFullScreen) {
-
-				trace("CONTROLS: floating");
-				_hoverTime.y=(_hoverTime.height/2)+1;
-				_hoverTime.x=0;
-				_controlBarBg.width = 300;
-				_controlBarBg.height = 93;
-				//_controlBarBg.x = (stage.stageWidth/2) - (_controlBarBg.width/2);
-				//_controlBarBg.y  = stage.stageHeight - 300;
-
-				_pauseButton.scaleX = _playButton.scaleX=3.5;
-				_pauseButton.scaleY= _playButton.scaleY=3.5;
-				// center the play button and make it big and at the top
-				_pauseButton.x = _playButton.x = (_controlBarBg.width/2)-(_playButton.width/2)+7;
-				_pauseButton.y = _playButton.y = _controlBarBg.height-_playButton.height-(14)
-
-				_controlBar.x = (stage.stageWidth/2) -150;
-				_controlBar.y = stage.stageHeight - _controlBar.height-100;
-
-
-				// reposition the time and duration items
-
-				_duration.x = _controlBarBg.width - _duration.width - 10;
-				_duration.y = _controlBarBg.height - _duration.height -7;
-				//_currentTime.x = _controlBarBg.width - _duration.width - 10 - _currentTime.width - 10;
-				_currentTime.x = 5
-				_currentTime.y= _controlBarBg.height - _currentTime.height-7;
-
-				_fullscreenIcon.x = _controlBarBg.width - _fullscreenIcon.width - 7;
-				_fullscreenIcon.y = 7;
-
-				_volumeMuted.x = _volumeUnMuted.x = 7;
-				_volumeMuted.y = _volumeUnMuted.y = 7;
-
-				_scrubLoaded.x = _scrubBar.x = _scrubOverlay.x = _scrubTrack.x =_currentTime.x+_currentTime.width+7;
-				_scrubLoaded.y = _scrubBar.y = _scrubOverlay.y = _scrubTrack.y=_controlBarBg.height-_scrubTrack.height-10;
-
-				_scrubBar.width =  _scrubOverlay.width = _scrubTrack.width = (_duration.x-_duration.width-14);
-
-
-			} else {
-				trace("CONTROLS: normal, original");
-
-				/*
-				// Original style bottom display
-				_hoverTime.y=(_hoverTime.height/2)+1;
-				_hoverTime.x=0;
-				_controlBarBg.width = stage.stageWidth;
-				_controlBar.y = stage.stageHeight - _controlBar.height;
-				_duration.x = stage.stageWidth - _duration.width - 10;
-				//_currentTime.x = stage.stageWidth - _duration.width - 10 - _currentTime.width - 10;
-				_currentTime.x = _playButton.x+_playButton.width;
-				_scrubTrack.width = (_duration.x-_duration.width-10)-_duration.width+10;
-				_scrubOverlay.width = _scrubTrack.width;
-				_scrubBar.width = _scrubTrack.width;
-				*/
-
-				// FLOATING MODE BOTTOM DISPLAY - similar to normal
-				trace("THAT WAY!");
-				_hoverTime.y=(_hoverTime.height/2)+1;
-				_hoverTime.x=0;
-				_controlBarBg.width = stage.stageWidth;
-				_controlBarBg.height = 30;
-				_controlBarBg.y=0;
-				_controlBarBg.x=0;
-				// _controlBarBg.x = 0;
-				// _controlBarBg.y  = stage.stageHeight - _controlBar.height;
-
-				_pauseButton.scaleX = _playButton.scaleX=1;
-				_pauseButton.scaleY = _playButton.scaleY=1;
-
-				_pauseButton.x = _playButton.x = 7;
-				_pauseButton.y = _playButton.y = _controlBarBg.height-_playButton.height-2;
-
-
-				//_currentTime.x = stage.stageWidth - _duration.width - 10 - _currentTime.width - 10;
-				_currentTime.x = _playButton.x+_playButton.width;
-
-				_fullscreenIcon.x = _controlBarBg.width - _fullscreenIcon.width - 7;
-				_fullscreenIcon.y = 8;
-
-				_volumeMuted.x = _volumeUnMuted.x = _fullscreenIcon.x - _volumeMuted.width - 10;
-				_volumeMuted.y = _volumeUnMuted.y = 10;
-
-				_duration.x = _volumeMuted.x - _volumeMuted.width - _duration.width + 5;
-				_duration.y = _currentTime.y = _controlBarBg.height - _currentTime.height - 7;
-
-				_scrubLoaded.x = _scrubBar.x = _scrubOverlay.x = _scrubTrack.x = _currentTime.x + _currentTime.width + 10;
-				_scrubLoaded.y = _scrubBar.y = _scrubOverlay.y = _scrubTrack.y = _controlBarBg.height - _scrubTrack.height - 9;
-
-				_scrubBar.width =  _scrubOverlay.width = _scrubTrack.width =  (_duration.x-_duration.width-10)-_duration.width+5;
-				_controlBar.x = 0;
-				_controlBar.y = stage.stageHeight - _controlBar.height;
-
-			}
-
-		}
-
-		// END: Controls
-
-
-		function stageClicked(e:MouseEvent):void {
-			//_output.appendText("click: " + e.stageX.toString() +","+e.stageY.toString() + "\n");
-			if (e.target == stage) {
-				sendEvent("click", "");
-			}
-		}
-
-		function resizeHandler(e:Event):void {
-			//_video.scaleX = stage.stageWidth / _stageWidth;
-			//_video.scaleY = stage.stageHeight / _stageHeight;
-			//positionControls();
-
-			repositionVideo();
-		}
-
-		// START: Fullscreen
-		function enterFullscreen() {
-
-			_output.appendText("enterFullscreen()\n");
-
-			var screenRectangle:Rectangle = new Rectangle(0, 0, flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
-			stage.fullScreenSourceRect = screenRectangle;
-
-			stage.displayState = StageDisplayState.FULL_SCREEN;
-
-			repositionVideo(true);
-			positionControls();
-			updateControls(HtmlMediaEvent.FULLSCREENCHANGE);
-
-			_controlBar.visible = true;
-
-			_isFullScreen = true;
-		}
-
-		function exitFullscreen() {
-
-			stage.displayState = StageDisplayState.NORMAL;
-
-
-			_controlBar.visible = false;
-
-			_isFullScreen = false;
-		}
-
-		function setFullscreen(gofullscreen:Boolean) {
-
-			_output.appendText("setFullscreen: " + gofullscreen.toString() + "\n");
-
-			try {
-				//_fullscreenButton.visible = false;
-
-				if (gofullscreen) {
-					enterFullscreen();
-
-				} else {
-					exitFullscreen();
-				}
-
-			} catch (error:Error) {
-
-				// show the button when the security error doesn't let it work
-				//_fullscreenButton.visible = true;
-				_fullscreenButton.alpha = 1;
-
-				_isFullScreen = false;
-
-				_output.appendText("error setting fullscreen: " + error.message.toString() + "\n");
-			}
-		}
-
-		// control bar button/icon
-		function fullScreenIconClick(e:MouseEvent) {
-			try {
-				_controlBar.visible = true;
-				setFullscreen(!_isFullScreen);
-				repositionVideo(_isFullScreen);
-			} catch (error:Error) {
-			}
-		}
-
-		// special floating fullscreen icon
-		function fullscreenClick(e:MouseEvent) {
-			//_fullscreenButton.visible = false;
-			_fullscreenButton.alpha = 0
-
-			try {
-				_controlBar.visible = true;
-				setFullscreen(true);
-				repositionVideo(true);
-				positionControls();
-			} catch (error:Error) {
-			}
-		}
-
-
-		function stageFullScreenChanged(e:FullScreenEvent) {
-			_output.appendText("fullscreen event: " + e.fullScreen.toString() + "\n");
-
-			//_fullscreenButton.visible = false;
-			_fullscreenButton.alpha = 0;
-			_isFullScreen = e.fullScreen;
-
-			sendEvent(HtmlMediaEvent.FULLSCREENCHANGE, "isFullScreen:" + e.fullScreen );
-
-			if (!e.fullScreen) {
-				_controlBar.visible = _alwaysShowControls;
-			}
-		}
-		// END: Fullscreen
-
-		// START: external interface
-		function playMedia() {
-			_output.appendText("play\n");
-			_mediaElement.play();
-		}
-
-		function loadMedia() {
-			_output.appendText("load\n");
-			_mediaElement.load();
-		}
-
-		function pauseMedia() {
-			_output.appendText("pause\n");
-			_mediaElement.pause();
-		}
-
-		function setSrc(url:String) {
-			_output.appendText("setSrc: " + url + "\n");
-			_mediaElement.setSrc(url);
-		}
-
-		function stopMedia() {
-			_output.appendText("stop\n");
-			_mediaElement.stop();
-		}
-
-		function setCurrentTime(time:Number) {
-			_output.appendText("seek: " + time.toString() + "\n");
-			_mediaElement.setCurrentTime(time);
-		}
-
-		function setVolume(volume:Number) {
-			_output.appendText("volume: " + volume.toString() + "\n");
-			_mediaElement.setVolume(volume);
-			toggleVolumeIcons(volume);
-		}
-
-		function setMuted(muted:Boolean) {
-			_output.appendText("muted: " + muted.toString() + "\n");
-			_mediaElement.setMuted(muted);
-			toggleVolumeIcons(_mediaElement.getVolume());
-		}
-
-		function setVideoSize(width:Number, height:Number) {
-			_output.appendText("setVideoSize: " + width.toString() + "," + height.toString() + "\n");
-
-			_stageWidth = width;
-			_stageHeight = height;
-
-			if (_video != null) {
-				repositionVideo();
-				positionControls();
-				//_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width - 10;
-				_output.appendText("result: " + _video.width.toString() + "," + _video.height.toString() + "\n");
-			}
-
-
-		}
-
-		function positionFullscreenButton(x:Number, y:Number, visibleAndAbove:Boolean ) {
-
-			_output.appendText("position FS: " + x.toString() + "x" + y.toString() + "\n");
-
-			// bottom corner
-			/*
-			_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width
-			_fullscreenButton.y = stage.stageHeight - _fullscreenButton.height;
-			*/
-
-			// position just above
-			if (visibleAndAbove) {
-				_fullscreenButton.x = x+1;
-				_fullscreenButton.y = y - _fullscreenButton.height+1;
-			} else {
-				_fullscreenButton.x = x;
-				_fullscreenButton.y = y;
-			}
-
-			// check for oversizing
-			if ((_fullscreenButton.x + _fullscreenButton.width) > stage.stageWidth)
-				_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width;
-
-			// show it!
-			if (visibleAndAbove) {
-				_fullscreenButton.alpha = 1;
-			}
-		}
-
-		function hideFullscreenButton() {
-
-			//_fullscreenButton.visible = false;
-			_fullscreenButton.alpha = 0;
-		}
-
-		// END: external interface
-
-
-		function repositionVideo(fullscreen:Boolean = false):void {
-
-			_output.appendText("positioning video\n");
-
-			if (_mediaElement is VideoElement) {
-
-				if (isNaN(_nativeVideoWidth) || isNaN(_nativeVideoHeight) || _nativeVideoWidth <= 0 || _nativeVideoHeight <= 0) {
-					_output.appendText("ERR: I dont' have the native dimension\n");
-					return;
-				}
-
-				// calculate ratios
-				var stageRatio, nativeRatio;
-
-				_video.x = 0;
-				_video.y = 0;
-
-				if(fullscreen == true) {
-					stageRatio = flash.system.Capabilities.screenResolutionX/flash.system.Capabilities.screenResolutionY;
-					nativeRatio = _nativeVideoWidth/_nativeVideoHeight;
-
-					// adjust size and position
-					if (nativeRatio > stageRatio) {
-						_mediaElement.setSize(flash.system.Capabilities.screenResolutionX, _nativeVideoHeight * flash.system.Capabilities.screenResolutionX / _nativeVideoWidth);
-						_video.y = flash.system.Capabilities.screenResolutionY/2 - _video.height/2;
-					} else if (stageRatio > nativeRatio) {
-						_mediaElement.setSize(_nativeVideoWidth * flash.system.Capabilities.screenResolutionY / _nativeVideoHeight, flash.system.Capabilities.screenResolutionY);
-						_video.x = flash.system.Capabilities.screenResolutionX/2 - _video.width/2;
-					} else if (stageRatio == nativeRatio) {
-						_mediaElement.setSize(flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
-					}
-
-				} else {
-					stageRatio = _stageWidth/_stageHeight;
-					nativeRatio = _nativeVideoWidth/_nativeVideoHeight;
-
-
-					// adjust size and position
-					if (nativeRatio > stageRatio) {
-						_mediaElement.setSize(_stageWidth, _nativeVideoHeight * _stageWidth / _nativeVideoWidth);
-						_video.y = _stageHeight/2 - _video.height/2;
-					} else if (stageRatio > nativeRatio) {
-						_mediaElement.setSize( _nativeVideoWidth * _stageHeight / _nativeVideoHeight, _stageHeight);
-						_video.x = _stageWidth/2 - _video.width/2;
-					} else if (stageRatio == nativeRatio) {
-						_mediaElement.setSize(_stageWidth, _stageHeight);
-					}
-
-				}
-
-			} else if (_mediaElement is YouTubeElement) {
-				if(fullscreen == true) {
-					_mediaElement.setSize(flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
-
-				} else {
-					_mediaElement.setSize(_stageWidth, _stageHeight);
-
-				}
-
-			}
-
-			positionControls();
-		}
-
-		// SEND events to JavaScript
-		public function sendEvent(eventName:String, eventValues:String) {
-
-			// special video event
-			if (eventName == HtmlMediaEvent.LOADEDMETADATA && _isVideo) {
-
-				_output.appendText("METADATA RECEIVED: ");
-
-				try {
-					if (_mediaElement is VideoElement) {
-						_nativeVideoWidth = (_mediaElement as VideoElement).videoWidth;
-						_nativeVideoHeight = (_mediaElement as VideoElement).videoHeight;
-					}
-				} catch (e:Error) {
-					_output.appendText(e.toString() + "\n");
-				}
-
-				_output.appendText(_nativeVideoWidth.toString() + "x" + _nativeVideoHeight.toString() + "\n");
-
-
-				 if(stage.displayState == "fullScreen" ) {
-					setVideoSize(_nativeVideoWidth, _nativeVideoHeight);
-					repositionVideo(true);
-				 } else {
-					repositionVideo();
-				 }
-			}
-
-			updateControls(eventName);
-
-			//trace((_mediaElement.duration()*1).toString() + " / " + (_mediaElement.currentTime()*1).toString());
-			//trace("CurrentProgress:"+_mediaElement.currentProgress());
-
-			if (ExternalInterface.objectID != null && ExternalInterface.objectID.toString() != "") {
-
-				//_output.appendText("event:" + eventName + " : " + eventValues);
-				//trace("event", eventName, eventValues);
-
-				if (eventValues == null)
-					eventValues == "";
-
-				if (_isVideo) {
-					eventValues += (eventValues != "" ? "," : "") + "isFullScreen:" + _isFullScreen;
-				}
-
-				eventValues = "{" + eventValues + "}";
-
-				/*
-				OLD DIRECT METHOD
-				ExternalInterface.call(
-					"function(id, name) { mejs.MediaPluginBridge.fireEvent(id,name," + eventValues + "); }",
-					ExternalInterface.objectID,
-					eventName);
-				*/
-
-				// use set timeout for performance reasons
-				//if (!_alwaysShowControls) {
-					ExternalInterface.call("setTimeout", "mejs.MediaPluginBridge.fireEvent('" + ExternalInterface.objectID + "','" + eventName + "'," + eventValues + ")",0);
-				//}
-			}
-		}
-
-
-		function updateControls(eventName:String):void {
-
-			//trace("updating controls");
-
-			try {
-				// update controls
-				switch (eventName) {
-					case "pause":
-					case "paused":
-					case "ended":
-						_playButton.visible = true;
-						_pauseButton.visible = false;
-						break;
-					case "play":
-					case "playing":
-						_playButton.visible = false;
-						_pauseButton.visible = true;
-						break;
-				}
-
-				if (eventName == HtmlMediaEvent.TIMEUPDATE ||
-					eventName == HtmlMediaEvent.PROGRESS ||
-					eventName == HtmlMediaEvent.FULLSCREENCHANGE) {
-
-					//_duration.text = (_mediaElement.duration()*1).toString();
-					_duration.text =  secondsToTimeCode(_mediaElement.duration());
-					//_currentTime.text = (_mediaElement.currentTime()*1).toString();
-					_currentTime.text =  secondsToTimeCode(_mediaElement.currentTime());
-
-					var pct:Number =  (_mediaElement.currentTime() / _mediaElement.duration()) *_scrubTrack.scaleX;
-
-					_scrubBar.scaleX = pct;
-					_scrubLoaded.scaleX = (_mediaElement.currentProgress()*_scrubTrack.scaleX)/100;
-				}
-			} catch (error:Error) {
-				trace("error: " + error.toString());
-
-			}
-
-		}
-
-		// START: utility
-		function secondsToTimeCode(seconds:Number):String {
-			var timeCode:String = "";
-			seconds = Math.round(seconds);
-			var minutes:Number = Math.floor(seconds / 60);
-			timeCode = (minutes >= 10) ? minutes.toString() : "0" + minutes.toString();
-			seconds = Math.floor(seconds % 60);
-			timeCode += ":" + ((seconds >= 10) ? seconds.toString() : "0" + seconds.toString());
-			return timeCode; //minutes.toString() + ":" + seconds.toString();
-		}
-
-		function applyColor(item:Object, color:String):void {
-
-			var myColor:ColorTransform = item.transform.colorTransform;
-			myColor.color = Number(color);
-			item.transform.colorTransform = myColor;
-		}
-		// END: utility
-
-	}
-}
+package
+{
+	import flash.display.*;
+	import flash.events.*;
+	import flash.media.*;
+	import flash.net.*;
+	import flash.text.*;
+	import flash.system.*;
+
+	import flash.media.Video;
+	import flash.net.NetConnection;
+	import flash.net.NetStream;
+
+	import flash.geom.ColorTransform;
+
+	import flash.filters.DropShadowFilter;
+	import flash.utils.Timer;
+	import flash.external.ExternalInterface;
+	import flash.geom.Rectangle;
+
+	import htmlelements.IMediaElement;
+	import htmlelements.VideoElement;
+	import htmlelements.AudioElement;
+	import htmlelements.YouTubeElement;
+
+	public class FlashMediaElement extends MovieClip {
+
+		private var _mediaUrl:String;
+		private var _autoplay:Boolean;
+		private var _preload:String;
+		private var _debug:Boolean;
+		private var _isVideo:Boolean;
+		private var _video:DisplayObject;
+		private var _timerRate:Number;
+		private var _stageWidth:Number;
+		private var _stageHeight:Number;
+		private var _enableSmoothing:Boolean;
+		private var _allowedPluginDomain:String;
+		private var _isFullScreen:Boolean = false;
+		private var _startVolume:Number;
+		private var _controlStyle:String;
+		private var _autoHide:Boolean = true;
+		private var _streamer:String = "";
+		private var _enablePseudoStreaming:Boolean;
+		private var _pseudoStreamingStartQueryParam:String;
+
+		// native video size (from meta data)
+		private var _nativeVideoWidth:Number = 0;
+		private var _nativeVideoHeight:Number = 0;
+
+		// visual elements
+		private var _output:TextField;
+		private var _fullscreenButton:SimpleButton;
+
+		// media
+		private var _mediaElement:IMediaElement;
+
+		// connection to fullscreen
+		private var _connection:LocalConnection;
+		private var _connectionName:String;
+
+		//private var fullscreen_btn:SimpleButton;
+
+		// CONTROLS
+		private var _alwaysShowControls:Boolean;
+		private var _controlBar:MovieClip;
+		private var _controlBarBg:MovieClip;
+		private var _scrubBar:MovieClip;
+		private var _scrubTrack:MovieClip;
+		private var _scrubOverlay:MovieClip;
+		private var _scrubLoaded:MovieClip;
+		private var _hoverTime:MovieClip;
+		private var _hoverTimeText:TextField;
+		private var _playButton:SimpleButton;
+		private var _pauseButton:SimpleButton;
+		private var _duration:TextField;
+		private var _currentTime:TextField;
+		private var _fullscreenIcon:SimpleButton;
+		private var _volumeMuted:SimpleButton;
+		private var _volumeUnMuted:SimpleButton;
+		private var _scrubTrackColor:String;
+		private var _scrubBarColor:String;
+		private var _scrubLoadedColor:String;
+
+		// IDLE Timer for mouse for showing/hiding controls
+		private var _inactiveTime:int;
+        private var _timer:Timer;
+        private var _idleTime:int;
+        private var _isMouseActive:Boolean
+		private var _isOverStage:Boolean = false;
+
+		// security checkes
+		private var securityIssue:Boolean = false; // When SWF parameters contain illegal characters
+		private var directAccess:Boolean = false; // When SWF visited directly with no parameters (or when security issue detected)
+
+
+		public function FlashMediaElement() {
+
+			// show allow this player to be called from a different domain than the HTML page hosting the player
+			Security.allowDomain("*");
+
+			// check for security issues (borrowed from jPLayer)
+			checkFlashVars(loaderInfo.parameters);
+
+
+			// add debug output
+			_output = new TextField();
+			_output.textColor = 0xeeeeee;
+			_output.width = stage.stageWidth - 100;
+			_output.height = stage.stageHeight;
+			_output.multiline = true;
+			_output.wordWrap = true;
+			_output.border = false;
+			_output.filters = [new DropShadowFilter(1, 0x000000, 45, 1, 2, 2, 1)];
+
+			_output.text = "Initializing...\n";
+			addChild(_output);
+			_output.visible = securityIssue;
+
+			if (securityIssue) {
+				_output.text = "WARNING: Security issue detected. Player stopped.";
+				return;
+			}
+
+			// get parameters
+			var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
+			_mediaUrl = (params['file'] != undefined) ? String(params['file']) : "";
+			_autoplay = (params['autoplay'] != undefined) ? (String(params['autoplay']) == "true") : false;
+			_debug = (params['debug'] != undefined) ? (String(params['debug']) == "true") : false;
+			_isVideo = (params['isvideo'] != undefined) ? ((String(params['isvideo']) == "false") ? false : true  ) : true;
+			_timerRate = (params['timerrate'] != undefined) ? (parseInt(params['timerrate'], 10)) : 250;
+			_alwaysShowControls = (params['controls'] != undefined) ? (String(params['controls']) == "true") : false;
+			_enableSmoothing = (params['smoothing'] != undefined) ? (String(params['smoothing']) == "true") : false;
+			_startVolume = (params['startvolume'] != undefined) ? (parseFloat(params['startvolume'])) : 0.8;
+			_preload = (params['preload'] != undefined) ? params['preload'] : "none";
+			_controlStyle = (params['controlstyle'] != undefined) ? (String(params['controlstyle'])) : ""; // blank or "floating"
+			_autoHide = (params['autohide'] != undefined) ? (String(params['autohide'])) : true;
+			_scrubTrackColor = (params['scrubtrackcolor'] != undefined) ? (String(params['scrubtrackcolor'])) : "0x333333";
+			_scrubBarColor = (params['scrubbarcolor'] != undefined) ? (String(params['scrubbarcolor'])) : "0xefefef";
+			_scrubLoadedColor = (params['scrubloadedcolor'] != undefined) ? (String(params['scrubloadedcolor'])) : "0x3CACC8";
+			_enablePseudoStreaming = (params['pseudostreaming'] != undefined) ? (String(params['pseudostreaming']) == "true") : false;
+			_pseudoStreamingStartQueryParam = (params['pseudostreamstart'] != undefined) ? (String(params['pseudostreamstart'])) : "start";
+			_streamer = (params['flashstreamer'] != undefined) ? (String(params['flashstreamer'])) : "";
+
+			_output.visible = _debug;
+
+			if (isNaN(_timerRate))
+				_timerRate = 250;
+
+			// setup stage and player sizes/scales
+			stage.align = StageAlign.TOP_LEFT;
+			stage.scaleMode = StageScaleMode.NO_SCALE;
+			_stageWidth = stage.stageWidth;
+			_stageHeight = stage.stageHeight;
+
+			//_autoplay = true;
+			//_mediaUrl  = "http://mediafiles.dts.edu/chapel/mp4/20100609.mp4";
+			//_alwaysShowControls = true;
+			//_mediaUrl  = "../media/Parades-PastLives.mp3";
+			//_mediaUrl  = "../media/echo-hereweare.mp4";
+
+			//_mediaUrl = "http://video.ted.com/talks/podcast/AlGore_2006_480.mp4";
+			//_mediaUrl = "rtmp://stream2.france24.yacast.net/france24_live/en/f24_liveen";
+
+			//_mediaUrl = "http://www.youtube.com/watch?feature=player_embedded&v=yyWWXSwtPP0"; // hosea
+			//_mediaUrl = "http://www.youtube.com/watch?feature=player_embedded&v=m5VDDJlsD6I"; // railer with notes
+
+			//_alwaysShowControls = true;
+
+			//_debug=true;
+
+
+
+
+			// position and hide
+			_fullscreenButton = getChildByName("fullscreen_btn") as SimpleButton;
+			//_fullscreenButton.visible = false;
+			_fullscreenButton.alpha = 0;
+			_fullscreenButton.addEventListener(MouseEvent.CLICK, fullscreenClick, false);
+			_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width;
+			_fullscreenButton.y = stage.stageHeight - _fullscreenButton.height;
+
+
+			// create media element
+			if (_isVideo) {
+
+				if (_mediaUrl.indexOf("youtube.com") > -1 || _mediaUrl.indexOf("youtu.be") > -1) {
+
+					//Security.allowDomain("http://www.youtube.com");
+
+					_mediaElement = new YouTubeElement(this, _autoplay, _preload, _timerRate, _startVolume);
+					_video = (_mediaElement as YouTubeElement).player;
+
+					// these are set and then used once the player is loaded
+					(_mediaElement as YouTubeElement).initWidth = _stageWidth;
+					(_mediaElement as YouTubeElement).initHeight = _stageHeight;
+
+				} else {
+
+					_mediaElement = new VideoElement(this, _autoplay, _preload, _timerRate, _startVolume, _streamer);
+					_video = (_mediaElement as VideoElement).video;
+					_video.width = _stageWidth;
+					_video.height = _stageHeight;
+					(_video as Video).smoothing = _enableSmoothing;
+					(_mediaElement as VideoElement).setReference(this);
+					(_mediaElement as VideoElement).setPseudoStreaming(_enablePseudoStreaming);
+					(_mediaElement as VideoElement).setPseudoStreamingStartParam(_pseudoStreamingStartQueryParam);
+					//_video.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
+					addChild(_video);
+				}
+			} else {
+
+				//var player2:AudioDecoder = new com.automatastudios.audio.audiodecoder.AudioDecoder();
+				_mediaElement = new AudioElement(this, _autoplay, _preload, _timerRate, _startVolume);
+			}
+
+
+			// controls!
+			_controlBar = getChildByName("controls_mc") as MovieClip;
+			_controlBarBg = _controlBar.getChildByName("controls_bg_mc") as MovieClip;
+			_scrubTrack = _controlBar.getChildByName("scrubTrack") as MovieClip;
+			_scrubBar = _controlBar.getChildByName("scrubBar") as MovieClip;
+			_scrubOverlay = _controlBar.getChildByName("scrubOverlay") as MovieClip;
+			_scrubLoaded = _controlBar.getChildByName("scrubLoaded") as MovieClip;
+
+			_scrubOverlay.buttonMode = true;
+			_scrubOverlay.useHandCursor = true
+
+			applyColor(_scrubTrack, _scrubTrackColor);
+			applyColor(_scrubBar, _scrubBarColor);
+			applyColor(_scrubLoaded, _scrubLoadedColor);
+
+			_fullscreenIcon = _controlBar.getChildByName("fullscreenIcon") as SimpleButton;
+
+			// New fullscreenIcon for new fullscreen floating controls
+			//if(_alwaysShowControls && _controlStyle.toUpperCase()=="FLOATING") {
+				_fullscreenIcon.addEventListener(MouseEvent.CLICK, fullScreenIconClick, false);
+			//}
+
+			_volumeMuted = _controlBar.getChildByName("muted_mc") as SimpleButton;
+			_volumeUnMuted = _controlBar.getChildByName("unmuted_mc") as SimpleButton;
+
+			_volumeMuted.addEventListener(MouseEvent.CLICK, toggleVolume, false);
+			_volumeUnMuted.addEventListener(MouseEvent.CLICK, toggleVolume, false);
+
+			_playButton = _controlBar.getChildByName("play_btn") as SimpleButton;
+			_playButton.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
+				_mediaElement.play();
+			});
+			_pauseButton = _controlBar.getChildByName("pause_btn") as SimpleButton;
+			_pauseButton.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
+				_mediaElement.pause();
+			});
+			_pauseButton.visible = false;
+			_duration = _controlBar.getChildByName("duration_txt") as TextField;
+			_currentTime = _controlBar.getChildByName("currentTime_txt") as TextField;
+			_hoverTime = _controlBar.getChildByName("hoverTime") as MovieClip;
+			_hoverTimeText = _hoverTime.getChildByName("hoverTime_txt") as TextField;
+			_hoverTime.visible=false;
+			_hoverTime.y=(_hoverTime.height/2)+1;
+			_hoverTime.x=0;
+
+
+
+			// Add new timeline scrubber events
+			_scrubOverlay.addEventListener(MouseEvent.MOUSE_MOVE, scrubMove);
+			_scrubOverlay.addEventListener(MouseEvent.CLICK, scrubClick);
+			_scrubOverlay.addEventListener(MouseEvent.MOUSE_OVER, scrubOver);
+			_scrubOverlay.addEventListener(MouseEvent.MOUSE_OUT, scrubOut);
+
+			if (_autoHide) { // && _alwaysShowControls) {
+				// Add mouse activity for show/hide of controls
+				stage.addEventListener(Event.MOUSE_LEAVE, mouseActivityLeave);
+				stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseActivityMove);
+				_inactiveTime = 2500;
+				_timer = new Timer(_inactiveTime)
+				_timer.addEventListener(TimerEvent.TIMER, idleTimer);
+				_timer.start();
+				// set
+			}
+
+			if(_alwaysShowControls) {
+				if(_startVolume<=0) {
+					trace("INITIAL VOLUME: "+_startVolume+" MUTED");
+					_volumeMuted.visible=true;
+					_volumeUnMuted.visible=false;
+				} else {
+					trace("INITIAL VOLUME: "+_startVolume+" UNMUTED");
+					_volumeMuted.visible=false;
+					_volumeUnMuted.visible=true;
+				}
+			}
+
+			_controlBar.visible = _alwaysShowControls;
+
+			setControlDepth();
+
+			_output.appendText("stage: " + stage.stageWidth + "x" + stage.stageHeight + "\n");
+			_output.appendText("file: " + _mediaUrl + "\n");
+			_output.appendText("autoplay: " + _autoplay.toString() + "\n");
+			_output.appendText("preload: " + _preload.toString() + "\n");
+			_output.appendText("isvideo: " + _isVideo.toString() + "\n");
+			_output.appendText("smoothing: " + _enableSmoothing.toString() + "\n");
+			_output.appendText("timerrate: " + _timerRate.toString() + "\n");
+			_output.appendText("displayState: " +(stage.hasOwnProperty("displayState")).toString() + "\n");
+
+			// attach javascript
+			_output.appendText("ExternalInterface.available: " + ExternalInterface.available.toString() + "\n");
+			_output.appendText("ExternalInterface.objectID: " + ((ExternalInterface.objectID != null)? ExternalInterface.objectID.toString() : "null") + "\n");
+
+			if (_mediaUrl != "") {
+				_mediaElement.setSrc(_mediaUrl);
+			}
+
+			positionControls();
+
+			// Fire this once just to set the width on some dynamically sized scrub bar items;
+			_scrubBar.scaleX=0;
+			_scrubLoaded.scaleX=0;
+
+
+			if (ExternalInterface.available) { //  && !_alwaysShowControls
+
+				_output.appendText("Adding callbacks...\n");
+				try {
+					if (ExternalInterface.objectID != null && ExternalInterface.objectID.toString() != "") {
+
+						// add HTML media methods
+						ExternalInterface.addCallback("playMedia", playMedia);
+						ExternalInterface.addCallback("loadMedia", loadMedia);
+						ExternalInterface.addCallback("pauseMedia", pauseMedia);
+						ExternalInterface.addCallback("stopMedia", stopMedia);
+
+						ExternalInterface.addCallback("setSrc", setSrc);
+						ExternalInterface.addCallback("setCurrentTime", setCurrentTime);
+						ExternalInterface.addCallback("setVolume", setVolume);
+						ExternalInterface.addCallback("setMuted", setMuted);
+
+						ExternalInterface.addCallback("setFullscreen", setFullscreen);
+						ExternalInterface.addCallback("setVideoSize", setVideoSize);
+
+						ExternalInterface.addCallback("positionFullscreenButton", positionFullscreenButton);
+						ExternalInterface.addCallback("hideFullscreenButton", hideFullscreenButton);
+
+						// fire init method
+						ExternalInterface.call("mejs.MediaPluginBridge.initPlugin", ExternalInterface.objectID);
+					}
+
+					_output.appendText("Success...\n");
+
+				} catch (error:SecurityError) {
+					_output.appendText("A SecurityError occurred: " + error.message + "\n");
+				} catch (error:Error) {
+					_output.appendText("An Error occurred: " + error.message + "\n");
+				}
+
+			}
+
+			if (_preload != "none") {
+				_mediaElement.load();
+
+				if (_autoplay) {
+					_mediaElement.play();
+				}
+			} else if (_autoplay) {
+				_mediaElement.load();
+				_mediaElement.play();
+			}
+
+			// listen for resize
+			stage.addEventListener(Event.RESIZE, resizeHandler);
+
+			// send click events up to javascript
+			stage.addEventListener(MouseEvent.CLICK, stageClicked);
+
+			// resize
+			stage.addEventListener(FullScreenEvent.FULL_SCREEN, stageFullScreenChanged);
+		}
+
+		public function setControlDepth():void {
+			// put these on top
+			addChild(_output);
+			addChild(_controlBar);
+			addChild(_fullscreenButton);
+
+		}
+
+		// borrowed from jPLayer
+		// https://github.com/happyworm/jPlayer/blob/e8ca190f7f972a6a421cb95f09e138720e40ed6d/actionscript/Jplayer.as#L228
+		private function checkFlashVars(p:Object):void {
+			var i:Number = 0;
+			for each (var s:String in p) {
+				if (isIllegalChar(s)) {
+					securityIssue = true; // Illegal char found
+				}
+				i++;
+			}
+			if(i === 0 || securityIssue) {
+				directAccess = true;
+			}
+		}
+
+		private function isIllegalChar(s:String):Boolean {
+			var illegals:String = "' \" ( ) { } * + \\ < >";
+			if(Boolean(s)) { // Otherwise exception if parameter null.
+				for each (var illegal:String in illegals.split(' ')) {
+					if(s.indexOf(illegal) >= 0) {
+						return true; // Illegal char found
+					}
+				}
+			}
+			return false;
+		}
+
+
+		// START: Controls and events
+		function mouseActivityMove(event:MouseEvent):void {
+
+			// if mouse is in the video area
+			if (_autoHide && (mouseX>=0 && mouseX<=stage.stageWidth) && (mouseY>=0 && mouseY<=stage.stageHeight)) {
+
+				// This could be move to a nice fade at some point...
+				_controlBar.visible = (_alwaysShowControls || _isFullScreen);
+				_isMouseActive = true;
+				_idleTime = 0;
+				_timer.reset();
+				_timer.start()
+			}
+		}
+
+		function mouseActivityLeave(event:Event):void {
+			if (_autoHide) {
+				_isOverStage = false;
+				// This could be move to a nice fade at some point...
+				_controlBar.visible = false;
+				_isMouseActive = false;
+				_idleTime = 0;
+				_timer.reset();
+				_timer.stop();
+			}
+		}
+
+		function idleTimer(event:TimerEvent):void    {
+
+			if (_autoHide) {
+				// This could be move to a nice fade at some point...
+				_controlBar.visible = false;
+				_isMouseActive = false;
+				_idleTime += _inactiveTime;
+				_idleTime = 0;
+				_timer.reset();
+				_timer.stop();
+			}
+		}
+
+
+		function scrubMove(event:MouseEvent):void {
+
+			//if (_alwaysShowControls) {
+				if (_hoverTime.visible) {
+					var seekBarPosition:Number =  ((event.localX / _scrubTrack.width) *_mediaElement.duration())*_scrubTrack.scaleX;
+					var hoverPos:Number = (seekBarPosition / _mediaElement.duration()) *_scrubTrack.scaleX;
+
+					if (_isFullScreen) {
+						_hoverTime.x=event.target.parent.mouseX;
+					} else {
+						_hoverTime.x=mouseX;
+					}
+					_hoverTime.y = _scrubBar.y - (_hoverTime.height/2);
+					_hoverTimeText.text = secondsToTimeCode(seekBarPosition);
+				}
+			//}
+			//trace(event);
+		}
+
+		function scrubOver(event:MouseEvent):void {
+			_hoverTime.y = _scrubBar.y-(_hoverTime.height/2)+1;
+			_hoverTime.visible = true;
+			trace(event);
+		}
+
+		function scrubOut(event:MouseEvent):void {
+			_hoverTime.y = _scrubBar.y+(_hoverTime.height/2)+1;
+			_hoverTime.visible = false;
+			//_hoverTime.x=0;
+			//trace(event);
+		}
+
+		function scrubClick(event:MouseEvent):void {
+			//trace(event);
+			var seekBarPosition:Number =  ((event.localX / _scrubTrack.width) *_mediaElement.duration())*_scrubTrack.scaleX;
+
+			var tmp:Number = (_mediaElement.currentTime()/_mediaElement.duration())*_scrubTrack.width;
+			var canSeekToPosition:Boolean = _scrubLoaded.scaleX > (seekBarPosition / _mediaElement.duration()) *_scrubTrack.scaleX;
+			//var canSeekToPosition:Boolean = true;
+
+			/*
+			amountLoaded = ns.bytesLoaded / ns.bytesTotal;
+			loader.loadbar._width = amountLoaded * 208.9;
+			loader.scrub._x = ns.time / duration * 208.9;
+			*/
+
+			trace("seekBarPosition:"+seekBarPosition, "CanSeekToPosition: "+canSeekToPosition);
+
+			if (seekBarPosition>0 && seekBarPosition<_mediaElement.duration() && canSeekToPosition) {
+					_mediaElement.setCurrentTime(seekBarPosition);
+			}
+		}
+
+		function toggleVolume(event:MouseEvent):void {
+			trace(event.currentTarget.name);
+			switch(event.currentTarget.name) {
+				case "muted_mc":
+					setMuted(false);
+					break;
+				case "unmuted_mc":
+					setMuted(true);
+					break;
+			}
+		}
+
+		function toggleVolumeIcons(volume:Number) {
+			if(volume<=0) {
+				_volumeMuted.visible = true;
+				_volumeUnMuted.visible = false;
+			} else {
+				_volumeMuted.visible = false;
+				_volumeUnMuted.visible = true;
+			}
+		}
+
+		public function positionControls(forced:Boolean=false) {
+
+
+			if ( _controlStyle.toUpperCase() == "FLOATING" && _isFullScreen) {
+
+				trace("CONTROLS: floating");
+				_hoverTime.y=(_hoverTime.height/2)+1;
+				_hoverTime.x=0;
+				_controlBarBg.width = 300;
+				_controlBarBg.height = 93;
+				//_controlBarBg.x = (stage.stageWidth/2) - (_controlBarBg.width/2);
+				//_controlBarBg.y  = stage.stageHeight - 300;
+
+				_pauseButton.scaleX = _playButton.scaleX=3.5;
+				_pauseButton.scaleY= _playButton.scaleY=3.5;
+				// center the play button and make it big and at the top
+				_pauseButton.x = _playButton.x = (_controlBarBg.width/2)-(_playButton.width/2)+7;
+				_pauseButton.y = _playButton.y = _controlBarBg.height-_playButton.height-(14)
+
+				_controlBar.x = (stage.stageWidth/2) -150;
+				_controlBar.y = stage.stageHeight - _controlBar.height-100;
+
+
+				// reposition the time and duration items
+
+				_duration.x = _controlBarBg.width - _duration.width - 10;
+				_duration.y = _controlBarBg.height - _duration.height -7;
+				//_currentTime.x = _controlBarBg.width - _duration.width - 10 - _currentTime.width - 10;
+				_currentTime.x = 5
+				_currentTime.y= _controlBarBg.height - _currentTime.height-7;
+
+				_fullscreenIcon.x = _controlBarBg.width - _fullscreenIcon.width - 7;
+				_fullscreenIcon.y = 7;
+
+				_volumeMuted.x = _volumeUnMuted.x = 7;
+				_volumeMuted.y = _volumeUnMuted.y = 7;
+
+				_scrubLoaded.x = _scrubBar.x = _scrubOverlay.x = _scrubTrack.x =_currentTime.x+_currentTime.width+7;
+				_scrubLoaded.y = _scrubBar.y = _scrubOverlay.y = _scrubTrack.y=_controlBarBg.height-_scrubTrack.height-10;
+
+				_scrubBar.width =  _scrubOverlay.width = _scrubTrack.width = (_duration.x-_duration.width-14);
+
+
+			} else {
+				trace("CONTROLS: normal, original");
+
+				/*
+				// Original style bottom display
+				_hoverTime.y=(_hoverTime.height/2)+1;
+				_hoverTime.x=0;
+				_controlBarBg.width = stage.stageWidth;
+				_controlBar.y = stage.stageHeight - _controlBar.height;
+				_duration.x = stage.stageWidth - _duration.width - 10;
+				//_currentTime.x = stage.stageWidth - _duration.width - 10 - _currentTime.width - 10;
+				_currentTime.x = _playButton.x+_playButton.width;
+				_scrubTrack.width = (_duration.x-_duration.width-10)-_duration.width+10;
+				_scrubOverlay.width = _scrubTrack.width;
+				_scrubBar.width = _scrubTrack.width;
+				*/
+
+				// FLOATING MODE BOTTOM DISPLAY - similar to normal
+				trace("THAT WAY!");
+				_hoverTime.y=(_hoverTime.height/2)+1;
+				_hoverTime.x=0;
+				_controlBarBg.width = stage.stageWidth;
+				_controlBarBg.height = 30;
+				_controlBarBg.y=0;
+				_controlBarBg.x=0;
+				// _controlBarBg.x = 0;
+				// _controlBarBg.y  = stage.stageHeight - _controlBar.height;
+
+				_pauseButton.scaleX = _playButton.scaleX=1;
+				_pauseButton.scaleY = _playButton.scaleY=1;
+
+				_pauseButton.x = _playButton.x = 7;
+				_pauseButton.y = _playButton.y = _controlBarBg.height-_playButton.height-2;
+
+
+				//_currentTime.x = stage.stageWidth - _duration.width - 10 - _currentTime.width - 10;
+				_currentTime.x = _playButton.x+_playButton.width;
+
+				_fullscreenIcon.x = _controlBarBg.width - _fullscreenIcon.width - 7;
+				_fullscreenIcon.y = 8;
+
+				_volumeMuted.x = _volumeUnMuted.x = _fullscreenIcon.x - _volumeMuted.width - 10;
+				_volumeMuted.y = _volumeUnMuted.y = 10;
+
+				_duration.x = _volumeMuted.x - _volumeMuted.width - _duration.width + 5;
+				_duration.y = _currentTime.y = _controlBarBg.height - _currentTime.height - 7;
+
+				_scrubLoaded.x = _scrubBar.x = _scrubOverlay.x = _scrubTrack.x = _currentTime.x + _currentTime.width + 10;
+				_scrubLoaded.y = _scrubBar.y = _scrubOverlay.y = _scrubTrack.y = _controlBarBg.height - _scrubTrack.height - 9;
+
+				_scrubBar.width =  _scrubOverlay.width = _scrubTrack.width =  (_duration.x-_duration.width-10)-_duration.width+5;
+				_controlBar.x = 0;
+				_controlBar.y = stage.stageHeight - _controlBar.height;
+
+			}
+
+		}
+
+		// END: Controls
+
+
+		function stageClicked(e:MouseEvent):void {
+			//_output.appendText("click: " + e.stageX.toString() +","+e.stageY.toString() + "\n");
+			if (e.target == stage) {
+				sendEvent("click", "");
+			}
+		}
+
+		function resizeHandler(e:Event):void {
+			//_video.scaleX = stage.stageWidth / _stageWidth;
+			//_video.scaleY = stage.stageHeight / _stageHeight;
+			//positionControls();
+
+			repositionVideo();
+		}
+
+		// START: Fullscreen
+		function enterFullscreen() {
+
+			_output.appendText("enterFullscreen()\n");
+
+			var screenRectangle:Rectangle = new Rectangle(0, 0, flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
+			stage.fullScreenSourceRect = screenRectangle;
+
+			stage.displayState = StageDisplayState.FULL_SCREEN;
+
+			repositionVideo(true);
+			positionControls();
+			updateControls(HtmlMediaEvent.FULLSCREENCHANGE);
+
+			_controlBar.visible = true;
+
+			_isFullScreen = true;
+		}
+
+		function exitFullscreen() {
+
+			stage.displayState = StageDisplayState.NORMAL;
+
+
+			_controlBar.visible = false;
+
+			_isFullScreen = false;
+		}
+
+		function setFullscreen(gofullscreen:Boolean) {
+
+			_output.appendText("setFullscreen: " + gofullscreen.toString() + "\n");
+
+			try {
+				//_fullscreenButton.visible = false;
+
+				if (gofullscreen) {
+					enterFullscreen();
+
+				} else {
+					exitFullscreen();
+				}
+
+			} catch (error:Error) {
+
+				// show the button when the security error doesn't let it work
+				//_fullscreenButton.visible = true;
+				_fullscreenButton.alpha = 1;
+
+				_isFullScreen = false;
+
+				_output.appendText("error setting fullscreen: " + error.message.toString() + "\n");
+			}
+		}
+
+		// control bar button/icon
+		function fullScreenIconClick(e:MouseEvent) {
+			try {
+				_controlBar.visible = true;
+				setFullscreen(!_isFullScreen);
+				repositionVideo(_isFullScreen);
+			} catch (error:Error) {
+			}
+		}
+
+		// special floating fullscreen icon
+		function fullscreenClick(e:MouseEvent) {
+			//_fullscreenButton.visible = false;
+			_fullscreenButton.alpha = 0
+
+			try {
+				_controlBar.visible = true;
+				setFullscreen(true);
+				repositionVideo(true);
+				positionControls();
+			} catch (error:Error) {
+			}
+		}
+
+
+		function stageFullScreenChanged(e:FullScreenEvent) {
+			_output.appendText("fullscreen event: " + e.fullScreen.toString() + "\n");
+
+			//_fullscreenButton.visible = false;
+			_fullscreenButton.alpha = 0;
+			_isFullScreen = e.fullScreen;
+
+			sendEvent(HtmlMediaEvent.FULLSCREENCHANGE, "isFullScreen:" + e.fullScreen );
+
+			if (!e.fullScreen) {
+				_controlBar.visible = _alwaysShowControls;
+			}
+		}
+		// END: Fullscreen
+
+		// START: external interface
+		function playMedia() {
+			_output.appendText("play\n");
+			_mediaElement.play();
+		}
+
+		function loadMedia() {
+			_output.appendText("load\n");
+			_mediaElement.load();
+		}
+
+		function pauseMedia() {
+			_output.appendText("pause\n");
+			_mediaElement.pause();
+		}
+
+		function setSrc(url:String) {
+			_output.appendText("setSrc: " + url + "\n");
+			_mediaElement.setSrc(url);
+		}
+
+		function stopMedia() {
+			_output.appendText("stop\n");
+			_mediaElement.stop();
+		}
+
+		function setCurrentTime(time:Number) {
+			_output.appendText("seek: " + time.toString() + "\n");
+			_mediaElement.setCurrentTime(time);
+		}
+
+		function setVolume(volume:Number) {
+			_output.appendText("volume: " + volume.toString() + "\n");
+			_mediaElement.setVolume(volume);
+			toggleVolumeIcons(volume);
+		}
+
+		function setMuted(muted:Boolean) {
+			_output.appendText("muted: " + muted.toString() + "\n");
+			_mediaElement.setMuted(muted);
+			toggleVolumeIcons(_mediaElement.getVolume());
+		}
+
+		function setVideoSize(width:Number, height:Number) {
+			_output.appendText("setVideoSize: " + width.toString() + "," + height.toString() + "\n");
+
+			_stageWidth = width;
+			_stageHeight = height;
+
+			if (_video != null) {
+				repositionVideo();
+				positionControls();
+				//_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width - 10;
+				_output.appendText("result: " + _video.width.toString() + "," + _video.height.toString() + "\n");
+			}
+
+
+		}
+
+		function positionFullscreenButton(x:Number, y:Number, visibleAndAbove:Boolean ) {
+
+			_output.appendText("position FS: " + x.toString() + "x" + y.toString() + "\n");
+
+			// bottom corner
+			/*
+			_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width
+			_fullscreenButton.y = stage.stageHeight - _fullscreenButton.height;
+			*/
+
+			// position just above
+			if (visibleAndAbove) {
+				_fullscreenButton.x = x+1;
+				_fullscreenButton.y = y - _fullscreenButton.height+1;
+			} else {
+				_fullscreenButton.x = x;
+				_fullscreenButton.y = y;
+			}
+
+			// check for oversizing
+			if ((_fullscreenButton.x + _fullscreenButton.width) > stage.stageWidth)
+				_fullscreenButton.x = stage.stageWidth - _fullscreenButton.width;
+
+			// show it!
+			if (visibleAndAbove) {
+				_fullscreenButton.alpha = 1;
+			}
+		}
+
+		function hideFullscreenButton() {
+
+			//_fullscreenButton.visible = false;
+			_fullscreenButton.alpha = 0;
+		}
+
+		// END: external interface
+
+
+		function repositionVideo(fullscreen:Boolean = false):void {
+
+			_output.appendText("positioning video\n");
+
+			if (_mediaElement is VideoElement) {
+
+				if (isNaN(_nativeVideoWidth) || isNaN(_nativeVideoHeight) || _nativeVideoWidth <= 0 || _nativeVideoHeight <= 0) {
+					_output.appendText("ERR: I dont' have the native dimension\n");
+					return;
+				}
+
+				// calculate ratios
+				var stageRatio, nativeRatio;
+
+				_video.x = 0;
+				_video.y = 0;
+
+				if(fullscreen == true) {
+					stageRatio = flash.system.Capabilities.screenResolutionX/flash.system.Capabilities.screenResolutionY;
+					nativeRatio = _nativeVideoWidth/_nativeVideoHeight;
+
+					// adjust size and position
+					if (nativeRatio > stageRatio) {
+						_mediaElement.setSize(flash.system.Capabilities.screenResolutionX, _nativeVideoHeight * flash.system.Capabilities.screenResolutionX / _nativeVideoWidth);
+						_video.y = flash.system.Capabilities.screenResolutionY/2 - _video.height/2;
+					} else if (stageRatio > nativeRatio) {
+						_mediaElement.setSize(_nativeVideoWidth * flash.system.Capabilities.screenResolutionY / _nativeVideoHeight, flash.system.Capabilities.screenResolutionY);
+						_video.x = flash.system.Capabilities.screenResolutionX/2 - _video.width/2;
+					} else if (stageRatio == nativeRatio) {
+						_mediaElement.setSize(flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
+					}
+
+				} else {
+					stageRatio = _stageWidth/_stageHeight;
+					nativeRatio = _nativeVideoWidth/_nativeVideoHeight;
+
+
+					// adjust size and position
+					if (nativeRatio > stageRatio) {
+						_mediaElement.setSize(_stageWidth, _nativeVideoHeight * _stageWidth / _nativeVideoWidth);
+						_video.y = _stageHeight/2 - _video.height/2;
+					} else if (stageRatio > nativeRatio) {
+						_mediaElement.setSize( _nativeVideoWidth * _stageHeight / _nativeVideoHeight, _stageHeight);
+						_video.x = _stageWidth/2 - _video.width/2;
+					} else if (stageRatio == nativeRatio) {
+						_mediaElement.setSize(_stageWidth, _stageHeight);
+					}
+
+				}
+
+			} else if (_mediaElement is YouTubeElement) {
+				if(fullscreen == true) {
+					_mediaElement.setSize(flash.system.Capabilities.screenResolutionX, flash.system.Capabilities.screenResolutionY);
+
+				} else {
+					_mediaElement.setSize(_stageWidth, _stageHeight);
+
+				}
+
+			}
+
+			positionControls();
+		}
+
+		// SEND events to JavaScript
+		public function sendEvent(eventName:String, eventValues:String) {
+
+			// special video event
+			if (eventName == HtmlMediaEvent.LOADEDMETADATA && _isVideo) {
+
+				_output.appendText("METADATA RECEIVED: ");
+
+				try {
+					if (_mediaElement is VideoElement) {
+						_nativeVideoWidth = (_mediaElement as VideoElement).videoWidth;
+						_nativeVideoHeight = (_mediaElement as VideoElement).videoHeight;
+					}
+				} catch (e:Error) {
+					_output.appendText(e.toString() + "\n");
+				}
+
+				_output.appendText(_nativeVideoWidth.toString() + "x" + _nativeVideoHeight.toString() + "\n");
+
+
+				 if(stage.displayState == "fullScreen" ) {
+					setVideoSize(_nativeVideoWidth, _nativeVideoHeight);
+					repositionVideo(true);
+				 } else {
+					repositionVideo();
+				 }
+			}
+
+			updateControls(eventName);
+
+			//trace((_mediaElement.duration()*1).toString() + " / " + (_mediaElement.currentTime()*1).toString());
+			//trace("CurrentProgress:"+_mediaElement.currentProgress());
+
+			if (ExternalInterface.objectID != null && ExternalInterface.objectID.toString() != "") {
+
+				//_output.appendText("event:" + eventName + " : " + eventValues);
+				//trace("event", eventName, eventValues);
+
+				if (eventValues == null)
+					eventValues == "";
+
+				if (_isVideo) {
+					eventValues += (eventValues != "" ? "," : "") + "isFullScreen:" + _isFullScreen;
+				}
+
+				eventValues = "{" + eventValues + "}";
+
+				/*
+				OLD DIRECT METHOD
+				ExternalInterface.call(
+					"function(id, name) { mejs.MediaPluginBridge.fireEvent(id,name," + eventValues + "); }",
+					ExternalInterface.objectID,
+					eventName);
+				*/
+
+				// use set timeout for performance reasons
+				//if (!_alwaysShowControls) {
+					ExternalInterface.call("setTimeout", "mejs.MediaPluginBridge.fireEvent('" + ExternalInterface.objectID + "','" + eventName + "'," + eventValues + ")",0);
+				//}
+			}
+		}
+
+
+		function updateControls(eventName:String):void {
+
+			//trace("updating controls");
+
+			try {
+				// update controls
+				switch (eventName) {
+					case "pause":
+					case "paused":
+					case "ended":
+						_playButton.visible = true;
+						_pauseButton.visible = false;
+						break;
+					case "play":
+					case "playing":
+						_playButton.visible = false;
+						_pauseButton.visible = true;
+						break;
+				}
+
+				if (eventName == HtmlMediaEvent.TIMEUPDATE ||
+					eventName == HtmlMediaEvent.PROGRESS ||
+					eventName == HtmlMediaEvent.FULLSCREENCHANGE) {
+
+					//_duration.text = (_mediaElement.duration()*1).toString();
+					_duration.text =  secondsToTimeCode(_mediaElement.duration());
+					//_currentTime.text = (_mediaElement.currentTime()*1).toString();
+					_currentTime.text =  secondsToTimeCode(_mediaElement.currentTime());
+
+					var pct:Number =  (_mediaElement.currentTime() / _mediaElement.duration()) *_scrubTrack.scaleX;
+
+					_scrubBar.scaleX = pct;
+					_scrubLoaded.scaleX = (_mediaElement.currentProgress()*_scrubTrack.scaleX)/100;
+				}
+			} catch (error:Error) {
+				trace("error: " + error.toString());
+
+			}
+
+		}
+
+		// START: utility
+		function secondsToTimeCode(seconds:Number):String {
+			var timeCode:String = "";
+			seconds = Math.round(seconds);
+			var minutes:Number = Math.floor(seconds / 60);
+			timeCode = (minutes >= 10) ? minutes.toString() : "0" + minutes.toString();
+			seconds = Math.floor(seconds % 60);
+			timeCode += ":" + ((seconds >= 10) ? seconds.toString() : "0" + seconds.toString());
+			return timeCode; //minutes.toString() + ":" + seconds.toString();
+		}
+
+		function applyColor(item:Object, color:String):void {
+
+			var myColor:ColorTransform = item.transform.colorTransform;
+			myColor.color = Number(color);
+			item.transform.colorTransform = myColor;
+		}
+		// END: utility
+
+	}
+}


Transferred from the Adobe Open Source Subversion Repository

Revision: 21121
Author:   chiedozi@adobe.com
Date:     2011-04-22T00:58:19.373328Z

Log Message:
-----------
IconItemRenderer now displays the iconPlaceholder image when the icon fails to load

QE notes:
Doc notes:
Bugs: SDK-30141
Reviewer: Tom Kraikit
Tests run: checkintests-mobile
Is noteworthy for integration:

Modified Paths:
--------------
/private/flex/sdk/trunk/frameworks/projects/mobilecomponents/src/spark/components/IconItemRenderer.as

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1263936 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/mobilecomponents/src/spark/components/IconItemRenderer.as
+++ frameworks/projects/mobilecomponents/src/spark/components/IconItemRenderer.as
@@ -12,21 +12,16 @@
 package spark.components
 {
 import flash.display.DisplayObject;
+import flash.events.Event;
+import flash.events.IOErrorEvent;
+import flash.events.SecurityErrorEvent;
 import flash.events.TimerEvent;
 import flash.net.URLRequest;
-import flash.system.Capabilities;
-import flash.text.TextFieldType;
-import flash.text.TextLineMetrics;
 import flash.utils.Timer;

 import mx.controls.listClasses.*;
+import mx.core.DPIClassification;
 import mx.core.FlexGlobals;
-import mx.core.DPIClassification;
-import mx.core.IFlexDisplayObject;
-import mx.core.IVisualElement;
-import mx.core.UIComponentGlobals;
-import mx.core.UITextField;
-import mx.core.UITextFormat;
 import mx.core.mx_internal;
 import mx.graphics.BitmapFillMode;
 import mx.graphics.BitmapScaleMode;
@@ -1282,6 +1277,9 @@
             if ((iconField || (iconFunction != null)) && !iconDisplay)
             {
                 createIconDisplay();
+
+                if (iconDisplay)
+                    attachLoadingListenersToIconDisplay();
             }
             else if (!(iconField || (iconFunction != null)) && iconDisplay)
             {
@@ -1643,6 +1641,28 @@
         decoratorDisplay = null;
     }

+    /**
+     *  @private
+     */
+    private function attachLoadingListenersToIconDisplay():void
+    {
+        if (iconDisplay)
+        {
+            iconDisplay.addEventListener(IOErrorEvent.IO_ERROR, iconDisplay_loadErrorHandler, false, 0, true);
+            iconDisplay.addEventListener(SecurityErrorEvent.SECURITY_ERROR, iconDisplay_loadErrorHandler, false, 0, true);
+        }
+    }
+
+    /**
+     *  @private
+     *  Method is called when an IOError or SecurityError is dispatched
+     *  while trying to load the icon display.  The default implementation
+     *  sets the iconDisplay's source to the iconPlaceholder.
+     */
+    mx_internal function iconDisplay_loadErrorHandler(event:Event):void
+    {
+        iconDisplay.source = iconPlaceholder;
+    }

     /**
      *  @private


Transferred from the Adobe Open Source Subversion Repository

Revision: 18805
Author:   rfrishbe@adobe.com
Date:     2010-11-23T18:56:57.016484Z

Log Message:
-----------
Fixing up MobileIconItemRenderer with two bugs:

1) If we stop loading the icon, we need to reset loadingIconSource back to null
2) Fixing up some logic with verticalGap, so that it doesn't apply to the icon or decorator since it's just the gap between the label and the message

Also cleaning up some logic around text reflow.

QE notes:
Doc notes:
Bugs: -
Reviewer: Evtim, Kevin
Tests run: checkintests
Is noteworthy for integration: No

Modified Paths:
--------------
/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/MobileIconItemRenderer.as

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1263908 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/mobilecomponents/src/spark/components/IconItemRenderer.as
+++ frameworks/projects/mobilecomponents/src/spark/components/IconItemRenderer.as
@@ -1430,6 +1430,7 @@
             // stop any asynch operation:
             if (iconSetterDelayTimer)
             {
+				loadingIconSource = null
                 iconSetterDelayTimer.stop();
                 iconSetterDelayTimer.reset();
             }
@@ -1448,6 +1449,7 @@
         // since we're not going to use it anymore
         if (iconSetterDelayTimer)
         {
+			loadingIconSource = null
             iconSetterDelayTimer.stop();
             iconSetterDelayTimer.reset();
         }
@@ -1558,6 +1560,28 @@
         var myMeasuredHeight:Number = 0;
         var myMeasuredMinWidth:Number = 0;
         var myMeasuredMinHeight:Number = 0;
+
+		// calculate padding and horizontal gap
+		// verticalGap is already handled above when there's a label
+		// and a message since that's the only place verticalGap matters.
+		// if we handled verticalGap here, it might add it to the icon if
+		// the icon was the tallest item.
+		var numHorizontalSections:int = 0;
+		if (iconDisplay)
+			numHorizontalSections++;
+
+		if (decoratorDisplay)
+			numHorizontalSections++;
+
+		if (labelDisplay || messageDisplay)
+			numHorizontalSections++;
+
+		var paddingAndGapWidth:Number = getStyle("paddingLeft") + getStyle("paddingRight");
+		if (numHorizontalSections > 0)
+			paddingAndGapWidth += (getStyle("horizontalGap") * (numHorizontalSections - 1));
+
+		var verticalGap:Number = (labelDisplay && messageDisplay) ? getStyle("verticalGap") : 0;
+		var paddingHeight:Number = getStyle("paddingTop") + getStyle("paddingBottom");

         // Icon is on left
 		var myIconWidth:Number = 0;
@@ -1603,7 +1627,6 @@
             labelWidth = getElementPreferredWidth(labelDisplay);
             labelHeight = getElementPreferredHeight(labelDisplay);
         }
-

         if (messageDisplay)
         {
@@ -1619,32 +1642,14 @@
         }

         myMeasuredWidth += Math.max(labelWidth, messageWidth);
-        myMeasuredHeight = Math.max(myMeasuredHeight, labelHeight + messageHeight);
-
-		// now to add on padding and horizontal gap
-		// verticalGap is already handled above when there's a label
-		// and a message since that's the only place verticalGap matters
-		var numHorizontalSections:int = 0;
-		if (iconDisplay)
-			numHorizontalSections++;
-
-		if (decoratorDisplay)
-			numHorizontalSections++;
-
-		if (labelDisplay || messageDisplay)
-			numHorizontalSections++;
-
-		var paddingAndGapWidth:Number = getStyle("paddingLeft") + getStyle("paddingRight");
-		if (numHorizontalSections > 0)
-			paddingAndGapWidth += (getStyle("horizontalGap") * (numHorizontalSections - 1));
-
-		var verticalGap:Number = (labelDisplay && messageDisplay) ? getStyle("verticalGap") : 0;
-		var paddingAndGapHeight:Number = getStyle("paddingTop") + getStyle("paddingBottom") + verticalGap;
+        myMeasuredHeight = Math.max(myMeasuredHeight, labelHeight + messageHeight + verticalGap);

 		myMeasuredWidth += paddingAndGapWidth;
 		myMeasuredMinWidth += paddingAndGapWidth;
-		myMeasuredHeight += paddingAndGapHeight;
-		myMeasuredMinHeight += paddingAndGapHeight;
+
+		// verticalGap handled in label and message
+		myMeasuredHeight += paddingHeight;
+		myMeasuredMinHeight += paddingHeight;

         // now set the local variables to the member variables.  Make sure it means our
         // minimum height of 80
@@ -1852,25 +1857,8 @@
             messageWidth = Math.max(labelComponentsViewWidth, 0);
             messageHeight = Math.max(viewHeight - labelHeight - verticalGap, 0);

-            // grab old messageDisplay height before resizing it
-            var oldMessageMeasuredHeight:Number = getElementPreferredHeight(messageDisplay);
-
             resizeElement(messageDisplay, messageWidth, messageHeight);
-
-            // grab new messageDisplay height after the messageDisplay has taken its final size
-            var newMessageMeasuredHeight:Number = getElementPreferredHeight(messageDisplay);
-
-            // if the resize caused the messageDisplay's height to change (because of
-            // text reflow), then we need to remeasure ourselves with our new estimatedWidth
-            if (oldMessageMeasuredHeight != newMessageMeasuredHeight)
-            {
-				// if unscaledWidth is 0, we're in an edge case, so let's not invalidateSize() here
-				// as we're not really visible anyways, so why do an extra invalidation
-				if (unscaledWidth > 0)
-	                invalidateSize();
-            }
-
-            messageHeight = Math.max(0, Math.min(messageHeight, newMessageMeasuredHeight));
+            messageHeight = Math.max(0, Math.min(messageHeight, getElementPreferredHeight(messageDisplay)));

             // since it's multi-line, no need to truncate
             //if (messageDisplay.isTruncated)


Transferred from the Adobe Open Source Subversion Repository

Revision: 11448
Author:   rfrishbe@adobe.com
Date:     2009-11-05T01:06:22.498914Z

Log Message:
-----------
Making a small ItemRenderer change so that we don't dispatch an unused, contentBackgroundColorChanged event anymore when the itemIndex gets set.

QE notes: -
Doc notes: -
Bugs: -
Reviewer: Deepa
Tests run: checkintests
Is noteworthy for integration: No

Modified Paths:
--------------
/flex/sdk/trunk/frameworks/projects/spark/src/spark/components/supportClasses/ItemRenderer.as

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1282295 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/spark/src/spark/components/supportClasses/ItemRenderer.as
+++ frameworks/projects/spark/src/spark/components/supportClasses/ItemRenderer.as
@@ -206,7 +206,7 @@
             return;

         _itemIndex = value;
-        dispatchEvent(new Event("contentBackgroundColorChanged"));
+
         if (autoDrawBackground)
         {
             redrawRequested = true;


Transferred from the Adobe Open Source Subversion Repository

Revision: 19797
Author:   klin@adobe.com
Date:     2011-01-19T00:06:54.932970Z

Log Message:
-----------
Initial checkin of override default density mapping feature. Application and other classes delegate calculating runtimeDPI to a RuntimeDPIProvider class. Developers that wish to override how the runtimeDPI is calculated should subclass RuntimeDPIProvider and set it to the runtimeDPIProvider property on Application. Application actually calls DensityUtil.getRuntimeDPI() which creates the instance of the runtimeDPIProvider class and caches the runtimeDPI. I've also modified the compiler so that runtimeDPIProvider is recognized as a special attribute on Application. This checkin includes the PARB updates for changing DPI related properties and variables from ints to Numbers.

QE notes: Update tests
Doc notes: N/A
Bugs: SDK-28731
Reviewer: Evtim
Tests run: checkintests
Is noteworthy for integration: Yes

Modified Paths:
--------------
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/modules/compiler/src/java/flex2/compiler/mxml/builder/DocumentBuilder.java</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/modules/compiler/src/java/flex2/tools/PreLink.java</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/supportClasses/ViewNavigatorBase.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/managers/SystemManager.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/utils/DensityUtil.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobiletheme/src/spark/skins/mobile/supportClasses/MobileSkin.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/modules/compiler/src/java/flex2/compiler_en.properties</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/core/DPIClassification.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/BusyIndicator.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/utils/MediaQueryParser.as</path>
<path kind="file" action="A">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/core/RuntimeDPIProvider.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/utils/MultiDPIBitmapSource.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/LabelItemRenderer.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobiletheme/src/spark/skins/mobile/HSliderDataTip.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/primitives/BitmapImage.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/IconItemRenderer.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/tools/dependencychecker/frameworkSwcExceptionsList.txt</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/Application.as</path>

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1263979 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/mobilecomponents/src/spark/components/LabelItemRenderer.as
+++ frameworks/projects/mobilecomponents/src/spark/components/LabelItemRenderer.as
@@ -669,7 +669,7 @@
 	 *  @playerversion AIR 2.5
 	 *  @productversion Flex 4.5
 	 */
-	public function get applicationDPI():int
+	public function get applicationDPI():Number
 	{
 		return FlexGlobals.topLevelApplication.applicationDPI;
 	}


Transferred from the Adobe Open Source Subversion Repository

Revision: 17967
Author:   rfrishbe@adobe.com
Date:     2010-09-30T20:42:13.559166Z

Log Message:
-----------
Making a performance change in MobileIconItemRenderer/MobileItemRenderer in how we measure text.  We don't call UIComponent.measureText() anymore as that creates another TextField behind the scenes and changes its text.  Instead we now just ask for the textWidth/textHeight of the TextField we are already using.  This change should give us about a 10-15% improvement.  I added a FIXME to change it in ButtonSkin and look for other places we need to change it as well.

Also, I'm making some changes in the way we measure FPS in TestHelper for RadioStations to be more consistent.

QE notes: None
Doc notes: None
Bugs: -
Reviewer: Glenn
Tests run: checkintests
Is noteworthy for integration: No

Modified Paths:
--------------
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/supportClasses/MobileTextField.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/MobileItemRenderer.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/tests/performance/mobile/RadioStations/src/TestHelper.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/MobileIconItemRenderer.as</path>

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1263951 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/mobilecomponents/src/spark/components/LabelItemRenderer.as
+++ frameworks/projects/mobilecomponents/src/spark/components/LabelItemRenderer.as
@@ -550,13 +550,18 @@

         if (labelDisplay)
         {
-            var labelLineMetrics:TextLineMetrics = measureText(labelDisplay.text);
-
+            // reset text if it was truncated before.
+            if (labelDisplay.isTruncated)
+                labelDisplay.text = label;
+
+            // commit styles so our text measurement is accurate
+            labelDisplay.commitStyles();
+
             // Text respects padding right, left, top, and bottom
-            measuredWidth = labelLineMetrics.width + UITextField.TEXT_WIDTH_PADDING;
+            measuredWidth = labelDisplay.textWidth + UITextField.TEXT_WIDTH_PADDING;
             measuredWidth += getStyle("paddingLeft") + getStyle("paddingRight");

-            measuredHeight = labelLineMetrics.height + UITextField.TEXT_HEIGHT_PADDING;
+            measuredHeight = labelDisplay.textHeight + UITextField.TEXT_HEIGHT_PADDING;
             measuredHeight += getStyle("paddingTop") + getStyle("paddingBottom");
         }

@@ -731,12 +736,15 @@
         {
             // measure the label component
             var textHeight:Number = 0;
-            var labelLineMetrics:TextLineMetrics;
+
+            // reset text if it was truncated before.
+            if (labelDisplay.isTruncated)
+                labelDisplay.text = label;

             if (label != "")
             {
-                labelLineMetrics = measureText(label);
-                textHeight = labelLineMetrics.height + UITextField.TEXT_HEIGHT_PADDING;
+                labelDisplay.commitStyles();
+                textHeight = labelDisplay.textHeight + UITextField.TEXT_HEIGHT_PADDING;
             }

             // text should take up the rest of the space width-wise, but only let it take up
@@ -768,9 +776,7 @@
             labelDisplay.x = Math.round(labelX);
             labelDisplay.y = Math.round(labelY);

-            // reset text if it was truncated before.  then attempt to truncate it
-            if (labelDisplay.isTruncated)
-                labelDisplay.text = label;
+            // attempt to truncate the text now that we have its official width
             labelDisplay.truncateToFit();
         }
     }


Transferred from the Adobe Open Source Subversion Repository

Revision: 946
Author:   clucier@adobe.com
Date:     2008-03-27T00:03:25.298810Z

Log Message:
-----------
Follow on to my last checkin, added additional logic to account for cases when styles are requested but not found.
Addresses a mustella breakage.

Modified Paths:
--------------
<path kind="file" action="M">/flex/sdk/trunk/frameworks/projects/framework/src/mx/controls/dataGridClasses/DataGridItemRenderer.as</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/projects/framework/src/mx/core/UIComponent.as</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/projects/framework/src/mx/styles/StyleProtoChain.as</path>

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1268777 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/mx/src/mx/controls/dataGridClasses/DataGridItemRenderer.as
+++ frameworks/projects/mx/src/mx/controls/dataGridClasses/DataGridItemRenderer.as
@@ -550,8 +550,11 @@
         for (i = 0; i < classSelectors.length; i++)
         {
             var classSelector:CSSStyleDeclaration = classSelectors[i];
-            inheritChain = classSelector.addStyleToProtoChain(inheritChain, this);
-            nonInheritChain = classSelector.addStyleToProtoChain(nonInheritChain, this);
+            if (classSelector)
+            {
+                inheritChain = classSelector.addStyleToProtoChain(inheritChain, this);
+                nonInheritChain = classSelector.addStyleToProtoChain(nonInheritChain, this);
+            }
         }


Transferred from the Adobe Open Source Subversion Repository

Revision: 18131
Author:   hmuller@adobe.com
Date:     2010-10-11T22:43:35.924917Z

Log Message:
-----------
IDataGridElement and some minor Doc/API changes:

Defined IDataGridElement.  Grid and ColumnHeaderBar implement it.

Removed the Grid gridOwner property.  The IDataGridElement dataGrid property serves the same purpose.

Added public grid ColumnHeaderBar property that's set/cleared by DataGrid partAdded/Removed().  ColumnHeaderBar is now responsible for syncing its scroll position with its grid.

Removed DataGrid headerRenderer property and headerColunmSeparator skin part.  These values can be changed by reconfiguring the default skin.

Corrected GridItemEditor event type metadata in DataGrid.

Modified Paths:
--------------
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/Grid.as</path>
<path kind="file" action="A">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/gridClasses/IDataGridElement.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/ColumnHeaderBar.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/events/GridItemEditorEvent.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/supportClasses/GridColumn.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/supportClasses/GridLayout.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/DataGrid.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/skins/spark/DataGridSkin.mxml</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/wireframe/src/spark/skins/wireframe/DataGridSkin.mxml</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/spark/src/spark/components/supportClasses/ColumnHeaderBarLayout.as</path>

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1281798 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/spark/src/spark/components/gridClasses/IDataGridElement.as
+++ frameworks/projects/spark/src/spark/components/gridClasses/IDataGridElement.as
@@ -0,0 +1,45 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  ADOBE SYSTEMS INCORPORATED
+//  Copyright 2010 Adobe Systems Incorporated
+//  All Rights Reserved.
+//
+//  NOTICE: Adobe permits you to use, modify, and distribute this file
+//  in accordance with the terms of the license agreement accompanying it.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package spark.components.gridClasses
+{
+import mx.core.IInvalidating;
+import mx.core.IVisualElement;
+
+import spark.components.DataGrid;
+
+/**
+ *  DataGrid visual elements that must remain in sync with the grid's layout and scroll
+ *  position must implement this interface.   When the DataGrid's grid skin part is added,
+ *  it will set its IDataGridElements' dataGrid property (the grid's owner is the DataGrid).
+ *  IDataGridElements should respond to this by adding listeners for dataGrid.grid scroll
+ *  position changes.  When the DataGrid is changed in a way that affects row/colunm layout,
+ *  all IDataGridElements will be invalidated.
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 2.0
+ *  @productversion Flex 4.5
+ */
+public interface IDataGridElement extends IVisualElement, IInvalidating
+{
+    /**
+     *  The DataGrid whose layout and grid scroll position this element must stay in sync with.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 2.0
+     *  @productversion Flex 4.5
+     */
+    function get dataGrid():DataGrid;
+    function set dataGrid(value:DataGrid):void;
+}
+}


Transferred from the Adobe Open Source Subversion Repository

Revision: 23243
Author:   cframpto@adobe.com
Date:     2011-12-20T00:59:57.384047Z

Log Message:
-----------
In frameworks, remove Adobe headers from all files except xml/mxml file types.  There are also a few .txt files that are license files that I didn't touch yet.

Modified Paths:
--------------
2361 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1248870 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/advancedgrids/src/mx/styles/metadata/IconColorStyles.as
+++ frameworks/projects/advancedgrids/src/mx/styles/metadata/IconColorStyles.as
@@ -1,30 +1,4 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-//  ADOBE SYSTEMS INCORPORATED
-//  Copyright 2009 Adobe Systems Incorporated
-//  All Rights Reserved.
-//
-//  NOTICE: Adobe permits you to use, modify, and distribute this file
-//  in accordance with the terms of the license agreement accompanying it.
-//
-////////////////////////////////////////////////////////////////////////////////

-/**
- *  The color for the icon in a skin.
- *  For example, this style is used by the CheckBoxIcon skin class
- *  to draw the check mark for a CheckBox control,
- *  by the ComboBoxSkin class to draw the down arrow of the ComboBox control,
- *  and by the DateChooserMonthArrowSkin skin class to draw the month arrow
- *  for the DateChooser control.
- *
- *  The default value depends on the component class;
- *  if it is not overridden by the class, the default value is 0x111111.
- *
- *  @langversion 3.0
- *  @playerversion Flash 9
- *  @playerversion AIR 1.1
- *  @productversion Flex 3
- */
 [Style(name="iconColor", type="uint", format="Color", inherit="yes")]

 /**


Transferred from the Adobe Open Source Subversion Repository

Revision: 23247
Author:   cframpto@adobe.com
Date:     2011-12-20T19:21:13.134833Z

Log Message:
-----------
Remove ADOBE SYSTEMS license and replace with Apache license in headers - frameworks.  A 2nd pass will be needed to get the files not handled up by the scripts.

Modified Paths:
--------------
4959 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1264751 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/mobilecomponents/src/spark/styles/metadata/GapStyles.as
+++ frameworks/projects/mobilecomponents/src/spark/styles/metadata/GapStyles.as
@@ -1,11 +1,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 //
-//  ADOBE SYSTEMS INCORPORATED
-//  Copyright 2005-2010 Adobe Systems Incorporated
-//  All Rights Reserved.
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
 //
-//  NOTICE: Adobe permits you to use, modify, and distribute this file
-//  in accordance with the terms of the license agreement accompanying it.
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////


Transferred from the Adobe Open Source Subversion Repository

Revision: 23246
Author:   cframpto@adobe.com
Date:     2011-12-20T17:40:08.069454Z

Log Message:
-----------
Rollback 23243.  If comment followed header it was stripped as well.

Modified Paths:
--------------
2361 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1280995 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/spark/src/spark/components/TextSelectionHighlighting.as
+++ frameworks/projects/spark/src/spark/components/TextSelectionHighlighting.as
@@ -1,3 +1,13 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  ADOBE SYSTEMS INCORPORATED
+//  Copyright 2008 Adobe Systems Incorporated
+//  All Rights Reserved.
+//
+//  NOTICE: Adobe permits you to use, modify, and distribute this file
+//  in accordance with the terms of the license agreement accompanying it.
+//
+////////////////////////////////////////////////////////////////////////////////

 package spark.components
 {