var myPlayers = new Object;
function newPlaylistOrder(playlistItem) {
	
	var playList = playlistItem.parentNode;
	newPlaylistOrderByList(playList);
	
}

function flashAlert(message) {
	
	alert("<flash> "+message);
	
}
	
function newPlaylistOrderByList(playList) {
	
	var playerID = playList.id.substring(0,playList.id.length-8);
	
	var playlistEntries = playList.getElementsByTagName("li");
	var player = MansefPlayer.getInstance(playerID);

	player.queue.clear();
	for (var i = 0; i < playlistEntries.length; i++) {
		var thisItem = playlistEntries[i].name.split(" ");
		player.queue.addItem(playlistEntries[i].childNodes[0].lastChild.nodeValue,thisItem[0],thisItem[1],thisItem[2],thisItem[3]);
	}
	player.queue.deploy();
	//player.queue.redeploy();
	player.queue.highlightNowPlaying(player.queue.playing);

}

function clickPushQueuedVideo() {
	
	var fireData = this.name.split(" ");
	var playerID = fireData[0];
	var queueName = fireData[1];
	
	var player = MansefPlayer.getInstance(playerID);
	var queueItem = player.queue.getQueueItem(queueName);
	
	player.pushVideo(playerID,queueItem[0],queueItem[1],queueItem[2],queueItem[5]);
	player.queue.highlightNowPlaying(queueName);
	
}

function clickPushVideo(playerID, videoFile, videoURL, streamServer, videoFolder) {

	var player = MansefPlayer.getInstance(playerID);
	player.pushVideo(playerID, videoFile, videoURL, streamServer, videoFolder);
	player.queue.highlightNowPlaying(hex_md5(videoURL+videoFile));

}

function waitReadyPlayer(playerID) {

	var player = MansefPlayer.getPlayer(playerID);
	var playerObj = MansefPlayer.getInstance(playerID);
	if (!player || player == "undefined") { return; }

	var amtLoaded = player.PercentLoaded();
	
	if (amtLoaded == 100) {
		playerObj.ready = true;
		clearTimeout(playerObj.readyInterval);
		playerObj.startPlayer();
		return;
	}

	if (!playerObj.readyInterval) { playerObj.readyInterval = window.setInterval("waitReadyPlayer('"+playerID+"')",200); }
	
}

/*
 * MansefPlayer Class
 *
 * Manages a MansefPlayer Flash Object/Embed
 * Controls the queue and the playback
 */
var MansefPlayer = Class.create();

MansefPlayer.prototype = {
	
	initialize: function(playerID,playerOptions) {
		this.playerID = playerID;
		this.queue = new MansefPlayerQueue(this,playerOptions.showEffects);
		this.showPlaylist = playerOptions.showPlaylist;
		this.autoAdvance = playerOptions.autoAdvance;
		this.autoPlay = playerOptions.autoPlay;
		this.playerPath = playerOptions.playerPath;
		this.readyInterval = 0;
		this.ready = false;
	},
	
	waitReady: function() {
		this.readyInterval = window.setInterval("waitReadyPlayer('"+this.playerID+"')",200);
	},
	
	startPlayer: function() {
		// Tell the player its name
		this.player = MansefPlayer.getPlayer(this.playerID);
		this.player.myNameIs(this.playerID);
		this.player.setAutoPlay(this.autoPlay);
		this.queue.playNextItem();
	},
	
	getPlayerID: function() {
		return this.playerID;
	},
	
	controlPlayback: function(playbackMethod) {
		this.player.controlPlayback(playbackMethod);
	},
	
	pushVideo: function(playerID, videoFile, videoURL, streamServer, videoFolder) {
		this.player.pushFlashVideo(videoFile,videoURL,streamServer,videoFolder);
	},
	
	donePlaying: function(longName) {
		if (this.autoAdvance) { this.queue.playNextItem(longName); }
	},
	
	deploy: function(playerWidthSize,playerHeightSize,skipPlaylist) {
		this.ready = false;
		
		var playerNode = this.playerID + "Player";
		var playerNodeObj = document.getElementById(playerNode);
		playerNodeObj.innerHTML = "";
		
		var playerHeight = playerHeightSize + 32;
		var so = new SWFObject(this.playerPath+"fplayer-"+playerWidthSize+".swf", this.playerID, playerWidthSize, playerHeight, 8, "#FFFFFF");
		
		so.useExpressInstall(this.playerPath+'expressinstall.swf');
		so.write(playerNode);
		
		if (this.showPlaylist && !skipPlaylist) { this.queue.buildControl(); }
		
	}
}
		
