/*-------------------------------------------------------------------------------------------------
 *
 *			以下、日程カレンダー表示用スクリプト群
 *
 *-------------------------------------------------------------------------------------------------*/


/*--------------------------------------*/
/*		トレーニング種目				*/
/*--------------------------------------*/
var DEF_TR_KIND_FREE		= 1 << 4 ;		/*	フリー滑走			*/
var DEF_TR_KIND_GS			= 1 << 3 ;		/*	GS					*/
var DEF_TR_KIND_SL			= 1 << 2 ;		/*	SL					*/
var DEF_TR_KIND_NIGHT		= 1 << 1 ;		/*	ナイター：GS		*/
var DEF_TR_KIND_BUMP		= 1 << 0 ;		/*	コブ				*/


/*--------------------------------------*/
/*		表示フラグ						*/
/*--------------------------------------*/
var DEF_SHOW_TYPE_DAYTIME	= 1 << 0 ;	/*	日中	*/
var DEF_SHOW_TYPE_NIGHTTIME	= 1 << 1 ;	/*	夜間	*/
var DEF_SHOW_TYPE_ENTRY		= 1 << 2 ;	/*	for ENTRY	*/
var DEF_SHOW_TYPE_PRICE		= 1 << 3 ;	/*	料金	*/

/*
 *		料金コード		
 */
var DEF_PRICE_TYPE_A	= 1 ;
var DEF_PRICE_TYPE_B	= 2 ;
var DEF_PRICE_TYPE_C	= 3 ;



/*
 * コンストラクタ。
 * PRCトレーニングクラス。
 *
 * @param	info	トレーニング報文字列。
 */
function PrcTrainingInfo( trainingInfo ) {
	var		ii ;
	var		data, strDate ;

	this.date		= new Array() ;		/*	日時				*/
	this.location	= new Array() ;		/*	場所				*/
	this.collabo	= new Array() ;		/*	コラボ企業			*/
	this.fee		= new Array() ;		/*	料金フラグ			*/
	this.training	= new Array() ;		/*	トレーニングフラグ	*/


	for( ii=0; ii<trainingInfo.length; ii++ ) {
		data = trainingInfo[ii].split(",") ;

		/*	各メンバをハッシュで管理	*/
		strDate = getDateInfoStr( data[0] ) ;
		if( typeof(this.date[ strDate ])!="undefined" ) {
			alert( sprintf( "duplicated date!!\norg[%s]->[%s]", data[0], strDate ) ) ;
			continue ;
		}

		this.date[strDate]		= new Date( strDate ) ;
		this.location[strDate]	= data[2] ;
		this.collabo[strDate]	= data[3] ;
		this.fee[strDate]		= parseInt( data[4], 10 ) ;		/*	料金コード	*/
		this.training[strDate]	= parseInt( data[5], 10 )  ;	/*	トレーニングフラグ	*/
	}
}

/*
 *	日付に該当するトレーニング日インスタンスが存在するかチェックする。
 *
 *	@param	date	トレーニング日インスタンスの存在をチェックする日付（年月日）。
 *
 *	@return	存在チェック結果。
 *				TRUE	有効（存在する）
 *				FALSE	無効（存在しない）
 */
PrcTrainingInfo.prototype.isUnitInstance = function ( date ) {
	return( ( ( typeof(this.date[ getDateInfoStr(date) ])!="undefined" ) ? TRUE : FALSE ) ) ;
}


/*
 *	日付に該当するトレーニング日の実施種目コードを取得する。
 *
 *	@param	date	トレーニング日の実施種目コードを取得する日付（年月日）。
 *
 *	@return	トレーニング日の実施種目コード。
 */
PrcTrainingInfo.prototype.getTrainingCode = function ( date ) {
	return( this.training[ getDateInfoStr(date) ] ) ;
}


/*
 * インスタンスの日付が今日の日付を過ぎたかどうかを返す。
 * 
 *	@return 過ぎた場合は<code>true</code>、未の場合は<code>false</code>を返す。
 */
