/*
 * remainder.js - チケット残券情報 表示用スクリプト
 *
 * ○変更履歴
 * 2009.03.03 h.adachi  ：新規作成
 * 2010.03.11 h.adachi  ：リニューアル対応追加
 * 2010.03.25 h.nakajima：席種名変更(エキサイトシート→マクドナルドエキサイトシート)
 * 2010.04.02 h.nakajima：チャネル(ぴあ)リンク先変更
 * 2011.02.04 h.adachi  ：販売チャネル追加(セブンイレブン)、席種追加(YGシート，Girl's Giants Seat)
 * 2011.03.25 h.adachi  ：データ有無の判定条件の見直し
 */

if ( typeof(WriteRemainder) == 'undefined' ) WriteRemainder = function() {};
if ( typeof(Common) == 'undefined' ) Common = function() {};

// 各種オブジェクト生成
var remainder = new WriteRemainder();
var common    = new Common();

// キャッシュ対策用タイムスタンプ
var set_date = new Date();
var set_time = Date.parse(set_date).toString();
var set_param = '?' + set_time.substring(0, 10);

// 各種変数群
WriteRemainder.prototype.SWITCH_TIME   = '100000';
WriteRemainder.prototype.DOME_SEAT_NO  = 17;
WriteRemainder.prototype.LOCAL_SEAT_NO = 17;

WriteRemainder.prototype.CHANNEL_IMG_WIDTH  = 60;
WriteRemainder.prototype.CHANNEL_IMG_HEIGHT = 50;

WriteRemainder.prototype.CHANNEL_IMG = [
	"",
	"/pts/ticket/images/gpo.gif",						// 1
	"/pts/ticket/images/tichketg.gif",					// 2
	"/pts/ticket/images/eplus.gif",						// 3
	"/pts/ticket/images/pia.gif",						// 4
	"/pts/ticket/images/lowson.gif",					// 5
	"/pts/ticket/images/dome.gif",						// 6
	"/pts/ticket/images/stadium.gif",					// 7
	"/pts/ticket/images/etc.gif",						// 8
	"/pts/ticket/images/seven.gif"						// 9
];
WriteRemainder.prototype.CHANNEL_URL = [
	"",
	"http://www.club-g-po.jp/index.html",									// 1
	"http://www.e-tix.jp/ticket_giants/pc/ticket_pc_index.html",			// 2
	"http://eplus.jp/giants",												// 3
	"http://pia.jp/t/giants/",	                        					// 4
	"http://l-tike.com/oc/sports/baseball/",								// 5
	"",																		// 6
	"",																		// 7
	"",																		// 8
	""																		// 9
];
WriteRemainder.prototype.CHANNEL_NAME = [
	"",
	"CLUB G-Po",				// 1
	"チケットGIANTS",			// 2
	"イープラス",				// 3
	"チケットぴあ",				// 4
	"ローソンチケット",			// 5
	"東京ドーム販売所",			// 6
	"球場販売所",				// 7
	"その他",					// 8
	"セブンイレブン"			// 9
];
WriteRemainder.prototype.DOME_SEAT = [
	"",
	"指定席Ｓ",												// 1
	"指定席Ａ",												// 2
	"指定席Ｂ",												// 3
	"YGシート<br>(3塁側巨人応援席)",						// 4
	"Girls\' Giants Seat",									// 5
	"指定席Ｃ",												// 6
	"指定席Ｄ",												// 7
	"外野指定席<br />(ライト／レフト)",						// 8
	"レフト巨人応援席",										// 9
	"ビジターチーム応援席",									// 10
	"マクドナルド<br />エキサイトシート",					// 11
	"オレンジシート",										// 12
	"ファミリーシート",										// 13
	"立ち見",												// 14
	"外野指定見切り席<br />(ライト、レフト巨人応援席)",		// 15
	"外野指定見切り席<br />(レフト、ビジター応援席)",		// 16
	""														// 17(予備シート)
];

WriteRemainder.prototype.SPACE_MSG  = '○：空席あり　△：空席あり（残少）　×：空席なし　－：販売なし';
WriteRemainder.prototype.FOOTER_MSG = '毎日午前8時の各プレイガイド空席状況を表示しています。<br />実際に購入申込時には状況が変わっていることがありますので、ご了承下さい。';
WriteRemainder.prototype.NODATA_MSG = '現在、チケットの前売発売をしている試合はございません。';
WriteRemainder.prototype.INFO_DIR = '/G/schedule/';
WriteRemainder.prototype.INFO_TXT = 'ゲーム・インフォメーション';