// MansefPlayer CLASS METHODS (Static)
MansefPlayer.tell = function(playerID,command,data) {
	
	var toCall = "myPlayers['"+playerID+"']."+command+"('"+data+"');";
	eval(toCall);
	
};

MansefPlayer.getPlayer = function(videoID) {
	
	var playerObject = "embed";
	if (((navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) ? "Firefox" : "Explorer") == "Explorer") {
		playerObject = "object";
	}
	
	var myObjects = document.getElementsByTagName(playerObject);
	var thisPlayer;
	for (var i = 0; i < myObjects.length; i++) {
		if (myObjects[i].id == videoID) { thisPlayer = myObjects[i]; break; }
	}
	return thisPlayer;
	
};

MansefPlayer.getInstance = function(playerID) {
	return eval("myPlayers['"+playerID+"'];");
};

MansefPlayer.getBrowser = function() {
	return (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) ? "Firefox" : "Explorer";
};

MansefPlayer.changePlayerSize = function() {
	var clickData = this.name.split(" ");
	var playerID = clickData[0];
	var newSize = clickData[1];
	
	var player = MansefPlayer.getInstance(playerID);
	player.deploy(newSize,true);
	player.waitReady();
	
}

/*
 * MansefPlayerQueue Class
 *
 * Manages a queue for a MansefPlayer Object
 */

var MansefPlayerQueue = Class.create();

