	var GAME_OVER = "game over", GAME_START = "game start";
	var DEFAULT_TARGET = "_blank";
	var AUDIO_ICON = "http://www.mlsnet.com/imgs/icons/audio.gif";
	var VIDEO_ICON = "http://www.mlsnet.com/imgs/icons/video.gif";
	var LIVE_ICON = "http://www.mlsnet.com/imgs/icons/live_l.gif";
	var ARCHIVE_ICON = "http://www.mlsnet.com/imgs/icons/archive_a.gif";
	var SOON_ICON = "http://www.mlsnet.com/imgs/icons/soon.gif";
	var SHOW_DATE_LINE = false;
	var SHOW_SHORT_TEAMS = true;
	var LARGE_GRID = false;
	//Column Types Enum
	var cType = {
		"Teams":			0,
		"Time":				1,
		"Status":			2,
		"Video":			3,
		"AwayAudio":		4,
		"HomeAudio":		5,
		"Date":				6,
		"VideoHighlights":	7,
		"Photo":			8
	};
	
	function MediaColumn(caption, type, width) {		
		this.captionStyle; //CSS for Caption(header) cell
		this.width = width;
		this.caption = caption;
		this.type = type;
		this.noWrap = false;
		this.align;
		this.showIcon = true;
	}
	
	function MediaGrid() {
		this.width;				
		this.tableStyle; //CSS for a table itself
		this.cellStyle; //CSS for rendered cells
		this.oddCellStyle; //CSS for odd rows of cells
		this.dateStyle; //CSS for a date line
		this.border = 0;
		this.spacing = 0;
		this.padding = 0;
		
		this.Columns = new Array();
		this.appendColumn = _appendColumn;
		this.renderGrid = _renderGrid;
		
		function _appendColumn(mcol) {
			if(typeof(mcol) == "object" && mcol.type != null) {
				this.Columns.push(mcol);
			}
		}
		
		function _renderGrid(xdo) {			
			var tbl = document.createElement("table");				
				if(this.border) tbl.setAttribute("border", this.border);
				if(this.spacing) tbl.setAttribute("cellspacing", this.spacing);
				if(this.padding) tbl.setAttribute("cellpadding", this.padding);
				if(this.width) tbl.setAttribute("width", this.width);
				if(this.tableStyle) tbl.setAttribute("class", this.tableStyle);
			var tr = document.createElement("tr");
			var td = document.createElement("td");
				td.innerHTML = "&nbsp;";
				if(this.cellStyle) td.setAttribute("class", this.cellStyle);
			//Set Header
			var hCol;
			var hCell;
			var hRow = tbl.appendChild(tr.cloneNode(false));
			for(var h = 0; h < this.Columns.length; h++) {				
				hCol = this.Columns[h];
				hCell = hRow.appendChild(td.cloneNode(true));				
				if(hCol.width) hCell.setAttribute("width", hCol.width);
				if(hCol.noWrap) hCell.setAttribute("nowrap", "nowrap");
				if(hCol.align) hCell.setAttribute("align", hCol.align);	
				if(hCol.captionStyle) hCell.setAttribute("class", hCol.captionStyle);
				if(hCol.caption) hCell.innerHTML = hCol.caption;
			}
			var dtOld;
			var nRow, nCell, cGame, cCol, altColor = true;
			for(var g = 0;g < xdo.game.length; g++) {
				cGame = xdo.game[g];						
				/* Date break row */
				if(SHOW_DATE_LINE) {
					if(dtOld != cGame.date_display) {
						dtOld = cGame.date_display;
						nRow = tbl.appendChild(tr.cloneNode(false));					
						nCell = nRow.appendChild(td.cloneNode(true));
						nCell.setAttribute("class", this.dateStyle);					
						nCell.setAttribute("colspan", this.Columns.length);
						nCell.setAttribute("width", this.width);
						nCell.innerHTML = dtOld;
					}
				}
				altColor = (altColor)?false:true;
				nRow = tbl.appendChild(tr.cloneNode(false)); 
				for(var c=0;c < this.Columns.length;c++) {
					cCol = this.Columns[c];
					nCell = nRow.appendChild(td.cloneNode(true));				
					if(cCol.width) nCell.setAttribute("width", cCol.width);
					if(cCol.align) nCell.setAttribute("align", cCol.align);		
					if(cCol.noWrap) nCell.setAttribute("nowrap", "nowrap");
					if(altColor) {nCell.setAttribute("class", this.oddCellStyle);}				
					switch(cCol.type) {
					//Section to insert more handlers
						case cType.Teams:
							handleTeams(cGame, nCell);
							break;
						case cType.Time:
							handleTime(cGame, nCell);
							break;
						case cType.Date:
							handleDate(cGame, nCell);
							break;
						case cType.Status:
							handleStatus(cGame, nCell, cCol.showIcon);
							break;
						case cType.Video:
							handleVideo(cGame, nCell, cCol.showIcon);
							break;
						case cType.AwayAudio:
							handleAwayAudio(cGame, nCell, cCol.showIcon);
							break;
						case cType.HomeAudio:
							handleHomeAudio(cGame, nCell, cCol.showIcon);
							break;
						case cType.VideoHighlights:
							handleVideoHilite(cGame ,nCell, cCol.showIcon);
							break;
					} //End Switch
				}//End Columns Loop
			}//End Games Loop
			return getOuterHTML(tbl);
		}//End _renderGrid()
	}
	
	var link = document.createElement("a");
	var newLink = function(url) {
		var nLink = link.cloneNode(true);
			nLink.href = url;			
		return nLink;
	}
	//Handlers
	function handleTeams(gameObj, nCell) {
		if(!isEmpty(gameObj.team_home_name) && !isEmpty(gameObj.team_away_name)) {
			if(!SHOW_SHORT_TEAMS) {
				nCell.innerHTML = gameObj.team_away_name + " @ " + gameObj.team_home_name;
			} else {
				nCell.innerHTML = gameObj.team_away + " @ " + gameObj.team_home;
			}
		}
	}
	
	function handleTime(gameObj, nCell) {
		var result;
		var gameStatus = gameObj.status.toLowerCase();
		nCell.innerHTML = "";
		var trkLnk = nCell.appendChild(newLink("http://www.mlsnet.com/MLS/scoreboard/game.jsp?match=" + gameObj.id));
			trkLnk.setAttribute("target", DEFAULT_TARGET);
		if(!LARGE_GRID) {
			switch(gameStatus) {
				case GAME_OVER:
					trkLnk.innerHTML = gameObj.score_display;
					break;
				case GAME_START:
					nCell.innerHTML = gameObj.game_time + " " + gameObj.am_pm;
					break;
				default: //Game is Live
					trkLnk.innerHTML = gameObj.score_display;
			}
		} else {
			nCell.innerHTML = gameObj.game_time + " " + gameObj.am_pm;
		}
	}
	
	function handleDate(gameObj, nCell) {
		nCell.innerHTML = gameObj.mmdd;		
	}
	
	function handleStatus(gameObj, nCell, showIcon) {
		var lnkPos = -1;
		var gameStatus = gameObj.status.toLowerCase();
		nCell.setAttribute("align", "center");
		switch(gameStatus) {
			case GAME_OVER: //If game is over we get recap links
				//lnkPos = (gameObj.links.link.length)?gameObj.links.link.indexOf("recap", "type"):-2;				
				nCell.innerHTML = (showIcon)?"<img border=\"0\" src=\"" + ARCHIVE_ICON + "\" alt=\"Archived Game\"/>":"&nbsp;";			
				break;
			case GAME_START: //if game has not been startes we get preview links
				//lnkPos = (gameObj.links.link.length)?gameObj.links.link.indexOf("preview", "type"):-2;
				nCell.innerHTML = "&nbsp;";
				break;
			default: //Live
				nCell.innerHTML = (showIcon)?"<img border=\"0\" src=\"" + LIVE_ICON + "\" alt=\"Live Game\"/>":"&nbsp;";			
		}
		//Generate Link if status and url is present
		/*
		nCell.innerHTML = "";
		if(lnkPos > -1) {
			if(!isEmpty(gameObj.status_display)) {
				var sLnk = nCell.appendChild(newLink(gameObj.links.link[lnkPos].url.Text));					
				sLnk.setAttribute("target", DEFAULT_TARGET);
				sLnk.innerHTML = gameObj.status_display;
			}
		} else if(lnkPos == -2) {
			if(!isEmpty(gameObj.status_display)) {
				var sLnk = nCell.appendChild(newLink(gameObj.links.link.url.Text));					
				sLnk.setAttribute("target", DEFAULT_TARGET);
				sLnk.innerHTML = gameObj.status_display;
			}
		}
		*/
	}
	
	function handleVideo(gameObj, nCell, showIcon) {
		if(gameObj.multimedia.media) {
			var vLinkPos = -1, idx, vLink, speed;
			var tvIcon = (showIcon)?"<img src=\"" + VIDEO_ICON + "\" border=\"0\"/>&nbsp;":"";
			var soonIcon = "<img src=\"" + SOON_ICON + "\" border=\"0\"/>";
			if(gameObj.multimedia.media.length) {
				if((idx = gameObj.multimedia.media.indexOf("mls_tv", "key")) && idx != -1) {
					vLinkPos = (gameObj.multimedia.media[idx].state == "video_off" || gameObj.multimedia.media[idx].state == "video_done")?-2:idx;
					speed = gameObj.multimedia.media[idx].url.speed + "K";
				}			 
				if(vLinkPos >= 0) {
					var urlId = gameObj.multimedia.media[vLinkPos].url.id;
					nCell.innerHTML = ""; //Remove space				
					vLink = nCell.appendChild(link.cloneNode(false));
					vLink.href = "javascript:mediaPlayer.play({w_id:'" + urlId + "',catCode:'mls_game_tv',type:'v_sub'})";
					vLink.innerHTML =  tvIcon + speed;
				} else if(vLinkPos == -2) {
					//nCell.innerHTML = tvIcon + speed;
					nCell.innerHTML = tvIcon + "350K";
				}
			
			} else {
				if(gameObj.multimedia.media.key == "mls_tv") {
					speed = gameObj.multimedia.media.url.speed + "K";
					if (gameObj.multimedia.media.state != "video_off" && gameObj.multimedia.media.state != "video_done") {
						var urlId = gameObj.multimedia.media.url.id;
						nCell.innerHTML = ""; //Remove space				
						vLink = nCell.appendChild(link.cloneNode(false));
						vLink.href = "javascript:mediaPlayer.play({w_id:'" + urlId + "',catCode:'mls_game_tv',type:'v_sub'})";
						vLink.innerHTML =  tvIcon + speed;
					} else {
						//nCell.innerHTML = tvIcon + speed;
						nCell.innerHTML = tvIcon + "350K";
					}
				}
			}
		}
	}
	
	function handleAwayAudio(gameObj, nCell, showIcon) {
		var aLink, aKey, noAudio = true;
		var auIcon = (showIcon)?"<img src=\"" + AUDIO_ICON + "\" border=\"0\"/>&nbsp;":"";
		var soonIcon = "<img src=\"" + SOON_ICON + "\" border=\"0\"/>";
		if(gameObj.multimedia.media) {
			if(gameObj.multimedia.media.length) {
				if(gameObj.multimedia.media.contains("audio", "type")) {
					// nCell.innerHTML = auIcon;
				}	
				noAudio = true;
				for(var aLinkPos = 0; aLinkPos < gameObj.multimedia.media.length; aLinkPos++) {
					aKey = gameObj.multimedia.media[aLinkPos].key;
					if(gameObj.multimedia.media[aLinkPos].type == "audio" && (aKey == "away_audio" || aKey == "alt_away_audio")) {
						var lang = gameObj.multimedia.media[aLinkPos].language_display;
						if(gameObj.multimedia.media[aLinkPos].state == "audio_off" || gameObj.multimedia.media[aLinkPos].state == "audio_done") {
							//nCell.innerHTML += lang + "&nbsp;";
							nCell.innerHTML += lang  + "&nbsp;";
							noAudio = false;
						} else {
							var urlId = gameObj.multimedia.media[aLinkPos].url.id;
							aLink = nCell.appendChild(link.cloneNode(false));
							//aLink.href = gameObj.multimedia.media[aLinkPos].url.Text;
							aLink.href = "javascript:mediaPlayer.play({w_id:'" + urlId + "',catCode:'mls_game_audio',type:'a_sub'})";
							aLink.innerHTML = lang + "&nbsp;";
							noAudio = false;						
						}
					}
				}
			} else{
				if(gameObj.multimedia.media.type == "audio") {
					// nCell.innerHTML = auIcon;
					aKey = gameObj.multimedia.media.key;
					if(aKey == "away_audio" || aKey == "alt_away_audio") {
						var lang = gameObj.multimedia.media.language_display;
						if(gameObj.multimedia.media.state == "audio_off" || gameObj.multimedia.media.state == "audio_done") {
							//nCell.innerHTML += lang + "&nbsp;";
							nCell.innerHTML += lang  + "&nbsp;";
							noAudio = false;
						} else {
							var urlEsId = gameObj.multimedia.media.url.id;
							aLink = nCell.appendChild(link.cloneNode(false));
							//aLink.href = gameObj.multimedia.media[aLinkPos].url.Text;
							aLink.href = "javascript:mediaPlayer.play({w_id:'" + urlEsId + "',catCode:'mls_game_audio',type:'a_sub'})";
							aLink.innerHTML = lang + "&nbsp;";
							noAudio = false;	
						}
					}
				}
			}
			if(noAudio) { nCell.innerHTML = "&nbsp;"; } //If no audio for this column -> clean up
		}
	}
	
	function handleHomeAudio(gameObj, nCell, showIcon) {
		var aLink, aKey, noAudio = true;
		var auIcon = (showIcon)?"<img src=\"" + AUDIO_ICON + "\" border=\"0\"/>&nbsp;":"";
		var soonIcon = "<img src=\"" + SOON_ICON + "\" border=\"0\"/>";
		if(gameObj.multimedia.media) {
			if(gameObj.multimedia.media.length) {
				if(gameObj.multimedia.media.contains("audio", "type")) {
					// nCell.innerHTML = auIcon;
				}	
				noAudio = true;
				for(var aLinkPos = 0; aLinkPos < gameObj.multimedia.media.length; aLinkPos++) {
					aKey = gameObj.multimedia.media[aLinkPos].key;
					if(gameObj.multimedia.media[aLinkPos].type == "audio" && (aKey == "home_audio" || aKey == "alt_home_audio")) {
						var lang = gameObj.multimedia.media[aLinkPos].language_display;
						if(gameObj.multimedia.media[aLinkPos].state == "audio_off" || gameObj.multimedia.media[aLinkPos].state == "audio_done") {
							//nCell.innerHTML += lang + "&nbsp;";
							nCell.innerHTML += lang  + "&nbsp;";
							noAudio = false;
						} else {
							var urlId = gameObj.multimedia.media[aLinkPos].url.id;
							aLink = nCell.appendChild(link.cloneNode(false));
							//aLink.href = gameObj.multimedia.media[aLinkPos].url.Text;
							aLink.href = "javascript:mediaPlayer.play({w_id:'" + urlId + "',catCode:'mls_game_audio',type:'a_sub'})";
							aLink.innerHTML = lang + "&nbsp;";
							noAudio = false;	
						}
					}
				}
			} else{
				if(gameObj.multimedia.media.type == "audio") {
					// nCell.innerHTML = auIcon;
					aKey = gameObj.multimedia.media.key;
					if(aKey == "home_audio" || aKey == "alt_home_audio") {
						var lang = gameObj.multimedia.media.language_display;
						if(gameObj.multimedia.media.state == "audio_off" || gameObj.multimedia.media.state == "audio_done") {
							//nCell.innerHTML += lang + "&nbsp;";
							nCell.innerHTML += lang  + "&nbsp;";
							noAudio = false;
						} else {
							var urlEsId = gameObj.multimedia.media.url.id;
							aLink = nCell.appendChild(link.cloneNode(false));
							//aLink.href = gameObj.multimedia.media[aLinkPos].url.Text;
							aLink.href = "javascript:mediaPlayer.play({w_id:'" + urlEsId + "',catCode:'mls_game_audio',type:'a_sub'})";
							aLink.innerHTML = lang + "&nbsp;";
							noAudio = false;	
						}
					}
				}
			}
			if(noAudio) { nCell.innerHTML = "&nbsp;"; } //If no audio for this column -> clean up
		}
	}
	
	function handleVideoHilite(gameObj, nCell, showIcon) {
		if(gameObj.multimedia.media) {
			var vLinkPos = -1, idx, vLink, speed;
			var tvIcon = (showIcon)?"<img src=\"" + VIDEO_ICON + "\" border=\"0\"/>&nbsp;":"";
			var soonIcon = "<img src=\"" + SOON_ICON + "\" border=\"0\"/>";
			if(gameObj.multimedia.media.length) {
				if((idx = gameObj.multimedia.media.indexOf("free_plays_video", "key")) && idx != -1) {
					vLinkPos = (gameObj.multimedia.media[idx].state == "video_off")?-2:idx;
					speed = gameObj.multimedia.media[idx].url.speed + "K";
				}			 
				if(vLinkPos >= 0) {
					var urlId = gameObj.multimedia.media[vLinkPos].url.id;
					var urlLink = gameObj.multimedia.media[vLinkPos].url.Text;
					nCell.innerHTML = ""; //Remove space				
					vLink = nCell.appendChild(link.cloneNode(false));
					vLink.href = "javascript:mediaPlayer.play({w:'" + urlLink + "',w_id:'" + urlId + "',catCode:'mls_game_tv',type:'v_free'})";
					vLink.innerHTML = tvIcon + speed;
				} else if(vLinkPos == -2) {
					//nCell.innerHTML = tvIcon + speed;
					nCell.innerHTML = soonIcon;
				}
			
			} else {
				if(gameObj.multimedia.media.key == "free_plays_video") {
					speed = gameObj.multimedia.media.url.speed + "K";
					if (gameObj.multimedia.media.state != "video_off") {
						var urlId = gameObj.multimedia.media.url.id;
						var urlLink = gameObj.multimedia.media.url.Text;
						nCell.innerHTML = ""; //Remove space				
						vLink = nCell.appendChild(link.cloneNode(false));
						vLink.href = "javascript:mediaPlayer.play({w:'" + urlLink + "',w_id:'" + urlId + "',catCode:'mls_game_tv',type:'v_free'})";
						vLink.innerHTML = tvIcon + speed;
					} else {
						//nCell.innerHTML = tvIcon + speed;
						nCell.innerHTML = soonIcon;
					}
				}
			}
		}
	}		
