//Variable
var week = new Array("日","月","火","水","木","金","土");
var area_name = "pop_calender";
var image_prev_file  = "cal_prev.gif";
var image_next_file  = "cal_next.gif";
var image_close_file = "cal_close.gif";
var formname = "";
var itemname = "";
var image_path = "";

MONDAY = 1;
TUESDAY = 2;
WEDNESDAY = 3;

//■カレンダーのOPEN
// tg : 表示位置の基準オブジェクト名
// f  : 設定するform名

// i  : 設定するform element名(year,month,day分離対応)
// y  : 年
// m  : 月

function cal_open3(tg, f, i, img_path) {
	//すでにある場合は抜ける

	var element = document.getElementById(area_name);
	if (element != null) {
		return false;
	}

	//年月指定は現在の値を参照
	var target = i.replace(/\./g, "][");
	target = "data["+target+"]";
	//設定するフィールドがなければ抜ける(select限定)
	//なぜかフィールド名(name)だとデータを取れないので・・・
	var y;
	var m;
	dt_field = document.getElementsByTagName("select");
	for (n=0;n<dt_field.length;n++) {
		sName = dt_field[n].getAttribute("id");
		if (sName == target+"[year]") {	//年
			y = dt_field[n].value;
		} else if (sName == target+"[month]") {	//月

			m = dt_field[n].value;
		}
	}

	//y = document.forms[f].elements[target+"[year]"].value;
	//m = document.forms[f].elements[target+"[month]"].value;

	//if (isNaN(y) || isNaN(m)) {
	//判断つかない場合は当月
	if (y == "" || y == null || m == "" || m == null) {
		dd = new Date();
		year = dd.getYear();
		month = dd.getMonth() + 1;
		if (year < 2000) { year += 1900; }
	} else {
		year = Number(y);
		month = Number(m);
	}

	//カレンダー領域の生成
	element = document.createElement("div");
	var objTarget = document.getElementById(tg);
	var ele;

	element.id = area_name;

	//表示位置の算出
	xx = -30;
	yy = 30;

	oj = objTarget;
	while(oj){ 
		xx += oj.offsetLeft;
		oj = oj.offsetParent;
	}
	oj = objTarget;
	while(oj){ 
		yy += oj.offsetTop;
		oj = oj.offsetParent;
	}
	element.style.left = xx + "px";
	element.style.top  = yy + "px";

	// body要素にdivエレメントを追加
	var bodyElement = document.getElementsByTagName("body").item(0);
	bodyElement.appendChild(element);

	//グローバルに設定

	formname = f;
	itemname = i;
	image_path = img_path;

	cal_create3(element, year, month);	//表示

	return false;
}

//■カレンダーのClose
function cal_close3() {
	var bodyElement = document.getElementsByTagName("body").item(0);
	var calenderElement = document.getElementById(area_name);
	bodyElement.removeChild(calenderElement);

	return false;
}

//■カレンダーの移動

function cal_navi3(y, m) {
	var element = document.getElementById(area_name);
	var ele;
	
	//消す
	ele = document.getElementById("cal_header");
	element.removeChild(ele);
	ele = document.getElementById("calender1");
	element.removeChild(ele);
	ele = document.getElementById("cal_center");
	element.removeChild(ele);
	ele = document.getElementById("calender2");
	element.removeChild(ele);
	
	cal_create3(element, y, m);	//表示
}

