var objCalSet = {
	"Calendar":'',
	"holiday":'http://www.freebellmoms.com/data/calendar/holiday.dat',
	"dayoff" :'http://www.freebellmoms.com/data/calendar/dayoff.dat'
};

var cellStyle = { /*---*/ };
var today     = { /*---*/ };
var lastDate  = { /*---*/ };

function getBrowserName() 
{
	var aName = navigator.appName.toUpperCase();
	if (aName.indexOf("NETSCAPE") >= 0) return "Netscape";
	if (aName.indexOf("MICROSOFT") >= 0) return "Explorer";
	return "";
}

function LoadDataObj (sURL) {
	var Query = sURL+'?r='+Math.random();
	var ObjLoadData;
	var tmpMonthly = [];
	var xmlHttp = getXmlHttpObject();
	/* xmlHttpで呼び出すオブジェクトを指定 */
	xmlHttp.open('GET', Query , false);
	/* コンテントタイプを指定*/
	xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=euc-jp;');
	var userInfoBrows = getBrowserName();
	if(userInfoBrows != 'Explorer')
	{
		xmlHttp.overrideMimeType("text/plain; charset=euc-jp");
	}
	xmlHttp.send('');

	if(xmlHttp.readyState == 4 && xmlHttp.status == 200)
	{
		if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
			var data = new String(xmlHttp.responseText);
			var tmpArgs = data.split("\n");
			for(var nCnt=0; nCnt<tmpArgs.length; nCnt++)
			{
				tmpArgs[nCnt] = new String(tmpArgs[nCnt]);
				tmpMonthly[nCnt] = tmpArgs[nCnt].split(',');
			}
		}
		return tmpMonthly;
	}
}

var objHoliday = LoadDataObj(objCalSet.holiday);
var objDayoff = LoadDataObj(objCalSet.dayoff);


// @ 1カラム単位のスタイルクラス設定
cellStyle.week = 'calendar_week'; // 曜日表示用
cellStyle.sun  = 'calendar_sunday'; // 日曜日スタイル
cellStyle.sut  = 'calendar_satday'; // 土曜日スタイル
cellStyle.def  = 'calendar_weekday'; // 平日スタイル
cellStyle.old  = ' calendar_old'; // 過ぎた日用
cellStyle.Holiday = 'calendar_sunday'; // 祝日
cellStyle.dayoff  = ' style2'; // 休業日

var weeks = {
	args:['sun','mon','tus','wed','thu','fri','sat'],
	styles:function (nWeeks) {
		switch(nWeeks) {
			case 0:
				dayClass = cellStyle.sun;
				break;
			case 6:
				dayClass = cellStyle.sut;
				break;
			default:
				dayClass = cellStyle.def;
				break;
		}
		return dayClass;
	}
};

var OperateDate = {
	Next:function (year,month){
		var nextYear,nextMonth;
		if(month == 12) {
			nextYear = year + 1;
			nextMonth = 1;
		} else {
			nextYear = year;
			nextMonth = month + 1;
		}
		return [nextYear,nextMonth];
	},
	Prev:function (year,month){
		var prevYear,prevMonth;
		if(month == 1) {
			prevYear = year - 1;
			prevMonth = 12;
		} else {
			prevYear = year;
			prevMonth = month - 1;
		}
		return [prevYear,prevMonth];
	}
};

var createPrev = function(year,month) {
	var tmpPrev = '<p><a href="JavaScript:void(0);" class="prev" onclick="JavaScript:CalCoreObj('+year+','+month+',1); addNewCalender();">前の月へ</a></p>';
	return tmpPrev;
};

var createNext = function(year,month) {
	var tmpNext = '<p><a href="JavaScript:void(0);" class="next" onclick="JavaScript:CalCoreObj('+year+','+month+',1); addNewCalender();">次の月へ</a></p>';
	return tmpNext;
};


// @ 今日の日付をセット
today.objDate = new Date();
today.year  = today.objDate.getFullYear();
today.month = today.objDate.getMonth() + 1;
today.day   = today.objDate.getDate();
today.objDate = '';


