function Tag(tagname) {
	
	this.setParam = setParam;
	this.setAttr = setAttr;
	this.getHTML = getHTML;
	this.params = new Array();
	this.attributes = new Array();
	this.setInnerTag = setInnerTag;
	
	var innertag = null;
	
	function setInnerTag(tag) {
		innertag = tag;
	}
	
	function setParam(name, value) {
		this.params[name] = value;
	}
	
	function setAttr(name, value) {
		this.attributes[name] = value;
	}
	
	function getHTML() {
		var html = new StringBuffer();
		html.append("<");
		html.append(tagname);
		html.append(" ");
		for (var i in this.attributes) {
			html.append(i);
			html.append("=");
			html.append(quote(this.attributes[i]));
			html.append(" ");
		}
		html.append(">");
		for (var i in this.params) {
			html.append("<param name=");
			html.append(quote(i));
			html.append(" value=");
			html.append(quote(this.params[i]));
			html.append(">");
		}
		if (innertag) {
			html.append(innertag.getHTML());
		}
		html.append("</");
		html.append(tagname);
		html.append(">");
		return html.toString();
	}
	
	function quote(string) {
		return "\"" + string + "\"";
	}
	
}
function MediaPlayer(content) {

	this.play = play;
	this.stop = stop;
	this.pause = pause;
	this.state = state;
	this.mute = mute;
	this.muted = false;
	this.content = content;
	this.getPlayState = getPlayState;
	this.getPlayer = getPlayer;
	this.getHTML = getHTML;
	this.getId = getId;
	
	var id = content.id + "_player";
	
	var player = null;
		
	var MS_MEDIA_PLAYER_TYPE = 1;
	var QUICKTIME_PLAYER_TYPE = 2;
	var REAL_PLAYER_TYPE = 3;
	var FLASH_PLAYER_TYPE = 4;
	var currentType = MS_MEDIA_PLAYER_TYPE;
	
	var READY = "READY";
	var LOADING = "LOADING";
	var STOPPED = "STOPPED";
	var PLAYING = "PLAYING";
	var FINISHED = "FINISHED";
	var ERROR = "ERROR";
	var NOTINITIALIZED = "NOTINITIALIZED";
	var playState = NOTINITIALIZED;
	var realPlayerPlayed = false;
	var statuslayer = null;
	var showStatus = true;
	var volume = 100;
	
	function getId() {
		return id;
	}
	
	function getPlayer() {
		return player;
	}
	
	function getPlayState() {
		state();
		return playState;
	}
		
	function hasExtension(filename, extension) {
		var ext = extension.toLowerCase().split(",");
		var lowercaseFilename = filename.toLowerCase();
		var hasOne = false;
		for (var i = 0; i < ext.length; i++) {
			var a = lowercaseFilename.indexOf(ext[i]);
			if (a > 0) {
				var diff = filename.length - ext[i].length;
				if (diff > 0 && filename.substring(diff) == ext[i]) hasOne = true;
			}
		}
		return hasOne;
	}
	function getType(filename) {
		var type = 0;
		if (hasExtension(filename, ".mp3,.wav,.mpeg,.mpg,.wmv,.avi")) {
			type = MS_MEDIA_PLAYER_TYPE;
		}
		else if (hasExtension(filename, ".mov")) {
			type = QUICKTIME_PLAYER_TYPE;
		}
		else if (hasExtension(filename, ".rm")) {
			type = REAL_PLAYER_TYPE;
		}
		else if (hasExtension(filename, ".swf")) {
			type = FLASH_PLAYER_TYPE;
		}
		return type;
	}
	
	function createFlashPlayer(file, width, height) {
		var dataFile = file.substring(file.lastIndexOf("/") + 1, file.lastIndexOf(".")) + ".txt";
		var dataPath = "data/flash/" + dataFile;
		//alert(dataPath);
		var objecttag = new Tag("object");
		var type = "application/x-shockwave-flash";
		objecttag.setAttr("id", id);
		objecttag.setAttr("classid", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000");
		objecttag.setAttr("codebase", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0");
		objecttag.setAttr("type", type);
		objecttag.setAttr("width", width);
		objecttag.setAttr("height", height);
		
		if (FLASHMOVIES_TRANSPARENT) {
			objecttag.setParam("wmode", "transparent");
		}
		objecttag.setParam("movie", file);
		objecttag.setParam("quality", "high");
		objecttag.setParam("flashvars", "datapath=" + dataPath);
		
		var embedtag = new Tag("embed");
		embedtag.setAttr("name", id);
		embedtag.setAttr("id", id);
		embedtag.setAttr("type", type);
		embedtag.setAttr("width", width);
		embedtag.setAttr("height", height);
		embedtag.setAttr("src", file);
		embedtag.setAttr("quality", "high");
		embedtag.setAttr("flashvars", "datapath=" + dataPath);
		
		if (FLASHMOVIES_TRANSPARENT) {
			embedtag.setAttr("wmode", "transparent");
		}
		embedtag.setAttr("pluginspage", "http://www.macromedia.com/go/getflashplayer");
		
		objecttag.setInnerTag(embedtag);
		
		return objecttag.getHTML();
	}
	
	function createMSMediaPlayer(file, width, height) {
		var objecttag = new Tag("object");
		var type = "application/x-oleobject";
		objecttag.setAttr("id", id);
		objecttag.setAttr("classid", "CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6");
		objecttag.setAttr("type", type);
		objecttag.setAttr("width", width);
		objecttag.setAttr("height", height);
		
		objecttag.setParam("uiMode", "none");
		objecttag.setParam("URL", file);
		objecttag.setParam("SendPlayStateChangeEvents", "true");
		objecttag.setParam("AutoStart", "false");
		return objecttag.getHTML();
	}
	
	function createRealPlayer(file, width, height) {
		var ie = document.all;
		var html = "";
		var embedtag = new Tag("embed");
		var type = "audio/x-pn-realaudio-plugin";
		embedtag.setAttr("name", id);
		embedtag.setAttr("id", id);
		embedtag.setAttr("type", type);
		embedtag.setAttr("width", width);
		embedtag.setAttr("height", height);
		embedtag.setAttr("loop", false);
		embedtag.setAttr("src", file);
		embedtag.setAttr("autostart", false);
		embedtag.setAttr("enablejavascript", true);
		embedtag.setAttr("controls", "ImageWindow");
		
		if (ie) {			
			var objecttag = new Tag("object");
			objecttag.setAttr("id", id);
			objecttag.setAttr("classid", "CLSID:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA");
			objecttag.setAttr("type", type);
			objecttag.setAttr("width", width);
			objecttag.setAttr("height", height);
			objecttag.setParam("controls", "ImageWindow");
			objecttag.setParam("src", file);
			objecttag.setParam("autostart", "false");
		
			objecttag.setInnerTag(embedtag);
			html = objecttag.getHTML();
		}
		else {
			html = embedtag.getHTML();
		}
		return html;
	}
	
	function createQuicktimePlayer(file, width, height) {
		var embedtag = new Tag("embed");
		var type = "video/quicktime";
		embedtag.setAttr("name", id);
		embedtag.setAttr("id", id);
		
		embedtag.setAttr("type", type);
		embedtag.setAttr("width", width);
		embedtag.setAttr("height", height);
		embedtag.setAttr("src", file);
		embedtag.setAttr("controller", "false");
		embedtag.setAttr("cache", "true");
		embedtag.setAttr("enablejavascript", "true");
		
		return embedtag.getHTML();
	
	}
	
	
	function getHTML(mediafile, width, height) {
		var html = "";
		currentType = getType(mediafile);
		
		if (currentType == MS_MEDIA_PLAYER_TYPE) {
			html = createMSMediaPlayer(mediafile, width, height);
		}
		else if (currentType == REAL_PLAYER_TYPE) {	
			html = createRealPlayer(mediafile, width, height);
		}
		else if (currentType == QUICKTIME_PLAYER_TYPE) {
			html = createQuicktimePlayer(mediafile, width, height);
		}
		else if (currentType == FLASH_PLAYER_TYPE) {
			html = createFlashPlayer(mediafile, width, height);
		}
		return html;
	}
		
	
	
	function play(doContinue) {
		if (playState == PLAYING) return;
		player = document.getElementById(id);
		
		if (!doContinue) {
			playState = READY;
		}
		
		try {
			if (currentType == MS_MEDIA_PLAYER_TYPE) {
				if (player && player.controls) {
					player.controls.play();
				}
			}
			else if (currentType == REAL_PLAYER_TYPE) {
				if (player) player.DoPlay();
			}
			else if (currentType == QUICKTIME_PLAYER_TYPE) {
				//if (player) player.src = filename;
			}
			else if (currentType == FLASH_PLAYER_TYPE) {
				//if (player) player.src = filename;
			}
		}
		catch (e) {}
	}
	
	function stop() {
		try {
			if (currentType == MS_MEDIA_PLAYER_TYPE) {
				if (player.controls) player.controls.stop();
			}
			if (currentType == REAL_PLAYER_TYPE) {
				if (player) player.DoStop();
			}
			if (currentType == QUICKTIME_PLAYER_TYPE) {
				if (player) player.Stop();
			}
			if (currentType == FLASH_PLAYER_TYPE) {
				if (player) player.Stop();
			}
			player = null;
		}
		catch (e) {
			
		};
	}
	
	function pause() {
		try {
			
			if (currentType == MS_MEDIA_PLAYER_TYPE) {
				if (player.controls) player.controls.pause();
			}
			if (currentType == REAL_PLAYER_TYPE) {
				if (player) player.DoPause();
			}
			if (currentType == QUICKTIME_PLAYER_TYPE) {
				if (player) player.Pause();
			}
			if (currentType == FLASH_PLAYER_TYPE) {
				if (player) player.Pause();
			}
		}
		catch (e) {};
	}
	
	function mute(doMute) {
		try {
			if (currentType == MS_MEDIA_PLAYER_TYPE) {
				if (player) {
					player.settings.mute = doMute;
					this.muted = doMute;
				}
			}
			/*
			if (currentType == REAL_PLAYER_TYPE) {
				if (player) player.DoPause();
			}
			if (currentType == QUICKTIME_PLAYER_TYPE) {
				if (player) player.Pause();
			}
			if (currentType == FLASH_PLAYER_TYPE) {
				if (player) player.Pause();
			}
			*/
		}
		catch (e) {
			alert(e);
		};
	}


	function state() {
		if (!player) return;
		var tempState = 0;
		if (currentType == MS_MEDIA_PLAYER_TYPE) {
			tempState = player.PlayState;
				
			if (tempState == 9) {
				playState = LOADING;
			}
			else if (tempState == 3) {
				playState = PLAYING;
			}
			else if (tempState == 1) {
				playState = FINISHED;
			}
			else {
				playState = tempState;
			}
		}
		else if (currentType == REAL_PLAYER_TYPE) {
			tempState = player.GetPlayState();
			
			if (tempState == 0) {
				playState = NOTINITIALIZED;
			}
			if (tempState == 1) {
				playState = READY;
			}
			else if (tempState == 2) {
				playState = LOADING;
			}
			else if (tempState == 3) {
				playState = PLAYING;
				realPlayerPlayed = true;
			}
			else if (tempState == 0 && realPlayerPlayed) {
				playState = FINISHED;
			}
		}
		else if (currentType == QUICKTIME_PLAYER_TYPE) {
			var status = player.GetPluginStatus();
			if (status == "Waiting") {
				playState = READY;
			}
			else if (status == "Playable") {
				playState = LOADING;
			}
			else if (status == "Complete") {
				var playing = (player.GetEndTime() > player.GetTime());
				if (playing) {
					playState = PLAYING;
				}
				else {
					playState = FINISHED;
				}
			}
		}
		else if (currentType == FLASH_PLAYER_TYPE) {
			playState = PLAYING;
		
		}
	}
}

function MediaTracker(varname) {
	
	this.finished = finished;
	this.registerPlayer = registerPlayer;
	this.track = track;
	this.playAll = playAll;
	this.stopAll = stopAll;
	this.shutdown = shutdown;
	this.pauseAudios = pauseAudios;
	this.continueAudios = continueAudios;
	this.muteAll = muteAll;
	this.unMuteAll = unMuteAll;
	this.trackMedia = trackMedia;
	
	var players = new Array();
	var trackTimeout = null;
	
	function trackMedia(id) {
		var currentStep = engine.getCurrentStep();
		var content = currentStep.getContentById(id);
		if (content) {
			content.track();
		}	
	}
		
	function registerPlayer(player) {
		if (getIndexOfPlayer(player) == -1) {
			players[players.length] = player;
		}
	}
	
	function muteAll(player) {
		for (var i = 0; i < players.length; i++) {
			if (player) {
				if (player != players[i]) {
					players[i].mute(true);
				}
			}
			else {
				players[i].mute(true);
			}
		}
	}
	
	function unMuteAll() {
		for (var i = 0; i < players.length; i++) {
			players[i].mute(false);
		}
	}
	
	
	function playAll() {
		
	}
	
	function stopAll() {
		for (var i = 0; i < players.length; i++) {
			players[i].stop();
			
		}
	}
	
	
	function shutdown() {
		stopAll();
	}	
	
	function pauseAudios() {
		
	}
	
	function continueAudios() {
		
	}		
	
	function track() {
		
	}
	
	function getIndexOfPlayer(player) {
		var index = -1;
		for (var i = 0; i < players.length; i++) {
			if (players[i].getId() == player.getId()) {
				index = i;
				break;
			}
		}
		return index;
	}
	
	function finished(player) {
		alert("finished: " + player.getId());
		
	}
}