//■カレンダー群の作成
function cal_create3(element, y, m) {
	var nYear = y;
	var nMonth = m;
	var nPrevYear = y;
	var nPrevMonth = m - 1;
	if (nPrevMonth < 1) {
		nPrevYear--;
		nPrevMonth = 12;
	}
	var nNextYear = y;
	var nNextMonth = m + 1;
	if (nNextMonth > 12) {
		nNextYear++;
		nNextMonth = 1;
	}

	//ヘッダー
	var ele = document.createElement("div");
	ele.id = "cal_header";
	ele.className = "header";
//	ele.innerHTML = "<a href=\"javascript:void(0);\" onclick=\"return cal_navi("+nPrevYear+", "+nPrevMonth+", "+img_path+");\">"+img_prev+"</a> <a href=\"javascript:void(0);\" onclick=\"return cal_close();\">"+img_close+"</a> <a href=\"javascript:void(0);\" onclick=\"return cal_navi("+nNextYear+", "+nNextMonth+", "+img_path+");\">"+img_next+"</a>";
	ele.innerHTML = "<a href=\"javascript:void(0);\" onclick=\"return cal_navi3("+nPrevYear+", "+nPrevMonth+", '"+image_path+"');\"><img src=\""+image_path+image_prev_file+"\" border=\"0\"></a> <a href=\"javascript:void(0);\" onclick=\"return cal_close3();\"><img src=\""+image_path+image_close_file+"\" border=\"0\"></a> <a href=\"javascript:void(0);\" onclick=\"return cal_navi3("+nNextYear+", "+nNextMonth+", '"+image_path+"');\"><img src=\""+image_path+image_next_file+"\" border=\"0\"></a>";
	element.insertBefore(ele, null);

	//カレンダー要素の作成 1
	cal_body3(element, 1, nYear, nMonth);

	//中ナビ
	ele = document.createElement("div");
	ele.id = "cal_center";
	ele.className = "center_navi";
	element.insertBefore(ele, null);

	//カレンダー要素の作成 2
	cal_body3(element, 2, nNextYear, nNextMonth);
}

//■カレンダーの本体の生成
function cal_body3(ele, num, y, m) {
	var dt = new Date(y,m-1,1);
	var wk = dt.getDay();
	var oldDate = 1;
	dt.setTime(dt.getTime() - (24 * 60 * 60 * 1000) * wk);	//マス目を全て埋めるために前にずらす


	var colElement;
	var calenderElement = document.createElement("div");

	calenderElement.id = "calender" + num;
	calenderElement.className = "calender";
	ele.insertBefore(calenderElement, null);
	rowElement = document.createElement("div");
	rowElement.className = "title";
	rowElement.innerHTML = y + "年" + m + "月";
	calenderElement.insertBefore(rowElement, null);

	//曜日
	for (col=0;col<7;col++) {
		colElement = document.createElement("div");
		colElement.className = "col";
		if (col == 0) {	//日
			colElement.className += " sun";
		} else if (col == 6) {	//土

			colElement.className += " sat";
		} else {
			colElement.className += " day";
		}
		colElement.innerHTML = week[col];
		calenderElement.insertBefore(colElement, null);
	}
	brElement = document.createElement("br");
	brElement.className = "clear";
	calenderElement.insertBefore(brElement, null);

	//暦
	for (row=0;row<6;row++) {
		for (col=0;col<7;col++) {
			colElement = document.createElement("div");
			colElement.className = "col";
			colElement.id = "cal"+row+col;
			if ((row > 0 && oldDate < dt.getDate()) || (row == 0 && dt.getDate() <= 10)) {
				yy = dt.getYear();
				mm = dt.getMonth() + 1;
				dd = dt.getDate();
				if (yy < 2000) { yy += 1900; }
				if (mm < 10) { mm = "0" + mm; }
				if (dd < 10) { dd = "0" + dd; }
				strDate = yy + "/" + mm + "/" + dd;
				colElement.innerHTML = "<a href=\"javascript:void(0);\" onclick=\"return cal_set3('"+strDate+"');\">"+dt.getDate()+"</a>";
				oldDate = dt.getDate();
			} else {
				colElement.innerHTML = dt.getDate();
			}

			//祝日判別
			if (cal_check3(dt) != "" || col == 0) {
				colElement.className += " sun";
			} else if (col == 6) {
				colElement.className += " sat";
			} else {
				colElement.className += " day";
			}
			dt.setTime(dt.getTime() + (24 * 60 * 60 * 1000));	//一日進める

			calenderElement.insertBefore(colElement, null);
		}
		brElement = document.createElement("br");
		brElement.className = "clear";
		calenderElement.insertBefore(brElement, null);
	}
}

