/**
 * showDeliveryCalendar お届け日カレンダー表示
 * @return
 */
function showDeliveryCalendar(fid, startCount, rangeCount) {

	var start = 0;
	if (startCount != null && startCount > 0) {
		start = startCount;
	}
	var range = 0;
	if (rangeCount != null && rangeCount > 0) {
		range = start + rangeCount - 1;
		if (range < 0) {
			range = 0;
		}
	}

	var htmlStr = "";
	htmlStr += "<input type=\"hidden\" class=\"numeric\" name=\"year\" id=\"" + fid + ":year\" size=\"4\" value=\"\" />";
	htmlStr += "<input type=\"hidden\" class=\"numeric\" name=\"month\" id=\"" + fid + ":month\" size=\"2\" value=\"\" />";
	htmlStr += "<input type=\"hidden\" class=\"numeric\" name=\"start\" id=\"" + fid + ":start\" value=\"" + start + "\" />";
	htmlStr += "<input type=\"hidden\" class=\"numeric\" name=\"range\" id=\"" + fid + ":range\" value=\"" + range + "\" />";
	htmlStr += "<div class=\"deliveryCalendar\" id=\"" + fid + ":calendar\">";
	htmlStr += "</div>";
	document.getElementById(fid + ":deliveryCalendar").style.visibility = "visible";
	document.getElementById(fid + ":deliveryCalendar").innerHTML = htmlStr;
	Initialize_Deli(fid);

}

/**
 * setSelectedDate お届け日をセットする
 * @return
 */
function setSelectedDate(fid, date) {
	for (var i = 0; i < document.getElementById(fid + ":deliveryDateList").options.length; i++) {
		if (document.getElementById(fid + ":deliveryDateList").options[i].value == date) {
			document.getElementById(fid + ":deliveryDateList").options[i].selected = true;
			break;
		}
	}
}

/**
 * closeDeliveryCalendar お届け日カレンダー非表示
 * @return
 */
function closeDeliveryCalendar(fid) {
	document.getElementById(fid + ":deliveryCalendar").style.visibility = "hidden";
}

/**
 * computeDate n日後の日付を求める
 * @return n日後の日付
 */
function computeDate(addDays) {

	var dt = new Date();
	if (addDays == null || addDays == 0) {
		return dt;
	}
	var baseSec = dt.getTime();
	var addSec = addDays * 86400000;//日数 * 1日のミリ秒数
	var targetSec = baseSec + addSec;
	dt.setTime(targetSec);
	return dt;

}

/**
 * getMaxDate 最大日付を取得する
 * @return 最大日付
 */
function getMaxDate(fid) {
	var range = document.getElementById( fid + ":range" ).value;
	return computeDate(range);
}

/**
 * getMinDate 最小日付を取得する
 * @return 最小日付
 */
function getMinDate(fid) {
	var start = document.getElementById( fid + ":start" ).value;
	return computeDate(start);
}

/**
 * compareDate 日付の比較を行う
 * @return -1:比較対象日付の方が未来、0:同じ、1:比較対象日付の方が過去
 */
function compareDate(date , compDate) {

	var date1 = new Date(AdjustedYear(date), date.getMonth(), 
			date.getDate(), 0, 0, 0, 0);

	var date2 = new Date(AdjustedYear(compDate), compDate.getMonth(), 
			compDate.getDate(), 0, 0, 0, 0);

	if (date1.getTime() < date2.getTime()){
		return -1;
	} else if (date1.getTime() > date2.getTime()) {
		return 1;
	} else {
		return 0;
	}

}


/// 曜日表示文字列
var weekCaption = [ "日","月","火","水","木","金","土" ];