/*** Script Start  ***/
// OnLoad Function (Main)
WriteRemainder.display = function(date) {
	// XML URL Path
	var url = "./xml/date_list.xml" + set_param;
	
	// Parse Each XMLs
	var http = new JKL.ParseXML(url);
	// 出力データの全配列化
	http.setOutputArrayAll();
	var func = "";
	func = function(data){
		if(!common.isEmpty(data.itemList[0].item)){
			var remainder_list = new Array();
			remainder_list = remainder.getGameData(data.itemList[0].item);
			
			// 今日の日付を取得
			var today_date = common.getDate(0,'');
			
			var data_flag = false;
			var len = remainder_list['date'].length;
			for(var i=0;i<len;i++){
				/* データ有無の判定条件 */
				// 1.表示対象日以降の記事が登録されていること
				// 2.チケットインフォメーションから「対戦チーム名」「球場名」の両方が取得できていること
				if(
					(remainder_list['date'][i] >= today_date) &&
					(!common.isEmpty(remainder_list['team'][i]) && !common.isEmpty(remainder_list['stadium'][i]))
				){
					data_flag = true;
					break;
				}
			}
			
			if(data_flag){
				// プルダウン設定用関数
				var this_date = '';
				var index_flag = true;
				this_date = remainder.setPulldown(remainder_list, date, today_date);
				if(!common.isEmpty(date) && this_date != date){
					this_date = date, index_flag = false;
				}
				
				// 試合開始時間取得用関数
				var start_time = '';
				start_time = remainder.getStartTime(this_date);
				
				// テーブル設定用関数
				var no = 0;
				for(var j=0;j<len;j++){
					if(remainder_list['date'][j] == this_date){
						no = j;
						break;
					}
				}
				
				if(
					!common.isEmpty(remainder_list['team'][no])    &&
					!common.isEmpty(remainder_list['stadium'][no]) &&
					!common.isEmpty(no)
				){
					remainder.setTable(remainder_list, this_date, no, start_time);
				}else if(index_flag){
					remainder.setTable(remainder_list, this_date, no, start_time);
				}
			}else{
				var str = '<h3><span class="title">' + remainder.NODATA_MSG + '</span></h3>\n';
				
				// HTML書き込み(div id='WriteRemainder')
				var element = document.getElementById('WriteRemainder');
				if(element){ element.innerHTML = str };
				
				var str2 = '';
				str2 += '<p>' + remainder.FOOTER_MSG + '</p>\n';
				
				// HTML書き込み(div id='sub')
				var element = document.getElementById('sub');
				if(element){ element.innerHTML = str2 };
			}
		}
	}
	http.async(func);
	http.parse();
}

// functions
/**
 * 試合詳細情報取得用関数
 * 引数(data_node)
 * 1. data_node: 日付一覧のXMLデータ
 */
WriteRemainder.prototype.getGameData = function(data_node){
	var url = "./xml/top_ticket.xml" + set_param;
	var http = new JKL.ParseXML(url);
	// 出力データの全配列化
	http.setOutputArrayAll();
	var data = http.parse();
	
	// 残券情報リスト作成
	var date_list = new Array();
	var type_list = new Array();
	var team_list = new Array();
	var stadium_list = new Array();
	var remainder_list = new Array();
	
	var len = data_node.length;
	for(var i=0;i<len;i++){
		date_list[i] = data_node[i].date[0];
		// 東京ドームと地方球場の両方に残券情報がある場合
		if(data_node[i].type.length == 2){
			type_list[i] = 'all';
		}else{
			type_list[i] = data_node[i].type[0];
		}
		team_list[i] = '', stadium_list[i] = '';
	}
	remainder_list['date']    = date_list;
	remainder_list['type']    = type_list;
	remainder_list['team']    = team_list;
	remainder_list['stadium'] = stadium_list;
	
	var len2 = remainder_list['date'].length;
	var len3 = data.itemList[0].item.length;
	for(var j=0;j<len2;j++){
		for(var k=0;k<len3;k++){
			var item = data.itemList[0].item[k];
			
			// 残券情報のタイプとチケットインフォメーションのタイプが一致しているか
			if(remainder_list['date'][j] == item.date[0]){
				if(!common.isEmpty(item.place[0].id[0])){
					if(remainder_list['type'][j] == 'all'){
						remainder_list['type'][j]    = item.place[0].id[0];
						remainder_list['team'][j]    = item.place[0].team[0];
						remainder_list['stadium'][j] = item.place[0].stadium[0];
					}else if(remainder_list['type'][j] == item.place[0].id[0]){
						remainder_list['team'][j]    = item.place[0].team[0];
						remainder_list['stadium'][j] = item.place[0].stadium[0];
					}
					break;
				}
			}
		}
	}
	return remainder_list;
}