PrcTrainingInfo.prototype.isTimeUp = function ( date ) {
	var		remain, remainf ;
	remainf = 1 + (this.date[ getDateInfoStr(date) ]).getTime()/DEF_COEF_UTC_DAY - (getTodayInst()).getTime()/DEF_COEF_UTC_DAY ;
	remain = ( remainf>0 ) ? Math.floor(remainf) : Math.ceil(remainf) ;
	return( (remain>=0) ? FALSE : TRUE ) ;
}










var DEF_CALDENR_TYPE_SCHEDULE	= 0 ;
var DEF_CALDENR_TYPE_ENTRY		= 1 ;

/**
 *	スケジュール用のカレンダーを表示する。
 *	@param	targetMonthList		対象月リスト
 */
function putScheduleCalendar( targetMonthList ) {
	document.write( getScheduleCalendarWord( targetMonthList ) ) ;
}
function getScheduleCalendarWord( targetMonthList ) {
	return( getPRCCalendarHtml( targetMonthList, DEF_CALDENR_TYPE_SCHEDULE ) ) ;
}

/**
 *	Webエントリ用のカレンダーを表示する。
 *	@param	targetMonthList		対象月リスト
 */
function putWebEntryCalendar( targetMonthList ) {
	document.write( getWebEntryCalendarWord( targetMonthList ) ) ;
}
function getWebEntryCalendarWord( targetMonthList ) {
	return( getPRCCalendarHtml( targetMonthList, DEF_CALDENR_TYPE_ENTRY ) ) ;
}

/**
 *	カレンダー表示データを取得する。
 *	@param	targetMonthList	対象月リスト
 *			type			カレンダー表示タイプ。
 *				DEF_CALDENR_TYPE_SCHEDULE	通常スケジュール。
 *				DEF_CALDENR_TYPE_ENTRY		エントリ用。
 */
function getPRCCalendarHtml( targetMonthList, type ) {
	var		msg = "" ;
	var		year, month ;

	msg += "<table class='training-schedule' cellspacing='0' cellpadding='0' border='0'><tr>" ;
	for( ii=0; ii<targetMonthList.length; ii++ ) {
		msg += "<td>" + getUnitCalendarHtml( targetMonthList[ii], type ) + "</td>" ;
	}
	msg += "</tr></table>" ;

	return( msg ) ;
}




/**
 *	対象月カレンダー表示データを取得する（日中時間）。
 *	@param	targetMonth	対象月
 *			typeShow	表示タイプ
 *			validStart	有効期間：先頭
 *			validyEnd	有効期間：後端
 */
function getUnitCalendarHtml( targetMonth, typeShow, validyStart, validyEnd ) {
	var		year, month ;
	var		starDate, endDate ;
	var		cal ;

	tmp = new Date( getDateInfoStr(targetMonth) ) ;
	month = tmp.getMonth()+1 ;
	year = tmp.getFullYear() ;

	cal = new ExtCalendar( year, month ) ;
	cal.setTitle( sprintf( "%4d年%d月", year, month ) ) ;
	cal.setDayLabelJpn() ;
	cal.fShowPrice = FALSE ;

	if( typeof(validyStart)!="undefined" && typeof(validyEnd) ) {
		/*	有効期間指示がある場合は有効期間を設定	*/
		cal.setValidyTerm( validyStart, validyEnd ) ;
	}


	/*	日中時間フラグ	*/
	if( (typeShow&DEF_SHOW_TYPE_DAYTIME )!=0 ) {
		cal.fDaytime = TRUE ;
	}

	/*	夜間時間フラグ	*/
	if( (typeShow&DEF_SHOW_TYPE_NIGHTTIME )!=0 ) {
		cal.fNighttime = TRUE ;
	}

	/*	料金コードフラグ	*/
	if( (typeShow&DEF_SHOW_TYPE_PRICE )!=0 ) {
		cal.fShowPrice = TRUE ;
	}

	if( (typeShow&DEF_SHOW_TYPE_ENTRY )!=0 ) {
		/*	Webエントリ用チェックボックス追加	*/
		cal.setEntryInfoFlag() ;
		cal.fDaytime = TRUE ;
		cal.fNighttime = TRUE ;
	}


	return( cal.getCalendarHtml() ) ;
}


