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


/*
 *		カレンダー表示対象定義
 *		呼び出し元で以下の定義を設定する。
 *
 *		setSpecifiedProgramCalendarType( DEF_CAL_TYPE_SP_COURSE ) ;	←特別講座のカレンダー表示
 *
 */
var	DEF_CAL_TYPE_UNDEFINDE			= 0 ;
var	DEF_CAL_TYPE_SP_COURSE			= 1 ;	/*	No.1～4		特別講座						*/
var	DEF_CAL_TYPE_ISHII_WEEKDAY_SP	= 2 ;	/*	No.14～15	石井俊一　平日特別講座			*/
var	DEF_CAL_TYPE_JR_TEAM			= 3 ;	/*	No.54	ＰＳＡ．ジュニアスキーチーム	*/




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


var	CAL_TYPE = DEF_CAL_TYPE_UNDEFINDE ;	/*	カレンダー表示対象	*/

/*
 *		カレンダー表示対象を設定する。
 */
function setSpecifiedProgramCalendarType( type ) {
	switch( type ) {
	case DEF_CAL_TYPE_SP_COURSE:		/*	特別講座	No.1～4		*/
	case DEF_CAL_TYPE_ISHII_WEEKDAY_SP:	/*	石井俊一　平日特別講座	No.14～15		*/
	case DEF_CAL_TYPE_JR_TEAM:			/*	ＰＳＡ．ジュニアスキーチーム	No.54		*/
		CAL_TYPE = type ;
		break ;

	default:
		alert( "undefined calendar type!!\n[" + type + "]" ) ;
		CAL_TYPE = DEF_CAL_TYPE_UNDEFINDE ;
		break ;
	}
}


/*
 *		カレンダーを表示するプログラムインスタンスを取得する。
 */
var	DEF_KIND_SP_COURSE_COACH		= 1;	/*	特別講座　指導員／準指合格コース	*/
var	DEF_KIND_SP_COURSE_1ST_CLASS	= 2;	/*	特別講座　１級合格コース		*/
var	DEF_KIND_SP_COURSE_PRIZE		= 3;	/*	特別講座　テク／クラ合格コース	*/
var	DEF_KIND_SP_COURSE_BUMPS		= 4;	/*	特別講座　コブ攻略コース	*/
var	DEF_KIND_ISHII_WEEKDAY_A		= 14;	/*	石井俊一　平日特別講座　Ａ日程コース	*/
var	DEF_KIND_ISHII_WEEKDAY_B		= 15;	/*	石井俊一　平日特別講座　Ｂ日程コース	*/
var	DEF_KIND_JR_TEAM				= 48;	/*	ＰＳＡ．ジュニアスキーチーム	*/

var	instSpCourseCoach		= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_COACH ) ;
var	instSpCourse1stClass	= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_1ST_CLASS ) ;
var	instSpCoursePrize		= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_PRIZE ) ;
var	instSpCourseBumps		= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_BUMPS ) ;
var	instSpCourseOther		= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_PRIZE, DEF_KIND_SP_COURSE_BUMPS ) ;
var	instIshiiWeekdaySpA		= new ProgramInfo( camp_data, DEF_KIND_ISHII_WEEKDAY_A ) ;
var	instIshiiWeekdaySpB		= new ProgramInfo( camp_data, DEF_KIND_ISHII_WEEKDAY_B ) ;
var	instJrTeam				= new ProgramInfo( camp_data, DEF_KIND_JR_TEAM ) ;


function getTargetIns(kind) {
	switch( kind ) {
	case DEF_KIND_SP_COURSE_COACH:		/*	特別講座　指導員／準指合格コース	*/
		return( instSpCourseCoach ) ;
		break ;

	case DEF_KIND_SP_COURSE_1ST_CLASS:	/*	特別講座　１級合格コース		*/
		return( instSpCourse1stClass ) ;
		break ;

	case DEF_KIND_SP_COURSE_PRIZE:		/*	特別講座　テク／クラ合格コース	*/
		return( instSpCoursePrize ) ;
		break ;

	case DEF_KIND_SP_COURSE_BUMPS:		/*	特別講座　コブ攻略コース	*/
		return( instSpCourseBumps ) ;
		break ;

	case DEF_KIND_ISHII_WEEKDAY_A:		/*	石井俊一　平日特別講座　Ａ日程コース（上級者向け）	*/
		return( instIshiiWeekdaySpA ) ;
		break ;

	case DEF_KIND_ISHII_WEEKDAY_B:		/*	石井俊一　平日特別講座　Ｂ日程コース（中級者向け）	*/
		return( instIshiiWeekdaySpB ) ;
		break ;

	case DEF_KIND_JR_TEAM:				/*	ＰＳＡ．ジュニアスキーチーム	*/
		return( instJrTeam ) ;
		break ;

	default:
		return( instSpCourseOther ) ;
		break ;
	}
}


