function musicPlayer() {
	//PRIVATE
	var self = this;
	var count = 0;
	
	//PUBLIC
	this.flashVersion = (typeof swfobject == 'object' ? swfobject.getFlashPlayerVersion() : {'major':0});
	this.isIE = !+"\v1";
	this.isIOS = (/iPhone|iPod|iPad/i).test(navigator.userAgent);
	this.html5Works = canPlayMP3(document.createElement('audio'));
	this.player = null;
	this.type = '';
	this.status = 'paused';
	this.current = 0;
	this.tracks = [];
	this.extraPlayAction = null;
	this.extraPauseAction = null;
	
	//METHODS
	this.init = function() {
		if(this.html5Works)
			this.buildHTML5Player();
		else
			this.buildFlashPlayer();
	}
	
	this.buildHTML5Player = function() {
		this.player = document.createElement('audio');
		this.type = 'html5';
	}
	
	this.buildFlashPlayer = function() {
		this.player = document.createElement('div');
		this.player.id = 'musicPlayer';
		document.body.appendChild(this.player);
		var params = {
			allowscriptaccess:"always",
			allowfullscreen:"true",
			wmode:"transparent",
			bgcolor:"#000000"
		};		
		var attr = {
			id:"musicPlayer",
			name:"musicPlayer"
		}
		swfobject.embedSWF("media/musicplayer.swf", "musicPlayer", "16", "16", "9.0.0", "", {}, params, attr, function() {
			self.player = $('musicPlayer');
		});
		this.type = 'flash';
	}
	
	this.addTrack = function(elem) {
		var elem;
		if(typeof elem === 'object') {
			var thisTrack = {};
			thisTrack['title'] = elem.innerHTML;
			thisTrack['url'] = elem.getAttribute('rel');
			addListener(elem, 'click', function(e) {
				preventDefaults(e);
				if(this.className.indexOf('active') === -1)
					self.playTrack(this.getAttribute('rel'));
				else
					self.pauseTrack();
			}, false);
			elem.setAttribute('rel', count);
			thisTrack['obj'] = elem;
			self.tracks[count++] = thisTrack;
		}
	}
	
	this.playTrack = function(num) {
		var num = (num == '' || num == null ? self.current : num);
		if(self.tracks[num]) {
			self.current = num;
			var track = self.tracks[num];
			switch(self.type) {
				case 'html5':
					self.player.src = track['url'];
					self.player.load();
					self.player.play();
					break;
				case 'flash':
					if(typeof self.player.playMusic == 'function')
						self.player.playMusic(track['url']);
					else {
						setTimeout(function() { self.playTrack(num); }, 1000);
						return false;
					}
					break;
			}
			this.status = 'playing';
			//Update list items to reflect playing track
			var par = track['obj'].parentNode.parentNode;
			var items = par.getElementsByTagName('a');
			for(var x=0; x<items.length; x++) {
				if(x == self.current)
					items[x].className = items[x].className.replace(' active','') + ' active';
				else
					items[x].className = items[x].className.replace(' active','');
			}
			if(typeof self.extraPlayAction === 'function')
				self.extraPlayAction();
		}
		else
			return false;
	}
	
	this.pauseTrack = function() {
		if(self.tracks[self.current]) {
			var track = self.tracks[self.current];
			switch(self.type) {
				case 'html5':
					self.player.pause();
					break;
				case 'flash':
					if(typeof self.player.pauseMusic === 'function')
						self.player.pauseMusic();
					else {
						setTimeout(function() { self.pauseTrack(); }, 1000);
						return false;
					}
					break;
			}
			this.status = 'paused';
			//Update list items
			track['obj'].className = track['obj'].className.replace(' active','');
			if(typeof self.extraPauseAction === 'function')
				self.extraPauseAction();
		}
	}
	
	this.nextTrack = function() {
		self.current++;
		if(self.current > self.tracks.length-1)
			self.current = 0;
		self.playTrack(self.current);
	}
	
	this.previousTrack = function() {
		self.current--;
		if(self.current < 0)
			self.current = self.tracks.length-1;
		self.playTrack(self.current);
	}
	
	this.init();	
}

function canPlayMP3(a) {
	var a;
	return !!(a.canPlayType && a.canPlayType('audio/mp3;').replace(/no/, ''));
}
