//	media_player.js
//	12 Mar 2009
//	AJAX-based Media Player using an XML parser for playlist data
//	www.ignitewebsolutions.com

function MediaPlayer(playerName,playlistURL) {
	// --------------------
	// --- PRIVATE VARS ---
	var DEFAULT_VIDEO_WIDTH = 400;
	var DEFAULT_VIDEO_HEIGHT = 300;
	var DEFAULT_OVERLAY_PADDING = 6;
	var DEFAULT_PLAYER_TITLE = "Media Player";
	var MIN_OVERLAY_WIDTH = 640;
	var MIN_OVERLAY_HEIGHT = 360;
	
	var playerName = playerName;
	var xmlParser = new AjaxXMLParser();
	var videoWidth = DEFAULT_VIDEO_WIDTH;
	var videoHeight = DEFAULT_VIDEO_HEIGHT;
	
	init();
	
	// -------------------------
	// --- PRIVATE FUNCTIONS ---
	function init() {
		createPlayer();
		hide();
		
		if (playlistURL) {
			xmlParser.loadXML(playlistURL);
		}
		
		window.onresize = function () {
			onWindowResize();
		}
		
		window.onscroll = function () {
			onWindowScroll();
		}
		
		xmlParser.request.onreadystatechange = function() { 
			if (xmlParser.onTransferComplete()) {
				onPlaylistTransferComplete();
			}
		}
	}
	
	function createPlayer() {
		divOverlayPlayer = document.createElement("div");
		divOverlayPlayer.setAttribute("id", "overlay_player");
		
		pPlayerTitle = document.createElement("p");
		pPlayerTitle.setAttribute("id", "player_title");
		
		aRemovePlayer = document.createElement("a");
		aRemovePlayer.setAttribute("href", "javascript:"+playerName+".hide();");
		
		imgPlayerCloseButton = document.createElement("img");
		imgPlayerCloseButton.setAttribute("id", "player_close_button");
		imgPlayerCloseButton.setAttribute("src", "/_images/button_close.jpg");
		
		divOverlayPlayerScreen = document.createElement("div");
		divOverlayPlayerScreen.setAttribute("id", "overlay_player_screen");
		
		aPlaylistButton = document.createElement("a");
		aPlaylistButton.setAttribute("id", "playlist_button");
		aPlaylistButton.setAttribute("href", "javascript:"+playerName+".togglePlaylist();");
		aPlaylistButton.innerHTML = "Show Playlist";
		
		divOverlayPlayerPlaylist = document.createElement("div");
		divOverlayPlayerPlaylist.setAttribute("id", "overlay_player_playlist");
		
		divOverlayPlayerCategories = document.createElement("div");
		divOverlayPlayerCategories.setAttribute("id", "overlay_player_categories");
		
		divOverlayPlayerVideos = document.createElement("div");
		divOverlayPlayerVideos.setAttribute("id", "overlay_player_videos");
		
		divOverlayDimmer = document.createElement("div");
		divOverlayDimmer.setAttribute("id", "overlay_dimmer");
		
		aRemovePlayer.appendChild(imgPlayerCloseButton);
		divOverlayPlayer.appendChild(aRemovePlayer);
		divOverlayPlayer.appendChild(pPlayerTitle);
		divOverlayPlayer.appendChild(divOverlayPlayerScreen);
		divOverlayPlayer.appendChild(aPlaylistButton);
		divOverlayPlayerPlaylist.appendChild(divOverlayPlayerCategories);
		divOverlayPlayerPlaylist.appendChild(divOverlayPlayerVideos);
		divOverlayPlayer.appendChild(divOverlayPlayerPlaylist);
		
		document.body.appendChild(divOverlayPlayer);
		document.body.appendChild(divOverlayDimmer);
	}
	
	function redraw() {
		var playerX = null;
		var playerY = null;
		
		if (document.body.scrollHeight < document.documentElement.clientHeight) {
			divOverlayDimmer.style.height = document.documentElement.clientHeight + "px";
		} else {
			divOverlayDimmer.style.height = document.body.scrollHeight + "px";
		}
		
		if (typeof(window.pageYOffset) == "number") {
		   scrollYOffset = window.pageYOffset;
		   viewportHeight = window.innerHeight;
		} else {
		   scrollYOffset = document.documentElement.scrollTop;
		   viewportHeight = document.documentElement.clientHeight;
		}
		
		divOverlayPlayer.style.width = Math.round(videoWidth) + "px";
		divOverlayPlayer.style.padding = Math.round(DEFAULT_OVERLAY_PADDING) + "px";
		
		playerX = (document.body.scrollWidth - divOverlayPlayer.clientWidth) / 2;
		playerY = ((viewportHeight - divOverlayPlayer.clientHeight) / 2) + scrollYOffset;
		
		if (playerX < 0) { playerX = 0; }
		if (playerY < scrollYOffset) { playerY = scrollYOffset;	}
		
		divOverlayPlayer.style.left =  Math.round(playerX) + "px";
		divOverlayPlayer.style.top = Math.round(playerY) + "px";
	}
	
	function playFile(file, width, height, title) {
		if (width) { videoWidth = Number(width); } else { videoWidth = DEFAULT_VIDEO_WIDTH; }
		if (height) { videoHeight = Number(height); } else { videoHeight = DEFAULT_VIDEO_HEIGHT; }
		if (title) { pPlayerTitle.innerHTML = title; } else { pPlayerTitle.innerHTML = DEFAULT_PLAYER_TITLE; }
		
		prepareFlash(file);
		show();
		redraw();
	}
	
	function playItem(id) {
		if (xmlParser.request.responseXML) {
			file = xmlParser.getNodeValue("fileURL", "id", id, "video");
			pPlayerTitle.innerHTML = xmlParser.getNodeValue("name", "id", id, "video");
			videoWidth = Number(xmlParser.getNodeValue("width", "id", id, "video"));
			videoHeight = Number(xmlParser.getNodeValue("height", "id", id, "video"));
			
			prepareFlash(file);
			show();
			redraw();
		} else {
			//alert("Media Player Error:\n\n- The selected item could not be found because no playlist exists. It was not loaded, or has not finished loading.");
		}
	}
	
	function prepareFlash(file) {
		if (videoWidth < MIN_OVERLAY_WIDTH) { videoWidth = MIN_OVERLAY_WIDTH; }
		if (videoHeight < MIN_OVERLAY_HEIGHT) { videoHeight = MIN_OVERLAY_HEIGHT; }
		
		/*oAjax = new AjaxRequest();
		oAjax.open("GET","/videoloader.php?file="+file,false);
		oAjax.send(null);*/
		
		divOverlayPlayerScreen.innerHTML = "<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0\" width=\""+videoWidth+"\" height=\""+videoHeight+"\" id=\"flash_player\" align=\"middle\"><param name=\"allowScriptAccess\" value=\"sameDomain\" /><param name=\"allowFullScreen\" value=\"true\" /><param name=\"movie\" value=\"/flvplayer.swf\" /><param name=\"quality\" value=\"autohigh\" /><param name=\"bgcolor\" value=\"#000000\" /><param name=\"flashvars\" value=\"media_file="+file+"\" /><embed src=\"/flvplayer.swf\" flashvars=\"media_file="+file+"\" quality=\"autohigh\" bgcolor=\"#000000\" width=\""+videoWidth+"\" height=\""+videoHeight+"\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" /></object>";
	}
	
	function show() {
		document.body.appendChild(divOverlayPlayer);
		document.body.appendChild(divOverlayDimmer);
		
		if (document.getElementById("spinnything")) { document.getElementById("spinnything").style.display = "none"; }
		if (document.getElementById("ecube")) { document.getElementById("ecube").style.visibility = "hidden"; }
		if (document.getElementById("brochure")) { document.getElementById("brochure").style.visibility = "hidden"; }
		if (document.getElementById("experience_baltimore")) { document.getElementById("experience_baltimore").style.visibility = "hidden"; }
	}
	
	function hide() {
		document.body.removeChild(divOverlayPlayer);
		document.body.removeChild(divOverlayDimmer);
		
		if (document.getElementById("spinnything")) { document.getElementById("spinnything").style.display = "block"; }
		if (document.getElementById("ecube")) { document.getElementById("ecube").style.visibility = "visible"; }
		if (document.getElementById("brochure")) { document.getElementById("brochure").style.visibility = "visible"; }
		if (document.getElementById("experience_baltimore")) { document.getElementById("experience_baltimore").style.visibility = "visible"; }
	}
	
	function createPlaylist() {
		var catID = null;
		var catName = null;
		var catVidCount = null;
		var categories = xmlParser.getNodesByName("category");
		
		for (var i = 0; i < categories.length; i++) {
			catID = categories[i].childNodes[0].childNodes[0].nodeValue;
			catName = categories[i].childNodes[1].childNodes[0].nodeValue;
			catVidCount = categories[i].getElementsByTagName("video").length;
	
			divOverlayPlayerCategories.innerHTML += "<a class=\"category_item\" href=\"javascript:"+playerName+".showPlaylistCategory(\'"+catID+"\');\"><strong>"+catName+"</strong> ("+catVidCount+")</a>";
		}
	}
	
	function togglePlaylist() {
		if (divOverlayPlayerPlaylist.style.display == "block") {
			divOverlayPlayerPlaylist.style.display = "none";
			aPlaylistButton.innerHTML = "Show Playlist";
		} else {
			divOverlayPlayerPlaylist.style.display = "block";
			aPlaylistButton.innerHTML = "Hide Playlist";
		}
	}
	
	function showPlaylistCategory(id) {
		var videos = xmlParser.getNodesByName("video");
		
		divOverlayPlayerVideos.innerHTML = "";
		
		for (var i = 0; i < videos.length; i++) {
			if (videos[i].parentNode.parentNode.childNodes[0].childNodes[0].nodeValue == id) {
				vidID = videos[i].childNodes[0].childNodes[0].nodeValue;
				vidThumbnailURL = videos[i].childNodes[4].childNodes[0].nodeValue;
				vidName = videos[i].childNodes[1].childNodes[0].nodeValue;
				vidSummary = videos[i].childNodes[2].childNodes[0].nodeValue;
				
				divOverlayPlayerVideos.innerHTML += "<a class=\"video_item\" href=\"javascript:"+playerName+".playItem(\'"+vidID+"\');\"><img class=\"video_item_image\" src=\""+vidThumbnailURL+"\" /><p class=\"video_title\">"+vidName+"</p><p class=\"video_summary\">"+vidSummary+"</p></a>";
			}
		}
	}
	
	// ------------------------
	// --- PUBLIC FUNCTIONS ---
	this.loadPlaylist = function(url) {
		playlistURL = url;
	}
	
	this.playFile = function(file, width, height, title) {
		playFile(file, width, height, title);
	}
	
	this.playItem = function(id) {
		playItem(id);
	}
	
	this.show = function() {
		show();
	}
	
	this.hide = function() {
		hide();
	}
	
	this.redraw = function() {
		redraw();
	}
	
	this.togglePlaylist = function() {
		togglePlaylist();
		redraw();
	}
	
	this.showPlaylistCategory = function(id) {
		showPlaylistCategory(id);
	}
	
	// --------------
	// --- EVENTS ---
	function onWindowLoad() {
		createPlayer();
		hide();
		
		if (playlistURL) {
			xmlParser.loadXML(playlistURL);
		}
	}
	
	function onWindowResize() {
		redraw();
	}
	
	function onWindowScroll() {
		//redraw();
	}
	
	function onPlaylistTransferComplete() {
		if (xmlParser.request.responseXML) {
			createPlaylist();
		} else {
			//alert("Media Player Error:\n\n- An error occurred while retrieving the media playlist. Error Code: "+xmlParser.request.status);
		}
	}
}