//■カレンダー値の設定

function cal_set3(data) {
	var target = itemname.replace(/\./g, "][");
	target = "data["+target+"]";

	dt = data.split('/');

	//設定するフィールドがなければ抜ける(select限定)
	//なぜかフィールド名(name)だとデータを取れないので・・・
	var dt_field = document.getElementsByTagName("select");
	for (n=0;n<dt_field.length;n++) {
		sName = dt_field[n].getAttribute("name");
		if (sName == target+"[year]") {	//年
			dt_field[n].value = dt[0];
		} else if (sName == target+"[month]") {	//月

			dt_field[n].value = dt[1];
		} else if (sName == target+"[day]") {	//日
			dt_field[n].value = dt[2];
		}
	}

//	document.forms[formname].elements[target+"[year]"].value = dt[0];
//	document.forms[formname].elements[target+"[month]"].value = dt[1];
//	document.forms[formname].elements[target+"[day]"].value = dt[2];

	cal_close3();
	return false;
}

function cal_check3(MyDate)
{
  MyYear = MyDate.getFullYear();
  MyMonth = MyDate.getMonth() + 1;    // MyMonth:1～12
  MyDay = MyDate.getDate();

  Result = "";
  switch (MyMonth) {
// １月 //
  case 1:
      if (MyDay == 1) {
          Result = "元日";
      } else {
          if (MyYear >= 2000) {
              NumberOfWeek = Math.floor((MyDay - 1) / 7) + 1;
              if ((NumberOfWeek == 2) && (MyDate.getDay() == MONDAY)) {
                  Result = "成人の日";
              } else;
          } else {
              if (MyDay == 15) {
                  Result = "成人の日";
              } else;
          }
      }
      break;
// ２月 //
  case 2:
      if (MyDay == 11) {
          if (MyYear >= 1967) {
              Result = "建国記念の日";
          } else;
      }
      break;
// ３月 //
  case 3:
      if (MyDay == prvDayOfSpringEquinox(MyYear)) {  // 1948～2150以外は[99]
          Result = "春分の日";                       // が返るので､必ず≠になる

      } else;
      break;
// ４月 //
  case 4:
      if (MyDay == 29) {
          if (MyYear >= 2007) {
              Result = "昭和の日";
          } else {
              if (MyYear >= 1989) {
                  Result = "みどりの日";
              } else {
                Result = "天皇誕生日";
              }
          }
      }
      break;
// ５月 //
  case 5:
      switch ( MyDay ) {
        case 3:  // ５月３日
          Result = "憲法記念日";
          break;
        case 4:  // ５月４日
          if (MyYear >= 2007) {
              Result = "みどりの日";
          } else {
              if (MyYear >= 1986) {
                  if (MyDate.getDay() > MONDAY) {
                  // 5/4が日曜日は『只の日曜』､月曜日は『憲法記念日の振替休日』(～2006年)
                      Result = "国民の休日";
                  } else;
              } else;
          }
          break;
        case 5:  // ５月５日
          Result = "こどもの日";
          break;
        case 6:  // ５月６日
          if (MyYear >= 2007) {
              if ((MyDate.getDay() == TUESDAY) || (MyDate.getDay() == WEDNESDAY)) {
                  Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定

              } else;
          } else;
          break;
      }
      break;
// ６月 //
  case 6:
      break;
// ７月 //
  case 7:
      if (MyYear >= 2003) {
          NumberOfWeek = Math.floor((MyDay - 1) / 7) + 1;
          if ((NumberOfWeek == 3) && (MyDate.getDay() == MONDAY)) {
              Result = "海の日";
          } else;
      } else {
          if (MyYear >= 1996) {
              if (MyDay == 20) {
                  Result = "海の日";
              } else;
          } else;
      }
      break;
// ９月 //
  case 9:
      //第３月曜日(15～21)と秋分日(22～24)が重なる事はない

      MyAutumnEquinox = prvDayOfAutumnEquinox(MyYear);
      if (MyDay == MyAutumnEquinox) {    // 1948～2150以外は[99]
          Result = "秋分の日";           // が返るので､必ず≠になる

      } else {
          if (MyYear >= 2003) {
              NumberOfWeek = Math.floor((MyDay - 1) / 7) + 1;
              if ((NumberOfWeek == 3) && (MyDate.getDay() == MONDAY)) {
                  Result = "敬老の日";
              } else {
                  if (MyDate.getDay() == TUESDAY) {
                      if (MyDay == (MyAutumnEquinox - 1)) {
                          Result = "国民の休日";
                      } else;
                  } else;
              }
          } else {
              if (MyYear >= 1966) {
                  if (MyDay == 15) {
                      Result = "敬老の日";
                  } else;
              } else;
          }
      }
      break;
// １０月 //
  case 10:
      if (MyYear >= 2000) {
          NumberOfWeek = Math.floor(( MyDay - 1) / 7) + 1;
          if ((NumberOfWeek == 2) && (MyDate.getDay() == MONDAY)) {
              Result = "体育の日";
          } else;
      } else {
          if (MyYear >= 1966) {
              if (MyDay == 10) {
                  Result = "体育の日";
              } else;
          } else;
      }
      break;
// １１月 //
  case 11:
      if (MyDay == 3) {
          Result = "文化の日";
      } else {
          if (MyDay == 23) {
              Result = "勤労感謝の日";
          }
      }
      break;
// １２月 //
  case 12:
      if (MyDay == 23) {
          if (MyYear >= 1989) {
              Result = "天皇誕生日";
          } else;
      } else;
      break;
  }

  return Result;
}

