﻿//////////////////////////////////////////////////////////////////////
//                                                                  //
// 放送局向け週間タイムテーブル、一日タイムテーブル表示ＡＪＡＸ     //
//                                                                  //
// 　　　　　　　　　　　　　　　　　株式会社ユニゾンシステムズ     //
//                                                                  //
//                                                                  //
// Copyright (C) 2007. Unixon Systems Co.,Ltd. All Rights Reserved. //
//                                                                  //
//////////////////////////////////////////////////////////////////////

 var arrLinkInfoLoaded = false;
 var arrLinkInfo;

 var hoverBackgroundColor = "#FFecec";		// ホバー時の番組背景色

 var sHrefTarget      = "_blank";			// 番組ページへのリンクターゲット
 var sHrefLocalTarget = "";					// 番組ページへのリンクターゲット

 var nDebugTime = 0;
 var sDebugText = "";
 
 var sWaitStr = "<center><br><img src='img/digital5.gif'><br><br></center>";
 
 var fTimeTableLoadedFunc;

 myOP = (navigator.userAgent.indexOf("Opera",0) != -1) ? 1 : 0 ;
 myIE = ((navigator.appName == "Microsoft Internet Explorer") && (myOP==0)) ? 1 : 0 ;
 myNS = ((navigator.appName == "Netscape") && (myOP==0)) ? 1 : 0 ;

  setHrefTarget = function(target)
  {
    sHrefTarget = target;
  }

  setHrefLocalTarget = function(target)
  {
    sHrefLocalTarget = target;
  }
  
  setTimeTableLoadedFunc = function(func)
  {
  	  fTimeTableLoadedFunc = func;
  }

  ttAsyncXmlMgr = function ( comp_func, sequential ) {
    this.arrRequest = new Array();
    this.comp_func  = comp_func;
    this.id         = 0;
    this.sequential = sequential;
    
    return this;
  }
  
  ttAsyncXmlMgr.prototype.addRequest = function (url, callback_func, error_func)
  {
    var http = new JKL.ParseXML( url );
    
    http.asyncMgr = this;
    http.mgrId    = this.id++;
	http.loaded   = false;
	http.org_callback_func = callback_func;
    
    var func = function ( data, http ) {
    	
    	var obj = http.asyncMgr.arrRequest[http.mgrId];
    	obj.org_callback_func( data, http.asyncMgr );
    	obj.loaded = true;
    	
    	var allLoaded = true;
    	for (var i=0; i < http.asyncMgr.arrRequest.length; i++){
    		var o = http.asyncMgr.arrRequest[i];
    		if (o.loaded == false){
    			allLoaded = false;
    			if (http.asyncMgr.sequential){
    				// シーケンシャルモードで次を実行
			 		sDebugText += "parse実行 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
    				o.parse();
    				return;
    			}
    		}
    	}
    	if (allLoaded){
    		http.asyncMgr.comp_func(http.asyncMgr);
    	}
    }
    
 	http.async(func, http);
	
	if (error_func)
		http.onerror(error_func);
	
	if (this.sequential){
		// シーケンシャル実行
		if (http.mgrId == 0){
	 		sDebugText += "parse実行 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
			http.parse();
		}
	}
	else{
		// 平行実行
	 	sDebugText += "parse実行 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
		http.parse();
	}
	this.arrRequest.push(http);
  }

  // １番組のオブジェクト
  prgItemData = function(sMode, nYobi, nStart, nEnd, sPrgName, sUrl, sImg, sRate)
  {
    this.sMode    = sMode;
    this.nYobi    = nYobi;
	this.nStart   = nStart;
	this.nEnd     = nEnd;
	this.sPrgName = sPrgName;
	this.sUrl     = sUrl;
	this.sImg     = sImg;
	this.sRate    = sRate;
	this.colSpan  = 1;
	this.saveName = sPrgName;　//090722 追加ポップアップ番組名表示用

	if (this.sRate != null && this.sRate != "" && -1 != this.sRate.indexOf("\n")){
	  // 改行コードを <br>タグに変換
	  this.sRate    = this.sRate.replace("\n", "<br>");
	}
	if (this.sRate != null && this.sRate != "" && -1 != this.sRate.indexOf("<")){
	  this.sRate    = this.sRate.replace("<", "&gt;");
	}
	if (this.sRate != null && this.sRate != "" && -1 != this.sRate.indexOf(">")){
	  this.sRate    = this.sRate.replace(">", "&gt;");
	}
  }

  // リンク情報のオブジェクト
  linkInfoData = function(sPrgName, sUrl, sImg, sSubText, sUrlMode)
  {
	this.sPrgName = sPrgName;
	this.sUrl     = sUrl;
	this.sImg     = sImg;
	this.sSubText = sPrgName; //sSubText;
 	this.sUrlMode = sUrlMode;
	this.img      = null;
 }

  // 番組配列のソート（クイックソート）
  prgQsort = function(data, start, end)
  {
    var x = data[Math.floor((start + end) / 2)];
	var i = start;
	var j = end;

	while (true){
	  while (data[i].nStart*10 + data[i].nYobi < x.nStart*10 + x.nYobi) i++;
	  while (x.nStart*10 + x.nYobi < data[j].nStart*10 + data[j].nYobi) j--;
	  if (i >= j) break;
	  var n = data[i];
	  data[i] = data[j];
	  data[j] = n;
	  i++; j--;
	}

	if (start < i-1) prgQsort(data, start, i-1);
	if (j+1 < end)   prgQsort(data, j+1, end);
  }

  // リンク（イメージ・アイコン）情報の取得
  parseLinkInfo = function(data)
  {
	if (typeof(data) == "undefined")
	  return;

	arrLinkInfo = new Array();
	if (typeof(data.timeTable) != "undefined"){
	  if (typeof(data.timeTable.linkInfo) != "undefined"){
		for (nLoop1 = 0; nLoop1 < data.timeTable.linkInfo.linkEntry.length; nLoop1++){
		  arrLinkInfo.push(new linkInfoData(
								  data.timeTable.linkInfo.linkEntry[nLoop1].name,
								  data.timeTable.linkInfo.linkEntry[nLoop1].url,
								  data.timeTable.linkInfo.linkEntry[nLoop1].img,
								  data.timeTable.linkInfo.linkEntry[nLoop1].subText,
								  data.timeTable.linkInfo.linkEntry[nLoop1].urlMode));
		}
	  }
	}
	arrLinkInfoLoaded = true;
  }

  isSameIcon = function(obj1, obj2)
  {
	  var len1 = obj1.sIcon ? obj1.sIcon.length : 0;
	  var len2 = obj2.sIcon ? obj2.sIcon.length : 0;

	  if (len1 != len2)
		  return false;

	  for (var j=0; j < len1; j++){
		  if (obj1.sIcon[j] != obj2.sIcon[j])
			  return false;
	  }
	  return true;
  }

  // リンク（イメージ・アイコン）情報からの情報設定
  setLinkInfo = function(arrData, bUrl, bImg, bIcon, bMargeBelt)
  {
	// イメージ（リンクバナー）置き換え
	var prgNameSave = "";
	var beltLeftIdx = -1;
	for (var i=0; i<arrData.length; i++){
		if (arrData[i].sMode != "prg"){
			prgNameSave = "";
			beltLeftIdx = -1; 
			continue;
		}
		if (prgNameSave != "" && 
			prgNameSave == arrData[i].sPrgName){
			// 前回と番組名が同じ
			arrData[i].sUrl     = arrData[i-1].sUrl;
			arrData[i].sUrlMode = arrData[i-1].sUrlMode;
			arrData[i].sPrgName = arrData[i-1].sPrgName;

			if (bMargeBelt &&
				arrData[i].nStart == arrData[i-1].nStart &&
				arrData[i].nEnd   == arrData[i-1].nEnd   &&
				arrData[i].sRate  == arrData[i-1].sRate  &&
				arrData[i].nYobi-1== arrData[i-1].nYobi  &&
				isSameIcon(arrData[i], arrData[i-1])){
				if (beltLeftIdx == -1)
					beltLeftIdx = i-1;
				
				arrData[beltLeftIdx].colSpan += 1;
				arrData[i].colSpan = 0;
			}
			else{
				beltLeftIdx = -1;
			}
			continue;
		}
		beltLeftIdx = -1;
		prgNameSave = arrData[i].sPrgName;
		
		for (var j = 0; j < arrLinkInfo.length; j++){
		  if (typeof(arrData[i].sPrgName) == "undefined")
		    continue;
		  findIdx = arrData[i].sPrgName.indexOf(arrLinkInfo[j].sPrgName);
		  if (findIdx != -1){
		  	if (bUrl){
			  if (typeof(arrData[i].sUrl) == "undefined" && typeof(arrLinkInfo[j].sUrl) != "undefined"){
			    arrData[i].sUrl = arrLinkInfo[j].sUrl;
			  }
			  if (typeof(arrData[i].sUrlMode) == "undefined" && typeof(arrLinkInfo[j].sUrlMode) != "undefined"){
			    arrData[i].sUrlMode = arrLinkInfo[j].sUrlMode;
			  }
			}
			if (bImg){
			  if (typeof(arrData[i].sImg) == "undefined" && typeof(arrLinkInfo[j].sImg) != "undefined"){
			    arrData[i].sPrgName = arrData[i].sPrgName.substr(0, findIdx) +
													  (findIdx != 0 ? "<br>" : "") +
													  "<img class='ttimg' src='" + arrLinkInfo[j].sImg + "' alt='" + arrLinkInfo[j].sPrgName + "' title=''><br>"+
													  (typeof(arrLinkInfo[j].sSubText) != "undefined" ? "<br>" : "") +
									  arrData[i].sPrgName.substr(findIdx+arrLinkInfo[j].sPrgName.length);
			   // arrData[i].sImg = arrLinkInfo[j].sImg;
			  }
			}
		  }

		  if (findIdx != -1){
		    break;
		  }

		}
	}
    sDebugText += "イメージ置き換え完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

	// アイコン置き換え
    if (bIcon){
	  for (i=0; i<arrData.length; i++){
	    if (arrData[i].sIcon != "" && typeof(arrData[i].sIcon) != "undefined"){
		  for (k=0; k < arrData[i].sIcon.length; k++){
		    for (j = 0; j < arrLinkInfo.length; j++){
			  if (arrData[i].sIcon[k] == arrLinkInfo[j].sPrgName){
				arrData[i].sIcon[k] = arrLinkInfo[j].sImg;
				if (arrLinkInfo[j].img == null){
				  // 画像のプレロード
				  arrLinkInfo[j].img = new Image();
				  arrLinkInfo[j].img.src = arrLinkInfo[j].img;
				}
				break;
		      }
		    }
		  }
		}
	  }
	}
    sDebugText += "アイコン置き換え完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
 }

  // 行オブジェクト
  rowElement = function()
  {
    this.arrCols = new Array();
  }

  // 列オブジェクト
  colElement = function()
  {
	this.rowSpan   = 1;
	this.colSpan   = 1;
	this.className = "";
	this.innerHTML = "";
  }

  // 番組枠上にマウスオーバーした際の処理
  onPrgHover = function(mode, obj)
  {
    //if (mode == 1)
    //     obj.className = "ttdPrg_hover ttdTd";
	//else obj.className = "ttdPrg ttdTd";
	
	var fukuda = "";
	
    if (mode == 1)
         obj.style.backgroundColor = hoverBackgroundColor;
    
	else obj.style.backgroundColor = "";
  }

  // スクロール頭だしタイマー処理
  onNowOnAirScroll = function(divId, topId)
  {
 	tableDivElement = document.getElementById(divId);
    topElement      = document.getElementById('ttdivHeader');
    jumpElement     = document.getElementById(topId);
    if (jumpElement){
	    jumpY = getElementPosition(jumpElement).y - getElementPosition(topElement).y - 2;
	    if (myIE == true) jumpY += 2;
	    scrollTo(0, jumpY);									// for not ie
	    tableDivElement.parentElement.scrollTop = jumpY;	// for ie
	}
  }