/*
 *	Webエントリ用情報フラグをセットする。
 */
ExtCalendar.prototype.setEntryInfoFlag = function  () {
	this.fEntryInfo = TRUE ;
}


/*
 *	Webエントリ用情報フラグをリセットする。
 */
ExtCalendar.prototype.resetEntryInfoFlag = function  () {
	this.fEntryInfo = FALSE ;
}


/*
 *	カレンダの各日の表示内容を取得する。
 *
 *	@param	date	日。
 */
ExtCalendar.prototype.getShowUnitValue = function ( date ) {

	/*
	 *	このインスタンスは月オブジェクトを表す。
	 *	よって、年(this.year)および月(this.month)は参照可能。
	 *	一方、日付は呼び出し側から渡される。
	 */

	var		msg = "" ;
	var		schedule ;
	var		fTimeup ;
	var		code ;
	var		priceData ;
	var		fEntry = ( typeof(this.fEntryInfo)=="undefined" ) ? FALSE : this.fEntryInfo ;


	if( this.isShowUnitValue(date) ) {
		schedule = getInstTrSchedule() ;

		/*	該当月の日付がある欄	*/
		msg += "<table class='content' cellspacing='0' cellpadding='0' border='0'>" ;
		msg += sprintf( "<tr><td class='date'>%d</td></tr>", date ) ;

		targetDate = sprintf( "%4d/%02d/%02d", this.year, this.month, date ) ;

		if( this.isValidyDate(date) && schedule.isUnitInstance(targetDate) ) {

			/*	２段目：トレーニング日情報				*/
			code = schedule.getTrainingCode(targetDate) ;
			fTimeup = schedule.isTimeUp( targetDate ) ;

			if( fEntry ) {
				/*	Webエントリ用トレーニング日情報取得	*/
				msg += "<tr><td>" ;
				msg += this.getShowUnitValueForEntry( code, fTimeup, date ) ;
				msg += "</td></tr>" ;
			}
			else {
				if( this.fShowPrice ) {
					/*	料金情報	*/
					msg += "<tr><td>" ;
					if( schedule.fee[getDateInfoStr(targetDate)]==DEF_PRICE_TYPE_A ) {
						msg += "<img src='./images/calendar/price_A_16x11.gif' alt='Ａ料金' />" ;
					}
					else if( schedule.fee[getDateInfoStr(targetDate)]==DEF_PRICE_TYPE_B ) {
						msg += "<img src='./images/calendar/price_B_16x11.gif' alt='Ｂ料金' />" ;
					}
					else if( schedule.fee[getDateInfoStr(targetDate)]==DEF_PRICE_TYPE_C ) {
						msg += "<img src='./images/calendar/price_C_16x11.gif' alt='Ｃ料金' />" ;
					}
					else {
					}
					msg += "</td></tr>" ;
				}

				/*	通常カレンダー用トレーニング日情報取得	*/
				msg += "<tr><td>" ;
				msg += this.getShowUnitValueForGeneral( code, fTimeup ) ;
				msg += "</td></tr>" ;
			}
		}
		else {
			/*	イベントのない日は空白のまま	*/
		}

		msg += "</table>" ;
	}
	else {
		/*	該当月の日付がない欄	*/

		/*	１段目：空白	*/
		msg = "&nbsp;" ;
	}



	return( msg ) ;
}


/*
 *	通常カレンダー用トレーニング日情報を取得する。
 *
 *	@param	code	トレーニングコード。
 *					DEF_TR_KIND_FREE		フリー滑走
 *					DEF_TR_KIND_SL			SL
 *					DEF_TR_KIND_GS			GS
 *					DEF_TR_KIND_SHORT_POLE	short pole
 *					DEF_TR_KIND_BUMP		コブ
 *					DEF_TR_KIND_NIGHT_FREE	ナイター：フリー
 *					DEF_TR_KIND_NIGHT_SL	ナイター：SL
 *					DEF_TR_KIND_NIGHT_GS	ナイター：GS
 *
 *			fTimeup	会期経過フラグ。
 *					TRUE の場合、本日（サーバローカルタイム）が期日を経過している（過去の情報）。
 *					FALSE の場合、まだ期日を経過していない（未来の情報）。
 */