/**
 * 前売り試合一覧プルダウン設定用関数
 * 引数(list, date, today_date)
 * 1. list       : 試合情報格納リスト
 * 2. date       : 日付一覧のXMLデータ
 * 3. today_date : 本日の日付
 */
WriteRemainder.prototype.setPulldown = function(list, date, today_date){
	var str = '';
	var this_date = '';
	var now_time   = today_date.substring(8,14);
	
	// 10時より前の場合は当日以降、10時以降の場合は翌日以降の日付を取得
	if(parseInt(this.SWITCH_TIME, 10) > parseInt(now_time, 10)){
		today_date = today_date.substring(0,8);
	}else{
		today_date = common.getDate(1,'after').substring(0,8);
	}
	
	// ヘッダ
	str += '<form name="form" id="form">\n'
		+  '<div class="select">\n'
		+  '<select onchange="MM_jumpMenu(\'parent\',this,1)" id="jumpMenu" name="jumpMenu">\n';
	
	// 選択項目部分
	var len = list['date'].length;
	for(var i=0;i<len;i++){
		if(parseInt(today_date, 10) <= parseInt(list['date'][i], 10)){
			if(!common.isEmpty(list['team'][i]) && !common.isEmpty(list['stadium'][i])){
				if(common.isEmpty(this_date)){ this_date = list['date'][i] };
				if(parseInt(list['date'][i], 10) == parseInt(date, 10)){
					str += '<option value="index.html?date=' + list['date'][i] + '" selected="selected">';
				}else{
					str += '<option value="index.html?date=' + list['date'][i] + '">';
				}
				str += '▼'
					+  parseInt(list['date'][i].substring(4,6), 10) + '月'
					+  parseInt(list['date'][i].substring(6,8), 10) + '日'
					+  '（' + common.getWeek(list['date'][i]) + '）'
					+  list['team'][i]+ '戦 '
					+  '(' + list['stadium'][i] + ') </option>\n';
			}
		}
	}
	// フッタ
	str += '</select>\n</div>\n</form>\n';
	
	// HTML書き込み(div id='pulldown')
	var element = document.getElementById('pulldown');
	if(element){ element.innerHTML = str };
	
	return this_date;
}

/**
 * 試合開始時間取得用関数
 * 引数(this_date)
 * 1. this_date : 表示するデータの日付
 */
WriteRemainder.prototype.getStartTime = function(this_date){
	var url = "./xml/top_game_schedule.xml" + set_param;
	var http = new JKL.ParseXML(url);
	// 出力データの全配列化
	http.setOutputArrayAll();
	var data = http.parse();
	
	var start_time = '';
	var len = data.itemList[0].item.length;
	
	for(var i=0;i<len;i++){
		if(this_date == data.itemList[0].item[i].date[0]){
			if(data.itemList[0].item[i].startTime[0] != '----'){
				start_time = data.itemList[0].item[i].startTime[0];
				break;
			}
		}
	}
	return start_time;
}

/**
 * 残券情報部分表示用関数
 * 引数(list, date, no, start_time)
 * 1. list       : 試合情報格納リスト
 * 2. date       : 表示するデータの日付
 * 3. no         : 試合情報格納リストから取り出すデータの番号
 * 4. start_time : 試合開始時刻
 */