////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////
  // 週間タイムテーブル描画処理 //
  ////////////////////////////////
  getTimeTableWeek = function(divId, fileUrl, bMargeBelt)
  {
	nDebugTime = (new Date()).getTime();
	sDebugText = "デバッグ用メッセージ<br>";

//	// 番組ＸＭＬデータの取得
//    var http = new JKL.ParseXML( fileUrl );

	tableDivElement = document.getElementById(divId);
	tableDivElement.innerHTML = sWaitStr;
    
    var funcComp = function ( asyncMgr ) { 
		// 非同期メソッド
		sDebugText += "ＸＭＬ受信完了処理 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
		
		var data = asyncMgr.prgData;

		minHhmm = 0;
		maxHhmm = 0;
		var arrMinYobi = new Array(7+2);
		var arrMaxYobi = new Array(7+2);
		for (i=0; i<7+2; i++){
		  arrMinYobi[i] = 0;
		  arrMaxYobi[i] = 0;
		}

		startYmd = 0;

		// ＸＭＬデータの受信→配列作成
		var arrData = new Array();
	    if (true){
		  for (nLoop1 = 0; nLoop1 < data.timeTable.prgDataEntry.prgData.length; nLoop1++){
		    var item = new Array(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem.length);
		    for (nLoop2 = 0; nLoop2 < data.timeTable.prgDataEntry.prgData[nLoop1].prgItem.length; nLoop2++){

			  // 番組アイテム
			  item[nLoop2] ={"sMode"    : "prg",
							 "nYobi"    : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].yobi, 10),
							 "nStart"   : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].st, 10),
							 "nEnd"     : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].en, 10),
							 "sPrgName" : data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].name,
							 "sRate"    : data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].rate,
							 "sSyutsuen" : data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].syutsuen,
							 "colSpan"  : 1,
							 "saveName" : data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].name};  //090722追加　ポップアップ番組名表示用

			  if (item[nLoop2].sRate != null && item[nLoop2].sRate != "" && -1 != item[nLoop2].sRate.indexOf("<")){
			    item[nLoop2].sRate    = item[nLoop2].sRate.replace("<", "&lt;");
			  }
			  if (item[nLoop2].sRate != null && item[nLoop2].sRate != "" && -1 != item[nLoop2].sRate.indexOf(">")){
			    item[nLoop2].sRate    = item[nLoop2].sRate.replace(">", "&gt;");
			  }

			  // 変な時刻の場合の調整
			  if (nLoop2 > 0){
			    if (item[nLoop2 - 1].nYobi  == item[nLoop2].nYobi  &&
			    	item[nLoop2 - 1].nStart == item[nLoop2].nStart){
			    	  item[nLoop2 - 1].bDummy = 1;
			    }
			  }

			  // アイコン設定
			  if (typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon) == "object"){
			    item[nLoop2].sIcon = new Array();
			    for (i=0; typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon[i]) != "undefined"; i++){
				  item[nLoop2].sIcon[i] = data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon[i];
			    }
			  }
			  else
			  if (typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon) == "string"){
			    item[nLoop2].sIcon = new Array(1);
			    item[nLoop2].sIcon[0] = data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon;
			  }
			}
		    arrData = arrData.concat(item);
		  }
		  startYmd = parseInt(data.timeTable.prgDataEntry.date, 10);
		}

 		sDebugText += "配列作成完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		// 最小・最大時刻の設定
		for (i=0; i<arrData.length; i++){

			if (minHhmm == 0 || minHhmm > arrData[i].nStart)
			  minHhmm = arrData[i].nStart;
			if (maxHhmm == 0 || maxHhmm < arrData[i].nEnd)
			  maxHhmm = arrData[i].nEnd;

			if (arrMinYobi[arrData[i].nYobi] == 0 || arrMinYobi[arrData[i].nYobi] > arrData[i].nStart)
			  arrMinYobi[arrData[i].nYobi] = arrData[i].nStart;

			if (arrMaxYobi[arrData[i].nYobi] == 0 || arrMaxYobi[arrData[i].nYobi] < arrData[i].nEnd)
			  arrMaxYobi[arrData[i].nYobi] = arrData[i].nEnd;
		}

 		sDebugText += "最小・最大時刻の設定完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		// 時刻バーデータの挿入
		minHhmm = Math.floor(minHhmm/100) * 100;
		for (i=Math.floor(minHhmm/100); i<=Math.floor(maxHhmm/100); i++){
			var item = new Array(2);
			item[0] = new prgItemData("time",
									  0,
									  i * 100,
									  (i+1) * 100,
									  "" + i);
			item[1] = new prgItemData("time",
									  8,
									  i * 100,
									  (i+1) * 100,
									  "" + i);
			arrData = arrData.concat(item);
		}

 		sDebugText += "時刻バーデータの挿入完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		// 先頭行ダミーデータ挿入
		for (i=1; i <=7; i++){
			if (arrMinYobi[i] != minHhmm){
				var item = new Array(1);
				item[0] = new prgItemData("dmy",
										  i,
										  minHhmm,
										  arrMinYobi[i],
										  "");
				arrData = arrData.concat(item);
			 }
		}

		// 最終行ダミーデータ挿入
		for (i=1; i <=7; i++){
			var item = new Array(1);
			item[0] = new prgItemData("dmy",
									  i,
									  arrMaxYobi[i],
									  arrMaxYobi[i],
									  "");
			arrData = arrData.concat(item);
		}

 		sDebugText += "ダミーデータ挿入の挿入完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		// 番組データのソート
		prgQsort(arrData, 0, arrData.length-1);

 		sDebugText += "番組データのソート完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		// ＵＲＬ設定・イメージ・アイコン置き換え
		setLinkInfo(arrData, true, true, true, bMargeBelt);

 		sDebugText += "setLinkInfo完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		var lastRow    = new Array(7+2);
		var lastColObj = new Array(7+2);

		saveStart = -1;
		saveYobi  = -1;
		nRow      = 0;

		var arrRows = new Array();
		var objRow;
		var objCol;

		// タイムテーブルデータの生成
		for (i=0; i<arrData.length; i++){
		  if (arrData[i].bDummy == 1)		// ★
		  	continue;						// ★
		  if (saveStart != arrData[i].nStart){
		    // 行の生成
			objRow = new rowElement();
			arrRows.push(objRow);

			nRow++;
			saveStart = arrData[i].nStart;
			saveYobi  = -1;
		  }

		  // ｒｏｗＳｐａｎの設定（上の番組の引き伸ばし）
		  for (j=saveYobi+1; j <= arrData[i].nYobi; j++){
			if (nRow != 1 && typeof(lastColObj[j]) != "undefined"){
			  lastColObj[j].rowSpan = nRow - lastRow[j];
			}
		  }

		  // 列の生成
		  objCol = new colElement();
		  objCol.prgItemData = arrData[i];
		  objCol.colSpan = arrData[i].colSpan;
		  objRow.arrCols.push(objCol);
		  if (arrData[i].sMode == "time"){
			//////////////
			// 時刻バー //
			//////////////
			hh = Math.floor(arrData[i].nStart / 100);
			if (hh < 10) hh = "0" + hh;

			objCol.className = "ttdTime ttdTd ttdTime" + hh;
			objCol.innerHTML = arrData[i].sPrgName;
		  }
		  else
		  if (arrData[i].sMode == "prg"){
			//////////
			// 番組 //
			//////////
			 if (arrData[i].colSpan >= 1){
				hh = Math.floor(arrData[i].nStart / 100);
				mm = arrData[i].nStart % 100;
				if (hh < 10) hh = "0" + hh;
				if (mm < 10) mm = "0" + mm;

				// ＵＲＬリンク
				prg = "<div align='left'>";

				if (arrData[i].sUrl != "" && typeof(arrData[i].sUrl) != "undefined"){
				  prg += "<a href='" + arrData[i].sUrl + "'";
				  sTarget = (arrData[i].sUrlMode == "local") ? sHrefLocalTarget : sHrefTarget;
				  if (sTarget != "")
					   prg += " target='" + sTarget + "'" + "class='help' >";
				  else prg += " class='help' >";
				}

				// イメージ・番組名
				if (typeof(arrData[i].sPrgName) == "undefined")
						prg += " ";
				else	prg += arrData[i].sPrgName;

				if (arrData[i].sUrl != "" && typeof(arrData[i].sUrl) != "undefined"){
				  if(arrData[i].sSyutsuen != "" && typeof(arrData[i].sSyutsuen) != "undefined"){
				  	  prg += "<span><table border='0'><tr><td rowspan='3'>" + arrData[i].sPrgName + "</td><td colspan='2'>" + arrData[i].saveName + "</td></tr><tr><td><img src='prgimg/icon_time.gif'></td><td>" + arrData[i].nStart + "～" + arrData[i].nEnd  + "</td></tr><tr><td><img src='prgimg/icon_shutuen.gif'></td><td>" + arrData[i].sSyutsuen + "</td></tr><tr><td colspan='3'><img src='prgimg/icon_con.gif'><br>" + arrData[i].sRate + "</td></tr><tr><td colspan='3'><img src='prgimg/icon_url.gif'>&nbsp;&nbsp;" + arrData[i].sUrl + "</td></tr></table></span></a>";
				  }else{
					prg += "<span><table border='0'><tr><td rowspan='2'>" + arrData[i].sPrgName + "</td><td colspan='2'>" + arrData[i].saveName + "</td></tr><tr><td><img src='prgimg/icon_time.gif'></td><td>" + arrData[i].nStart + "～" + arrData[i].nEnd  + "</td></tr><tr><td colspan='3'><img src='prgimg/icon_con.gif'><br>" + arrData[i].sRate + "</td></tr><tr><td colspan='3'><img src='prgimg/icon_url.gif'>&nbsp;&nbsp;" + arrData[i].sUrl + "</td></tr></table></span></a>";
				  }
				}
				prg += "</div>";

				var htmlss = new Array();
				
				htmlss[htmlss.length] = "<table border='0' width='100%' height='100%'>";
				htmlss[htmlss.length] =  "<tr>"
				htmlss[htmlss.length] =   "<td><table border='0' cellspacing='1' cellpadding='0' ><tr><td class='ttiPrgHhmm'>" + hh + ":" + mm + "</td>";

				// アイコン
				if (arrData[i].sIcon != "" && typeof(arrData[i].sIcon) != "undefined"){
				  for (j=0; j < arrData[i].sIcon.length; j++){
					if (typeof(arrData[i].sIcon[j]) != "undefined"){
					  htmlss[htmlss.length] =   "<td><img src='" + arrData[i].sIcon[j] + "' class='ttIcon'></td>";
					}
				  }
				}
				
				htmlss[htmlss.length] =         "</tr></table></td>";
				htmlss[htmlss.length] =  "</tr>"
				htmlss[htmlss.length] =  "<tr>"
				htmlss[htmlss.length] =   "<td><div class='ttiPrgName'>" + prg + "</div></td>";

				// ラテ欄
				if (arrData[i].sRate != "" && typeof(arrData[i].sRate) != "undefined"){
				  if (prg.indexOf("<img") != -1 && arrData[i].colSpan > 1){
				    htmlss[htmlss.length] =   "<td><div class='ttiPrgRate'><tt>" + arrData[i].sRate + "</tt></div><br><br></td>";
				  }
				  else{
					htmlss[htmlss.length] =  "</tr><tr>";
				    htmlss[htmlss.length] =   "<td><div class='ttiPrgRate'><tt>" + arrData[i].sRate + "</tt></div></td>";
				  }
				}
				htmlss[htmlss.length] =  "</tr>"

				htmlss[htmlss.length] = "</table>"

				objCol.className = "ttdPrg ttdTd";
				objCol.innerHTML = htmlss.join('');
			 }
		  }
		  else{
			//////////////
			// フィラー //
			//////////////
			objCol.className = "ttdFil ttdTd";
		  }

		  lastRow[   arrData[i].nYobi] = nRow;
		  lastColObj[arrData[i].nYobi] = objCol;
		  saveYobi = arrData[i].nYobi;
		}

		nRow++;
		for (j=0; j<7+2; j++){
		  lastColObj[j].rowSpan = nRow - lastRow[j];
		}

 		sDebugText += "タイムテーブルデータの生成完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		// タイムテーブルＨＴＭＬの生成
		var htmlss = new Array();
		htmlss[htmlss.length] = "<div class='ttdivHeader' id='ttdivHeader'>";
		htmlss[htmlss.length] = "<table class='tttMain'>";

		htmlss[htmlss.length] = "<col class='ttcColTimeL'>";
		htmlss[htmlss.length] = "<col class='ttcColPrg' span='7'>";
		htmlss[htmlss.length] = "<col class='ttcColTimeR'>";

		// ｔｈｅａｄ部分
		htmlss[htmlss.length] = "<thead>";
		htmlss[htmlss.length] = "<tr class='ttrHeader'>";
		htmlss[htmlss.length] = "<th nowarp class='tthHeader ttdTd'>時</th>";
		var yobiStr= new Array("(月)","(火)","(水)","(木)","(金)","(土)","(日)");
		var yobiEng= new Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");

		for (i = 1; i <= 7; i++){
		  ymd = startYmd;
		  dd = new Date(Math.floor(ymd/10000), Math.floor(ymd/100%100)-1, ymd%100);
		  dd.setTime(dd.getTime() + (i-1)*24*3600*1000);
		  htmlss[htmlss.length] = "<th nowarp class='tthHeader ttdTd tthHeader" + yobiEng[i-1] + "' id='tthHeader" + yobiEng[i-1] +"' >" + (dd.getMonth()+1) + "/" + dd.getDate() + " " + yobiStr[i-1] + "</th>";
		}

		htmlss[htmlss.length] = "<th nowarp class='tthHeader ttdTd'>時</th>";
		htmlss[htmlss.length] = "</tr></thead>";

		htmlss[htmlss.length] = "</table>";
		htmlss[htmlss.length] = "</div>";

		htmlss[htmlss.length] = "<div class='ttdivBody' >";
		htmlss[htmlss.length] = "<table class='tttMain' style='border-top-width: 0px'>";
		htmlss[htmlss.length] = "<col class='ttcColTimeL'>";
		htmlss[htmlss.length] = "<col class='ttcColPrg' span='7'>";
		htmlss[htmlss.length] = "<col class='ttcColTimeR'>";

		// ｔｂｏｄｙ部分
		htmlss[htmlss.length] = "<tbody>";
		for (i = 0; i < arrRows.length; i++){
		  htmlss[htmlss.length] = "<tr>";
		  for (j = 0; j < arrRows[i].arrCols.length; j++){
		    if (arrRows[i].arrCols[j].colSpan >= 1){
		      htmlss[htmlss.length] = "<td class='" + arrRows[i].arrCols[j].className + "'";
			  if (arrRows[i].arrCols[j].rowSpan != 1){
		        htmlss[htmlss.length] = " rowSpan=" + arrRows[i].arrCols[j].rowSpan;
			  }
			  if (arrRows[i].arrCols[j].colSpan > 1){
		        htmlss[htmlss.length] = " colSpan=" + arrRows[i].arrCols[j].colSpan;
			  }
			  if (i == 0){
		        htmlss[htmlss.length] = " style='border-top-width: 0px;'";
			  }
			  if (arrRows[i].arrCols[j].className == "ttdPrg ttdTd"){
			    // ホバー時の処理
		        htmlss[htmlss.length] = " onMouseOver='javascript:onPrgHover(1, this)' onMouseOut='javascript:onPrgHover(2, this)'";
			  }
			  htmlss[htmlss.length] = ">" + arrRows[i].arrCols[j].innerHTML + "</td>";
			}
		  }
		  htmlss[htmlss.length] = "</tr>";
		}
		htmlss[htmlss.length] = "</tbody></table></div>";

 		sDebugText += "タイムテーブルＨＴＭＬの生成完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		tableDivElement = document.getElementById(divId);
		tableDivElement.innerHTML = htmlss.join('');
		
		if (fTimeTableLoadedFunc)
			fTimeTableLoadedFunc();

		sDebugText += "終了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";

		if (ARGV["mode"] == "debug"){
			////////////////////////////////////
			// 速度計測用文字列のデバッグ表示 //
			////////////////////////////////////
			tableDivElement.innerHTML += sDebugText;
			////////////////////////////////////
		}
	}

    var funcErr = function ( data ) {
	  // エラー発生時処理
	  tableDivElement = document.getElementById(divId);
	  tableDivElement.innerHTML = "<br>情報がありません<br><br>";
 	}
 	
	var funcPrg = function ( data, asyncMgr )
	{
		// 番組データ受信完了
 		sDebugText += "番組データ受信完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
		asyncMgr.prgData = data;
	}
	
	var funcLink = function ( data, asyncMgr )
	{
		// リンクデータ受信完了
 		sDebugText += "リンクデータ受信完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
		parseLinkInfo(data);
	}

	// ＵＲＬ設定・イメージ・アイコン置き換えＵＲＬ
	var linkInfoFileUrl = "ttLinkInfo.xml";
	idx = fileUrl.lastIndexOf("/");
	if (-1 != idx){
	  linkInfoFileUrl = fileUrl.substring(0, idx+1) + linkInfoFileUrl;
	}

 	var asyncMgr = new ttAsyncXmlMgr( funcComp );
 	asyncMgr.addRequest(fileUrl + "?cache=" + ((new Date()).getTime()), funcPrg, funcErr);
 	if (arrLinkInfoLoaded == false)
 		asyncMgr.addRequest(linkInfoFileUrl, funcLink);

	sDebugText += "request完了 " + ((new Date()).getTime() - nDebugTime) + "msec<br>";
 }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////
  // 一日タイムテーブル描画処理 //
  ////////////////////////////////
  getTimeTableOne = function(divId, fileUrl, ymd, bNowOnAir)
  {
	nDebugTime = (new Date()).getTime();
	sDebugText = "デバッグ用メッセージ<br>";

//	// 番組ＸＭＬデータの取得
//    var http = new JKL.ParseXML( fileUrl );

	tableDivElement = document.getElementById(divId);
	tableDivElement.innerHTML = sWaitStr;
    
    var funcComp = function ( asyncMgr ) { 
		// 非同期メソッド

		var data = asyncMgr.prgData;

		// 現在時刻の取得
		nowDate = new Date();
		nowHhmm = nowDate.getHours() * 100 + nowDate.getMinutes();

		minHhmm = 0;
		maxHhmm = 0;
		var arrMinYobi = new Array(7+2);
		var arrMaxYobi = new Array(7+2);
		for (i=0; i<7+2; i++){
		  arrMinYobi[i] = 0;
		  arrMaxYobi[i] = 0;
		}

		startYmd = 0;

		// ＸＭＬデータの受信→配列作成
		var arrData = new Array();
	    if (true){
		  startYmd = parseInt(data.timeTable.prgDataEntry.date, 10);

		  for (nLoop1 = 0; nLoop1 < data.timeTable.prgDataEntry.prgData.length; nLoop1++){
		  	
			//if (data.timeTable.prgDataEntry.prgData[nLoop1].date != ymd)
		  	  //continue;

			if (zYmdOpe(startYmd, parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].yobi, 10)-1) != ymd)
			  continue;

		    var item = new Array(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem.length);
		    for (nLoop2 = 0; nLoop2 < data.timeTable.prgDataEntry.prgData[nLoop1].prgItem.length; nLoop2++){

			  // 番組アイテム
			  item[nLoop2] ={"sMode"    : "prg",
							 "nYobi"    : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].yobi, 10),
							 "nStart"   : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].st, 10),
							 "nEnd"     : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].en, 10),
							 "sPrgName" : data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].name,
							 "colSpan"  : 1}; 

			  // 変な時刻の場合の調整
			  if (nLoop2 > 0){
			    if (item[nLoop2 - 1].nYobi  == item[nLoop2].nYobi  &&
			    	item[nLoop2 - 1].nStart == item[nLoop2].nStart){
			    	  item[nLoop2 - 1].bDummy = 1;
			    }
			  }

			  // アイコン設定
			  if (typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon) == "object"){
			    item[nLoop2].sIcon = new Array();
			    for (i=0; typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon[i]) != "undefined"; i++){
				  item[nLoop2].sIcon[i] = data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon[i];
			    }
			  }
			  else
			  if (typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon) == "string"){
			    item[nLoop2].sIcon = new Array(1);
			    item[nLoop2].sIcon[0] = data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon;
			  }
			}
		    arrData = arrData.concat(item);
		  }
		}

		// ＵＲＬ設定
		setLinkInfo(arrData, true, false, true);

		nRow      = 0;

		var arrRows = new Array();
		var objRow;
		var objCol;

		nowOnAirPrgHhmmId = "";	// 現在ＯＡ中番組の番組開始時刻ＩＤ
		nowTimePrgHhmmId  = "";	// 現在時刻番組の番組開始時刻ＩＤ

		// タイムテーブルデータの生成
		for (i=0; i<arrData.length; i++){
		  if (arrData[i].bDummy == 1)		// ★
		  	continue;						// ★
		  if (true){
		    // 行の生成
			objRow = new rowElement();
			arrRows.push(objRow);

			nRow++;
		  }

		  // 列の生成
		  objCol = new colElement();
		  objCol.prgItemData = arrData[i];
		  objRow.arrCols.push(objCol);
		  if (arrData[i].sMode == "prg"){
			//////////
			// 番組 //
			//////////
			hh = Math.floor(arrData[i].nStart / 100);
			mm = arrData[i].nStart % 100;
			if (hh < 10) hh = "0" + hh;
			if (mm < 10) mm = "0" + mm;

			hhEnd = Math.floor(arrData[i].nEnd / 100);
			mmEnd = arrData[i].nEnd % 100;
			if (hhEnd < 10) hhEnd = "0" + hhEnd;
			if (mmEnd < 10) mmEnd = "0" + mmEnd;

			ymd24s = ymd;
			hh24s  = hh;
			if (hh24s >= 24){
			  ymd24s += 1;
			  hh24s  -= 24;
			}
			ymd24e = ymd;
			hh24e  = hhEnd;
			if (hh24e >= 24){
			  ymd24e += 1;
			  hh24e  -= 24;
			}
			var ddSt = new Date(Math.floor(ymd24s/10000), Math.floor(ymd24s/100%100)-1, ymd24s%100, hh24s, mm,    0);
			var ddEn = new Date(Math.floor(ymd24e/10000), Math.floor(ymd24e/100%100)-1, ymd24e%100, hh24e, mmEnd, 59);

			//if (arrData[i].nStart <= nowHhmm){
			if (ddSt <= nowDate && nowDate <= ddEn){
			  // 現在ＯＡ中番組
			  nowOnAirPrgHhmmId = 'hhmm_' + hh + mm;
			}

			if ((arrData[i].nStart <= nowHhmm      && nowHhmm      < arrData[i].nEnd) ||
			    (arrData[i].nStart <= nowHhmm+2400 && nowHhmm+2400 < arrData[i].nEnd) ){
			  nowTimePrgHhmmId = 'hhmm_' + hh + mm;
			}

			// ＵＲＬリンク
			prg = "<div align='left' >";
			
			if (arrData[i].sUrl != "" && typeof(arrData[i].sUrl) != "undefined"){
			  prg += "<a href='" + arrData[i].sUrl + "'";
			  sTarget = (arrData[i].sUrlMode == "local") ? sHrefLocalTarget : sHrefTarget;
			  if (sTarget != "")
			       prg += " target='" + sTarget + "' >";
			  else prg += ">"
			}

			// 番組名
			if (typeof(arrData[i].sPrgName) == "undefined")
		    		prg += " ";
		    else	prg += arrData[i].sPrgName;

			if (arrData[i].sUrl != "" && typeof(arrData[i].sUrl) != "undefined"){
			  prg += "</a>";
			}

			// アイコン
			if (arrData[i].sIcon != "" && typeof(arrData[i].sIcon) != "undefined"){
			  for (j=0; j < arrData[i].sIcon.length; j++){
				if (typeof(arrData[i].sIcon[j]) != "undefined"){
				  prg += "<img src='" + arrData[i].sIcon[j] + "' class='ttIcon' >";
				}
			  }
			}

			prg += "</div>";

			var htmlss = new Array();
			
			htmlss[htmlss.length] = "<table border='0' width='100%' height='100%' id='hhmm_" + hh + mm + "'>";
		    htmlss[htmlss.length] = "<col class='ttcColHhmm'>";
		    htmlss[htmlss.length] = "<col class='ttcColPrg'>";
			htmlss[htmlss.length] =  "<tr>"
			htmlss[htmlss.length] =   "<td valign='top'><table border='0' cellspacing='1' cellpadding='0'><tr><td class='ttiPrgHhmm'>" + hh + ":" + mm + "</td>";

			htmlss[htmlss.length] =         "</tr></table></td>";
			//htmlss[htmlss.length] =  "</tr>"
			//htmlss[htmlss.length] =  "<tr>"
			htmlss[htmlss.length] =   "<td><div class='ttiPrgName'>" + prg + "</div></td>";
			htmlss[htmlss.length] =  "</tr>"

			// ラテ欄
			if (arrData[i].sRate != "" && typeof(arrData[i].sRate) != "undefined"){
			  htmlss[htmlss.length] =  "<tr><td></td>"
			  htmlss[htmlss.length] =   "<td><div class='ttiPrgRate'><tt>" + arrData[i].sRate + "</tt></div></td>";
			  htmlss[htmlss.length] =  "</tr>"
			}
			
			htmlss[htmlss.length] = "</table>"

			objCol.className = "ttdPrg ttdTd";
			objCol.innerHTML = htmlss.join('');
		  }
		}

		// タイムテーブルＨＴＭＬの生成
		var htmlss = new Array();
		htmlss[htmlss.length] = "<div class='ttdivHeader' id='ttdivHeader'>";
		htmlss[htmlss.length] = "</div>";

		htmlss[htmlss.length] = "<div class='ttdivBody'>";
		htmlss[htmlss.length] = "<table class='tttMain' style='border-top-width: 0px'>";

		// ｔｂｏｄｙ部分
		for (i = 0; i < arrRows.length; i++){
		  htmlss[htmlss.length] = "<tr>";
		  for (j = 0; j < arrRows[i].arrCols.length; j++){
		    if (arrRows[i].arrCols[j].colSpan >= 1){
		      htmlss[htmlss.length] = "<td class='" + arrRows[i].arrCols[j].className + "'";
			  if (arrRows[i].arrCols[j].rowSpan != 1){
		        htmlss[htmlss.length] = " rowSpan=" + arrRows[i].arrCols[j].rowSpan;
			  }
			  if (arrRows[i].arrCols[j].colSpan > 1){
		        htmlss[htmlss.length] = " colSpan=" + arrRows[i].arrCols[j].colSpan;
			  }
			  if (i == 0){
		        htmlss[htmlss.length] = " style='border-top-width: 0px;'";
			  }
			  if (arrRows[i].arrCols[j].className == "ttdPrg ttdTd"){
			    // ホバー時の処理
		        //htmlss[htmlss.length] = " onMouseOver='javascript:onPrgHover(1, this)' onMouseOut='javascript:onPrgHover(2, this)'";
			  }
			  htmlss[htmlss.length] = ">" + arrRows[i].arrCols[j].innerHTML + "</td>";
			}
		  }
		  htmlss[htmlss.length] = "</tr>";
		}
		htmlss[htmlss.length] = "</table></div>";

		tableDivElement = document.getElementById(divId);
		tableDivElement.innerHTML = htmlss.join('');


		// ＮｏｗＯｎＡｉｒへのジャンプ
		if (bNowOnAir == true){
		  if (nowOnAirPrgHhmmId != ""){
			// ＮｏｗＯｎＡｉｒ
		    // 注意：上部操作部分のマージンがあるので、それを考慮している
		    
			jumpElement = document.getElementById(nowOnAirPrgHhmmId);
			jumpElement.offsetParent.className = "ttdPrg_nowOnAir ttdTd";

			setTimeout("onNowOnAirScroll('" + divId + "','" + nowOnAirPrgHhmmId + "')", 100);
		  }
		  else
		  if (nowTimePrgHhmmId != ""){
			// 現在時刻にスクロール
			setTimeout("onNowOnAirScroll('" + divId + "','" + nowTimePrgHhmmId + "')", 100);
		  }
		}
	}

    var funcErr = function ( data ) {
	  // エラー発生時処理
      tableDivElement = document.getElementById(divId);
	  tableDivElement.innerHTML = "<br>情報がありません<br><br>";
 	}
 	
	var funcPrg = function ( data, asyncMgr )
	{
		// 番組データ受信完了
		asyncMgr.prgData = data;
	}

	var funcLink = function ( data, asyncMgr )
	{
		// リンクデータ受信完了
		parseLinkInfo(data);
	}

	// ＵＲＬ設定・イメージ・アイコン置き換えＵＲＬ
	var linkInfoFileUrl = "ttLinkInfo.xml";
	idx = fileUrl.lastIndexOf("/");
	if (-1 != idx){
	  linkInfoFileUrl = fileUrl.substring(0, idx+1) + linkInfoFileUrl;
	}

 	var asyncMgr = new ttAsyncXmlMgr( funcComp );
 	asyncMgr.addRequest(fileUrl + "?cache=" + ((new Date()).getTime()), funcPrg, funcErr);
 	if (arrLinkInfoLoaded == false)
	 	asyncMgr.addRequest(linkInfoFileUrl, funcLink);

  }




  ////////////////////////////////
  // 一日タイムテーブル描画処理 //
  ////////////////////////////////
  getTimeTableOne2 = function(divId, fileUrl, ymd, bNowOnAir)
  {
	nDebugTime = (new Date()).getTime();
	sDebugText = "デバッグ用メッセージ<br>";

//	// 番組ＸＭＬデータの取得
//    var http = new JKL.ParseXML( fileUrl );

	tableDivElement = document.getElementById(divId);
	tableDivElement.innerHTML = sWaitStr;
    
    var funcComp = function ( asyncMgr ) { 
		// 非同期メソッド

		var data = asyncMgr.prgData;

		// 現在時刻の取得
		nowDate = new Date();
		nowHhmm = nowDate.getHours() * 100 + nowDate.getMinutes();

		minHhmm = 0;
		maxHhmm = 0;
		var arrMinYobi = new Array(7+2);
		var arrMaxYobi = new Array(7+2);
		for (i=0; i<7+2; i++){
		  arrMinYobi[i] = 0;
		  arrMaxYobi[i] = 0;
		}

		startYmd = 0;

		// ＸＭＬデータの受信→配列作成
		var arrData = new Array();
	    if (true){
		  startYmd = parseInt(data.timeTable.prgDataEntry.date, 10);

		  for (nLoop1 = 0; nLoop1 < data.timeTable.prgDataEntry.prgData.length; nLoop1++){
		  	
			//if (data.timeTable.prgDataEntry.prgData[nLoop1].date != ymd)
		  	  //continue;

			if (zYmdOpe(startYmd, parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].yobi, 10)-1) != ymd)
			  continue;

		    var item = new Array(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem.length);
		    for (nLoop2 = 0; nLoop2 < data.timeTable.prgDataEntry.prgData[nLoop1].prgItem.length; nLoop2++){

			  // 番組アイテム
			  item[nLoop2] ={"sMode"    : "prg",
							 "nYobi"    : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].yobi, 10),
							 "nStart"   : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].st, 10),
							 "nEnd"     : parseInt(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].en, 10),
							 "sPrgName" : data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].name,
							 "sRate"    : data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].rate,
							 "colSpan"  : 1}; 

			  if (item[nLoop2].sRate != null && item[nLoop2].sRate != "" && -1 != item[nLoop2].sRate.indexOf("<")){
			    item[nLoop2].sRate    = item[nLoop2].sRate.replace("<", "&lt;");
			  }
			  if (item[nLoop2].sRate != null && item[nLoop2].sRate != "" && -1 != item[nLoop2].sRate.indexOf(">")){
			    item[nLoop2].sRate    = item[nLoop2].sRate.replace(">", "&gt;");
			  }

			  // 変な時刻の場合の調整
			  if (nLoop2 > 0){
			    if (item[nLoop2 - 1].nYobi  == item[nLoop2].nYobi  &&
			    	item[nLoop2 - 1].nStart == item[nLoop2].nStart){
			    	  item[nLoop2 - 1].bDummy = 1;
			    }
			  }

			  // アイコン設定
			  if (typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon) == "object"){
			    item[nLoop2].sIcon = new Array();
			    for (i=0; typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon[i]) != "undefined"; i++){
				  item[nLoop2].sIcon[i] = data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon[i];
			    }
			  }
			  else
			  if (typeof(data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon) == "string"){
			    item[nLoop2].sIcon = new Array(1);
			    item[nLoop2].sIcon[0] = data.timeTable.prgDataEntry.prgData[nLoop1].prgItem[nLoop2].icon;
			  }
			}
		    arrData = arrData.concat(item);
		  }
		}

		// ＵＲＬ設定
		setLinkInfo(arrData, true, false, true);

		nRow      = 0;

		var arrRows = new Array();
		var objRow;
		var objCol;

		nowOnAirPrgHhmmId = "";	// 現在ＯＡ中番組の番組開始時刻ＩＤ
		nowTimePrgHhmmId  = "";	// 現在時刻番組の番組開始時刻ＩＤ

		// タイムテーブルデータの生成
		for (i=0; i<arrData.length; i++){
		  if (arrData[i].bDummy == 1)		// ★
		  	continue;						// ★
		  if (true){
		    // 行の生成
			objRow = new rowElement();
			arrRows.push(objRow);

			nRow++;
		  }

		  // 列の生成
		  objCol = new colElement();
		  objCol.prgItemData = arrData[i];
		  objRow.arrCols.push(objCol);
		  if (arrData[i].sMode == "prg"){
			//////////
			// 番組 //
			//////////
			hh = Math.floor(arrData[i].nStart / 100);
			mm = arrData[i].nStart % 100;
			if (hh < 10) hh = "0" + hh;
			if (mm < 10) mm = "0" + mm;

			hhEnd = Math.floor(arrData[i].nEnd / 100);
			mmEnd = arrData[i].nEnd % 100;
			if (hhEnd < 10) hhEnd = "0" + hhEnd;
			if (mmEnd < 10) mmEnd = "0" + mmEnd;

			ymd24s = ymd;
			hh24s  = hh;
			if (hh24s >= 24){
			  ymd24s += 1;
			  hh24s  -= 24;
			}
			ymd24e = ymd;
			hh24e  = hhEnd;
			if (hh24e >= 24){
			  ymd24e += 1;
			  hh24e  -= 24;
			}
			var ddSt = new Date(Math.floor(ymd24s/10000), Math.floor(ymd24s/100%100)-1, ymd24s%100, hh24s, mm,    0);
			var ddEn = new Date(Math.floor(ymd24e/10000), Math.floor(ymd24e/100%100)-1, ymd24e%100, hh24e, mmEnd, 59);

			//if (arrData[i].nStart <= nowHhmm){
			if (ddSt <= nowDate && nowDate <= ddEn){
			  // 現在ＯＡ中番組
			  nowOnAirPrgHhmmId = 'hhmm_' + hh + mm;
			}

			if ((arrData[i].nStart <= nowHhmm      && nowHhmm      < arrData[i].nEnd) ||
			    (arrData[i].nStart <= nowHhmm+2400 && nowHhmm+2400 < arrData[i].nEnd) ){
			  nowTimePrgHhmmId = 'hhmm_' + hh + mm;
			}

			// ＵＲＬリンク
			prg = "<div align='left' >";
			
			// アイコン
			if (arrData[i].sIcon != "" && typeof(arrData[i].sIcon) != "undefined"){
			  var iconCnt = 0;
			  for (j=0; j < arrData[i].sIcon.length; j++){
				if (typeof(arrData[i].sIcon[j]) != "undefined"){
				  prg += "<img src='" + arrData[i].sIcon[j] + "' class='ttIcon' >";
				  iconCnt++;
				}
			  }
			  if (iconCnt > 0)
			  	  prg += "&nbsp;";
			}

			if (arrData[i].sUrl != "" && typeof(arrData[i].sUrl) != "undefined"){
			  prg += "<a href='" + arrData[i].sUrl + "'";
			  sTarget = (arrData[i].sUrlMode == "local") ? sHrefLocalTarget : sHrefTarget;
			  if (sTarget != "")
			       prg += " target='" + sTarget + "' >";
			  else prg += ">"
			}

			// 番組名
			if (typeof(arrData[i].sPrgName) == "undefined")
		    		prg += " ";
		    else	prg += arrData[i].sPrgName;

			if (arrData[i].sUrl != "" && typeof(arrData[i].sUrl) != "undefined"){
			  prg += "</a>";
			}

			prg += "</div>";

			var htmlss = new Array();
			
			htmlss[htmlss.length] = "<table border='0' width='100%' height='100%' id='hhmm_" + hh + mm + "'>";
		    htmlss[htmlss.length] = "<col class='ttcColHhmm'>";
		    htmlss[htmlss.length] = "<col class='ttcColPrg'>";
			htmlss[htmlss.length] =  "<tr>"
			htmlss[htmlss.length] =   "<td><table border='0' cellspacing='1' cellpadding='0' ><tr><td class='ttiPrgHhmm'>" + hh + ":" + mm + "</td>";

			htmlss[htmlss.length] =         "</tr></table></td>";
			//htmlss[htmlss.length] =  "</tr>"
			//htmlss[htmlss.length] =  "<tr>"
			htmlss[htmlss.length] =   "<td><div class='ttiPrgName'>" + prg + "</div></td>";
			htmlss[htmlss.length] =  "</tr>"

			// ラテ欄
			if (arrData[i].sRate != "" && typeof(arrData[i].sRate) != "undefined"){
			  htmlss[htmlss.length] =  "<tr><td></td>"
			  htmlss[htmlss.length] =   "<td><div class='ttiPrgRate'><tt>" + arrData[i].sRate + "</tt></div></td>";
			  htmlss[htmlss.length] =  "</tr>"
			}
			
			htmlss[htmlss.length] = "</table>"

			objCol.className = "ttdPrg ttdTd";
			objCol.innerHTML = htmlss.join('');
		  }
		}

		// タイムテーブルＨＴＭＬの生成
		var htmlss = new Array();
		htmlss[htmlss.length] = "<div class='ttdivHeader' id='ttdivHeader'>";
		htmlss[htmlss.length] = "</div>";

		htmlss[htmlss.length] = "<div class='ttdivBody'>";
		htmlss[htmlss.length] = "<table class='tttMain' style='border-top-width: 0px'>";

		// ｔｂｏｄｙ部分
		for (i = 0; i < arrRows.length; i++){
		  htmlss[htmlss.length] = "<tr>";
		  for (j = 0; j < arrRows[i].arrCols.length; j++){
		    if (arrRows[i].arrCols[j].colSpan >= 1){
		      htmlss[htmlss.length] = "<td class='" + arrRows[i].arrCols[j].className + "'";
			  if (arrRows[i].arrCols[j].rowSpan != 1){
		        htmlss[htmlss.length] = " rowSpan=" + arrRows[i].arrCols[j].rowSpan;
			  }
			  if (arrRows[i].arrCols[j].colSpan > 1){
		        htmlss[htmlss.length] = " colSpan=" + arrRows[i].arrCols[j].colSpan;
			  }
			  if (i == 0){
		        htmlss[htmlss.length] = " style='border-top-width: 0px;'";
			  }
			  if (arrRows[i].arrCols[j].className == "ttdPrg ttdTd"){
			    // ホバー時の処理
		        //htmlss[htmlss.length] = " onMouseOver='javascript:onPrgHover(1, this)' onMouseOut='javascript:onPrgHover(2, this)'";
			  }
			  htmlss[htmlss.length] = ">" + arrRows[i].arrCols[j].innerHTML + "</td>";
			}
		  }
		  htmlss[htmlss.length] = "</tr>";
		}
		htmlss[htmlss.length] = "</table></div>";

		tableDivElement = document.getElementById(divId);
		tableDivElement.innerHTML = htmlss.join('');


		// ＮｏｗＯｎＡｉｒへのジャンプ
		if (bNowOnAir == true){
		  if (nowOnAirPrgHhmmId != ""){
			// ＮｏｗＯｎＡｉｒ
		    // 注意：上部操作部分のマージンがあるので、それを考慮している
		    
			jumpElement = document.getElementById(nowOnAirPrgHhmmId);
			jumpElement.offsetParent.className = "ttdPrg_nowOnAir ttdTd";

			setTimeout("onNowOnAirScroll('" + divId + "','" + nowOnAirPrgHhmmId + "')", 100);
		  }
		  else
		  if (nowTimePrgHhmmId != ""){
			// 現在時刻にスクロール
			setTimeout("onNowOnAirScroll('" + divId + "','" + nowTimePrgHhmmId + "')", 100);
		  }
		}
	}

    var funcErr = function ( data ) {
	  // エラー発生時処理
      tableDivElement = document.getElementById(divId);
	  tableDivElement.innerHTML = "<br>情報がありません<br><br>";
 	}
 	
	var funcPrg = function ( data, asyncMgr )
	{
		// 番組データ受信完了
		asyncMgr.prgData = data;
	}

	var funcLink = function ( data, asyncMgr )
	{
		// リンクデータ受信完了
		parseLinkInfo(data);
	}

	// ＵＲＬ設定・イメージ・アイコン置き換えＵＲＬ
	var linkInfoFileUrl = "ttLinkInfo.xml";
	idx = fileUrl.lastIndexOf("/");
	if (-1 != idx){
	  linkInfoFileUrl = fileUrl.substring(0, idx+1) + linkInfoFileUrl;
	}

 	var asyncMgr = new ttAsyncXmlMgr( funcComp );
 	asyncMgr.addRequest(fileUrl + "?cache=" + ((new Date()).getTime()), funcPrg, funcErr);
 	if (arrLinkInfoLoaded == false)
	 	asyncMgr.addRequest(linkInfoFileUrl, funcLink);

  }