ExtCalendar.prototype.getShowUnitValueForGeneral = function ( code, fTimeup ) {
	var		msg="" ;
	var		tdClassTimeup = "timeup" ;


	function getShowUnitHtml( flag, imgEnable, imgDisable, altMsg ) {
		var		msg = "" ;
		msg += sprintf( "<div><img src='./images/calendar/%s' alt='%s' /></div>", (flag==TRUE)?imgEnable:imgDisable, altMsg ) ;
		return( msg ) ;
	}

	if( this.fDaytime ) {
		/*	free	*/
		if( (code & DEF_TR_KIND_FREE) != 0 ) {
			msg += getShowUnitHtml( fTimeup, "disable_free_16x16.gif", "enable_free_16x16.gif", "フリー" ) ;
		}

		/*	GS	*/
		if( (code & DEF_TR_KIND_GS) != 0 ) {
			msg += getShowUnitHtml( fTimeup, "disable_gs_16x16.gif", "enable_gs_16x16.gif", "GS" ) ;
		}

		/*	SL	*/
		if( (code & DEF_TR_KIND_SL) != 0 ) {
			msg += getShowUnitHtml( fTimeup, "disable_sl_16x16.gif", "enable_sl_16x16.gif", "SL" ) ;
		}
	}

	if( this.fNighttime ) {
		/*	nighter	*/
		if( (code & DEF_TR_KIND_NIGHT) != 0 ) {
			msg += getShowUnitHtml( fTimeup, "disable_night_16x16.gif", "enable_night_16x16.gif", "ナイター" ) ;
		}
	}

	if( this.fDaytime ) {
		/*	bump	*/
		if( (code & DEF_TR_KIND_BUMP) != 0 ) {
			msg += getShowUnitHtml( fTimeup, "disable_bumps_16x16.gif", "enable_bumps_16x16.gif", "コブ" ) ;
		}
	}

	return( msg ) ;
}


/*
 *	Webエントリ用トレーニング日情報を取得する。
 *
 *	@param	code	トレーニングコード。
 *					DEF_TR_KIND_FREE		フリー滑走
 *					DEF_TR_KIND_SL			SL
 *					DEF_TR_KIND_GS			GS
 *					DEF_TR_KIND_BUMP		コブ
 *					DEF_TR_KIND_NIGHT_FREE	ナイター：フリー
 *					DEF_TR_KIND_NIGHT_SL	ナイター：SL
 *					DEF_TR_KIND_NIGHT_GS	ナイター：GS
 *
 *			fTimeup	会期経過フラグ。
 *					TRUE の場合、本日（サーバローカルタイム）が期日を経過している（過去の情報）。
 *					FALSE の場合、まだ期日を経過していない（未来の情報）。
 *
 *			date	情報を取得する日付（１～３１）。
 */
ExtCalendar.prototype.getShowUnitValueForEntry = function ( code, fTimeup, date ) {
	var		html="" ;

	function getShowUnitHtml( parent, flag, imgEnable, imgDisable, label, altMsg ) {
		var		msg = "" ;
		var		img ;
		var		txtDate ;
		var		txtChkBox ;

		if( flag!=TRUE ) {
			msg += "<tr><td>" ;
			msg += sprintf( "<input type='checkbox' name='%04d/%02d/%02d' value='%04d/%02d/%02d_%s' />", parent.year, parent.month, date, parent.year, parent.month, date , altMsg ) ;
			msg += sprintf( "<img src='../images/calendar/%s' alt='%s' />", imgEnable, altMsg ) ;
			msg += "</td></tr>" ;
		}
		else {
			msg += "<tr><td>" ;
			msg += sprintf( "<img src='../images/calendar/%s' alt='%s' />", imgDisable, altMsg ) ;
			msg += "</td></tr>" ;
		}

		return( msg ) ;
	}


	html += "<table class='content-entry' cellspacing='0' cellpadding='0' border='0'>" ;

	/*	free	*/
	if( (code & DEF_TR_KIND_FREE) != 0 ) {
		html += getShowUnitHtml( this, fTimeup, "enable_free_16x16.gif", "disable_free_16x16.gif", "Free", "フリー" ) ;
	}

	/*	GS	*/
	if( (code & DEF_TR_KIND_GS) != 0 ) {
		html += getShowUnitHtml( this, fTimeup, "enable_gs_16x16.gif", "disable_gs_16x16.gif", "GS", "GS" ) ;
	}

	/*	SL	*/
	if( (code & DEF_TR_KIND_SL) != 0 ) {
		html += getShowUnitHtml( this, fTimeup, "enable_sl_16x16.gif", "disable_sl_16x16.gif", "SL", "SL" ) ;
	}

	/*	nighter	*/
	if( (code & DEF_TR_KIND_NIGHT) != 0 ) {
		html += getShowUnitHtml( this, fTimeup, "enable_night_16x16.gif", "disable_night_16x16.gif", "ナ", "ナイター" ) ;
	}

	/*	bump	*/
	if( (code & DEF_TR_KIND_BUMP) != 0 ) {
		html += getShowUnitHtml( this, fTimeup, "enable_bumps_16x16.gif", "disable_bumps_16x16.gif", "コ", "コブ" ) ;
	}

	html += "</table>" ;

	return( html ) ;
}