MansefPlayerQueue.prototype = {
	
	initialize: function(parentPlayer,showEffects) {
		this.queuedItems = new Array();
		this.parent = parentPlayer;
		this.playing = 0;
		this.effects = showEffects;
	},
	
	addItem: function(videoTitle, videoOptions) {
		
		//videoName, videoURL, streamProvider, videoFolder
		var queueName = hex_md5(videoOptions.videoURL + videoOptions.videoFile);
		if (!this.exists(queueName)) {
			this.queuedItems.push(
				new Array(
					videoOptions.videoFile,
					videoOptions.videoURL,
					videoOptions.videoServer,
					queueName,
					videoTitle,
					videoOptions.videoFolder
				)
			);
		}
	},
	
	deleteItem: function(queueName) {
		for (var i = 0; i < this.queuedItems.size; i++) {
			if (this.queuedItems[i][3] == queueName) {
				this.queuedItems.splice(i,1);
			}
		}
	},
	
	size: function() {
		return this.queuedItems.length;
	},
	
	clear: function() {
		this.queuedItems = new Array();
	},
	
	exists: function(queueName) {
		for (var i = 0; i < this.size(); i++) {
			if (this.queuedItems[i][3] == queueName) { return true; }
		}
		return false;
	},
	
	getList: function() {
		var queueString = "";
		for (var i = 0; i < this.size(); i++) {
			queueString += this.queuedItems[i][0]+"\n";
		}
		return queueString;
	},
	
	getQueueItem: function(itemQueueName) {
		for (var i = 0; i < this.size(); i++) {
			if (this.queuedItems[i][3] == itemQueueName) { return this.queuedItems[i]; }
		}
	},
	
	playNextItem: function(oldVideoLongName) {
		if (oldVideoLongName != "undefined" && oldVideoLongName != null) {
			var oldVideoQueueName = hex_md5(oldVideoLongName);
			for (var i = 0; i < this.size(); i++) {
				if (this.queuedItems[i][3] == oldVideoQueueName) {
					var newQueueIndex = ++i;
					break;	
				}
			}
		} else {
			var newQueueIndex = 0;
		}
		
		if (newQueueIndex < 0 || newQueueIndex >= this.size()) { newQueueIndex = 0; }
		if (newQueueIndex >= this.size()) return;
		
		var newVideo = this.queuedItems[newQueueIndex];
		this.parent.pushVideo(this.parent.playerID,newVideo[0],newVideo[1],newVideo[2],newVideo[5]);
		this.playing = newVideo[3];
		
		if (!this.parent.showPlaylist) { return }
		
		this.highlightNowPlaying(newVideo[3]);
	
	},
	
	buildControl: function() {
		if (!this.parent.showPlaylist) { return }
		var playlistControl = this.parent.playerID+"PlaylistControl";
		var playlistControlObj = document.getElementById(playlistControl);
		
		var playlistTitle = document.createElement("div");
		playlistTitle.className = "playlistLabel";
		playlistTitle.innerHTML = "VIDEO PLAYLIST";
		playlistControlObj.appendChild(playlistTitle);
		
		var playlistArea = document.createElement("ul");
		playlistArea.id = this.parent.playerID+"Playlist";
		playlistArea.className = "playlist";
		playlistControlObj.appendChild(playlistArea);
		
		var playlistTitle = document.createElement("div");
		playlistTitle.className = "playlistLabel";
		playlistTitle.innerHTML = "PLAYER SIZE";
		playlistControlObj.appendChild(playlistTitle);
		
		var playerSizeControls = document.createElement("div");
		playerSizeControls.className = "playerSizeControls";
		var sizes = new Array('320','640');
		
		for (var i = 0; i < sizes.length; i++) {
			var thisSize = sizes[i];
			var playerSize = document.createElement("div");
			playerSize.className = "playerSize";
			playerSize.onclick = MansefPlayer.changePlayerSize;
			playerSize.innerHTML = thisSize+"px";
			playerSize.name = this.parent.playerID + " " + thisSize;
			playerSize.onmouseover = function() { this.className = "playerSize playerSizeOver"; }
			playerSize.onmouseout = function() { this.className = "playerSize"; }
			playerSizeControls.appendChild(playerSize);
		}

		playlistControlObj.appendChild(playerSizeControls);
		
	},
	
	deploy: function() {
		
		if (!this.parent.showPlaylist) { return }
		
		var playlistArea = this.parent.playerID+"Playlist";
		var playlistDOM = document.getElementById(playlistArea);
		
		playlistDOM.innerHTML="";
		
		for (var i = 0; i < this.size(); i++) {
			var queueItem = this.queuedItems[i];
			
			var myNewOption = document.createElement("li");
			myNewOption.id = queueItem[3];
			myNewOption.name = queueItem[0]+" "+queueItem[1]+" "+queueItem[2]+" "+queueItem[5];
			
			var myNewSpan = document.createElement("span");
			var myNewSpanText = document.createTextNode(queueItem[4]);
			myNewSpan.appendChild(myNewSpanText);
			myNewSpan.name = this.parent.playerID+" "+queueItem[3];
			myNewSpan.onclick = clickPushQueuedVideo;
			myNewSpan.className = "clickableListItem";
			
			myNewOption.appendChild(myNewSpan);
			playlistDOM.appendChild(myNewOption);
		}

		this.finalize();

	},
	
	redeploy: function() {
		
		if (!this.parent.showPlaylist) { return }
		
		var playlistName = this.parent.playerID+"Playlist";
		var playlistArea = document.getElementById(playlistName);
		
		var playlistItems = playlistArea.getElementsByTagName("li");
		for (var i = 0; i < playlistItems.length; i++) {
			var queueItem = this.getQueueItem(playlistItems[i].id);
			playlistItems[i].name = queueItem[0]+" "+queueItem[1]+" "+queueItem[2]+" "+queueItem[5];
		}
	
	},
	
	finalize: function() {
		
		if (!this.parent.showPlaylist) { return }
		
		var playlistName = this.parent.playerID+"Playlist";
		Sortable.create(playlistName, {'onChange': newPlaylistOrder});
	},
	
	highlightNowPlaying: function(itemToHighlight) {

		if (!this.parent.showPlaylist) { return }

		this.playing = itemToHighlight;
		this.deploy();
		this.fadeOld(itemToHighlight);
		
		var playlistName = this.parent.playerID+"Playlist";
		
		var playlistItem = document.getElementById(itemToHighlight);
		playlistItem.className = "playing";
		if (this.effects) {
			new Effect.Fade(playlistItem, { duration: 1, from: 1, to: 0.5, queue: {position: 'front', scope: playlistName} });
			new Effect.Fade(playlistItem, { duration: 1, from: 0.5, to: 1, queue: {position: 'end', scope: playlistName} });
		}
		
		//this.redeploy();
	},
	
	fadeOld: function(stopPosition) {
		
		if (!this.parent.showPlaylist) { return }
		
		var playlistName = this.parent.playerID+"Playlist";
		var playlistArea = document.getElementById(playlistName);
		
		var playlistItems = playlistArea.getElementsByTagName("li");
		for (var i = 0; i < playlistItems.length; i++) {
			if (playlistItems[i].id != stopPosition) {
				playlistItems[i].className="played";
				if (this.effects) {
					new Effect.Fade(playlistItems[i], { duration: 1, from: 1, to: 0.3 });
				}
			} else {
				return;
			}
		}
	}
	
}