/*
 *	カレンダーを表示する。
 *	@param	targetMonthList		対象月リスト
 */
function putSpecifiedProgramCalendar( targetMonthList ) {
	document.write( getSpecifiedProgramCalendarHtml( targetMonthList ) ) ;
}
function getSpecifiedProgramCalendarHtml( targetMonthList ) {
	var		msg = "" ;
	var		year, month ;
	var		cal ;
	var		tmp ;

	msg += "<table class='calendar_frame' cellspacing='0' cellpadding='0' border='0'><tr>" ;
	for( ii=0; ii<targetMonthList.length; ii++ ) {
		tmp = new Date( getDateInfoStr(targetMonthList[ii]) ) ;
		month = tmp.getMonth()+1 ;
		year = tmp.getFullYear() ;

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

		msg += "<td>" + cal.getCalendarHtml() + "</td>" ;
	}
	msg += "</tr></table>" ;

	return( msg ) ;
}


/*
 *	カレンダの各日の表示内容を取得する。
 *
 *	@param		date	日。
 */

ExtCalendar.prototype.getShowUnitValue = function  ( date ) {

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

	function isFinished( year, month, date ) {
		var		tmp = ( new Date( sprintf("%4d/%02d/%02d",year,month,date) ) ).getTime() ;
		return( ( ( ( tmp - ( getTodayInst() ).getTime() )/DEF_COEF_UTC_DAY )<-1 ) ? TRUE : FALSE ) ;	/*	-1：当日ギリギリお申し込み対応	*/
	}

	function getShowUnitHtml( index, year, month, date, labelEnable, styleEnable, labelDisable, styleDisable ) {
		var		msg = "" ;
		if( (getTargetIns(index)).isApplyDate(year,month,date)==true ) {
			msg += "<tr>" ;
	
			if( isFinished( year, month, date ) == true ) {
				msg += sprintf( "<td class='%s'>%s", styleDisable, labelDisable ) ;
			}
			else {
				msg += sprintf( "<td class='%s'>%s", styleEnable, labelEnable ) ;
			}
		/*	msg += "<br />" + sprintf("%04d/%02d/%02d",year,month,date) ;	*/	/*	for debug	*/
			msg += "</td></tr>" ;
		}
		return( msg ) ;
	}

	function getShowUnitHtml2( index, year, month, date, imgEnable, imgDisable, altMsg ) {
		var		msg = "" ;
		var		img = "" ;
		if( (getTargetIns(index)).isApplyDate(year,month,date)==true ) {
			if( isFinished( year, month, date ) == true ) {
				img = imgDisable ;
			}
			else {
				img = imgEnable ;
			}
			msg += sprintf( "<img src='./images/calendar/%s' width='16' height='16' alt='%s' />", img, altMsg ) ;
			msg += "<br />" ;
		}
		else {
			msg = "" ;
		}
		return( msg ) ;
	}


	if( date<=0 || date>this.lastDate ) {
		/*	日付が存在しない場合はそのままreturn	*/
		msg = "" ;
		return( msg ) ;
	}

	msg += "<table class='content' cellspacing='0' cellpadding='0' border='0'>" ;
	msg += "<tr><td>" ;


	/*	１段目：日付	*/
	msg += sprintf( "<div class='date'>%s</div>", date ) ;

	/*	２段目	*/
	switch( CAL_TYPE ) {
	case DEF_CAL_TYPE_ISHII_WEEKDAY_SP:	/*	石井俊一　平日特別講座	No.14～15	*/
		msg += getShowUnitHtml2( DEF_KIND_ISHII_WEEKDAY_A, this.year, this.month, date, "enable_heitoku_a_16x16.gif", "disable_heitoku_a_16x16.gif", "石井俊一　平日特別講座　Ａ日程コース（上級者向け）" ) ;
		msg += getShowUnitHtml2( DEF_KIND_ISHII_WEEKDAY_B, this.year, this.month, date, "enable_heitoku_b_16x16.gif", "disable_heitoku_b_16x16.gif", "石井俊一　平日特別講座　Ｂ日程コース（中級者向け）" ) ;
		break ;

	case DEF_CAL_TYPE_JR_TEAM:	/*	ＰＳＡ．ジュニアスキーチーム	No.54	*/
		msg += getShowUnitHtml2( DEF_KIND_JR_TEAM, this.year, this.month, date, "enable_jr_team_16x16.gif", "disable_jr_team_16x16.gif", "ＰＳＡ．ジュニアスキーチーム" ) ;
		break ;

	case DEF_CAL_TYPE_SP_COURSE:	/*	特別講座	No.1～3	*/
		/*	指導員／準指合格コース	*/
		msg += getShowUnitHtml2( DEF_KIND_SP_COURSE_COACH, this.year, this.month, date, "enable_coach_16x16.gif", "disable_coach_16x16.gif", "指導員／準指合格コース" ) ;

		/*	１級合格コース	*/
		msg += getShowUnitHtml2( DEF_KIND_SP_COURSE_1ST_CLASS, this.year, this.month, date, "enable_1st_16x16.gif", "disable_1st_16x16.gif", "１級合格コース" ) ;

		/*	テク／クラ合格コース	*/
		msg += getShowUnitHtml2( DEF_KIND_SP_COURSE_PRIZE, this.year, this.month, date, "enable_prize_16x16.gif", "disable_prize_16x16.gif", "テク／クラ合格コース" ) ;

		/*	特別講座　コブ攻略コース	*/
		msg += getShowUnitHtml2( DEF_KIND_SP_COURSE_BUMPS, this.year, this.month, date, "enable_bumps_16x16.gif", "disable_bumps_16x16.gif", "コブ攻略コース" ) ;
		break ;

	default:
		/*	定義が該当しない場合は日付データのみ	*/
		break ;
	}

	msg += "</td></tr>" ;
	msg += "</table>" ;


	return( msg ) ;
}




