 		private var lastUpdate:int = 0;
 		private var forceReadTimer:Timer;
 
-		public var sourceId:String = null;
+		public const elementId:LinkableString = newLinkableChild(this, LinkableString);
 
 
 		public function JavaScriptCanvas()

{
	import weave.compiler.StandardLib;
	import weave.api.core.ILinkableObject;

	import mx.containers.Canvas;
	import mx.controls.Image;

			/* Only execute on the timer tick if we haven't loaded recently */
			if (evt.type == TimerEvent.TIMER && (getTimer() < (lastUpdate + 200)) ) return;

			var content:String;

			/* TODO convert to raw ExternalInterface */
			if (elementId.value) content = JavaScript.exec(
				{elementId: elementId.value},
				"var canvas = document.getElementById(elementId);",
				"return canvas && canvas.toDataURL && canvas.toDataURL().split(',').pop();");

			if (elementId.value && content)
			{
				setImage(content);	
			}
		}

		public function setImage(base64:String):void
