//////////////////////////////////////////////////////////////////////
// プレイリスト ＡＪＡＸ                                            //
// 　　　　　　　　　　　　　　　　　株式会社ユニゾンシステムズ     //
// Copyright (C) 200９. Unixon Systems Co.,Ltd. All Rights Reserved. //
//////////////////////////////////////////////////////////////////////

	// プレイリストクラス：コンストラクタ
	var uxnPlaylist = function()
	{
		this.serverTimeDiff = null;
		this.playlistData   = null;	// プレイリストデータ
		this.eodTime		= null;	// 日替わり時刻
		this.yyyymmdd       = null;
	}
	
	
	// 静的な関数：プレイリストファイル名を取得する
	uxnPlaylist.prototype.getPlaylistFilename = function(dir)
	{
		if (typeof(dir) == "undefined")
			dir = 0;
		var nowDate  = new Date();
		var yyyymmdd = nowDate.getFullYear() * 10000 + (nowDate.getMonth()+1) * 100 + nowDate.getDate();
		var hhmmss   = nowDate.getHours() * 10000 + nowDate.getMinutes() * 100 + nowDate.getSeconds();
//		if (hhmmss < 50000){
//			yyyymmdd = zYmdOpe(yyyymmdd, -1);
//			hhmmss   = hhmmss + 240000;
//		}
		yyyymmdd = zYmdOpe(yyyymmdd, dir);
		
		var areaId = 0;
		if (typeof(wi2resultAreaId) != "undefined")
			areaId = wi2resultAreaId;
		
		this.yyyymmdd = yyyymmdd;
		return "playlist_" + areaId + "_" + yyyymmdd + ".xml";
	//	return "playlist.xml";	// for debug
	}
	
	// サーバーとの時刻の「ずれ」を取得する
	uxnPlaylist.prototype.getServerTimeDiffer = function(callbackFunc)
	{
		var http = new JKL.ParseXML.Text( "script/getServerTime1970.php" + "?cache=" + ((new Date()).getTime()) );
		
		var func = function ( Textdata ) {
			// 非同期データ取得メソッド

			if (Textdata == null || typeof(Textdata) == "undefined"){
				// データ取得エラー
				return;
			}
			var nowDate = new Date();
			var clientTime = nowDate.getTime() + "." + nowDate.getMilliseconds();
			var serverTime = Textdata;
		}
		http.async(func);
		http.parse();
	}
	
	// 現在時刻（サーバ時刻）を取得する
	
	// 現在時刻を取得する（日替わり時刻考慮済み）
	uxnPlaylist.prototype.getNowTime = function()
	{
		var nowDate = new Date();
		var nowTime = nowDate.getHours() * 10000 + nowDate.getMinutes() * 100 + nowDate.getSeconds();
//		if (this.eodTime >= 240000){
//			// ２４時越えのチェック
//			if (nowTime < this.eodTime - 240000){
//				nowTime = nowTime + 240000;	// ２４時越、日替わり時刻前の補正
//			}
//		}
		return nowTime;
	}
	
	// 現在時刻イベントを取得する
	uxnPlaylist.prototype.getNowEvent = function(nowTime)
	{
		var ttt = nowTime;
		if (typeof(nowTime) == "undefined")
			ttt = this.getNowTime();
		
		if (this.playlistData == null)
			return null;
		
		for (var i=0; i < this.playlistData.length; i++){
			var ev = this.playlistData[i];
			if (ev.startTime <= ttt && ttt < ev.endTime){
				// 現在イベント発見
				return ev;
			}
		}
		return null;
	}
	
	// 現在時刻セグメントを取得する
	uxnPlaylist.prototype.getNowSeg = function(nowTime)
	{
		var ttt = nowTime;
		if (typeof(nowTime) == "undefined")
			ttt = this.getNowTime();
		
		var ev = this.getNowEvent(ttt);
		if (ev == null)
			return null;
		
		for (var i=0; i < ev.seg.length; i++){
			var seg = ev.seg[i];
			if (seg.startTime <= ttt && ttt < seg.endTime){
				// 現在セグメント発見
				return seg;
			}
		}
		return null;
	}
	
	// 現在時刻以降の現在番組のセグメントリストを取得
	uxnPlaylist.prototype.getNowSegList = function(nowTime)
	{
		var ttt = nowTime;
		if (typeof(nowTime) == "undefined")
			ttt = this.getNowTime();
		
		var seg = this.getNowSeg(ttt);
		if (seg == null)
			return null;
		
		var segList = new Array();
		while (seg != null){
			segList.push(seg);
			seg = seg.segNext;
		}
		return segList;
	}
	
	// 指定イベント番号のイベントを取得
	uxnPlaylist.prototype.getEventById = function(eventId)
	{
		if (this.playlistData == null)
			return null;
		
		for (var i=0; i < this.playlistData.length; i++){
			var ev = this.playlistData[i];
			if (ev.eventId == eventId){
				return ev;
			}
		}
		return null;
	}
	
	// 指定イベント番号・セグメント番号のセグメントを取得
	uxnPlaylist.prototype.getSegmentById = function(eventId, segmentId)
	{
		if (this.playlistData == null)
			return null;
		
		for (var i=0; i < this.playlistData.length; i++){
			var ev = this.playlistData[i];
			if (ev.eventId == eventId){
				for (var j=0; j < ev.seg.length; j++){
					var seg = ev.seg[j];
					if (seg.segmentId == segmentId){
						return seg;
					}
				}
			}
		}
		return null;
	}

	// プレイリストデータの取得
	uxnPlaylist.prototype.getPlaylist = function(playlistFile, loadedFunc)
	{
		var http = new JKL.ParseXML( playlistFile + "?cache=" + ((new Date()).getTime()) );

		var myClass = this;
		
		var func = function ( XMLdata ) {
			// 非同期データ取得メソッド
			if (XMLdata == null || typeof(XMLdata) == "undefined"){
				// データ取得エラー
				return;
			}
			
			// ＸＭＬからプレイリストを取得します
			var playlistData  = myClass.parseXmlFile(XMLdata);
			myClass.playlistData = playlistData;
			myClass.eodTime      = myClass.getEodTime(myClass.playlistData);
			
			if (loadedFunc)
				loadedFunc();
		}
		var errFunc = function ( ) {
			myClass.playlistData = null;
			
			if (loadedFunc)
				loadedFunc();
		}

		http.setOutputArrayElements( ["event","tag","ad","segment"] );	// 配列取得するエレメントのリスト
		http.async(func);
		http.onerror(errFunc);
		http.parse();
	}

	// プレイリストの日替わり時刻を取得：ＳＴＡＴＩＣ
	uxnPlaylist.prototype.getEodTime = function(playlistData)
	{
		if (playlistData == null)
			return null;
		
		var evLast = null;
		for (var i=0; i < playlistData.length; i++){
			evLast = playlistData[i];
		}

		if (evLast != null)
				return evLast.endTime;
		else	return null;
	}

	// ファイル（ＸＭＬ）のパース：ＳＴＡＴＩＣ
	uxnPlaylist.prototype.parseXmlFile = function(XMLdata)
	{
		var playlistData = new Array();
		var eventBefore = null;

        var nowDate = new Date();
		nowDate.setTime(nowDate.getTime() + (-7)*24*3600*1000);	// ７日前まで＝新着
		
		for (var i=0; i < XMLdata.playList.event.length; i++){
			var ev = new Object();
			ev.eventId    = XMLdata.playList.event[i].eventId;
			ev.programId  = XMLdata.playList.event[i].progId;
			
			if (typeof(ev.eventId) == "undefined")
				ev.eventId = ev.programId;
			
			ev.eventName  = zNVL(XMLdata.playList.event[i].title, "");
			ev.startTime  = parseInt(XMLdata.playList.event[i].startTime, 10);
			ev.endTime    = parseInt(XMLdata.playList.event[i].endTime,   10);
			ev.poster     = zTrim(XMLdata.playList.event[i].poster);
			ev.content    = zNVL(XMLdata.playList.event[i].description, "");
			if (typeof(ev.poster) == "undefined" || ev.poster == null || ev.poster == "")
				ev.poster = "../img/noimage.jpg";
			
			//ev.lat        = XMLdata.playList.event[i]["geo:lat"];
			//ev.lng        = XMLdata.playList.event[i]["geo:lng"];
			//alert(ev.lat);

	  		ev.eventName  = ev.eventName.replace("<", "&lt;");
	  		ev.eventName  = ev.eventName.replace(">", "&gt;");
	  		ev.eventName  = ev.eventName.replace(/\n/g, "<br>");

	  		ev.content    = ev.content.replace("<", "&lt;");
	  		ev.content    = ev.content.replace(">", "&gt;");
	  		ev.content    = ev.content.replace(/\n/g, "<br>");
	  		
	  		ev.live = false;
	  		
	  		ev.tag = new Array();
	  		ev.tags = "";
	  		if (XMLdata.playList.event[i].tag){
				for (var j=0; j < XMLdata.playList.event[i].tag.length; j++){
					ev.tag.push(XMLdata.playList.event[i].tag[j]);
					ev.tags = ev.tags + XMLdata.playList.event[i].tag[j] + ",";
		  		}
	  		}
	  		if (ev.tag.length == 0){
	  			var tagstr = "カテゴリなし";
				ev.tag.push(tagstr);
				ev.tags = ev.tags + tagstr + ",";
			}

			ev.date = null;
			if (XMLdata.playList.event[i].pubDate){
				ev.date = getDateObjByRss2(XMLdata.playList.event[i].pubDate);
				if (nowDate.getTime() <= ev.date.getTime()){
					// 新着扱い
					ev.tag.push("新着");
					ev.tags = ev.tags + "新着" + ",";
				}
	  		}
	  		
	  		ev.ad = new Array();
	  		if (XMLdata.playList.event[i].ad){
				var adNo      = 1;
				for (var j=0; j < XMLdata.playList.event[i].ad.length; j++){
					var ad = new Object;
					ad.adNo = adNo++;
					ad.sponsorName = XMLdata.playList.event[i].ad[j].sponsorName;
					ad.image       = XMLdata.playList.event[i].ad[j].image;
					ad.url         = XMLdata.playList.event[i].ad[j].url;
					ev.ad.push(ad);
		  		}
			}
			
			ev.seg = new Array();
			var segBefore = null;
			var segNo = 0;
			for (var j=0; j < XMLdata.playList.event[i].segment.length; j++){
				var seg = new Object();
				seg.segmentId   = XMLdata.playList.event[i].segment[j].segmentId;
				seg.segmentName = XMLdata.playList.event[i].segment[j].segmentName;
				seg.startOffset = parseInt(XMLdata.playList.event[i].segment[j].startOffset, 10);
				seg.duration    = parseInt(XMLdata.playList.event[i].segment[j].duration,    10);
				if (XMLdata.playList.event[i].segment[j].live == "true")
						{ seg.live= true; ev.live = true; }
				else	{ seg.live= false; }
				if (XMLdata.playList.event[i].segment[j].cm == "true")
						seg.cm  = true;
				else	seg.cm  = false;
				seg.psrc        = XMLdata.playList.event[i].segment[j].psrc;		// for pc
				seg.isrc        = XMLdata.playList.event[i].segment[j].isrc;		// for iphone
				
				seg.startTime   = zHhmmssOpeTv(ev.startTime, seg.startOffset);
				seg.endTime     = zHhmmssOpeTv(seg.startTime, zSec2Hms(seg.duration));
				seg.playStart	= null;			// 再生開始時刻
				seg.evid        = false;		// エビデンス（再生されたか）
				
				if (typeof(seg.segmentId) == "undefined" || seg.segmentId == null)
					seg.segmentId = (segNo + 1);	// 自動的にセグメント番号付加
				
				if (segBefore != null)
					segBefore.segNext = seg;
				seg.parentEvent = ev;
				
				ev.seg.push(seg);
				segBefore = seg;
				segNo++;
			}
			if (eventBefore != null)
				eventBefore.eventNext = ev;
			
			playlistData.push(ev);
			eventBefore = ev;
		}

		return playlistData;
	}