WriteRemainder.prototype.setTable = function(list, date, no, start_time){
	// XML URL Path
	var url = "./xml/" + list['date'][no] + '_' + list['type'][no] + ".xml" + set_param;
	
	// Parse Each XMLs
	var http = new JKL.ParseXML(url);
	// 出力データの全配列化
	http.setOutputArrayAll();
	var func = "";
	
	func = function(data){
		var str = '';
		
		// ヘッダ
		str += '<h3>\n'
			+  '<span class="title">'
			+  parseInt(list['date'][no].substring(4,6), 10) + '月'
			+  parseInt(list['date'][no].substring(6,8), 10) + '日'
			+  '（' + common.getWeek(list['date'][no]) + '）';
		
		if(!common.isEmpty(start_time)){
			str += start_time.substring(0,2) + ':' + start_time.substring(2,4);
		}
		str += ' ／ '
			+  '巨　人 - ' + list['team'][no]
			+  '（' + list['stadium'][no] + '）'
			+  '</span>\n'
			+  '<a class="gameinfo" href="' + remainder.INFO_DIR + list['date'][no] + '.html">' + remainder.INFO_TXT + '</a>\n'
			+  '</h3>\n';
		
		// テーブル部分
		str += '<table>\n';
		
		var len = data.itemList[0].SC.length;
		var data_node = data.itemList[0];
		
		for(var i=0;i<len;i++){
			if(i==0){ str += '<tr>\n<th class="seat" style="width:150px;">席　種</th>\n' };
			
			str += '<th class="shop">';
			if(!common.isEmpty(remainder.CHANNEL_URL[data_node.SC[i]])){
				str += '<a href="'  + remainder.CHANNEL_URL[data_node.SC[i]] + '" target="_blank">'
					+  '<img src="' + remainder.CHANNEL_IMG[data_node.SC[i]] + '" '
					+  'width="'    + remainder.CHANNEL_IMG_WIDTH  + '" '
					+  'height="'   + remainder.CHANNEL_IMG_HEIGHT + '" />'
					+  '</a>';
			}else{
				str += '<img src="' + remainder.CHANNEL_IMG[data_node.SC[i]] + '" '
					+  'width="'    + remainder.CHANNEL_IMG_WIDTH  + '" '
					+  'height="'   + remainder.CHANNEL_IMG_HEIGHT + '" />';
			}
			str += '</th>\n';
			
			if(i==len-1){ str += '</tr>\n' };
		}
		
		// 残券情報部分
		if(list['type'][no] == 'dome'){
			for(var j=0;j<remainder.DOME_SEAT_NO;j++){
				str += remainder.setRowDome(data_node['seat' + (j+1)]);
			}
		}else if(list['type'][no] == 'local'){
			for(var k=0;k<remainder.LOCAL_SEAT_NO;k++){
				str += remainder.setRowLocal(data_node['seat' + (k+1)]);
			}
		}
		str += '</table>\n'
			+  '<p>' + remainder.SPACE_MSG + '</p>\n';
		
		// HTML書き込み(div id='WriteRemainder')
		var element = document.getElementById('WriteRemainder');
		if(element){ element.innerHTML = str };
		
		// メッセージ設定
		remainder.setMessage(data_node);
	}
	http.async(func);
	http.parse();
}

/**
 * 残券情報列部分HTML設定用関数（東京ドーム）
 * 引数(data_node)
 * 1. data_node : 残券情報XMLのデータ
 */
WriteRemainder.prototype.setRowDome = function(data_node){
	var str = '', pre_str = '';
	var len = data_node.length;
	var extra_seatname;
	
	// データ登録有無判定フラグ
	var data_flag = false;
	
	if(data_node[0].id[0] == this.DOME_SEAT_NO){
		for(var i=0;i<len;i++){
			if(common.isEmpty(extra_seatname) && !common.isEmpty(data_node[i].name)){
				extra_seatname = common.changeLineCode(data_node[i].name[0]);
			}
		}
	}
	
	for(var i=0;i<len;i++){
		// ヘッダ
		if(i==0){
			pre_str += '<tr>\n';
			if(data_node[i].id[0] == this.DOME_SEAT_NO){
				pre_str += '<th style="width:150px;">' + extra_seatname + '</th>\n';
			}else{
				pre_str += '<th style="width:150px;">' + this.DOME_SEAT[data_node[i].id[0]] + '</th>\n';
			}
		}
		
		if(!common.isEmpty(data_node[i].space)){
			pre_str += '<td>' + data_node[i].space[0] + '</td>\n';
			data_flag = true;
		}else{
			pre_str += '<td>-</td>\n';
		}
		// フッタ
		if(i==len-1){ pre_str += '</tr>\n' };
	}
	// 残券情報が全て空でなければ表示に使用する
	if(data_flag){ str += pre_str };
	return str;
}

/**
 * 残券情報列部分HTML設定用関数（地方球場）
 * 引数(data_node)
 * 1. data_node : 残券情報XMLのデータ
 */