/*-------------------------------------------------------------------------------------------------
 *
 *		実行速度に関する実験結果
 *
 *-------------------------------------------------------------------------------------------------

【方法】
	以下のスクリプトを実行して、実行前後の時間差を計測する。

	start = (new Date()).getTime() ;

	mon = new Array(
		 "2009/12"
		,"2010/01"
		,"2010/02"
	) ;
	putSpecifiedProgramCalendar( mon ) ;

	end = (new Date()).getTime() ;
	alert( end-start ) ;


【結果】

	インスタンスをあらかじめ生成

		var	instSpCourseCoach		= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_COACH ) ;
		var	instSpCourse1stClass	= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_1ST_CLASS ) ;
		var	instSpCoursePrize		= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_PRIZE ) ;
		var	instSpCourseOther		= new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_PRIZE, DEF_KIND_SP_COURSE_PRIZE ) ;

		function getTargetIns(kind) {
			switch( kind ) {
			case DEF_KIND_SP_COURSE_COACH:			return( instSpCourseCoach ) ;	break ;
			case DEF_KIND_SP_COURSE_1ST_CLASS:		return( instSpCourse1stClass ) ;	break ;
			case DEF_KIND_SP_COURSE_PRIZE:			return( instSpCoursePrize ) ;	break ;
			default:								return( instSpCourseOther ) ;	break ;
			}
		}


	Intel(R) Pentium(R) 4 CPU 3.00GHz / 2.00GB RAM	+ Windows XP Professional SP3
	result1 = new Array(
		  "opera 9.64;63;62;62;62;63;63;62"
		, "firefox 3.5.1;321;315;318;329;367;323;377"
		, "safari 4.0;30;32;30;31;32;30;32"
		, "IE6;187;187;203;188;203;187;203"
	) ;

	インスタンスをその都度生成	*


		function getTargetIns(kind) {
			case DEF_KIND_SP_COURSE_COACH:		return( new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_COACH ) ) ;	break ;
			case DEF_KIND_SP_COURSE_1ST_CLASS:	return( new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_1ST_CLASS ) ) ;	break ;
			case DEF_KIND_SP_COURSE_PRIZE:		return( new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_PRIZE ) ) ;	break ;
			default:							return( new ProgramInfo( camp_data, DEF_KIND_SP_COURSE_PRIZE, DEF_KIND_SP_COURSE_PRIZE ) ) ;	break ;
			}
		}


	Intel(R) Pentium(R) 4 CPU 3.00GHz / 2.00GB RAM	+ Windows XP Professional SP3
	result2 = new Array(
		  "opera 9.64;1172;1219;1140;1204;109;1109;1188"
		, "firefox 3.5.1;1642;1511;1462;1453;1424;1329;1472"
		, "safari 4.0;434;440;449;450;447;439;452"
		, "IE6;2203;2188;2235;2203;2219;2235;2203"
	) ;

*/
