var Player = Class.create({
	initialize:function() {
		this.fProjects = [];
		
	},
	addProject:function(pProject) {
		this.fProjects.push(pProject);
	},
	pauseAllSounds:function(pExcept) {
		for(var i = 0; i < this.fProjects.length; i++) {
			var lProject = this.fProjects[i];
			if(pExcept != lProject)
			lProject.pauseSound();
		}
	}

	
});


var Project = Class.create({
	initialize:function(pPlayer, pHolderId, pSoundUrl) {
		this.fSoundUrl = pSoundUrl;
		this.fPlayer = pPlayer;
		this.fProjectId = pHolderId + "sound";
		this.fTracks = [];
		this.fHolderDivId = pHolderId;
		this.fPlayer.addProject(this);
	},
	addTrack:function(pTrack) {
		this.fTracks.push(pTrack);
	},
	draw:function() {
		this.fPlayerDiv = new Element('div', {'class':'projectplayer'});
		this.fControlDiv = new Element('div', {'class':'controlarea'});
		this.fTrackAreaDiv = new Element('div', {'class':'trackarea'});
		
	
		this.fPlayerDiv.appendChild(this.fTrackAreaDiv);
			this.fPlayerDiv.appendChild(this.fControlDiv);
		this.fPlayerDiv.appendChild(new Element('div', {'class':'clear'}));
		
		$(this.fHolderDivId).appendChild(this.fPlayerDiv);
		this.drawTrackArea();
		this.drawControlArea();
		
	
		
	},
	drawTrackArea:function() {
		this.fPositionBar = new Element('div', {'class':'positionbar'})
		this.fTracksDiv = new Element('div', {'class':'tracks'});
		
		this.fTrackAreaDiv.appendChild(this.fPositionBar);
		this.fTrackAreaDiv.appendChild(this.fTracksDiv);
		
		for(var i =0; i < this.fTracks.length; i++ ) {
			var lTrack = this.fTracks[i];
			lTrack.draw(this.fTracksDiv);
		}

		this.fTrackAreaDiv.observe('click', this.setPosition.bind(this));
		
	},
	drawControlArea:function() {
		this.fPlaylink = new Element('img', {'src':'/images/icons/play.png', 'width':'32', 'height':'32'});

		this.fControlDiv.appendChild(this.fPlaylink);
		this.fPlaylink.observe('click', this.playSound.bind(this));
	},
	playSound:function(pEvent) {
		this.fPlayer.pauseAllSounds(this);
		
		if(this.getSound().paused) {
			this.getSound().resume();
			this.setPlayIconState(true);
		} else if(this.getSound().playState == 0) {
			this.getSound().play();
			this.setPlayIconState(true);
		} else {
			this.getSound().pause();
			//this.getSound().resume();
			this.setPlayIconState(false);
		}
	},
	setPlayIconState:function(pState) {
		if(!pState)
			this.fPlaylink.src = '/images/icons/play.png';
		else
			this.fPlaylink.src = '/images/icons/pause.png';
	},
	pauseSound:function() {
		this.getSound().pause();
		this.setPlayIconState(false);
	},
	soundStopped:function(pState) {
		this.setPlayIconState(false);
	},
	soundFinished:function(pState) {
		this.setPlayIconState(false);
		this.getSound().setPosition(0);
	},
	getSound:function() {
		if(this.fSound == null) {
			this.fSound = soundManager.createSound({
			  id: this.fProjectId,
			  url: this.fSoundUrl,
			  volume: 50,
				whileplaying:this.whilePlaying.bind(this),
				onstopped:this.soundStopped.bindAsEventListener(this, false),
				onfinish:this.soundFinished.bindAsEventListener(this, false),
				debugMode:false
			  //onload: soundLoadedFunction
			});
		}
		return this.fSound;
	},
	
	whilePlaying:function() {
		this.setPositionBar();
	},
	getPositionInSound:function() {
		return this.fSound.position / this.fSound.durationEstimate;
	},
	setPositionBar:function() {
		var lPos = this.getPositionInSound();
		var lPosInPix = lPos * this.getTrackWidth();
		
		this.fPositionBar.setStyle({'left': lPosInPix + 'px'});
	},
	getTrackWidth:function() {
		var lDim = this.fTrackAreaDiv.getDimensions();
		return lDim.width;
	},
	setPosition:function(pEvent) {
		var lPos = pEvent.layerX / this.getTrackWidth();
		var lPosInSeconds = lPos * this.getSound().durationEstimate;
		this.getSound().setPosition(lPosInSeconds);
	}
	
	
});

var Track = Class.create({
	initialize:function() {
		this.fEvents = [];
	},
	addEvent:function(pEvent) {
		this.fEvents.push(pEvent);
	},
	draw:function(pHolder) {
		this.fTrackDiv = new Element('div', {'class':'track'})
		pHolder.appendChild(this.fTrackDiv);
		
		for(var i = 0; i < this.fEvents.length; i++) {
			var lEvent = this.fEvents[i];
			lEvent.draw(this.fTrackDiv);
		}
	}
	
})

var Event = Class.create({
	initialize:function(pImgUrl, pTotalTime, pLength, pStartTime) {
		this.fTotalTime = pTotalTime;
		this.fStartTime = pStartTime;
		this.fLength = pLength;
		this.fImageUrl = pImgUrl;
	},
	

	
	draw:function(pTrackHolder) {
		var lDimensions = pTrackHolder.getDimensions();
		var lParentWidth = lDimensions.width - 10;
		var lParentHeight = lDimensions.height - 1;
		var lRelativeWidth = this.fLength / this.fTotalTime;
		var lWidth = lParentWidth * lRelativeWidth;
		var lLeft = (this.fStartTime / this.fTotalTime) * lParentWidth;
		
		this.fEventDiv = new Element('div', {'class':'soundevent'});
		this.fEventDiv.appendChild(this.getThumbnailDiv(lWidth, lParentHeight))
		this.fEventDiv.setStyle({'width':lWidth + 'px'});
		this.fEventDiv.setStyle({'left':lLeft + 'px'});
		pTrackHolder.appendChild(this.fEventDiv);
	},
	
	getThumbnailDiv:function(pWidth, pHeight) {
		var lElement = new Element('img', {'src':this.fImageUrl, 'width':pWidth, 'height':pHeight});
		return lElement;
	}
	
})