WriteRemainder.prototype.setRowLocal = function(data_node){
	var str = '';
	var len = data_node.length;
	var seatname;
	
	for(var i=0;i<len;i++){
		if(!common.isEmpty(data_node[i].name)){
			seatname = common.changeLineCode(data_node[i].name[0]);
			break;
		}
	}
	
	if(!common.isEmpty(seatname)){
		for(var i=0;i<len;i++){
			// ヘッダ
			if(i==0){ str += '<tr>\n<th style="width:150px;">' + seatname + '</th>\n' };
			
			if(!common.isEmpty(data_node[i].space)){
				str += '<td>' + data_node[i].space[0] + '</td>\n';
			}else{
				str += '<td>-</td>\n';
			}
			// フッタ
			if(i==len-1){ str += '</tr>\n' };
		}
	}
	return str;
}

/**
 * メッセージ表示用関数
 * 引数(data_node)
 * 1. data_node : 残券情報XMLのデータ
 */
WriteRemainder.prototype.setMessage = function(data_node){
	var str = '';
	str += '<p>' + this.FOOTER_MSG + '</p>\n';
	
	// 共通メッセージ
	if(!common.isEmpty(data_node.A_Message)){
		var len = data_node.A_Message.length;
		for(var i=0;i<len;i++){
			str += '<p>' + common.changeLineCode(data_node.A_Message[i]['#text'][0]) + '</p>\n';
		}
	}
	
	// チャネル別メッセージ
	if(!common.isEmpty(data_node.C_Message)){
		var len2 = data_node.C_Message.length;
		for(var j=0;j<len2;j++){
			str += '<p><b>『' + this.CHANNEL_NAME[data_node.C_Message[j].channel[0]] + '』</b><br />'
				+  common.changeLineCode(data_node.C_Message[j]['#text'][0])
				+  '</p>\n';
		}
	}
	// HTML書き込み(div id='sub')
	var element = document.getElementById('sub');
	if(element){ element.innerHTML = str };
}

/**
 * システム日付取得 + フォーマット設定(yyyymmddHHMMSS)用関数
 * 引数(no, point)
 * 1. no	: 対象日からn日
 * 2. point	:'before'：n日前、'after'：n日後、''：当日
 */
Common.prototype.getDate = function(no, point){
	var today_date = '';
	var this_date  = new Date();
	
	if(point=='before'){
		this_date.setTime(this_date.getTime() - (24*60*60*1000)*no);
	}else if(point=='after'){
		this_date.setTime(this_date.getTime() + (24*60*60*1000)*no);
	}	
	var currentYear   = this_date.getYear();
	currentYear       = (currentYear < 2000) ? currentYear + 1900 : currentYear;
	var currentMonth  = this_date.getMonth() + 1;
	var currentDay    = this_date.getDate();
	var currentHour   = this_date.getHours();
	var currentMinute = this_date.getMinutes();
	var currentSecond = this_date.getSeconds();
	if(currentMonth<10){
		today_date = currentYear + '0' + currentMonth;
	}else{
		today_date = currentYear + currentMonth.toString();
	}
	if(currentDay<10){
		today_date += '0' + currentDay;
	}else{
		today_date += currentDay.toString();
	}
	if(currentHour<10){
		today_date += '0' + currentHour;
	}else{
		today_date += currentHour.toString();
	}
	if(currentMinute<10){
		today_date += '0' + currentMinute;
	}else{
		today_date += currentMinute.toString();
	}
	if(currentSecond<10){
		today_date += '0' + currentSecond;
	}else{
		today_date += currentSecond.toString();
	}
	return today_date;
}

/**
 * 曜日データ取得用関数
 * yyyymmdd ：日付データ(YYYYMMDD)
 */
Common.prototype.getWeek = function(yyyymmdd){
	var week_name   = new Array( "日","月","火","水","木","金","土" );
	var set_date    = new Date(yyyymmdd.substring(0,4) ,yyyymmdd.substring(4,6) - 1 ,yyyymmdd.substring(6,8) );
	var search_week = set_date.getDay();
	return week_name[search_week];
}

/**
 * 改行コード(LF)→<br>変換用関数
 */
Common.prototype.changeLineCode = function(str){
	var returnCode = '';
	
	// Firefoxのみ
	if(navigator.userAgent.indexOf("Firefox") != -1){
		returnCode = str.replace(/\n\n/g,"\n");
	}else{
		returnCode = str;
	}
	REbr = new RegExp(String.fromCharCode(10),"g");
	returnCode = returnCode.replace(REbr,"<br>");
	return returnCode;
}

/**
 * 空判定
 */
Common.prototype.isEmpty = function(obj){ return (obj == null || obj == undefined || obj == '')? true: false; }