/*
 *	カレンダーの凡例を表示する。
 *
 *	@param	fPrice	料金表示フラグ。
 *					TRUE		料金表示あり	
 *					FALSE		料金表示なし	
 */
var	DEF_CALENDAR_NOTE_TYPE_1_LINE	= 1 << 0 ;	/*	横１行	*/
var	DEF_CALENDAR_NOTE_TYPE_2_LINES	= 1 << 1 ;	/*	横２行	*/
var	DEF_CALENDAR_NOTE_TYPE_1_ROW	= 1 << 2 ;	/*	縦１列	*/
var	DEF_CALENDAR_NOTE_TYPE_2_ROWS	= 1 << 3 ;	/*	縦２列	*/

function TrCalendarNotes() {
	this.relative	= DEF_RELATIVE_DIR_ROOT ;		/*	相対ディレクトリ階層	*/
	this.fPrice		= FALSE ;						/*	料金表示フラグ	*/
	this.type		= DEF_CALENDAR_NOTE_TYPE_1_LINE;	/*		*/

	this.table = new Array(
		"GS;GS;enable_gs_24x24.gif",
		"SL;SL;enable_sl_24x24.gif",
		"フリー;free;enable_free_24x24.gif",
		"ナイター;night;enable_night_24x24.gif",
		"コブ;bumps;enable_bumps_24x24.gif"
	) ;

	this.tablePrice = new Array(
		"Ａ料金;price_A_24x14.gif",
		"Ｂ料金;price_B_24x14.gif",
		"Ｃ料金;price_C_24x14.gif"
	) ;
}


/*
 *	相対ディレクトリ階層を設定する。
 *
 *	@param	relative	相対ディレクトリ階層。
 */
TrCalendarNotes.prototype.setRelative = function ( relative ) {
	if( typeof(relative) == "undefined" ) {
		relative = DEF_RELATIVE_DIR_ROOT ;
	}
	this.relative = relative ;
}


/*
 *	料金表示を設定する。
 */
TrCalendarNotes.prototype.setPriceTableFlag = function () {
	this.fPrice = TRUE ;
}


/*
 *	凡例表示形式を設定する。
 *
 *	@param	type	凡例表示形式。
 */
TrCalendarNotes.prototype.setType = function ( type ) {
	if( typeof(type) == "undefined" ) {
		type = DEF_CALENDAR_NOTE_TYPE_1_LINE ;
	}
	this.type = type ;
}


/*
 *	凡例を表示する。
 */