///
/// 引数dで渡された年月のカレンダー表示用のHTML文字列を生成
///
function CreateCalendarHtml_Deli( fid, d )
{
	var result = "";
	
	if ( d == null )
	{
		d = new Date;
	}
	var year = AdjustedYear( d );
	var month = d.getMonth();
	var monthView = month + 1;

	var today = new Date( year, d.getMonth(), 1 );
	var week = today.getDay();
	
	result += "<table class=\"dcalendar\" cellspacing=\"0\" >";

	// Header
	result += "<tr>";
	result += "<th colspan=\"7\">";
	result += "<a href=\"javascript:;\" onClick=\"ShowPrevious_Deli('" + fid + "')\">＜</a>";
	result += FormatDateTime(  "yyyy年M月", d );
	result += "<a href=\"javascript:;\" onClick=\"ShowNext_Deli('" + fid + "')\">＞</a>";
	result += "</th>";
	result += "</tr>";

	// 曜日
	result += "<tr>";
	result += "<th class=\"holyday\">"  + weekCaption[0] + "</th>";
	result += "<th class=\"weekday\">"  + weekCaption[1] + "</th>";
	result += "<th class=\"weekday\">"  + weekCaption[2] + "</th>";
	result += "<th class=\"weekday\">"  + weekCaption[3] + "</th>";
	result += "<th class=\"weekday\">"  + weekCaption[4] + "</th>";
	result += "<th class=\"weekday\">"  + weekCaption[5] + "</th>";
	result += "<th class=\"saturday\">" + weekCaption[6] + "</th>";
	result += "</tr>";

	// カレンダー本体
	result += "<tr>";
	
	for ( var i = 0; i < today.getDay(); i++ )	// 先月
	{	result += "<td class=\"lastMonth\">&nbsp;</td>";
	}

	var maxDate = getMaxDate(fid);
	var minDate = getMinDate(fid);
	while( ( today.getDate() == 1 ) || ( today.getDay() > 0 ) )
	{
		if (compareDate(today, minDate) >= 0 && compareDate(today, maxDate) <= 0) {
			result += CreateDateColumnHtml_Deli( fid, today );
		} else {
			result += "<td class=\"lastMonth\">&nbsp;</td>";
		}
		today.setDate( today.getDate() + 1 );
	}
	result += "</tr>";
		
	while( today.getMonth() == month )
	{
		result += "<tr>";
		for ( var i = 0; i < 7; i++ )
		{
			if ( today.getMonth() == month ) 
			{
				if (compareDate(today, minDate) >= 0 && compareDate(today, maxDate) <= 0) {
					result += CreateDateColumnHtml_Deli( fid, today );
				} else {
					result += "<td class=\"lastMonth\">&nbsp;</td>";
				}
			}
			else	// 翌月
			{	result += "<td class=\"nextMonth\">&nbsp;</td>";
			}
			today.setDate( today.getDate() + 1 );
		}
	}

	result +=  "</tr>";
	result +=  "<tr>";
	result += "<td colspan=\"7\"><a href=\"javascript:;\" onClick=\"closeDeliveryCalendar('" + fid + "')\">閉じる</a></td>";
	result +=  "</tr>";
	result +=  "</table>";
	
	return result;
}

///
/// 引数 d で渡された年月のカレンダー表示用の HTML 文字列を生成
///
function CreateDateColumnHtml_Deli( fid, d )
{
	var result = "";
	var today = new Date;
	
	if ( FormatDateTime( "yyyyMMdd", d ) == FormatDateTime( "yyyyMMdd", today ) )
	{	result += "<td class=\"today\">";
	}
	else if ( d.getDay() == 0 )
	{	result += "<td class=\"holyday\">";
	}
	else if ( d.getDay() == 6 )
	{	result += "<td class=\"saturday\">";
	}
	else
	{	result += "<td>";
	}
	result += "<a href=\"javascript:;\" onClick=\"setSelectedDate('" + fid + "','" + FormatDateTime( "yyyyMMdd", d ) + "'); closeDeliveryCalendar('" + fid + "'); return false;\">" + d.getDate() + "</a></td>";
	return result;
}

///
/// カレンダー表示用HTMLを document.writeする
///
//function WriteCalendar_Deli( d )
//{
//	document.write( CreateCalendarHtml_Deli( d ) );
//}

///////////////////////////////////////////////////////////////////////////////
// Common 関数群
///////////////////////////////////////////////////////////////////////////////