//===================================================================
// 春分/秋分日の略算式は
// 『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』

// で紹介されている式です。

function prvDayOfSpringEquinox(MyYear)
{
  if (MyYear <= 1947) {
      SpringEquinox_ret = 99;    //祝日法施行前
  } else {
      if (MyYear <= 1979) {
          // Math.floor 関数は[VBAのInt関数]に相当

          SpringEquinox_ret = Math.floor(20.8357 + 
            (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4));
      } else {
          if (MyYear <= 2099) {
              SpringEquinox_ret = Math.floor(20.8431 + 
                (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4));
          } else {
              if (MyYear <= 2150) {
                  SpringEquinox_ret = Math.floor(21.851 + 
                    (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4));
              } else {
                  SpringEquinox_ret = 99;    //2151年以降は略算式が無いので不明
              }
          }
      }
  }
  return SpringEquinox_ret;
}

//=====================================================================
function prvDayOfAutumnEquinox(MyYear)
{
  if (MyYear <= 1947) {
      AutumnEquinox_ret = 99; //祝日法施行前
  } else {
      if (MyYear <= 1979) {
          // Math.floor 関数は[VBAのInt関数]に相当

          AutumnEquinox_ret = Math.floor(23.2588 + 
            (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4));
      } else {
          if (MyYear <= 2099) {
              AutumnEquinox_ret = Math.floor(23.2488 + 
                (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4));
          } else {
              if (MyYear <= 2150) {
                  AutumnEquinox_ret = Math.floor(24.2488 + 
                    (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4));
              } else {
                  AutumnEquinox_ret = 99;    //2151年以降は略算式が無いので不明
              }
          }
      }
  }
  return AutumnEquinox_ret;
}


/*function myGetBrowser(){            // ブラウザを判断する
   myOP = (navigator.userAgent.indexOf("Opera",0) != -1)?1:0; //OP
   myN6 = document.getElementById;  // N6 or IE
   myIE = document.all;             // IE
   myN4 = document.layers;          // N4

   if (myOP){                          // OP?
      document.onclick = EventClick;
   }else if (myIE){                    // IE?
      document.onclick = EventClick;
   }else if (myN6){                    // N6?
      window.addEventListener("click",EventClick,true);
   }else if (myN4){                    // N4?
      window.captureEvents(Event.CLICK);
      window.onclick = EventClick;
   }
}
myGetBrowser();

function EventClick() {
	cal_close();
}*/

