/**
* Class for loading, scaling and smoothing images to a given MovieClip.
*
* @example
* var myLoader = new ImageLoader(this,"true",400,300);
* myLoader.loadImage("somephoto.jpg");
* 
* @author	Jeroen Wijering
* @version	1.11
**/


class com.jeroenwijering.utils.ImageLoader {


	/** MovieClip Loader Instance **/
	private var mcLoader:MovieClipLoader;
	/** Target MovieClip **/
	private var targetClip:MovieClip;
	/** Target Width **/
	private var targetWidth:Number;
	/** Target Height **/
	private var targetHeight:Number;
	/** Source URL **/
	private var sourceURL:String;
	/** Source Width **/
	private var sourceWidth:Number;
	/** Source Height **/
	private var sourceHeight:Number;
	/** Source Length (for SWF) **/
	private var sourceLength:Number;
	/** Overstretch Boolean **/
	private var overStretch:String = "none";
	/** Boolean that checks whether an SWF is loaded **/
	private var useSmoothing:Boolean;
	/** Interval for SWF meta checking **/
	private var metaInt:Number;


	/** Constructor for the ImageLoader **/
	function ImageLoader(tgt:MovieClip,ost:String,wid:Number,hei:Number) {
		targetClip = tgt;
		arguments.length > 1 ? overStretch = String(ost): null;
		if(arguments.length > 2) { 
			targetWidth = wid;
			targetHeight = hei;
		}
		mcLoader = new MovieClipLoader();
		mcLoader.addListener(this);
	};


	/** Switch image with bitmaparray if possible. **/
	public function onLoadInit(inTarget:MovieClip):Void {
		if(useSmoothing  == 'true') {
			var bmp = new flash.display.BitmapData(targetClip.mc._width,
				targetClip.mc._height, true, 0x000000);
			bmp.draw(targetClip.mc);
			var bmc:MovieClip = targetClip.createEmptyMovieClip("smc",
				targetClip.getNextHighestDepth());
			bmc.attachBitmap(bmp, bmc.getNextHighestDepth(),"auto",true);
			targetClip.mc.unloadMovie();
			targetClip.mc.removeMovieClip();
			delete targetClip.mc;
			scaleImage(targetClip.smc);
			onLoadFinished();
		} else {
			targetClip.mc.forceSmoothing = true;
			if(sourceURL.toLowerCase().indexOf(".swf") == -1) {
				scaleImage(targetClip.mc);
			}
			onLoadFinished();
		}
	};


	/** Scale the image while maintaining aspectratio **/
	private function scaleImage(tgt:MovieClip):Void {
		targetClip._xscale = targetClip._yscale = 100;
		var tcf = tgt._currentframe;
		tgt.gotoAndStop(1);
		sourceWidth = tgt._width;
		sourceHeight = tgt._height;
		sourceLength = tgt._totalframes/20;
		var xsr = targetWidth/sourceWidth;
		var ysr = targetHeight/sourceHeight;
		if (overStretch == "fit" || Math.abs(xsr-ysr) < 0.1) {
			tgt._width = targetWidth;
			tgt._height = targetHeight;
		} else if ((overStretch == "true" && xsr > ysr) || 
			(overStretch == "false" && xsr < ysr)) { 
			tgt._xscale = tgt._yscale = xsr*100;
		} else if(overStretch == "none") {
			tgt._xscale = tgt._yscale = 100;
		} else { 
			tgt._xscale = tgt._yscale = ysr*100;
		}
		if(targetWidth != undefined) {
			tgt._x = targetWidth/2 - tgt._width/2;
			tgt._y = targetHeight/2 - tgt._height/2;
		}
		tgt.gotoAndPlay(tcf);
		onMetaData();
	};


	/** Start loading an image. **/
	public function loadImage(img:String):Void {
		sourceURL = img;
		targetClip.mc.clear();
		targetClip.smc.unloadMovie();
		targetClip.smc.removeMovieClip();
		delete targetClip.smc;
		checkSmoothing(img);
		var raw:MovieClip = targetClip.createEmptyMovieClip("mc",1);
		mcLoader.loadClip(img,raw);
		if(img.toLowerCase().indexOf(".swf") > -1) {
			metaInt = setInterval(this,"setSWFMeta",200);
		}
	};


	/** Check whether smoothing can be enabled. **/
	private function checkSmoothing(img:String):Void {
		var idx:Number = _root._url.indexOf("/",8);
		var rot:String = _root._url.substring(0,idx);
		if(System.capabilities.version.indexOf("7,0,") > -1 ||
			img.toLowerCase().indexOf(".swf") > -1 || 
			_root._url.indexOf("file://") > -1 || 
			(img.indexOf(rot) == -1 && img.indexOf('http://') == 0)) {
			useSmoothing = false;
		} else {
			useSmoothing = true;
		}
	};


	/** Check when to set the SWF metadata **/
	private function setSWFMeta() {
		if(targetClip.mc._currentframe > 0) {
			clearInterval(metaInt);
			scaleImage(targetClip.mc);
		}
	};


	/** Event handler; invoked when loading. **/
	public function onLoadProgress(tgt:MovieClip,btl:Number,btt:Number) {};


	/** Event handler; invoked when image is completely loaded. **/
	public function onLoadFinished() {};


	/** Event handler; invoked when metadata is received. **/
	public function onMetaData() {};


}