TrCalendarNotes.prototype.put = function () {
	document.write( this.getCalendarNotesHtml() ) ;
}
TrCalendarNotes.prototype.getCalendarNotesHtml = function () {
	var		html="" ;
	var		path="" ;
	var		tmp="" ;
	var		title, label, image ;

	path = getRelaticeDirInfo(this.relative) ;

	tmp = "" ;
	for( ii=0; ii<this.table.length; ii++ ) {
		data = this.table[ii].split( ";" ) ;
		title = data[0] ;
		label = data[1] ;
		image = data[2] ;

		switch( this.type ) {
		case DEF_CALENDAR_NOTE_TYPE_1_LINE:		/*	横１行	*/
			tmp += sprintf( "<td><img src='%simages/calendar/%s' alt='%s' />%s</td>", path, image, title, title ) ;
			break ;

		case DEF_CALENDAR_NOTE_TYPE_1_ROW:		/*	縦１列	*/
		default:
			tmp += sprintf( "<div><img src='%simages/calendar/%s' alt='%s' />%s</div>", path, image, title, title ) ;
			break ;
		}
	}

	html += "<div class='calendar-notes-frame'>" ;
	html += "<table class='calendar-notes' cellspacing='0' cellpadding='0' border='0'>" ;
	html += "<caption>凡例</caption>" ;

	switch( this.type ) {
	case DEF_CALENDAR_NOTE_TYPE_1_LINE:		/*	横１行	*/
		html += "<tr>" ;
		html += tmp ;
		html += "</tr>" ;
		break ;

	case DEF_CALENDAR_NOTE_TYPE_1_ROW:		/*	縦１列	*/
	default:
		html += "<tr><td style='padding-left:10px;'>" ;
		html += tmp ;
		html += "</td></tr>" ;
		break ;
	}

	html += "</table>" ;

	if( this.fPrice ) {
		html += this.getPriceCodeTableHtml() ;
	}

	html += "</div>" ;

	return( html ) ;
}

/*
 *	【凡例表示】
 *	料金表表示用HTMLを取得する。
 */
TrCalendarNotes.prototype.getPriceCodeTableHtml = function () {
	var		html="" ;
	var		path="" ;
	var		tmp="" ;
	var		title, label, image ;

	path = getRelaticeDirInfo(this.relative) ;

	tmp = "" ;
	for( ii=0; ii<this.tablePrice.length; ii++ ) {
		data = this.tablePrice[ii].split( ";" ) ;
		title = data[0] ;
		image = data[1] ;

		switch( this.type ) {
		case DEF_CALENDAR_NOTE_TYPE_1_LINE:		/*	横１行	*/
			tmp += sprintf( "<td><img src='%simages/calendar/%s' alt='%s' />%s</td>", path, image, title, title ) ;
			break ;

		case DEF_CALENDAR_NOTE_TYPE_1_ROW:		/*	縦１列	*/
		default:
			tmp += sprintf( "<div><img src='%simages/calendar/%s' alt='%s' />%s</div>", path, image, title, title ) ;
			break ;

		}
	}


	html += "<table class='calendar-notes' cellspacing='0' cellpadding='0' border='0'>" ;

	switch( this.type ) {
	case DEF_CALENDAR_NOTE_TYPE_1_LINE:		/*	横１行	*/
		html += "<tr>" ;
		html += tmp ;
		html += "</tr>" ;
		break ;

	case DEF_CALENDAR_NOTE_TYPE_1_ROW:		/*	縦１列	*/
	default:
		html += "<tr><td>" ;
		html += tmp ;
		html += "</td>" ;
		html += "</tr>" ;
		break ;
	}

	html += "</table>" ;

	return( html ) ;
}











/*-------------------------------------------------------------------------------------------------
 *
 *			以下、ＴＲ実施計画
 *
 *-------------------------------------------------------------------------------------------------*/



/*
 *	シーズンイン　ＴＲ実施計画
 *
 *	 １列目：日付
 *	 ２列目：種目(8bit)
 *			1-------	フリー滑走			
 *			-1------	SL					
 *			--1-----	GS					
 *			---1----	short pole			
 *			----1---	コブ				
 *			-----1--	ナイター：フリー	
 *			------1-	ナイター：SL		
 *			-------1	ナイター：GS		
 *
 *	 ３列目：料金コード文字列
 */


infoTrSchedule = new PrcTrainingInfo( unitTrSchedule ) ;

/*
 *	トレーニング日情報インスタンスを取得する。
 */
function getInstTrSchedule() {
	return( infoTrSchedule ) ;
}