var CalCoreObj = function (year,month,day) {
	var Calendar;
	var tHead,tCalBody,PrevNavi,NextNavi;
	var prevD;
	var nextD;
	lastDate.Obj = new Date(year,month-1,1,0,0,0);
	lastDay = new Date(year,month,0,0,0,0);
	var MaxDay = lastDay.getDate();
	tmpCnt = 0;
/*********
 * カレンダーヘッダ部分の作成
 */
	prevD = OperateDate.Prev(year,month);
	nextD = OperateDate.Next(year,month);
	if((today.year < prevD[0]) || (today.year == prevD[0] && today.month <= prevD[1])) {
		PrevNavi = createPrev(prevD[0],prevD[1]);
	} else {
		PrevNavi = '';
	}
	if((nextD[0] == today.year) && (nextD[1] == today.month+1) || (nextD[0] == today.year + 1 && nextD[1] == 1)) {
		NextNavi = createNext(nextD[0],nextD[1]);
	} else {
		NextNavi = '';
	}
	tHead = '<p class="small_h_nomargin">■営業日カレンダー'+year+'/'+month+'</p>';
/*	tHead = '<table width="180" cellpadding="0" height="27" cellspacing="0" border="0" id="cal_head">';
	tHead += '<tr><td width="25">'+PrevNavi+'</td>';
	tHead += '<td width="130" align="center">'+year+'/'+month+'</td>';
	tHead += '<td width="25">'+NextNavi+'</td></tr></table>';*/
/*********
 * カレンダー本体の作成
 */
	tCalBody = '<div class="calendar">';
	for(var nCnt=0; nCnt<weeks.args.length; nCnt++) {
//		var tmpCls = weeks.styles(nCnt);
		var tmpCls = cellStyle.week;
		tCalBody += '<div class="'+tmpCls+'">'+weeks.args[nCnt]+'</div>';
	}
	for(var dayCnt=1; dayCnt<=MaxDay; dayCnt++) {
		var tmpCls,tmpDate,weekNo,cntCrLf;
		lastDate.Obj.setDate(dayCnt);
		weekNo = lastDate.Obj.getDay();
		var dayClass = weeks.styles(weekNo);
		/**********
		 * オリジナル拡張
		 * @ 祝日データの取得・解析・比較演算
		 */
		if(checkSpacialityData(year,month,dayCnt,objHoliday))
		{
			dayClass = cellStyle.Holiday;
		}
		if(checkSpacialityData(year,month,dayCnt,objDayoff))
		{
			dayClass = weeks.styles(weekNo) + cellStyle.dayoff;
		}
		if((today.year == year) && (today.month == month) && (today.day > dayCnt))
		{
//			dayClass = weeks.styles(weekNo) + cellStyle.old;
		}
		if(dayCnt==1) {
			cntCrLf = 1;
			for(var tmpW=0; tmpW<weekNo; tmpW++) {
				tmpCls = weeks.styles(tmpW);
				tCalBody += '<div class="'+cellStyle.def+'">&nbsp;</div>';
			}
			tCalBody += '<div class="'+dayClass+'">'+dayCnt+'</div>';
		} else {
			if(weekNo == 0) {
				cntCrLf = cntCrLf + 1;
//				tCalBody += '<tr>';
			}
			tCalBody += '<div class="'+dayClass+'">'+dayCnt+'</div>';
/*			if(weekNo == 6) {
				tCalBody += '</tr>';
			}*/
		}
	}
	if(weekNo < 6) {
		for(var nCnt=0; nCnt<6-weekNo; nCnt++) {
			//tCalBody += '<td class="def">&nbsp;</td>';
			tCalBody += '<div class="'+cellStyle.def+'">&nbsp;</div>';
		}
		//tCalBody += '</tr>';
	}
	if(cntCrLf < 6) {
		for(var nCnt=0; nCnt<6-cntCrLf; nCnt++) {
//			tCalBody += '<tr>';
			for(var dayC=0; dayC<7; dayC++) {
//				tCalBody += '<td class="def">&nbsp;</td>';
				tCalBody += '<div class="'+cellStyle.def+'">&nbsp;</div>';
			}
//			tCalBody += '</tr>';
		}
	}
//	tCalBody += '</table>';
	objCalSet.Calendar = tHead;
	objCalSet.Calendar += tCalBody;
	objCalSet.Calendar += NextNavi;
	objCalSet.Calendar += PrevNavi;
	objCalSet.Calendar += '<p>赤い文字がお休みになります。</p>';
	objCalSet.Calendar += '</div>';
};

function checkSpacialityData(year,month,day,Datas)
{
	for(var nCnt=0; nCnt<Datas.length; nCnt++)
	{
		var tmpY = Datas[nCnt][0];
		var tmpM = Datas[nCnt][1];
		for(var tmpCnt=2; tmpCnt<Datas[nCnt].length; tmpCnt++)
		{
			if((tmpY == year) && (tmpM == month) && (Datas[nCnt][tmpCnt] == day))
			{
				return true;
			}
		}
	}
	return false;
}

var addNewCalender = function () { document.getElementById('calendar').innerHTML = objCalSet.Calendar; };

new CalCoreObj(today.year,today.month,today.day);
