﻿package local.display
{
	import flash.display.*;
	import flash.events.*;
	import flash.media.*;
	import flash.net.*;
	import flash.utils.*;
	
	import local.display.MP3Equalizer;
	
	public class SimpleMP3Track extends MovieClip
	{
		public var equalizer: MP3Equalizer;
		
		// stg is internal cuz MP3VolumeButton uses it too
		internal var stg:      Stage;
		private  var maxWidth: Number;
		
		private var so:         SharedObject;
		private var _volume:    Number;
		
		private var sound:      Sound;
		private var soundTrans: SoundTransform;
		private var soundChan:  SoundChannel;
		private var spectrum:   ByteArray;
		private var current:    String;
		
		public function SimpleMP3Track() : void
		{
			so = SharedObject.getLocal("SleekPillMP3PlayerVolumeData");
			_volume = isNaN(so.data.volume) ? 1 : so.data.volume;
			so.data.volume = _volume;
			soundTrans = new SoundTransform(_volume);
			spectrum = new ByteArray();
		}
		
		public function playMP3(path: String) : void
		{
			current = path;
			resetSound();
			
			if (path == null)
				return void;
			
			sound = new Sound(new URLRequest(path));
			this.addEventListener(Event.ENTER_FRAME, playProgress);
			soundChan = sound.play(0, 1, soundTrans);
			soundChan.addEventListener(Event.SOUND_COMPLETE, soundComplete);
		}
		
		public function set volume(val: Number) : void
		{
			so.data.volume = _volume = soundTrans.volume = val;
			soundChan.soundTransform = soundTrans;
		}
		public function get volume() : Number {return _volume;}
		
		internal function resetSound() : void
		{
			if (sound == null || soundChan == null)
				return void;
			
			soundChan.stop();
			if (soundChan.hasEventListener(Event.SOUND_COMPLETE))
				soundChan.removeEventListener(Event.SOUND_COMPLETE, soundComplete);
			
			if (sound.isBuffering)
				try {sound.close();} catch(e: Error) {} // try... catch... added because safari can't cache info properly :(
			
			if (this.hasEventListener(Event.ENTER_FRAME))
				this.removeEventListener(Event.ENTER_FRAME, playProgress);
		}
		
		// dispatches on an enter frame to update the position of the playing bar
		private function playProgress(event: Event) : void
		{
			SoundMixer.computeSpectrum(spectrum);
			equalizer.show(spectrum);
		}
		
		private function soundComplete(event: Event) : void
		{
			playMP3(current);
		}
	}
}