///
/// 日付型を書式指定文字列に変換
/// @ToDo 対応書式を増やすこと
///
/// 書式文字列
///		yyyy	- 年 西暦 4桁
///		yy		- 年 西暦 下2桁
///		MM		- 月 0詰め 2桁
///		M		- 月
///		dd		- 日 0詰め 2桁
///		d		- 日
function FormatDateTime( formatStr, date )
{
	var result = formatStr;
	var yyyy = AdjustedYear( date );
	var M = date.getMonth() + 1;
	var MM = Right( "0" + M, 2 );
	var d = date.getDate();
	var dd = Right( "0" + d, 2 );
	result = result.replace( "yyyy",	yyyy);
	result = result.replace( "yy",		Right( yyyy, 2 ) );
	result = result.replace( "MM",		MM	);
	result = result.replace( "M",		M	);
	result = result.replace( "dd",		dd	);
	result = result.replace( "d",		d	);
	return result;
}

//
// 引数 s で渡された文字列の 右側 len 文字分の部分文字列を取得して返す
// len が s の文字列長よりも大きい場合、s をそのまま返す
//
function Right( s, len )
{
	var result = "" + s;
	if ( len >= result.length )
	{	return result;
	}
	else
	{	return result.substr( result.length - len, result.length );
	}
}

//
// Date型から 年(西暦)部分を取得して返す
//
// Netscape仕様対応
//     Netscape では対象年が1900年以降の場合、1900年からの差分年数を返す
function AdjustedYear( d )
{
	var result = d.getYear();
	if ( result < 2000 )
	{
		result += 1900;
	}
	return result;
}



///////////////////////////////////////////////////////////////////////////////
// 描画系
///////////////////////////////////////////////////////////////////////////////

///
/// 入力済みの年月を基に該当月のカレンダーを表示
///
function ShowCalendar_Deli(fid)
{
	document.getElementById( fid + ":calendar" ).innerHTML = CreateCalendarHtml_Deli( fid, GetCurrentDate_Deli(fid) );
}

///
/// 翌月カレンダー表示(btnNext.onClick)
///
function ShowNext_Deli(fid)
{
	var d = GetCurrentDate_Deli(fid);
	d.setMonth( d.getMonth() + 1 );

	var maxDate = getMaxDate(fid);
	var checkDate = new Date(AdjustedYear(maxDate), maxDate.getMonth(), 1);
	if (compareDate(d, checkDate) > 0) {
		return;
	}

	document.getElementById( fid + ":year" ).value = AdjustedYear( d );
	document.getElementById( fid + ":month" ).value = d.getMonth() + 1;
	ShowCalendar_Deli(fid);
}

///
/// 先月カレンダー表示(btnPrevious.onClick)
///
function ShowPrevious_Deli(fid)
{
	var d = GetCurrentDate_Deli(fid);
	d.setMonth( d.getMonth() - 1 );

	var minDate = getMinDate(fid);
	var checkDate = new Date(AdjustedYear(minDate), minDate.getMonth(), 1);
	if (compareDate(d, checkDate) < 0) {
		return;
	}

	document.getElementById( fid + ":year" ).value = AdjustedYear( d );
	document.getElementById( fid + ":month" ).value = d.getMonth() + 1;
	ShowCalendar_Deli(fid);
}

///
/// 入力中の年、月を基に当月初日の日付を返す
///
function GetCurrentDate_Deli(fid)
{
	var result = new Date(document.getElementById( fid + ":year" ).value, 
			(document.getElementById( fid + ":month" ).value -1), 1);

	var maxDate = getMaxDate(fid);
	var minDate = getMinDate(fid);
	if (compareDate(result, maxDate) > 0) {
		result.setYear(AdjustedYear(maxDate));
		result.setMonth(maxDate.getMonth());
		document.getElementById( fid + ":year" ).value = AdjustedYear( result );
		document.getElementById( fid + ":month" ).value = result.getMonth() + 1;
	} else if (compareDate(result, minDate) < 0) {
		result.setYear(AdjustedYear(minDate));
		result.setMonth(minDate.getMonth());
		document.getElementById( fid + ":year" ).value = AdjustedYear( result );
		document.getElementById( fid + ":month" ).value = result.getMonth() + 1;
	}
	return result;
}

///
/// 初期化処理(body.onLoad)
///
function Initialize_Deli(fid)
{
	var d = new Date();
	var year = AdjustedYear( d );
	document.getElementById( fid + ":year" ).value = year;
	document.getElementById( fid + ":month" ).value = d.getMonth() +1;
	ShowCalendar_Deli(fid);
}



